@malloy-publisher/server 0.0.247 → 0.0.249

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 (25) hide show
  1. package/dist/app/api-doc.yaml +411 -29
  2. package/dist/app/assets/{EnvironmentPage-DrTRtRHz.js → EnvironmentPage-CB0NkVVs.js} +1 -1
  3. package/dist/app/assets/HomePage-BEfG37L3.js +1 -0
  4. package/dist/app/assets/{LightMode-4Y7DEWAD.js → LightMode--nzFqff1.js} +1 -1
  5. package/dist/app/assets/{MainPage-DKNR-8Vr.js → MainPage-owd1ua9R.js} +2 -2
  6. package/dist/app/assets/{MaterializationsPage-h3ONDcgJ.js → MaterializationsPage-BqaGRrxZ.js} +1 -1
  7. package/dist/app/assets/ModelPage-BydBAuRk.js +1 -0
  8. package/dist/app/assets/{PackagePage-D8mM4T37.js → PackagePage-BDl_rs-E.js} +1 -1
  9. package/dist/app/assets/{RouteError-DzJ0TPOj.js → RouteError-CyReblMg.js} +1 -1
  10. package/dist/app/assets/{ThemeEditorPage-BYvxc5op.js → ThemeEditorPage-zW7ndXQ8.js} +1 -1
  11. package/dist/app/assets/{WorkbookPage-CYOpAw7I.js → WorkbookPage-CzjOTRw8.js} +1 -1
  12. package/dist/app/assets/{core-BuvlzSIX.es-cZHBIpH6.js → core-DFBwNhvb.es-BwyvPM0R.js} +10 -10
  13. package/dist/app/assets/index-Byu4Enw7.js +2 -0
  14. package/dist/app/assets/{index-BgAa2J25.js → index-Cmp8wg1s.js} +1 -1
  15. package/dist/app/assets/{index-BgMR5Uuv.js → index-D6bZJBhc.js} +113 -113
  16. package/dist/app/assets/index-t7IEDVsK.js +615 -0
  17. package/dist/app/index.html +1 -1
  18. package/dist/package_load_worker.mjs +11914 -9572
  19. package/dist/server.mjs +2773 -302
  20. package/dist/sshcrypto-vd2k5hq9.node +0 -0
  21. package/package.json +2 -1
  22. package/dist/app/assets/HomePage-X_Wozguy.js +0 -1
  23. package/dist/app/assets/ModelPage-B8Qsrbxn.js +0 -1
  24. package/dist/app/assets/index-BwoU1Ko8.js +0 -529
  25. package/dist/app/assets/index-CuaX7xuf.js +0 -18
@@ -64,6 +64,10 @@ tags:
64
64
  description: Malloy model access and compilation operations
65
65
  - name: notebooks
66
66
  description: Malloy notebook access and execution operations
67
+ - name: dashboards
68
+ description:
69
+ Discovery and manifests for `# artifact` dashboards - layout, tiles, and
70
+ the given specs behind their controls
67
71
  - name: data-apps
68
72
  description:
