@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.
- package/LICENSE +21 -0
- package/README.md +17 -2
- package/dist/adapters/adapter.d.ts +693 -0
- package/dist/adapters/adapter.js +444 -0
- package/dist/adapters/cache/cacheStore.d.ts +75 -0
- package/dist/adapters/cache/cacheStore.js +160 -0
- package/dist/adapters/cache/resp.d.ts +52 -0
- package/dist/adapters/cache/resp.js +237 -0
- package/dist/adapters/commands/canonicalJson.d.ts +19 -0
- package/dist/adapters/commands/canonicalJson.js +154 -0
- package/dist/adapters/connect.d.ts +29 -0
- package/dist/adapters/connect.js +40 -0
- package/dist/adapters/connectionBudget.d.ts +101 -0
- package/dist/adapters/connectionBudget.js +128 -0
- package/dist/adapters/dbLatency.d.ts +35 -0
- package/dist/adapters/dbLatency.js +79 -0
- package/dist/adapters/epochCache.d.ts +50 -0
- package/dist/adapters/epochCache.js +85 -0
- package/dist/adapters/http/egress.d.ts +48 -0
- package/dist/adapters/http/egress.js +175 -0
- package/dist/adapters/http/httpAdapter.d.ts +71 -0
- package/dist/adapters/http/httpAdapter.js +512 -0
- package/dist/adapters/http/httpDescription.d.ts +32 -0
- package/dist/adapters/http/httpDescription.js +246 -0
- package/dist/adapters/http/openapi.d.ts +98 -0
- package/dist/adapters/http/openapi.js +487 -0
- package/dist/adapters/layoutRefusal.d.ts +24 -0
- package/dist/adapters/layoutRefusal.js +35 -0
- package/dist/adapters/net/networkPolicy.d.ts +44 -0
- package/dist/adapters/net/networkPolicy.js +123 -0
- package/dist/adapters/net/untrustedDatabase.d.ts +18 -0
- package/dist/adapters/net/untrustedDatabase.js +120 -0
- package/dist/adapters/poolAdmission.d.ts +43 -0
- package/dist/adapters/poolAdmission.js +184 -0
- package/dist/adapters/poolMetrics.d.ts +121 -0
- package/dist/adapters/poolMetrics.js +185 -0
- package/dist/adapters/postgres.d.ts +436 -0
- package/dist/adapters/postgres.js +1890 -0
- package/dist/adapters/postgresCatalog.d.ts +96 -0
- package/dist/adapters/postgresCatalog.js +387 -0
- package/dist/adapters/postgresCatalogDigest.d.ts +30 -0
- package/dist/adapters/postgresCatalogDigest.js +87 -0
- package/dist/adapters/postgresCatalogRows.d.ts +62 -0
- package/dist/adapters/postgresCatalogRows.js +37 -0
- package/dist/adapters/postgresDates.d.ts +1 -0
- package/dist/adapters/postgresDates.js +39 -0
- package/dist/adapters/postgresMaintenance.d.ts +33 -0
- package/dist/adapters/postgresMaintenance.js +179 -0
- package/dist/adapters/postgresPool.d.ts +255 -0
- package/dist/adapters/postgresPool.js +838 -0
- package/dist/adapters/postgresPooler.d.ts +28 -0
- package/dist/adapters/postgresPooler.js +267 -0
- package/dist/adapters/postgresReadCatalog.d.ts +31 -0
- package/dist/adapters/postgresReadCatalog.js +226 -0
- package/dist/adapters/postgresReadSnapshot.d.ts +46 -0
- package/dist/adapters/postgresReadSnapshot.js +133 -0
- package/dist/adapters/postgresSchemaEpoch.d.ts +24 -0
- package/dist/adapters/postgresSchemaEpoch.js +149 -0
- package/dist/adapters/postgresTransactionHandle.d.ts +173 -0
- package/dist/adapters/postgresTransactionHandle.js +524 -0
- package/dist/adapters/postgresValues.d.ts +30 -0
- package/dist/adapters/postgresValues.js +75 -0
- package/dist/adapters/replicas.d.ts +70 -0
- package/dist/adapters/replicas.js +208 -0
- package/dist/adapters/reservedSql.d.ts +38 -0
- package/dist/adapters/reservedSql.js +264 -0
- package/dist/adapters/rolePrivileges.d.ts +17 -0
- package/dist/adapters/rolePrivileges.js +22 -0
- package/dist/adapters/scoped/keyRows.d.ts +65 -0
- package/dist/adapters/scoped/keyRows.js +173 -0
- package/dist/adapters/scoped/postgresScopeCatalog.d.ts +16 -0
- package/dist/adapters/scoped/postgresScopeCatalog.js +117 -0
- package/dist/adapters/scoped/scopedCommandOperations.d.ts +5 -0
- package/dist/adapters/scoped/scopedCommandOperations.js +48 -0
- package/dist/adapters/scoped/scopedReads.d.ts +20 -0
- package/dist/adapters/scoped/scopedReads.js +174 -0
- package/dist/adapters/scoped/scopedTransaction.d.ts +89 -0
- package/dist/adapters/scoped/scopedTransaction.js +303 -0
- package/dist/adapters/scoped/sqliteScopeCatalog.d.ts +16 -0
- package/dist/adapters/scoped/sqliteScopeCatalog.js +241 -0
- package/dist/adapters/scoped/updateGuard.d.ts +3 -0
- package/dist/adapters/scoped/updateGuard.js +40 -0
- package/dist/adapters/serverSettings.d.ts +45 -0
- package/dist/adapters/serverSettings.js +46 -0
- package/dist/adapters/sqlite.d.ts +262 -0
- package/dist/adapters/sqlite.js +1434 -0
- package/dist/adapters/sqliteCostlyReads.d.ts +33 -0
- package/dist/adapters/sqliteCostlyReads.js +49 -0
- package/dist/adapters/sqliteDecimals.d.ts +22 -0
- package/dist/adapters/sqliteDecimals.js +57 -0
- package/dist/adapters/sqliteHandles.d.ts +43 -0
- package/dist/adapters/sqliteHandles.js +143 -0
- package/dist/adapters/sqliteStatementProcess.d.ts +29 -0
- package/dist/adapters/sqliteStatementProcess.js +131 -0
- package/dist/adapters/statementControl.d.ts +34 -0
- package/dist/adapters/statementControl.js +90 -0
- package/dist/adapters/storeHost.d.ts +130 -0
- package/dist/adapters/storeHost.js +13 -0
- package/dist/adapters/telemetry/drivers.d.ts +21 -0
- package/dist/adapters/telemetry/drivers.js +321 -0
- package/dist/adapters/telemetry/metrics.d.ts +63 -0
- package/dist/adapters/telemetry/metrics.js +122 -0
- package/dist/adapters/telemetry/otlp.d.ts +12 -0
- package/dist/adapters/telemetry/otlp.js +320 -0
- package/dist/adapters/telemetry/otlpEncode.d.ts +48 -0
- package/dist/adapters/telemetry/otlpEncode.js +366 -0
- package/dist/adapters/telemetry/otlpEnv.d.ts +1 -0
- package/dist/adapters/telemetry/otlpEnv.js +12 -0
- package/dist/adapters/telemetry/serverTiming.d.ts +83 -0
- package/dist/adapters/telemetry/serverTiming.js +503 -0
- package/dist/adapters/telemetry/start.d.ts +10 -0
- package/dist/adapters/telemetry/start.js +25 -0
- package/dist/adapters/telemetry/statement.d.ts +16 -0
- package/dist/adapters/telemetry/statement.js +134 -0
- package/dist/adapters/telemetry/trace.d.ts +127 -0
- package/dist/adapters/telemetry/trace.js +295 -0
- package/dist/adapters/writeAhead.d.ts +27 -0
- package/dist/adapters/writeAhead.js +46 -0
- package/dist/adapters/writeAttribution.d.ts +18 -0
- package/dist/adapters/writeAttribution.js +23 -0
- package/dist/adapters/writeCapture.d.ts +73 -0
- package/dist/adapters/writeCapture.js +20 -0
- package/dist/adapters/writeLanes.d.ts +94 -0
- package/dist/adapters/writeLanes.js +232 -0
- package/dist/engine.d.ts +15 -0
- package/dist/engine.js +13 -0
- package/dist/server/auth/credentials.d.ts +61 -0
- package/dist/server/auth/credentials.js +260 -0
- package/dist/server/cacheService.d.ts +50 -0
- package/dist/server/cacheService.js +110 -0
- package/dist/server/cli/args.d.ts +176 -0
- package/dist/server/cli/args.js +342 -0
- package/dist/server/cli/bin.d.ts +5 -0
- package/dist/server/cli/bin.js +66 -0
- package/dist/server/cli/browser.d.ts +15 -0
- package/dist/server/cli/browser.js +37 -0
- package/dist/server/cli/config.d.ts +50 -0
- package/dist/server/cli/config.js +206 -0
- package/dist/server/cli/startup.d.ts +36 -0
- package/dist/server/cli/startup.js +128 -0
- package/dist/server/cli/startupOptions.d.ts +63 -0
- package/dist/server/cli/startupOptions.js +143 -0
- package/dist/server/cli/subcommand.d.ts +28 -0
- package/dist/server/cli/subcommand.js +32 -0
- package/dist/server/cli/usage.d.ts +13 -0
- package/dist/server/cli/usage.js +31 -0
- package/dist/server/clientHttp.d.ts +184 -0
- package/dist/server/clientHttp.js +700 -0
- package/dist/server/clientSurface.d.ts +128 -0
- package/dist/server/clientSurface.js +182 -0
- package/dist/server/columnGrants.d.ts +103 -0
- package/dist/server/columnGrants.js +730 -0
- package/dist/server/compileCache.d.ts +1 -0
- package/dist/server/compileCache.js +30 -0
- package/dist/server/config/locations.d.ts +1 -0
- package/dist/server/config/locations.js +15 -0
- package/dist/server/configPaths.d.ts +7 -0
- package/dist/server/configPaths.js +34 -0
- package/dist/server/configSections.d.ts +64 -0
- package/dist/server/configSections.js +72 -0
- package/dist/server/connectionRedaction.d.ts +30 -0
- package/dist/server/connectionRedaction.js +77 -0
- package/dist/server/connections.d.ts +353 -0
- package/dist/server/connections.js +978 -0
- package/dist/server/constraints.d.ts +82 -0
- package/dist/server/constraints.js +169 -0
- package/dist/server/demo.d.ts +9 -0
- package/dist/server/demo.js +554 -0
- package/dist/server/devclient.d.ts +108 -0
- package/dist/server/devclient.js +361 -0
- package/dist/server/evidence.d.ts +55 -0
- package/dist/server/evidence.js +323 -0
- package/dist/server/hiddenColumns.d.ts +32 -0
- package/dist/server/hiddenColumns.js +238 -0
- package/dist/server/http/baselineHeaders.d.ts +24 -0
- package/dist/server/http/baselineHeaders.js +12 -0
- package/dist/server/http/captured.d.ts +35 -0
- package/dist/server/http/captured.js +73 -0
- package/dist/server/http/clock.d.ts +1 -0
- package/dist/server/http/clock.js +14 -0
- package/dist/server/http/connectionSource.d.ts +4 -0
- package/dist/server/http/connectionSource.js +48 -0
- package/dist/server/http/context.d.ts +189 -0
- package/dist/server/http/context.js +11 -0
- package/dist/server/http/crawlerText.d.ts +15 -0
- package/dist/server/http/crawlerText.js +32 -0
- package/dist/server/http/dataRoutes.d.ts +88 -0
- package/dist/server/http/dataRoutes.js +137 -0
- package/dist/server/http/door.d.ts +57 -0
- package/dist/server/http/door.js +39 -0
- package/dist/server/http/exportRoute.d.ts +15 -0
- package/dist/server/http/exportRoute.js +320 -0
- package/dist/server/http/firstPaint.d.ts +108 -0
- package/dist/server/http/firstPaint.js +262 -0
- package/dist/server/http/httpOperationRoutes.d.ts +11 -0
- package/dist/server/http/httpOperationRoutes.js +50 -0
- package/dist/server/http/pageReads.d.ts +20 -0
- package/dist/server/http/pageReads.js +205 -0
- package/dist/server/http/pageRoutes.d.ts +39 -0
- package/dist/server/http/pageRoutes.js +291 -0
- package/dist/server/http/probes.d.ts +22 -0
- package/dist/server/http/probes.js +27 -0
- package/dist/server/http/rateLimit.d.ts +131 -0
- package/dist/server/http/rateLimit.js +351 -0
- package/dist/server/http/readRoutes.d.ts +9 -0
- package/dist/server/http/readRoutes.js +131 -0
- package/dist/server/http/readRouting.d.ts +20 -0
- package/dist/server/http/readRouting.js +80 -0
- package/dist/server/http/recordCompose.d.ts +67 -0
- package/dist/server/http/recordCompose.js +167 -0
- package/dist/server/http/recordWrites.d.ts +89 -0
- package/dist/server/http/recordWrites.js +298 -0
- package/dist/server/http/refusalReport.d.ts +38 -0
- package/dist/server/http/refusalReport.js +63 -0
- package/dist/server/http/reply.d.ts +130 -0
- package/dist/server/http/reply.js +394 -0
- package/dist/server/http/requestOrigin.d.ts +11 -0
- package/dist/server/http/requestOrigin.js +8 -0
- package/dist/server/http/router.d.ts +45 -0
- package/dist/server/http/router.js +22 -0
- package/dist/server/http/serverCore.d.ts +68 -0
- package/dist/server/http/serverCore.js +177 -0
- package/dist/server/http/traceRequest.d.ts +30 -0
- package/dist/server/http/traceRequest.js +224 -0
- package/dist/server/http/trust.d.ts +261 -0
- package/dist/server/http/trust.js +472 -0
- package/dist/server/http/writeRefusal.d.ts +33 -0
- package/dist/server/http/writeRefusal.js +24 -0
- package/dist/server/httpConnection.d.ts +49 -0
- package/dist/server/httpConnection.js +170 -0
- package/dist/server/impact.d.ts +55 -0
- package/dist/server/impact.js +47 -0
- package/dist/server/journal.d.ts +134 -0
- package/dist/server/journal.js +398 -0
- package/dist/server/keysetReadHttp.d.ts +52 -0
- package/dist/server/keysetReadHttp.js +85 -0
- package/dist/server/layouts.d.ts +49 -0
- package/dist/server/layouts.js +192 -0
- package/dist/server/migrate/cli.d.ts +55 -0
- package/dist/server/migrate/cli.js +517 -0
- package/dist/server/migrate/database.d.ts +37 -0
- package/dist/server/migrate/database.js +247 -0
- package/dist/server/migrate/desired.d.ts +76 -0
- package/dist/server/migrate/desired.js +292 -0
- package/dist/server/migrate/files.d.ts +34 -0
- package/dist/server/migrate/files.js +141 -0
- package/dist/server/migrate/flyway.d.ts +7 -0
- package/dist/server/migrate/flyway.js +69 -0
- package/dist/server/migrate/history.d.ts +70 -0
- package/dist/server/migrate/history.js +211 -0
- package/dist/server/migrate/runner.d.ts +100 -0
- package/dist/server/migrate/runner.js +409 -0
- package/dist/server/migrate/snapshot.d.ts +30 -0
- package/dist/server/migrate/snapshot.js +239 -0
- package/dist/server/migrate/target.d.ts +33 -0
- package/dist/server/migrate/target.js +82 -0
- package/dist/server/openapiDraft.d.ts +25 -0
- package/dist/server/openapiDraft.js +171 -0
- package/dist/server/operations/diagnostics.d.ts +101 -0
- package/dist/server/operations/diagnostics.js +284 -0
- package/dist/server/operations/requestMetrics.d.ts +33 -0
- package/dist/server/operations/requestMetrics.js +94 -0
- package/dist/server/packageVersion.d.ts +1 -0
- package/dist/server/packageVersion.js +11 -0
- package/dist/server/poolConfig.d.ts +34 -0
- package/dist/server/poolConfig.js +114 -0
- package/dist/server/product.d.ts +20 -0
- package/dist/server/product.js +12 -0
- package/dist/server/recordHistoryOperations.d.ts +39 -0
- package/dist/server/recordHistoryOperations.js +43 -0
- package/dist/server/recordWriteOperations.d.ts +111 -0
- package/dist/server/recordWriteOperations.js +329 -0
- package/dist/server/resourceReadHttp.d.ts +81 -0
- package/dist/server/resourceReadHttp.js +606 -0
- package/dist/server/resourceReadOperations.d.ts +147 -0
- package/dist/server/resourceReadOperations.js +452 -0
- package/dist/server/scaffoldMachine.d.ts +54 -0
- package/dist/server/scaffoldMachine.js +184 -0
- package/dist/server/seed/cli.d.ts +20 -0
- package/dist/server/seed/cli.js +164 -0
- package/dist/server/seed/lexicon.d.ts +26 -0
- package/dist/server/seed/lexicon.js +585 -0
- package/dist/server/seed/seed.d.ts +70 -0
- package/dist/server/seed/seed.js +779 -0
- package/dist/server/seed/words.d.ts +21 -0
- package/dist/server/seed/words.js +164 -0
- package/dist/server/serverRequests.d.ts +6 -0
- package/dist/server/serverRequests.js +33 -0
- package/dist/server/serverTimeouts.d.ts +33 -0
- package/dist/server/serverTimeouts.js +32 -0
- package/dist/server/shapeonly.d.ts +32 -0
- package/dist/server/shapeonly.js +110 -0
- package/dist/server/startupWarnings.d.ts +32 -0
- package/dist/server/startupWarnings.js +92 -0
- package/dist/shared/addressParams.d.ts +28 -0
- package/dist/shared/addressParams.js +47 -0
- package/dist/shared/appCards.d.ts +123 -0
- package/dist/shared/appCards.js +385 -0
- package/dist/shared/appComponents.d.ts +177 -0
- package/dist/shared/appComponents.js +422 -0
- package/dist/shared/appDocuments.d.ts +43 -0
- package/dist/shared/appDocuments.js +131 -0
- package/dist/shared/appEmbeds.d.ts +21 -0
- package/dist/shared/appEmbeds.js +24 -0
- package/dist/shared/appIcons.d.ts +28 -0
- package/dist/shared/appIcons.js +223 -0
- package/dist/shared/appLinks.d.ts +17 -0
- package/dist/shared/appLinks.js +124 -0
- package/dist/shared/appListColumns.d.ts +3 -0
- package/dist/shared/appListColumns.js +66 -0
- package/dist/shared/appLocale.d.ts +36 -0
- package/dist/shared/appLocale.js +86 -0
- package/dist/shared/appMessages.d.ts +44 -0
- package/dist/shared/appMessages.js +78 -0
- package/dist/shared/appNoun.d.ts +21 -0
- package/dist/shared/appNoun.js +32 -0
- package/dist/shared/autoBucket.d.ts +98 -0
- package/dist/shared/autoBucket.js +305 -0
- package/dist/shared/autoValues.d.ts +25 -0
- package/dist/shared/autoValues.js +25 -0
- package/dist/shared/breakdown.d.ts +228 -0
- package/dist/shared/breakdown.js +557 -0
- package/dist/shared/breakdowntext.d.ts +41 -0
- package/dist/shared/breakdowntext.js +400 -0
- package/dist/shared/builtInThemes.d.ts +2 -0
- package/dist/shared/builtInThemes.js +771 -0
- package/dist/shared/chartSeparation.d.ts +11 -0
- package/dist/shared/chartSeparation.js +58 -0
- package/dist/shared/clauses.d.ts +22 -0
- package/dist/shared/clauses.js +97 -0
- package/dist/shared/columnCaption.d.ts +16 -0
- package/dist/shared/columnCaption.js +90 -0
- package/dist/shared/commandFieldPath.d.ts +2 -0
- package/dist/shared/commandFieldPath.js +7 -0
- package/dist/shared/commandWire.d.ts +26 -0
- package/dist/shared/commandWire.js +41 -0
- package/dist/shared/computed.d.ts +161 -0
- package/dist/shared/computed.js +378 -0
- package/dist/shared/computedParse.d.ts +13 -0
- package/dist/shared/computedParse.js +278 -0
- package/dist/shared/computedValue.d.ts +47 -0
- package/dist/shared/computedValue.js +191 -0
- package/dist/shared/connection.d.ts +30 -0
- package/dist/shared/connection.js +1 -0
- package/dist/shared/csv.d.ts +20 -0
- package/dist/shared/csv.js +63 -0
- package/dist/shared/dashLayout.d.ts +30 -0
- package/dist/shared/dashLayout.js +132 -0
- package/dist/shared/dashboardAsks.d.ts +93 -0
- package/dist/shared/dashboardAsks.js +129 -0
- package/dist/shared/dashboardTrend.d.ts +20 -0
- package/dist/shared/dashboardTrend.js +50 -0
- package/dist/shared/declaredReferences.d.ts +50 -0
- package/dist/shared/declaredReferences.js +202 -0
- package/dist/shared/definedFields.d.ts +63 -0
- package/dist/shared/definedFields.js +103 -0
- package/dist/shared/definedValues.d.ts +63 -0
- package/dist/shared/definedValues.js +184 -0
- package/dist/shared/displayDefaults.d.ts +135 -0
- package/dist/shared/displayDefaults.js +529 -0
- package/dist/shared/dueDate.d.ts +6 -0
- package/dist/shared/dueDate.js +6 -0
- package/dist/shared/duration.d.ts +4 -0
- package/dist/shared/duration.js +23 -0
- package/dist/shared/fileBounds.d.ts +9 -0
- package/dist/shared/fileBounds.js +9 -0
- package/dist/shared/filter.d.ts +217 -0
- package/dist/shared/filter.js +305 -0
- package/dist/shared/firstPaint.d.ts +24 -0
- package/dist/shared/firstPaint.js +33 -0
- package/dist/shared/form.d.ts +21 -0
- package/dist/shared/form.js +25 -0
- package/dist/shared/formValues.d.ts +104 -0
- package/dist/shared/formValues.js +352 -0
- package/dist/shared/funnel.d.ts +45 -0
- package/dist/shared/funnel.js +108 -0
- package/dist/shared/httpOperations.d.ts +48 -0
- package/dist/shared/httpOperations.js +9 -0
- package/dist/shared/iconGlyphs.d.ts +4 -0
- package/dist/shared/iconGlyphs.js +151 -0
- package/dist/shared/iconWeights.d.ts +3 -0
- package/dist/shared/iconWeights.js +162 -0
- package/dist/shared/imageWidths.d.ts +32 -0
- package/dist/shared/imageWidths.js +38 -0
- package/dist/shared/keysetPage.d.ts +64 -0
- package/dist/shared/keysetPage.js +161 -0
- package/dist/shared/like.d.ts +20 -0
- package/dist/shared/like.js +29 -0
- package/dist/shared/listEmpty.d.ts +12 -0
- package/dist/shared/listEmpty.js +36 -0
- package/dist/shared/listFilters.d.ts +28 -0
- package/dist/shared/listFilters.js +84 -0
- package/dist/shared/listPresentations.d.ts +199 -0
- package/dist/shared/listPresentations.js +7 -0
- package/dist/shared/listQuestion.d.ts +52 -0
- package/dist/shared/listQuestion.js +137 -0
- package/dist/shared/lookPalettes.d.ts +62 -0
- package/dist/shared/lookPalettes.js +306 -0
- package/dist/shared/maskQuoted.d.ts +24 -0
- package/dist/shared/maskQuoted.js +48 -0
- package/dist/shared/mentionLabel.d.ts +19 -0
- package/dist/shared/mentionLabel.js +38 -0
- package/dist/shared/mentionLookup.d.ts +17 -0
- package/dist/shared/mentionLookup.js +64 -0
- package/dist/shared/menuCounts.d.ts +16 -0
- package/dist/shared/menuCounts.js +74 -0
- package/dist/shared/model.d.ts +79 -0
- package/dist/shared/model.js +153 -0
- package/dist/shared/money.d.ts +44 -0
- package/dist/shared/money.js +81 -0
- package/dist/shared/moneyEntry.d.ts +7 -0
- package/dist/shared/moneyEntry.js +27 -0
- package/dist/shared/mount.d.ts +118 -0
- package/dist/shared/mount.js +248 -0
- package/dist/shared/niceTicks.d.ts +26 -0
- package/dist/shared/niceTicks.js +50 -0
- package/dist/shared/order.d.ts +59 -0
- package/dist/shared/order.js +133 -0
- package/dist/shared/page.d.ts +135 -0
- package/dist/shared/page.js +1187 -0
- package/dist/shared/pageAnatomy.d.ts +99 -0
- package/dist/shared/pageAnatomy.js +370 -0
- package/dist/shared/pageConfig.d.ts +25 -0
- package/dist/shared/pageConfig.js +1308 -0
- package/dist/shared/pageEmptyActions.d.ts +12 -0
- package/dist/shared/pageEmptyActions.js +20 -0
- package/dist/shared/pageLayouts.d.ts +72 -0
- package/dist/shared/pageLayouts.js +205 -0
- package/dist/shared/pageModel.d.ts +785 -0
- package/dist/shared/pageModel.js +121 -0
- package/dist/shared/pagePaths.d.ts +180 -0
- package/dist/shared/pagePaths.js +869 -0
- package/dist/shared/pagePlans.d.ts +52 -0
- package/dist/shared/pagePlans.js +108 -0
- package/dist/shared/pageRoutes.d.ts +9 -0
- package/dist/shared/pageRoutes.js +9 -0
- package/dist/shared/query.d.ts +166 -0
- package/dist/shared/query.js +1302 -0
- package/dist/shared/queryDates.d.ts +12 -0
- package/dist/shared/queryDates.js +101 -0
- package/dist/shared/queryOperands.d.ts +99 -0
- package/dist/shared/queryOperands.js +131 -0
- package/dist/shared/reads.d.ts +103 -0
- package/dist/shared/reads.js +154 -0
- package/dist/shared/recordLabel.d.ts +51 -0
- package/dist/shared/recordLabel.js +123 -0
- package/dist/shared/recordReadKeys.d.ts +30 -0
- package/dist/shared/recordReadKeys.js +51 -0
- package/dist/shared/recordReads.d.ts +268 -0
- package/dist/shared/recordReads.js +368 -0
- package/dist/shared/recordview.d.ts +198 -0
- package/dist/shared/recordview.js +356 -0
- package/dist/shared/referenceModel.d.ts +58 -0
- package/dist/shared/referenceModel.js +194 -0
- package/dist/shared/refusal.d.ts +64 -0
- package/dist/shared/refusal.js +144 -0
- package/dist/shared/relatedCreate.d.ts +30 -0
- package/dist/shared/relatedCreate.js +162 -0
- package/dist/shared/resourceHttp.d.ts +464 -0
- package/dist/shared/resourceHttp.js +1 -0
- package/dist/shared/richText.d.ts +85 -0
- package/dist/shared/richText.js +305 -0
- package/dist/shared/rollups.d.ts +143 -0
- package/dist/shared/rollups.js +64 -0
- package/dist/shared/rowScope.d.ts +72 -0
- package/dist/shared/rowScope.js +376 -0
- package/dist/shared/runtimeTables.d.ts +44 -0
- package/dist/shared/runtimeTables.js +79 -0
- package/dist/shared/schema.d.ts +523 -0
- package/dist/shared/schema.js +627 -0
- package/dist/shared/schematext.d.ts +38 -0
- package/dist/shared/schematext.js +101 -0
- package/dist/shared/scopeCatalog.d.ts +29 -0
- package/dist/shared/scopeCatalog.js +468 -0
- package/dist/shared/servedApp.d.ts +681 -0
- package/dist/shared/servedApp.js +45 -0
- package/dist/shared/sessionLease.d.ts +34 -0
- package/dist/shared/sessionLease.js +3 -0
- package/dist/shared/shape.d.ts +55 -0
- package/dist/shared/shape.js +168 -0
- package/dist/shared/slug.d.ts +1 -0
- package/dist/shared/slug.js +12 -0
- package/dist/shared/sortText.d.ts +14 -0
- package/dist/shared/sortText.js +26 -0
- package/dist/shared/sqlRelation.d.ts +4 -0
- package/dist/shared/sqlRelation.js +8 -0
- package/dist/shared/sqlsaved.d.ts +44 -0
- package/dist/shared/sqlsaved.js +63 -0
- package/dist/shared/stitchedPaths.d.ts +27 -0
- package/dist/shared/stitchedPaths.js +38 -0
- package/dist/shared/structuredFilter.d.ts +22 -0
- package/dist/shared/structuredFilter.js +1 -0
- package/dist/shared/subtitlePath.d.ts +20 -0
- package/dist/shared/subtitlePath.js +24 -0
- package/dist/shared/suggest.d.ts +18 -0
- package/dist/shared/suggest.js +59 -0
- package/dist/shared/tableSizing.d.ts +4 -0
- package/dist/shared/tableSizing.js +9 -0
- package/dist/shared/tagLists.d.ts +57 -0
- package/dist/shared/tagLists.js +34 -0
- package/dist/shared/textRules.d.ts +54 -0
- package/dist/shared/textRules.js +133 -0
- package/dist/shared/theme.d.ts +94 -0
- package/dist/shared/theme.js +800 -0
- package/dist/shared/themeColor.d.ts +34 -0
- package/dist/shared/themeColor.js +109 -0
- package/dist/shared/themeFaces.d.ts +30 -0
- package/dist/shared/themeFaces.js +42 -0
- package/dist/shared/themeInk.d.ts +20 -0
- package/dist/shared/themeInk.js +52 -0
- package/dist/shared/themeLooks.d.ts +9 -0
- package/dist/shared/themeLooks.js +572 -0
- package/dist/shared/themeParts.d.ts +26 -0
- package/dist/shared/themeParts.js +71 -0
- package/dist/shared/themePartsCheck.d.ts +21 -0
- package/dist/shared/themePartsCheck.js +91 -0
- package/dist/shared/themePresets.d.ts +85 -0
- package/dist/shared/themePresets.js +139 -0
- package/dist/shared/themeRecipeWords.d.ts +156 -0
- package/dist/shared/themeRecipeWords.js +156 -0
- package/dist/shared/themeRecipes.d.ts +213 -0
- package/dist/shared/themeRecipes.js +234 -0
- package/dist/shared/themeResolve.d.ts +55 -0
- package/dist/shared/themeResolve.js +52 -0
- package/dist/shared/themeTokens.d.ts +107 -0
- package/dist/shared/themeTokens.js +116 -0
- package/dist/shared/themeType.d.ts +38 -0
- package/dist/shared/themeType.js +205 -0
- package/dist/shared/unitWord.d.ts +4 -0
- package/dist/shared/unitWord.js +37 -0
- package/dist/shared/view.d.ts +195 -0
- package/dist/shared/view.js +987 -0
- package/dist/shared/viewLabels.d.ts +47 -0
- package/dist/shared/viewLabels.js +459 -0
- package/dist/shared/viewPaths.d.ts +248 -0
- package/dist/shared/viewPaths.js +294 -0
- package/dist/shared/viewtext.d.ts +57 -0
- package/dist/shared/viewtext.js +282 -0
- package/dist/shared/vocabulary.d.ts +71 -0
- package/dist/shared/vocabulary.js +249 -0
- package/dist/shared/weekStart.d.ts +7 -0
- package/dist/shared/weekStart.js +36 -0
- package/mark.svg +1 -0
- package/package.json +261 -4
- package/schema/model.d.ts +298 -0
- package/schema/theme.d.ts +587 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
type SpanKind = 'internal' | 'server' | 'client' | 'producer' | 'consumer';
|
|
2
|
+
export type AttributeValue = string | number | boolean | readonly string[] | readonly number[];
|
|
3
|
+
type Attributes = Readonly<Record<string, AttributeValue>>;
|
|
4
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
5
|
+
interface SpanLink {
|
|
6
|
+
readonly traceId: string;
|
|
7
|
+
readonly spanId: string;
|
|
8
|
+
readonly attributes?: Attributes;
|
|
9
|
+
}
|
|
10
|
+
/** One finished (or, for `onStart`, begun) span, as every sink sees it. Times are epoch milliseconds, fractional. */
|
|
11
|
+
export interface SpanRecord {
|
|
12
|
+
readonly traceId: string;
|
|
13
|
+
readonly spanId: string;
|
|
14
|
+
readonly parentSpanId?: string;
|
|
15
|
+
/** The parent came from another process (a `traceparent` header): this span is the local root. */
|
|
16
|
+
readonly remoteParent: boolean;
|
|
17
|
+
readonly traceState?: string;
|
|
18
|
+
/** Settable until the span ends: a request is named once its route is known. */
|
|
19
|
+
name: string;
|
|
20
|
+
readonly kind: SpanKind;
|
|
21
|
+
readonly startTime: number;
|
|
22
|
+
endTime?: number;
|
|
23
|
+
readonly attributes: Record<string, AttributeValue>;
|
|
24
|
+
readonly events: Array<{
|
|
25
|
+
name: string;
|
|
26
|
+
time: number;
|
|
27
|
+
attributes: Attributes;
|
|
28
|
+
}>;
|
|
29
|
+
readonly links: readonly SpanLink[];
|
|
30
|
+
status: {
|
|
31
|
+
code: 'unset' | 'ok' | 'error';
|
|
32
|
+
message?: string;
|
|
33
|
+
};
|
|
34
|
+
/** Whether the exporter keeps it: the sampler's word at the trace's root. The observer keeps every span. */
|
|
35
|
+
readonly sampled: boolean;
|
|
36
|
+
/** Dev-only detail. Empty unless a sink asked for it. Never exported. */
|
|
37
|
+
readonly detail: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
/** A structured log line: `message` and `attributes` travel, `detail` stays local like a span's. */
|
|
40
|
+
export interface LogRecord {
|
|
41
|
+
readonly time: number;
|
|
42
|
+
readonly level: LogLevel;
|
|
43
|
+
/** What wrote it: `http`, `commands`, `jobs`, `app` (an App's own console), `startup`… */
|
|
44
|
+
readonly source: string;
|
|
45
|
+
readonly message: string;
|
|
46
|
+
readonly attributes: Attributes;
|
|
47
|
+
readonly traceId?: string;
|
|
48
|
+
readonly spanId?: string;
|
|
49
|
+
readonly sampled?: boolean;
|
|
50
|
+
readonly detail?: Record<string, unknown>;
|
|
51
|
+
/** A line only the local observer may keep (the App's console, which says anything). */
|
|
52
|
+
readonly local?: boolean;
|
|
53
|
+
}
|
|
54
|
+
interface TelemetrySink {
|
|
55
|
+
/** Hand this sink the spans' `detail` and local log lines. Only the dev observer may. */
|
|
56
|
+
readonly local?: boolean;
|
|
57
|
+
onStart?(span: SpanRecord): void;
|
|
58
|
+
onEnd(span: SpanRecord): void;
|
|
59
|
+
onLog?(record: LogRecord): void;
|
|
60
|
+
}
|
|
61
|
+
export interface Span {
|
|
62
|
+
readonly traceId: string;
|
|
63
|
+
readonly spanId: string;
|
|
64
|
+
readonly recording: boolean;
|
|
65
|
+
setAttribute(key: string, value: AttributeValue | undefined): void;
|
|
66
|
+
/** Rename the span before it ends: a request's route is known only once its address is read. */
|
|
67
|
+
rename(name: string): void;
|
|
68
|
+
/** Drop the span: it ends and no sink hears of it (a heartbeat, the observer's own requests). */
|
|
69
|
+
discard(): void;
|
|
70
|
+
setAttributes(values: Readonly<Record<string, AttributeValue | undefined>>): void;
|
|
71
|
+
/** Local detail, built only when a local sink listens. */
|
|
72
|
+
detail(build: () => Record<string, unknown>): void;
|
|
73
|
+
event(name: string, attributes?: Readonly<Record<string, AttributeValue | undefined>>): void;
|
|
74
|
+
/** The span failed. `code` is what travels (a refusal code, an error class); the error itself stays local. */
|
|
75
|
+
fail(code: string, error?: unknown): void;
|
|
76
|
+
end(): void;
|
|
77
|
+
}
|
|
78
|
+
/** Whether anything listens. The one check every instrumented path makes first. */
|
|
79
|
+
export declare const tracing: () => boolean;
|
|
80
|
+
/** Whether a local sink (the dev observer) listens, so local detail is worth building. */
|
|
81
|
+
export declare const observing: () => boolean;
|
|
82
|
+
export declare function addSink(sink: TelemetrySink): () => void;
|
|
83
|
+
export declare function setSampler(decide: (traceId: string) => boolean): void;
|
|
84
|
+
interface TraceParent {
|
|
85
|
+
traceId: string;
|
|
86
|
+
spanId: string;
|
|
87
|
+
sampled: boolean;
|
|
88
|
+
traceState?: string;
|
|
89
|
+
}
|
|
90
|
+
interface SpanOptions {
|
|
91
|
+
kind?: SpanKind;
|
|
92
|
+
attributes?: Readonly<Record<string, AttributeValue | undefined>>;
|
|
93
|
+
/** A parent from elsewhere: an incoming `traceparent`, a job's enqueuer. Ignored when a span is already current. */
|
|
94
|
+
remote?: TraceParent;
|
|
95
|
+
links?: readonly SpanLink[];
|
|
96
|
+
/** Start only inside an existing span: a statement outside any request, job or command is not worth a trace. */
|
|
97
|
+
childOnly?: boolean;
|
|
98
|
+
}
|
|
99
|
+
/** Begin a span; the caller ends it. Prefer `inSpan`, which also makes it current. */
|
|
100
|
+
export declare function startSpan(name: string, options?: SpanOptions): Span;
|
|
101
|
+
/** Run `work` inside `span`, so every span begun beneath it is its child. */
|
|
102
|
+
export declare function withSpan<T>(span: Span, work: () => T): T;
|
|
103
|
+
/**
|
|
104
|
+
* Run `work` as a span: current for everything it starts, ended when it
|
|
105
|
+
* settles, failed when it throws. The error's class names the failure unless
|
|
106
|
+
* `failure` says otherwise (a refusal's code).
|
|
107
|
+
*/
|
|
108
|
+
export declare function inSpan<T>(name: string, options: SpanOptions, work: (span: Span) => T, failure?: (error: unknown) => string): T;
|
|
109
|
+
/** An error's travelling name: its `code` when it is one of ours (a refusal's), else its class. Never its message. */
|
|
110
|
+
export declare function errorCode(error: unknown): string;
|
|
111
|
+
export declare function currentSpan(): Span | undefined;
|
|
112
|
+
/** Carry the current trace on an outgoing request's headers (W3C Trace Context). */
|
|
113
|
+
export declare function injectTrace(headers: Record<string, string>): Record<string, string>;
|
|
114
|
+
/** Read a W3C `traceparent` (and its `tracestate`), refusing anything malformed rather than guessing. */
|
|
115
|
+
export declare function parseTraceparent(header: unknown, state?: unknown): TraceParent | undefined;
|
|
116
|
+
/**
|
|
117
|
+
* One structured log line, correlated with the current span. The terminal's
|
|
118
|
+
* own lines are left as they are; this is the structured version, for the
|
|
119
|
+
* exporter and the observer. `message` and `attributes` travel: write them
|
|
120
|
+
* from the code's own words.
|
|
121
|
+
*/
|
|
122
|
+
export declare function log(level: LogLevel, source: string, message: string, options?: {
|
|
123
|
+
attributes?: Readonly<Record<string, AttributeValue | undefined>>;
|
|
124
|
+
detail?: () => Record<string, unknown>;
|
|
125
|
+
local?: boolean;
|
|
126
|
+
}): void;
|
|
127
|
+
export {};
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spans and logs, for whoever is listening — and nothing at all when nobody is.
|
|
3
|
+
*
|
|
4
|
+
* Two listeners exist. The OpenTelemetry exporter (otlp.ts) is switched on by
|
|
5
|
+
* the standard OTEL_* environment variables and sends what it is given to a
|
|
6
|
+
* collector, Datadog's Agent or Dynatrace. The dev observer
|
|
7
|
+
* (server/observe/) keeps the last few hundred requests in memory for the
|
|
8
|
+
* author at work. Both hear the same spans, so what the observer shows is
|
|
9
|
+
* what production exports, plus the detail production must never see.
|
|
10
|
+
*
|
|
11
|
+
* That split is the privacy rule, made structural rather than remembered:
|
|
12
|
+
*
|
|
13
|
+
* - `attributes` travel. They are set only from values the code itself names
|
|
14
|
+
* — a route template, a statement's kind and table, a command's id, a
|
|
15
|
+
* refusal's code, a count — never from a request, a row, a parameter, a
|
|
16
|
+
* body, an email or a token. They follow the OpenTelemetry semantic
|
|
17
|
+
* conventions where one exists.
|
|
18
|
+
* - `detail` does not. It is where the SQL with its parameters, a command's
|
|
19
|
+
* input and output and a refusal's recorded cause go, and only a sink that
|
|
20
|
+
* asks for it (the dev observer, loopback only, dev only) is handed it.
|
|
21
|
+
* With no such sink, `detail` is never even built: callers pass a function.
|
|
22
|
+
*
|
|
23
|
+
* With no sink at all, `inSpan` calls its function and returns: no id is
|
|
24
|
+
* drawn, no clock read, no context entered. `npx tablewalk` pays one boolean.
|
|
25
|
+
*/
|
|
26
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
27
|
+
import { randomBytes } from 'node:crypto';
|
|
28
|
+
const NOOP = Object.freeze({
|
|
29
|
+
traceId: '',
|
|
30
|
+
spanId: '',
|
|
31
|
+
recording: false,
|
|
32
|
+
setAttribute() { },
|
|
33
|
+
rename() { },
|
|
34
|
+
discard() { },
|
|
35
|
+
setAttributes() { },
|
|
36
|
+
detail() { },
|
|
37
|
+
event() { },
|
|
38
|
+
fail() { },
|
|
39
|
+
end() { },
|
|
40
|
+
});
|
|
41
|
+
const sinks = [];
|
|
42
|
+
let local = false;
|
|
43
|
+
const storage = new AsyncLocalStorage();
|
|
44
|
+
/** The sampler: whether a new trace is exported. Always on until the exporter says otherwise. */
|
|
45
|
+
let sampler = () => true;
|
|
46
|
+
/** Whether anything listens. The one check every instrumented path makes first. */
|
|
47
|
+
export const tracing = () => sinks.length > 0;
|
|
48
|
+
/** Whether a local sink (the dev observer) listens, so local detail is worth building. */
|
|
49
|
+
export const observing = () => local;
|
|
50
|
+
export function addSink(sink) {
|
|
51
|
+
sinks.push(sink);
|
|
52
|
+
local ||= sink.local === true;
|
|
53
|
+
return () => {
|
|
54
|
+
const at = sinks.indexOf(sink);
|
|
55
|
+
if (at >= 0)
|
|
56
|
+
sinks.splice(at, 1);
|
|
57
|
+
local = sinks.some((each) => each.local === true);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function setSampler(decide) {
|
|
61
|
+
sampler = decide;
|
|
62
|
+
}
|
|
63
|
+
const now = () => performance.timeOrigin + performance.now();
|
|
64
|
+
const hex = (bytes) => randomBytes(bytes).toString('hex');
|
|
65
|
+
const clean = (values) => Object.fromEntries(Object.entries(values).filter(([, value]) => value !== undefined));
|
|
66
|
+
class LiveSpan {
|
|
67
|
+
record;
|
|
68
|
+
recording = true;
|
|
69
|
+
ended = false;
|
|
70
|
+
constructor(record) {
|
|
71
|
+
this.record = record;
|
|
72
|
+
}
|
|
73
|
+
get traceId() {
|
|
74
|
+
return this.record.traceId;
|
|
75
|
+
}
|
|
76
|
+
get spanId() {
|
|
77
|
+
return this.record.spanId;
|
|
78
|
+
}
|
|
79
|
+
setAttribute(key, value) {
|
|
80
|
+
if (value !== undefined && !this.ended)
|
|
81
|
+
this.record.attributes[key] = value;
|
|
82
|
+
}
|
|
83
|
+
setAttributes(values) {
|
|
84
|
+
if (!this.ended)
|
|
85
|
+
Object.assign(this.record.attributes, clean(values));
|
|
86
|
+
}
|
|
87
|
+
rename(name) {
|
|
88
|
+
if (!this.ended)
|
|
89
|
+
this.record.name = name;
|
|
90
|
+
}
|
|
91
|
+
discarded = false;
|
|
92
|
+
discard() {
|
|
93
|
+
this.ended = true;
|
|
94
|
+
this.discarded = true;
|
|
95
|
+
}
|
|
96
|
+
detail(build) {
|
|
97
|
+
if (!local)
|
|
98
|
+
return;
|
|
99
|
+
// Detail is a courtesy to the author; building it must never fail the work it describes.
|
|
100
|
+
try {
|
|
101
|
+
Object.assign(this.record.detail, build());
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
/* left out */
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
event(name, attributes = {}) {
|
|
108
|
+
if (!this.ended)
|
|
109
|
+
this.record.events.push({ name, time: now(), attributes: clean(attributes) });
|
|
110
|
+
}
|
|
111
|
+
fail(code, error) {
|
|
112
|
+
this.record.status = { code: 'error', message: code };
|
|
113
|
+
this.record.attributes['error.type'] = code;
|
|
114
|
+
if (error !== undefined)
|
|
115
|
+
this.detail(() => ({ error: describeError(error) }));
|
|
116
|
+
}
|
|
117
|
+
end() {
|
|
118
|
+
if (this.ended)
|
|
119
|
+
return;
|
|
120
|
+
this.ended = true;
|
|
121
|
+
this.record.endTime = now();
|
|
122
|
+
for (const sink of sinks) {
|
|
123
|
+
try {
|
|
124
|
+
sink.onEnd(this.record);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
/* a sink never fails the traced work */
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** What an error was, for local eyes only: its class, its words and the reasons recorded beneath it. */
|
|
133
|
+
function describeError(error) {
|
|
134
|
+
if (!(error instanceof Error))
|
|
135
|
+
return { message: String(error) };
|
|
136
|
+
const out = { name: error.name, message: error.message };
|
|
137
|
+
const code = error.code;
|
|
138
|
+
if (typeof code === 'string')
|
|
139
|
+
out.code = code;
|
|
140
|
+
if (error.stack)
|
|
141
|
+
out.stack = error.stack.split('\n').slice(0, 12).join('\n');
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
/** Begin a span; the caller ends it. Prefer `inSpan`, which also makes it current. */
|
|
145
|
+
export function startSpan(name, options = {}) {
|
|
146
|
+
if (!sinks.length)
|
|
147
|
+
return NOOP;
|
|
148
|
+
const parent = storage.getStore();
|
|
149
|
+
if (options.childOnly && !parent)
|
|
150
|
+
return NOOP;
|
|
151
|
+
// Beneath a dropped span nothing is traced: the observer's own EXPLAIN is not a trace.
|
|
152
|
+
if (parent?.discarded)
|
|
153
|
+
return NOOP;
|
|
154
|
+
const remote = parent ? undefined : options.remote;
|
|
155
|
+
const traceId = parent?.traceId ?? remote?.traceId ?? hex(16);
|
|
156
|
+
const record = {
|
|
157
|
+
traceId,
|
|
158
|
+
spanId: hex(8),
|
|
159
|
+
parentSpanId: parent?.spanId ?? remote?.spanId,
|
|
160
|
+
remoteParent: !parent && !!remote,
|
|
161
|
+
...((parent?.record.traceState ?? remote?.traceState) ? { traceState: parent?.record.traceState ?? remote?.traceState } : {}),
|
|
162
|
+
name,
|
|
163
|
+
kind: options.kind ?? 'internal',
|
|
164
|
+
startTime: now(),
|
|
165
|
+
attributes: clean(options.attributes ?? {}),
|
|
166
|
+
events: [],
|
|
167
|
+
links: options.links ?? [],
|
|
168
|
+
status: { code: 'unset' },
|
|
169
|
+
sampled: parent ? parent.record.sampled : remote ? remote.sampled : sampler(traceId),
|
|
170
|
+
detail: {},
|
|
171
|
+
};
|
|
172
|
+
const span = new LiveSpan(record);
|
|
173
|
+
for (const sink of sinks) {
|
|
174
|
+
try {
|
|
175
|
+
sink.onStart?.(record);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
/* as above */
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return span;
|
|
182
|
+
}
|
|
183
|
+
/** Run `work` inside `span`, so every span begun beneath it is its child. */
|
|
184
|
+
export function withSpan(span, work) {
|
|
185
|
+
return span instanceof LiveSpan ? storage.run(span, work) : work();
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Run `work` as a span: current for everything it starts, ended when it
|
|
189
|
+
* settles, failed when it throws. The error's class names the failure unless
|
|
190
|
+
* `failure` says otherwise (a refusal's code).
|
|
191
|
+
*/
|
|
192
|
+
export function inSpan(name, options, work, failure = errorCode) {
|
|
193
|
+
if (!sinks.length)
|
|
194
|
+
return work(NOOP);
|
|
195
|
+
const span = startSpan(name, options);
|
|
196
|
+
if (!(span instanceof LiveSpan))
|
|
197
|
+
return work(span);
|
|
198
|
+
return storage.run(span, () => {
|
|
199
|
+
let result;
|
|
200
|
+
try {
|
|
201
|
+
result = work(span);
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
span.fail(failure(error), error);
|
|
205
|
+
span.end();
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
if (result && typeof result.then === 'function') {
|
|
209
|
+
return result.then((value) => {
|
|
210
|
+
span.end();
|
|
211
|
+
return value;
|
|
212
|
+
}, (error) => {
|
|
213
|
+
span.fail(failure(error), error);
|
|
214
|
+
span.end();
|
|
215
|
+
throw error;
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
span.end();
|
|
219
|
+
return result;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
/** An error's travelling name: its `code` when it is one of ours (a refusal's), else its class. Never its message. */
|
|
223
|
+
export function errorCode(error) {
|
|
224
|
+
const code = error?.code;
|
|
225
|
+
if (typeof code === 'string' && /^[a-z][a-z0-9_]{0,63}$/.test(code))
|
|
226
|
+
return code;
|
|
227
|
+
return error instanceof Error ? error.name || 'Error' : 'Error';
|
|
228
|
+
}
|
|
229
|
+
export function currentSpan() {
|
|
230
|
+
return storage.getStore();
|
|
231
|
+
}
|
|
232
|
+
/** The current trace, as a W3C `traceparent` header. */
|
|
233
|
+
function traceparent(span = storage.getStore()) {
|
|
234
|
+
if (!span || !(span instanceof LiveSpan))
|
|
235
|
+
return undefined;
|
|
236
|
+
return `00-${span.traceId}-${span.spanId}-${span.record.sampled ? '01' : '00'}`;
|
|
237
|
+
}
|
|
238
|
+
/** Carry the current trace on an outgoing request's headers (W3C Trace Context). */
|
|
239
|
+
export function injectTrace(headers) {
|
|
240
|
+
const span = storage.getStore();
|
|
241
|
+
const parent = traceparent(span);
|
|
242
|
+
if (!parent)
|
|
243
|
+
return headers;
|
|
244
|
+
return { ...headers, traceparent: parent, ...(span.record.traceState ? { tracestate: span.record.traceState } : {}) };
|
|
245
|
+
}
|
|
246
|
+
/** Read a W3C `traceparent` (and its `tracestate`), refusing anything malformed rather than guessing. */
|
|
247
|
+
export function parseTraceparent(header, state) {
|
|
248
|
+
if (typeof header !== 'string')
|
|
249
|
+
return undefined;
|
|
250
|
+
const match = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/.exec(header.trim());
|
|
251
|
+
if (!match || match[1] === 'ff' || /^0+$/.test(match[2]) || /^0+$/.test(match[3]))
|
|
252
|
+
return undefined;
|
|
253
|
+
const traceState = typeof state === 'string' && state.length <= 512 && /^[\x20-\x7e]*$/.test(state) ? state.trim() : undefined;
|
|
254
|
+
return { traceId: match[2], spanId: match[3], sampled: (parseInt(match[4], 16) & 1) === 1, ...(traceState ? { traceState } : {}) };
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* One structured log line, correlated with the current span. The terminal's
|
|
258
|
+
* own lines are left as they are; this is the structured version, for the
|
|
259
|
+
* exporter and the observer. `message` and `attributes` travel: write them
|
|
260
|
+
* from the code's own words.
|
|
261
|
+
*/
|
|
262
|
+
export function log(level, source, message, options = {}) {
|
|
263
|
+
if (!sinks.length)
|
|
264
|
+
return;
|
|
265
|
+
const span = storage.getStore();
|
|
266
|
+
let detail;
|
|
267
|
+
if (local && options.detail) {
|
|
268
|
+
try {
|
|
269
|
+
detail = options.detail();
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
detail = undefined;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const record = {
|
|
276
|
+
time: now(),
|
|
277
|
+
level,
|
|
278
|
+
source,
|
|
279
|
+
message,
|
|
280
|
+
attributes: clean(options.attributes ?? {}),
|
|
281
|
+
...(span ? { traceId: span.traceId, spanId: span.spanId, sampled: span.record.sampled } : {}),
|
|
282
|
+
...(detail ? { detail } : {}),
|
|
283
|
+
...(options.local ? { local: true } : {}),
|
|
284
|
+
};
|
|
285
|
+
for (const sink of sinks) {
|
|
286
|
+
if (record.local && !sink.local)
|
|
287
|
+
continue;
|
|
288
|
+
try {
|
|
289
|
+
sink.onLog?.(record);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
/* as above */
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** A record the transaction reads by its key first, and, unless only read, writes. */
|
|
2
|
+
interface WriteAheadTarget {
|
|
3
|
+
readonly table: string;
|
|
4
|
+
readonly key: Readonly<Record<string, string | number>>;
|
|
5
|
+
}
|
|
6
|
+
export interface WriteAhead {
|
|
7
|
+
/** The receipt the transaction's journal looks up before anything else (its journal's own shape; the journal checks it). */
|
|
8
|
+
readonly receipt?: unknown;
|
|
9
|
+
/** Records read by key before the work starts: locked, read in full through the row scope. */
|
|
10
|
+
readonly targets: readonly WriteAheadTarget[];
|
|
11
|
+
/** Whether those records are then written, so the write's own reads of them are sent too. */
|
|
12
|
+
readonly writes: boolean;
|
|
13
|
+
/** Records only read, never locked (a command's preparation): their rows are sent ahead, no FOR UPDATE with them. */
|
|
14
|
+
readonly readOnly?: true;
|
|
15
|
+
/** Whether the work locks each record itself first (a save's lockRecord). An unscoped transaction sends a record's
|
|
16
|
+
* lock ahead only then, or where its history capture will lock it; a scoped one always locks its targets. */
|
|
17
|
+
readonly locks?: true;
|
|
18
|
+
}
|
|
19
|
+
/** Run `work` with `hint` told to the next write transaction it opens. */
|
|
20
|
+
export declare function withWriteAhead<T>(hint: WriteAhead | undefined, work: () => T): T;
|
|
21
|
+
/** The hint for the transaction about to open here, if one was told. */
|
|
22
|
+
export declare function writeAhead(): WriteAhead | undefined;
|
|
23
|
+
/** Run `work` with no hint: a transaction's own work, so nothing it opens takes its hint. */
|
|
24
|
+
export declare function withoutWriteAhead<T>(work: () => T): T;
|
|
25
|
+
/** The hint with each target's table renamed (a tenant source's logical table to its physical one); undefined when one cannot be. */
|
|
26
|
+
export declare function renamedWriteAhead(hint: WriteAhead | undefined, rename: (table: string) => string | undefined): WriteAhead | undefined;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a write transaction is about to ask, told to the adapter before it
|
|
3
|
+
* begins, so the reads and locks it will open with leave behind its BEGIN in
|
|
4
|
+
* one round trip instead of one round trip each (postgresTransactionHandle.ts
|
|
5
|
+
* sendAhead).
|
|
6
|
+
*
|
|
7
|
+
* A hint, never an instruction: the adapter turns it into the exact
|
|
8
|
+
* statements the transaction would send in its turn, each answered once to
|
|
9
|
+
* the identical statement when it comes, and anything the transaction never
|
|
10
|
+
* asks is dropped unread. A wrong hint costs the statements it sent and is
|
|
11
|
+
* counted (aheadReport); it never changes an answer.
|
|
12
|
+
*
|
|
13
|
+
* Carried the way `inWriteLanes` carries its keys (writeLanes.ts): by the
|
|
14
|
+
* caller that knows the command, through the owners between it and the
|
|
15
|
+
* adapter, each of which may translate it (a tenant source's logical tables
|
|
16
|
+
* to physical ones) or drop it. The adapter reads it once, for the
|
|
17
|
+
* transaction it is opening, and runs that transaction's own work without
|
|
18
|
+
* it, so a transaction opened inside never takes it for its own.
|
|
19
|
+
*/
|
|
20
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
21
|
+
const hinted = new AsyncLocalStorage();
|
|
22
|
+
/** Run `work` with `hint` told to the next write transaction it opens. */
|
|
23
|
+
export function withWriteAhead(hint, work) {
|
|
24
|
+
return hinted.run(hint, work);
|
|
25
|
+
}
|
|
26
|
+
/** The hint for the transaction about to open here, if one was told. */
|
|
27
|
+
export function writeAhead() {
|
|
28
|
+
return hinted.getStore();
|
|
29
|
+
}
|
|
30
|
+
/** Run `work` with no hint: a transaction's own work, so nothing it opens takes its hint. */
|
|
31
|
+
export function withoutWriteAhead(work) {
|
|
32
|
+
return hinted.run(undefined, work);
|
|
33
|
+
}
|
|
34
|
+
/** The hint with each target's table renamed (a tenant source's logical table to its physical one); undefined when one cannot be. */
|
|
35
|
+
export function renamedWriteAhead(hint, rename) {
|
|
36
|
+
if (!hint)
|
|
37
|
+
return undefined;
|
|
38
|
+
const targets = [];
|
|
39
|
+
for (const target of hint.targets) {
|
|
40
|
+
const table = rename(target.table);
|
|
41
|
+
if (table === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
targets.push({ table, key: target.key });
|
|
44
|
+
}
|
|
45
|
+
return { ...hint, targets };
|
|
46
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const WRITE_VIAS: readonly ['app', 'workbench', 'agent', 'api', 'form', 'system'];
|
|
2
|
+
export type WriteVia = (typeof WRITE_VIAS)[number];
|
|
3
|
+
/** Who and what a write is. Set only by trusted server code around the work. */
|
|
4
|
+
interface WriteAttribution {
|
|
5
|
+
/** The verified account (its email), or none: who the write is attributed to, kept and never shown. */
|
|
6
|
+
readonly actor?: string;
|
|
7
|
+
/** Its display name at the time, as a history entry and a notice say who wrote it. Words only: never who a write is attributed to. */
|
|
8
|
+
readonly name?: string;
|
|
9
|
+
readonly via: WriteVia;
|
|
10
|
+
/** The action or command the write came from, in the App's words. */
|
|
11
|
+
readonly action?: string;
|
|
12
|
+
}
|
|
13
|
+
/** Run `work` with its writes attributed; a nested call refines the outer one. */
|
|
14
|
+
export declare function attributeWrites<T>(attribution: WriteAttribution, work: () => T): T;
|
|
15
|
+
/** Name the action or command a write came from, keeping who made it. */
|
|
16
|
+
export declare function attributeAction<T>(action: string | undefined, work: () => T): T;
|
|
17
|
+
export declare const currentWriteAttribution: () => WriteAttribution | undefined;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Who and what a write is, held around the work that makes it. It is part of
|
|
3
|
+
* the write path every server has, not of the App's record history that
|
|
4
|
+
* reads it (history/recordHistory.ts): the database MCP marks its tool calls
|
|
5
|
+
* as an agent's, the Workbench's routes name Undo, and an App's door names
|
|
6
|
+
* its person and action, all through the same frame.
|
|
7
|
+
*/
|
|
8
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
9
|
+
export const WRITE_VIAS = ['app', 'workbench', 'agent', 'api', 'form', 'system'];
|
|
10
|
+
const attributions = new AsyncLocalStorage();
|
|
11
|
+
/** Run `work` with its writes attributed; a nested call refines the outer one. */
|
|
12
|
+
export function attributeWrites(attribution, work) {
|
|
13
|
+
const outer = attributions.getStore();
|
|
14
|
+
return attributions.run(Object.freeze({ ...outer, ...attribution }), work);
|
|
15
|
+
}
|
|
16
|
+
/** Name the action or command a write came from, keeping who made it. */
|
|
17
|
+
export function attributeAction(action, work) {
|
|
18
|
+
const outer = attributions.getStore();
|
|
19
|
+
if (!action)
|
|
20
|
+
return work();
|
|
21
|
+
return attributions.run(Object.freeze({ ...(outer ?? { via: 'system' }), action }), work);
|
|
22
|
+
}
|
|
23
|
+
export const currentWriteAttribution = () => attributions.getStore();
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What rides beneath every write a dialect adapter runs, in the write's own
|
|
3
|
+
* transaction: the App framework's record history and notices
|
|
4
|
+
* (history/recordHistory.ts, inbox/inbox.ts), and live sync's one change row
|
|
5
|
+
* per transaction (live/liveChange.ts). Beneath every facade, so a scoped
|
|
6
|
+
* writer, a command and an Undo record exactly as a Save does.
|
|
7
|
+
*
|
|
8
|
+
* The adapter is the engine's and knows no store, so the capture is lent to
|
|
9
|
+
* it: the framework installs one capturer (stores/writeCaptures.ts), which
|
|
10
|
+
* says which of an adapter's tables it watches and, for one transaction,
|
|
11
|
+
* hands back the capture that wraps its writes. The adapter hands over its
|
|
12
|
+
* writer and the two reads a capture needs on it; with nothing installed,
|
|
13
|
+
* as in the database browser, no write is captured.
|
|
14
|
+
*/
|
|
15
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
16
|
+
import type { DeleteRequest, DeleteResult, InsertRequest, InsertResult, TellRequest, UpdateRequest, UpdateResult } from './adapter.js';
|
|
17
|
+
import type { PgQuery } from './postgresPool.js';
|
|
18
|
+
/** The transaction's writer, by dialect: a capture's own rows join it. */
|
|
19
|
+
type CaptureWriter = {
|
|
20
|
+
readonly dialect: 'postgres';
|
|
21
|
+
readonly client: PgQuery;
|
|
22
|
+
} | {
|
|
23
|
+
readonly dialect: 'sqlite';
|
|
24
|
+
readonly db: DatabaseSync;
|
|
25
|
+
};
|
|
26
|
+
/** What a capture reads on the writer. */
|
|
27
|
+
export interface CaptureSource {
|
|
28
|
+
readonly writer: CaptureWriter;
|
|
29
|
+
/** `lock` takes the row for the rest of the transaction (FOR UPDATE), so the before image is the one the write replaces. */
|
|
30
|
+
read(table: string, key: Record<string, string | number>, columns?: string[], lock?: boolean): Promise<Record<string, unknown> | undefined>;
|
|
31
|
+
/** Up to `limit` rows whose columns equal these values. */
|
|
32
|
+
rows(table: string, where: Record<string, string | number>, columns: string[], limit: number): Promise<Record<string, unknown>[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Where the writer sends together: `ride` runs the moment this table's
|
|
35
|
+
* UPDATE is sent, so a read it asks leaves in the update's own round trip,
|
|
36
|
+
* behind it, and reads what it wrote (postgresTransactionHandle.ts
|
|
37
|
+
* behindWrite). Answers a withdraw, true when `ride` never ran; absent, or
|
|
38
|
+
* undefined, where nothing rides.
|
|
39
|
+
*/
|
|
40
|
+
behind?(table: string, ride: () => void): (() => boolean) | undefined;
|
|
41
|
+
}
|
|
42
|
+
/** One transaction's capture: each write runs through it. */
|
|
43
|
+
interface WriteCapture {
|
|
44
|
+
insert(request: InsertRequest, write: (request: InsertRequest) => Promise<InsertResult>): Promise<InsertResult>;
|
|
45
|
+
update(request: UpdateRequest, write: (request: UpdateRequest) => Promise<UpdateResult>): Promise<UpdateResult>;
|
|
46
|
+
remove(request: DeleteRequest, write: (request: DeleteRequest) => Promise<DeleteResult>): Promise<DeleteResult>;
|
|
47
|
+
/** A flow's notify step (WriteTransaction.tell). */
|
|
48
|
+
tell(request: TellRequest): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Once, after the transaction's last operation has settled and just before
|
|
51
|
+
* COMMIT, on the same writer: what a capture keeps per transaction rather
|
|
52
|
+
* than per write (live sync's change row) is written here, so it commits or
|
|
53
|
+
* rolls back with the writes it describes. A throw rolls the transaction back.
|
|
54
|
+
*/
|
|
55
|
+
finish?(): Promise<void>;
|
|
56
|
+
/** Once, after COMMIT was acknowledged. A nudge only: it never fails the write it follows. */
|
|
57
|
+
committed?(): void;
|
|
58
|
+
}
|
|
59
|
+
interface WriteCapturer {
|
|
60
|
+
/** Whether a write to this table of this adapter is captured, so that even a lone write runs inside a transaction the capture's rows can join. */
|
|
61
|
+
captures(adapter: object, table: unknown): boolean;
|
|
62
|
+
/** This transaction's capture, or undefined where the adapter captures nothing. */
|
|
63
|
+
begin(adapter: object, source: CaptureSource): WriteCapture | undefined;
|
|
64
|
+
}
|
|
65
|
+
/** Trusted framework code, once per process. */
|
|
66
|
+
export declare function installWriteCapture(capturer: WriteCapturer): void;
|
|
67
|
+
export declare const capturesWrites: (adapter: object, table: unknown) => boolean;
|
|
68
|
+
export declare const beginWriteCapture: (adapter: object, source: CaptureSource) => WriteCapture | undefined;
|
|
69
|
+
/** The adapters' one way to end a capture: its per-transaction rows, just before COMMIT. */
|
|
70
|
+
export declare const finishWriteCapture: (capture: WriteCapture | undefined) => Promise<void>;
|
|
71
|
+
/** After COMMIT: a capture's nudge to whoever waits on committed changes. Never throws into the write. */
|
|
72
|
+
export declare const committedWriteCapture: (capture: WriteCapture | undefined) => void;
|
|
73
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
let installed;
|
|
2
|
+
/** Trusted framework code, once per process. */
|
|
3
|
+
export function installWriteCapture(capturer) {
|
|
4
|
+
installed = capturer;
|
|
5
|
+
}
|
|
6
|
+
export const capturesWrites = (adapter, table) => installed?.captures(adapter, table) ?? false;
|
|
7
|
+
export const beginWriteCapture = (adapter, source) => installed?.begin(adapter, source);
|
|
8
|
+
/** The adapters' one way to end a capture: its per-transaction rows, just before COMMIT. */
|
|
9
|
+
export const finishWriteCapture = async (capture) => {
|
|
10
|
+
await capture?.finish?.();
|
|
11
|
+
};
|
|
12
|
+
/** After COMMIT: a capture's nudge to whoever waits on committed changes. Never throws into the write. */
|
|
13
|
+
export const committedWriteCapture = (capture) => {
|
|
14
|
+
try {
|
|
15
|
+
capture?.committed?.();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
/* The write has committed; a listener's failure is its own. */
|
|
19
|
+
}
|
|
20
|
+
};
|