@malloy-publisher/server 0.0.248 → 0.0.250

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 (29) hide show
  1. package/README.docker.md +5 -0
  2. package/README.md +5 -0
  3. package/dist/app/api-doc.html +5 -0
  4. package/dist/app/api-doc.yaml +444 -31
  5. package/dist/app/assets/{EnvironmentPage-DrTRtRHz.js → EnvironmentPage-CiuWaYTk.js} +1 -1
  6. package/dist/app/assets/HomePage-ZXsmEAjw.js +1 -0
  7. package/dist/app/assets/{LightMode-4Y7DEWAD.js → LightMode-10iLdX5H.js} +1 -1
  8. package/dist/app/assets/{MainPage-DKNR-8Vr.js → MainPage-u-IAaBdE.js} +2 -2
  9. package/dist/app/assets/{MaterializationsPage-h3ONDcgJ.js → MaterializationsPage-AcoL_Rnx.js} +1 -1
  10. package/dist/app/assets/ModelPage-BjB-p4Qn.js +1 -0
  11. package/dist/app/assets/{PackagePage-D8mM4T37.js → PackagePage-le809jUO.js} +1 -1
  12. package/dist/app/assets/{RouteError-DzJ0TPOj.js → RouteError-DTlqmNQd.js} +1 -1
  13. package/dist/app/assets/{ThemeEditorPage-BYvxc5op.js → ThemeEditorPage-DrmSzweH.js} +1 -1
  14. package/dist/app/assets/{WorkbookPage-CYOpAw7I.js → WorkbookPage-CIRFZXlP.js} +1 -1
  15. package/dist/app/assets/{core-BuvlzSIX.es-cZHBIpH6.js → core-Cr-9Wkp3.es-YhIv13au.js} +10 -10
  16. package/dist/app/assets/{index-BgMR5Uuv.js → index-CM5d1afN.js} +113 -113
  17. package/dist/app/assets/{index-BgAa2J25.js → index-CSFSsus4.js} +1 -1
  18. package/dist/app/assets/index-DP4bilgp.js +615 -0
  19. package/dist/app/assets/index-DdUOWgW6.js +2 -0
  20. package/dist/app/index.html +6 -1
  21. package/dist/package_load_worker.mjs +342 -2
  22. package/dist/runtime/publisher.js +3 -0
  23. package/dist/server.mjs +4361 -257
  24. package/dist/sshcrypto-vd2k5hq9.node +0 -0
  25. package/package.json +4 -2
  26. package/dist/app/assets/HomePage-X_Wozguy.js +0 -1
  27. package/dist/app/assets/ModelPage-B8Qsrbxn.js +0 -1
  28. package/dist/app/assets/index-BwoU1Ko8.js +0 -529
  29. package/dist/app/assets/index-CuaX7xuf.js +0 -18
package/README.docker.md CHANGED
@@ -1,3 +1,8 @@
1
+ <!--
2
+ Copyright (c) Credible Data Inc.
3
+ SPDX-License-Identifier: MIT
4
+ -->
5
+
1
6
  # Publisher in Docker
2
7
 
3
8
  The canonical build is the root [`Dockerfile`](../../Dockerfile) and the CI smoke test (`docker_smoke_test` in `.github/workflows/build.yml`) builds and runs that exact image. The two-port REST + MCP server, the Snowflake ADBC driver, the DuckDB CLI, and the production app bundle all ship in it.
package/README.md CHANGED
@@ -1,3 +1,8 @@
1
+ <!--
2
+ Copyright (c) Credible Data Inc.
3
+ SPDX-License-Identifier: MIT
4
+ -->
5
+
1
6
  # Malloy Publisher Server
2
7
 
3
8
  The Malloy Publisher Server is an Express.js server that provides an API for managing and accessing Malloy data models, packages, and queries
@@ -1,4 +1,9 @@
1
1
  <!doctype html>
2
+ <!--
3
+ Copyright (c) Credible Data Inc.
4
+ SPDX-License-Identifier: MIT
5
+ -->
6
+
2
7
  <html lang="en">
3
8
  <head>
4
9
  <meta charset="utf-8" />