69
73
  In-package HTML data apps (static pages served from a package's public/
@@ -1715,6 +1719,150 @@ paths:
1715
1719
  "503":
1716
1720
  $ref: "#/components/responses/ServiceUnavailable"
1717
1721
 
1722
+ /environments/{environmentName}/packages/{packageName}/dashboards:
1723
+ get:
1724
+ tags:
1725
+ - dashboards
1726
+ operationId: list-dashboards
1727
+ summary: List package dashboards
1728
+ description: |
1729
+ Lists the dashboards in the specified package — every `.malloy` file in
1730
+ the package's `dashboards/` directory that carries an `# artifact` (or
1731
+ model-level `## artifact`) annotation. A file in that directory with no
1732
+ artifact tag is a shared include and is not listed, whether or not it
1733
+ compiles.
1734
+
1735
+ A tagged dashboard that failed to compile is listed carrying its
1736
+ `error` where that state can arise at all, so a broken dashboard is
1737
+ visibly broken rather than silently absent. In practice it rarely does:
1738
+ a package whose model fails to compile is not loaded, and a reload that
1739
+ would break one is refused and leaves the previously loaded package
1740
+ serving, so `error` is only reachable on the paths that keep per-model
1741
+ placeholders. Treat it as present-but-uncommon rather than the normal
1742
+ way a broken dashboard surfaces. When the package curates its query surface
1743
+ (`queryableSources: "declared"`), a dashboard whose entry file is not in
1744
+ `explores` is omitted, because its query and given names would not be
1745
+ runnable; the omission is reported in the package's `warnings` as of the
1746
+ last load. A metadata `PATCH` that TIGHTENS curation takes effect on
1747
+ this listing immediately; one that relaxes it takes effect on the next
1748
+ package reload, because the withheld dashboards were never built into
1749
+ the cached set. Either way the matching warning is computed at load, so
1750
+ after a `PATCH` it appears only once the package reloads.
1751
+
1752
+ Where the boundary is active at all, which needs `explores` declared
1753
+ AND `queryableSources` left at `"declared"`, being listed does not by
1754
+ itself guarantee the dashboard runs: the queryable sources are the
1755
+ union of every listed file's `export {}` closure, so a dashboard whose
1756
+ tiles read a source that only an UNLISTED file exports is still served
1757
+ while those queries are refused. The fix is to list that file too, or
1758
+ to re-export the source from one already listed. It is served rather
1759
+ than withheld because withholding on a guess would hide dashboards that
1760
+ do work. Under `"all"` nothing is refused, so the situation does not
1761
+ arise.
1762
+ parameters:
1763
+ - name: environmentName
1764
+ in: path
1765
+ description: Name of the environment
1766
+ required: true
1767
+ schema:
1768
+ $ref: "#/components/schemas/IdentifierPattern"
1769
+ - name: packageName
1770
+ in: path
1771
+ description: Name of the package
1772
+ required: true
1773
+ schema:
1774
+ $ref: "#/components/schemas/IdentifierPattern"
1775
+ - name: versionId
1776
+ in: query
1777
+ description: Version identifier for the package
1778
+ required: false
1779
+ schema:
1780
+ $ref: "#/components/schemas/VersionIdPattern"
1781
+ responses:
1782
+ "200":
1783
+ description: A list of dashboards in the package
1784
+ content:
1785
+ application/json:
1786
+ schema:
1787
+ type: array
1788
+ items:
1789
+ $ref: "#/components/schemas/Dashboard"
1790
+ "401":
1791
+ $ref: "#/components/responses/Unauthorized"
1792
+ "404":
1793
+ $ref: "#/components/responses/NotFound"
1794
+ "500":
1795
+ $ref: "#/components/responses/InternalServerError"
1796
+ "501":
1797
+ $ref: "#/components/responses/NotImplemented"
1798
+ "503":
1799
+ $ref: "#/components/responses/ServiceUnavailable"
1800
+
1801
+ /environments/{environmentName}/packages/{packageName}/dashboards/{dashboardName}:
1802
+ get:
1803
+ tags:
1804
+ - dashboards
1805
+ operationId: get-dashboard
1806
+ summary: Get a dashboard manifest
1807
+ description: |
1808
+ Retrieves everything a viewer needs to render one dashboard: the artifact
1809
+ tag's declarations plus the control contract derived from the givens its
1810
+ query references. Running the dashboard needs no further endpoint — its
1811
+ query, each composite tile, and each control's suggest query all run
1812
+ through the model query endpoint with `givens`, using the manifest's
1813
+ `path` as the model.
1814
+ parameters:
1815
+ - name: environmentName
1816
+ in: path
1817
+ description: Name of the environment
1818
+ required: true
1819
+ schema:
1820
+ $ref: "#/components/schemas/IdentifierPattern"
1821
+ - name: packageName
1822
+ in: path
1823
+ description: Name of the package
1824
+ required: true
1825
+ schema:
1826
+ $ref: "#/components/schemas/IdentifierPattern"
1827
+ - name: dashboardName
1828
+ in: path
1829
+ description: >-
1830
+ The dashboard's name: its filename basename. Conventionally letters,
1831
+ digits, "-" and "_", and a package is warned when one of its SERVED
1832
+ dashboards falls outside that. A dashboard withheld by curation gets
1833
+ no naming finding, because the naming check runs after the curation
1834
+ gate and a withheld dashboard is already reported as withheld. It is NOT constrained to it, because
1835
+ the name comes from a filename rather than being chosen: a file such
1836
+ as `dashboards/v1.2.malloy` is served, and its published `resource`
1837
+ carries the name percent-encoded. Send it percent-encoded.
1838
+ required: true
1839
+ schema:
1840
+ type: string
1841
+ minLength: 1
1842
+ - name: versionId
1843
+ in: query
1844
+ description: Version identifier for the package
1845
+ required: false
1846
+ schema:
1847
+ $ref: "#/components/schemas/VersionIdPattern"
1848
+ responses:
1849
+ "200":
1850
+ description: The dashboard manifest
1851
+ content:
1852
+ application/json:
1853
+ schema:
1854
+ $ref: "#/components/schemas/DashboardManifest"
1855
+ "401":
1856
+ $ref: "#/components/responses/Unauthorized"
1857
+ "404":
1858
+ $ref: "#/components/responses/NotFound"
1859
+ "500":
1860
+ $ref: "#/components/responses/InternalServerError"
1861
+ "501":
1862
+ $ref: "#/components/responses/NotImplemented"
1863
+ "503":
1864
+ $ref: "#/components/responses/ServiceUnavailable"
1865
+
1718
1866
  /environments/{environmentName}/packages/{packageName}/notebooks:
1719
1867
  get:
1720
1868
  tags:
@@ -2854,9 +3002,19 @@ components:
2854
3002
  collision, and materialization-config problems that degrade
2855
3003
  attribution. Discovery findings: a model listed in `explores` whose
2856
3004
  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.
3005
+ empty and renders a blank page. Dashboard findings: a
3006
+ `dashboards/` file whose `# artifact` tag does not parse or does not
3007
+ describe a dashboard, a tile or suggest query that does not resolve,
3008
+ a `# drill` naming a destination that is not a dashboard, and a
3009
+ dashboard held back from the listing because its entry file is not
3010
+ in `explores`. Two dashboard findings are about Publisher rather
3011
+ than about the package: one when a file carrying an artifact tag
3012
+ could not be read and so is not served at all, and one when the lint
3013
+ stops early, in which case the list must be read as incomplete
3014
+ rather than as a clean package. Server-computed and read-only:
3015
+ ignored on
3016
+ create/update requests and only returned in responses. Present only
3017
+ when there are such findings.
2860
3018
 
2861
3019
 
2862
3020
  **Pre-aggregation contributes nothing to this array. A
@@ -2913,9 +3071,13 @@ components:
2913
3071
  type: string
2914
3072
  description: >-
2915
3073
  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.
3074
+ sits on (`by_carrier`, `flights -> by_carrier`), the source a
3075
+ materialization finding belongs to, or, for a dashboard
3076
+ finding, the dashboard's name or the `source.dimension` a
3077
+ `# drill` is declared on. Absent when a finding sits on none
3078
+ of those, either because it spans several, in which case the
3079
+ message names them, or because it is about the lint itself
3080
+ rather than about any one dashboard.
2919
3081
  message:
2920
3082
  type: string
2921
3083
  description: A description of the problem.
@@ -2925,9 +3087,21 @@ components:
2925
3087
  - error
2926
3088
  - warn
2927
3089
  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.
3090
+ Finding severity. Render findings are surfaced here only at
3091
+ `error` severity; lower-severity render findings remain on the
3092
+ query-time `renderLogs` surface. Materialization and dashboard
3093
+ findings use both: `error` for something that cannot work as
3094
+ written, such as a tile naming a view the source does not
3095
+ have, and `warn` for something that works but not as the
3096
+ author probably intended, such as a dashboard held back by
3097
+ curation. The two findings about Publisher rather than about
3098
+ the package split across both: a file that carries an artifact
3099
+ tag and could not be read is `error`, because the dashboard it
3100
+ should have produced does not exist, and a lint that stopped
3101
+ early is `warn`, because the lint failing is not itself a
3102
+ defect in the package. That `warn` does NOT mean the package is
3103
+ free of `error`-severity findings, since the ones the lint
3104
+ never reached are exactly what it cannot report.
2931
3105
  queryableSources:
2932
3106
  type: string
2933
3107
  enum:
@@ -3175,19 +3349,196 @@ components:
3175
3349
  type: object
3176
3350
  description: Malloy notebook metadata and status information
3177
3351
  properties:
3178
- resource:
3352
+ environmentName:
3179
3353
  type: string
3180
- description: Resource path to the notebook
3354
+ description: Name of the environment containing this notebook
3181
3355
  packageName:
3182
3356
  type: string
3183
3357
  description: Name of the package containing this notebook
3184
3358
  path:
3185
3359
  type: string
3186
3360
  description: Relative path to the notebook file within its package directory
