@segmentstream/ontology 0.0.0-stage → 0.92.0

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 (483) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +2 -0
  3. package/README.md +1655 -2
  4. package/dist/action.d.ts +193 -0
  5. package/dist/action.js +41 -0
  6. package/dist/agent-chat.d.ts +44 -0
  7. package/dist/agent-chat.js +91 -0
  8. package/dist/agent-task-contract.d.ts +64 -0
  9. package/dist/agent-task-contract.js +15 -0
  10. package/dist/agent-task.d.ts +39 -0
  11. package/dist/agent-task.js +112 -0
  12. package/dist/analyze.d.ts +215 -0
  13. package/dist/analyze.js +2438 -0
  14. package/dist/app-feedback.d.ts +167 -0
  15. package/dist/app-feedback.js +176 -0
  16. package/dist/authoring-input.d.ts +3 -0
  17. package/dist/authoring-input.js +107 -0
  18. package/dist/authoring-names.d.ts +4 -0
  19. package/dist/authoring-names.js +13 -0
  20. package/dist/authoring-records.d.ts +35 -0
  21. package/dist/authoring-records.js +264 -0
  22. package/dist/authoring.d.ts +15 -0
  23. package/dist/authoring.js +331 -0
  24. package/dist/bin/check.d.ts +30 -0
  25. package/dist/bin/check.js +99 -0
  26. package/dist/bin/load.d.ts +48 -0
  27. package/dist/bin/load.js +139 -0
  28. package/dist/bin/main.d.ts +31 -0
  29. package/dist/bin/main.js +121 -0
  30. package/dist/bin/migrate.d.ts +57 -0
  31. package/dist/bin/migrate.js +170 -0
  32. package/dist/bin/output.d.ts +31 -0
  33. package/dist/bin/output.js +84 -0
  34. package/dist/bin.d.ts +2 -0
  35. package/dist/bin.js +31 -0
  36. package/dist/blob.d.ts +52 -0
  37. package/dist/blob.js +87 -0
  38. package/dist/channel-session.d.ts +16 -0
  39. package/dist/channel-session.js +16 -0
  40. package/dist/chat.d.ts +43 -0
  41. package/dist/chat.js +34 -0
  42. package/dist/confirmation.d.ts +46 -0
  43. package/dist/confirmation.js +41 -0
  44. package/dist/connection.d.ts +213 -0
  45. package/dist/connection.js +289 -0
  46. package/dist/deployment.d.ts +35 -0
  47. package/dist/deployment.js +76 -0
  48. package/dist/diagnostics.d.ts +27 -0
  49. package/dist/diagnostics.js +106 -0
  50. package/dist/emails.d.ts +70 -0
  51. package/dist/emails.js +221 -0
  52. package/dist/entity.d.ts +331 -0
  53. package/dist/entity.js +153 -0
  54. package/dist/errors.d.ts +154 -0
  55. package/dist/errors.js +109 -0
  56. package/dist/feedback-config.d.ts +24 -0
  57. package/dist/feedback-config.js +126 -0
  58. package/dist/files.d.ts +39 -0
  59. package/dist/files.js +4 -0
  60. package/dist/groups.d.ts +95 -0
  61. package/dist/groups.js +280 -0
  62. package/dist/index.d.ts +109 -0
  63. package/dist/index.js +70 -0
  64. package/dist/internal/diagnostics.js +594 -0
  65. package/dist/legacy.d.ts +160 -0
  66. package/dist/legacy.js +270 -0
  67. package/dist/manifest-compatibility.d.ts +8 -0
  68. package/dist/manifest-compatibility.js +87 -0
  69. package/dist/manifest.d.ts +3329 -0
  70. package/dist/manifest.js +757 -0
  71. package/dist/me.d.ts +46 -0
  72. package/dist/me.js +109 -0
  73. package/dist/metric-filters.d.ts +48 -0
  74. package/dist/metric-filters.js +252 -0
  75. package/dist/metric-routes.d.ts +132 -0
  76. package/dist/metric-routes.js +498 -0
  77. package/dist/metric.d.ts +172 -0
  78. package/dist/metric.js +132 -0
  79. package/dist/migrate/apply.d.ts +94 -0
  80. package/dist/migrate/apply.js +526 -0
  81. package/dist/migrate/errors.d.ts +46 -0
  82. package/dist/migrate/errors.js +38 -0
  83. package/dist/migrate/index.d.ts +10 -0
  84. package/dist/migrate/index.js +7 -0
  85. package/dist/migrate/model.d.ts +2311 -0
  86. package/dist/migrate/model.js +148 -0
  87. package/dist/migrate/plan.d.ts +51 -0
  88. package/dist/migrate/plan.js +1856 -0
  89. package/dist/migrate/preview.d.ts +13 -0
  90. package/dist/migrate/preview.js +65 -0
  91. package/dist/migrate/storage.d.ts +226 -0
  92. package/dist/migrate/storage.js +774 -0
  93. package/dist/model-metrics.d.ts +22 -0
  94. package/dist/model-metrics.js +545 -0
  95. package/dist/names.d.ts +49 -0
  96. package/dist/names.js +110 -0
  97. package/dist/navigation-artifact.d.ts +13 -0
  98. package/dist/navigation-artifact.js +11 -0
  99. package/dist/navigation-catalog.d.ts +55 -0
  100. package/dist/navigation-catalog.js +297 -0
  101. package/dist/nitro-navigation.d.ts +3 -0
  102. package/dist/nitro-navigation.js +64 -0
  103. package/dist/nitro-workflows.d.ts +108 -0
  104. package/dist/nitro-workflows.js +286 -0
  105. package/dist/nitro.d.ts +40 -0
  106. package/dist/nitro.js +50 -0
  107. package/dist/ontology.d.ts +41 -0
  108. package/dist/ontology.js +46 -0
  109. package/dist/permissions.d.ts +198 -0
  110. package/dist/permissions.js +272 -0
  111. package/dist/property.d.ts +188 -0
  112. package/dist/property.js +301 -0
  113. package/dist/query.d.ts +245 -0
  114. package/dist/query.js +615 -0
  115. package/dist/relationship.d.ts +99 -0
  116. package/dist/relationship.js +33 -0
  117. package/dist/render.d.ts +81 -0
  118. package/dist/render.js +512 -0
  119. package/dist/replication/baseline.d.ts +51 -0
  120. package/dist/replication/baseline.js +215 -0
  121. package/dist/replication/bigquery.d.ts +37 -0
  122. package/dist/replication/bigquery.js +211 -0
  123. package/dist/replication/coverage.d.ts +14 -0
  124. package/dist/replication/coverage.js +53 -0
  125. package/dist/replication/evolution.d.ts +25 -0
  126. package/dist/replication/evolution.js +184 -0
  127. package/dist/replication/identities.d.ts +6 -0
  128. package/dist/replication/identities.js +47 -0
  129. package/dist/replication/legacy-baseline.d.ts +27 -0
  130. package/dist/replication/legacy-baseline.js +109 -0
  131. package/dist/replication/legacy-store.d.ts +19 -0
  132. package/dist/replication/legacy-store.js +63 -0
  133. package/dist/replication/lineage.d.ts +36 -0
  134. package/dist/replication/lineage.js +72 -0
  135. package/dist/replication/migrate.d.ts +21 -0
  136. package/dist/replication/migrate.js +84 -0
  137. package/dist/replication/model.d.ts +52 -0
  138. package/dist/replication/model.js +99 -0
  139. package/dist/replication/scans.d.ts +34 -0
  140. package/dist/replication/scans.js +158 -0
  141. package/dist/replication/schema.d.ts +11 -0
  142. package/dist/replication/schema.js +226 -0
  143. package/dist/replication/shadow-schema.d.ts +4 -0
  144. package/dist/replication/shadow-schema.js +61 -0
  145. package/dist/replication/shadow.d.ts +127 -0
  146. package/dist/replication/shadow.js +614 -0
  147. package/dist/replication/source-replacement.d.ts +33 -0
  148. package/dist/replication/source-replacement.js +76 -0
  149. package/dist/replication/store.d.ts +36 -0
  150. package/dist/replication/store.js +382 -0
  151. package/dist/replication/transaction.d.ts +23 -0
  152. package/dist/replication/transaction.js +88 -0
  153. package/dist/role.d.ts +61 -0
  154. package/dist/role.js +76 -0
  155. package/dist/runtime/action-deadlocks.d.ts +21 -0
  156. package/dist/runtime/action-deadlocks.js +130 -0
  157. package/dist/runtime/action-transactions.d.ts +35 -0
  158. package/dist/runtime/action-transactions.js +54 -0
  159. package/dist/runtime/agent-counters.d.ts +26 -0
  160. package/dist/runtime/agent-counters.js +98 -0
  161. package/dist/runtime/agent-tasks.d.ts +63 -0
  162. package/dist/runtime/agent-tasks.js +120 -0
  163. package/dist/runtime/agents.d.ts +15 -0
  164. package/dist/runtime/agents.js +457 -0
  165. package/dist/runtime/batch-diagnostics.d.ts +22 -0
  166. package/dist/runtime/batch-diagnostics.js +89 -0
  167. package/dist/runtime/batch.d.ts +52 -0
  168. package/dist/runtime/batch.js +534 -0
  169. package/dist/runtime/channel-session-revocation.d.ts +3 -0
  170. package/dist/runtime/channel-session-revocation.js +5 -0
  171. package/dist/runtime/channel-sessions.d.ts +4 -0
  172. package/dist/runtime/channel-sessions.js +61 -0
  173. package/dist/runtime/confirmations.d.ts +29 -0
  174. package/dist/runtime/confirmations.js +57 -0
  175. package/dist/runtime/cursor.d.ts +23 -0
  176. package/dist/runtime/cursor.js +100 -0
  177. package/dist/runtime/deployment.d.ts +7 -0
  178. package/dist/runtime/deployment.js +4 -0
  179. package/dist/runtime/errors.d.ts +118 -0
  180. package/dist/runtime/errors.js +109 -0
  181. package/dist/runtime/federation-tables.d.ts +2 -0
  182. package/dist/runtime/federation-tables.js +20 -0
  183. package/dist/runtime/federation.d.ts +42 -0
  184. package/dist/runtime/federation.js +222 -0
  185. package/dist/runtime/files.d.ts +39 -0
  186. package/dist/runtime/files.js +44 -0
  187. package/dist/runtime/generated-actions.d.ts +37 -0
  188. package/dist/runtime/generated-actions.js +307 -0
  189. package/dist/runtime/history.d.ts +91 -0
  190. package/dist/runtime/history.js +77 -0
  191. package/dist/runtime/ids.d.ts +6 -0
  192. package/dist/runtime/ids.js +39 -0
  193. package/dist/runtime/member-tables.d.ts +8 -0
  194. package/dist/runtime/member-tables.js +33 -0
  195. package/dist/runtime/member-writes.d.ts +78 -0
  196. package/dist/runtime/member-writes.js +202 -0
  197. package/dist/runtime/metric-query.d.ts +19 -0
  198. package/dist/runtime/metric-query.js +411 -0
  199. package/dist/runtime/model.d.ts +67 -0
  200. package/dist/runtime/model.js +150 -0
  201. package/dist/runtime/new-user-hook.d.ts +6 -0
  202. package/dist/runtime/new-user-hook.js +37 -0
  203. package/dist/runtime/oauth.d.ts +9 -0
  204. package/dist/runtime/oauth.js +299 -0
  205. package/dist/runtime/pipeline.d.ts +155 -0
  206. package/dist/runtime/pipeline.js +597 -0
  207. package/dist/runtime/postgres-tls.d.ts +10 -0
  208. package/dist/runtime/postgres-tls.js +14 -0
  209. package/dist/runtime/principals.d.ts +302 -0
  210. package/dist/runtime/principals.js +1307 -0
  211. package/dist/runtime/reads.d.ts +55 -0
  212. package/dist/runtime/reads.js +313 -0
  213. package/dist/runtime/records.d.ts +42 -0
  214. package/dist/runtime/records.js +245 -0
  215. package/dist/runtime/resolve-agent-identity.d.ts +6 -0
  216. package/dist/runtime/resolve-agent-identity.js +181 -0
  217. package/dist/runtime/service-binding.d.ts +18 -0
  218. package/dist/runtime/service-binding.js +266 -0
  219. package/dist/runtime/sign-in-links.d.ts +68 -0
  220. package/dist/runtime/sign-in-links.js +147 -0
  221. package/dist/runtime/sql-runtime.d.ts +131 -0
  222. package/dist/runtime/sql-runtime.js +362 -0
  223. package/dist/runtime/statement.d.ts +18 -0
  224. package/dist/runtime/statement.js +31 -0
  225. package/dist/runtime/user-identities.d.ts +66 -0
  226. package/dist/runtime/user-identities.js +106 -0
  227. package/dist/runtime/user-identity-sql.d.ts +86 -0
  228. package/dist/runtime/user-identity-sql.js +297 -0
  229. package/dist/runtime/user-roles.d.ts +16 -0
  230. package/dist/runtime/user-roles.js +32 -0
  231. package/dist/runtime/validation.d.ts +16 -0
  232. package/dist/runtime/validation.js +26 -0
  233. package/dist/runtime/where.d.ts +57 -0
  234. package/dist/runtime/where.js +404 -0
  235. package/dist/runtime/workflow-admission.d.ts +49 -0
  236. package/dist/runtime/workflow-admission.js +92 -0
  237. package/dist/runtime/workflow-argument-codec.d.ts +10 -0
  238. package/dist/runtime/workflow-argument-codec.js +120 -0
  239. package/dist/runtime/workflow-arguments.d.ts +17 -0
  240. package/dist/runtime/workflow-arguments.js +99 -0
  241. package/dist/runtime/workflow-starts.d.ts +203 -0
  242. package/dist/runtime/workflow-starts.js +493 -0
  243. package/dist/runtime/workflow-users.d.ts +9 -0
  244. package/dist/runtime/workflow-users.js +17 -0
  245. package/dist/runtime/workload.d.ts +25 -0
  246. package/dist/runtime/workload.js +24 -0
  247. package/dist/runtime/writes.d.ts +108 -0
  248. package/dist/runtime/writes.js +491 -0
  249. package/dist/runtime-source.d.ts +22 -0
  250. package/dist/runtime-source.js +28 -0
  251. package/dist/runtime.d.ts +310 -0
  252. package/dist/runtime.js +31 -0
  253. package/dist/server.d.ts +23 -0
  254. package/dist/server.js +107 -0
  255. package/dist/service/agent/attachments.d.ts +33 -0
  256. package/dist/service/agent/attachments.js +228 -0
  257. package/dist/service/agent/authentication.d.ts +22 -0
  258. package/dist/service/agent/authentication.js +58 -0
  259. package/dist/service/agent/confirmations.d.ts +5 -0
  260. package/dist/service/agent/confirmations.js +73 -0
  261. package/dist/service/agent/conversation-routes.d.ts +14 -0
  262. package/dist/service/agent/conversation-routes.js +45 -0
  263. package/dist/service/agent/conversations.d.ts +40 -0
  264. package/dist/service/agent/conversations.js +69 -0
  265. package/dist/service/agent/files.d.ts +12 -0
  266. package/dist/service/agent/files.js +69 -0
  267. package/dist/service/agent/protocol.d.ts +90 -0
  268. package/dist/service/agent/protocol.js +114 -0
  269. package/dist/service/agent/server.d.ts +28 -0
  270. package/dist/service/agent/server.js +374 -0
  271. package/dist/service/agent/task-caller.d.ts +21 -0
  272. package/dist/service/agent/task-caller.js +35 -0
  273. package/dist/service/agent/task-start.d.ts +53 -0
  274. package/dist/service/agent/task-start.js +161 -0
  275. package/dist/service/agent/tasks.d.ts +40 -0
  276. package/dist/service/agent/tasks.js +155 -0
  277. package/dist/service/api.d.ts +50 -0
  278. package/dist/service/api.js +288 -0
  279. package/dist/service/authentication.d.ts +227 -0
  280. package/dist/service/authentication.js +767 -0
  281. package/dist/service/caller-context.d.ts +24 -0
  282. package/dist/service/caller-context.js +6 -0
  283. package/dist/service/catalog.d.ts +42 -0
  284. package/dist/service/catalog.js +66 -0
  285. package/dist/service/channel/provider.d.ts +10 -0
  286. package/dist/service/channel/provider.js +1 -0
  287. package/dist/service/channel/providers/telegram.d.ts +18 -0
  288. package/dist/service/channel/providers/telegram.js +108 -0
  289. package/dist/service/channel/sessions.d.ts +5 -0
  290. package/dist/service/channel/sessions.js +53 -0
  291. package/dist/service/channel/sign-in.d.ts +7 -0
  292. package/dist/service/channel/sign-in.js +78 -0
  293. package/dist/service/chat/archive.d.ts +64 -0
  294. package/dist/service/chat/archive.js +62 -0
  295. package/dist/service/chat/attribution.d.ts +26 -0
  296. package/dist/service/chat/attribution.js +28 -0
  297. package/dist/service/chat/delivery.d.ts +18 -0
  298. package/dist/service/chat/delivery.js +251 -0
  299. package/dist/service/chat/diagnostics.d.ts +2 -0
  300. package/dist/service/chat/diagnostics.js +35 -0
  301. package/dist/service/chat/envelope.d.ts +96 -0
  302. package/dist/service/chat/envelope.js +39 -0
  303. package/dist/service/chat/idempotency.d.ts +19 -0
  304. package/dist/service/chat/idempotency.js +37 -0
  305. package/dist/service/chat/providers/telegram.d.ts +36 -0
  306. package/dist/service/chat/providers/telegram.js +133 -0
  307. package/dist/service/chat/reads.d.ts +25 -0
  308. package/dist/service/chat/reads.js +75 -0
  309. package/dist/service/chat/resolve.d.ts +34 -0
  310. package/dist/service/chat/resolve.js +150 -0
  311. package/dist/service/chat/routes.d.ts +23 -0
  312. package/dist/service/chat/routes.js +75 -0
  313. package/dist/service/chat/schemas.d.ts +43 -0
  314. package/dist/service/chat/schemas.js +31 -0
  315. package/dist/service/config.d.ts +218 -0
  316. package/dist/service/config.js +265 -0
  317. package/dist/service/connection-stream.d.ts +10 -0
  318. package/dist/service/connection-stream.js +191 -0
  319. package/dist/service/connections.d.ts +60 -0
  320. package/dist/service/connections.js +271 -0
  321. package/dist/service/decisions.d.ts +35 -0
  322. package/dist/service/decisions.js +63 -0
  323. package/dist/service/descriptions.d.ts +8 -0
  324. package/dist/service/descriptions.js +20 -0
  325. package/dist/service/discovery-schemas.d.ts +92 -0
  326. package/dist/service/discovery-schemas.js +59 -0
  327. package/dist/service/discovery-search.d.ts +30 -0
  328. package/dist/service/discovery-search.js +95 -0
  329. package/dist/service/discovery.d.ts +37 -0
  330. package/dist/service/discovery.js +436 -0
  331. package/dist/service/docs.d.ts +9 -0
  332. package/dist/service/docs.js +197 -0
  333. package/dist/service/errors.d.ts +145 -0
  334. package/dist/service/errors.js +704 -0
  335. package/dist/service/federation-provider.d.ts +36 -0
  336. package/dist/service/federation-provider.js +110 -0
  337. package/dist/service/federation-server.d.ts +20 -0
  338. package/dist/service/federation-server.js +249 -0
  339. package/dist/service/federation-status.d.ts +40 -0
  340. package/dist/service/federation-status.js +151 -0
  341. package/dist/service/handlers.d.ts +18 -0
  342. package/dist/service/handlers.js +287 -0
  343. package/dist/service/mcp/confirmation.d.ts +68 -0
  344. package/dist/service/mcp/confirmation.js +178 -0
  345. package/dist/service/mcp/find-input.d.ts +12 -0
  346. package/dist/service/mcp/find-input.js +122 -0
  347. package/dist/service/mcp/input-schema.d.ts +6 -0
  348. package/dist/service/mcp/input-schema.js +126 -0
  349. package/dist/service/mcp/listing.d.ts +26 -0
  350. package/dist/service/mcp/listing.js +92 -0
  351. package/dist/service/mcp/metric-tools.d.ts +85 -0
  352. package/dist/service/mcp/metric-tools.js +258 -0
  353. package/dist/service/mcp/request-log.d.ts +5 -0
  354. package/dist/service/mcp/request-log.js +53 -0
  355. package/dist/service/mcp/runtime-policy.d.ts +27 -0
  356. package/dist/service/mcp/runtime-policy.js +62 -0
  357. package/dist/service/mcp/server.d.ts +52 -0
  358. package/dist/service/mcp/server.js +861 -0
  359. package/dist/service/mcp/tools.d.ts +99 -0
  360. package/dist/service/mcp/tools.js +938 -0
  361. package/dist/service/member-file-routes.d.ts +22 -0
  362. package/dist/service/member-file-routes.js +52 -0
  363. package/dist/service/member-files.d.ts +245 -0
  364. package/dist/service/member-files.js +258 -0
  365. package/dist/service/metric-query-platform.d.ts +77 -0
  366. package/dist/service/metric-query-platform.js +198 -0
  367. package/dist/service/metric-query-scopes.d.ts +43 -0
  368. package/dist/service/metric-query-scopes.js +147 -0
  369. package/dist/service/metric-query.d.ts +48 -0
  370. package/dist/service/metric-query.js +200 -0
  371. package/dist/service/name-suggestions.d.ts +3 -0
  372. package/dist/service/name-suggestions.js +38 -0
  373. package/dist/service/navigation-schemas.d.ts +80 -0
  374. package/dist/service/navigation-schemas.js +49 -0
  375. package/dist/service/navigation.d.ts +20 -0
  376. package/dist/service/navigation.js +165 -0
  377. package/dist/service/oauth/protocol.d.ts +70 -0
  378. package/dist/service/oauth/protocol.js +157 -0
  379. package/dist/service/oauth/refresh-replay.d.ts +2 -0
  380. package/dist/service/oauth/refresh-replay.js +20 -0
  381. package/dist/service/oauth/server.d.ts +28 -0
  382. package/dist/service/oauth/server.js +769 -0
  383. package/dist/service/operations.d.ts +170 -0
  384. package/dist/service/operations.js +392 -0
  385. package/dist/service/plan.d.ts +57 -0
  386. package/dist/service/plan.js +96 -0
  387. package/dist/service/rate-limit.d.ts +22 -0
  388. package/dist/service/rate-limit.js +52 -0
  389. package/dist/service/record-reads.d.ts +21 -0
  390. package/dist/service/record-reads.js +155 -0
  391. package/dist/service/replication.d.ts +5 -0
  392. package/dist/service/replication.js +39 -0
  393. package/dist/service/runtime-contract.d.ts +508 -0
  394. package/dist/service/runtime-contract.js +18 -0
  395. package/dist/service/runtime-identity.d.ts +71 -0
  396. package/dist/service/runtime-identity.js +122 -0
  397. package/dist/service/schemas.d.ts +961 -0
  398. package/dist/service/schemas.js +639 -0
  399. package/dist/service/service.d.ts +21 -0
  400. package/dist/service/service.js +526 -0
  401. package/dist/service/warehouse-platform.d.ts +17 -0
  402. package/dist/service/warehouse-platform.js +122 -0
  403. package/dist/service/warehouse-query.d.ts +24 -0
  404. package/dist/service/warehouse-query.js +280 -0
  405. package/dist/service/webhooks.d.ts +106 -0
  406. package/dist/service/webhooks.js +233 -0
  407. package/dist/service/workflow-admission-provider.d.ts +31 -0
  408. package/dist/service/workflow-admission-provider.js +205 -0
  409. package/dist/service/workflow-argument-serialization.d.ts +2 -0
  410. package/dist/service/workflow-argument-serialization.js +14 -0
  411. package/dist/service/workflow-callback.d.ts +22 -0
  412. package/dist/service/workflow-callback.js +75 -0
  413. package/dist/service/workflow-deployment.d.ts +8 -0
  414. package/dist/service/workflow-deployment.js +131 -0
  415. package/dist/service/workflow-diagnostics.d.ts +23 -0
  416. package/dist/service/workflow-diagnostics.js +263 -0
  417. package/dist/service/workflow-errors.d.ts +26 -0
  418. package/dist/service/workflow-errors.js +181 -0
  419. package/dist/service/workflow-logging.d.ts +2 -0
  420. package/dist/service/workflow-logging.js +50 -0
  421. package/dist/service/workflow-queue-fence.d.ts +6 -0
  422. package/dist/service/workflow-queue-fence.js +66 -0
  423. package/dist/service/workflows.d.ts +200 -0
  424. package/dist/service/workflows.js +1549 -0
  425. package/dist/sign-in.d.ts +58 -0
  426. package/dist/sign-in.js +57 -0
  427. package/dist/source.d.ts +30 -0
  428. package/dist/source.js +107 -0
  429. package/dist/start-recovery-contract.d.ts +49 -0
  430. package/dist/start-recovery-contract.js +26 -0
  431. package/dist/start-recovery.d.ts +27 -0
  432. package/dist/start-recovery.js +81 -0
  433. package/dist/storage/api.d.ts +4 -0
  434. package/dist/storage/api.js +40 -0
  435. package/dist/storage/attachments.d.ts +146 -0
  436. package/dist/storage/attachments.js +733 -0
  437. package/dist/storage/authorization.d.ts +38 -0
  438. package/dist/storage/authorization.js +83 -0
  439. package/dist/storage/file-access.d.ts +17 -0
  440. package/dist/storage/file-access.js +8 -0
  441. package/dist/storage/limits.d.ts +12 -0
  442. package/dist/storage/limits.js +17 -0
  443. package/dist/storage/maintenance-auth.d.ts +20 -0
  444. package/dist/storage/maintenance-auth.js +24 -0
  445. package/dist/storage/maintenance.d.ts +11 -0
  446. package/dist/storage/maintenance.js +67 -0
  447. package/dist/storage/neon.d.ts +4 -0
  448. package/dist/storage/neon.js +318 -0
  449. package/dist/storage/operator.d.ts +11 -0
  450. package/dist/storage/operator.js +30 -0
  451. package/dist/storage/provider.d.ts +93 -0
  452. package/dist/storage/provider.js +36 -0
  453. package/dist/storage/sessions.d.ts +184 -0
  454. package/dist/storage/sessions.js +688 -0
  455. package/dist/storage/tables.d.ts +54 -0
  456. package/dist/storage/tables.js +205 -0
  457. package/dist/storage/transfers.d.ts +16 -0
  458. package/dist/storage/transfers.js +153 -0
  459. package/dist/storage/writes.d.ts +7 -0
  460. package/dist/storage/writes.js +88 -0
  461. package/dist/telegram.d.ts +35 -0
  462. package/dist/telegram.js +173 -0
  463. package/dist/user-identity.d.ts +28 -0
  464. package/dist/user-identity.js +106 -0
  465. package/dist/user.d.ts +75 -0
  466. package/dist/user.js +111 -0
  467. package/dist/warehouse-backed.d.ts +6 -0
  468. package/dist/warehouse-backed.js +495 -0
  469. package/dist/webhook-token.d.ts +11 -0
  470. package/dist/webhook-token.js +18 -0
  471. package/dist/webhooks.d.ts +40 -0
  472. package/dist/webhooks.js +55 -0
  473. package/dist/wire.d.ts +10 -0
  474. package/dist/wire.js +35 -0
  475. package/dist/workflow-runtime.d.ts +116 -0
  476. package/dist/workflow-runtime.js +109 -0
  477. package/dist/workflow-topics.d.ts +28 -0
  478. package/dist/workflow-topics.js +28 -0
  479. package/dist/workflow.d.ts +284 -0
  480. package/dist/workflow.js +259 -0
  481. package/dist/workflows.d.ts +24 -0
  482. package/dist/workflows.js +18 -0
  483. package/package.json +127 -4