@@ -1,3 +1,6 @@
1
+ # Copyright (c) Credible Data Inc.
2
+ # SPDX-License-Identifier: MIT
3
+
1
4
  openapi: 3.1.0
2
5
  info:
3
6
  title: Malloy Publisher - Semantic Model Serving API
@@ -64,6 +67,10 @@ tags:
64
67
  description: Malloy model access and compilation operations
65
68
  - name: notebooks
66
69
  description: Malloy notebook access and execution operations
70
+ - name: dashboards
71
+ description:
72
+ Discovery and manifests for `# artifact` dashboards - layout, tiles, and
73
+ the given specs behind their controls
67
74
  - name: data-apps
68
75
  description:
69
76
  In-package HTML data apps (static pages served from a package's public/
@@ -1715,6 +1722,150 @@ paths:
1715
1722
  "503":
1716
1723
  $ref: "#/components/responses/ServiceUnavailable"
1717
1724
 
1725
+ /environments/{environmentName}/packages/{packageName}/dashboards:
1726
+ get:
1727
+ tags:
1728
+ - dashboards
1729
+ operationId: list-dashboards
1730
+ summary: List package dashboards
1731
+ description: |
1732
+ Lists the dashboards in the specified package — every `.malloy` file in
1733
+ the package's `dashboards/` directory that carries an `# artifact` (or
1734
+ model-level `## artifact`) annotation. A file in that directory with no
1735
+ artifact tag is a shared include and is not listed, whether or not it
1736
+ compiles.
1737
+
1738
+ A tagged dashboard that failed to compile is listed carrying its
1739
+ `error` where that state can arise at all, so a broken dashboard is
1740
+ visibly broken rather than silently absent. In practice it rarely does:
1741
+ a package whose model fails to compile is not loaded, and a reload that
1742
+ would break one is refused and leaves the previously loaded package
1743
+ serving, so `error` is only reachable on the paths that keep per-model
1744
+ placeholders. Treat it as present-but-uncommon rather than the normal
1745
+ way a broken dashboard surfaces. When the package curates its query surface
1746
+ (`queryableSources: "declared"`), a dashboard whose entry file is not in
1747
+ `explores` is omitted, because its query and given names would not be
1748
+ runnable; the omission is reported in the package's `warnings` as of the
1749
+ last load. A metadata `PATCH` that TIGHTENS curation takes effect on
1750
+ this listing immediately; one that relaxes it takes effect on the next
1751
+ package reload, because the withheld dashboards were never built into
1752
+ the cached set. Either way the matching warning is computed at load, so
1753
+ after a `PATCH` it appears only once the package reloads.
1754
+
1755
+ Where the boundary is active at all, which needs `explores` declared
1756
+ AND `queryableSources` left at `"declared"`, being listed does not by
1757
+ itself guarantee the dashboard runs: the queryable sources are the
1758
+ union of every listed file's `export {}` closure, so a dashboard whose
1759
+ tiles read a source that only an UNLISTED file exports is still served
1760
+ while those queries are refused. The fix is to list that file too, or
1761
+ to re-export the source from one already listed. It is served rather
1762
+ than withheld because withholding on a guess would hide dashboards that
1763
+ do work. Under `"all"` nothing is refused, so the situation does not
1764
+ arise.
1765
+ parameters:
1766
+ - name: environmentName
1767
+ in: path
1768
+ description: Name of the environment
1769
+ required: true
1770
+ schema:
1771
+ $ref: "#/components/schemas/IdentifierPattern"
1772
+ - name: packageName
1773
+ in: path
1774
+ description: Name of the package
1775
+ required: true
1776
+ schema:
1777
+ $ref: "#/components/schemas/IdentifierPattern"
1778
+ - name: versionId
1779
+ in: query
1780
+ description: Version identifier for the package
1781
+ required: false
1782
+ schema:
1783
+ $ref: "#/components/schemas/VersionIdPattern"
1784
+ responses:
1785
+ "200":
1786
+ description: A list of dashboards in the package
1787
+ content:
1788
+ application/json:
1789
+ schema:
1790
+ type: array
1791
+ items:
1792
+ $ref: "#/components/schemas/Dashboard"
1793
+ "401":
1794
+ $ref: "#/components/responses/Unauthorized"
1795
+ "404":
1796
+ $ref: "#/components/responses/NotFound"
1797
+ "500":
1798
+ $ref: "#/components/responses/InternalServerError"
1799
+ "501":
1800
+ $ref: "#/components/responses/NotImplemented"
1801
+ "503":
1802
+ $ref: "#/components/responses/ServiceUnavailable"
1803
+
1804
+ /environments/{environmentName}/packages/{packageName}/dashboards/{dashboardName}:
1805
+ get:
1806
+ tags:
1807
+ - dashboards
1808
+ operationId: get-dashboard
1809
+ summary: Get a dashboard manifest
1810
+ description: |
1811
+ Retrieves everything a viewer needs to render one dashboard: the artifact
1812
+ tag's declarations plus the control contract derived from the givens its
1813
+ query references. Running the dashboard needs no further endpoint — its
1814
+ query, each composite tile, and each control's suggest query all run
1815
+ through the model query endpoint with `givens`, using the manifest's
1816
+ `path` as the model.
1817
+ parameters:
1818
+ - name: environmentName
1819
+ in: path
1820
+ description: Name of the environment
1821
+ required: true
1822
+ schema:
1823
+ $ref: "#/components/schemas/IdentifierPattern"
1824
+ - name: packageName
1825
+ in: path
1826
+ description: Name of the package
1827
+ required: true
1828
+ schema:
1829
+ $ref: "#/components/schemas/IdentifierPattern"
1830
+ - name: dashboardName
1831
+ in: path
1832
+ description: >-
1833
+ The dashboard's name: its filename basename. Conventionally letters,
1834
+ digits, "-" and "_", and a package is warned when one of its SERVED
1835
+ dashboards falls outside that. A dashboard withheld by curation gets
1836
+ no naming finding, because the naming check runs after the curation
1837
+ gate and a withheld dashboard is already reported as withheld. It is NOT constrained to it, because
1838
+ the name comes from a filename rather than being chosen: a file such
1839
+ as `dashboards/v1.2.malloy` is served, and its published `resource`
1840
+ carries the name percent-encoded. Send it percent-encoded.
1841
+ required: true
1842
+ schema:
1843
+ type: string
1844
+ minLength: 1
1845
+ - name: versionId
1846
+ in: query
1847
+ description: Version identifier for the package
1848
+ required: false
1849
+ schema:
1850
+ $ref: "#/components/schemas/VersionIdPattern"
1851
+ responses:
1852
+ "200":
1853
+ description: The dashboard manifest
1854
+ content:
1855
+ application/json:
1856
+ schema:
1857
+ $ref: "#/components/schemas/DashboardManifest"
1858
+ "401":
1859
+ $ref: "#/components/responses/Unauthorized"
1860
+ "404":
1861
+ $ref: "#/components/responses/NotFound"
1862
+ "500":
1863
+ $ref: "#/components/responses/InternalServerError"
1864
+ "501":
1865
+ $ref: "#/components/responses/NotImplemented"
1866
+ "503":
1867
+ $ref: "#/components/responses/ServiceUnavailable"
1868
+
1718
1869
  /environments/{environmentName}/packages/{packageName}/notebooks:
1719
1870
  get:
1720
1871
  tags:
@@ -2854,9 +3005,19 @@ components:
2854
3005
  collision, and materialization-config problems that degrade
2855
3006
  attribution. Discovery findings: a model listed in `explores` whose
2856
3007
  export closure surfaces no sources or named queries, so it lists as
2857
- empty and renders a blank page. Server-computed and read-only:
2858
- ignored on create/update requests and only returned in responses.
2859
- Present only when there are such findings.
3008
+ empty and renders a blank page. Dashboard findings: a
3009
+ `dashboards/` file whose `# artifact` tag does not parse or does not
3010
+ describe a dashboard, a tile or suggest query that does not resolve,
3011
+ a `# drill` naming a destination that is not a dashboard, and a
3012
+ dashboard held back from the listing because its entry file is not
3013
+ in `explores`. Two dashboard findings are about Publisher rather
3014
+ than about the package: one when a file carrying an artifact tag
3015
+ could not be read and so is not served at all, and one when the lint
3016
+ stops early, in which case the list must be read as incomplete
3017
+ rather than as a clean package. Server-computed and read-only:
3018
+ ignored on
3019
+ create/update requests and only returned in responses. Present only
3020
+ when there are such findings.
2860
3021
 
2861
3022
 
2862
3023
  **Pre-aggregation contributes nothing to this array. A
