dotdo 0.0.1 → 0.0.2

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 (727) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +446 -315
  3. package/dist/ai/index.js +19 -0
  4. package/dist/ai/index.js.map +1 -0
  5. package/dist/ai/template-literals.js +852 -0
  6. package/dist/ai/template-literals.js.map +1 -0
  7. package/dist/api/analytics/router.js +601 -0
  8. package/dist/api/analytics/router.js.map +1 -0
  9. package/dist/api/index.js +158 -0
  10. package/dist/api/index.js.map +1 -0
  11. package/dist/api/middleware/auth-federation.js +573 -0
  12. package/dist/api/middleware/auth-federation.js.map +1 -0
  13. package/dist/api/middleware/auth.js +544 -0
  14. package/dist/api/middleware/auth.js.map +1 -0
  15. package/dist/api/middleware/error-handling.js +176 -0
  16. package/dist/api/middleware/error-handling.js.map +1 -0
  17. package/dist/api/middleware/request-id.js +21 -0
  18. package/dist/api/middleware/request-id.js.map +1 -0
  19. package/dist/api/pages.js +1180 -0
  20. package/dist/api/pages.js.map +1 -0
  21. package/dist/api/routes/api.js +612 -0
  22. package/dist/api/routes/api.js.map +1 -0
  23. package/dist/api/routes/browsers.js +471 -0
  24. package/dist/api/routes/browsers.js.map +1 -0
  25. package/dist/api/routes/do.js +188 -0
  26. package/dist/api/routes/do.js.map +1 -0
  27. package/dist/api/routes/mcp.js +459 -0
  28. package/dist/api/routes/mcp.js.map +1 -0
  29. package/dist/api/routes/obs.js +445 -0
  30. package/dist/api/routes/obs.js.map +1 -0
  31. package/dist/api/routes/openapi.js +794 -0
  32. package/dist/api/routes/openapi.js.map +1 -0
  33. package/dist/api/routes/rpc.js +1103 -0
  34. package/dist/api/routes/rpc.js.map +1 -0
  35. package/dist/api/routes/sandboxes.js +389 -0
  36. package/dist/api/routes/sandboxes.js.map +1 -0
  37. package/dist/api/test-do.js +38 -0
  38. package/dist/api/test-do.js.map +1 -0
  39. package/dist/api/types.js +11 -0
  40. package/dist/api/types.js.map +1 -0
  41. package/dist/cli/bin.js +2 -0
  42. package/dist/cli/main.js +52342 -0
  43. package/dist/db/actions.js +212 -0
  44. package/dist/db/actions.js.map +1 -0
  45. package/dist/db/auth.js +506 -0
  46. package/dist/db/auth.js.map +1 -0
  47. package/dist/db/branches.js +65 -0
  48. package/dist/db/branches.js.map +1 -0
  49. package/dist/db/clickhouse.js +1074 -0
  50. package/dist/db/clickhouse.js.map +1 -0
  51. package/dist/db/dlq.js +39 -0
  52. package/dist/db/dlq.js.map +1 -0
  53. package/dist/db/events.js +28 -0
  54. package/dist/db/events.js.map +1 -0
  55. package/dist/db/exec.js +64 -0
  56. package/dist/db/exec.js.map +1 -0
  57. package/dist/db/files.js +85 -0
  58. package/dist/db/files.js.map +1 -0
  59. package/dist/db/flags.js +24 -0
  60. package/dist/db/flags.js.map +1 -0
  61. package/dist/db/git.js +116 -0
  62. package/dist/db/git.js.map +1 -0
  63. package/dist/db/iceberg/inverted-index.js +862 -0
  64. package/dist/db/iceberg/inverted-index.js.map +1 -0
  65. package/dist/db/iceberg/puffin.js +878 -0
  66. package/dist/db/iceberg/puffin.js.map +1 -0
  67. package/dist/db/iceberg/search-manifest.js +422 -0
  68. package/dist/db/iceberg/search-manifest.js.map +1 -0
  69. package/dist/db/iceberg/types.js +8 -0
  70. package/dist/db/iceberg/types.js.map +1 -0
  71. package/dist/db/index.js +121 -0
  72. package/dist/db/index.js.map +1 -0
  73. package/dist/db/integrations.js +368 -0
  74. package/dist/db/integrations.js.map +1 -0
  75. package/dist/db/json-indexes.js +332 -0
  76. package/dist/db/json-indexes.js.map +1 -0
  77. package/dist/db/linked-accounts.js +287 -0
  78. package/dist/db/linked-accounts.js.map +1 -0
  79. package/dist/db/nouns.js +183 -0
  80. package/dist/db/nouns.js.map +1 -0
  81. package/dist/db/objects.js +170 -0
  82. package/dist/db/objects.js.map +1 -0
  83. package/dist/db/primitives/dag-scheduler/index.js +869 -0
  84. package/dist/db/primitives/dag-scheduler/index.js.map +1 -0
  85. package/dist/db/primitives/exactly-once-context.js +237 -0
  86. package/dist/db/primitives/exactly-once-context.js.map +1 -0
  87. package/dist/db/primitives/index.js +62 -0
  88. package/dist/db/primitives/index.js.map +1 -0
  89. package/dist/db/primitives/keyed-router.js +145 -0
  90. package/dist/db/primitives/keyed-router.js.map +1 -0
  91. package/dist/db/primitives/observability.js +162 -0
  92. package/dist/db/primitives/observability.js.map +1 -0
  93. package/dist/db/primitives/schema-evolution.js +643 -0
  94. package/dist/db/primitives/schema-evolution.js.map +1 -0
  95. package/dist/db/primitives/stateful-operator/index.js +770 -0
  96. package/dist/db/primitives/stateful-operator/index.js.map +1 -0
  97. package/dist/db/primitives/temporal-store.js +306 -0
  98. package/dist/db/primitives/temporal-store.js.map +1 -0
  99. package/dist/db/primitives/typed-column-store.js +1229 -0
  100. package/dist/db/primitives/typed-column-store.js.map +1 -0
  101. package/dist/db/primitives/utils/duration.js +162 -0
  102. package/dist/db/primitives/utils/duration.js.map +1 -0
  103. package/dist/db/primitives/utils/murmur3.js +118 -0
  104. package/dist/db/primitives/utils/murmur3.js.map +1 -0
  105. package/dist/db/primitives/watermark-service.js +136 -0
  106. package/dist/db/primitives/watermark-service.js.map +1 -0
  107. package/dist/db/primitives/window-manager.js +764 -0
  108. package/dist/db/primitives/window-manager.js.map +1 -0
  109. package/dist/db/relationships.js +66 -0
  110. package/dist/db/relationships.js.map +1 -0
  111. package/dist/db/schema-minimal.js +61 -0
  112. package/dist/db/schema-minimal.js.map +1 -0
  113. package/dist/db/search.js +28 -0
  114. package/dist/db/search.js.map +1 -0
  115. package/dist/db/stores.js +1665 -0
  116. package/dist/db/stores.js.map +1 -0
  117. package/dist/db/things.js +297 -0
  118. package/dist/db/things.js.map +1 -0
  119. package/dist/db/vault.js +171 -0
  120. package/dist/db/vault.js.map +1 -0
  121. package/dist/db/verbs.js +102 -0
  122. package/dist/db/verbs.js.map +1 -0
  123. package/dist/do/base.js +48 -0
  124. package/dist/do/base.js.map +1 -0
  125. package/dist/do/bash.js +35 -0
  126. package/dist/do/bash.js.map +1 -0
  127. package/dist/do/fs.js +25 -0
  128. package/dist/do/fs.js.map +1 -0
  129. package/dist/do/full.js +61 -0
  130. package/dist/do/full.js.map +1 -0
  131. package/dist/do/git.js +28 -0
  132. package/dist/do/git.js.map +1 -0
  133. package/dist/do/index.js +52 -0
  134. package/dist/do/index.js.map +1 -0
  135. package/dist/do/tiny.js +31 -0
  136. package/dist/do/tiny.js.map +1 -0
  137. package/dist/lib/DOAuth.js +261 -0
  138. package/dist/lib/DOAuth.js.map +1 -0
  139. package/dist/lib/DODispatcher.js +72 -0
  140. package/dist/lib/DODispatcher.js.map +1 -0
  141. package/dist/lib/Modifier.js +189 -0
  142. package/dist/lib/Modifier.js.map +1 -0
  143. package/dist/lib/StateStorage.js +403 -0
  144. package/dist/lib/StateStorage.js.map +1 -0
  145. package/dist/lib/TypeRegistry.js +122 -0
  146. package/dist/lib/TypeRegistry.js.map +1 -0
  147. package/dist/lib/agent/tools/bash.js +336 -0
  148. package/dist/lib/agent/tools/bash.js.map +1 -0
  149. package/dist/lib/agent/tools/edit.js +157 -0
  150. package/dist/lib/agent/tools/edit.js.map +1 -0
  151. package/dist/lib/agent/tools/glob.js +137 -0
  152. package/dist/lib/agent/tools/glob.js.map +1 -0
  153. package/dist/lib/agent/tools/grep.js +315 -0
  154. package/dist/lib/agent/tools/grep.js.map +1 -0
  155. package/dist/lib/agent/tools/index.js +71 -0
  156. package/dist/lib/agent/tools/index.js.map +1 -0
  157. package/dist/lib/agent/tools/read.js +212 -0
  158. package/dist/lib/agent/tools/read.js.map +1 -0
  159. package/dist/lib/agent/tools/types.js +197 -0
  160. package/dist/lib/agent/tools/types.js.map +1 -0
  161. package/dist/lib/agent/tools/write.js +159 -0
  162. package/dist/lib/agent/tools/write.js.map +1 -0
  163. package/dist/lib/ai/gateway.js +247 -0
  164. package/dist/lib/ai/gateway.js.map +1 -0
  165. package/dist/lib/ai/tool-loop-agent.js +591 -0
  166. package/dist/lib/ai/tool-loop-agent.js.map +1 -0
  167. package/dist/lib/auto-wiring.js +439 -0
  168. package/dist/lib/auto-wiring.js.map +1 -0
  169. package/dist/lib/browse/browserbase.js +163 -0
  170. package/dist/lib/browse/browserbase.js.map +1 -0
  171. package/dist/lib/browse/cloudflare.js +144 -0
  172. package/dist/lib/browse/cloudflare.js.map +1 -0
  173. package/dist/lib/browse/index.js +62 -0
  174. package/dist/lib/browse/index.js.map +1 -0
  175. package/dist/lib/browse/types.js +13 -0
  176. package/dist/lib/browse/types.js.map +1 -0
  177. package/dist/lib/cache/index.js +37 -0
  178. package/dist/lib/cache/index.js.map +1 -0
  179. package/dist/lib/cache/visibility.js +638 -0
  180. package/dist/lib/cache/visibility.js.map +1 -0
  181. package/dist/lib/capabilities.js +268 -0
  182. package/dist/lib/capabilities.js.map +1 -0
  183. package/dist/lib/channels/base.js +106 -0
  184. package/dist/lib/channels/base.js.map +1 -0
  185. package/dist/lib/channels/discord.js +94 -0
  186. package/dist/lib/channels/discord.js.map +1 -0
  187. package/dist/lib/channels/email.js +204 -0
  188. package/dist/lib/channels/email.js.map +1 -0
  189. package/dist/lib/channels/index.js +90 -0
  190. package/dist/lib/channels/index.js.map +1 -0
  191. package/dist/lib/channels/mdxui-chat.js +95 -0
  192. package/dist/lib/channels/mdxui-chat.js.map +1 -0
  193. package/dist/lib/channels/slack-blockkit.js +121 -0
  194. package/dist/lib/channels/slack-blockkit.js.map +1 -0
  195. package/dist/lib/channels/types.js +7 -0
  196. package/dist/lib/channels/types.js.map +1 -0
  197. package/dist/lib/cloudflare/ai.js +654 -0
  198. package/dist/lib/cloudflare/ai.js.map +1 -0
  199. package/dist/lib/cloudflare/index.js +88 -0
  200. package/dist/lib/cloudflare/index.js.map +1 -0
  201. package/dist/lib/cloudflare/kv.js +342 -0
  202. package/dist/lib/cloudflare/kv.js.map +1 -0
  203. package/dist/lib/cloudflare/queues.js +434 -0
  204. package/dist/lib/cloudflare/queues.js.map +1 -0
  205. package/dist/lib/cloudflare/r2.js +604 -0
  206. package/dist/lib/cloudflare/r2.js.map +1 -0
  207. package/dist/lib/cloudflare/vectorize.js +494 -0
  208. package/dist/lib/cloudflare/vectorize.js.map +1 -0
  209. package/dist/lib/cloudflare/workflows.js +569 -0
  210. package/dist/lib/cloudflare/workflows.js.map +1 -0
  211. package/dist/lib/colo/caching.js +196 -0
  212. package/dist/lib/colo/caching.js.map +1 -0
  213. package/dist/lib/colo/detection.js +194 -0
  214. package/dist/lib/colo/detection.js.map +1 -0
  215. package/dist/lib/colo/external-data.js +219 -0
  216. package/dist/lib/colo/external-data.js.map +1 -0
  217. package/dist/lib/colo/globe-data.js +179 -0
  218. package/dist/lib/colo/globe-data.js.map +1 -0
  219. package/dist/lib/colo/index.js +16 -0
  220. package/dist/lib/colo/index.js.map +1 -0
  221. package/dist/lib/decorators.js +37 -0
  222. package/dist/lib/decorators.js.map +1 -0
  223. package/dist/lib/discovery.js +81 -0
  224. package/dist/lib/discovery.js.map +1 -0
  225. package/dist/lib/executors/AgenticFunctionExecutor.js +619 -0
  226. package/dist/lib/executors/AgenticFunctionExecutor.js.map +1 -0
  227. package/dist/lib/executors/BaseFunctionExecutor.js +328 -0
  228. package/dist/lib/executors/BaseFunctionExecutor.js.map +1 -0
  229. package/dist/lib/executors/CascadeExecutor.js +418 -0
  230. package/dist/lib/executors/CascadeExecutor.js.map +1 -0
  231. package/dist/lib/executors/CodeFunctionExecutor.js +904 -0
  232. package/dist/lib/executors/CodeFunctionExecutor.js.map +1 -0
  233. package/dist/lib/executors/GenerativeFunctionExecutor.js +904 -0
  234. package/dist/lib/executors/GenerativeFunctionExecutor.js.map +1 -0
  235. package/dist/lib/executors/HumanFunctionExecutor.js +884 -0
  236. package/dist/lib/executors/HumanFunctionExecutor.js.map +1 -0
  237. package/dist/lib/executors/ParallelStepExecutor.js +308 -0
  238. package/dist/lib/executors/ParallelStepExecutor.js.map +1 -0
  239. package/dist/lib/executors/types.js +12 -0
  240. package/dist/lib/executors/types.js.map +1 -0
  241. package/dist/lib/experiments.js +89 -0
  242. package/dist/lib/experiments.js.map +1 -0
  243. package/dist/lib/flags/store.js +262 -0
  244. package/dist/lib/flags/store.js.map +1 -0
  245. package/dist/lib/functions/FunctionComposition.js +467 -0
  246. package/dist/lib/functions/FunctionComposition.js.map +1 -0
  247. package/dist/lib/functions/FunctionMiddleware.js +457 -0
  248. package/dist/lib/functions/FunctionMiddleware.js.map +1 -0
  249. package/dist/lib/functions/FunctionRegistry.js +426 -0
  250. package/dist/lib/functions/FunctionRegistry.js.map +1 -0
  251. package/dist/lib/functions/createFunction.js +1048 -0
  252. package/dist/lib/functions/createFunction.js.map +1 -0
  253. package/dist/lib/humans/index.js +68 -0
  254. package/dist/lib/humans/index.js.map +1 -0
  255. package/dist/lib/humans/templates.js +117 -0
  256. package/dist/lib/humans/templates.js.map +1 -0
  257. package/dist/lib/identity.js +98 -0
  258. package/dist/lib/identity.js.map +1 -0
  259. package/dist/lib/index.js +9 -0
  260. package/dist/lib/index.js.map +1 -0
  261. package/dist/lib/logging/error-logger.js +163 -0
  262. package/dist/lib/logging/error-logger.js.map +1 -0
  263. package/dist/lib/logging/index.js +160 -0
  264. package/dist/lib/logging/index.js.map +1 -0
  265. package/dist/lib/mixins/bash.js +825 -0
  266. package/dist/lib/mixins/bash.js.map +1 -0
  267. package/dist/lib/mixins/fs.js +648 -0
  268. package/dist/lib/mixins/fs.js.map +1 -0
  269. package/dist/lib/mixins/git.js +1011 -0
  270. package/dist/lib/mixins/git.js.map +1 -0
  271. package/dist/lib/mixins/index.js +29 -0
  272. package/dist/lib/mixins/index.js.map +1 -0
  273. package/dist/lib/mixins/npm.js +662 -0
  274. package/dist/lib/mixins/npm.js.map +1 -0
  275. package/dist/lib/noun-id.js +278 -0
  276. package/dist/lib/noun-id.js.map +1 -0
  277. package/dist/lib/rate-limit/sliding-window.js +148 -0
  278. package/dist/lib/rate-limit/sliding-window.js.map +1 -0
  279. package/dist/lib/rate-limit.js +110 -0
  280. package/dist/lib/rate-limit.js.map +1 -0
  281. package/dist/lib/rpc/bindings.js +548 -0
  282. package/dist/lib/rpc/bindings.js.map +1 -0
  283. package/dist/lib/rpc/index.js +64 -0
  284. package/dist/lib/rpc/index.js.map +1 -0
  285. package/dist/lib/safe-stringify.js +223 -0
  286. package/dist/lib/safe-stringify.js.map +1 -0
  287. package/dist/lib/sandbox/miniflare-sandbox.js +1007 -0
  288. package/dist/lib/sandbox/miniflare-sandbox.js.map +1 -0
  289. package/dist/lib/sqids.js +110 -0
  290. package/dist/lib/sqids.js.map +1 -0
  291. package/dist/lib/sql/adapters/index.js +10 -0
  292. package/dist/lib/sql/adapters/index.js.map +1 -0
  293. package/dist/lib/sql/adapters/node-sql-parser.js +552 -0
  294. package/dist/lib/sql/adapters/node-sql-parser.js.map +1 -0
  295. package/dist/lib/sql/adapters/pgsql-parser.js +1189 -0
  296. package/dist/lib/sql/adapters/pgsql-parser.js.map +1 -0
  297. package/dist/lib/sql/index.js +277 -0
  298. package/dist/lib/sql/index.js.map +1 -0
  299. package/dist/lib/sql/types.js +56 -0
  300. package/dist/lib/sql/types.js.map +1 -0
  301. package/dist/lib/type-classifier.js +126 -0
  302. package/dist/lib/type-classifier.js.map +1 -0
  303. package/dist/lib/utils/html.js +47 -0
  304. package/dist/lib/utils/html.js.map +1 -0
  305. package/dist/lib/validation.js +48 -0
  306. package/dist/lib/validation.js.map +1 -0
  307. package/dist/lib/vault/store.js +411 -0
  308. package/dist/lib/vault/store.js.map +1 -0
  309. package/dist/metrics/hunch.js +739 -0
  310. package/dist/metrics/hunch.js.map +1 -0
  311. package/dist/objects/API.js +302 -0
  312. package/dist/objects/API.js.map +1 -0
  313. package/dist/objects/Agent.js +179 -0
  314. package/dist/objects/Agent.js.map +1 -0
  315. package/dist/objects/AgenticFunctionExecutor.js +8 -0
  316. package/dist/objects/AgenticFunctionExecutor.js.map +1 -0
  317. package/dist/objects/App.js +83 -0
  318. package/dist/objects/App.js.map +1 -0
  319. package/dist/objects/Browser.js +884 -0
  320. package/dist/objects/Browser.js.map +1 -0
  321. package/dist/objects/Business.js +107 -0
  322. package/dist/objects/Business.js.map +1 -0
  323. package/dist/objects/CLI.js +221 -0
  324. package/dist/objects/CLI.js.map +1 -0
  325. package/dist/objects/CodeFunctionExecutor.js +8 -0
  326. package/dist/objects/CodeFunctionExecutor.js.map +1 -0
  327. package/dist/objects/Collection.js +161 -0
  328. package/dist/objects/Collection.js.map +1 -0
  329. package/dist/objects/DO.js +41 -0
  330. package/dist/objects/DO.js.map +1 -0
  331. package/dist/objects/DOBase.js +2309 -0
  332. package/dist/objects/DOBase.js.map +1 -0
  333. package/dist/objects/DOFull.js +1676 -0
  334. package/dist/objects/DOFull.js.map +1 -0
  335. package/dist/objects/DOTiny.js +207 -0
  336. package/dist/objects/DOTiny.js.map +1 -0
  337. package/dist/objects/Directory.js +199 -0
  338. package/dist/objects/Directory.js.map +1 -0
  339. package/dist/objects/Entity.js +413 -0
  340. package/dist/objects/Entity.js.map +1 -0
  341. package/dist/objects/Function.js +116 -0
  342. package/dist/objects/Function.js.map +1 -0
  343. package/dist/objects/Human.js +231 -0
  344. package/dist/objects/Human.js.map +1 -0
  345. package/dist/objects/HumanFunctionExecutor.js +8 -0
  346. package/dist/objects/HumanFunctionExecutor.js.map +1 -0
  347. package/dist/objects/IcebergMetadataDO.js +938 -0
  348. package/dist/objects/IcebergMetadataDO.js.map +1 -0
  349. package/dist/objects/IntegrationsDO.js +1174 -0
  350. package/dist/objects/IntegrationsDO.js.map +1 -0
  351. package/dist/objects/ObservabilityBroadcaster.js +149 -0
  352. package/dist/objects/ObservabilityBroadcaster.js.map +1 -0
  353. package/dist/objects/Package.js +154 -0
  354. package/dist/objects/Package.js.map +1 -0
  355. package/dist/objects/Product.js +193 -0
  356. package/dist/objects/Product.js.map +1 -0
  357. package/dist/objects/SDK.js +152 -0
  358. package/dist/objects/SDK.js.map +1 -0
  359. package/dist/objects/SaaS.js +235 -0
  360. package/dist/objects/SaaS.js.map +1 -0
  361. package/dist/objects/SandboxDO.js +759 -0
  362. package/dist/objects/SandboxDO.js.map +1 -0
  363. package/dist/objects/Service.js +337 -0
  364. package/dist/objects/Service.js.map +1 -0
  365. package/dist/objects/Site.js +80 -0
  366. package/dist/objects/Site.js.map +1 -0
  367. package/dist/objects/Startup.js +479 -0
  368. package/dist/objects/Startup.js.map +1 -0
  369. package/dist/objects/ThingsDO.js +170 -0
  370. package/dist/objects/ThingsDO.js.map +1 -0
  371. package/dist/objects/VectorShardDO.js +648 -0
  372. package/dist/objects/VectorShardDO.js.map +1 -0
  373. package/dist/objects/Worker.js +144 -0
  374. package/dist/objects/Worker.js.map +1 -0
  375. package/dist/objects/Workflow.js +196 -0
  376. package/dist/objects/Workflow.js.map +1 -0
  377. package/dist/objects/WorkflowFactory.js +313 -0
  378. package/dist/objects/WorkflowFactory.js.map +1 -0
  379. package/dist/objects/WorkflowRuntime.js +863 -0
  380. package/dist/objects/WorkflowRuntime.js.map +1 -0
  381. package/dist/objects/circuit-breaker-bulkhead.js +178 -0
  382. package/dist/objects/circuit-breaker-bulkhead.js.map +1 -0
  383. package/dist/objects/createFunction.js +934 -0
  384. package/dist/objects/createFunction.js.map +1 -0
  385. package/dist/objects/index.js +80 -0
  386. package/dist/objects/index.js.map +1 -0
  387. package/dist/objects/lifecycle/Branch.js +275 -0
  388. package/dist/objects/lifecycle/Branch.js.map +1 -0
  389. package/dist/objects/lifecycle/Clone.js +1499 -0
  390. package/dist/objects/lifecycle/Clone.js.map +1 -0
  391. package/dist/objects/lifecycle/Compact.js +237 -0
  392. package/dist/objects/lifecycle/Compact.js.map +1 -0
  393. package/dist/objects/lifecycle/Promote.js +476 -0
  394. package/dist/objects/lifecycle/Promote.js.map +1 -0
  395. package/dist/objects/lifecycle/Shard.js +560 -0
  396. package/dist/objects/lifecycle/Shard.js.map +1 -0
  397. package/dist/objects/lifecycle/index.js +15 -0
  398. package/dist/objects/lifecycle/index.js.map +1 -0
  399. package/dist/objects/lifecycle/types.js +33 -0
  400. package/dist/objects/lifecycle/types.js.map +1 -0
  401. package/dist/objects/mixins/infrastructure.js +171 -0
  402. package/dist/objects/mixins/infrastructure.js.map +1 -0
  403. package/dist/objects/modules/StoresModule.js +153 -0
  404. package/dist/objects/modules/StoresModule.js.map +1 -0
  405. package/dist/objects/persistence/checkpoint-manager.js +606 -0
  406. package/dist/objects/persistence/checkpoint-manager.js.map +1 -0
  407. package/dist/objects/persistence/index.js +72 -0
  408. package/dist/objects/persistence/index.js.map +1 -0
  409. package/dist/objects/persistence/migration-runner.js +562 -0
  410. package/dist/objects/persistence/migration-runner.js.map +1 -0
  411. package/dist/objects/persistence/replication-manager.js +501 -0
  412. package/dist/objects/persistence/replication-manager.js.map +1 -0
  413. package/dist/objects/persistence/tiered-storage-manager.js +595 -0
  414. package/dist/objects/persistence/tiered-storage-manager.js.map +1 -0
  415. package/dist/objects/persistence/types.js +14 -0
  416. package/dist/objects/persistence/types.js.map +1 -0
  417. package/dist/objects/persistence/wal-manager.js +653 -0
  418. package/dist/objects/persistence/wal-manager.js.map +1 -0
  419. package/dist/objects/presets/index.js +20 -0
  420. package/dist/objects/presets/index.js.map +1 -0
  421. package/dist/objects/presets/primitives.js +188 -0
  422. package/dist/objects/presets/primitives.js.map +1 -0
  423. package/dist/objects/primitives/alarm-adapter.js +141 -0
  424. package/dist/objects/primitives/alarm-adapter.js.map +1 -0
  425. package/dist/objects/primitives/index.js +337 -0
  426. package/dist/objects/primitives/index.js.map +1 -0
  427. package/dist/objects/primitives/storage-adapter.js +182 -0
  428. package/dist/objects/primitives/storage-adapter.js.map +1 -0
  429. package/dist/objects/primitives/with-primitives.js +102 -0
  430. package/dist/objects/primitives/with-primitives.js.map +1 -0
  431. package/dist/objects/services/StoreManager.js +227 -0
  432. package/dist/objects/services/StoreManager.js.map +1 -0
  433. package/dist/objects/services/index.js +13 -0
  434. package/dist/objects/services/index.js.map +1 -0
  435. package/dist/objects/transport/auth-layer.js +1451 -0
  436. package/dist/objects/transport/auth-layer.js.map +1 -0
  437. package/dist/objects/transport/capnweb-target.js +355 -0
  438. package/dist/objects/transport/capnweb-target.js.map +1 -0
  439. package/dist/objects/transport/chain.js +441 -0
  440. package/dist/objects/transport/chain.js.map +1 -0
  441. package/dist/objects/transport/handler.js +58 -0
  442. package/dist/objects/transport/handler.js.map +1 -0
  443. package/dist/objects/transport/index.js +53 -0
  444. package/dist/objects/transport/index.js.map +1 -0
  445. package/dist/objects/transport/mcp-server.js +690 -0
  446. package/dist/objects/transport/mcp-server.js.map +1 -0
  447. package/dist/objects/transport/rest-autowire.js +1507 -0
  448. package/dist/objects/transport/rest-autowire.js.map +1 -0
  449. package/dist/objects/transport/rest-router.js +440 -0
  450. package/dist/objects/transport/rest-router.js.map +1 -0
  451. package/dist/objects/transport/rpc-server.js +1536 -0
  452. package/dist/objects/transport/rpc-server.js.map +1 -0
  453. package/dist/objects/transport/shared.js +575 -0
  454. package/dist/objects/transport/shared.js.map +1 -0
  455. package/dist/objects/transport/sync-engine.js +291 -0
  456. package/dist/objects/transport/sync-engine.js.map +1 -0
  457. package/dist/objects/transport/types.js +8 -0
  458. package/dist/objects/transport/types.js.map +1 -0
  459. package/dist/primitives/bashx/src/ast/analyze.js +1472 -0
  460. package/dist/primitives/bashx/src/ast/analyze.js.map +1 -0
  461. package/dist/primitives/bashx/src/ast/parser.js +1488 -0
  462. package/dist/primitives/bashx/src/ast/parser.js.map +1 -0
  463. package/dist/primitives/bashx/src/do/commands/crypto.js +1954 -0
  464. package/dist/primitives/bashx/src/do/commands/crypto.js.map +1 -0
  465. package/dist/primitives/bashx/src/do/commands/data-processing.js +1812 -0
  466. package/dist/primitives/bashx/src/do/commands/data-processing.js.map +1 -0
  467. package/dist/primitives/bashx/src/do/commands/extended-utils.js +804 -0
  468. package/dist/primitives/bashx/src/do/commands/extended-utils.js.map +1 -0
  469. package/dist/primitives/bashx/src/do/commands/math-control.js +1122 -0
  470. package/dist/primitives/bashx/src/do/commands/math-control.js.map +1 -0
  471. package/dist/primitives/bashx/src/do/commands/posix-utils.js +1015 -0
  472. package/dist/primitives/bashx/src/do/commands/posix-utils.js.map +1 -0
  473. package/dist/primitives/bashx/src/do/commands/system-utils.js +687 -0
  474. package/dist/primitives/bashx/src/do/commands/system-utils.js.map +1 -0
  475. package/dist/primitives/bashx/src/do/commands/test-command.js +523 -0
  476. package/dist/primitives/bashx/src/do/commands/test-command.js.map +1 -0
  477. package/dist/primitives/bashx/src/do/commands/text-processing.js +1550 -0
  478. package/dist/primitives/bashx/src/do/commands/text-processing.js.map +1 -0
  479. package/dist/primitives/bashx/src/do/container-executor.js +429 -0
  480. package/dist/primitives/bashx/src/do/container-executor.js.map +1 -0
  481. package/dist/primitives/bashx/src/do/index.js +668 -0
  482. package/dist/primitives/bashx/src/do/index.js.map +1 -0
  483. package/dist/primitives/bashx/src/do/tiered-executor.js +2647 -0
  484. package/dist/primitives/bashx/src/do/tiered-executor.js.map +1 -0
  485. package/dist/primitives/bashx/src/do/worker.js +352 -0
  486. package/dist/primitives/bashx/src/do/worker.js.map +1 -0
  487. package/dist/primitives/bashx/src/types.js +10 -0
  488. package/dist/primitives/bashx/src/types.js.map +1 -0
  489. package/dist/primitives/fsx/core/backend.js +480 -0
  490. package/dist/primitives/fsx/core/backend.js.map +1 -0
  491. package/dist/primitives/fsx/core/constants.js +140 -0
  492. package/dist/primitives/fsx/core/constants.js.map +1 -0
  493. package/dist/primitives/fsx/core/fsx.js +1184 -0
  494. package/dist/primitives/fsx/core/fsx.js.map +1 -0
  495. package/dist/primitives/fsx/core/glob/glob.js +438 -0
  496. package/dist/primitives/fsx/core/glob/glob.js.map +1 -0
  497. package/dist/primitives/fsx/core/glob/index.js +8 -0
  498. package/dist/primitives/fsx/core/glob/index.js.map +1 -0
  499. package/dist/primitives/fsx/core/glob/match.js +392 -0
  500. package/dist/primitives/fsx/core/glob/match.js.map +1 -0
  501. package/dist/primitives/fsx/core/types.js +307 -0
  502. package/dist/primitives/fsx/core/types.js.map +1 -0
  503. package/dist/sandbox/index.js +258 -0
  504. package/dist/sandbox/index.js.map +1 -0
  505. package/dist/sdk/capnweb-compat.js +42 -0
  506. package/dist/sdk/capnweb-compat.js.map +1 -0
  507. package/dist/sdk/client.js +20 -0
  508. package/dist/sdk/client.js.map +1 -0
  509. package/dist/sdk/index.js +17 -0
  510. package/dist/sdk/index.js.map +1 -0
  511. package/dist/snippets/artifacts-config.js +241 -0
  512. package/dist/snippets/artifacts-config.js.map +1 -0
  513. package/dist/snippets/artifacts-ingest.js +832 -0
  514. package/dist/snippets/artifacts-ingest.js.map +1 -0
  515. package/dist/snippets/artifacts-serve.js +1035 -0
  516. package/dist/snippets/artifacts-serve.js.map +1 -0
  517. package/dist/snippets/artifacts-types.js +161 -0
  518. package/dist/snippets/artifacts-types.js.map +1 -0
  519. package/dist/snippets/cache-probe.js +376 -0
  520. package/dist/snippets/cache-probe.js.map +1 -0
  521. package/dist/snippets/cache.js +10 -0
  522. package/dist/snippets/cache.js.map +1 -0
  523. package/dist/snippets/events.js +469 -0
  524. package/dist/snippets/events.js.map +1 -0
  525. package/dist/snippets/index.js +7 -0
  526. package/dist/snippets/index.js.map +1 -0
  527. package/dist/snippets/proxy.js +495 -0
  528. package/dist/snippets/proxy.js.map +1 -0
  529. package/dist/snippets/search.js +1759 -0
  530. package/dist/snippets/search.js.map +1 -0
  531. package/dist/streams/index.js +30 -0
  532. package/dist/streams/index.js.map +1 -0
  533. package/dist/streams/observability.js +68 -0
  534. package/dist/streams/observability.js.map +1 -0
  535. package/dist/types/AI.js +92 -0
  536. package/dist/types/AI.js.map +1 -0
  537. package/dist/types/AIFunction.js +171 -0
  538. package/dist/types/AIFunction.js.map +1 -0
  539. package/dist/types/BrowseVerb.js +89 -0
  540. package/dist/types/BrowseVerb.js.map +1 -0
  541. package/dist/types/Browser.js +31 -0
  542. package/dist/types/Browser.js.map +1 -0
  543. package/dist/types/Chaos.js +15 -0
  544. package/dist/types/Chaos.js.map +1 -0
  545. package/dist/types/CloudflareBindings.js +109 -0
  546. package/dist/types/CloudflareBindings.js.map +1 -0
  547. package/dist/types/Collection.js +50 -0
  548. package/dist/types/Collection.js.map +1 -0
  549. package/dist/types/DO.js +2 -0
  550. package/dist/types/DO.js.map +1 -0
  551. package/dist/types/DOLocation.js +63 -0
  552. package/dist/types/DOLocation.js.map +1 -0
  553. package/dist/types/EventHandler.js +57 -0
  554. package/dist/types/EventHandler.js.map +1 -0
  555. package/dist/types/Experiment.js +33 -0
  556. package/dist/types/Experiment.js.map +1 -0
  557. package/dist/types/Flag.js +57 -0
  558. package/dist/types/Flag.js.map +1 -0
  559. package/dist/types/Lifecycle.js +13 -0
  560. package/dist/types/Lifecycle.js.map +1 -0
  561. package/dist/types/Location.js +169 -0
  562. package/dist/types/Location.js.map +1 -0
  563. package/dist/types/Noun.js +66 -0
  564. package/dist/types/Noun.js.map +1 -0
  565. package/dist/types/SessionEvent.js +194 -0
  566. package/dist/types/SessionEvent.js.map +1 -0
  567. package/dist/types/Thing.js +55 -0
  568. package/dist/types/Thing.js.map +1 -0
  569. package/dist/types/ThingDO.js +153 -0
  570. package/dist/types/ThingDO.js.map +1 -0
  571. package/dist/types/Things.js +2 -0
  572. package/dist/types/Things.js.map +1 -0
  573. package/dist/types/Verb.js +119 -0
  574. package/dist/types/Verb.js.map +1 -0
  575. package/dist/types/WorkflowContext.js +70 -0
  576. package/dist/types/WorkflowContext.js.map +1 -0
  577. package/dist/types/analytics-api.js +13 -0
  578. package/dist/types/analytics-api.js.map +1 -0
  579. package/dist/types/capabilities.js +135 -0
  580. package/dist/types/capabilities.js.map +1 -0
  581. package/dist/types/drizzle.js +12 -0
  582. package/dist/types/drizzle.js.map +1 -0
  583. package/dist/types/event.js +201 -0
  584. package/dist/types/event.js.map +1 -0
  585. package/dist/types/fn.js +12 -0
  586. package/dist/types/fn.js.map +1 -0
  587. package/dist/types/iceberg.js +48 -0
  588. package/dist/types/iceberg.js.map +1 -0
  589. package/dist/types/ids.js +170 -0
  590. package/dist/types/ids.js.map +1 -0
  591. package/dist/types/index.js +41 -0
  592. package/dist/types/index.js.map +1 -0
  593. package/dist/types/introspect.js +54 -0
  594. package/dist/types/introspect.js.map +1 -0
  595. package/dist/types/observability.js +124 -0
  596. package/dist/types/observability.js.map +1 -0
  597. package/dist/types/sync-protocol.js +175 -0
  598. package/dist/types/sync-protocol.js.map +1 -0
  599. package/dist/types/vector.js +13 -0
  600. package/dist/types/vector.js.map +1 -0
  601. package/dist/workflows/ScheduleManager.js +473 -0
  602. package/dist/workflows/ScheduleManager.js.map +1 -0
  603. package/dist/workflows/StepDOBridge.js +149 -0
  604. package/dist/workflows/StepDOBridge.js.map +1 -0
  605. package/dist/workflows/StepResultStorage.js +232 -0
  606. package/dist/workflows/StepResultStorage.js.map +1 -0
  607. package/dist/workflows/WaitForEventManager.js +461 -0
  608. package/dist/workflows/WaitForEventManager.js.map +1 -0
  609. package/dist/workflows/analyzer.js +332 -0
  610. package/dist/workflows/analyzer.js.map +1 -0
  611. package/dist/workflows/compat/activity-router.js +484 -0
  612. package/dist/workflows/compat/activity-router.js.map +1 -0
  613. package/dist/workflows/compat/backends/cloudflare-workflows.js +431 -0
  614. package/dist/workflows/compat/backends/cloudflare-workflows.js.map +1 -0
  615. package/dist/workflows/compat/backends/index.js +14 -0
  616. package/dist/workflows/compat/backends/index.js.map +1 -0
  617. package/dist/workflows/compat/errors/index.js +375 -0
  618. package/dist/workflows/compat/errors/index.js.map +1 -0
  619. package/dist/workflows/compat/index.js +79 -0
  620. package/dist/workflows/compat/index.js.map +1 -0
  621. package/dist/workflows/compat/inngest/index.js +989 -0
  622. package/dist/workflows/compat/inngest/index.js.map +1 -0
  623. package/dist/workflows/compat/qstash/index.js +1263 -0
  624. package/dist/workflows/compat/qstash/index.js.map +1 -0
  625. package/dist/workflows/compat/temporal/activities.js +739 -0
  626. package/dist/workflows/compat/temporal/activities.js.map +1 -0
  627. package/dist/workflows/compat/temporal/child-workflows.js +154 -0
  628. package/dist/workflows/compat/temporal/child-workflows.js.map +1 -0
  629. package/dist/workflows/compat/temporal/client.js +381 -0
  630. package/dist/workflows/compat/temporal/client.js.map +1 -0
  631. package/dist/workflows/compat/temporal/context.js +309 -0
  632. package/dist/workflows/compat/temporal/context.js.map +1 -0
  633. package/dist/workflows/compat/temporal/determinism.js +216 -0
  634. package/dist/workflows/compat/temporal/determinism.js.map +1 -0
  635. package/dist/workflows/compat/temporal/errors.js +128 -0
  636. package/dist/workflows/compat/temporal/errors.js.map +1 -0
  637. package/dist/workflows/compat/temporal/index.js +2464 -0
  638. package/dist/workflows/compat/temporal/index.js.map +1 -0
  639. package/dist/workflows/compat/temporal/saga.js +504 -0
  640. package/dist/workflows/compat/temporal/saga.js.map +1 -0
  641. package/dist/workflows/compat/temporal/signals.js +364 -0
  642. package/dist/workflows/compat/temporal/signals.js.map +1 -0
  643. package/dist/workflows/compat/temporal/storage.js +271 -0
  644. package/dist/workflows/compat/temporal/storage.js.map +1 -0
  645. package/dist/workflows/compat/temporal/timers.js +347 -0
  646. package/dist/workflows/compat/temporal/timers.js.map +1 -0
  647. package/dist/workflows/compat/temporal/types.js +7 -0
  648. package/dist/workflows/compat/temporal/types.js.map +1 -0
  649. package/dist/workflows/compat/temporal/unified-primitives.js +339 -0
  650. package/dist/workflows/compat/temporal/unified-primitives.js.map +1 -0
  651. package/dist/workflows/compat/trigger/index.js +468 -0
  652. package/dist/workflows/compat/trigger/index.js.map +1 -0
  653. package/dist/workflows/compat/utils/index.js +69 -0
  654. package/dist/workflows/compat/utils/index.js.map +1 -0
  655. package/dist/workflows/context/correlation-capability.js +266 -0
  656. package/dist/workflows/context/correlation-capability.js.map +1 -0
  657. package/dist/workflows/context/correlation.js +484 -0
  658. package/dist/workflows/context/correlation.js.map +1 -0
  659. package/dist/workflows/context/experiment.js +289 -0
  660. package/dist/workflows/context/experiment.js.map +1 -0
  661. package/dist/workflows/context/flag.js +244 -0
  662. package/dist/workflows/context/flag.js.map +1 -0
  663. package/dist/workflows/context/foundation.js +648 -0
  664. package/dist/workflows/context/foundation.js.map +1 -0
  665. package/dist/workflows/context/human-base.js +106 -0
  666. package/dist/workflows/context/human-base.js.map +1 -0
  667. package/dist/workflows/context/human.js +368 -0
  668. package/dist/workflows/context/human.js.map +1 -0
  669. package/dist/workflows/context/measure.js +354 -0
  670. package/dist/workflows/context/measure.js.map +1 -0
  671. package/dist/workflows/context/rate-limit.js +358 -0
  672. package/dist/workflows/context/rate-limit.js.map +1 -0
  673. package/dist/workflows/context/user.js +117 -0
  674. package/dist/workflows/context/user.js.map +1 -0
  675. package/dist/workflows/context/vault.js +360 -0
  676. package/dist/workflows/context/vault.js.map +1 -0
  677. package/dist/workflows/data/entity-events/entity-events.js +489 -0
  678. package/dist/workflows/data/entity-events/entity-events.js.map +1 -0
  679. package/dist/workflows/data/experiment/index.js +599 -0
  680. package/dist/workflows/data/experiment/index.js.map +1 -0
  681. package/dist/workflows/data/goal/context.js +558 -0
  682. package/dist/workflows/data/goal/context.js.map +1 -0
  683. package/dist/workflows/data/goal/index.js +32 -0
  684. package/dist/workflows/data/goal/index.js.map +1 -0
  685. package/dist/workflows/data/measure/index.js +840 -0
  686. package/dist/workflows/data/measure/index.js.map +1 -0
  687. package/dist/workflows/data/stream/index.js +1215 -0
  688. package/dist/workflows/data/stream/index.js.map +1 -0
  689. package/dist/workflows/data/track/context.js +883 -0
  690. package/dist/workflows/data/track/context.js.map +1 -0
  691. package/dist/workflows/data/track/index.js +15 -0
  692. package/dist/workflows/data/track/index.js.map +1 -0
  693. package/dist/workflows/data/view/context.js +864 -0
  694. package/dist/workflows/data/view/context.js.map +1 -0
  695. package/dist/workflows/domain.js +93 -0
  696. package/dist/workflows/domain.js.map +1 -0
  697. package/dist/workflows/flag.js +176 -0
  698. package/dist/workflows/flag.js.map +1 -0
  699. package/dist/workflows/flags.js +217 -0
  700. package/dist/workflows/flags.js.map +1 -0
  701. package/dist/workflows/hash.js +209 -0
  702. package/dist/workflows/hash.js.map +1 -0
  703. package/dist/workflows/index.js +50 -0
  704. package/dist/workflows/index.js.map +1 -0
  705. package/dist/workflows/on.js +378 -0
  706. package/dist/workflows/on.js.map +1 -0
  707. package/dist/workflows/pipeline-promise.js +481 -0
  708. package/dist/workflows/pipeline-promise.js.map +1 -0
  709. package/dist/workflows/pipeline-types.js +20 -0
  710. package/dist/workflows/pipeline-types.js.map +1 -0
  711. package/dist/workflows/proxy.js +76 -0
  712. package/dist/workflows/proxy.js.map +1 -0
  713. package/dist/workflows/runtime.js +310 -0
  714. package/dist/workflows/runtime.js.map +1 -0
  715. package/dist/workflows/schedule-builder.js +327 -0
  716. package/dist/workflows/schedule-builder.js.map +1 -0
  717. package/dist/workflows/visibility/index.js +148 -0
  718. package/dist/workflows/visibility/index.js.map +1 -0
  719. package/dist/workflows/visibility/query-parser.js +150 -0
  720. package/dist/workflows/visibility/query-parser.js.map +1 -0
  721. package/dist/workflows/visibility/store.js +223 -0
  722. package/dist/workflows/visibility/store.js.map +1 -0
  723. package/dist/workflows/visibility/types.js +30 -0
  724. package/dist/workflows/visibility/types.js.map +1 -0
  725. package/dist/workflows/workflow.js +53 -0
  726. package/dist/workflows/workflow.js.map +1 -0
  727. package/package.json +279 -46
