@malloy-publisher/server 0.0.229 → 0.0.230

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 (51) hide show
  1. package/dist/app/api-doc.yaml +18 -9
  2. package/dist/app/assets/{EnvironmentPage-QOoHiVeJ.js → EnvironmentPage-wa_EPkwK.js} +1 -1
  3. package/dist/app/assets/{HomePage-C71GOfVW.js → HomePage-jnCrupQp.js} +1 -1
  4. package/dist/app/assets/{LightMode-CrgCAwLe.js → LightMode-DYbwNULZ.js} +1 -1
  5. package/dist/app/assets/{MainPage-BG5__FN3.js → MainPage-CuJLrPNI.js} +1 -1
  6. package/dist/app/assets/{MaterializationsPage-DE6PnrDR.js → MaterializationsPage-D_67x2ee.js} +1 -1
  7. package/dist/app/assets/{ModelPage-CcBjcbLm.js → ModelPage-D5JtAWqR.js} +1 -1
  8. package/dist/app/assets/{PackagePage-JTy3ztkB.js → PackagePage-BRwtqUSG.js} +1 -1
  9. package/dist/app/assets/{RouteError-Cymbp47a.js → RouteError-CBNNrnSD.js} +1 -1
  10. package/dist/app/assets/{ThemeEditorPage-C_nMnHr8.js → ThemeEditorPage-CTCeBneA.js} +1 -1
  11. package/dist/app/assets/{WorkbookPage-CPQu-DQx.js → WorkbookPage-SN6f1RBm.js} +1 -1
  12. package/dist/app/assets/{core-Coi3caGs.es-CSOmajHS.js → core-Dp3q5Ieu.es-CD5FvM2s.js} +1 -1
  13. package/dist/app/assets/{index-DlWCXghy.js → index-B3Nn8Vm2.js} +459 -446
  14. package/dist/app/assets/index-BLCx1EdC.js +18 -0
  15. package/dist/app/assets/{index-DxArlgRD.js → index-C_tJstcx.js} +4 -4
  16. package/dist/app/assets/{index-CcuuST2X.js → index-CfmBVB6M.js} +1 -1
  17. package/dist/app/assets/{index-CkmABCAw.js → index-DU4r7GdU.js} +435 -422
  18. package/dist/app/index.html +1 -1
  19. package/dist/package_load_worker.mjs +108 -7
  20. package/dist/server.mjs +575 -49
  21. package/package.json +12 -12
  22. package/scripts/bake-duckdb-extensions.js +5 -2
  23. package/src/config.ts +40 -0
  24. package/src/ducklake_version.spec.ts +163 -0
  25. package/src/ducklake_version.ts +153 -0
  26. package/src/errors.ts +12 -0
  27. package/src/malloy_pin_prereqs.spec.ts +25 -0
  28. package/src/mcp/skills/skills_bundle.json +1 -1
  29. package/src/server.ts +7 -0
  30. package/src/service/authorize.spec.ts +22 -0
  31. package/src/service/authorize.ts +267 -10
  32. package/src/service/authorize_integration.spec.ts +1068 -26
  33. package/src/service/connection.spec.ts +71 -0
  34. package/src/service/connection.ts +312 -25
  35. package/src/service/connection_config.spec.ts +21 -0
  36. package/src/service/connection_config.ts +15 -1
  37. package/src/service/ducklake_lazy_attach.spec.ts +110 -0
  38. package/src/service/environment.ts +43 -9
  39. package/src/service/environment_store.spec.ts +197 -12
  40. package/src/service/environment_store.ts +88 -14
  41. package/src/service/extension_fetch_policy.spec.ts +256 -0
  42. package/src/service/materialization_scheduler.spec.ts +29 -0
  43. package/src/service/materialization_service.spec.ts +119 -1
  44. package/src/service/model.spec.ts +67 -0
  45. package/src/service/model.ts +656 -31
  46. package/src/service/package.spec.ts +38 -0
  47. package/src/service/package.ts +12 -1
  48. package/src/storage/duckdb/MaterializationRepository.spec.ts +39 -2
  49. package/src/storage/duckdb/MaterializationRepository.ts +12 -0
  50. package/tests/integration/materialization/scheduler_transitions.integration.spec.ts +256 -0
  51. package/dist/app/assets/index-CM2qhQCI.js +0 -18
@@ -11,7 +11,7 @@
11
11
  href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap"