@@ -2913,9 +3074,13 @@ components:
2913
3074
  type: string
2914
3075
  description: >-
2915
3076
  What the finding is about: the query or view a render finding
2916
- sits on (`by_carrier`, `flights -> by_carrier`), or the source
2917
- a materialization finding belongs to. Absent when a finding
2918
- spans several, in which case the message names them.
3077
+ sits on (`by_carrier`, `flights -> by_carrier`), the source a
3078
+ materialization finding belongs to, or, for a dashboard
3079
+ finding, the dashboard's name or the `source.dimension` a
3080
+ `# drill` is declared on. Absent when a finding sits on none
3081
+ of those, either because it spans several, in which case the
3082
+ message names them, or because it is about the lint itself
3083
+ rather than about any one dashboard.
2919
3084
  message:
2920
3085
  type: string
2921
3086
  description: A description of the problem.
@@ -2925,9 +3090,21 @@ components:
2925
3090
  - error
2926
3091
  - warn
2927
3092
  description: >-
2928
- Finding severity. Currently only `error`-severity render
2929
- findings are surfaced here; lower-severity findings remain on
2930
- the query-time `renderLogs` surface.
3093
+ Finding severity. Render findings are surfaced here only at
3094
+ `error` severity; lower-severity render findings remain on the
3095
+ query-time `renderLogs` surface. Materialization and dashboard
3096
+ findings use both: `error` for something that cannot work as
3097
+ written, such as a tile naming a view the source does not
3098
+ have, and `warn` for something that works but not as the
3099
+ author probably intended, such as a dashboard held back by
3100
+ curation. The two findings about Publisher rather than about
3101
+ the package split across both: a file that carries an artifact
3102
+ tag and could not be read is `error`, because the dashboard it
3103
+ should have produced does not exist, and a lint that stopped
3104
+ early is `warn`, because the lint failing is not itself a
3105
+ defect in the package. That `warn` does NOT mean the package is
3106
+ free of `error`-severity findings, since the ones the lint
3107
+ never reached are exactly what it cannot report.
2931
3108
  queryableSources:
2932
3109
  type: string
2933
3110
  enum:
@@ -3175,19 +3352,196 @@ components:
3175
3352
  type: object
3176
3353
  description: Malloy notebook metadata and status information
3177
3354
  properties:
3178
- resource:
3355
+ environmentName:
3179
3356
  type: string
3180
- description: Resource path to the notebook
3357
+ description: Name of the environment containing this notebook
3181
3358
  packageName:
3182
3359
  type: string
3183
3360
  description: Name of the package containing this notebook
3184
3361
  path:
3185
3362
  type: string
3186
3363
  description: Relative path to the notebook file within its package directory
3364
+ title:
3365
+ type: string
3366
+ description:
3367
+ Human title, resolved from the notebook's own `## title="…"`, then
3368
+ its `#"` doc comment, then its first markdown heading. Absent when
3369
+ none of those resolve, leaving the caller to show the path.
3370
+ description:
3371
+ type: string
3372
+ description: The notebook's `#"` doc comment, when it has one
3187
3373
  error:
3188
3374
  type: string
3189
3375
  description: Error message if the notebook failed to compile or load
3190
3376
 