@@ -0,0 +1,332 @@
1
+ /**
2
+ * JSON Path Indexing Module
3
+ *
4
+ * Provides utilities for creating, managing, and syncing JSON path indexes
5
+ * on Things and Relationships tables.
6
+ *
7
+ * SQLite supports expression indexes which can index json_extract() results:
8
+ * CREATE INDEX idx ON things(json_extract(data, '$.field'))
9
+ *
10
+ * This module provides:
11
+ * - createJsonIndex: Create a single JSON path index
12
+ * - dropJsonIndex: Remove a JSON path index
13
+ * - listJsonIndexes: List all JSON path indexes on a table
14
+ * - syncNounIndexes: Sync indexes based on Noun schema
15
+ * - getIndexName: Generate consistent index names
16
+ * - validateIndexPath: Validate JSON path for safety
17
+ *
18
+ * @see dotdo-p2r1z for issue details
19
+ */
20
+ import { sql } from 'drizzle-orm';
21
+ // ============================================================================
22
+ // CONSTANTS
23
+ // ============================================================================
24
+ /**
25
+ * Valid tables for JSON indexing
26
+ */
27
+ const VALID_TABLES = ['things', 'relationships'];
28
+ /**
29
+ * Regex for valid JSON paths:
30
+ * - Must start with letter or underscore
31
+ * - Can contain alphanumeric, underscore
32
+ * - Dots allowed for nesting (but not leading, trailing, or consecutive)
33
+ */
34
+ const VALID_JSON_PATH_REGEX = /^[a-zA-Z_][a-zA-Z0-9_]*(?:\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;
35
+ /**
36
+ * Prefix for all JSON path indexes to distinguish from regular indexes
37
+ */
38
+ const INDEX_PREFIX = 'idx_';
39
+ // ============================================================================
40
+ // UTILITIES
41
+ // ============================================================================
42
+ /**
43
+ * Generate consistent index name for a JSON path.
44
+ *
45
+ * Format: idx_{table}_data_{path} or idx_{table}_type{id}_data_{path}
46
+ *
47
+ * @param table - Table name ('things' or 'relationships')
48
+ * @param path - JSON path (e.g., 'status', 'config.enabled')
49
+ * @param typeId - Optional type ID for partial index
50
+ * @returns Generated index name
51
+ */
52
+ export function getIndexName(table, path, typeId) {
53
+ // Convert path dots to underscores for valid SQL identifier
54
+ const safePath = path.replace(/\./g, '_');
55
+ if (typeId !== undefined) {
56
+ return `${INDEX_PREFIX}${table}_type${typeId}_data_${safePath}`;
57
+ }
58
+ return `${INDEX_PREFIX}${table}_data_${safePath}`;
59
+ }
60
+ /**
61
+ * Parse index name back to components.
62
+ * @internal
63
+ */
64
+ function parseIndexName(name) {
65
+ // Pattern: idx_{table}_data_{path} or idx_{table}_type{id}_data_{path}
66
+ // or idx_{table}_verb_{verb}_data_{path}
67
+ const typeMatch = name.match(/^idx_(\w+)_type(\d+)_data_(.+)$/);
68
+ if (typeMatch) {
69
+ return {
70
+ table: typeMatch[1],
71
+ typeId: parseInt(typeMatch[2], 10),
72
+ path: typeMatch[3].replace(/_/g, '.'),
73
+ };
74
+ }
75
+ const verbMatch = name.match(/^idx_(\w+)_verb_(\w+)_data_(.+)$/);
76
+ if (verbMatch) {
77
+ return {
78
+ table: verbMatch[1],
79
+ verbFilter: verbMatch[2],
80
+ path: verbMatch[3].replace(/_/g, '.'),
81
+ };
82
+ }
83
+ const simpleMatch = name.match(/^idx_(\w+)_data_(.+)$/);
84
+ if (simpleMatch) {
85
+ return {
86
+ table: simpleMatch[1],
87
+ path: simpleMatch[2].replace(/_/g, '.'),
88
+ };
89
+ }
90
+ return null;
91
+ }
92
+ /**
93
+ * Validate JSON path for safety (prevent SQL injection).
94
+ *
95
+ * @param path - JSON path to validate
96
+ * @throws Error if path is invalid
97
+ */
98
+ export function validateIndexPath(path) {
99
+ if (!path || typeof path !== 'string') {
100
+ throw new Error('Invalid JSON path: path is required');
101
+ }
102
+ if (!VALID_JSON_PATH_REGEX.test(path)) {
103
+ throw new Error(`Invalid JSON path: '${path}'. Path must contain only alphanumeric characters, underscores, and dots for nesting.`);
104
+ }
105
+ }
106
+ /**
107
+ * Validate table name.
108
+ * @internal
109
+ */
110
+ function validateTable(table) {
111
+ if (!VALID_TABLES.includes(table)) {
112
+ throw new Error(`Invalid table: '${table}'. Must be 'things' or 'relationships'.`);
113
+ }
114
+ }
115
+ /**
116
+ * Build SQLite JSON path string.
117
+ * @internal
118
+ */
119
+ function buildJsonPath(path) {
120
+ return `$.${path}`;
121
+ }
122
+ // ============================================================================
123
+ // INDEX OPERATIONS
124
+ // ============================================================================
125
+ /**
126
+ * Create a JSON path index on a table.
127
+ *
128
+ * Creates an expression index using json_extract():
129
+ * CREATE INDEX IF NOT EXISTS idx_things_data_status
130
+ * ON things(type, json_extract(data, '$.status'))
131
+ * WHERE type = 1;
132
+ *
133
+ * @param db - Drizzle database instance
134
+ * @param options - Index options
135
+ */
136
+ export async function createJsonIndex(db, options) {
137
+ // Validate inputs
138
+ validateTable(options.table);
139
+ validateIndexPath(options.path);
140
+ const indexName = options.typeId !== undefined
141
+ ? getIndexName(options.table, options.path, options.typeId)
142
+ : options.verbFilter
143
+ ? `${INDEX_PREFIX}${options.table}_verb_${options.verbFilter}_data_${options.path.replace(/\./g, '_')}`
144
+ : getIndexName(options.table, options.path);
145
+ const jsonPath = buildJsonPath(options.path);
146
+ // Build CREATE INDEX statement
147
+ let indexSql;
148
+ if (options.table === 'things') {
149
+ if (options.typeId !== undefined) {
150
+ // Partial index filtered by type - include type in index for composite filtering
151
+ indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON things(type, json_extract(data, '${jsonPath}')) WHERE type = ${options.typeId}`;
152
+ }
153
+ else {
154
+ // Full index on all rows
155
+ indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON things(json_extract(data, '${jsonPath}'))`;
156
+ }
157
+ }
158
+ else {
159
+ // relationships table
160
+ if (options.verbFilter) {
161
+ // Partial index filtered by verb
162
+ indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON relationships(verb, json_extract(data, '${jsonPath}')) WHERE verb = '${options.verbFilter}'`;
163
+ }
164
+ else {
165
+ // Full index on all rows
166
+ indexSql = `CREATE INDEX IF NOT EXISTS ${indexName} ON relationships(json_extract(data, '${jsonPath}'))`;
167
+ }
168
+ }
169
+ // Execute the SQL
170
+ // Handle both Drizzle and raw sqlite3 database objects
171
+ // First try to get the underlying connection via $client (Drizzle pattern)
172
+ const connection = db.$client || db;
173
+ if (typeof connection.exec === 'function') {
174
+ // better-sqlite3 Database object
175
+ connection.exec(indexSql);
176
+ }
177
+ else if (typeof connection.run === 'function') {
178
+ // Some other sqlite driver
179
+ connection.run(indexSql);
180
+ }
181
+ else if (typeof db.run === 'function') {
182
+ // Drizzle's run method
183
+ await db.run(sql.raw(indexSql));
184
+ }
185
+ else {
186
+ throw new Error('Unsupported database type for createJsonIndex');
187
+ }
188
+ }
189
+ /**
190
+ * Drop a JSON path index from a table.
191
+ *
192
+ * @param db - Drizzle database instance
193
+ * @param options - Index options (path and typeId used to determine index name)
194
+ */
195
+ export async function dropJsonIndex(db, options) {
196
+ validateTable(options.table);
197
+ validateIndexPath(options.path);
198
+ const indexName = getIndexName(options.table, options.path, options.typeId);
199
+ const dropSql = `DROP INDEX IF EXISTS ${indexName}`;
200
+ // Execute the SQL
201
+ const connection = db.$client || db;
202
+ if (typeof connection.exec === 'function') {
203
+ connection.exec(dropSql);
204
+ }
205
+ else if (typeof connection.run === 'function') {
206
+ connection.run(dropSql);
207
+ }
208
+ else {
209
+ await db.run(sql.raw(dropSql));
210
+ }
211
+ }
212
+ /**
213
+ * List all JSON path indexes on a table.
214
+ *
215
+ * Queries sqlite_master for indexes matching our naming convention.
216
+ *
217
+ * @param db - Drizzle database instance
218
+ * @param table - Table name
219
+ * @returns Array of JSON index info
220
+ */
221
+ export async function listJsonIndexes(db, table) {
222
+ validateTable(table);
223
+ // Query sqlite_master for indexes on the table
224
+ // Pattern matches: idx_{table}_data_*, idx_{table}_type*_data_*, idx_{table}_verb_*_data_*
225
+ const querySql = `SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = '${table}' AND name LIKE 'idx_${table}%data_%'`;
226
+ let rows;
227
+ // Execute the query
228
+ const connection = db.$client || db;
229
+ if (typeof connection.prepare === 'function') {
230
+ // better-sqlite3
231
+ const stmt = connection.prepare(querySql);
232
+ rows = stmt.all();
233
+ }
234
+ else if (typeof connection.all === 'function') {
235
+ // D1 or other async sqlite
236
+ rows = await connection.all(querySql);
237
+ }
238
+ else {
239
+ // Drizzle
240
+ const result = await db.all(sql.raw(querySql));
241
+ rows = result;
242
+ }
243
+ // Parse index names back to JsonIndexInfo
244
+ const indexes = [];
245
+ for (const row of rows) {
246
+ const parsed = parseIndexName(row.name);
247
+ if (parsed && parsed.table === table) {
248
+ indexes.push({
249
+ name: row.name,
250
+ path: parsed.path,
251
+ table: table,
252
+ typeId: parsed.typeId,
253
+ verbFilter: parsed.verbFilter,
254
+ });
255
+ }
256
+ }
257
+ return indexes;
258
+ }
259
+ // ============================================================================
260
+ // NOUN SYNC
261
+ // ============================================================================
262
+ /**
263
+ * Parse schema definition to check if field should be indexed.
264
+ * @internal
265
+ */
266
+ function shouldIndex(definition) {
267
+ if (typeof definition === 'string') {
268
+ // Support shorthand: '#string' (hash prefix = indexed)
269
+ return definition.startsWith('#');
270
+ }
271
+ return definition.index === true;
272
+ }
273
+ /**
274
+ * Extract field path from schema key.
275
+ * For nested paths like 'config.enabled', returns as-is.
276
+ * @internal
277
+ */
278
+ function getFieldPath(key) {
279
+ return key;
280
+ }
281
+ /**
282
+ * Sync JSON path indexes based on Noun schema.
283
+ *
284
+ * Creates indexes for fields marked with index: true.
285
+ * Drops indexes for fields no longer marked as indexed.
286
+ *
287
+ * @param db - Drizzle database instance
288
+ * @param options - Sync options
289
+ */
290
+ export async function syncNounIndexes(db, options) {
291
+ const { typeId, schema } = options;
292
+ // Get current indexes for this type
293
+ const existingIndexes = await listJsonIndexes(db, 'things');
294
+ const typeIndexes = existingIndexes.filter((idx) => idx.typeId === typeId);
295
+ const existingPaths = new Set(typeIndexes.map((idx) => idx.path));
296
+ // Determine which paths should be indexed
297
+ const desiredPaths = new Set();
298
+ for (const [key, definition] of Object.entries(schema)) {
299
+ if (shouldIndex(definition)) {
300
+ const path = getFieldPath(key);
301
+ try {
302
+ validateIndexPath(path);
303
+ desiredPaths.add(path);
304
+ }
305
+ catch {
306
+ // Invalid path - skip
307
+ console.warn(`Skipping invalid index path: ${path}`);
308
+ }
309
+ }
310
+ }
311
+ // Create missing indexes
312
+ for (const path of desiredPaths) {
313
+ if (!existingPaths.has(path)) {
314
+ await createJsonIndex(db, {
315
+ table: 'things',
316
+ path,
317
+ typeId,
318
+ });
319
+ }
320
+ }
321
+ // Drop obsolete indexes
322
+ for (const path of existingPaths) {
323
+ if (!desiredPaths.has(path)) {
324
+ await dropJsonIndex(db, {
325
+ table: 'things',
326
+ path,
327
+ typeId,
328
+ });
329
+ }
330
+ }
331
+ }
332
+ //# sourceMappingURL=json-indexes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-indexes.js","sourceRoot":"","sources":["../../db/json-indexes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAuCjC,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;GAEG;AACH,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAU,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,uDAAuD,CAAA;AAErF;;GAEG;AACH,MAAM,YAAY,GAAG,MAAM,CAAA;AAE3B,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAiC,EACjC,IAAY,EACZ,MAAe;IAEf,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,GAAG,YAAY,GAAG,KAAK,QAAQ,MAAM,SAAS,QAAQ,EAAE,CAAA;IACjE,CAAC;IAED,OAAO,GAAG,YAAY,GAAG,KAAK,SAAS,QAAQ,EAAE,CAAA;AACnD,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,uEAAuE;IACvE,yCAAyC;IAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;IAC/D,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SACtC,CAAA;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAChE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;YACL,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;YACnB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;YACxB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SACtC,CAAA;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;IACvD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YACrB,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;SACxC,CAAA;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IACxD,CAAC;IAED,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,uBAAuB,IAAI,uFAAuF,CACnH,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAY,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,yCAAyC,CAAC,CAAA;IACpF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,KAAK,IAAI,EAAE,CAAA;AACpB,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAO,EACP,OAAyB;IAEzB,kBAAkB;IAClB,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5B,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS;QAC5C,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;QAC3D,CAAC,CAAC,OAAO,CAAC,UAAU;YAClB,CAAC,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC,KAAK,SAAS,OAAO,CAAC,UAAU,SAAS,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;YACvG,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAE5C,+BAA+B;IAC/B,IAAI,QAAgB,CAAA;IAEpB,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,iFAAiF;YACjF,QAAQ,GAAG,8BAA8B,SAAS,wCAAwC,QAAQ,oBAAoB,OAAO,CAAC,MAAM,EAAE,CAAA;QACxI,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,QAAQ,GAAG,8BAA8B,SAAS,kCAAkC,QAAQ,KAAK,CAAA;QACnG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,sBAAsB;QACtB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,iCAAiC;YACjC,QAAQ,GAAG,8BAA8B,SAAS,+CAA+C,QAAQ,qBAAqB,OAAO,CAAC,UAAU,GAAG,CAAA;QACrJ,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,QAAQ,GAAG,8BAA8B,SAAS,yCAAyC,QAAQ,KAAK,CAAA;QAC1G,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,uDAAuD;IACvD,2EAA2E;IAC3E,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAA;IAEnC,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC1C,iCAAiC;QACjC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3B,CAAC;SAAM,IAAI,OAAO,UAAU,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAChD,2BAA2B;QAC3B,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QACxC,uBAAuB;QACvB,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAClE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAO,EACP,OAA6C;IAE7C,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC5B,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/B,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3E,MAAM,OAAO,GAAG,wBAAwB,SAAS,EAAE,CAAA;IAEnD,kBAAkB;IAClB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAA;IACnC,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC1C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,OAAO,UAAU,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAChD,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACzB,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAA;IAChC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAO,EACP,KAAiC;IAEjC,aAAa,CAAC,KAAK,CAAC,CAAA;IAEpB,+CAA+C;IAC/C,2FAA2F;IAC3F,MAAM,QAAQ,GAAG,uEAAuE,KAAK,wBAAwB,KAAK,UAAU,CAAA;IAEpI,IAAI,IAA6B,CAAA;IAEjC,oBAAoB;IACpB,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,IAAI,EAAE,CAAA;IACnC,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAC7C,iBAAiB;QACjB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACzC,IAAI,GAAG,IAAI,CAAC,GAAG,EAA6B,CAAA;IAC9C,CAAC;SAAM,IAAI,OAAO,UAAU,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;QAChD,2BAA2B;QAC3B,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC;SAAM,CAAC;QACN,UAAU;QACV,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC9C,IAAI,GAAG,MAAiC,CAAA;IAC1C,CAAC;IAED,0CAA0C;IAC1C,MAAM,OAAO,GAAoB,EAAE,CAAA;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;;GAGG;AACH,SAAS,WAAW,CAAC,UAA8E;IACjG,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,uDAAuD;QACvD,OAAO,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,KAAK,IAAI,CAAA;AAClC,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAO,EACP,OAA+B;IAE/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAElC,oCAAoC;IACpC,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;IAC1E,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;IAEjE,0CAA0C;IAC1C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IACtC,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC;gBACH,iBAAiB,CAAC,IAAI,CAAC,CAAA;gBACvB,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACxB,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;gBACtB,OAAO,CAAC,IAAI,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,eAAe,CAAC,EAAE,EAAE;gBACxB,KAAK,EAAE,QAAQ;gBACf,IAAI;gBACJ,MAAM;aACP,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,aAAa,CAAC,EAAE,EAAE;gBACtB,KAAK,EAAE,QAAQ;gBACf,IAAI;gBACJ,MAAM;aACP,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,287 @@
1
+ import { z } from 'zod';
2
+ import { eq, and } from 'drizzle-orm';
3
+ import { linkedAccounts } from './auth';
4
+ // ============================================================================
5
+ // LINKED ACCOUNTS - Query helpers and type validation
6
+ // ============================================================================
7
+ //
8
+ // This module provides:
9
+ // 1. Zod schemas for runtime validation of metadata and provider data
10
+ // 2. Query helper functions for common operations
11
+ // 3. Type-safe builders for linked account queries
12
+ //
13
+ // Usage:
14
+ // import { getLinkedAccount, LinkedAccountMetadataSchema } from './linked-accounts'
15
+ //
16
+ // // Query helper
17
+ // const account = await getLinkedAccount(db, userId, 'github')
18
+ //
19
+ // // Validate metadata
20
+ // const result = LinkedAccountMetadataSchema.safeParse(metadata)
21
+ // ============================================================================
22
+ // ============================================================================
23
+ // ZOD SCHEMAS FOR VALIDATION
24
+ // ============================================================================
25
+ /**
26
+ * Valid linked account status values
27
+ */
28
+ export const LinkedAccountStatusSchema = z.enum(['active', 'pending', 'expired', 'revoked']);
29
+ /**
30
+ * Base metadata schema - common fields across all provider types.
31
+ * This is intentionally flexible to support various integration types.
32
+ */
33
+ export const LinkedAccountMetadataBaseSchema = z.object({
34
+ /** OAuth scopes granted to this connection */
35
+ scopes: z.array(z.string()).optional(),
36
+ /** Type of token (bearer, api_key, etc.) */
37
+ tokenType: z.string().optional(),
38
+ /** When the integration was first installed/connected */
39
+ installedAt: z.string().datetime().optional(),
40
+ /** Webhook ID if applicable */
41
+ webhookId: z.string().optional(),
42
+ /** Display name from the provider */
43
+ displayName: z.string().optional(),
44
+ /** Email from the provider */
45
+ email: z.string().email().optional(),
46
+ /** Avatar URL from the provider */
47
+ avatarUrl: z.string().url().optional(),
48
+ /** Profile URL on the provider platform */
49
+ profileUrl: z.string().url().optional(),
50
+ });
51
+ /**
52
+ * GitHub-specific metadata schema
53
+ */
54
+ export const GitHubMetadataSchema = LinkedAccountMetadataBaseSchema.extend({
55
+ /** GitHub username */
56
+ login: z.string().optional(),
57
+ /** GitHub user ID */
58
+ githubId: z.number().optional(),
59
+ /** List of organizations the user belongs to */
60
+ organizations: z.array(z.string()).optional(),
61
+ /** GitHub App installation ID (for GitHub Apps) */
62
+ installationId: z.number().optional(),
63
+ });
64
+ /**
65
+ * Slack-specific metadata schema
66
+ */
67
+ export const SlackMetadataSchema = LinkedAccountMetadataBaseSchema.extend({
68
+ /** Slack workspace ID */
69
+ teamId: z.string().optional(),
70
+ /** Slack workspace name */
71
+ teamName: z.string().optional(),
72
+ /** Slack user ID */
73
+ slackUserId: z.string().optional(),
74
+ /** Bot user ID (for bot tokens) */
75
+ botUserId: z.string().optional(),
76
+ /** Incoming webhook URL */
77
+ incomingWebhookUrl: z.string().url().optional(),
78
+ });
79
+ /**
80
+ * Generic metadata schema - allows additional properties beyond base fields.
81
+ * Use this when you don't know the specific provider type.
82
+ */
83
+ export const LinkedAccountMetadataSchema = LinkedAccountMetadataBaseSchema.passthrough();
84
+ /**
85
+ * Provider-specific metadata schemas map
86
+ */
87
+ export const ProviderMetadataSchemas = {
88
+ github: GitHubMetadataSchema,
89
+ slack: SlackMetadataSchema,
90
+ // Add more provider-specific schemas as needed
91
+ };
92
+ /**
93
+ * Get the appropriate metadata schema for a provider type
94
+ */
95
+ export function getMetadataSchemaForProvider(provider) {
96
+ const providerKey = provider.toLowerCase().replace(/-oauth|-api|-app$/, '');
97
+ if (providerKey in ProviderMetadataSchemas) {
98
+ return ProviderMetadataSchemas[providerKey];
99
+ }
100
+ return LinkedAccountMetadataSchema;
101
+ }
102
+ /**
103
+ * Schema for creating a new linked account (input validation)
104
+ */
105
+ export const NewLinkedAccountSchema = z.object({
106
+ id: z.string().min(1),
107
+ identityId: z.string().min(1),
108
+ type: z.string().min(1),
109
+ provider: z.string().min(1),
110
+ providerAccountId: z.string().min(1),
111
+ vaultRef: z.string().optional().nullable(),
112
+ status: LinkedAccountStatusSchema.default('active'),
113
+ expiresAt: z.date().optional().nullable(),
114
+ metadata: LinkedAccountMetadataSchema.optional().nullable(),
115
+ createdAt: z.date(),
116
+ updatedAt: z.date(),
117
+ });
118
+ // ============================================================================
119
+ // VALIDATION HELPERS
120
+ // ============================================================================
121
+ /**
122
+ * Validate metadata for a linked account.
123
+ * Returns the validated metadata or throws a ZodError.
124
+ *
125
+ * @param metadata - The metadata object to validate
126
+ * @param provider - Optional provider name for provider-specific validation
127
+ * @returns Validated metadata object
128
+ */
129
+ export function validateMetadata(metadata, provider) {
130
+ const schema = provider ? getMetadataSchemaForProvider(provider) : LinkedAccountMetadataSchema;
131
+ return schema.parse(metadata);
132
+ }
133
+ /**
134
+ * Safely validate metadata without throwing.
135
+ *
136
+ * @param metadata - The metadata object to validate
137
+ * @param provider - Optional provider name for provider-specific validation
138
+ * @returns Zod safe parse result
139
+ */
140
+ export function safeValidateMetadata(metadata, provider) {
141
+ const schema = provider ? getMetadataSchemaForProvider(provider) : LinkedAccountMetadataSchema;
142
+ return schema.safeParse(metadata);
143
+ }
144
+ /**
145
+ * Validate a new linked account object.
146
+ *
147
+ * @param account - The account object to validate
148
+ * @returns Validated account object
149
+ */
150
+ export function validateNewLinkedAccount(account) {
151
+ return NewLinkedAccountSchema.parse(account);
152
+ }
153
+ // ============================================================================
154
+ // QUERY HELPERS
155
+ // ============================================================================
156
+ /**
157
+ * Get a single linked account by identity ID and provider.
158
+ * Uses the composite index on (identityId, provider) for efficient lookup.
159
+ *
160
+ * @param db - Drizzle database instance
161
+ * @param identityId - The identity ID to look up
162
+ * @param provider - The provider name (e.g., 'github', 'slack')
163
+ * @returns The linked account or undefined if not found
164
+ *
165
+ * @example
166
+ * ```ts
167
+ * const githubAccount = await getLinkedAccount(db, 'identity-123', 'github')
168
+ * if (githubAccount) {
169
+ * console.log(`Connected as ${githubAccount.providerAccountId}`)
170
+ * }
171
+ * ```
172
+ */
173
+ export async function getLinkedAccount(db, identityId, provider) {
174
+ const results = await db
175
+ .select()
176
+ .from(linkedAccounts)
177
+ .where(and(eq(linkedAccounts.identityId, identityId), eq(linkedAccounts.provider, provider)));
178
+ return results[0];
179
+ }
180
+ /**
181
+ * Get all linked accounts for an identity.
182
+ * Uses the identity index for efficient lookup.
183
+ *
184
+ * @param db - Drizzle database instance
185
+ * @param identityId - The identity ID to look up
186
+ * @returns Array of linked accounts for the identity
187
+ *
188
+ * @example
189
+ * ```ts
190
+ * const accounts = await getLinkedAccountsByIdentity(db, 'identity-123')
191
+ * console.log(`User has ${accounts.length} connected accounts`)
192
+ * ```
193
+ */
194
+ export async function getLinkedAccountsByIdentity(db, identityId) {
195
+ return db
196
+ .select()
197
+ .from(linkedAccounts)
198
+ .where(eq(linkedAccounts.identityId, identityId));
199
+ }
200
+ /**
201
+ * Alias for getLinkedAccountsByIdentity for backward compatibility.
202
+ * @deprecated Use getLinkedAccountsByIdentity instead
203
+ */
204
+ export const getLinkedAccountsByUser = getLinkedAccountsByIdentity;
205
+ /**
206
+ * Get all linked accounts for a specific provider.
207
+ * Uses the provider index for efficient lookup.
208
+ *
209
+ * @param db - Drizzle database instance
210
+ * @param provider - The provider name (e.g., 'github', 'slack')
211
+ * @returns Array of linked accounts for the provider
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * const githubAccounts = await getLinkedAccountsByProvider(db, 'github')
216
+ * console.log(`${githubAccounts.length} users have connected GitHub`)
217
+ * ```
218
+ */
219
+ export async function getLinkedAccountsByProvider(db, provider) {
220
+ return db
221
+ .select()
222
+ .from(linkedAccounts)
223
+ .where(eq(linkedAccounts.provider, provider));
224
+ }
225
+ /**
226
+ * Get all linked accounts by integration type.
227
+ * Uses the type index for efficient lookup.
228
+ *
229
+ * @param db - Drizzle database instance
230
+ * @param type - The integration type (e.g., 'github', 'slack', 'vcs:github')
231
+ * @returns Array of linked accounts for the type
232
+ *
233
+ * @example
234
+ * ```ts
235
+ * const vcsAccounts = await getLinkedAccountsByType(db, 'vcs:github')
236
+ * ```
237
+ */
238
+ export async function getLinkedAccountsByType(db, type) {
239
+ return db
240
+ .select()
241
+ .from(linkedAccounts)
242
+ .where(eq(linkedAccounts.type, type));
243
+ }
244
+ /**
245
+ * Get all active linked accounts for an identity.
246
+ * Filters by status = 'active'.
247
+ *
248
+ * @param db - Drizzle database instance
249
+ * @param identityId - The identity ID to look up
250
+ * @returns Array of active linked accounts
251
+ *
252
+ * @example
253
+ * ```ts
254
+ * const activeAccounts = await getActiveLinkedAccounts(db, 'identity-123')
255
+ * ```
256
+ */
257
+ export async function getActiveLinkedAccounts(db, identityId) {
258
+ return db
259
+ .select()
260
+ .from(linkedAccounts)
261
+ .where(and(eq(linkedAccounts.identityId, identityId), eq(linkedAccounts.status, 'active')));
262
+ }
263
+ /**
264
+ * Check if an identity has a specific provider connected.
265
+ *
266
+ * @param db - Drizzle database instance
267
+ * @param identityId - The identity ID to check
268
+ * @param provider - The provider to check for
269
+ * @returns Boolean indicating if the provider is connected
270
+ *
271
+ * @example
272
+ * ```ts
273
+ * const hasGithub = await hasLinkedProvider(db, 'identity-123', 'github')
274
+ * if (!hasGithub) {
275
+ * // Prompt user to connect GitHub
276
+ * }
277
+ * ```
278
+ */
279
+ export async function hasLinkedProvider(db, identityId, provider) {
280
+ const account = await getLinkedAccount(db, identityId, provider);
281
+ return account !== undefined;
282
+ }
283
+ // ============================================================================
284
+ // EXPORT THE SCHEMA TABLE FOR CONVENIENCE
285
+ // ============================================================================
286
+ export { linkedAccounts };
287
+ //# sourceMappingURL=linked-accounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linked-accounts.js","sourceRoot":"","sources":["../../db/linked-accounts.ts"],"names":[],"mappings":"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"}