@@ -0,0 +1,36 @@
1
+ import { type JWTVerifyGetKey } from "jose";
2
+ /** Pinned issuer discovery is cached; keys are fetched only from its own HTTPS origin. */
3
+ export declare function createFederationProvider(config: {
4
+ issuer: string;
5
+ clientId: string;
6
+ environment?: string;
7
+ deploymentId?: string;
8
+ manifestDigest?: string;
9
+ }, options?: {
10
+ fetch?: typeof fetch;
11
+ keySet?: JWTVerifyGetKey;
12
+ }): {
13
+ metadata: () => Promise<{
14
+ authorization_endpoint: string;
15
+ token_endpoint: string;
16
+ jwks_uri: string;
17
+ }>;
18
+ exchange: (input: {
19
+ code: string;
20
+ verifier: string;
21
+ redirectUri: string;
22
+ nonce: string;
23
+ }) => Promise<{
24
+ name?: string | undefined;
25
+ email?: string | undefined;
26
+ sessionId?: string | undefined;
27
+ issuer: string;
28
+ subject: string;
29
+ clientId: string;
30
+ generation: number;
31
+ consentId: string;
32
+ deploymentId?: string | undefined;
33
+ environment?: string | undefined;
34
+ manifestDigest?: string | undefined;
35
+ }>;
36
+ };
@@ -0,0 +1,110 @@
1
+ import { createRemoteJWKSet, jwtVerify } from "jose";
2
+ /** Pinned issuer discovery is cached; keys are fetched only from its own HTTPS origin. */
3
+ export function createFederationProvider(config, options = {}) {
4
+ const fetcher = options.fetch ?? fetch;
5
+ let discovery;
6
+ let keys = options.keySet;
7
+ const metadata = () => (discovery ??= (async () => {
8
+ const response = await fetcher(`${config.issuer}/.well-known/openid-configuration`, {
9
+ redirect: "error",
10
+ signal: AbortSignal.timeout(5000),
11
+ });
12
+ const body = (await response.json());
13
+ if (!response.ok || body.issuer !== config.issuer) {
14
+ throw new Error("OIDC issuer discovery mismatch");
15
+ }
16
+ for (const name of ["authorization_endpoint", "token_endpoint", "jwks_uri"]) {
17
+ const url = typeof body[name] === "string" ? URL.parse(body[name]) : null;
18
+ if (!url ||
19
+ url.protocol !== "https:" ||
20
+ url.origin !== new URL(config.issuer).origin ||
21
+ url.username ||
22
+ url.password ||
23
+ url.hash) {
24
+ throw new Error("OIDC discovery endpoint is invalid");
25
+ }
26
+ }
27
+ return body;
28
+ })().catch((cause) => {
29
+ discovery = undefined;
30
+ throw cause;
31
+ }));
32
+ return {
33
+ metadata,
34
+ exchange: async (input) => {
35
+ const document = await metadata();
36
+ const response = await fetcher(document.token_endpoint, {
37
+ method: "POST",
38
+ redirect: "error",
39
+ headers: { "content-type": "application/x-www-form-urlencoded" },
40
+ cache: "no-store",
41
+ signal: AbortSignal.timeout(5000),
42
+ body: new URLSearchParams({
43
+ grant_type: "authorization_code",
44
+ client_id: config.clientId,
45
+ code: input.code,
46
+ code_verifier: input.verifier,
47
+ redirect_uri: input.redirectUri,
48
+ }),
49
+ });
50
+ const body = (await response.json());
51
+ if (!response.ok || typeof body.id_token !== "string") {
52
+ const explanation = [body.error, body.error_description]
53
+ .filter((value) => typeof value === "string")
54
+ .join(": ");
55
+ const diagnostic = [input.code, input.verifier, input.nonce].reduce((text, credential) => (credential ? text.split(credential).join("[redacted]") : text), explanation);
56
+ throw new Error(`OIDC code exchange failed (${response.status}): ${diagnostic || "no ID token"}`);
57
+ }
58
+ keys ??= createRemoteJWKSet(new URL(document.jwks_uri), { timeoutDuration: 5000 });
59
+ const { payload } = await jwtVerify(body.id_token, keys, {
60
+ algorithms: ["ES256"],
61
+ issuer: config.issuer,
62
+ audience: config.clientId,
63
+ requiredClaims: ["sub", "nonce", "auth_time", "iat", "exp"],
64
+ maxTokenAge: 300,
65
+ });
66
+ if (payload.aud !== config.clientId) {
67
+ throw new Error("OIDC ID token audience must be the single public client ID");
68
+ }
69
+ if (payload.nonce !== input.nonce) {
70
+ throw new Error("OIDC ID token nonce does not match this login");
71
+ }
72
+ if (!payload.sub ||
73
+ typeof payload.auth_time !== "number" ||
74
+ payload.auth_time > payload.iat) {
75
+ throw new Error("OIDC ID token subject or authentication time is invalid");
76
+ }
77
+ if (payload.exp - payload.iat > 300) {
78
+ throw new Error("OIDC ID token lifetime exceeds five minutes");
79
+ }
80
+ if (!Number.isInteger(payload.ss_generation) || typeof payload.ss_consent !== "string") {
81
+ throw new Error("OIDC ID token lacks the client generation or consent reference");
82
+ }
83
+ if (config.environment &&
84
+ (payload.ss_environment !== config.environment ||
85
+ payload.ss_manifest_digest !== config.manifestDigest ||
86
+ (config.environment !== "local" && payload.ss_deployment_id !== config.deploymentId))) {
87
+ throw new Error("OIDC deployment binding mismatch");
88
+ }
89
+ return {
90
+ ...(config.environment
91
+ ? {
92
+ environment: config.environment,
93
+ manifestDigest: config.manifestDigest,
94
+ ...(config.deploymentId ? { deploymentId: config.deploymentId } : {}),
95
+ }
96
+ : {}),
97
+ issuer: config.issuer,
98
+ subject: payload.sub,
99
+ clientId: config.clientId,
100
+ generation: payload.ss_generation,
101
+ consentId: payload.ss_consent,
102
+ ...(typeof payload.ss_session === "string" ? { sessionId: payload.ss_session } : {}),
103
+ ...(payload.email_verified === true && typeof payload.email === "string"
104
+ ? { email: payload.email }
105
+ : {}),
106
+ ...(typeof payload.name === "string" ? { name: payload.name } : {}),
107
+ };
108
+ },
109
+ };
110
+ }
@@ -0,0 +1,20 @@
1
+ import { Layer } from "effect";
2
+ import type { Ontology } from "../ontology.js";
3
+ import { OntologyBackend } from "./runtime-contract.js";
4
+ import { createFederationProvider } from "./federation-provider.js";
5
+ import { type BrowserRevision, federationStatus } from "./federation-status.js";
6
+ import type { TokenVerifier } from "./authentication.js";
7
+ export declare const FEDERATION_PATH = "/api/ontology/federation";
8
+ /** OIDC is a login protocol here. Cloud tokens never become workspace bearer credentials. */
9
+ export declare function federationLayer(config: {
10
+ issuer: string;
11
+ clientId: string;
12
+ environment?: string;
13
+ deploymentId?: string;
14
+ manifestDigest?: string;
15
+ } | undefined, verify: TokenVerifier, options?: {
16
+ browserRevision?: BrowserRevision;
17
+ ontology?: Ontology;
18
+ provider?: ReturnType<typeof createFederationProvider>;
19
+ status?: typeof federationStatus;
20
+ }): Layer.Layer<never, never, OntologyBackend | import("effect/unstable/http/HttpRouter").HttpRouter>;
@@ -0,0 +1,249 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { Effect, Layer } from "effect";
3
+ import { HttpServerResponse } from "effect/unstable/http";
4
+ import { use as registerRoutes } from "effect/unstable/http/HttpRouter";
5
+ import { FEDERATION_TOKEN_PREFIX, federationDigest } from "../runtime/federation.js";
6
+ import { OntologyBackend } from "./runtime-contract.js";
7
+ import { createFederationProvider } from "./federation-provider.js";
8
+ import { browserRevisionAdmitted, browserRevisionObservation, browserSessionAdmission, federationStatus, } from "./federation-status.js";
9
+ export const FEDERATION_PATH = "/api/ontology/federation";
10
+ const opaque = (prefix) => `${prefix}${randomBytes(32).toString("base64url")}`;
11
+ const json = (body, status = 200) => HttpServerResponse.jsonUnsafe(body, {
12
+ status,
13
+ headers: { "cache-control": "no-store" },
14
+ });
15
+ /** OIDC is a login protocol here. Cloud tokens never become workspace bearer credentials. */
16
+ export function federationLayer(config, verify, options = {}) {
17
+ const browser = options.ontology?.signIn.browser;
18
+ if (browser && !browser.methods.includes("segmentstream")) {
19
+ config = undefined;
20
+ }
21
+ const configuration = () => json({
22
+ version: 1,
23
+ ...(browser ? { manifest_digest: options.ontology.manifest.hash } : {}),
24
+ browser: browser
25
+ ? {
26
+ methods: browser.methods,
27
+ primary: browser.primary,
28
+ auto_redirect: browser.autoRedirect,
29
+ ...(browser.local ? { local: browser.local } : {}),
30
+ }
31
+ : null,
32
+ });
33
+ if (!config) {
34
+ return browser
35
+ ? registerRoutes((router) => router.add("GET", `${FEDERATION_PATH}/configuration`, () => Effect.succeed(configuration())))
36
+ : Layer.empty;
37
+ }
38
+ const provider = options.provider ?? createFederationProvider(config);
39
+ const checkStatus = options.status ?? federationStatus;
40
+ const matches = (session) => browser
41
+ ? browserSessionAdmission(session, config)
42
+ : Promise.resolve({
43
+ active: session.issuer === config.issuer && session.clientId === config.clientId,
44
+ });
45
+ return registerRoutes((router) => Effect.gen(function* () {
46
+ const backend = yield* OntologyBackend;
47
+ const store = backend.federation;
48
+ if (!store) {
49
+ return;
50
+ }
51
+ const respond = (effect) => Effect.gen(function* () {
52
+ const revision = options.browserRevision
53
+ ? yield* Effect.promise(() => browserRevisionObservation(options.browserRevision))
54
+ : { active: true };
55
+ const revisionValid = () => browserRevisionAdmitted(revision);
56
+ if (!revisionValid()) {
57
+ return json({ error: "access_revoked" }, 401);
58
+ }
59
+ const response = yield* effect(revisionValid);
60
+ return revisionValid() ? response : json({ error: "access_revoked" }, 401);
61
+ }).pipe(Effect.catchCause((cause) => Effect.logError("ontology.federation.failed", cause).pipe(Effect.as(json({ error: "sign_in_failed" }, 401)))));
62
+ yield* router.add("GET", `${FEDERATION_PATH}/configuration`, () => Effect.succeed(json({
63
+ version: 1,
64
+ ...(browser ? { manifest_digest: options.ontology.manifest.hash } : {}),
65
+ browser: browser
66
+ ? {
67
+ methods: browser.methods,
68
+ primary: browser.primary,
69
+ auto_redirect: browser.autoRedirect,
70
+ ...(browser.local ? { local: browser.local } : {}),
71
+ }
72
+ : null,
73
+ })));
74
+ yield* router.add("POST", `${FEDERATION_PATH}/exchange`, (request) => respond((revisionValid) => Effect.gen(function* () {
75
+ const body = yield* request.json;
76
+ const input = body;
77
+ if (!input ||
78
+ (input.intent !== undefined && input.intent !== "link") ||
79
+ ![input.code, input.verifier, input.redirectUri, input.nonce].every((value) => typeof value === "string" && value.length > 0 && value.length <= 4096)) {
80
+ return json({ error: "invalid_request" }, 400);
81
+ }
82
+ let linkUserId;
83
+ if (input.intent === "link") {
84
+ if (browser && !browser.methods.includes("email")) {
85
+ return json({ error: "method_disabled" }, 403);
86
+ }
87
+ if (typeof input.proof !== "string" ||
88
+ !input.proof ||
89
+ input.proof.length > 16384 ||
90
+ !store.emailIdentity) {
91
+ return json({ error: "workspace_login_required" }, 403);
92
+ }
93
+ const verified = yield* Effect.promise(() => verify(input.proof));
94
+ if (verified.status !== "valid" || verified.identity.provider !== "neon-auth") {
95
+ return json({ error: "workspace_login_required" }, 403);
96
+ }
97
+ const proof = yield* store.emailIdentity(verified.identity.subject);
98
+ if (!proof || proof.kind !== "member") {
99
+ return json({ error: "workspace_login_required" }, 403);
100
+ }
101
+ linkUserId = proof.id;
102
+ }
103
+ const identity = yield* Effect.promise(() => provider.exchange(input));
104
+ if (!(yield* Effect.promise(() => checkStatus(identity)))) {
105
+ return json({ error: "access_revoked" }, 401);
106
+ }
107
+ if (browser && !identity.sessionId) {
108
+ return json({ error: "session_grant_required" }, 401);
109
+ }
110
+ let principal = yield* store.identity(identity.issuer, identity.subject);
111
+ const known = store.bindingExists
112
+ ? yield* store.bindingExists(identity.issuer, identity.subject)
113
+ : principal !== undefined;
114
+ if (known && !principal) {
115
+ return json({ error: "access_denied" }, 403);
116
+ }
117
+ if (linkUserId && principal && principal.id !== linkUserId) {
118
+ return json({ error: "identity_conflict" }, 403);
119
+ }
120
+ if (!linkUserId && !known && browser && store.enroll) {
121
+ if (!identity.email) {
122
+ return json({ error: "verified_email_required" }, 403);
123
+ }
124
+ if (!revisionValid()) {
125
+ return json({ error: "access_revoked" }, 401);
126
+ }
127
+ principal = yield* store.enroll(identity);
128
+ }
129
+ const signedIn = principal !== undefined && linkUserId === undefined;
130
+ const token = opaque(signedIn ? FEDERATION_TOKEN_PREFIX : "ssfl_");
131
+ if (!revisionValid()) {
132
+ return json({ error: "access_revoked" }, 401);
133
+ }
134
+ yield* store.save({
135
+ ...identity,
136
+ hash: federationDigest(token),
137
+ userId: signedIn ? principal.id : null,
138
+ ...(linkUserId ? { linkUserId } : {}),
139
+ expiresAt: Date.now() + (signedIn ? 30 * 86400_000 : 600_000),
140
+ });
141
+ return json({
142
+ status: signedIn ? "signed_in" : "proof_required",
143
+ token,
144
+ ...(!signedIn
145
+ ? {
146
+ identity: {
147
+ id: identity.subject,
148
+ ...(identity.email ? { email: identity.email } : {}),
149
+ ...(identity.name ? { name: identity.name } : {}),
150
+ },
151
+ }
152
+ : {}),
153
+ ...(linkUserId ? { linkUserId } : {}),
154
+ });
155
+ })));
156
+ yield* router.add("POST", `${FEDERATION_PATH}/link`, (request) => respond((revisionValid) => Effect.gen(function* () {
157
+ const body = yield* request.json;
158
+ const pending = body?.pending;
159
+ const authorization = request.headers.authorization;
160
+ if (typeof pending !== "string" ||
161
+ !pending.startsWith("ssfl_") ||
162
+ !authorization?.startsWith("Bearer ")) {
163
+ return json({ error: "workspace_login_required" }, 403);
164
+ }
165
+ const verified = yield* Effect.promise(() => verify(authorization.slice(7)));
166
+ if (verified.status !== "valid" || verified.identity.provider !== "neon-auth") {
167
+ return json({ error: "workspace_login_required" }, 403);
168
+ }
169
+ const session = yield* store.consumePending(federationDigest(pending));
170
+ const admission = session
171
+ ? yield* Effect.promise(() => matches(session))
172
+ : { active: false };
173
+ if (!session ||
174
+ session.userId ||
175
+ !browserRevisionAdmitted(admission) ||
176
+ !(yield* Effect.promise(() => checkStatus(session)))) {
177
+ return json({ error: "link_rejected" }, 403);
178
+ }
179
+ const proof = session.linkUserId !== undefined
180
+ ? store.emailIdentity
181
+ ? yield* store.emailIdentity(verified.identity.subject)
182
+ : undefined
183
+ : yield* backend.resolvePrincipal(verified.identity);
184
+ if (!proof ||
185
+ proof.kind !== "member" ||
186
+ (session.linkUserId !== undefined && session.linkUserId !== proof.id) ||
187
+ !revisionValid() ||
188
+ !browserRevisionAdmitted(admission)) {
189
+ return json({ error: "link_rejected" }, 403);
190
+ }
191
+ const linked = yield* store.link(session.issuer, session.subject, proof.id);
192
+ if (!linked) {
193
+ return json({ error: "identity_conflict" }, 403);
194
+ }
195
+ const token = opaque(FEDERATION_TOKEN_PREFIX);
196
+ if (!revisionValid() || !browserRevisionAdmitted(admission)) {
197
+ return json({ error: "link_rejected" }, 403);
198
+ }
199
+ yield* store.save({
200
+ ...session,
201
+ hash: federationDigest(token),
202
+ userId: linked.id,
203
+ expiresAt: Date.now() + 30 * 86400_000,
204
+ });
205
+ return json({ status: "signed_in", token });
206
+ })));
207
+ yield* router.add("POST", `${FEDERATION_PATH}/link-email`, (request) => respond((revisionValid) => Effect.gen(function* () {
208
+ if (!browser?.methods.includes("email") || !store.linkEmail) {
209
+ return json({ error: "method_disabled" }, 403);
210
+ }
211
+ const authorization = request.headers.authorization;
212
+ const body = yield* request.json;
213
+ const proofToken = body?.proof;
214
+ if (!authorization?.startsWith(`Bearer ${FEDERATION_TOKEN_PREFIX}`) ||
215
+ typeof proofToken !== "string") {
216
+ return json({ error: "invalid_request" }, 400);
217
+ }
218
+ const session = yield* store.read(federationDigest(authorization.slice(7)));
219
+ const admission = session
220
+ ? yield* Effect.promise(() => matches(session))
221
+ : { active: false };
222
+ if (!session?.userId ||
223
+ !browserRevisionAdmitted(admission) ||
224
+ !(yield* Effect.promise(() => checkStatus(session)))) {
225
+ return json({ error: "access_revoked" }, 401);
226
+ }
227
+ const proof = yield* Effect.promise(() => verify(proofToken));
228
+ if (proof.status !== "valid" || proof.identity.provider !== "neon-auth") {
229
+ return json({ error: "workspace_login_required" }, 403);
230
+ }
231
+ if (!revisionValid() || !browserRevisionAdmitted(admission)) {
232
+ return json({ error: "access_revoked" }, 401);
233
+ }
234
+ const linked = yield* store.linkEmail(session.userId, proof.identity.subject, proof.identity.email);
235
+ return linked === "email_identity_mismatch"
236
+ ? json({ error: "email_identity_mismatch" }, 403)
237
+ : linked
238
+ ? json({ status: "linked" })
239
+ : json({ error: "identity_conflict" }, 403);
240
+ })));
241
+ yield* router.add("POST", `${FEDERATION_PATH}/logout`, (request) => respond(() => Effect.gen(function* () {
242
+ const authorization = request.headers.authorization;
243
+ if (authorization?.startsWith(`Bearer ${FEDERATION_TOKEN_PREFIX}`)) {
244
+ yield* store.remove(federationDigest(authorization.slice(7)));
245
+ }
246
+ return json({ signed_out: true });
247
+ })));
248
+ }));
249
+ }
@@ -0,0 +1,40 @@
1
+ import type { FederationSession } from "../runtime/federation.js";
2
+ /** Freshness starts before I/O. Failure after expiry is closed, with no stale-while-revalidate. */
3
+ export declare function createFederationStatus(options?: {
4
+ fetch?: typeof fetch;
5
+ now?: () => number;
6
+ }): (session: Pick<FederationSession, "issuer" | "clientId" | "consentId" | "generation" | "sessionId">) => Promise<boolean>;
7
+ export declare const federationStatus: (session: Pick<FederationSession, "issuer" | "clientId" | "consentId" | "generation" | "sessionId">) => Promise<boolean>;
8
+ export interface BrowserRevision {
9
+ readonly issuer: string;
10
+ readonly clientId: string;
11
+ readonly manifestDigest: string;
12
+ readonly deploymentId?: string;
13
+ }
14
+ export interface BrowserRevisionObservation {
15
+ readonly active: boolean;
16
+ readonly compatibleManifestDigest?: string;
17
+ readonly validUntil?: number;
18
+ }
19
+ /** Recheck retained evidence immediately before admission, after any awaited verification. */
20
+ export declare function browserRevisionAdmitted(observation: BrowserRevisionObservation, now?: number): boolean;
21
+ /** The active source revision fences every explicit browser method, including old Neon URLs. */
22
+ export declare function createBrowserRevisionObservation(options?: {
23
+ fetch?: typeof fetch;
24
+ now?: () => number;
25
+ }): (revision: BrowserRevision) => Promise<BrowserRevisionObservation>;
26
+ export declare function createBrowserRevisionStatus(options?: {
27
+ fetch?: typeof fetch;
28
+ now?: () => number;
29
+ }): (revision: BrowserRevision) => Promise<boolean>;
30
+ export declare const browserRevisionStatus: (revision: BrowserRevision) => Promise<boolean>;
31
+ export declare const browserRevisionObservation: (revision: BrowserRevision) => Promise<BrowserRevisionObservation>;
32
+ /** A persisted session keeps its signed source identity; Cloud alone may admit a predecessor. */
33
+ export declare function browserSessionAdmission(session: Pick<FederationSession, "issuer" | "clientId" | "environment" | "deploymentId" | "manifestDigest" | "sessionId">, current: {
34
+ readonly issuer: string;
35
+ readonly clientId: string;
36
+ readonly environment?: string;
37
+ readonly deploymentId?: string;
38
+ readonly manifestDigest?: string;
39
+ }, observe?: (revision: BrowserRevision) => Promise<BrowserRevisionObservation>, now?: () => number): Promise<BrowserRevisionObservation>;
40
+ export declare function browserSessionMatches(...args: Parameters<typeof browserSessionAdmission>): Promise<boolean>;
@@ -0,0 +1,151 @@
1
+ /** Freshness starts before I/O. Failure after expiry is closed, with no stale-while-revalidate. */
2
+ export function createFederationStatus(options = {}) {
3
+ const cache = new Map();
4
+ const now = options.now ?? Date.now;
5
+ return (session) => {
6
+ const key = JSON.stringify([
7
+ session.issuer,
8
+ session.clientId,
9
+ session.consentId,
10
+ session.generation,
11
+ session.sessionId,
12
+ ]);
13
+ const cached = cache.get(key);
14
+ if (cached && now() - cached.checkedAt < 55_000) {
15
+ return cached.value;
16
+ }
17
+ const checkedAt = now();
18
+ const value = (async () => {
19
+ const endpoint = new URL(`${session.issuer}/status`);
20
+ endpoint.search = new URLSearchParams({
21
+ client_id: session.clientId,
22
+ generation: String(session.generation),
23
+ consent: session.consentId,
24
+ ...(session.sessionId === undefined ? {} : { session: session.sessionId }),
25
+ }).toString();
26
+ const response = await (options.fetch ?? fetch)(endpoint, {
27
+ cache: "no-store",
28
+ redirect: "error",
29
+ signal: AbortSignal.timeout(4000),
30
+ });
31
+ const body = (await response.json());
32
+ if (!response.ok) {
33
+ throw new Error(`Cloud OIDC status check failed with HTTP ${response.status}`);
34
+ }
35
+ // Transport/protocol failures reach the authentication boundary's operator diagnostics.
36
+ return body.active === true && now() - checkedAt < 55_000;
37
+ })();
38
+ if (cache.size >= 1000) {
39
+ cache.delete(cache.keys().next().value);
40
+ }
41
+ cache.set(key, { checkedAt, value });
42
+ return value;
43
+ };
44
+ }
45
+ export const federationStatus = createFederationStatus();
46
+ /** Recheck retained evidence immediately before admission, after any awaited verification. */
47
+ export function browserRevisionAdmitted(observation, now = Date.now()) {
48
+ return (observation.active && (observation.validUntil === undefined || now < observation.validUntil));
49
+ }
50
+ /** The active source revision fences every explicit browser method, including old Neon URLs. */
51
+ export function createBrowserRevisionObservation(options = {}) {
52
+ // Share concurrent I/O only. A positive answer must never extend Cloud's cutover deadline.
53
+ const inFlight = new Map();
54
+ const now = options.now ?? Date.now;
55
+ return async (revision) => {
56
+ const key = JSON.stringify([
57
+ revision.issuer,
58
+ revision.clientId,
59
+ revision.manifestDigest,
60
+ revision.deploymentId,
61
+ ]);
62
+ let value = inFlight.get(key);
63
+ if (!value) {
64
+ value = (async () => {
65
+ const endpoint = new URL(`${revision.issuer}/revision-status`);
66
+ endpoint.search = new URLSearchParams({
67
+ client_id: revision.clientId,
68
+ manifest_digest: revision.manifestDigest,
69
+ ...(revision.deploymentId ? { deployment_id: revision.deploymentId } : {}),
70
+ }).toString();
71
+ const response = await (options.fetch ?? fetch)(endpoint, {
72
+ redirect: "error",
73
+ cache: "no-store",
74
+ signal: AbortSignal.timeout(4000),
75
+ });
76
+ if (!response.ok) {
77
+ throw new Error(`Browser authentication revision check failed with HTTP ${response.status}`);
78
+ }
79
+ const body = (await response.json());
80
+ const validUntil = body.valid_until;
81
+ const compatible = body.compatible_manifest_digest;
82
+ if (body.active !== true ||
83
+ (validUntil !== undefined &&
84
+ (typeof validUntil !== "number" || !Number.isFinite(validUntil))) ||
85
+ (compatible !== undefined &&
86
+ (typeof compatible !== "string" || !compatible || validUntil === undefined))) {
87
+ return { active: false };
88
+ }
89
+ return {
90
+ active: true,
91
+ ...(typeof compatible === "string" ? { compatibleManifestDigest: compatible } : {}),
92
+ ...(typeof validUntil === "number" ? { validUntil } : {}),
93
+ };
94
+ })();
95
+ if (inFlight.size >= 1000) {
96
+ inFlight.delete(inFlight.keys().next().value);
97
+ }
98
+ inFlight.set(key, value);
99
+ const entry = value;
100
+ const forget = () => {
101
+ if (inFlight.get(key) === entry) {
102
+ inFlight.delete(key);
103
+ }
104
+ };
105
+ void value.then(forget, forget);
106
+ }
107
+ const observed = await value;
108
+ return observed.validUntil !== undefined && now() >= observed.validUntil
109
+ ? { active: false }
110
+ : observed;
111
+ };
112
+ }
113
+ export function createBrowserRevisionStatus(options = {}) {
114
+ const observe = createBrowserRevisionObservation(options);
115
+ return async (revision) => (await observe(revision)).active;
116
+ }
117
+ export const browserRevisionStatus = createBrowserRevisionStatus();
118
+ export const browserRevisionObservation = createBrowserRevisionObservation();
119
+ /** A persisted session keeps its signed source identity; Cloud alone may admit a predecessor. */
120
+ export async function browserSessionAdmission(session, current, observe = browserRevisionObservation, now = Date.now) {
121
+ if (!session.sessionId ||
122
+ session.issuer !== current.issuer ||
123
+ session.environment !== current.environment) {
124
+ return { active: false };
125
+ }
126
+ if (session.clientId === current.clientId &&
127
+ session.deploymentId === current.deploymentId &&
128
+ session.manifestDigest === current.manifestDigest) {
129
+ return { active: true };
130
+ }
131
+ if (!session.deploymentId ||
132
+ !session.manifestDigest ||
133
+ !current.deploymentId ||
134
+ !current.manifestDigest) {
135
+ return { active: false };
136
+ }
137
+ const source = await observe({
138
+ issuer: session.issuer,
139
+ clientId: session.clientId,
140
+ deploymentId: session.deploymentId,
141
+ manifestDigest: session.manifestDigest,
142
+ });
143
+ return source.validUntil !== undefined &&
144
+ browserRevisionAdmitted(source, now()) &&
145
+ source.compatibleManifestDigest === current.manifestDigest
146
+ ? source
147
+ : { active: false };
148
+ }
149
+ export async function browserSessionMatches(...args) {
150
+ return browserRevisionAdmitted(await browserSessionAdmission(...args), (args[3] ?? Date.now)());
151
+ }
@@ -0,0 +1,18 @@
1
+ import type { ChatDeliveryFactory } from "./chat/delivery.js";
2
+ import { Layer } from "effect";
3
+ import { type HttpApiGroup } from "effect/unstable/httpapi";
4
+ import type { MetricQueries } from "./metric-query.js";
5
+ import { type BuiltApi } from "./api.js";
6
+ import type { AfterCommitHook } from "./config.js";
7
+ import type { ReplicationKick } from "./replication.js";
8
+ import type { DeploymentObservation } from "../deployment.js";
9
+ import type { ConnectionTransportFactory } from "./connections.js";
10
+ import { type RateLimit } from "./rate-limit.js";
11
+ import { OntologyBackend } from "./runtime-contract.js";
12
+ /**
13
+ * Sign-in checks one client may make per minute. A person checks once per sign-in, a few times at
14
+ * most; the limit slows down anyone testing addresses to learn who the app's members are.
15
+ */
16
+ export declare const SIGN_IN_CHECK_LIMIT: RateLimit;
17
+ /** The handlers of every group of the API; they require {@link OntologyBackend}. */
18
+ export declare function handlersLayer(built: BuiltApi, hooks: ReadonlyMap<string, AfterCommitHook>, connections: ConnectionTransportFactory, replicate: ReplicationKick, metricQueries: MetricQueries, chatDelivery: ChatDeliveryFactory | undefined, deployment?: DeploymentObservation): Layer.Layer<HttpApiGroup.Service<"ontology", string>, never, OntologyBackend>;