3377
+ Dashboard:
3378
+ type: object
3379
+ description: |
3380
+ A dashboard within a Malloy package: a self-contained `.malloy` file in
3381
+ the package's `dashboards/` directory carrying an `# artifact` (or
3382
+ model-level `## artifact`) annotation. The list entry; see
3383
+ DashboardManifest for the detail a viewer needs to render one.
3384
+ properties:
3385
+ resource:
3386
+ type: string
3387
+ description: Resource path to the dashboard
3388
+ packageName:
3389
+ type: string
3390
+ description: Name of the package containing this dashboard
3391
+ name:
3392
+ type: string
3393
+ description:
3394
+ The dashboard's slug — its filename basename. Addresses it in a URL
3395
+ and as a `# drill` target.
3396
+ path:
3397
+ type: string
3398
+ description:
3399
+ Relative path to the dashboard file within its package directory
3400
+ (`dashboards/<name>.malloy`)
3401
+ title:
3402
+ type: string
3403
+ description:
3404
+ Human title from the artifact tag, falling back to the file's `#"`
3405
+ doc comment and then to the slug
3406
+ description:
3407
+ type: string
3408
+ description: The file's `#"` doc comment, when it has one
3409
+ error:
3410
+ type: string
3411
+ description: Error message if the dashboard file failed to compile
3412
+
3413
+ DashboardManifest:
3414
+ type: object
3415
+ description: |
3416
+ Everything a viewer needs to render one dashboard: the artifact tag's
3417
+ declarations plus the control contract derived from the givens its query
3418
+ references. Running needs no dashboard-specific endpoint — the query,
3419
+ each composite tile, and each control's suggest query all run through
3420
+ the ordinary model query endpoint with `givens`.
3421
+ properties:
3422
+ resource:
3423
+ type: string
3424
+ description: Resource path to the dashboard
3425
+ packageName:
3426
+ type: string
3427
+ description: Name of the package containing this dashboard
3428
+ name:
3429
+ type: string
3430
+ description:
3431
+ The dashboard's slug — its filename basename. Addresses it in a URL
3432
+ and as a `# drill` target.
3433
+ path:
3434
+ type: string
3435
+ description: |
3436
+ Relative path to the dashboard file within its package directory
3437
+ (`dashboards/<name>.malloy`). This is also the model to POST to:
3438
+ `query`, each tile, and each control's suggest query all run through
3439
+ `POST /environments/{environmentName}/packages/{packageName}/models/{path}/query`
3440
+ with `givens`, which is why there is no dashboard-specific run
3441
+ endpoint.
3442
+ title:
3443
+ type: string
3444
+ description:
3445
+ Human title from the artifact tag, falling back to the file's `#"`
3446
+ doc comment and then to the slug
3447
+ description:
3448
+ type: string
3449
+ description: The file's `#"` doc comment, when it has one
3450
+ error:
3451
+ type: string
3452
+ description: Error message if the dashboard file failed to compile
3453
+ query:
3454
+ type: string
3455
+ description: >-
3456
+ Name of the tagged query to run. Present for the single-query form
3457
+ only; a composite dashboard carries `tiles` instead. A NAME rather
3458
+ than an expression, so it goes in the `queryName` field of a
3459
+ `POST …/models/{path}/query` body. A tile's `query` is the other
3460
+ shape and is not interchangeable with this one; see
3461
+ `DashboardTile.query`.
3462
+ tiles:
3463
+ type: array
3464
+ description:
3465
+ Tiles of a composite dashboard, run separately and combined into one
3466
+ grid. Present for the composite form only.
3467
+ items:
3468
+ $ref: "#/components/schemas/DashboardTile"
3469
+ dashboardColumns:
3470
+ type: integer
3471
+ description:
3472
+ Grid width — from the `# dashboard {columns=N}` render tag, or
3473
+ `dashboard_columns=N` on a composite artifact tag
3474
+ startingGivens:
3475
+ allOf:
3476
+ - $ref: "#/components/schemas/EncodedGivenValues"
3477
+ description:
3478
+ Per-dashboard starting values for controls, from the artifact tag.
3479
+ URL parameters override these, which is why the two share a shape.
3480
+ autorun:
3481
+ type: boolean
3482
+ description:
3483
+ False batches control changes behind an Apply button instead of
3484
+ re-running on every change. Defaults to true.
3485
+ givens:
3486
+ type: array
3487
+ description: |
3488
+ The control row. Normally one entry per given the dashboard runs
3489
+ with, which is what its `query` references on the single-query form
3490
+ and the union over `tiles` on a composite, and which the entry file
3491
+ can bind. A composite widens it to
3492
+ every given the entry file surfaces when any tile is one discovery
3493
+ cannot resolve, because that tile's givens are otherwise absent from
3494
+ the row it filters by; see `DashboardTile.givenNames`. So an entry
3495
+ here is always bindable, but on a widened row it is not necessarily
3496
+ referenced by any tile. A given reachable only
3497
+ through an import chain the entry file does not import itself
3498
+ cannot be bound at query time, so no control is offered for it and
3499
+ it stays at its default; that case is reported in the package's
3500
+ `warnings` rather than represented here by an unusable entry. Plain
3501
+ `Given`s, because the presentation a control takes is declared on
3502
+ the given itself, so a dashboard and a notebook render the same
3503
+ control for the same given, `#(description=…)` helper text
3504
+ included.
3505
+
3506
+ ONE DELIBERATE DIVERGENCE from `Given` as the model surface sends
3507
+ it: `default` here is the value the QUERY ENDPOINT takes, not the
3508
+ Malloy source literal. A `filter<…>` given declared `f'West'`
3509
+ publishes `West`. As the literal it could not be used as a default
3510
+ at all, since sending it back verbatim matches zero rows silently,
3511
+ with no error to search for. Only filter-typed givens are unwrapped,
3512
+ so a plain string default that merely reads like `f'x'` is
3513
+ untouched. `startingGivens` uses the same shape for the same reason.
3514
+ items:
3515
+ $ref: "#/components/schemas/Given"
3516
+
3517
+ DashboardTile:
3518
+ type: object
3519
+ description: One tile of a composite dashboard
3520
+ properties:
3521
+ query:
3522
+ type: string
3523
+ description: >-
3524
+ The run expression exactly as written in `tiles=[…]`, for example
3525
+ "orders -> by_month". An EXPRESSION rather than a name, so it goes in
3526
+ the `query` field of a `POST …/models/{path}/query` body, prefixed
3527
+ with `run:`. Sending it in `queryName`, the field
3528
+ `DashboardManifest.query` takes, is rejected.
3529
+ givenNames:
3530
+ type: array
3531
+ items:
3532
+ type: string
3533
+ description: |
3534
+ Names of the givens this tile references. This is a scoping hint,
3535
+ not a binding constraint: it tells a caller which tiles a changed
3536
+ control actually needs to re-run. Running a tile with the
3537
+ dashboard's whole control row also works, because an unreferenced
3538
+ given is ignored. Absent when the tile expression is not one
3539
+ discovery can resolve, a refinement or a multi-stage pipeline for
3540
+ instance, in which case send the whole control row. One such tile
3541
+ widens `DashboardManifest.givens` to every given the entry file
3542
+ surfaces, rather than the union over the resolvable tiles, so that
3543
+ the row actually contains the givens that tile filters by.
3544
+
3191
3545
  DataApp:
