@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,181 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { Effect, Option, Schema } from "effect";
3
+ import { isSqlError } from "effect/unstable/sql/SqlError";
4
+ import { Conflict } from "../errors.js";
5
+ import { channelPolicyOf } from "../manifest.js";
6
+ import { AGENT_IDENTITIES_TABLE, CHANNEL_USERS_TABLE } from "../migrate/storage.js";
7
+ import { countAgentAttempt, effectiveChannelLimits } from "./agent-counters.js";
8
+ import { runNewUserHook } from "./new-user-hook.js";
9
+ import { makePrincipalUserWriter } from "./sql-runtime.js";
10
+ import { makeIdentityWriter, USER_IDENTITY_TABLE } from "./user-identities.js";
11
+ class RegistrationCapped extends Schema.TaggedError()("RegistrationCapped", {
12
+ limit: Schema.Int,
13
+ }) {
14
+ }
15
+ function uniqueFailure(error) {
16
+ const sqlError = error instanceof Conflict ? error.cause : error;
17
+ if (!isSqlError(sqlError)) {
18
+ return false;
19
+ }
20
+ const cause = sqlError.reason.cause;
21
+ return sqlError.reason._tag === "UniqueViolation" || cause?.code === "23505";
22
+ }
23
+ /** Account admission shares pairing's lock and creates User plus identity in one transaction. */
24
+ export function resolveAgentIdentity(ontology, sql, store, input, context = "agent") {
25
+ const contact = input.turn || context === "channel_app";
26
+ const policy = effectiveChannelLimits(sql, input.limits);
27
+ const account = `${input.provider}:${input.externalId}`;
28
+ const attempt = sql.withTransaction(Effect.gen(function* () {
29
+ const limits = yield* effectiveChannelLimits(sql);
30
+ yield* sql.unsafe(`SELECT pg_advisory_xact_lock(hashtext($1))`, [`account:${account}`]);
31
+ let identity = yield* store.findIdentity(input);
32
+ let created = false;
33
+ if (identity !== undefined && identity.revokedAt !== null) {
34
+ return { status: "refused", reason: "blocked" };
35
+ }
36
+ if (identity === undefined) {
37
+ if (!contact ||
38
+ input.chat !== "private" ||
39
+ channelPolicyOf(ontology.manifest, input.provider) !== "open") {
40
+ return { status: "pairing_required" };
41
+ }
42
+ const limited = yield* countAgentAttempt(sql, {
43
+ scope: "newUsersPerHour",
44
+ subject: "workspace",
45
+ window: "hour",
46
+ limit: limits.newUsersPerHour,
47
+ });
48
+ if (limited !== undefined) {
49
+ // Roll back admission's increment as well as every possible provisioning write.
50
+ return yield* new RegistrationCapped({ limit: limits.newUsersPerHour });
51
+ }
52
+ const display = input.display?.trim() || null;
53
+ const username = input.username?.trim().replace(/^@/, "");
54
+ const providerName = input.provider.charAt(0).toUpperCase() + input.provider.slice(1);
55
+ const actionId = randomUUID();
56
+ const writer = makePrincipalUserWriter(ontology, sql, {
57
+ action: "user.provision",
58
+ actionId,
59
+ });
60
+ const user = yield* writer.create({
61
+ kind: "member",
62
+ name: display || (username ? `@${username}` : `${providerName} ${input.externalId}`),
63
+ email: null,
64
+ identity_provider: null,
65
+ identity_subject: null,
66
+ });
67
+ // The channel account is a `user_identity` record; `_agent_identities` keeps its id too.
68
+ const identityId = randomUUID();
69
+ yield* makeIdentityWriter(ontology, sql, {
70
+ action: `${USER_IDENTITY_TABLE}.provision`,
71
+ actionId,
72
+ }).create({
73
+ id: identityId,
74
+ provider: input.provider,
75
+ issuer: null,
76
+ subject: input.externalId,
77
+ userId: String(user.id),
78
+ origin: "channel",
79
+ display,
80
+ username: username || null,
81
+ });
82
+ yield* sql.unsafe(`INSERT INTO "${AGENT_IDENTITIES_TABLE}"
83
+ ("id", "provider", "external_id", "user_id", "display", "origin")
84
+ VALUES ($1::uuid, $2, $3, $4::uuid, $5, 'provisioned')`, [identityId, input.provider, input.externalId, String(user.id), display]);
85
+ yield* sql.unsafe(`INSERT INTO "${CHANNEL_USERS_TABLE}" ("user_id", "created_via") VALUES ($1::uuid, $2)`, [String(user.id), input.provider]);
86
+ created = true;
87
+ identity = yield* store.findIdentity(input);
88
+ }
89
+ if (identity === undefined) {
90
+ return yield* Effect.die(new Error("Provisioning did not create an identity."));
91
+ }
92
+ const [lifecycle] = yield* sql.unsafe(`SELECT "created_via", "blocked_at" IS NOT NULL AS "blocked",
93
+ "on_new_user_completed_at" IS NOT NULL AS "completed"
94
+ FROM "${CHANNEL_USERS_TABLE}" WHERE "user_id" = $1::uuid`, [identity.userId]);
95
+ if (lifecycle?.blocked) {
96
+ return { status: "refused", reason: "blocked" };
97
+ }
98
+ const member = yield* store.member(identity.userId);
99
+ if (member === undefined) {
100
+ return { status: "refused", reason: "inactive" };
101
+ }
102
+ // The account's current name and username; history records a change, never a repeat.
103
+ const described = {};
104
+ const display = input.display === undefined ? undefined : input.display?.trim() || null;
105
+ const username = input.username === undefined ? undefined : input.username.trim().replace(/^@/, "") || null;
106
+ if (display !== undefined && display !== identity.display) {
107
+ described.display = display;
108
+ }
109
+ if (username !== undefined && username !== (identity.username ?? null)) {
110
+ described.username = username;
111
+ }
112
+ // `user_identity` first, then `_agent_identities`: the order revoking an account locks them in.
113
+ if (Object.keys(described).length > 0) {
114
+ yield* makeIdentityWriter(ontology, sql, {
115
+ action: `${USER_IDENTITY_TABLE}.describe`,
116
+ actionId: randomUUID(),
117
+ }).describe(identity.id, described);
118
+ }
119
+ if (described.display !== undefined) {
120
+ // @legacy identities.legacy-stores-dual-write
121
+ yield* sql.unsafe(`UPDATE "${AGENT_IDENTITIES_TABLE}" SET "display" = $2 WHERE "id" = $1::uuid`, [identity.id, described.display]);
122
+ }
123
+ if (username !== undefined) {
124
+ yield* sql.unsafe(`UPDATE "${AGENT_IDENTITIES_TABLE}" SET "username" = $2 WHERE "id" = $1::uuid`, [identity.id, username]);
125
+ }
126
+ const provisioned = lifecycle !== undefined && !["invite", "email"].includes(lifecycle.created_via);
127
+ if (contact &&
128
+ provisioned &&
129
+ member.principal.roles.length === 1 &&
130
+ member.principal.roles[0] === "member") {
131
+ for (const [scope, subject, window] of [
132
+ ["turnsPerMinute", identity.userId, "minute"],
133
+ ["turnsPerDay", identity.userId, "day"],
134
+ ["workspaceTurnsPerDay", "workspace", "day"],
135
+ ]) {
136
+ const limited = yield* countAgentAttempt(sql, {
137
+ scope,
138
+ subject,
139
+ window,
140
+ limit: scope === "workspaceTurnsPerDay"
141
+ ? limits.workspaceTurnsPerDay
142
+ : limits.perSender[scope],
143
+ });
144
+ if (limited !== undefined) {
145
+ return limited;
146
+ }
147
+ }
148
+ }
149
+ return {
150
+ status: created ? "created" : "existing",
151
+ member: { ...member, principal: { ...member.principal, authenticatedVia: input.provider } },
152
+ provisioned,
153
+ noticeDue: provisioned &&
154
+ (identity.noticedAt === null ||
155
+ (input.noticeVersion !== undefined && identity.noticeVersion !== input.noticeVersion) ||
156
+ (input.noticeSha256 !== undefined && identity.noticeSha256 !== input.noticeSha256)),
157
+ onNewUserPending: provisioned && !lifecycle?.completed && ontology.signIn.onNewUser !== undefined,
158
+ };
159
+ }));
160
+ const admission = policy.pipe(Effect.andThen(attempt)).pipe(Effect.catchIf(uniqueFailure, () => attempt), Effect.catchTag("RegistrationCapped", ({ limit }) =>
161
+ // A separate refusal counter survives admission's rollback. Only its first attempt notifies.
162
+ countAgentAttempt(sql, {
163
+ scope: "newUsersPerHour",
164
+ subject: `refused:${limit}`,
165
+ window: "hour",
166
+ limit: 0,
167
+ }).pipe(Effect.map((limited) => limited))), Effect.flatMap((resolution) => {
168
+ if ((resolution.status !== "created" && resolution.status !== "existing") ||
169
+ !resolution.onNewUserPending ||
170
+ !contact) {
171
+ return Effect.succeed(resolution);
172
+ }
173
+ return runNewUserHook(ontology, sql, resolution.member.principal).pipe(Effect.map((pending) => ({ ...resolution, onNewUserPending: pending })));
174
+ }), Effect.orDie);
175
+ return Effect.gen(function* () {
176
+ if (Option.isSome(yield* Effect.serviceOption(sql.transactionService))) {
177
+ return yield* Effect.die(new Error("Channel admission must run outside any transaction."));
178
+ }
179
+ return yield* admission;
180
+ });
181
+ }
@@ -0,0 +1,18 @@
1
+ import { Layer, Redacted } from "effect";
2
+ import { SqlClient } from "effect/unstable/sql";
3
+ import { type SqlError } from "effect/unstable/sql/SqlError";
4
+ import type { BlobStorageBinding } from "../storage/provider.js";
5
+ import type { DeploymentObservation } from "../deployment.js";
6
+ import type { Ontology } from "../ontology.js";
7
+ import { OntologyBackend, type OntologyServiceRuntime } from "../service/runtime-contract.js";
8
+ import { SignInLinks } from "./sign-in-links.js";
9
+ import { WorkflowStarter } from "./workflow-starts.js";
10
+ /** The service's backend on the runtime, over the SQL client in context. */
11
+ export declare function backendLayer(ontology: Ontology, blobStorage?: Redacted.Redacted<BlobStorageBinding>, workflowStarter?: WorkflowStarter["Service"], deployment?: DeploymentObservation, signInLinks?: SignInLinks["Service"]): Layer.Layer<OntologyBackend, never, SqlClient.SqlClient>;
12
+ /**
13
+ * `@effect/sql-pg` on the pooled `ontology_app` connection string, with the TLS server name a
14
+ * Neon endpoint needs.
15
+ */
16
+ export declare function postgresLayer(databaseUrl: Redacted.Redacted<string>): Layer.Layer<SqlClient.SqlClient, SqlError>;
17
+ /** The default runtime of `createOntologyService`: the SQL runtime on the workspace database. */
18
+ export declare const sqlServiceRuntime: OntologyServiceRuntime;
@@ -0,0 +1,266 @@
1
+ import * as PgClient from "@effect/sql-pg/PgClient";
2
+ import { randomUUID } from "node:crypto";
3
+ import { Effect, Layer, Redacted } from "effect";
4
+ import { SqlClient } from "effect/unstable/sql";
5
+ import { isSqlError } from "effect/unstable/sql/SqlError";
6
+ import { neonBlobProvider } from "../storage/neon.js";
7
+ import { maintainBlobStorage } from "../storage/maintenance.js";
8
+ import { attachmentRuntime } from "../storage/attachments.js";
9
+ import { blobRuntime } from "../storage/sessions.js";
10
+ import { FileAccess, unavailableFiles } from "../storage/file-access.js";
11
+ import { validateDeploymentStorage } from "../storage/provider.js";
12
+ import { readCatalog } from "../migrate/apply.js";
13
+ import { RuntimeDeployment } from "./deployment.js";
14
+ import { NotInvited, OntologyBackend, } from "../service/runtime-contract.js";
15
+ import { WorkflowRecoveryUnavailable } from "./errors.js";
16
+ import { sqlAgentStore } from "./agents.js";
17
+ import { sqlAgentTaskStore } from "./agent-tasks.js";
18
+ import { generatedActions } from "./generated-actions.js";
19
+ import { sqlChannelSessionStore } from "./channel-sessions.js";
20
+ import { sqlOAuthStore } from "./oauth.js";
21
+ import { sqlFederationStore } from "./federation.js";
22
+ import { runAction } from "./pipeline.js";
23
+ import { checkSignIn, resolvePrincipalByApiKey, resolvePrincipalByIdentity, resolvePipelineWorker, resolveHookService, resolveWorkflowUser, } from "./principals.js";
24
+ import { postgresTls } from "./postgres-tls.js";
25
+ import { makeOntologyRuntime } from "./sql-runtime.js";
26
+ import { NEON_AUTH_PROVIDER, SIGN_IN_ORIGIN_SQL, USER_IDENTITY_TABLE, } from "./user-identity-sql.js";
27
+ import { ActionTransactions, makeActionTransactions } from "./action-transactions.js";
28
+ import { SignInLinks } from "./sign-in-links.js";
29
+ import { listStarts, sweepStarts, WorkflowStarter, WorkflowStartFailed, } from "./workflow-starts.js";
30
+ import { reserveWorkflowStart, recordWorkflowSubmission } from "./workflow-admission.js";
31
+ /** Connections one service instance holds to the database's pooler. */
32
+ const MAX_CONNECTIONS = 5;
33
+ /**
34
+ * A rejected credential answers 401; the reason stays in the operator's logs. Only `not_invited`
35
+ * reaches the caller, as a 403 telling them to ask for an invitation.
36
+ */
37
+ function rejectedAs(operation) {
38
+ return (rejection) => Effect.logWarning("ontology.principal.rejected").pipe(Effect.annotateLogs({
39
+ operation,
40
+ reason: rejection.reason,
41
+ ...(rejection.diagnostic === undefined ? {} : { diagnostic: rejection.diagnostic }),
42
+ }), Effect.as(undefined));
43
+ }
44
+ /** The service's backend on the runtime, over the SQL client in context. */
45
+ export function backendLayer(ontology, blobStorage, workflowStarter, deployment, signInLinks) {
46
+ return Layer.effect(OntologyBackend, Effect.gen(function* () {
47
+ const sql = yield* SqlClient.SqlClient;
48
+ const runtime = makeOntologyRuntime(ontology, sql);
49
+ const original = workflowStarter;
50
+ const boundStarter = original?.prepare
51
+ ? {
52
+ ...original,
53
+ start: (start) => original.prepare(start).pipe(Effect.flatMap((prepared) => reserveWorkflowStart(sql, ontology, prepared)), Effect.flatMap((admitted) => original
54
+ .start(admitted)
55
+ .pipe(Effect.tap(() => recordWorkflowSubmission(sql, admitted)))), Effect.mapError((cause) => cause instanceof WorkflowStartFailed
56
+ ? cause
57
+ : new WorkflowStartFailed({
58
+ reason: "engine",
59
+ message: "Durable workflow admission failed.",
60
+ cause,
61
+ }))),
62
+ ensureRecovery: (input) => original.ensureRecovery({
63
+ ...input,
64
+ ...(original.allocateRun
65
+ ? {
66
+ submit: (recovery) => Effect.runPromise(Effect.gen(function* () {
67
+ const reservation = yield* Effect.tryPromise(() => original.allocateRun());
68
+ const admitted = yield* reserveWorkflowStart(sql, ontology, {
69
+ trigger: "_recovery",
70
+ workflow: "_recovery",
71
+ actionId: randomUUID(),
72
+ recordId: null,
73
+ input: {},
74
+ workflowId: recovery.workflowId,
75
+ arguments: recovery.arguments,
76
+ attributes: recovery.attributes,
77
+ reservation,
78
+ });
79
+ const runId = yield* original.start(admitted);
80
+ yield* recordWorkflowSubmission(sql, admitted);
81
+ return { runId };
82
+ })),
83
+ }
84
+ : {}),
85
+ }),
86
+ }
87
+ : original;
88
+ const actionTransactions = makeActionTransactions();
89
+ const agents = sqlAgentStore(ontology, sql);
90
+ const channelSessions = sqlChannelSessionStore(ontology, sql);
91
+ const withSql = (effect) => {
92
+ const connected = Effect.provideService(effect, SqlClient.SqlClient, sql);
93
+ return deployment
94
+ ? Effect.provideService(connected, RuntimeDeployment, deployment)
95
+ : connected;
96
+ };
97
+ // Actions start the runs their triggers decide; without a starter the sweep starts them.
98
+ const withStarter = (effect) => boundStarter === undefined
99
+ ? effect
100
+ : Effect.provideService(effect, WorkflowStarter, boundStarter);
101
+ // Actions send the sign-in links they queue; without a sender the rows are marked failed.
102
+ const withSignInLinks = (effect) => signInLinks === undefined
103
+ ? effect
104
+ : Effect.provideService(effect, SignInLinks, signInLinks);
105
+ const binding = blobStorage ? Redacted.value(blobStorage) : undefined;
106
+ if (binding) {
107
+ validateDeploymentStorage(binding, deployment);
108
+ }
109
+ if (deployment?.target === "preview") {
110
+ // The provisioner supplies a fresh child binding tagged for this exact deployment.
111
+ // Rebind copied immutable revisions to the child's provider; never follow their old branch.
112
+ if (binding) {
113
+ const [blobs] = yield* sql
114
+ .unsafe("SELECT to_regclass('_blobs') IS NOT NULL AS present")
115
+ .pipe(Effect.orDie);
116
+ // Storage can be provisioned before an ontology declares its first blob property.
117
+ // Present or declared file storage must still work; never suppress its SQL failures.
118
+ const storesFiles = ontology.manifest.entities.some((entity) => entity.properties.some((property) => property.type === "blob"));
119
+ if (blobs?.present || storesFiles) {
120
+ yield* sql
121
+ .unsafe(`UPDATE "_blobs" SET branch_id = $1 WHERE branch_id <> $1`, [
122
+ binding.branchId,
123
+ ])
124
+ .pipe(Effect.orDie);
125
+ }
126
+ }
127
+ const [replication] = yield* sql
128
+ .unsafe("SELECT to_regclass('_ontology_replication') IS NOT NULL AS present")
129
+ .pipe(Effect.orDie);
130
+ if (replication?.present) {
131
+ yield* sql
132
+ .unsafe("UPDATE _ontology_replication SET enabled = false WHERE id AND enabled")
133
+ .pipe(Effect.orDie);
134
+ }
135
+ }
136
+ const provider = binding
137
+ ? yield* Effect.acquireRelease(Effect.sync(() => neonBlobProvider(binding, deployment)), (provider) => Effect.sync(() => provider.close?.()))
138
+ : undefined;
139
+ const blobs = provider ? blobRuntime(ontology, sql, provider) : undefined;
140
+ const attachments = provider ? attachmentRuntime(ontology, sql, provider) : undefined;
141
+ return OntologyBackend.of({
142
+ workflowAdmissions: {
143
+ ensureRecovery: (commitBy) => boundStarter
144
+ ? boundStarter.ensureRecovery({ commitBy }).pipe(Effect.andThen(() => {
145
+ const horizon = boundStarter.recoveryHorizon?.();
146
+ return typeof horizon === "number" &&
147
+ Number.isFinite(horizon) &&
148
+ horizon > commitBy
149
+ ? Effect.succeed(horizon)
150
+ : Effect.fail(new WorkflowRecoveryUnavailable({
151
+ message: "The workflow runtime did not confirm durable recovery coverage.",
152
+ }));
153
+ }), Effect.mapError((cause) => new WorkflowRecoveryUnavailable({
154
+ message: "The durable workflow recovery run could not be secured.",
155
+ cause,
156
+ })))
157
+ : Effect.fail(new WorkflowRecoveryUnavailable({
158
+ message: "The durable workflow recovery runtime is unavailable.",
159
+ })),
160
+ reserve: (start) => reserveWorkflowStart(sql, ontology, start).pipe(Effect.catchIf(isSqlError, Effect.die)),
161
+ submitted: (start) => recordWorkflowSubmission(sql, start).pipe(Effect.asVoid, Effect.orDie),
162
+ },
163
+ ...(blobs ? { blobs } : {}),
164
+ ...(attachments ? { attachments } : {}),
165
+ ...(provider ? { maintainBlobs: maintainBlobStorage(sql, provider) } : {}),
166
+ runAction: (input) => withSql(runAction(ontology, {
167
+ entity: input.entity,
168
+ action: input.action,
169
+ input: input.input,
170
+ ...(input.runtime === undefined ? {} : { runtime: input.runtime }),
171
+ principal: input.principal,
172
+ options: input.options,
173
+ ...(binding ? { branchId: binding.branchId } : {}),
174
+ afterCommit: input.afterCommit === undefined ? [] : [input.afterCommit],
175
+ ...(input.requestId === undefined ? {} : { requestId: input.requestId }),
176
+ ...(input.connections === undefined ? {} : { connections: input.connections }),
177
+ })).pipe(withStarter, withSignInLinks, Effect.provideService(ActionTransactions, actionTransactions), Effect.provideService(FileAccess, {
178
+ forInvocation: (invocation) => blobs?.files(invocation) ?? unavailableFiles,
179
+ }), Effect.catchTag("UnknownAction", (error) => Effect.die(error))),
180
+ workflowStarts: {
181
+ sweep: (input) => sweepStarts(sql, boundStarter, input).pipe(Effect.orDie),
182
+ list: (input) => listStarts(sql, input).pipe(Effect.catchIf(isSqlError, (error) => Effect.die(error))),
183
+ },
184
+ agentTasks: sqlAgentTaskStore(sql),
185
+ get: (input) => runtime.get(input),
186
+ find: (input) => runtime.query(input),
187
+ history: (input) => runtime.history(input),
188
+ resolvePrincipal: (identity) => identity.provider === "segmentstream" && identity.oidcIdentity
189
+ ? Effect.gen(function* () {
190
+ const store = sqlFederationStore(ontology, sql);
191
+ const mapped = identity.oidcIdentity;
192
+ const principal = yield* store.identity(mapped.issuer, mapped.subject);
193
+ if (principal) {
194
+ return principal;
195
+ }
196
+ // A known blocked binding is terminal; an unknown mapping never enrolls by email.
197
+ if (yield* store.bindingExists(mapped.issuer, mapped.subject)) {
198
+ return undefined;
199
+ }
200
+ if (!identity.email) {
201
+ return undefined;
202
+ }
203
+ const [neon] = yield* sql.unsafe(`SELECT u.id::text FROM "user" u WHERE lower(u.email) = lower($1)
204
+ AND u.kind = 'member' AND EXISTS (SELECT 1 FROM "${USER_IDENTITY_TABLE}" i
205
+ WHERE i.user_id = u.id AND i.provider = $2
206
+ AND i.origin::text IN ${SIGN_IN_ORIGIN_SQL} AND i.revoked_at IS NULL)`, [identity.email, NEON_AUTH_PROVIDER]);
207
+ return neon ? yield* store.principal(neon.id) : undefined;
208
+ }).pipe(Effect.orDie)
209
+ : withSql(resolvePrincipalByIdentity(ontology, {
210
+ identityProvider: identity.provider,
211
+ identitySubject: identity.subject,
212
+ ...(identity.email === undefined ? {} : { email: identity.email }),
213
+ ...(identity.name === undefined ? {} : { name: identity.name }),
214
+ })).pipe(Effect.catchTag("PrincipalRejected", (rejection) => rejection.reason === "not_invited"
215
+ ? rejectedAs("sign_in")(rejection).pipe(Effect.andThen(Effect.fail(new NotInvited({ message: rejection.message }))))
216
+ : rejectedAs("sign_in")(rejection))),
217
+ resolveHookService: (heldRole) => withSql(resolveHookService(ontology, heldRole)).pipe(Effect.catchTag("PrincipalRejected", rejectedAs("hook_service"))),
218
+ resolvePipelineWorker: (execution) => withSql(resolvePipelineWorker(ontology, execution)).pipe(Effect.catchTag("PrincipalRejected", rejectedAs("pipeline_worker"))),
219
+ resolveWorkflowUser: (input) => withSql(resolveWorkflowUser(ontology, input)).pipe(Effect.catchTag("PrincipalRejected", rejectedAs("workflow_user"))),
220
+ checkSignIn: (email) => ontology.signIn.browser && !ontology.signIn.browser.methods.includes("email")
221
+ ? Effect.succeed({ allowed: false })
222
+ : withSql(checkSignIn(ontology, email)),
223
+ resolveApiKey: (key) => withSql(resolvePrincipalByApiKey(ontology, Redacted.value(key))).pipe(Effect.catchTag("PrincipalRejected", rejectedAs("api_key"))),
224
+ appliedHash: readCatalog({ sql }).pipe(Effect.map((manifest) => manifest?.hash), Effect.orDie),
225
+ replicationEnabled: Effect.gen(function* () {
226
+ const [presence] = yield* sql.unsafe("SELECT to_regclass('_ontology_replication') IS NOT NULL AS present");
227
+ if (!presence?.present) {
228
+ return false;
229
+ }
230
+ const [state] = yield* sql.unsafe("SELECT enabled FROM _ontology_replication WHERE id");
231
+ return state?.enabled === true;
232
+ }).pipe(Effect.orDie),
233
+ oauth: sqlOAuthStore(ontology, sql),
234
+ channelSessions: {
235
+ create: (input) => channelSessions
236
+ .create(input)
237
+ .pipe(withStarter, Effect.provideService(ActionTransactions, actionTransactions)),
238
+ },
239
+ federation: sqlFederationStore(ontology, sql),
240
+ agents: {
241
+ ...agents,
242
+ resolveIdentity: (input) => agents
243
+ .resolveIdentity(input)
244
+ .pipe(withStarter, Effect.provideService(ActionTransactions, actionTransactions)),
245
+ },
246
+ });
247
+ }));
248
+ }
249
+ /**
250
+ * `@effect/sql-pg` on the pooled `ontology_app` connection string, with the TLS server name a
251
+ * Neon endpoint needs.
252
+ */
253
+ export function postgresLayer(databaseUrl) {
254
+ return PgClient.layer({
255
+ url: databaseUrl,
256
+ ssl: postgresTls(databaseUrl),
257
+ maxConnections: MAX_CONNECTIONS,
258
+ connectTimeout: "5 seconds",
259
+ applicationName: "segmentstream-ontology",
260
+ });
261
+ }
262
+ /** The default runtime of `createOntologyService`: the SQL runtime on the workspace database. */
263
+ export const sqlServiceRuntime = {
264
+ generatedActions: (entity, ontology) => generatedActions(ontology, entity.name),
265
+ connect: ({ ontology, databaseUrl, blobStorage, workflowStarter, deployment, signInLinks }) => backendLayer(ontology, blobStorage, workflowStarter, deployment, signInLinks).pipe(Layer.provide(postgresLayer(databaseUrl))),
266
+ };
@@ -0,0 +1,68 @@
1
+ import { Context, Effect } from "effect";
2
+ import type { SqlClient } from "effect/unstable/sql";
3
+ import type { QueuedSignInEmail } from "./member-writes.js";
4
+ /** How long sign-in email rows are kept, for an operator, before a later send deletes them. */
5
+ export declare const SIGN_IN_EMAIL_RETENTION_DAYS = 30;
6
+ /** Why Neon Auth did not issue a link, as the row's `failure` records it. */
7
+ export type SignInLinkFailure = "disabled" | "refused" | "unreachable";
8
+ declare const SignInLinks_base: Context.ServiceClass<SignInLinks, "@segmentstream/ontology/SignInLinks", {
9
+ /** Undefined once Neon Auth issued the link, else why it did not. */
10
+ readonly request: (email: QueuedSignInEmail) => Effect.Effect<SignInLinkFailure | undefined>;
11
+ }>;
12
+ /**
13
+ * Asks the app's Neon Auth for a sign-in link to `returnTo` for a queued email. Neon Auth posts the
14
+ * link to the platform's email webhook, which sends the email, before it answers. The ontology
15
+ * service provides it in production; a runtime without one marks its rows `failed`.
16
+ */
17
+ export declare class SignInLinks extends SignInLinks_base {
18
+ }
19
+ /**
20
+ * The callback a queued email's link is requested with: the path on the app's origin, with
21
+ * {@link SIGN_IN_EMAIL_PARAMETER} naming the row, which the platform's webhook reads and removes.
22
+ */
23
+ export declare function signInEmailCallback(origin: string, email: QueuedSignInEmail): string;
24
+ /**
25
+ * {@link SignInLinks} through Better Auth's `POST /sign-in/magic-link` on the app's Neon Auth, with
26
+ * the app's production origin, which Neon Auth trusts for callbacks. A 404 means the workspace has
27
+ * no magic links yet; it is reconciled for them.
28
+ */
29
+ export declare function neonSignInLinks(config: {
30
+ readonly baseUrl: string;
31
+ readonly origin: string;
32
+ readonly fetch?: typeof fetch;
33
+ }): SignInLinks["Service"];
34
+ /**
35
+ * Requests the links of the emails an action queued, after its commit, in the same request, and
36
+ * records each outcome on its row; rows older than {@link SIGN_IN_EMAIL_RETENTION_DAYS} days go.
37
+ * Without {@link SignInLinks}, as in a preview, the rows are `failed` with `unavailable`. Nothing
38
+ * here fails the action, and logs never carry an address or a link.
39
+ */
40
+ export declare function sendQueuedSignInEmails(sql: SqlClient.SqlClient, links: SignInLinks["Service"] | undefined, emails: ReadonlyArray<QueuedSignInEmail>, requestId: string): Effect.Effect<void>;
41
+ /**
42
+ * A queued sign-in email as the platform's webhook sends it: the workspace's `template`, by wire
43
+ * name, with `values`, or the platform's own email when it is null; the member's name for the
44
+ * built-in values, and the address of the member whose action sent it, to whom replies go.
45
+ */
46
+ export interface SignInEmail {
47
+ readonly id: string;
48
+ readonly email: string;
49
+ readonly template: string | null;
50
+ readonly values: Readonly<Record<string, string>>;
51
+ readonly returnTo: string;
52
+ readonly memberName: string;
53
+ readonly senderEmail: string | undefined;
54
+ }
55
+ /**
56
+ * The queued email with this id, while its link may still arrive; undefined for an unknown or
57
+ * older one, and in a database migrated before the table existed.
58
+ */
59
+ export declare function findSignInEmail(sql: SqlClient.SqlClient, id: string): Effect.Effect<SignInEmail | undefined, unknown>;
60
+ /** Sends committed queued context through the platform's deployment-authenticated mail boundary. */
61
+ export declare function segmentstreamSignInLinks(config: {
62
+ readonly segmentstreamUrl: string;
63
+ readonly workspaceId: string;
64
+ readonly organizationId: string;
65
+ readonly identityToken: () => string | undefined;
66
+ readonly fetch?: typeof fetch;
67
+ }): SignInLinks["Service"];
68
+ export {};