12
12
  />
13
13
  <title>Malloy Publisher</title>
14
- <script type="module" crossorigin src="/assets/index-DxArlgRD.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-C_tJstcx.js"></script>
15
15
  <link rel="stylesheet" crossorigin href="/assets/index-5eLCcNmP.css">
16
16
  </head>
17
17
  <body>
@@ -11468,6 +11468,8 @@ function internalErrorToHttpError(error) {
11468
11468
  return httpError(404, error.message);
11469
11469
  } else if (error instanceof ConnectionAuthError) {
11470
11470
  return httpError(422, error.message);
11471
+ } else if (error instanceof UnsupportedCatalogFormatError) {
11472
+ return httpError(422, error.message);
11471
11473
  } else if (error instanceof ModelCompilationError) {
11472
11474
  return httpError(424, error.message);
11473
11475
  } else if (error instanceof ConnectionError) {
@@ -11497,7 +11499,7 @@ function httpError(code, message) {
11497
11499
  }
11498
11500
  };
11499
11501
  }
11500
- var NotImplementedError, BadRequestError, EnvironmentNotFoundError, PackageNotFoundError, ModelNotFoundError, ConnectionNotFoundError, ConnectionError, ConnectionAuthError, ModelCompilationError, FrozenConfigError, AccessDeniedError, NotQueryableError, MaterializationNotFoundError, MaterializationConflictError, InvalidStateTransitionError, ServiceUnavailableError, PayloadTooLargeError, QueryTimeoutError;
11502
+ var NotImplementedError, BadRequestError, EnvironmentNotFoundError, PackageNotFoundError, ModelNotFoundError, ConnectionNotFoundError, ConnectionError, ConnectionAuthError, UnsupportedCatalogFormatError, ModelCompilationError, FrozenConfigError, AccessDeniedError, NotQueryableError, MaterializationNotFoundError, MaterializationConflictError, InvalidStateTransitionError, ServiceUnavailableError, PayloadTooLargeError, QueryTimeoutError;
11501
11503
  var init_errors = __esm(() => {
11502
11504
  init_constants();
11503
11505
  NotImplementedError = class NotImplementedError extends Error {
@@ -11540,6 +11542,11 @@ var init_errors = __esm(() => {
11540
11542
  super(message);
11541
11543
  }
11542
11544
  };
11545
+ UnsupportedCatalogFormatError = class UnsupportedCatalogFormatError extends Error {
11546
+ constructor(message) {
11547
+ super(message);
11548
+ }
11549
+ };
11543
11550
  ModelCompilationError = class ModelCompilationError extends Error {
11544
11551
  constructor(error) {
11545
11552
  super(error.message);
@@ -11668,24 +11675,95 @@ init_errors();
11668
11675
  init_errors();
11669
11676
  var SOURCE_PREFIX = "#(authorize)";
11670
11677
  var FILE_PREFIX = "##(authorize)";
11671
- function buildAuthorizeProbe(exprs) {
11678
+ function buildAuthorizeProbe(exprs, givenDecls = []) {
11672
11679
  const selects = exprs.map((expr, i) => `__auth_${i} is (${expr})`).join(`
11673
11680
  `);
11674
- return `run: duckdb.sql("SELECT 1 AS __authorize_probe_row") -> {
11681
+ const givenBlock = givenDecls.length > 0 ? `given:
11682
+ ${givenDecls.map((g) => ` ${g.name} :: ${g.type}`).join(`
11683
+ `)}
11684
+
11685
+ ` : "";
11686
+ return `${givenBlock}run: duckdb.sql("SELECT 1 AS __authorize_probe_row") -> {
11675
11687
  select:
11676
11688
  ${selects}
11677
11689
  limit: 1
11678
11690
  }`;
11679
11691
  }
11692
+ var GIVEN_REF_PATTERN = /\$([A-Za-z_][A-Za-z0-9_]*)/g;
11693
+ var STRING_LITERAL_PATTERN = /'(?:\\.|[^'\\])*'/g;
11694
+ function referencedGivenNames(expr) {
11695
+ const scanned = expr.replace(STRING_LITERAL_PATTERN, "''");
11696
+ const names = [];
11697
+ const seen = new Set;
11698
+ for (const match of scanned.matchAll(GIVEN_REF_PATTERN)) {
11699
+ const name = match[1];
11700
+ if (!seen.has(name)) {
11701
+ seen.add(name);
11702
+ names.push(name);
11703
+ }
11704
+ }
11705
+ return names;
11706
+ }
11707
+ function inferGivenType(value) {
11708
+ if (typeof value === "string")
11709
+ return "string";
11710
+ if (typeof value === "number" || typeof value === "bigint")
11711
+ return "number";
11712
+ if (typeof value === "boolean")
11713
+ return "boolean";
11714
+ if (value instanceof Date)
11715
+ return "timestamp";
11716
+ if (Array.isArray(value)) {
11717
+ if (value.length === 0)
11718
+ return null;
11719
+ const elementType = inferGivenType(value[0]);
11720
+ return elementType ? `${elementType}[]` : null;
11721
+ }
11722
+ return null;
11723
+ }
11724
+ function bindProbeGivens(expr, givens, declaredTypes) {
11725
+ const decls = [];
11726
+ const bound = {};
11727
+ for (const name of referencedGivenNames(expr)) {
11728
+ if (!(name in givens))
11729
+ continue;
11730
+ const value = givens[name];
11731
+ const type = declaredTypes?.get(name) ?? inferGivenType(value);
11732
+ if (!type)
11733
+ continue;
11734
+ decls.push({ name, type });
11735
+ bound[name] = value;
11736
+ }
11737
+ return { decls, bound };
11738
+ }
11680
11739
  function isProbeTrue(cell) {
11681
11740
  return cell === true || cell === 1 || cell === "true";
11682
11741
  }
11683
- async function evaluateAuthorize(executor, exprs, givens) {
11742
+ async function runProbe(executor, probeText, givens) {
11743
+ const result = await executor.loadQuery(probeText).run({ rowLimit: 1, givens });
11744
+ const row = result?.data?.value?.[0];
11745
+ return !!(row && isProbeTrue(row.__auth_0));
11746
+ }
11747
+ async function evaluateAuthorize(executor, exprs, givens, declaredTypes, options) {
11748
+ const selfContainedFirst = options?.selfContainedFirst ?? false;
11684
11749
  for (const expr of exprs) {
11750
+ if (selfContainedFirst) {
11751
+ if (await evaluateSelfContainedFirst(executor, expr, givens, declaredTypes)) {
11752
+ return true;
11753
+ }
11754
+ continue;
11755
+ }
11685
11756
  try {
11686
- const result = await executor.loadQuery(buildAuthorizeProbe([expr])).run({ rowLimit: 1, givens });
11687
- const row = result?.data?.value?.[0];
11688
- if (row && isProbeTrue(row.__auth_0)) {
11757
+ if (await runProbe(executor, buildAuthorizeProbe([expr]), givens)) {
11758
+ return true;
11759
+ }
11760
+ continue;
11761
+ } catch {}
11762
+ try {
11763
+ const { decls, bound } = bindProbeGivens(expr, givens, declaredTypes);
11764
+ if (decls.length === 0)
11765
+ continue;
11766
+ if (await runProbe(executor, buildAuthorizeProbe([expr], decls), bound)) {
11689
11767
  return true;
11690
11768
  }
11691
11769
  } catch {
@@ -11694,6 +11772,29 @@ async function evaluateAuthorize(executor, exprs, givens) {
11694
11772
  }
11695
11773
  return false;
11696
11774
  }
11775
+ async function evaluateSelfContainedFirst(executor, expr, givens, declaredTypes) {
11776
+ const referenced = referencedGivenNames(expr);
11777
+ if (referenced.length === 0) {
11778
+ try {
11779
+ return await runProbe(executor, buildAuthorizeProbe([expr]), {});
11780
+ } catch {
11781
+ return false;
11782
+ }
11783
+ }
11784
+ const { decls, bound } = bindProbeGivens(expr, givens, declaredTypes);
11785
+ if (decls.length !== referenced.length) {
11786
+ return false;
11787
+ }
11788
+ try {
11789
+ return await runProbe(executor, buildAuthorizeProbe([expr], decls), bound);
11790
+ } catch {
11791
+ try {
11792
+ return await runProbe(executor, buildAuthorizeProbe([expr]), givens);
11793
+ } catch {
11794
+ return false;
11795
+ }
11796
+ }
11797
+ }
11697
11798
  async function validateAuthorizeProbes(compiler, sources) {
11698
11799
  for (const source of sources) {
11699
11800
  const exprs = source.authorize;