3192
3546
  type: object
3193
3547
  description:
@@ -3259,6 +3613,14 @@ components:
3259
3613
  Starting values for the notebook's controls, declared at its file
3260
3614
  level. URL parameters override these, which is why the two share a
3261
3615
  shape. Omitted when the notebook declares none.
3616
+ autorun:
3617
+ type: boolean
3618
+ description:
3619
+ False batches control changes behind an Apply button instead of
3620
+ re-running on every change. Defaults to true. The same flag, with
3621
+ the same default, that `DashboardManifest.autorun` carries, so a
3622
+ notebook's `## autorun=false` and a dashboard's
3623
+ `# artifact { autorun=false }` arrive identically.
3262
3624
  sources:
3263
3625
  type: array
3264
3626
  description: Sources defined in the notebook's model
@@ -3391,12 +3753,16 @@ components:
3391
3753
  that survives a URL), and a bare list of names is spelled `givenNames`.
3392
3754
 
3393
3755
  It also carries how the given should be presented as an input control
3394
- (`label`, `control`, `rangeMin`, `rangeMax`, `suggest`), derived from
3395
- the declaration's own tags. That contract belongs to the given rather
3396
- than to any one surface, which is what lets a notebook and an SDK host
3397
- render the same control without restating it. Those five fields describe
3398
- the contract a renderer implements; no endpoint populates them yet, so
3399
- they are absent from every response today.
3756
+ (`label`, `description`, `control`, `rangeMin`, `rangeMax`, `suggest`),
3757
+ derived from the declaration's own tags. That contract belongs to the
3758
+ given rather than to any one surface, which is what lets a notebook and
3759
+ an SDK host render the same control without restating it. Each of those
3760
+ six is present only when the declaration carries the tag it reads, so a
3761
+ given tagged with none of them carries none of them. A tag whose value is
3762
+ not one this contract accepts is dropped the same way rather than
3763
+ reported, so an unrecognized `control`, or a `rangeMin`/`rangeMax` that is
3764
+ not a number, is absent here and indistinguishable from never having been
3765
+ written.
3400
3766
  properties:
3401
3767
  name:
3402
3768
  type: string
@@ -3420,6 +3786,15 @@ components:
3420
3786
  label:
3421
3787
  type: string
3422
3788
  description: Display label from the declaration's `# label=` tag
3789
+ description:
3790
+ type: string
3791
+ description:
3792
+ Helper text from the declaration's `# description=` tag. Distinct
3793
+ from the older `#(description="…")` annotation, which is not derived
3794
+ into this field and instead stays on `annotations` for the client
3795
+ that already parses it. The tag form is also the one that compiles
3796
+ without a `malformed-route` warning, because Malloy reads an
3797
+ annotation's route up to the first whitespace.
3423
3798
  control:
3424
3799
  type: string
3425
3800
  enum:
@@ -3487,10 +3862,13 @@ components:
3487
3862
 
3488
3863
  The role it names: a surface's URL parameters and the starting values a
3489
3864
  document declares share this shape, so the two can merge and then be
3490
- decoded once against the declarations and sent as `GivenValues`. No
3491
- endpoint returns it yet. `RawNotebook.startingGivens` is the first field
3492
- typed as it, and nothing populates that field so far, so today this
3493
- schema documents the contract rather than describing live traffic. The
3865
+ decoded once against the declarations and sent as `GivenValues`.
3866
+ `RawNotebook.startingGivens` and `DashboardManifest.startingGivens` are
3867
+ both typed as it and both populated, so this schema now describes live
3868
+ traffic rather than only the contract. A `filter<…>` value is unwrapped
3869
+ to its body and every other type is published as declared, keyed on the
3870
+ declared type, so a plain string default that reads like `f'x'` survives
3871
+ untouched. The
3494
3872
  `givens` query parameter is not an instance of it: that carries a
3495
3873
  JSON-encoded `GivenValues`, with values typed rather than stringified.
3496
3874
  additionalProperties:
@@ -5423,10 +5801,35 @@ components:
5423
5801
  properties:
5424
5802
  connectionName:
5425
5803
  type: string
5426
- description: With `physicalTableName`, the table the boundary belongs to.
5804
+ description: >-
5805
+ The connection whose SQL computes the table's rows. With
5806
+ `physicalTableName` — and `storageDestinationName`, when the table is
5807
+ in a storage destination — the table the boundary belongs to.
5427
5808
  physicalTableName:
5428
5809
  type: string
5429
5810
  description: The table's logical (unquoted) name, as the manifest reports it.
5811
+ storageDestinationName:
5812
+ type: string
5813
+ description: >-
5814
+ The storage destination the table lives in, when the source was
5815
+ materialized into one — an entry in `storageDestinations`, NOT a
5816
+ connection, exactly as on `ManifestEntry`. Absent means the table
5817
+ lives in `connectionName`'s own warehouse.
5818
+
5819
+ Part of the table's IDENTITY, not a description of it, so it must be
5820
+ returned verbatim like every other field here. A source keeps both its
5821
+ physical name and its content address when `storage=` is added or
5822
+ removed (an annotation enters neither), so without this field a
5823
+ boundary measured on the stored table is indistinguishable from one
5824
+ measured on a colocated table of the same name — and a delta computed
5825
+ from the wrong one can skip rows.
5826
+
5827
+ A caller that has never recorded this field may omit it. An entry that
5828
+ omits it for a source this run materializes into a destination
5829
+ describes a different table, so that source SEEDS rather than being
5830
+ rejected: the entry is stale, not wrong, and a seed is always correct.
5831
+ An entry that names a DIFFERENT destination than the run instructs is
5832
+ a caller error and is rejected like any other mismatched entry.
5430
5833
  coveredThrough:
5431
5834
  type: string
5432
5835
  description: >-
@@ -5665,14 +6068,24 @@ components:
5665
6068
  reach its own job records also reports null; that case is counted by
5666
6069
  `publisher_storage_build_attribution_skipped_total`.
5667
6070
 
5668
- An incremental delta reports null because its statements do not run
5669
- through a single call whose result reaches here. A chained `storage=`
5670
- build reports null because it read its parent's already-materialized
5671
- table and touched no warehouse at all. A POSTGRES source reports null
5672
- on every path: the label that makes a read reportable is BigQuery's,
5673
- and Postgres has no per-statement tag to carry one. And a bag whose
5674
- every property is unusable as a BigQuery label key renders no label,
5675
- so such a read is issued the untagged way and reports null too.
6071
+ A COLOCATED incremental delta reports null because its statements do
6072
+ not run through a single call whose result reaches here. A delta
6073
+ into a `storage=` destination reports whatever its own bounded read
6074
+ reported: that read is issued through the same call a full build's
6075
+ is, so a tagged one is costed and an untagged one is not. A
6076
+ SNOWFLAKE source reports null on a delta even though its full build
6077
+ reports a figure Snowflake does not return one with the read, so
6078
+ the full build looks it up afterwards by matching the statement
6079
+ text, and a delta's text is the bounded, projected wrapper rather
6080
+ than the build SQL that lookup keys on. Summing this field across
6081
+ refreshes therefore understates a Snowflake source; it does not mean
6082
+ those reads were free. A chained `storage=` build reports null
6083
+ because it read its parent's already-materialized table and touched
6084
+ no warehouse at all. A POSTGRES source reports null on every path:
6085
+ the label that makes a read reportable is BigQuery's, and Postgres
6086
+ has no per-statement tag to carry one. And a bag whose every
6087
+ property is unusable as a BigQuery label key renders no label, so
6088
+ such a read is issued the untagged way and reports null too.
5676
6089
  dataAsOf:
5677
6090
  type: string
5678
6091
  format: date-time
@@ -5721,7 +6134,7 @@ components:
5721
6134
  Present exactly when the source is refreshed incrementally, so
5722
6135
  absent means only that it is not: a source declaring
5723
6136
  `refresh="full"`, or one whose declaration the delta path cannot act
5724
- on at all (an unsupported dialect, `storage=`), which the publish
6137
+ on at all (an unsupported source dialect), which the publish
5725
6138
  gate rejects anyway.
5726
6139
 
5727
6140
  parameters:
@@ -1 +1 @@
1
- import{$ as r,H as t,j as e,a1 as i,aa as o}from"./index-BwoU1Ko8.js";function m(){const s=r(),{environmentName:n}=t();if(n){const a=i({environmentName:n});return e.jsx(o,{onSelectPackage:s,resourceUri:a})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{m as default};
1
+ import{C as r,J as t,j as e,a3 as i,ad as o}from"./index-DP4bilgp.js";function m(){const s=r(),{environmentName:n}=t();if(n){const a=i({environmentName:n});return e.jsx(o,{onSelectPackage:s,resourceUri:a})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{m as default};
@@ -0,0 +1 @@
1
+ import{C as t,j as o,g as a}from"./index-DP4bilgp.js";function s(){const n=t();return o.jsx(a,{onClickEnvironment:n})}export{s as default};
@@ -1 +1 @@
1
- import{c,j as s}from"./index-BwoU1Ko8.js";const t=c(s.jsx("path",{d:"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1"})),a=c(s.jsx("path",{d:"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5M2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1m18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1M11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1m0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1M5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0z"}));export{t as D,a as L};
1
+ import{c,j as s}from"./index-DP4bilgp.js";const t=c(s.jsx("path",{d:"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1"})),a=c(s.jsx("path",{d:"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5M2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1m18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1M11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1m0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1M5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0z"}));export{t as D,a as L};