@mistriwork/engine 0.0.0-stage → 1.0.0-rc.10

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 (546) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -2
  3. package/dist/adapters/adapter.d.ts +693 -0
  4. package/dist/adapters/adapter.js +444 -0
  5. package/dist/adapters/cache/cacheStore.d.ts +75 -0
  6. package/dist/adapters/cache/cacheStore.js +160 -0
  7. package/dist/adapters/cache/resp.d.ts +52 -0
  8. package/dist/adapters/cache/resp.js +237 -0
  9. package/dist/adapters/commands/canonicalJson.d.ts +19 -0
  10. package/dist/adapters/commands/canonicalJson.js +154 -0
  11. package/dist/adapters/connect.d.ts +29 -0
  12. package/dist/adapters/connect.js +40 -0
  13. package/dist/adapters/connectionBudget.d.ts +101 -0
  14. package/dist/adapters/connectionBudget.js +128 -0
  15. package/dist/adapters/dbLatency.d.ts +35 -0
  16. package/dist/adapters/dbLatency.js +79 -0
  17. package/dist/adapters/epochCache.d.ts +50 -0
  18. package/dist/adapters/epochCache.js +85 -0
  19. package/dist/adapters/http/egress.d.ts +48 -0
  20. package/dist/adapters/http/egress.js +175 -0
  21. package/dist/adapters/http/httpAdapter.d.ts +71 -0
  22. package/dist/adapters/http/httpAdapter.js +512 -0
  23. package/dist/adapters/http/httpDescription.d.ts +32 -0
  24. package/dist/adapters/http/httpDescription.js +246 -0
  25. package/dist/adapters/http/openapi.d.ts +98 -0
  26. package/dist/adapters/http/openapi.js +487 -0
  27. package/dist/adapters/layoutRefusal.d.ts +24 -0
  28. package/dist/adapters/layoutRefusal.js +35 -0
  29. package/dist/adapters/net/networkPolicy.d.ts +44 -0
  30. package/dist/adapters/net/networkPolicy.js +123 -0
  31. package/dist/adapters/net/untrustedDatabase.d.ts +18 -0
  32. package/dist/adapters/net/untrustedDatabase.js +120 -0
  33. package/dist/adapters/poolAdmission.d.ts +43 -0
  34. package/dist/adapters/poolAdmission.js +184 -0
  35. package/dist/adapters/poolMetrics.d.ts +121 -0
  36. package/dist/adapters/poolMetrics.js +185 -0
  37. package/dist/adapters/postgres.d.ts +436 -0
  38. package/dist/adapters/postgres.js +1890 -0
  39. package/dist/adapters/postgresCatalog.d.ts +96 -0
  40. package/dist/adapters/postgresCatalog.js +387 -0
  41. package/dist/adapters/postgresCatalogDigest.d.ts +30 -0
  42. package/dist/adapters/postgresCatalogDigest.js +87 -0
  43. package/dist/adapters/postgresCatalogRows.d.ts +62 -0
  44. package/dist/adapters/postgresCatalogRows.js +37 -0
  45. package/dist/adapters/postgresDates.d.ts +1 -0
  46. package/dist/adapters/postgresDates.js +39 -0
  47. package/dist/adapters/postgresMaintenance.d.ts +33 -0
  48. package/dist/adapters/postgresMaintenance.js +179 -0
  49. package/dist/adapters/postgresPool.d.ts +255 -0
  50. package/dist/adapters/postgresPool.js +838 -0
  51. package/dist/adapters/postgresPooler.d.ts +28 -0
  52. package/dist/adapters/postgresPooler.js +267 -0
  53. package/dist/adapters/postgresReadCatalog.d.ts +31 -0
  54. package/dist/adapters/postgresReadCatalog.js +226 -0
  55. package/dist/adapters/postgresReadSnapshot.d.ts +46 -0
  56. package/dist/adapters/postgresReadSnapshot.js +133 -0
  57. package/dist/adapters/postgresSchemaEpoch.d.ts +24 -0
  58. package/dist/adapters/postgresSchemaEpoch.js +149 -0
  59. package/dist/adapters/postgresTransactionHandle.d.ts +173 -0
  60. package/dist/adapters/postgresTransactionHandle.js +524 -0
  61. package/dist/adapters/postgresValues.d.ts +30 -0
  62. package/dist/adapters/postgresValues.js +75 -0
  63. package/dist/adapters/replicas.d.ts +70 -0
  64. package/dist/adapters/replicas.js +208 -0
  65. package/dist/adapters/reservedSql.d.ts +38 -0
  66. package/dist/adapters/reservedSql.js +264 -0
  67. package/dist/adapters/rolePrivileges.d.ts +17 -0
  68. package/dist/adapters/rolePrivileges.js +22 -0
  69. package/dist/adapters/scoped/keyRows.d.ts +65 -0
  70. package/dist/adapters/scoped/keyRows.js +173 -0
  71. package/dist/adapters/scoped/postgresScopeCatalog.d.ts +16 -0
  72. package/dist/adapters/scoped/postgresScopeCatalog.js +117 -0
  73. package/dist/adapters/scoped/scopedCommandOperations.d.ts +5 -0
  74. package/dist/adapters/scoped/scopedCommandOperations.js +48 -0
  75. package/dist/adapters/scoped/scopedReads.d.ts +20 -0
  76. package/dist/adapters/scoped/scopedReads.js +174 -0
  77. package/dist/adapters/scoped/scopedTransaction.d.ts +89 -0
  78. package/dist/adapters/scoped/scopedTransaction.js +303 -0
  79. package/dist/adapters/scoped/sqliteScopeCatalog.d.ts +16 -0
  80. package/dist/adapters/scoped/sqliteScopeCatalog.js +241 -0
  81. package/dist/adapters/scoped/updateGuard.d.ts +3 -0
  82. package/dist/adapters/scoped/updateGuard.js +40 -0
  83. package/dist/adapters/serverSettings.d.ts +45 -0
  84. package/dist/adapters/serverSettings.js +46 -0
  85. package/dist/adapters/sqlite.d.ts +262 -0
  86. package/dist/adapters/sqlite.js +1434 -0
  87. package/dist/adapters/sqliteCostlyReads.d.ts +33 -0
  88. package/dist/adapters/sqliteCostlyReads.js +49 -0
  89. package/dist/adapters/sqliteDecimals.d.ts +22 -0
  90. package/dist/adapters/sqliteDecimals.js +57 -0
  91. package/dist/adapters/sqliteHandles.d.ts +43 -0
  92. package/dist/adapters/sqliteHandles.js +143 -0
  93. package/dist/adapters/sqliteStatementProcess.d.ts +29 -0
  94. package/dist/adapters/sqliteStatementProcess.js +131 -0
  95. package/dist/adapters/statementControl.d.ts +34 -0
  96. package/dist/adapters/statementControl.js +90 -0
  97. package/dist/adapters/storeHost.d.ts +130 -0
  98. package/dist/adapters/storeHost.js +13 -0
  99. package/dist/adapters/telemetry/drivers.d.ts +21 -0
  100. package/dist/adapters/telemetry/drivers.js +321 -0
  101. package/dist/adapters/telemetry/metrics.d.ts +63 -0
  102. package/dist/adapters/telemetry/metrics.js +122 -0
  103. package/dist/adapters/telemetry/otlp.d.ts +12 -0
  104. package/dist/adapters/telemetry/otlp.js +320 -0
  105. package/dist/adapters/telemetry/otlpEncode.d.ts +48 -0
  106. package/dist/adapters/telemetry/otlpEncode.js +366 -0
  107. package/dist/adapters/telemetry/otlpEnv.d.ts +1 -0
  108. package/dist/adapters/telemetry/otlpEnv.js +12 -0
  109. package/dist/adapters/telemetry/serverTiming.d.ts +83 -0
  110. package/dist/adapters/telemetry/serverTiming.js +503 -0
  111. package/dist/adapters/telemetry/start.d.ts +10 -0
  112. package/dist/adapters/telemetry/start.js +25 -0
  113. package/dist/adapters/telemetry/statement.d.ts +16 -0
  114. package/dist/adapters/telemetry/statement.js +134 -0
  115. package/dist/adapters/telemetry/trace.d.ts +127 -0
  116. package/dist/adapters/telemetry/trace.js +295 -0
  117. package/dist/adapters/writeAhead.d.ts +27 -0
  118. package/dist/adapters/writeAhead.js +46 -0
  119. package/dist/adapters/writeAttribution.d.ts +18 -0
  120. package/dist/adapters/writeAttribution.js +23 -0
  121. package/dist/adapters/writeCapture.d.ts +73 -0
  122. package/dist/adapters/writeCapture.js +20 -0
  123. package/dist/adapters/writeLanes.d.ts +94 -0
  124. package/dist/adapters/writeLanes.js +232 -0
  125. package/dist/engine.d.ts +15 -0
  126. package/dist/engine.js +13 -0
  127. package/dist/server/auth/credentials.d.ts +61 -0
  128. package/dist/server/auth/credentials.js +260 -0
  129. package/dist/server/cacheService.d.ts +50 -0
  130. package/dist/server/cacheService.js +110 -0
  131. package/dist/server/cli/args.d.ts +176 -0
  132. package/dist/server/cli/args.js +342 -0
  133. package/dist/server/cli/bin.d.ts +5 -0
  134. package/dist/server/cli/bin.js +66 -0
  135. package/dist/server/cli/browser.d.ts +15 -0
  136. package/dist/server/cli/browser.js +37 -0
  137. package/dist/server/cli/config.d.ts +50 -0
  138. package/dist/server/cli/config.js +206 -0
  139. package/dist/server/cli/startup.d.ts +36 -0
  140. package/dist/server/cli/startup.js +128 -0
  141. package/dist/server/cli/startupOptions.d.ts +63 -0
  142. package/dist/server/cli/startupOptions.js +143 -0
  143. package/dist/server/cli/subcommand.d.ts +28 -0
  144. package/dist/server/cli/subcommand.js +32 -0
  145. package/dist/server/cli/usage.d.ts +13 -0
  146. package/dist/server/cli/usage.js +31 -0
  147. package/dist/server/clientHttp.d.ts +184 -0
  148. package/dist/server/clientHttp.js +700 -0
  149. package/dist/server/clientSurface.d.ts +128 -0
  150. package/dist/server/clientSurface.js +182 -0
  151. package/dist/server/columnGrants.d.ts +103 -0
  152. package/dist/server/columnGrants.js +730 -0
  153. package/dist/server/compileCache.d.ts +1 -0
  154. package/dist/server/compileCache.js +30 -0
  155. package/dist/server/config/locations.d.ts +1 -0
  156. package/dist/server/config/locations.js +15 -0
  157. package/dist/server/configPaths.d.ts +7 -0
  158. package/dist/server/configPaths.js +34 -0
  159. package/dist/server/configSections.d.ts +64 -0
  160. package/dist/server/configSections.js +72 -0
  161. package/dist/server/connectionRedaction.d.ts +30 -0
  162. package/dist/server/connectionRedaction.js +77 -0
  163. package/dist/server/connections.d.ts +353 -0
  164. package/dist/server/connections.js +978 -0
  165. package/dist/server/constraints.d.ts +82 -0
  166. package/dist/server/constraints.js +169 -0
  167. package/dist/server/demo.d.ts +9 -0
  168. package/dist/server/demo.js +554 -0
  169. package/dist/server/devclient.d.ts +108 -0
  170. package/dist/server/devclient.js +361 -0
  171. package/dist/server/evidence.d.ts +55 -0
  172. package/dist/server/evidence.js +323 -0
  173. package/dist/server/hiddenColumns.d.ts +32 -0
  174. package/dist/server/hiddenColumns.js +238 -0
  175. package/dist/server/http/baselineHeaders.d.ts +24 -0
  176. package/dist/server/http/baselineHeaders.js +12 -0
  177. package/dist/server/http/captured.d.ts +35 -0
  178. package/dist/server/http/captured.js +73 -0
  179. package/dist/server/http/clock.d.ts +1 -0
  180. package/dist/server/http/clock.js +14 -0
  181. package/dist/server/http/connectionSource.d.ts +4 -0
  182. package/dist/server/http/connectionSource.js +48 -0
  183. package/dist/server/http/context.d.ts +189 -0
  184. package/dist/server/http/context.js +11 -0
  185. package/dist/server/http/crawlerText.d.ts +15 -0
  186. package/dist/server/http/crawlerText.js +32 -0
  187. package/dist/server/http/dataRoutes.d.ts +88 -0
  188. package/dist/server/http/dataRoutes.js +137 -0
  189. package/dist/server/http/door.d.ts +57 -0
  190. package/dist/server/http/door.js +39 -0
  191. package/dist/server/http/exportRoute.d.ts +15 -0
  192. package/dist/server/http/exportRoute.js +320 -0
  193. package/dist/server/http/firstPaint.d.ts +108 -0
  194. package/dist/server/http/firstPaint.js +262 -0
  195. package/dist/server/http/httpOperationRoutes.d.ts +11 -0
  196. package/dist/server/http/httpOperationRoutes.js +50 -0
  197. package/dist/server/http/pageReads.d.ts +20 -0
  198. package/dist/server/http/pageReads.js +205 -0
  199. package/dist/server/http/pageRoutes.d.ts +39 -0
  200. package/dist/server/http/pageRoutes.js +291 -0
  201. package/dist/server/http/probes.d.ts +22 -0
  202. package/dist/server/http/probes.js +27 -0
  203. package/dist/server/http/rateLimit.d.ts +131 -0
  204. package/dist/server/http/rateLimit.js +351 -0
  205. package/dist/server/http/readRoutes.d.ts +9 -0
  206. package/dist/server/http/readRoutes.js +131 -0
  207. package/dist/server/http/readRouting.d.ts +20 -0
  208. package/dist/server/http/readRouting.js +80 -0
  209. package/dist/server/http/recordCompose.d.ts +67 -0
  210. package/dist/server/http/recordCompose.js +167 -0
  211. package/dist/server/http/recordWrites.d.ts +89 -0
  212. package/dist/server/http/recordWrites.js +298 -0
  213. package/dist/server/http/refusalReport.d.ts +38 -0
  214. package/dist/server/http/refusalReport.js +63 -0
  215. package/dist/server/http/reply.d.ts +130 -0
  216. package/dist/server/http/reply.js +394 -0
  217. package/dist/server/http/requestOrigin.d.ts +11 -0
  218. package/dist/server/http/requestOrigin.js +8 -0
  219. package/dist/server/http/router.d.ts +45 -0
  220. package/dist/server/http/router.js +22 -0
  221. package/dist/server/http/serverCore.d.ts +68 -0
  222. package/dist/server/http/serverCore.js +177 -0
  223. package/dist/server/http/traceRequest.d.ts +30 -0
  224. package/dist/server/http/traceRequest.js +224 -0
  225. package/dist/server/http/trust.d.ts +261 -0
  226. package/dist/server/http/trust.js +472 -0
  227. package/dist/server/http/writeRefusal.d.ts +33 -0
  228. package/dist/server/http/writeRefusal.js +24 -0
  229. package/dist/server/httpConnection.d.ts +49 -0
  230. package/dist/server/httpConnection.js +170 -0
  231. package/dist/server/impact.d.ts +55 -0
  232. package/dist/server/impact.js +47 -0
  233. package/dist/server/journal.d.ts +134 -0
  234. package/dist/server/journal.js +398 -0
  235. package/dist/server/keysetReadHttp.d.ts +52 -0
  236. package/dist/server/keysetReadHttp.js +85 -0
  237. package/dist/server/layouts.d.ts +49 -0
  238. package/dist/server/layouts.js +192 -0
  239. package/dist/server/migrate/cli.d.ts +55 -0
  240. package/dist/server/migrate/cli.js +517 -0
  241. package/dist/server/migrate/database.d.ts +37 -0
  242. package/dist/server/migrate/database.js +247 -0
  243. package/dist/server/migrate/desired.d.ts +76 -0
  244. package/dist/server/migrate/desired.js +292 -0
  245. package/dist/server/migrate/files.d.ts +34 -0
  246. package/dist/server/migrate/files.js +141 -0
  247. package/dist/server/migrate/flyway.d.ts +7 -0
  248. package/dist/server/migrate/flyway.js +69 -0
  249. package/dist/server/migrate/history.d.ts +70 -0
  250. package/dist/server/migrate/history.js +211 -0
  251. package/dist/server/migrate/runner.d.ts +100 -0
  252. package/dist/server/migrate/runner.js +409 -0
  253. package/dist/server/migrate/snapshot.d.ts +30 -0
  254. package/dist/server/migrate/snapshot.js +239 -0
  255. package/dist/server/migrate/target.d.ts +33 -0
  256. package/dist/server/migrate/target.js +82 -0
  257. package/dist/server/openapiDraft.d.ts +25 -0
  258. package/dist/server/openapiDraft.js +171 -0
  259. package/dist/server/operations/diagnostics.d.ts +101 -0
  260. package/dist/server/operations/diagnostics.js +284 -0
  261. package/dist/server/operations/requestMetrics.d.ts +33 -0
  262. package/dist/server/operations/requestMetrics.js +94 -0
  263. package/dist/server/packageVersion.d.ts +1 -0
  264. package/dist/server/packageVersion.js +11 -0
  265. package/dist/server/poolConfig.d.ts +34 -0
  266. package/dist/server/poolConfig.js +114 -0
  267. package/dist/server/product.d.ts +20 -0
  268. package/dist/server/product.js +12 -0
  269. package/dist/server/recordHistoryOperations.d.ts +39 -0
  270. package/dist/server/recordHistoryOperations.js +43 -0
  271. package/dist/server/recordWriteOperations.d.ts +111 -0
  272. package/dist/server/recordWriteOperations.js +329 -0
  273. package/dist/server/resourceReadHttp.d.ts +81 -0
  274. package/dist/server/resourceReadHttp.js +606 -0
  275. package/dist/server/resourceReadOperations.d.ts +147 -0
  276. package/dist/server/resourceReadOperations.js +452 -0
  277. package/dist/server/scaffoldMachine.d.ts +54 -0
  278. package/dist/server/scaffoldMachine.js +184 -0
  279. package/dist/server/seed/cli.d.ts +20 -0
  280. package/dist/server/seed/cli.js +164 -0
  281. package/dist/server/seed/lexicon.d.ts +26 -0
  282. package/dist/server/seed/lexicon.js +585 -0
  283. package/dist/server/seed/seed.d.ts +70 -0
  284. package/dist/server/seed/seed.js +779 -0
  285. package/dist/server/seed/words.d.ts +21 -0
  286. package/dist/server/seed/words.js +164 -0
  287. package/dist/server/serverRequests.d.ts +6 -0
  288. package/dist/server/serverRequests.js +33 -0
  289. package/dist/server/serverTimeouts.d.ts +33 -0
  290. package/dist/server/serverTimeouts.js +32 -0
  291. package/dist/server/shapeonly.d.ts +32 -0
  292. package/dist/server/shapeonly.js +110 -0
  293. package/dist/server/startupWarnings.d.ts +32 -0
  294. package/dist/server/startupWarnings.js +92 -0
  295. package/dist/shared/addressParams.d.ts +28 -0
  296. package/dist/shared/addressParams.js +47 -0
  297. package/dist/shared/appCards.d.ts +123 -0
  298. package/dist/shared/appCards.js +385 -0
  299. package/dist/shared/appComponents.d.ts +177 -0
  300. package/dist/shared/appComponents.js +422 -0
  301. package/dist/shared/appDocuments.d.ts +43 -0
  302. package/dist/shared/appDocuments.js +131 -0
  303. package/dist/shared/appEmbeds.d.ts +21 -0
  304. package/dist/shared/appEmbeds.js +24 -0
  305. package/dist/shared/appIcons.d.ts +28 -0
  306. package/dist/shared/appIcons.js +223 -0
  307. package/dist/shared/appLinks.d.ts +17 -0
  308. package/dist/shared/appLinks.js +124 -0
  309. package/dist/shared/appListColumns.d.ts +3 -0
  310. package/dist/shared/appListColumns.js +66 -0
  311. package/dist/shared/appLocale.d.ts +36 -0
  312. package/dist/shared/appLocale.js +86 -0
  313. package/dist/shared/appMessages.d.ts +44 -0
  314. package/dist/shared/appMessages.js +78 -0
  315. package/dist/shared/appNoun.d.ts +21 -0
  316. package/dist/shared/appNoun.js +32 -0
  317. package/dist/shared/autoBucket.d.ts +98 -0
  318. package/dist/shared/autoBucket.js +305 -0
  319. package/dist/shared/autoValues.d.ts +25 -0
  320. package/dist/shared/autoValues.js +25 -0
  321. package/dist/shared/breakdown.d.ts +228 -0
  322. package/dist/shared/breakdown.js +557 -0
  323. package/dist/shared/breakdowntext.d.ts +41 -0
  324. package/dist/shared/breakdowntext.js +400 -0
  325. package/dist/shared/builtInThemes.d.ts +2 -0
  326. package/dist/shared/builtInThemes.js +771 -0
  327. package/dist/shared/chartSeparation.d.ts +11 -0
  328. package/dist/shared/chartSeparation.js +58 -0
  329. package/dist/shared/clauses.d.ts +22 -0
  330. package/dist/shared/clauses.js +97 -0
  331. package/dist/shared/columnCaption.d.ts +16 -0
  332. package/dist/shared/columnCaption.js +90 -0
  333. package/dist/shared/commandFieldPath.d.ts +2 -0
  334. package/dist/shared/commandFieldPath.js +7 -0
  335. package/dist/shared/commandWire.d.ts +26 -0
  336. package/dist/shared/commandWire.js +41 -0
  337. package/dist/shared/computed.d.ts +161 -0
  338. package/dist/shared/computed.js +378 -0
  339. package/dist/shared/computedParse.d.ts +13 -0
  340. package/dist/shared/computedParse.js +278 -0
  341. package/dist/shared/computedValue.d.ts +47 -0
  342. package/dist/shared/computedValue.js +191 -0
  343. package/dist/shared/connection.d.ts +30 -0
  344. package/dist/shared/connection.js +1 -0
  345. package/dist/shared/csv.d.ts +20 -0
  346. package/dist/shared/csv.js +63 -0
  347. package/dist/shared/dashLayout.d.ts +30 -0
  348. package/dist/shared/dashLayout.js +132 -0
  349. package/dist/shared/dashboardAsks.d.ts +93 -0
  350. package/dist/shared/dashboardAsks.js +129 -0
  351. package/dist/shared/dashboardTrend.d.ts +20 -0
  352. package/dist/shared/dashboardTrend.js +50 -0
  353. package/dist/shared/declaredReferences.d.ts +50 -0
  354. package/dist/shared/declaredReferences.js +202 -0
  355. package/dist/shared/definedFields.d.ts +63 -0
  356. package/dist/shared/definedFields.js +103 -0
  357. package/dist/shared/definedValues.d.ts +63 -0
  358. package/dist/shared/definedValues.js +184 -0
  359. package/dist/shared/displayDefaults.d.ts +135 -0
  360. package/dist/shared/displayDefaults.js +529 -0
  361. package/dist/shared/dueDate.d.ts +6 -0
  362. package/dist/shared/dueDate.js +6 -0
  363. package/dist/shared/duration.d.ts +4 -0
  364. package/dist/shared/duration.js +23 -0
  365. package/dist/shared/fileBounds.d.ts +9 -0
  366. package/dist/shared/fileBounds.js +9 -0
  367. package/dist/shared/filter.d.ts +217 -0
  368. package/dist/shared/filter.js +305 -0
  369. package/dist/shared/firstPaint.d.ts +24 -0
  370. package/dist/shared/firstPaint.js +33 -0
  371. package/dist/shared/form.d.ts +21 -0
  372. package/dist/shared/form.js +25 -0
  373. package/dist/shared/formValues.d.ts +104 -0
  374. package/dist/shared/formValues.js +352 -0
  375. package/dist/shared/funnel.d.ts +45 -0
  376. package/dist/shared/funnel.js +108 -0
  377. package/dist/shared/httpOperations.d.ts +48 -0
  378. package/dist/shared/httpOperations.js +9 -0
  379. package/dist/shared/iconGlyphs.d.ts +4 -0
  380. package/dist/shared/iconGlyphs.js +151 -0
  381. package/dist/shared/iconWeights.d.ts +3 -0
  382. package/dist/shared/iconWeights.js +162 -0
  383. package/dist/shared/imageWidths.d.ts +32 -0
  384. package/dist/shared/imageWidths.js +38 -0
  385. package/dist/shared/keysetPage.d.ts +64 -0
  386. package/dist/shared/keysetPage.js +161 -0
  387. package/dist/shared/like.d.ts +20 -0
  388. package/dist/shared/like.js +29 -0
  389. package/dist/shared/listEmpty.d.ts +12 -0
  390. package/dist/shared/listEmpty.js +36 -0
  391. package/dist/shared/listFilters.d.ts +28 -0
  392. package/dist/shared/listFilters.js +84 -0
  393. package/dist/shared/listPresentations.d.ts +199 -0
  394. package/dist/shared/listPresentations.js +7 -0
  395. package/dist/shared/listQuestion.d.ts +52 -0
  396. package/dist/shared/listQuestion.js +137 -0
  397. package/dist/shared/lookPalettes.d.ts +62 -0
  398. package/dist/shared/lookPalettes.js +306 -0
  399. package/dist/shared/maskQuoted.d.ts +24 -0
  400. package/dist/shared/maskQuoted.js +48 -0
  401. package/dist/shared/mentionLabel.d.ts +19 -0
  402. package/dist/shared/mentionLabel.js +38 -0
  403. package/dist/shared/mentionLookup.d.ts +17 -0
  404. package/dist/shared/mentionLookup.js +64 -0
  405. package/dist/shared/menuCounts.d.ts +16 -0
  406. package/dist/shared/menuCounts.js +74 -0
  407. package/dist/shared/model.d.ts +79 -0
  408. package/dist/shared/model.js +153 -0
  409. package/dist/shared/money.d.ts +44 -0
  410. package/dist/shared/money.js +81 -0
  411. package/dist/shared/moneyEntry.d.ts +7 -0
  412. package/dist/shared/moneyEntry.js +27 -0
  413. package/dist/shared/mount.d.ts +118 -0
  414. package/dist/shared/mount.js +248 -0
  415. package/dist/shared/niceTicks.d.ts +26 -0
  416. package/dist/shared/niceTicks.js +50 -0
  417. package/dist/shared/order.d.ts +59 -0
  418. package/dist/shared/order.js +133 -0
  419. package/dist/shared/page.d.ts +135 -0
  420. package/dist/shared/page.js +1187 -0
  421. package/dist/shared/pageAnatomy.d.ts +99 -0
  422. package/dist/shared/pageAnatomy.js +370 -0
  423. package/dist/shared/pageConfig.d.ts +25 -0
  424. package/dist/shared/pageConfig.js +1308 -0
  425. package/dist/shared/pageEmptyActions.d.ts +12 -0
  426. package/dist/shared/pageEmptyActions.js +20 -0
  427. package/dist/shared/pageLayouts.d.ts +72 -0
  428. package/dist/shared/pageLayouts.js +205 -0
  429. package/dist/shared/pageModel.d.ts +785 -0
  430. package/dist/shared/pageModel.js +121 -0
  431. package/dist/shared/pagePaths.d.ts +180 -0
  432. package/dist/shared/pagePaths.js +869 -0
  433. package/dist/shared/pagePlans.d.ts +52 -0
  434. package/dist/shared/pagePlans.js +108 -0
  435. package/dist/shared/pageRoutes.d.ts +9 -0
  436. package/dist/shared/pageRoutes.js +9 -0
  437. package/dist/shared/query.d.ts +166 -0
  438. package/dist/shared/query.js +1302 -0
  439. package/dist/shared/queryDates.d.ts +12 -0
  440. package/dist/shared/queryDates.js +101 -0
  441. package/dist/shared/queryOperands.d.ts +99 -0
  442. package/dist/shared/queryOperands.js +131 -0
  443. package/dist/shared/reads.d.ts +103 -0
  444. package/dist/shared/reads.js +154 -0
  445. package/dist/shared/recordLabel.d.ts +51 -0
  446. package/dist/shared/recordLabel.js +123 -0
  447. package/dist/shared/recordReadKeys.d.ts +30 -0
  448. package/dist/shared/recordReadKeys.js +51 -0
  449. package/dist/shared/recordReads.d.ts +268 -0
  450. package/dist/shared/recordReads.js +368 -0
  451. package/dist/shared/recordview.d.ts +198 -0
  452. package/dist/shared/recordview.js +356 -0
  453. package/dist/shared/referenceModel.d.ts +58 -0
  454. package/dist/shared/referenceModel.js +194 -0
  455. package/dist/shared/refusal.d.ts +64 -0
  456. package/dist/shared/refusal.js +144 -0
  457. package/dist/shared/relatedCreate.d.ts +30 -0
  458. package/dist/shared/relatedCreate.js +162 -0
  459. package/dist/shared/resourceHttp.d.ts +464 -0
  460. package/dist/shared/resourceHttp.js +1 -0
  461. package/dist/shared/richText.d.ts +85 -0
  462. package/dist/shared/richText.js +305 -0
  463. package/dist/shared/rollups.d.ts +143 -0
  464. package/dist/shared/rollups.js +64 -0
  465. package/dist/shared/rowScope.d.ts +72 -0
  466. package/dist/shared/rowScope.js +376 -0
  467. package/dist/shared/runtimeTables.d.ts +44 -0
  468. package/dist/shared/runtimeTables.js +79 -0
  469. package/dist/shared/schema.d.ts +523 -0
  470. package/dist/shared/schema.js +627 -0
  471. package/dist/shared/schematext.d.ts +38 -0
  472. package/dist/shared/schematext.js +101 -0
  473. package/dist/shared/scopeCatalog.d.ts +29 -0
  474. package/dist/shared/scopeCatalog.js +468 -0
  475. package/dist/shared/servedApp.d.ts +681 -0
  476. package/dist/shared/servedApp.js +45 -0
  477. package/dist/shared/sessionLease.d.ts +34 -0
  478. package/dist/shared/sessionLease.js +3 -0
  479. package/dist/shared/shape.d.ts +55 -0
  480. package/dist/shared/shape.js +168 -0
  481. package/dist/shared/slug.d.ts +1 -0
  482. package/dist/shared/slug.js +12 -0
  483. package/dist/shared/sortText.d.ts +14 -0
  484. package/dist/shared/sortText.js +26 -0
  485. package/dist/shared/sqlRelation.d.ts +4 -0
  486. package/dist/shared/sqlRelation.js +8 -0
  487. package/dist/shared/sqlsaved.d.ts +44 -0
  488. package/dist/shared/sqlsaved.js +63 -0
  489. package/dist/shared/stitchedPaths.d.ts +27 -0
  490. package/dist/shared/stitchedPaths.js +38 -0
  491. package/dist/shared/structuredFilter.d.ts +22 -0
  492. package/dist/shared/structuredFilter.js +1 -0
  493. package/dist/shared/subtitlePath.d.ts +20 -0
  494. package/dist/shared/subtitlePath.js +24 -0
  495. package/dist/shared/suggest.d.ts +18 -0
  496. package/dist/shared/suggest.js +59 -0
  497. package/dist/shared/tableSizing.d.ts +4 -0
  498. package/dist/shared/tableSizing.js +9 -0
  499. package/dist/shared/tagLists.d.ts +57 -0
  500. package/dist/shared/tagLists.js +34 -0
  501. package/dist/shared/textRules.d.ts +54 -0
  502. package/dist/shared/textRules.js +133 -0
  503. package/dist/shared/theme.d.ts +94 -0
  504. package/dist/shared/theme.js +800 -0
  505. package/dist/shared/themeColor.d.ts +34 -0
  506. package/dist/shared/themeColor.js +109 -0
  507. package/dist/shared/themeFaces.d.ts +30 -0
  508. package/dist/shared/themeFaces.js +42 -0
  509. package/dist/shared/themeInk.d.ts +20 -0
  510. package/dist/shared/themeInk.js +52 -0
  511. package/dist/shared/themeLooks.d.ts +9 -0
  512. package/dist/shared/themeLooks.js +572 -0
  513. package/dist/shared/themeParts.d.ts +26 -0
  514. package/dist/shared/themeParts.js +71 -0
  515. package/dist/shared/themePartsCheck.d.ts +21 -0
  516. package/dist/shared/themePartsCheck.js +91 -0
  517. package/dist/shared/themePresets.d.ts +85 -0
  518. package/dist/shared/themePresets.js +139 -0
  519. package/dist/shared/themeRecipeWords.d.ts +156 -0
  520. package/dist/shared/themeRecipeWords.js +156 -0
  521. package/dist/shared/themeRecipes.d.ts +213 -0
  522. package/dist/shared/themeRecipes.js +234 -0
  523. package/dist/shared/themeResolve.d.ts +55 -0
  524. package/dist/shared/themeResolve.js +52 -0
  525. package/dist/shared/themeTokens.d.ts +107 -0
  526. package/dist/shared/themeTokens.js +116 -0
  527. package/dist/shared/themeType.d.ts +38 -0
  528. package/dist/shared/themeType.js +205 -0
  529. package/dist/shared/unitWord.d.ts +4 -0
  530. package/dist/shared/unitWord.js +37 -0
  531. package/dist/shared/view.d.ts +195 -0
  532. package/dist/shared/view.js +987 -0
  533. package/dist/shared/viewLabels.d.ts +47 -0
  534. package/dist/shared/viewLabels.js +459 -0
  535. package/dist/shared/viewPaths.d.ts +248 -0
  536. package/dist/shared/viewPaths.js +294 -0
  537. package/dist/shared/viewtext.d.ts +57 -0
  538. package/dist/shared/viewtext.js +282 -0
  539. package/dist/shared/vocabulary.d.ts +71 -0
  540. package/dist/shared/vocabulary.js +249 -0
  541. package/dist/shared/weekStart.d.ts +7 -0
  542. package/dist/shared/weekStart.js +36 -0
  543. package/mark.svg +1 -0
  544. package/package.json +261 -4
  545. package/schema/model.d.ts +298 -0
  546. package/schema/theme.d.ts +587 -0
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Where connection secrets live, and — more importantly — where they do not.
3
+ *
4
+ * The rule this file exists to enforce: **tablewalk does not invent its own
5
+ * secret storage.** Rolling encryption for a local dev tool means inventing a
6
+ * key-management scheme, and a key sitting next to the ciphertext it protects
7
+ * is obfuscation with extra steps. Every option below either delegates to
8
+ * something that already solves the problem (the OS keychain, the
9
+ * environment) or is explicit about being plaintext-on-disk with the same
10
+ * permission discipline ssh and psql use.
11
+ *
12
+ * Four ways to supply a password, in the order they are tried:
13
+ *
14
+ * 1. `${VAR}` in the URL, expanded from the environment. Nothing is stored.
15
+ * 2. The OS keychain, addressed by connection name. The secret never
16
+ * touches a tablewalk file.
17
+ * 3. A credentials file at 0600, refused if the mode is wider.
18
+ * 4. Inline in the URL — supported because it is what people paste, and
19
+ * warned about because it ends up in shell history and config files.
20
+ *
21
+ * Whatever the source, the resolved URL stays in the server process. The
22
+ * browser is only ever sent a redacted form; `redact` in connections.ts is
23
+ * the single point that produces it and there are tests asserting no password
24
+ * survives the trip.
25
+ */
26
+ import { readFile, writeFile, chmod, mkdir, rename, rm } from 'node:fs/promises';
27
+ import { statSync } from 'node:fs';
28
+ import { homedir, platform } from 'node:os';
29
+ import { dirname, join } from 'node:path';
30
+ import { execFile, spawn } from 'node:child_process';
31
+ import { promisify } from 'node:util';
32
+ import { product } from '../product.js';
33
+ const run = promisify(execFile);
34
+ /** Where the credentials file lives when one is used at all. */
35
+ export function credentialsPath() {
36
+ const xdg = process.env.XDG_CONFIG_HOME || join(homedir(), '.config');
37
+ return join(xdg, product(), 'credentials.json');
38
+ }
39
+ /** The keychain service name: the product's, one namespace per product, addressed by connection name. */
40
+ const keychainService = () => product();
41
+ /* ---------- 1. environment expansion ---------- */
42
+ /**
43
+ * Expand `${VAR}` and `$VAR` in a connection string.
44
+ *
45
+ * This is the recommended option, and the only one where the secret is never
46
+ * written anywhere tablewalk controls:
47
+ *
48
+ * { "name": "prod", "url": "postgres://app:${PROD_DB_PASSWORD}@db/app" }
49
+ *
50
+ * An unset variable is an error rather than an empty expansion. Silently
51
+ * producing `postgres://app:@db/app` would send an empty password and fail
52
+ * with an authentication error that says nothing about the real cause.
53
+ */
54
+ export function expandEnv(url, env = process.env) {
55
+ return url.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}|\$([A-Za-z_][A-Za-z0-9_]*)/g, (_, braced, bare) => environmentValue(braced ?? bare, env));
56
+ }
57
+ /**
58
+ * Expand only the `${NAME}` form. An authentication store URL is read this
59
+ * way, and it is the only form its documentation names: there a bare `$` is
60
+ * literal, so a password containing `$abc` is not mistaken for a reference
61
+ * to an unset variable (and refused) or, worse, to a set one.
62
+ */
63
+ export function expandEnvReferences(url, env = process.env) {
64
+ return url.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (_, name) => environmentValue(name, env));
65
+ }
66
+ function environmentValue(name, env) {
67
+ const value = env[name];
68
+ if (value === undefined) {
69
+ throw new Error(`Connection references $${name}, which is not set. Export it, or remove it from the connection.`);
70
+ }
71
+ return value;
72
+ }
73
+ /** True when a URL carries a literal password rather than a reference. */
74
+ export function hasInlinePassword(url) {
75
+ try {
76
+ return Boolean(new URL(url).password);
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ /* ---------- 2. the OS keychain ---------- */
83
+ /**
84
+ * Read a password from the platform keychain.
85
+ *
86
+ * macOS only for now, through the `security` binary that ships with the OS —
87
+ * no dependency, no native module, and the secret is protected by the same
88
+ * thing protecting everything else on the machine. Linux and Windows return
89
+ * undefined and fall through to the file, which is honest: claiming keychain
90
+ * support and quietly storing plaintext would be worse than not offering it.
91
+ */
92
+ /* `MISTRI_NO_KEYCHAIN=1` pretends there is none: the test suite sets it
93
+ so `npm test` never writes to the developer's real keychain (and never
94
+ hangs on a locked one), and it is a way out for a macOS box whose
95
+ keychain is not the place a team keeps its passwords. */
96
+ const keychainOff = () => process.env.MISTRI_NO_KEYCHAIN === '1';
97
+ async function keychainGet(account) {
98
+ if (platform() !== 'darwin' || keychainOff())
99
+ return undefined;
100
+ try {
101
+ const { stdout } = await run('security', ['find-generic-password', '-s', keychainService(), '-a', account, '-w']);
102
+ return stdout.trim() || undefined;
103
+ }
104
+ catch {
105
+ // Not found, or the user declined the prompt: fall through to the file.
106
+ return undefined;
107
+ }
108
+ }
109
+ export async function keychainSet(account, secret) {
110
+ if (platform() !== 'darwin' || keychainOff())
111
+ return false;
112
+ try {
113
+ /* The secret goes in on stdin, to `security -i`, as hex: `-w <secret>` on the command line is visible to every
114
+ local user in `ps` for as long as the command runs, and `-w` with no value reads a tty, not a pipe. `-U`
115
+ updates in place rather than erroring when the item already exists. */
116
+ if (/[\0\r\n]/.test(account))
117
+ return false;
118
+ const quoted = (text) => `"${text.replace(/[\\"]/g, '\\$&')}"`;
119
+ const command = `add-generic-password -U -s ${quoted(keychainService())} -a ${quoted(account)} -X ${Buffer.from(secret, 'utf8').toString('hex')}\n`;
120
+ return await new Promise((done) => {
121
+ const child = spawn('security', ['-i'], { stdio: ['pipe', 'ignore', 'ignore'] });
122
+ child.once('error', () => done(false));
123
+ child.once('close', (code) => done(code === 0));
124
+ child.stdin.on('error', () => { });
125
+ child.stdin.end(command);
126
+ });
127
+ }
128
+ catch {
129
+ return false;
130
+ }
131
+ }
132
+ export async function keychainDelete(account) {
133
+ if (platform() !== 'darwin')
134
+ return;
135
+ try {
136
+ await run('security', ['delete-generic-password', '-s', keychainService(), '-a', account]);
137
+ }
138
+ catch {
139
+ /* Already gone. */
140
+ }
141
+ }
142
+ export const keychainAvailable = () => platform() === 'darwin';
143
+ /**
144
+ * Read the credentials file, refusing it if anyone but the owner can read it.
145
+ *
146
+ * The permission check is the whole point. It is what `ssh` does to private
147
+ * keys and what `psql` does to `.pgpass`, and it catches the realistic
148
+ * mistake: a file created correctly, then committed, copied or synced with
149
+ * permissions that no longer match the intent. Refusing loudly is better than
150
+ * reading it and leaving the user believing it was safe.
151
+ */
152
+ export async function readCredentials(path = credentialsPath()) {
153
+ let mode;
154
+ try {
155
+ mode = statSync(path).mode & 0o777;
156
+ }
157
+ catch (err) {
158
+ // No file is the normal case, not an error. Any other failure is: it must not read as "nothing saved".
159
+ if (err.code === 'ENOENT')
160
+ return {};
161
+ throw new Error(`${path} could not be read: ${err.message}`);
162
+ }
163
+ if (mode & 0o077) {
164
+ throw new Error(`${path} is readable by others (mode ${mode.toString(8)}). ` + `Run: chmod 600 ${path}`);
165
+ }
166
+ try {
167
+ const parsed = JSON.parse(await readFile(path, 'utf8'));
168
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
169
+ return parsed;
170
+ throw new Error('expected an object of name → password');
171
+ }
172
+ catch (err) {
173
+ throw new Error(`${path} could not be read: ${err.message}`);
174
+ }
175
+ }
176
+ export async function writeCredential(name, secret, path = credentialsPath()) {
177
+ /* A file that cannot be read (too wide a mode, a stray comma) refuses the write: rewriting it from nothing would
178
+ delete every other saved password, and the chmod after would hide the one sign that something was wrong. */
179
+ const existing = await readCredentials(path);
180
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
181
+ /* Written with the restrictive mode from the start rather than chmod-ed
182
+ afterwards — between a default-mode write and the chmod there is a window
183
+ where the secret is world-readable. Through a temporary file and a rename, so a crash cannot leave the
184
+ whole file half-written. */
185
+ const staged = `${path}.${process.pid}.tmp`;
186
+ try {
187
+ await writeFile(staged, `${JSON.stringify({ ...existing, [name]: secret }, null, 2)}\n`, { mode: 0o600 });
188
+ await chmod(staged, 0o600);
189
+ await rename(staged, path);
190
+ }
191
+ catch (err) {
192
+ await rm(staged, { force: true });
193
+ throw err;
194
+ }
195
+ }
196
+ /**
197
+ * Turn a stored connection into a usable URL.
198
+ *
199
+ * Order matters and is deliberate: the environment wins because it is the
200
+ * most explicit, then the keychain because it is the best-protected, then the
201
+ * file. An inline password is used as-is but reported, so the UI can say what
202
+ * it is doing rather than leaving the user to guess.
203
+ */
204
+ export async function resolveConnection(name, storedUrl, options = {}) {
205
+ /* `secrets: false` resolves nothing: no environment expansion, no keychain,
206
+ no credentials file — the URL is used exactly as written, inline password
207
+ or none. It is the form for a URL that arrived over the network rather
208
+ than from this machine's config or command line. Every lookup here binds
209
+ a secret to a *name* or a *reference* the caller chose, so a caller who
210
+ is not the operator could name a connection "prod" and have the prod
211
+ password attached to a host of their choosing, or write `${AWS_SECRET}`
212
+ into a URL pointing at themselves. The server decides who the operator
213
+ is; this function only has to offer the switch. */
214
+ if (options.secrets === false) {
215
+ return { url: storedUrl, source: hasInlinePassword(storedUrl) ? 'inline' : 'none' };
216
+ }
217
+ // 1. Environment references, which may supply the whole URL or just part.
218
+ const expanded = expandEnv(storedUrl, options.environment);
219
+ const usedEnv = expanded !== storedUrl;
220
+ /* Anything with a host has a credential to resolve; a bare file path does
221
+ not. This tested for Postgres specifically, so any other networked
222
+ connection skipped the keychain and the credentials file entirely and
223
+ never warned about a password written into its URL. Asking whether the target *has a host* is the question that
224
+ was always meant, and it does not need editing again for the next
225
+ adapter. */
226
+ if (!/^[a-z][\w+.-]*:\/\//i.test(expanded)) {
227
+ // SQLite is a file path; there is no credential to resolve.
228
+ return { url: expanded, source: usedEnv ? 'environment' : 'none' };
229
+ }
230
+ if (hasInlinePassword(expanded)) {
231
+ return {
232
+ url: expanded,
233
+ source: usedEnv ? 'environment' : 'inline',
234
+ warning: usedEnv
235
+ ? undefined
236
+ : 'This connection has its password written into the URL. Prefer ${ENV_VAR}, or store it in the keychain.',
237
+ };
238
+ }
239
+ // 2 and 3: a URL with a user but no password can have one supplied.
240
+ let parsed;
241
+ try {
242
+ parsed = new URL(expanded);
243
+ }
244
+ catch {
245
+ return { url: expanded, source: 'none' };
246
+ }
247
+ const fromKeychain = await keychainGet(name);
248
+ if (fromKeychain) {
249
+ parsed.password = encodeURIComponent(fromKeychain);
250
+ return { url: parsed.toString(), source: 'keychain' };
251
+ }
252
+ const file = await readCredentials(options.credentialsFile);
253
+ if (file[name]) {
254
+ parsed.password = encodeURIComponent(file[name]);
255
+ return { url: parsed.toString(), source: 'file' };
256
+ }
257
+ // No password anywhere. Postgres may still accept it — peer auth, trust,
258
+ // or a ~/.pgpass the driver reads itself — so this is not an error.
259
+ return { url: expanded, source: 'none' };
260
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The cache a config file can name beside its databases:
3
+ *
4
+ * { "name": "cache", "kind": "cache", "url": "valkeys://cache.internal:6379/0",
5
+ * "auth": { "password": "${VALKEY_PASSWORD}" } }
6
+ *
7
+ * A cache (Valkey, or anything speaking its protocol) keeps what may vanish: cached API answers and rate-limit
8
+ * windows, shared by every instance. Not a source of truth, optional, and a deployment has one. Checked when the
9
+ * file is read, opened when first used. The credential is a `${VAR}` reference expanded only when it opens, as an
10
+ * HTTP connection's is, never logged, and written back on save exactly as it was read.
11
+ *
12
+ * The other services (search, webhooks, email, identity) are the App framework's: serviceConnections.ts.
13
+ */
14
+ import { type EgressPolicy } from '../adapters/http/egress.js';
15
+ import { ValkeyCacheStore } from '../adapters/cache/cacheStore.js';
16
+ import { type ConfigSections } from './configSections.js';
17
+ interface CacheServiceConfig {
18
+ kind: 'cache';
19
+ name: string;
20
+ /** `valkey://host:6379/0`, `valkeys://` (TLS); `redis://` and `rediss://` too. `${VAR}` references intact. */
21
+ url: string;
22
+ auth?: {
23
+ username?: string;
24
+ password: string;
25
+ };
26
+ insecure?: boolean;
27
+ allowLinkLocal?: boolean;
28
+ }
29
+ declare module './configSections.js' {
30
+ interface ServiceKinds {
31
+ cache: CacheServiceConfig;
32
+ }
33
+ }
34
+ /** What the engine reads of a config file beside `connections`: the cache. */
35
+ export declare const CACHE_SECTIONS: ConfigSections;
36
+ /** Where a cache connection dials: host, port, TLS and database, with no credential in the URL. */
37
+ export declare function cacheAddress(text: string, insecure: boolean, where: string): {
38
+ host: string;
39
+ port: number;
40
+ tls: boolean;
41
+ db: number;
42
+ };
43
+ /** The shared network policy a service's flags ask for. */
44
+ export declare const egressPolicyOf: (service: {
45
+ insecure?: boolean;
46
+ allowLinkLocal?: boolean;
47
+ }) => EgressPolicy;
48
+ /** Open the cache: a Valkey client behind the shared network policy. Nothing dials until the first command. */
49
+ export declare function openCache(service: CacheServiceConfig, onUnavailable: (message: string) => void): ValkeyCacheStore;
50
+ export {};
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The cache a config file can name beside its databases:
3
+ *
4
+ * { "name": "cache", "kind": "cache", "url": "valkeys://cache.internal:6379/0",
5
+ * "auth": { "password": "${VALKEY_PASSWORD}" } }
6
+ *
7
+ * A cache (Valkey, or anything speaking its protocol) keeps what may vanish: cached API answers and rate-limit
8
+ * windows, shared by every instance. Not a source of truth, optional, and a deployment has one. Checked when the
9
+ * file is read, opened when first used. The credential is a `${VAR}` reference expanded only when it opens, as an
10
+ * HTTP connection's is, never logged, and written back on save exactly as it was read.
11
+ *
12
+ * The other services (search, webhooks, email, identity) are the App framework's: serviceConnections.ts.
13
+ */
14
+ import { DEFAULT_POLICY } from '../adapters/http/egress.js';
15
+ import { RespClient } from '../adapters/cache/resp.js';
16
+ import { ValkeyCacheStore } from '../adapters/cache/cacheStore.js';
17
+ import { expandEnvReferences } from './auth/credentials.js';
18
+ import { SHARED_SERVICE_KEYS, checkServiceKeys, serviceWhere } from './configSections.js';
19
+ import { product } from './product.js';
20
+ const CACHE_PROTOCOLS = new Set(['valkey:', 'valkeys:', 'redis:', 'rediss:']);
21
+ const TLS_PROTOCOLS = new Set(['valkeys:', 'rediss:']);
22
+ function cacheConnectionOf(entry, path) {
23
+ const where = serviceWhere(entry, path);
24
+ checkServiceKeys(entry, 'cache', SHARED_SERVICE_KEYS, where);
25
+ const url = String(entry.url);
26
+ // A URL that is still a reference is checked when it opens, once the environment has said what it is.
27
+ if (!url.includes('${'))
28
+ cacheAddress(url, entry.insecure === true, where);
29
+ return {
30
+ kind: 'cache',
31
+ name: String(entry.name),
32
+ url,
33
+ ...(entry.insecure === true ? { insecure: true } : {}),
34
+ ...(entry.allowLinkLocal === true ? { allowLinkLocal: true } : {}),
35
+ ...(entry.auth !== undefined ? { auth: cacheAuth(entry.auth, where) } : {}),
36
+ };
37
+ }
38
+ /** What the engine reads of a config file beside `connections`: the cache. */
39
+ export const CACHE_SECTIONS = {
40
+ kinds: {
41
+ cache: {
42
+ singleton: 'cache',
43
+ parse: cacheConnectionOf,
44
+ entry: ({ kind, name, url, auth, insecure, allowLinkLocal }) => ({
45
+ name,
46
+ kind,
47
+ url,
48
+ ...(auth ? { auth } : {}),
49
+ ...(insecure === true ? { insecure: true } : {}),
50
+ ...(allowLinkLocal === true ? { allowLinkLocal: true } : {}),
51
+ }),
52
+ },
53
+ },
54
+ checks: [],
55
+ top: {},
56
+ };
57
+ function cacheAuth(value, where) {
58
+ const auth = value;
59
+ const keys = auth && typeof auth === 'object' && !Array.isArray(auth) ? Object.keys(auth).sort().join(',') : '';
60
+ if ((keys === 'password' || keys === 'password,username') &&
61
+ typeof auth.password === 'string' &&
62
+ auth.password &&
63
+ (auth.username === undefined || (typeof auth.username === 'string' && auth.username))) {
64
+ return { ...(typeof auth.username === 'string' ? { username: auth.username } : {}), password: auth.password };
65
+ }
66
+ throw new Error(`${where} has an "auth" ${product()} cannot read. Write { "password": "\${VALKEY_PASSWORD}" }, with a "username" for an ACL user.`);
67
+ }
68
+ /** Where a cache connection dials: host, port, TLS and database, with no credential in the URL. */
69
+ export function cacheAddress(text, insecure, where) {
70
+ let url;
71
+ try {
72
+ url = new URL(text);
73
+ }
74
+ catch {
75
+ throw new Error(`${where} has a "url" that is not a URL.`);
76
+ }
77
+ if (!CACHE_PROTOCOLS.has(url.protocol)) {
78
+ throw new Error(`${where} has a ${url.protocol}// "url". A cache is valkeys:// (TLS) or valkey://; redis:// and rediss:// work too.`);
79
+ }
80
+ const tls = TLS_PROTOCOLS.has(url.protocol);
81
+ if (!tls && !insecure) {
82
+ throw new Error(`${where} has a plain ${url.protocol}// "url". Use valkeys:// (TLS), or set "insecure": true for a cache on a trusted network.`);
83
+ }
84
+ if (url.username || url.password)
85
+ throw new Error(`${where} has a credential in its "url"; it belongs in "auth".`);
86
+ if (url.search || url.hash)
87
+ throw new Error(`${where} has a query or fragment in its "url".`);
88
+ const db = url.pathname.replace(/^\//, '');
89
+ if (db && !/^\d{1,2}$/.test(db))
90
+ throw new Error(`${where} names database "${db}" in its "url"; a cache database is a number (0–15).`);
91
+ return { host: url.hostname.replace(/^\[|\]$/g, ''), port: url.port ? Number(url.port) : 6379, tls, db: db ? Number(db) : 0 };
92
+ }
93
+ /** The shared network policy a service's flags ask for. */
94
+ export const egressPolicyOf = (service) => ({
95
+ ...DEFAULT_POLICY,
96
+ insecure: service.insecure === true,
97
+ allowLinkLocal: service.allowLinkLocal === true,
98
+ });
99
+ /** Open the cache: a Valkey client behind the shared network policy. Nothing dials until the first command. */
100
+ export function openCache(service, onUnavailable) {
101
+ const where = `connection "${service.name}"`;
102
+ const address = cacheAddress(expandEnvReferences(service.url), service.insecure === true, where);
103
+ const client = new RespClient({
104
+ ...address,
105
+ ...(service.auth?.username ? { username: expandEnvReferences(service.auth.username) } : {}),
106
+ ...(service.auth ? { password: expandEnvReferences(service.auth.password) } : {}),
107
+ policy: egressPolicyOf(service),
108
+ });
109
+ return new ValkeyCacheStore(client, (message) => onUnavailable(`cache "${service.name}": ${message}`));
110
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * The command line, read: every flag `tablewalk` takes, into one Options
3
+ * value, with the environment variables that stand in for flags in a
4
+ * container. `USAGE` in cli/usage.ts says the same list in words, and
5
+ * test/prose.test.ts holds the two and the README to each other.
6
+ */
7
+ import { type ProxyRange } from '../http/trust.js';
8
+ import type { PoolerMode } from '../../adapters/poolMetrics.js';
9
+ /**
10
+ * The variable `mistri check` and a build set on the child that validates (build.ts `checkApp`): the real
11
+ * validation, run as CI runs it, and not a spelling of the command line.
12
+ */
13
+ export declare const CHECK_VALIDATION = "MISTRI_CHECK_VALIDATION";
14
+ export interface Options {
15
+ target: string;
16
+ /** The target is DATABASE_URL's, not a flag's: a config's connections win over it (readStartupConfig). */
17
+ targetFromEnvironment?: boolean;
18
+ port: number;
19
+ host: string;
20
+ schemas: string[];
21
+ open: boolean;
22
+ config?: string;
23
+ noConfig: boolean;
24
+ /** `--no-live`: no change rows written, no `/api/live` (live/liveBinding.ts). */
25
+ noLive?: boolean;
26
+ /** `--db-latency <ms>`: each database round trip waits this long first, in development (adapters/dbLatency.ts). */
27
+ dbLatency?: string;
28
+ /** Extra names the `Host` header may carry. See `doorRefusal`. */
29
+ allowedHosts: string[];
30
+ /** Speak MCP over stdio instead of serving HTTP. For coding agents. */
31
+ mcp: boolean;
32
+ /** Serve the dev observer at /_mistri/observe: loopback only, memory only (observe/observer.ts). */
33
+ dev?: boolean;
34
+ outputSchema: boolean;
35
+ tools: string;
36
+ /** Print the schema in this format and exit: md, mermaid, or json. */
37
+ export?: string;
38
+ /** Required for local OpenAPI export; no implicit integer wire policy. */
39
+ apiIntegers?: string;
40
+ apiReads?: boolean;
41
+ apiRequestsPerMinute?: string;
42
+ /** Speak one App's API as MCP tools on stdio; the token comes from the environment. */
43
+ appMcp?: boolean;
44
+ /** Report on the shape and exit: text or json. */
45
+ lint?: string;
46
+ /** Write a drafted TypeScript App project for the active connection into this directory, then exit. */
47
+ scaffoldApp?: string;
48
+ /** With --scaffold-app: the App's name, instead of one read off the database file's. */
49
+ name?: string;
50
+ /** Draft an HTTP connection's description from this OpenAPI JSON spec, print it, and exit. */
51
+ fromOpenapi?: string;
52
+ /** Serve the API this OpenAPI spec (a file or URL) describes, as a connection. */
53
+ openapi?: string;
54
+ /** With --openapi: the API's base URL, over the spec's servers. */
55
+ apiUrl?: string;
56
+ /** With --openapi: the variable holding a bearer token. */
57
+ apiTokenEnv?: string;
58
+ /** Validate the loaded app(s) against their connections, report, and exit: the validation step of `mistri check`,
59
+ run as its child (CHECK_VALIDATION), never a flag of a person's. */
60
+ checkApp?: boolean;
61
+ /** With `mistri check`: write each App's authority.lock from what it grants now. */
62
+ writeAuthority?: boolean;
63
+ /** With `mistri check`: move these commands' contracts to their next version in authority.lock (commandContracts.ts). */
64
+ bump?: string[];
65
+ /** With --app: index the searched resources (all, or the one named), then exit. '' means all. */
66
+ reindex?: string;
67
+ /** With `lint`, the severity at which the exit code turns non-zero. */
68
+ failOn?: string;
69
+ /** Build a throwaway demo database and open it — an instant try with no
70
+ database of your own. */
71
+ demo: boolean;
72
+ /** Whether a port was named explicitly; if not, a busy default rolls on. */
73
+ portGiven: boolean;
74
+ /** Print the usage and stop. */
75
+ help: boolean;
76
+ /** Print the version and stop. */
77
+ version: boolean;
78
+ /** A flag we do not know, kept so the error can name it. */
79
+ unknown?: string;
80
+ /** Compare the active connection with this one and exit. */
81
+ diff?: string;
82
+ /**
83
+ * The header a reverse proxy sets with the signed-in user's identity
84
+ * (`X-Forwarded-User`, `Cf-Access-Authenticated-User-Email`). Set, every
85
+ * request from beyond loopback must carry it and come from an
86
+ * `--auth-proxy-from` address, and every write is journaled with it. Not authentication — the proxy did that — but the
87
+ * line that lets the proxy's decision reach this process.
88
+ */
89
+ authProxyHeader?: string;
90
+ /** A retired spelling was given (a flag or variable renamed before 1.0): startup refuses it with this sentence. */
91
+ retired?: string;
92
+ /**
93
+ * `--trust-proxy` values as given, then (after startup validates them) the
94
+ * ranges: proxies whose X-Forwarded-For the public form rate limit may believe.
95
+ * Loopback is trusted without them. Nothing to do with sign-in: identity is `authProxyFrom`.
96
+ */
97
+ trustProxy: string[];
98
+ /**
99
+ * `--auth-proxy-from` values as given, then (after startup validates them) `authProxies`: the peers, beside
100
+ * loopback, whose `--auth-proxy-header` value is believed. Its own list so that a wide `--trust-proxy` never
101
+ * makes every peer in it able to name the signed-in person.
102
+ */
103
+ authProxyFrom: string[];
104
+ authProxies?: ProxyRange[];
105
+ /** `--trust-proxy-hops` as given; startup validates it (parseClientAddressPolicy). */
106
+ trustProxyHops?: string;
107
+ /** `--trust-proxy-cloudflare`: read CF-Connecting-IP. */
108
+ trustProxyCloudflare: boolean;
109
+ /** `--insecure-http-sign-in`: serve sign-in at an http address beyond this machine, which is otherwise refused. */
110
+ insecureHttpSignIn?: boolean;
111
+ trustedProxies?: ProxyRange[];
112
+ /** Serve an app: a directory whose app.ts (or app.mjs / app.json) curates the UI. */
113
+ apps?: string[];
114
+ /** With one --app: its manifest file, when it is not the directory's own app.ts; the directory stays the App's root. */
115
+ appEntry?: string;
116
+ /** `--mount <app>=<path>` as written, by App id: `/` is the main App at the root (shared/mount.ts). Checked in main. */
117
+ mounts?: Record<string, string>;
118
+ /** `--base-path` (or MISTRI_BASE_PATH) as written: the path a reverse proxy serves this server under. Checked in main. */
119
+ basePath?: string;
120
+ commands?: string;
121
+ /** A server-only defineJobs module: durable jobs that run the App's commands. */
122
+ jobs?: string;
123
+ policy?: string;
124
+ /** `--read-pool` as written: PostgreSQL readers per database for every pool that names none. Checked in main. */
125
+ readPool?: string;
126
+ /** `--write-pool` as written: writers per database for an App's PostgreSQL source. Checked in main. */
127
+ writePool?: string;
128
+ /** `--lock-timeout` as written: seconds a writer waits for a lock. Checked in main. */
129
+ lockTimeout?: string;
130
+ /** `--pooler` as written: what sits between this process and PostgreSQL. Checked in main. */
131
+ pooler?: string;
132
+ /** `--drain-delay` as written: seconds /readyz fails before the listener closes on SIGTERM. Checked by shutdownTimings. */
133
+ drainDelay?: string;
134
+ /** `--shutdown-grace` as written: seconds a response still unfinished after the drain may keep the process. Checked by shutdownTimings. */
135
+ shutdownGrace?: string;
136
+ /**
137
+ * Not a flag: set by `createHandler` (embed/handler.ts), whose server
138
+ * runs inside somebody else's process. A startup refusal throws instead of
139
+ * exiting it, and links are minted for the host's own origin. `origins` are
140
+ * its `embed.origins`, carried on the listener's `Bound` (http/trust.ts).
141
+ */
142
+ embedded?: {
143
+ publicURL: string;
144
+ origins?: readonly string[];
145
+ };
146
+ }
147
+ export declare function parseArgs(argv: string[]): Options;
148
+ /** Cloud Run gives a stopping instance 10 seconds in all, so the default drains nothing and cuts a stuck response at 10. */
149
+ export declare const DEFAULT_SHUTDOWN_TIMINGS: {
150
+ readonly drainMs: 0;
151
+ readonly graceMs: 10000;
152
+ };
153
+ /**
154
+ * What `--drain-delay` and `--shutdown-grace` (or MISTRI_DRAIN_DELAY and
155
+ * MISTRI_SHUTDOWN_GRACE) name, in milliseconds, or the sentence saying why
156
+ * they cannot be used. The delay is the beat a balancer that probes /readyz
157
+ * needs between the first 503 and the listener closing; the grace bounds a
158
+ * response that never finishes once the rest has drained. They come one after
159
+ * the other, so a platform's stop timeout must hold both plus the drain.
160
+ */
161
+ export declare function shutdownTimings(opts: Pick<Options, 'drainDelay' | 'shutdownGrace'>): {
162
+ drainMs: number;
163
+ graceMs: number;
164
+ } | string;
165
+ /**
166
+ * The process-wide pool defaults `--read-pool`, `--write-pool`, `--pooler`
167
+ * and `--lock-timeout` (or their variables) name, or the sentence saying why
168
+ * they cannot be used. Refused rather than clamped: a pod sized for 16
169
+ * readers that quietly got 4 is a capacity plan nobody can see failing.
170
+ */
171
+ export declare function postgresPoolFlags(opts: Pick<Options, 'readPool' | 'writePool' | 'pooler' | 'lockTimeout'>): {
172
+ readers?: number;
173
+ writers?: number;
174
+ pooler?: PoolerMode;
175
+ lockTimeoutMs?: number;
176
+ } | string;