3361
+ title:
3362
+ type: string
3363
+ description:
3364
+ Human title, resolved from the notebook's own `## title="…"`, then
3365
+ its `#"` doc comment, then its first markdown heading. Absent when
3366
+ none of those resolve, leaving the caller to show the path.
3367
+ description:
3368
+ type: string
3369
+ description: The notebook's `#"` doc comment, when it has one
3187
3370
  error:
3188
3371
  type: string
3189
3372
  description: Error message if the notebook failed to compile or load
3190
3373
 
3374
+ Dashboard:
3375
+ type: object
3376
+ description: |
3377
+ A dashboard within a Malloy package: a self-contained `.malloy` file in
3378
+ the package's `dashboards/` directory carrying an `# artifact` (or
3379
+ model-level `## artifact`) annotation. The list entry; see
3380
+ DashboardManifest for the detail a viewer needs to render one.
3381
+ properties:
3382
+ resource:
3383
+ type: string
3384
+ description: Resource path to the dashboard
3385
+ packageName:
3386
+ type: string
3387
+ description: Name of the package containing this dashboard
3388
+ name:
3389
+ type: string
3390
+ description:
3391
+ The dashboard's slug — its filename basename. Addresses it in a URL
3392
+ and as a `# drill` target.
3393
+ path:
3394
+ type: string
3395
+ description:
3396
+ Relative path to the dashboard file within its package directory
3397
+ (`dashboards/<name>.malloy`)
3398
+ title:
3399
+ type: string
3400
+ description:
3401
+ Human title from the artifact tag, falling back to the file's `#"`
3402
+ doc comment and then to the slug
3403
+ description:
3404
+ type: string
3405
+ description: The file's `#"` doc comment, when it has one
3406
+ error:
3407
+ type: string
3408
+ description: Error message if the dashboard file failed to compile
3409
+
3410
+ DashboardManifest:
3411
+ type: object
3412
+ description: |
3413
+ Everything a viewer needs to render one dashboard: the artifact tag's
3414
+ declarations plus the control contract derived from the givens its query
3415
+ references. Running needs no dashboard-specific endpoint — the query,
3416
+ each composite tile, and each control's suggest query all run through
3417
+ the ordinary model query endpoint with `givens`.
3418
+ properties:
3419
+ resource:
3420
+ type: string
3421
+ description: Resource path to the dashboard
3422
+ packageName:
3423
+ type: string
3424
+ description: Name of the package containing this dashboard
3425
+ name:
3426
+ type: string
3427
+ description:
3428
+ The dashboard's slug — its filename basename. Addresses it in a URL
3429
+ and as a `# drill` target.
3430
+ path:
3431
+ type: string
3432
+ description: |
3433
+ Relative path to the dashboard file within its package directory
3434
+ (`dashboards/<name>.malloy`). This is also the model to POST to:
3435
+ `query`, each tile, and each control's suggest query all run through
3436
+ `POST /environments/{environmentName}/packages/{packageName}/models/{path}/query`
3437
+ with `givens`, which is why there is no dashboard-specific run
3438
+ endpoint.
3439
+ title:
3440
+ type: string
3441
+ description:
3442
+ Human title from the artifact tag, falling back to the file's `#"`
3443
+ doc comment and then to the slug
3444
+ description:
3445
+ type: string
3446
+ description: The file's `#"` doc comment, when it has one
3447
+ error:
3448
+ type: string
3449
+ description: Error message if the dashboard file failed to compile
3450
+ query:
3451
+ type: string
3452
+ description: >-
3453
+ Name of the tagged query to run. Present for the single-query form
3454
+ only; a composite dashboard carries `tiles` instead. A NAME rather
3455
+ than an expression, so it goes in the `queryName` field of a
3456
+ `POST …/models/{path}/query` body. A tile's `query` is the other
3457
+ shape and is not interchangeable with this one; see
3458
+ `DashboardTile.query`.
3459
+ tiles:
3460
+ type: array
3461
+ description:
3462
+ Tiles of a composite dashboard, run separately and combined into one
3463
+ grid. Present for the composite form only.
3464
+ items:
3465
+ $ref: "#/components/schemas/DashboardTile"
3466
+ dashboardColumns:
3467
+ type: integer
3468
+ description:
3469
+ Grid width — from the `# dashboard {columns=N}` render tag, or
3470
+ `dashboard_columns=N` on a composite artifact tag
3471
+ startingGivens:
3472
+ allOf:
3473
+ - $ref: "#/components/schemas/EncodedGivenValues"
3474
+ description:
3475
+ Per-dashboard starting values for controls, from the artifact tag.
3476
+ URL parameters override these, which is why the two share a shape.
3477
+ autorun:
3478
+ type: boolean
3479
+ description:
3480
+ False batches control changes behind an Apply button instead of
3481
+ re-running on every change. Defaults to true.
3482
+ givens:
3483
+ type: array
3484
+ description: |
3485
+ The control row. Normally one entry per given the dashboard runs
3486
+ with, which is what its `query` references on the single-query form
3487
+ and the union over `tiles` on a composite, and which the entry file
3488
+ can bind. A composite widens it to
3489
+ every given the entry file surfaces when any tile is one discovery
3490
+ cannot resolve, because that tile's givens are otherwise absent from
3491
+ the row it filters by; see `DashboardTile.givenNames`. So an entry
3492
+ here is always bindable, but on a widened row it is not necessarily
3493
+ referenced by any tile. A given reachable only
3494
+ through an import chain the entry file does not import itself
3495
+ cannot be bound at query time, so no control is offered for it and
3496
+ it stays at its default; that case is reported in the package's
3497
+ `warnings` rather than represented here by an unusable entry. Plain
3498
+ `Given`s, because the presentation a control takes is declared on
3499
+ the given itself, so a dashboard and a notebook render the same
3500
+ control for the same given, `#(description=…)` helper text
3501
+ included.
3502
+
3503
+ ONE DELIBERATE DIVERGENCE from `Given` as the model surface sends
3504
+ it: `default` here is the value the QUERY ENDPOINT takes, not the
3505
+ Malloy source literal. A `filter<…>` given declared `f'West'`
3506
+ publishes `West`. As the literal it could not be used as a default
3507
+ at all, since sending it back verbatim matches zero rows silently,
3508
+ with no error to search for. Only filter-typed givens are unwrapped,
3509
+ so a plain string default that merely reads like `f'x'` is
3510
+ untouched. `startingGivens` uses the same shape for the same reason.
3511
+ items:
3512
+ $ref: "#/components/schemas/Given"
3513
+
3514
+ DashboardTile:
3515
+ type: object
3516
+ description: One tile of a composite dashboard
3517
+ properties:
3518
+ query:
3519
+ type: string
3520
+ description: >-
3521
+ The run expression exactly as written in `tiles=[…]`, for example
3522
+ "orders -> by_month". An EXPRESSION rather than a name, so it goes in
3523
+ the `query` field of a `POST …/models/{path}/query` body, prefixed
3524
+ with `run:`. Sending it in `queryName`, the field
3525
+ `DashboardManifest.query` takes, is rejected.
3526
+ givenNames:
3527
+ type: array
3528
+ items:
3529
+ type: string
3530
+ description: |
3531
+ Names of the givens this tile references. This is a scoping hint,
3532
+ not a binding constraint: it tells a caller which tiles a changed
3533
+ control actually needs to re-run. Running a tile with the
3534
+ dashboard's whole control row also works, because an unreferenced
3535
+ given is ignored. Absent when the tile expression is not one
3536
+ discovery can resolve, a refinement or a multi-stage pipeline for
3537
+ instance, in which case send the whole control row. One such tile
3538
+ widens `DashboardManifest.givens` to every given the entry file
3539
+ surfaces, rather than the union over the resolvable tiles, so that
3540
+ the row actually contains the givens that tile filters by.
3541
+
3191
3542
  DataApp:
3192
3543
  type: object
3193
3544
  description:
@@ -3259,6 +3610,14 @@ components:
3259
3610
  Starting values for the notebook's controls, declared at its file
3260
3611
  level. URL parameters override these, which is why the two share a
3261
3612
  shape. Omitted when the notebook declares none.
3613
+ autorun:
3614
+ type: boolean
3615
+ description:
3616
+ False batches control changes behind an Apply button instead of
3617
+ re-running on every change. Defaults to true. The same flag, with
3618
+ the same default, that `DashboardManifest.autorun` carries, so a
3619
+ notebook's `## autorun=false` and a dashboard's
3620
+ `# artifact { autorun=false }` arrive identically.
3262
3621
  sources:
3263
3622
  type: array
3264
3623
  description: Sources defined in the notebook's model
@@ -3391,12 +3750,16 @@ components:
3391
3750
  that survives a URL), and a bare list of names is spelled `givenNames`.
3392
3751
 
3393
3752
  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.
3753
+ (`label`, `description`, `control`, `rangeMin`, `rangeMax`, `suggest`),
3754
+ derived from the declaration's own tags. That contract belongs to the
3755
+ given rather than to any one surface, which is what lets a notebook and
3756
+ an SDK host render the same control without restating it. Each of those
3757
+ six is present only when the declaration carries the tag it reads, so a
3758
+ given tagged with none of them carries none of them. A tag whose value is
3759
+ not one this contract accepts is dropped the same way rather than
3760
+ reported, so an unrecognized `control`, or a `rangeMin`/`rangeMax` that is
3761
+ not a number, is absent here and indistinguishable from never having been
3762
+ written.
3400
3763
  properties:
3401
3764
  name:
3402
3765
  type: string
@@ -3420,6 +3783,15 @@ components:
3420
3783
  label:
3421
3784
  type: string
3422
3785
  description: Display label from the declaration's `# label=` tag
3786
+ description:
3787
+ type: string
3788
+ description:
3789
+ Helper text from the declaration's `# description=` tag. Distinct
3790
+ from the older `#(description="…")` annotation, which is not derived
3791
+ into this field and instead stays on `annotations` for the client
3792
+ that already parses it. The tag form is also the one that compiles
3793
+ without a `malformed-route` warning, because Malloy reads an
3794
+ annotation's route up to the first whitespace.
3423
3795
  control:
3424
3796
  type: string
3425
3797
  enum:
@@ -3487,10 +3859,13 @@ components:
3487
3859
 
3488
3860
  The role it names: a surface's URL parameters and the starting values a
3489
3861
  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
3862
+ decoded once against the declarations and sent as `GivenValues`.
3863
+ `RawNotebook.startingGivens` and `DashboardManifest.startingGivens` are
3864
+ both typed as it and both populated, so this schema now describes live
3865
+ traffic rather than only the contract. A `filter<…>` value is unwrapped
3866
+ to its body and every other type is published as declared, keyed on the
3867
+ declared type, so a plain string default that reads like `f'x'` survives
3868
+ untouched. The
3494
3869
  `givens` query parameter is not an instance of it: that carries a
3495
3870
  JSON-encoded `GivenValues`, with values typed rather than stringified.
3496
3871
  additionalProperties:
@@ -3530,14 +3905,21 @@ components:
3530
3905
  authorize:
3531
3906
  type: array
3532
3907
  description: >-
3533
- Effective authorize expressions gating this source via `#(authorize)`
3534
- / `##(authorize)` annotationsfile-level expressions first, then the
3535
- source's own, or, when it declares none, the nearest source it extends
3536
- that does. Each is a Malloy boolean expression over declared givens,
3537
- evaluated as a disjunction (OR) and enforced at query time. A request
3538
- that reads this source is denied with HTTP 403 unless at least one
3539
- expression evaluates true for the supplied givens; an empty or absent
3540
- list means unrestricted.
3908
+ Effective authorize expressions gating this source, declared with a
3909
+ source-level `#(authorize)` annotationthe source's own, or, when it
3910
+ declares none, the nearest source it extends that does. (File-level
3911
+ `##(authorize)` is deprecated and fails the model load, so no
3912
+ expression here ever comes from one.) Each is a Malloy boolean
3913
+ expression over declared givens, evaluated as a disjunction (OR) and
3914
+ enforced at query time. An empty or absent list means unrestricted.
3915
+
3916
+ How a denial surfaces depends on what the expression reads. An
3917
+ expression referencing only givens is a whole-source gate: the request
3918
+ is denied with HTTP 403 unless at least one expression evaluates true.
3919
+ An expression that also references a row field of the source is a
3920
+ row-level gate, applied as a filter instead — such a request succeeds
3921
+ with HTTP 200 and returns only the rows the expression admits, which
3922
+ may be none. Do not treat a 200 with zero rows as "no gate applied".
3541
3923
 
3542
3924
  IMPORTANT for anything re-implementing the decision: this flat list
3543
3925
  cannot always express the predicate. Expressions from one source are
@@ -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{T as r,J as t,j as e,a3 as i,ad as o}from"./index-t7IEDVsK.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{T as t,j as o,y as a}from"./index-t7IEDVsK.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-t7IEDVsK.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};