@malloy-publisher/server 0.0.244 → 0.0.246

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 (26) hide show
  1. package/README.md +47 -5
  2. package/dist/app/api-doc.yaml +323 -20
  3. package/dist/app/assets/{EnvironmentPage-BEvyNJlI.js → EnvironmentPage-EjXlK1AR.js} +1 -1
  4. package/dist/app/assets/{HomePage-BOJ5_n2P.js → HomePage-BDg82oe3.js} +1 -1
  5. package/dist/app/assets/{LightMode-DiRk-oG_.js → LightMode-CM8J0nPB.js} +1 -1
  6. package/dist/app/assets/{MainPage-CvWxTRF_.js → MainPage-CkkdimtC.js} +1 -1
  7. package/dist/app/assets/{MaterializationsPage-DTkN3KGF.js → MaterializationsPage-DvVS2HMi.js} +1 -1
  8. package/dist/app/assets/{ModelPage-C-Ds_tSI.js → ModelPage-Bz2je31A.js} +1 -1
  9. package/dist/app/assets/{PackagePage-C9kY78dt.js → PackagePage-BUJU3qB3.js} +1 -1
  10. package/dist/app/assets/{RouteError-dWMSDw8R.js → RouteError-oqZTfMol.js} +1 -1
  11. package/dist/app/assets/{ThemeEditorPage-EDVJy_ps.js → ThemeEditorPage-W-V8hngE.js} +1 -1
  12. package/dist/app/assets/{WorkbookPage-6kCZgXzD.js → WorkbookPage-IQFxsQGR.js} +1 -1
  13. package/dist/app/assets/{core-CbOoBenI.es-m46Eq2w-.js → core-BCwj9ZvB.es-C610H3gu.js} +1 -1
  14. package/dist/app/assets/{index-CzHda4nF.js → index-1xafiaYB.js} +1 -1
  15. package/dist/app/assets/{index-CmKKDEOJ.js → index-BUhTsFh9.js} +1 -1
  16. package/dist/app/assets/{index-B8MmVXwE.js → index-DJ-3RN5W.js} +4 -4
  17. package/dist/app/assets/{index-Bofgo-1r.js → index-Dxotbpnc.js} +1 -1
  18. package/dist/app/index.html +1 -1
  19. package/dist/instrumentation.mjs +10 -9
  20. package/dist/package_load_worker.mjs +209 -188
  21. package/dist/server.mjs +106862 -105526
  22. package/dist/sshcrypto-vd2k5hq9.node +0 -0
  23. package/package.json +4 -2
  24. package/publisher.config.example.bigquery.json +33 -0
  25. package/publisher.config.example.duckdb.json +23 -0
  26. package/dist/sshcrypto-8m50vnmb.node +0 -0
package/README.md CHANGED
@@ -2,11 +2,53 @@
2
2
 
3
3
  The Malloy Publisher Server is an Express.js server that provides an API for managing and accessing Malloy data models, packages, and queries
4
4
 
5
+ ## Quick start
6
+
7
+ This section is self-contained: this README ships in the npm tarball, where most of the repository does not, so nothing here needs a file you do not have. Later sections are written for a clone and do point into the repository.
8
+
9
+ **New workspace?** One command scaffolds a package, the server config, the MCP wiring, and the agent skills:
10
+
11
+ ```bash
12
+ npm create @malloy-publisher/malloy-package@latest sales
13
+ npm start
14
+ ```
15
+
16
+ Run bare like that, the package comes with a small sample dataset, so there is something to query immediately. To start from a file of your own instead, add `-- --data ./orders.csv`, naming a delimited or Parquet/Excel file you actually have (the `--` is required, and the path is relative to where you run the command). Keep the `@latest`: `npm create` resolves through the npx cache, and an unversioned name silently reuses whatever old copy is on the machine.
17
+
18
+ **Existing directory of models?** Write a `publisher.config.json` beside a package directory that holds a `publisher.json`, then run the server pointing at it:
19
+
20
+ ```bash
21
+ npx @malloy-publisher/server --server_root . --watch-env local
22
+ ```
23
+
24
+ ```json
25
+ {
26
+ "frozenConfig": false,
27
+ "environments": [
28
+ {
29
+ "name": "local",
30
+ "packages": [{ "name": "sales", "location": "./sales" }],
31
+ "connections": []
32
+ }
33
+ ]
34
+ }
35
+ ```
36
+
37
+ The config is read from `<server_root>/publisher.config.json` by default; `--config <path>` overrides it.
38
+
39
+ Three facts that are easy to get wrong:
40
+
41
+ - **A flat-file (CSV/Parquet/XLSX) package needs no `connections` entry at all.** Every loaded package automatically gets its own DuckDB sandbox connection named `duckdb`, which is what `duckdb.table('data/file.csv')` resolves against. That name is reserved: an environment-level connection named `duckdb` fails the whole environment at init (call an env-level DuckDB connection `shared_duckdb` or similar).
42
+ - **A package `location` is local only when it starts with `./`, `../`, `~/`, or `/`.** Write `./sales`, not `sales`: a bare name is read as a remote URI, and the package is skipped with `Invalid package path: "sales". Must be an absolute mounted path or a GCS/S3/GitHub URI.` in `loadErrors`. A `./` or `../` path resolves against the config file's directory; `~/` against your home directory.
43
+ - **Local authoring means `--watch-env <env>`.** Without it the server copies each local package into `publisher_data/` at boot and serves the copy, so edits to your source directory are never read — a reload recompiles the copy and still answers 200. Adding the flag to a later boot does not undo a copy already made: pass `--watch-env <env> --init` once to re-mount (it wipes `publisher_data/` and re-syncs from config), then plain `--watch-env` boots keep watching. `publisher_data/<env>/<pkg>` tells you which you got — a symlink is mounted, a real directory is a copy.
44
+
45
+ Poll `curl -s http://localhost:4000/api/v0/status` until `operationalState` is `"serving"`, then check `loadErrors` (absent when everything loaded). The MCP endpoint for agents is `http://localhost:4040/mcp`.
46
+
5
47
  ## Configuration
6
48
 
7
- `publisher.config.json` lives in this directory. The repository root also contains a symlink (`/publisher.config.json` → `./packages/server/publisher.config.json`) so that running the server from either location picks up the same config. Edit one and you've edited both.
49
+ Two example configs ship in the npm package, beside this README: [`publisher.config.example.duckdb.json`](./publisher.config.example.duckdb.json) (the GitHub-hosted sample packages, no connection block) and [`publisher.config.example.bigquery.json`](./publisher.config.example.bigquery.json) (adds a BigQuery connection). Copy either one to `publisher.config.json` and point `--server_root` at its directory.
8
50
 
9
- For the BigQuery-enabled variant, see [`publisher.config.example.bigquery.json`](./publisher.config.example.bigquery.json) and the [Quick Start in the repo root README](../../README.md#quick-start).
51
+ In a clone, the live `publisher.config.json` lives in this directory, and the repository root contains a symlink (`/publisher.config.json` → `./packages/server/publisher.config.json`) so that running the server from either location picks up the same config. Edit one and you've edited both.
10
52
 
11
53
  ### Remaining deprecation warnings
12
54
 
@@ -15,11 +57,11 @@ Removing the unused `trino` CLI direct dep (it pulled in `@google-cloud/translat
15
57
  - **npm CLI tooling**: `npmlog`, `gauge`, `are-we-there-yet`, `glob@7/8/10`, `rimraf@3`, `tar@6.2.1`, `inflight`, `@npmcli/move-file`, `node-domexception`, `querystring` — pulled in by npm itself and by `node-pre-gyp`/`node-gyp`. Not actionable from this repo.
16
58
  - **`uuid@8.x` / `uuid@9.x`**: surfaced across multiple transitives (Malloy, AWS SDKs, others). Resolves when each upstream bumps to `uuid@11`.
17
59
  - **`q@1.5.1`**: pulled in via `thrift` → `@databricks/sql` → `@malloydata/db-databricks`. Resolves when Databricks upgrades `@databricks/sql` past the thrift dep, or when we replace the Databricks driver.
18
- - **`aws-sdk@2.1693.0`**: listed as a direct dep in `packages/server/package.json` but not imported anywhere in source — leftover, candidate for removal in a follow-up PR. The actual consumer is `@aws-sdk/client-s3` v3.
60
+ - **`aws-sdk@2.1693.0`**: no longer a direct dep (removed from `packages/server/package.json`); anything still surfacing it is transitive. The actual S3 consumer is `@aws-sdk/client-s3` v3.
19
61
 
20
62
  ## K6 Test Presets
21
63
 
22
- The Malloy Publisher Server includes several K6 test presets to help you test its performance and stability.
64
+ The Malloy Publisher Server includes several K6 test presets to help you test its performance and stability. These live in the repository, not the npm package, so run them from a clone.
23
65
 
24
66
  Below is a list of the available test presets:
25
67
 
@@ -124,7 +166,7 @@ For more information on how to configure OpenTelemetry collectors, please refer
124
166
 
125
167
  ## MCP Prompt Capability
126
168
 
127
- Publisher's MCP interface exposes the bundled agent **skills** (under [`skills/`](../../skills/)) as **LLM-ready prompts**, so hosts that ingest MCP but do not load skill files can pull the same guidance. For authoring or contributing skills, see [`docs/agent-skills/`](../../docs/agent-skills/).
169
+ Publisher's MCP interface exposes the bundled agent **skills** as **LLM-ready prompts**, so hosts that ingest MCP but do not load skill files can pull the same guidance. The skills are published separately as [`@malloy-publisher/skills`](https://www.npmjs.com/package/@malloy-publisher/skills); their source is [`skills/`](https://github.com/malloydata/publisher/tree/main/skills), and authoring guidance is in [`docs/agent-skills/`](https://github.com/malloydata/publisher/tree/main/docs/agent-skills).
128
170
 
129
171
  List prompts:
130
172
 
@@ -2530,10 +2530,12 @@ components:
2530
2530
  description:
2531
2531
  Configured packages and environments that did not load, and why. A
2532
2532
  load failure is not fatal to the server, so operationalState stays
2533
- serving and the affected packages are simply absent from
2534
- environments; this is the only place that difference is reported, so
2535
- check it before treating a serving server as complete. Present only
2536
- when something failed to load, so a healthy server omits the field.
2533
+ serving and the affected packages are absent from environments,
2534
+ unless the entry carries stale = true, in which case the package is
2535
+ still listed and still serving its last successful compile. This is
2536
+ the only place either difference is reported, so check it before
2537
+ treating a serving server as complete or current. Present only when
2538
+ something failed, so a healthy server omits the field.
2537
2539
  items:
2538
2540
  type: object
2539
2541
  properties:
@@ -2551,6 +2553,24 @@ components:
2551
2553
  message:
2552
2554
  type: string
2553
2555
  description: Why it did not load.
2556
+ stale:
2557
+ type: boolean
2558
+ description:
2559
+ When true, the package did load earlier and is still serving
2560
+ that last successful compile; the message is why its most
2561
+ recent reload (a watch-mode save, malloy_reloadPackage, or
2562
+ reload=true) failed. The served model is older than the files
2563
+ on disk. Absent on ordinary load failures. This array is the
2564
+ only place staleness is reported, because the package's entry
2565
+ under environments, and its own package resource, both read
2566
+ SERVING; join on the package name here to tell a current
2567
+ package from a stale one.
2568
+ failedAt:
2569
+ type: string
2570
+ format: date-time
2571
+ description:
2572
+ When the failed reload happened. Only present alongside
2573
+ stale = true.
2554
2574
  frozenConfig:
2555
2575
  type: boolean
2556
2576
  description:
@@ -2753,8 +2773,19 @@ components:
2753
2773
  location:
2754
2774
  type: string
2755
2775
  description:
2756
- Package location, can be an absolute path or URI (e.g. github, s3,
2757
- gcs, etc.)
2776
+ Package location. A LOCAL path must start with `./`, `../`, `~/`,
2777
+ or `/`; a `./` or `../` path resolves against the config file's
2778
+ directory, and `~/` against the home directory. Anything else is
2779
+ read as a remote URI (github, s3, gcs, https), so a bare name like
2780
+ `sales` is not local and the package is skipped with
2781
+ "Invalid package path" in the server's loadErrors. At boot a local
2782
+ package is COPIED into publisher_data/ and the copy is served, so
2783
+ edits to the source directory are not read; starting the server
2784
+ with `--watch-env <env>` mounts local packages in place (symlink)
2785
+ and live-reloads them instead. The mount is chosen when the
2786
+ environment is first loaded from config, so adding `--watch-env`
2787
+ to a later boot needs `--init` to re-mount a package already
2788
+ copied.
2758
2789
  scope:
2759
2790
  type: string
2760
2791
  enum:
@@ -2812,9 +2843,55 @@ components:
2812
2843
  findings: a `storage=` source not served from storage, a `#@ persist`
2813
2844
  source that was not recognized as materializable, a persist-target
2814
2845
  collision, and materialization-config problems that degrade
2815
- attribution. Server-computed and read-only: ignored on create/update
2816
- requests and only returned in responses. Present only when there are
2817
- such findings.
2846
+ attribution. Discovery findings: a model listed in `explores` whose
2847
+ export closure surfaces no sources or named queries, so it lists as
2848
+ empty and renders a blank page. Server-computed and read-only:
2849
+ ignored on create/update requests and only returned in responses.
2850
+ Present only when there are such findings.
2851
+
2852
+
2853
+ **Pre-aggregation contributes nothing to this array. A
2854
+ `#@ preaggregate` that cannot be honored is an ERROR, never a
2855
+ warning** — a 400 at publish or PATCH, and a load failure thereafter.
2856
+ Rejected are a `#@ preaggregate` anywhere but on a measure;
2857
+ a `#@ preaggregate` with no `grain=`;
2858
+ a grain naming anything but a dimension the base source itself
2859
+ declares, which rules out an inline time truncation such as
2860
+ `order_time.day`; a measure that cannot be correctly
2861
+ re-aggregated to a coarser grain, whether because its aggregate has no
2862
+ exact merge function (`count(distinct)`, `median`, percentiles, `mode`,
2863
+ and `avg` until it is decomposed) or because it carries its own filter,
2864
+ an ungrouping (`all`, `exclude`), or a required group-by; a measure
2865
+ whose expression cannot be POSITIVELY classified as re-aggregatable,
2866
+ which fails closed rather than being guessed at; a base source with a
2867
+ FAN-OUT join (`join_many` or `join_cross`), which can multiply rows,
2868
+ while a `join_one` is permitted and a measure aggregating through one
2869
+ is served normally; a base source that already fails persist eligibility (unbound
2870
+ parameters, `given` references, `#(authorize)` gates); `sharing=` or
2871
+ `schedule=` at the resource level; and a synthesized rollup name that
2872
+ collides with an existing model object. Each names the measure and the
2873
+ fix.
2874
+
2875
+
2876
+ Refusing rather than silently dropping the measure is the deliberate
2877
+ choice. A dropped measure is not served from the rollup at ANY grain,
2878
+ so the declaration would have no effect whatsoever while still reading
2879
+ as applied — and the build cost of the rollup would still be paid. An
2880
+ author who writes `#@ preaggregate` on a measure that cannot be rolled
2881
+ up has made a modeling mistake, and an error is where a mistake
2882
+ belongs.
2883
+
2884
+
2885
+ The same verdict is enforced at LOAD, not only at publish, so a
2886
+ package whose declarations stopped being honorable does not load at
2887
+ all: it is absent from its environment and reported in
2888
+ `ServerStatus.loadErrors`. Worth knowing because whether a measure can
2889
+ be re-aggregated is derived from the compiled model, so a Malloy
2890
+ version change can in principle reclassify a measure that published
2891
+ cleanly long before. That surfaces as a package that stops loading
2892
+ rather than as a package quietly serving without its rollups — louder,
2893
+ and deliberately so, since the alternative is paying for rollups that
2894
+ answer nothing.
2818
2895
  items:
2819
2896
  type: object
2820
2897
  properties:
@@ -2850,15 +2927,28 @@ components:
2850
2927
  description: >-
2851
2928
  Controls whether the discovery surface is also a query boundary.
2852
2929
  `"declared"` (the default) makes queryable == discoverable: when
2853
- `explores` is declared, only `explores` model files and within
2854
- them only the `export {}` closure are valid top-level query
2855
- targets; every other source still compiles, imports, joins, and
2856
- extends but is not directly queryable (denied with 404). `"all"`
2857
- decouples them: `explores`/`export {}` gate discovery only and every
2858
- compiled source stays directly queryable. When `explores` is absent
2859
- there is no curated surface, so both modes are equivalent
2860
- (everything queryable). Invalid values fall back to `"declared"`.
2861
- Identity-based access is a separate concern see `#(authorize)`.
2930
+ `explores` is declared, only `explores` model files are valid query
2931
+ entry points, and the queryable sources are the union of those
2932
+ files' `export {}` closures — so a source exported by any listed
2933
+ file stays queryable whichever listed model path the request
2934
+ addresses it through. Admission is by declaration, not by name: a
2935
+ request clears only when the model it names resolves the name to the
2936
+ very source a listed file exported, so a same-named source declared
2937
+ in a hidden file is not admitted by the coincidence. Every other
2938
+ source still compiles, imports, joins, and extends but is not
2939
+ directly queryable (denied with 404).
2940
+ The `/compile` endpoint is exempt (compile is the authoring loop;
2941
+ the boundary is discovery curation, not access control — for
2942
+ confidentiality use `#(authorize)`, which gates compile too). A
2943
+ source that is both hidden and `#(authorize)`-gated still answers
2944
+ `/compile` with the generic 404, so the exemption cannot be used to
2945
+ enumerate gated names.
2946
+ `"all"` decouples the axes: `explores`/`export {}` gate discovery
2947
+ only and every compiled source stays directly queryable. When
2948
+ `explores` is absent there is no curated surface, so both modes are
2949
+ equivalent (everything queryable). Invalid values fall back to
2950
+ `"declared"`. Identity-based access is a separate concern — see
2951
+ `#(authorize)`.
2862
2952
  manifestLocation:
2863
2953
  type: ["string", "null"]
2864
2954
  description: |
@@ -3799,7 +3889,14 @@ components:
3799
3889
  description: Resource path to the connection
3800
3890
  name:
3801
3891
  type: string
3802
- description: Name of the connection
3892
+ description:
3893
+ Name of the connection. The name `duckdb` is RESERVED for the
3894
+ per-package DuckDB sandbox every loaded package gets automatically;
3895
+ declaring an environment-level connection with that name fails the
3896
+ whole environment at init. A flat-file (CSV/Parquet/XLSX) package
3897
+ needs no connection entry at all — its models reach the sandbox as
3898
+ `duckdb.table('data/…')`. Name an environment-level DuckDB
3899
+ connection something else (e.g. `shared_duckdb`).
3803
3900
  type:
3804
3901
  type: string
3805
3902
  description: Type of database connection
@@ -4773,6 +4870,45 @@ components:
4773
4870
  type: string
4774
4871
  dialect:
4775
4872
  type: string
4873
+ origin:
4874
+ type: string
4875
+ enum: [persist, preaggregate]
4876
+ default: persist
4877
+ description: >-
4878
+ Which authoring annotation produced this plan entry. `persist` — the
4879
+ modeler wrote `#@ persist` on the source; every entry on a deployment
4880
+ that uses no pre-aggregation, and the meaning of an absent value.
4881
+ `preaggregate` — the modeler wrote `#@ preaggregate` on measures of
4882
+ `preaggregate.baseSourceName`, and the publisher SYNTHESIZED this
4883
+ rollup source to serve them.
4884
+
4885
+
4886
+ Note that BOTH kinds carry a `#@ persist` annotation by the time they
4887
+ reach this plan, because synthesis emits one (see `annotationFields`).
4888
+ So this reports which surface the AUTHOR used, not which annotation
4889
+ sits on the source — which is the question worth answering, since a
4890
+ `preaggregate` entry's `name` appears in no model file and without
4891
+ this field an operator or orchestrator sees a source nobody wrote with
4892
+ no way to tell it from one they did.
4893
+
4894
+
4895
+ Everything downstream is deliberately indifferent to it: a synthesized
4896
+ entry is built, identified, manifested, shared and garbage-collected
4897
+ exactly like a hand-written one.
4898
+ preaggregate:
4899
+ oneOf:
4900
+ - $ref: "#/components/schemas/PreaggregatePlan"
4901
+ - type: "null"
4902
+ description: >-
4903
+ What the synthesized rollup covers: the base source it was derived
4904
+ from, the one grain it is built at, and the measures served there.
4905
+ Present only when `origin` is `preaggregate`; null otherwise.
4906
+
4907
+
4908
+ Coverage is complete by construction — a measure that cannot be
4909
+ correctly re-aggregated is refused at publish rather than dropped
4910
+ from the rollup — so there is no per-measure omission list to
4911
+ reconcile against the model.
4776
4912
  sourceEntityId:
4777
4913
  type: string
4778
4914
  description: >-
@@ -4811,6 +4947,14 @@ components:
4811
4947
  scope modes. (Per-source `sharing`/`schedule` were retired: scope is
4812
4948
  a single package-level mode and a schedule is package-root-only —
4813
4949
  declaring either on a source is a publish-time manifest error.)
4950
+
4951
+
4952
+ A synthesized rollup (`origin: preaggregate`) declares nothing of its
4953
+ own and gets no freshness policy of its own: it INHERITS its base's,
4954
+ so what is reported here is the base source's effective objective
4955
+ resolved by the rule above. A rollup and its base therefore go stale
4956
+ together, which is what makes "serve the base when the rollup is
4957
+ stale" a safe degradation rather than a change of answer.
4814
4958
  queryMetadata:
4815
4959
  oneOf:
4816
4960
  - $ref: "#/components/schemas/QueryMetadata"
@@ -4865,15 +5009,142 @@ components:
4865
5009
  a dangling or stale name is rejected rather than deferred to a build.
4866
5010
  Neither participates in `sourceEntityId`: adding a watermark to an
4867
5011
  existing source must not re-address its table.
5012
+
5013
+
5014
+ For a synthesized rollup (`origin: preaggregate`) the annotation was
5015
+ generated by the publisher rather than authored, so this reports what
5016
+ synthesis emitted. It is still the annotation that governs the build,
5017
+ which is why it is reported the same way: a rollup is an ordinary
5018
+ persist source whose `#@ persist` nobody typed.
4868
5019
  modelPath:
4869
5020
  type: string
4870
- description:
5021
+ description: >-
4871
5022
  Package-relative path of the `.malloy` model that declares this
4872
5023
  source (e.g. `order_rollup.malloy`). The source's sourceID embeds an
4873
5024
  absolute `file://` modelURL with no package boundary, so this is the
4874
5025
  only place the relative path is exposed; callers use it to deep-link
4875
5026
  the source back to its model.
4876
5027
 
5028
+
5029
+ A synthesized rollup (`origin: preaggregate`) is declared by no model,
5030
+ so this is the model of its base — the file holding the
5031
+ `#@ preaggregate` annotations it was synthesized from, which is where
5032
+ an author would go to change it.
5033
+
5034
+ PreaggregatePlan:
5035
+ type: object
5036
+ description: >-
5037
+ Provenance for a rollup source synthesized from `#@ preaggregate`
5038
+ annotations. A query never names a rollup, never changes shape because one
5039
+ exists, and gets the same answer whether one is used or not, so this is
5040
+ the only place the set of rollups and the coverage of each is visible at
5041
+ all.
5042
+
5043
+
5044
+ **This object describes ONE rollup table, at ONE grain.** A rollup is a
5045
+ single `GROUP BY`, so a grain is a property of the table, not of the
5046
+ individual measures in it: `grainDimensions` lists the dimensions of that
5047
+ one grain, and `measures` are the measures served at it.
5048
+
5049
+
5050
+ That inverts how the grain was authored, which is worth knowing before
5051
+ reading a plan. The modeler declares per measure — `#@ preaggregate
5052
+ grain="order_day, category"` — and may declare a measure at SEVERAL grains
5053
+ by writing several annotation lines on it, each of which is its own rollup.
5054
+ The publisher then packs every measure declaring the same (grain,
5055
+ connection, base source) into a single synthesized source, because ten
5056
+ measures at one grain should be one table and one CTAS rather than ten. So
5057
+ the plan has one entry per DISTINCT grain declared anywhere on the source,
5058
+ which is neither the number of annotated measures nor the number of
5059
+ annotations: a measure declared at two grains appears in two entries, and
5060
+ two measures sharing a grain appear in one. To recover the per-measure view
5061
+ that was written, iterate `buildPlan.sources`, keep the `origin:
5062
+ preaggregate` entries, and invert each entry's grain-to-measures pairing.
5063
+
5064
+
5065
+ Choosing between two rollups and one at the combined grain is a size
5066
+ judgement, not a correctness one — see `grainDimensions`.
5067
+ required: [baseSourceName, grainDimensions, measures]
5068
+ properties:
5069
+ baseSourceName:
5070
+ type: string
5071
+ description: >-
5072
+ The source whose measures carry the `#@ preaggregate` annotations this
5073
+ rollup was synthesized from. Queries name THIS source; the rollup is
5074
+ selected behind it, or bypassed, per grain coverage.
5075
+ grainDimensions:
5076
+ type: array
5077
+ items:
5078
+ type: string
5079
+ description: >-
5080
+ The dimensions of the ONE grain this rollup is built at — the parsed
5081
+ form of a single `grain=` annotation value, so `grain="order_day,
5082
+ category"` reports as two entries here and not as two grains.
5083
+
5084
+
5085
+ **Every entry is a dimension the base source itself declares**, never
5086
+ a truncation written inline. `grain="order_time.day"` is refused at
5087
+ publish: a stored column of truncated values either shadows the base's
5088
+ own `order_time` and answers untruncated queries from truncated rows,
5089
+ or is named something no query references and serves nothing. So time
5090
+ grains are reached by declaring `dimension: order_day is
5091
+ order_time.day` on the source and naming `order_day` here.
5092
+
5093
+
5094
+ **Sorted, and canonically so.** Synthesis derives the rollup's name
5095
+ and identity from the sorted grain, so two authors who write the same
5096
+ dimensions in different orders get one table rather than two. Compare
5097
+ grains as sets using this list; never by the annotation's original
5098
+ string, which is not canonical.
5099
+
5100
+
5101
+ A query can be answered here only if this grain covers it: every
5102
+ dimension the query groups by is in this list, or is a coarser
5103
+ truncation of one (a `month` of a stored `order_day` is derivable and
5104
+ does route; a `day` of a stored `order_month` is not). Which makes the
5105
+ set of grains ACROSS a package the whole performance story, and the
5106
+ reason adding a rollup per query shape is the documented way to spend
5107
+ more on builds than you save.
5108
+
5109
+
5110
+ Note that covering does not require an exact match: a query grouping
5111
+ by a SUBSET of these dimensions — or by none of them — is served here
5112
+ too, by re-aggregating across the ones it omits. So one rollup at the
5113
+ finest grain an author needs does subsume every coarser one, and a
5114
+ combined grain is often the economical choice.
5115
+
5116
+
5117
+ That subsumption is about coverage, though, not cost, and it is why a
5118
+ measure may still be declared at several grains. A combined grain has
5119
+ roughly the PRODUCT of its dimensions' cardinalities, so
5120
+ `customer_id, order_day` can approach the base table's row count and
5121
+ save almost nothing, while `order_day` alone is tiny. Two rollups then
5122
+ beat one, each query reading the smallest that covers it, at the price
5123
+ of two tables to build and refresh. Correctness is identical either
5124
+ way; the choice is size against build cost.
5125
+ measures:
5126
+ type: array
5127
+ items:
5128
+ type: string
5129
+ description: >-
5130
+ The measures served at this rollup's grain, under their original names
5131
+ — the names a query uses, not the names of the partial-aggregate
5132
+ columns stored to serve them. A query using only these, at a grain
5133
+ this rollup covers, is eligible to be served from its table.
5134
+
5135
+
5136
+ These are the measures whose `#@ preaggregate` named THIS grain. A
5137
+ measure declared at a different grain is not missing: it is in the
5138
+ plan entry for that grain. Do not read this list as the base source's
5139
+ full set of pre-aggregated measures — that is the union of these lists
5140
+ across every entry sharing a `baseSourceName`.
5141
+
5142
+
5143
+ **Every measure that declared this grain is here.** There is no
5144
+ partial rollup and no per-measure omission to check: a measure that
5145
+ cannot be correctly re-aggregated is refused at publish, so a rollup
5146
+ that exists carries everything that asked to be in it.
5147
+
4877
5148
  Realization:
4878
5149
  type: string
4879
5150
  enum: [SNAPSHOT, COPY]
@@ -5117,8 +5388,40 @@ components:
5117
5388
  properties:
5118
5389
  sourceEntityId:
5119
5390
  type: string
5391
+ error:
5392
+ type: [string, "null"]
5393
+ description: >-
5394
+ Why this source failed to materialize, in the words the warehouse or
5395
+ compiler reported. Present only on a source that failed; absent on one
5396
+ that built, whose table the remaining fields describe. A build that
5397
+ loses some of its sources still returns the ones that succeeded, so an
5398
+ entry carrying this is how a consumer tells a failed source from a
5399
+ healthy one.
5120
5400
  sourceName:
5121
5401
  type: string
5402
+ description: >-
5403
+ The persist source this table was built for. Convenience only:
5404
+ `sourceEntityId` is the identity, and this is the human-readable label
5405
+ beside it.
5406
+
5407
+
5408
+ **It may name no source in any model file.** A pre-aggregation rollup
5409
+ is a persist source the publisher synthesized, so its name is
5410
+ generated (see `PersistSourcePlan.origin`). Match on
5411
+ `sourceEntityId`; do not resolve this against a package's models and
5412
+ treat a miss as a corrupt manifest.
5413
+ origin:
5414
+ type: string
5415
+ enum: [persist, preaggregate]
5416
+ default: persist
5417
+ description: >-
5418
+ Mirrors `PersistSourcePlan.origin` for the source this entry was built
5419
+ from: `persist` for a source the modeler wrote `#@ persist` on, which
5420
+ is the meaning of an absent value, and `preaggregate` for a rollup
5421
+ synthesized from `#@ preaggregate` measures. Repeated here because a
5422
+ manifest travels without its build plan, and a consumer holding only
5423
+ the manifest otherwise cannot tell why it holds a table for a source
5424
+ that does not appear in the package.
5122
5425
  materializedTableId:
5123
5426
  type: string
5124
5427
  description: Echoes the caller-assigned id from the BuildInstruction.
@@ -1 +1 @@
1
- import{$ as r,H as t,j as e,a1 as i,aa as o}from"./index-B8MmVXwE.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{$ as r,H as t,j as e,a1 as i,aa as o}from"./index-DJ-3RN5W.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 +1 @@
1
- import{$ as n,j as t,e as o}from"./index-B8MmVXwE.js";function s(){const e=n();return t.jsx(o,{onClickEnvironment:e})}export{s as default};
1
+ import{$ as n,j as t,e as o}from"./index-DJ-3RN5W.js";function s(){const e=n();return t.jsx(o,{onClickEnvironment:e})}export{s as default};
@@ -1 +1 @@
1
- import{c,j as s}from"./index-B8MmVXwE.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-DJ-3RN5W.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,2 +1,2 @@
1
- import{u as Pe,g as Ee,r as u,R as Ce,a as Ie,c as S,j as t,s as M,B as Me,m as J,b as oe,d as le,f as ce,h as de,i as ze,k as O,l as pe,T as U,n as Z,o as Te,p as De,q as Re,t as ue,v as Be,w as se,x as Le,y as He,z as $e,A,C as $,M as Ne,P as Ae,D as We,E as Oe,S as Ve,F as Ue,G as Q,I as V,H as he,$ as q,J as f,K as Qe,L as xe,N as F,O as Fe,Q as Xe,U as ae,V as fe,W as me,X as ge,Y as Ye,Z as _e,_ as Ke}from"./index-B8MmVXwE.js";import{D as Ge,L as Je}from"./LightMode-DiRk-oG_.js";function Ze(e,r,n,o,s){const[a,i]=u.useState(()=>s&&n?n(e).matches:o?o(e).matches:r);return Ie(()=>{if(!n)return;const c=n(e),h=()=>{i(c.matches)};return h(),c.addEventListener("change",h),()=>{c.removeEventListener("change",h)}},[e,n]),a}const qe={...Ce},ye=qe.useSyncExternalStore;function et(e,r,n,o,s){const a=u.useCallback(()=>r,[r]),i=u.useMemo(()=>{if(s&&n)return()=>n(e).matches;if(o!==null){const{matches:p}=o(e);return()=>p}return a},[a,e,o,s,n]),[c,h]=u.useMemo(()=>{if(n===null)return[a,()=>()=>{}];const p=n(e);return[()=>p.matches,m=>(p.addEventListener("change",m),()=>{p.removeEventListener("change",m)})]},[a,n,e]);return ye(h,c,i)}function be(e={}){const{themeId:r}=e;return function(o,s={}){let a=Pe();a&&r&&(a=a[r]||a);const i=typeof window<"u"&&typeof window.matchMedia<"u",{defaultMatches:c=!1,matchMedia:h=i?window.matchMedia:null,ssrMatchMedia:x=null,noSsr:p=!1}=Ee({name:"MuiUseMediaQuery",props:s,theme:a});let m=typeof o=="function"?o(a):o;return m=m.replace(/^@media( ?)/m,""),m.includes("print")&&console.warn(["MUI: You have provided a `print` query to the `useMediaQuery` hook.","Using the print media query to modify print styles can lead to unexpected results.","Consider using the `displayPrint` field in the `sx` prop instead.","More information about `displayPrint` on our docs: https://mui.com/system/display/#display-in-print."].join(`
1
+ import{u as Pe,g as Ee,r as u,R as Ce,a as Ie,c as S,j as t,s as M,B as Me,m as J,b as oe,d as le,f as ce,h as de,i as ze,k as O,l as pe,T as U,n as Z,o as Te,p as De,q as Re,t as ue,v as Be,w as se,x as Le,y as He,z as $e,A,C as $,M as Ne,P as Ae,D as We,E as Oe,S as Ve,F as Ue,G as Q,I as V,H as he,$ as q,J as f,K as Qe,L as xe,N as F,O as Fe,Q as Xe,U as ae,V as fe,W as me,X as ge,Y as Ye,Z as _e,_ as Ke}from"./index-DJ-3RN5W.js";import{D as Ge,L as Je}from"./LightMode-CM8J0nPB.js";function Ze(e,r,n,o,s){const[a,i]=u.useState(()=>s&&n?n(e).matches:o?o(e).matches:r);return Ie(()=>{if(!n)return;const c=n(e),h=()=>{i(c.matches)};return h(),c.addEventListener("change",h),()=>{c.removeEventListener("change",h)}},[e,n]),a}const qe={...Ce},ye=qe.useSyncExternalStore;function et(e,r,n,o,s){const a=u.useCallback(()=>r,[r]),i=u.useMemo(()=>{if(s&&n)return()=>n(e).matches;if(o!==null){const{matches:p}=o(e);return()=>p}return a},[a,e,o,s,n]),[c,h]=u.useMemo(()=>{if(n===null)return[a,()=>()=>{}];const p=n(e);return[()=>p.matches,m=>(p.addEventListener("change",m),()=>{p.removeEventListener("change",m)})]},[a,n,e]);return ye(h,c,i)}function be(e={}){const{themeId:r}=e;return function(o,s={}){let a=Pe();a&&r&&(a=a[r]||a);const i=typeof window<"u"&&typeof window.matchMedia<"u",{defaultMatches:c=!1,matchMedia:h=i?window.matchMedia:null,ssrMatchMedia:x=null,noSsr:p=!1}=Ee({name:"MuiUseMediaQuery",props:s,theme:a});let m=typeof o=="function"?o(a):o;return m=m.replace(/^@media( ?)/m,""),m.includes("print")&&console.warn(["MUI: You have provided a `print` query to the `useMediaQuery` hook.","Using the print media query to modify print styles can lead to unexpected results.","Consider using the `displayPrint` field in the `sx` prop instead.","More information about `displayPrint` on our docs: https://mui.com/system/display/#display-in-print."].join(`
2
2
  `)),(ye!==void 0?et:Ze)(m,c,h,x,p)}}be();const tt=S(t.jsx("path",{d:"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"})),rt=M(Me,{name:"MuiBreadcrumbCollapsed"})(J(({theme:e})=>({display:"flex",marginLeft:`calc(${e.spacing(1)} * 0.5)`,marginRight:`calc(${e.spacing(1)} * 0.5)`,...e.palette.mode==="light"?{backgroundColor:e.palette.grey[100],color:e.palette.grey[700]}:{backgroundColor:e.palette.grey[700],color:e.palette.grey[100]},borderRadius:2,"&:hover, &:focus":{...e.palette.mode==="light"?{backgroundColor:e.palette.grey[200]}:{backgroundColor:e.palette.grey[600]}},"&:active":{boxShadow:e.shadows[0],...e.palette.mode==="light"?{backgroundColor:oe(e.palette.grey[200],.12)}:{backgroundColor:oe(e.palette.grey[600],.12)}}}))),nt=M(tt)({width:24,height:16});function ot(e){const{slots:r={},slotProps:n={},...o}=e,s=e;return t.jsx("li",{children:t.jsx(rt,{focusRipple:!0,...o,ownerState:s,children:t.jsx(nt,{as:r.CollapsedIcon,ownerState:s,...n.collapsedIcon})})})}function st(e){return ce("MuiBreadcrumbs",e)}const at=le("MuiBreadcrumbs",["root","ol","li","separator"]),it=e=>{const{classes:r}=e;return pe({root:["root"],li:["li"],ol:["ol"],separator:["separator"]},st,r)},lt=M(U,{name:"MuiBreadcrumbs",slot:"Root",overridesResolver:(e,r)=>[{[`& .${at.li}`]:r.li},r.root]})({}),ct=M("ol",{name:"MuiBreadcrumbs",slot:"Ol"})({display:"flex",flexWrap:"wrap",alignItems:"center",padding:0,margin:0,listStyle:"none"}),dt=M("li",{name:"MuiBreadcrumbs",slot:"Separator"})({display:"flex",userSelect:"none",marginLeft:8,marginRight:8});function pt(e,r,n,o){return e.reduce((s,a,i)=>(i<e.length-1?s=s.concat(a,t.jsx(dt,{"aria-hidden":!0,className:r,ownerState:o,children:n},`separator-${i}`)):s.push(a),s),[])}const ut=u.forwardRef(function(r,n){const o=de({props:r,name:"MuiBreadcrumbs"}),{children:s,className:a,component:i="nav",slots:c={},slotProps:h={},expandText:x="Show path",itemsAfterCollapse:p=1,itemsBeforeCollapse:m=1,maxItems:y=8,separator:P="/",...H}=o,[z,E]=u.useState(!1),v={...o,component:i,expanded:z,expandText:x,itemsAfterCollapse:p,itemsBeforeCollapse:m,maxItems:y,separator:P},C=it(v),T=ze({elementType:c.CollapsedIcon,externalSlotProps:h.collapsedIcon,ownerState:v}),j=u.useRef(null),k=d=>{const w=()=>{E(!0);const b=j.current.querySelector("a[href],button,[tabindex]");b&&b.focus()};return m+p>=d.length?d:[...d.slice(0,m),t.jsx(ot,{"aria-label":x,slots:{CollapsedIcon:c.CollapsedIcon},slotProps:{collapsedIcon:T},onClick:w},"ellipsis"),...d.slice(d.length-p,d.length)]},D=u.Children.toArray(s).filter(d=>u.isValidElement(d)).map((d,w)=>t.jsx("li",{className:C.li,children:d},`child-${w}`));return t.jsx(lt,{ref:n,component:i,color:"textSecondary",className:O(C.root,a),ownerState:v,...H,children:t.jsx(ct,{className:C.ol,ref:j,ownerState:v,children:pt(z||y&&D.length<=y?D:k(D),C.separator,P,v)})})});function ht(e,r,n){const o=r.getBoundingClientRect(),s=n&&n.getBoundingClientRect(),a=ue(r);let i;if(r.fakeTransform)i=r.fakeTransform;else{const x=a.getComputedStyle(r);i=x.getPropertyValue("-webkit-transform")||x.getPropertyValue("transform")}let c=0,h=0;if(i&&i!=="none"&&typeof i=="string"){const x=i.split("(")[1].split(")")[0].split(",");c=parseInt(x[4],10),h=parseInt(x[5],10)}return e==="left"?s?`translateX(${s.right+c-o.left}px)`:`translateX(${a.innerWidth+c-o.left}px)`:e==="right"?s?`translateX(-${o.right-s.left-c}px)`:`translateX(-${o.left+o.width-c}px)`:e==="up"?s?`translateY(${s.bottom+h-o.top}px)`:`translateY(${a.innerHeight+h-o.top}px)`:s?`translateY(-${o.top-s.top+o.height-h}px)`:`translateY(-${o.top+o.height-h}px)`}function xt(e){return typeof e=="function"?e():e}function W(e,r,n){const o=xt(n),s=ht(e,r,o);s&&(r.style.webkitTransform=s,r.style.transform=s)}const ft=u.forwardRef(function(r,n){const o=Z(),s={enter:o.transitions.easing.easeOut,exit:o.transitions.easing.sharp},a={enter:o.transitions.duration.enteringScreen,exit:o.transitions.duration.leavingScreen},{addEndListener:i,appear:c=!0,children:h,container:x,direction:p="down",easing:m=s,in:y,onEnter:P,onEntered:H,onEntering:z,onExit:E,onExited:v,onExiting:C,style:T,timeout:j=a,TransitionComponent:k=Te,...D}=r,d=u.useRef(null),w=De(Re(h),d,n),b=l=>g=>{l&&(g===void 0?l(d.current):l(d.current,g))},X=b((l,g)=>{W(p,l,x),Le(l),P&&P(l,g)}),te=b((l,g)=>{const L=se({timeout:j,style:T,easing:m},{mode:"enter"});l.style.webkitTransition=o.transitions.create("-webkit-transform",{...L}),l.style.transition=o.transitions.create("transform",{...L}),l.style.webkitTransform="none",l.style.transform="none",z&&z(l,g)}),R=b(H),B=b(C),I=b(l=>{const g=se({timeout:j,style:T,easing:m},{mode:"exit"});l.style.webkitTransition=o.transitions.create("-webkit-transform",g),l.style.transition=o.transitions.create("transform",g),W(p,l,x),E&&E(l)}),Y=b(l=>{l.style.webkitTransition="",l.style.transition="",v&&v(l)}),_=l=>{i&&i(d.current,l)},N=u.useCallback(()=>{d.current&&W(p,d.current,x)},[p,x]);return u.useEffect(()=>{if(y||p==="down"||p==="right")return;const l=Be(()=>{d.current&&W(p,d.current,x)}),g=ue(d.current);return g.addEventListener("resize",l),()=>{l.clear(),g.removeEventListener("resize",l)}},[p,y,x]),u.useEffect(()=>{y||N()},[y,N]),t.jsx(k,{nodeRef:d,onEnter:X,onEntered:R,onEntering:te,onExit:I,onExited:Y,onExiting:B,addEndListener:_,appear:c,in:y,timeout:j,...D,children:(l,{ownerState:g,...L})=>u.cloneElement(h,{ref:w,style:{visibility:l==="exited"&&!y?"hidden":void 0,...T,...h.props.style},...L})})});function mt(e){return ce("MuiDrawer",e)}le("MuiDrawer",["root","docked","paper","anchorLeft","anchorRight","anchorTop","anchorBottom","paperAnchorLeft","paperAnchorRight","paperAnchorTop","paperAnchorBottom","paperAnchorDockedLeft","paperAnchorDockedRight","paperAnchorDockedTop","paperAnchorDockedBottom","modal"]);const ve=(e,r)=>{const{ownerState:n}=e;return[r.root,(n.variant==="permanent"||n.variant==="persistent")&&r.docked,r.modal]},gt=e=>{const{classes:r,anchor:n,variant:o}=e,s={root:["root",`anchor${$(n)}`],docked:[(o==="permanent"||o==="persistent")&&"docked"],modal:["modal"],paper:["paper",`paperAnchor${$(n)}`,o!=="temporary"&&`paperAnchorDocked${$(n)}`]};return pe(s,mt,r)},yt=M(Ne,{name:"MuiDrawer",slot:"Root",overridesResolver:ve})(J(({theme:e})=>({zIndex:(e.vars||e).zIndex.drawer}))),bt=M("div",{shouldForwardProp:We,name:"MuiDrawer",slot:"Docked",skipVariantsResolver:!1,overridesResolver:ve})({flex:"0 0 auto"}),vt=M(Ae,{name:"MuiDrawer",slot:"Paper",overridesResolver:(e,r)=>{const{ownerState:n}=e;return[r.paper,r[`paperAnchor${$(n.anchor)}`],n.variant!=="temporary"&&r[`paperAnchorDocked${$(n.anchor)}`]]}})(J(({theme:e})=>({overflowY:"auto",display:"flex",flexDirection:"column",height:"100%",flex:"1 0 auto",zIndex:(e.vars||e).zIndex.drawer,WebkitOverflowScrolling:"touch",position:"fixed",top:0,outline:0,variants:[{props:{anchor:"left"},style:{left:0}},{props:{anchor:"top"},style:{top:0,left:0,right:0,height:"auto",maxHeight:"100%"}},{props:{anchor:"right"},style:{right:0}},{props:{anchor:"bottom"},style:{top:"auto",left:0,bottom:0,right:0,height:"auto",maxHeight:"100%"}},{props:({ownerState:r})=>r.anchor==="left"&&r.variant!=="temporary",style:{borderRight:`1px solid ${(e.vars||e).palette.divider}`}},{props:({ownerState:r})=>r.anchor==="top"&&r.variant!=="temporary",style:{borderBottom:`1px solid ${(e.vars||e).palette.divider}`}},{props:({ownerState:r})=>r.anchor==="right"&&r.variant!=="temporary",style:{borderLeft:`1px solid ${(e.vars||e).palette.divider}`}},{props:({ownerState:r})=>r.anchor==="bottom"&&r.variant!=="temporary",style:{borderTop:`1px solid ${(e.vars||e).palette.divider}`}}]}))),je={left:"right",right:"left",top:"down",bottom:"up"};function jt(e){return["left","right"].includes(e)}function kt({direction:e},r){return e==="rtl"&&jt(r)?je[r]:r}const wt=u.forwardRef(function(r,n){const o=de({props:r,name:"MuiDrawer"}),s=Z(),a=He(),i={enter:s.transitions.duration.enteringScreen,exit:s.transitions.duration.leavingScreen},{anchor:c="left",BackdropProps:h,children:x,className:p,elevation:m=16,hideBackdrop:y=!1,ModalProps:{BackdropProps:P,...H}={},onClose:z,open:E=!1,PaperProps:v={},SlideProps:C,TransitionComponent:T,transitionDuration:j=i,variant:k="temporary",slots:D={},slotProps:d={},...w}=o,b=u.useRef(!1);u.useEffect(()=>{b.current=!0},[]);const X=kt({direction:a?"rtl":"ltr"},c),R={...o,anchor:c,elevation:m,open:E,variant:k,...w},B=gt(R),I={slots:{transition:T,...D},slotProps:{paper:v,transition:C,...d,backdrop:$e(d.backdrop||{...h,...P},{transitionDuration:j})}},[Y,_]=A("root",{ref:n,elementType:yt,className:O(B.root,B.modal,p),shouldForwardComponentProp:!0,ownerState:R,externalForwardedProps:{...I,...w,...H},additionalProps:{open:E,onClose:z,hideBackdrop:y,slots:{backdrop:I.slots.backdrop},slotProps:{backdrop:I.slotProps.backdrop}}}),[N,l]=A("paper",{elementType:vt,shouldForwardComponentProp:!0,className:O(B.paper,v.className),ownerState:R,externalForwardedProps:I,additionalProps:{elevation:k==="temporary"?m:0,square:!0,...k==="temporary"&&{role:"dialog","aria-modal":"true"}}}),[g,L]=A("docked",{elementType:bt,ref:n,className:O(B.root,B.docked,p),ownerState:R,externalForwardedProps:I,additionalProps:w}),[we,Se]=A("transition",{elementType:ft,ownerState:R,externalForwardedProps:I,additionalProps:{in:E,direction:je[X],timeout:j,appear:b.current}}),re=t.jsx(N,{...l,children:x});if(k==="permanent")return t.jsx(g,{...L,children:re});const ne=t.jsx(we,{...Se,children:re});return k==="persistent"?t.jsx(g,{...L,children:ne}):t.jsx(Y,{..._,children:ne})}),St=be({themeId:Oe}),Pt=S([t.jsx("path",{d:"M19 5v14H5V5zm0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2"},"0"),t.jsx("path",{d:"M14 17H7v-2h7zm3-4H7v-2h10zm0-4H7V7h10z"},"1")]),Et=S(t.jsx("path",{d:"M10.85 12.65h2.3L12 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zM14.3 16l-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9z"})),Ct=S(t.jsx("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),It=S(t.jsx("path",{d:"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6z"})),Mt=S(t.jsx("path",{d:"m9.17 6 2 2H20v10H4V6zM10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8z"})),zt=S(t.jsx("path",{d:"m12 5.69 5 4.5V18h-2v-6H9v6H7v-7.81zM12 3 2 12h3v8h6v-6h2v6h6v-8h3z"})),Tt=S(t.jsx("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z"})),Dt=S([t.jsx("path",{d:"M12 22C6.49 22 2 17.51 2 12S6.49 2 12 2s10 4.04 10 9c0 3.31-2.69 6-6 6h-1.77c-.28 0-.5.22-.5.5 0 .12.05.23.13.33.41.47.64 1.06.64 1.67 0 1.38-1.12 2.5-2.5 2.5m0-18c-4.41 0-8 3.59-8 8s3.59 8 8 8c.28 0 .5-.22.5-.5 0-.16-.08-.28-.14-.35-.41-.46-.63-1.05-.63-1.65 0-1.38 1.12-2.5 2.5-2.5H16c2.21 0 4-1.79 4-4 0-3.86-3.59-7-8-7"},"0"),t.jsx("circle",{cx:"6.5",cy:"11.5",r:"1.5"},"1"),t.jsx("circle",{cx:"9.5",cy:"7.5",r:"1.5"},"2"),t.jsx("circle",{cx:"14.5",cy:"7.5",r:"1.5"},"3"),t.jsx("circle",{cx:"17.5",cy:"11.5",r:"1.5"},"4")]);function G(e){return t.jsxs(Ve,{...e,viewBox:"0 0 24 24",sx:{fill:"none",...e.sx},children:[t.jsx("rect",{x:"3.25",y:"4.75",width:"17.5",height:"14.5",rx:"2.25",stroke:"currentColor",strokeWidth:"1.5"}),t.jsx("line",{x1:"8.5",y1:"5",x2:"8.5",y2:"19",stroke:"currentColor",strokeWidth:"1.5"})]})}const Rt={light:"dark",dark:"auto",auto:"light"},ie={light:"Light mode (click for dark)",dark:"Dark mode (click for auto)",auto:"Auto mode (follows OS, click for light)"};function Bt(){const{mode:e,userChoice:r,setMode:n,allowUserToggle:o}=Ue();if(!o)return null;const s=r??e,a=Rt[s],i=s==="auto"?Et:s==="dark"?Ge:Je;return t.jsx(Q,{title:ie[s],children:t.jsx(V,{"aria-label":ie[s],onClick:()=>n(a),size:"small",children:t.jsx(i,{fontSize:"small"})})})}function K({label:e,onClick:r}){return t.jsx(Qe,{clickable:!0,onClick:r,label:e,size:"small","aria-label":`Navigate to ${e}`,sx:n=>({backgroundColor:"background.paper",color:"text.primary",fontWeight:500,fontSize:"0.875rem",height:32,cursor:"pointer",borderRadius:"4px",maxWidth:320,"& .MuiChip-label":{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},"&:hover":{backgroundColor:n.palette.mode==="dark"?"rgba(255, 255, 255, 0.08)":"grey.100"}})})}function Lt(){const e=he(),r=e["*"],n=q();return!e.environmentName&&!e.packageName&&!r?null:t.jsx(f,{sx:{display:"flex",alignItems:"center",minWidth:0},children:t.jsxs(ut,{"aria-label":"breadcrumb",separator:t.jsx(Ct,{sx:{fontSize:14,color:"text.secondary"}}),children:[e.environmentName&&t.jsx(K,{label:e.environmentName,onClick:o=>n(`/${e.environmentName}/`,o)}),e.packageName&&t.jsx(K,{label:e.packageName,onClick:o=>n(`/${e.environmentName}/${e.packageName}/`,o)}),r&&t.jsx(K,{label:r,onClick:o=>n(`/${e.environmentName}/${e.packageName}/${r}`,o)})]})})}const Ht=260,$t=64;function ke({isCollapsed:e,onToggleCollapse:r,logoHeader:n}){return t.jsxs(f,{sx:{height:"100dvh",width:e?$t:Ht,flexShrink:0,display:"flex",flexDirection:"column",backgroundColor:"background.paper",transition:"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)",overflow:"hidden"},children:[t.jsx(Nt,{isCollapsed:e,onToggleCollapse:r,logoHeader:n}),t.jsxs(f,{sx:{flex:1,overflowY:"auto",overflowX:"hidden",py:1},children:[t.jsx(At,{isCollapsed:e}),t.jsx(Wt,{isCollapsed:e}),t.jsx(Ot,{isCollapsed:e})]}),t.jsx(Vt,{isCollapsed:e})]})}function Nt({isCollapsed:e,onToggleCollapse:r,logoHeader:n}){const o=q();return n?t.jsxs(f,{sx:{height:56,display:"flex",alignItems:"center",justifyContent:"space-between",px:e?0:2,flexShrink:0},children:[n,t.jsx(V,{size:"small",onClick:r,"aria-label":e?"Expand sidebar":"Collapse sidebar",children:t.jsx(G,{fontSize:"small"})})]}):t.jsxs(f,{sx:{minHeight:56,display:"flex",flexDirection:e?"column":"row",alignItems:"center",justifyContent:e?"center":"space-between",gap:e?.5:0,py:e?1:0,px:e?0:2,flexShrink:0},children:[t.jsxs(f,{onClick:s=>o("/",s),sx:{display:"flex",alignItems:"center",gap:1,cursor:"pointer",minWidth:0},children:[t.jsx(f,{component:"img",src:"/logo.svg",alt:"Malloy",sx:{width:24,height:24,flexShrink:0}}),!e&&t.jsx(U,{variant:"subtitle1",sx:{color:"text.primary",fontWeight:500,letterSpacing:"-0.025em",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:"Malloy Publisher"})]}),t.jsx(Q,{title:e?"Expand sidebar":"Collapse sidebar",placement:"right",children:t.jsx(V,{size:"small",onClick:r,"aria-label":e?"Expand sidebar":"Collapse sidebar",children:t.jsx(G,{fontSize:"small"})})})]})}function At({isCollapsed:e}){const n=xe().pathname==="/";return t.jsx(F,{sx:{py:0},children:t.jsx(ee,{icon:t.jsx(zt,{fontSize:"small"}),label:"Home",to:"/",selected:n,isCollapsed:e})})}function Wt({isCollapsed:e}){const{apiClients:r}=Fe(),n=he(),{data:o}=Xe({queryKey:["environments"],queryFn:()=>r.environments.listEnvironments()}),s=o?.data??[];return s.length===0?null:t.jsxs(f,{sx:{mt:1},children:[!e&&t.jsx(U,{variant:"caption",sx:{display:"block",px:3,py:1,color:"text.secondary",fontWeight:500,textTransform:"uppercase",fontSize:"0.6875rem",letterSpacing:"0.5px"},children:"Environments"}),t.jsx(F,{sx:{py:0},children:s.map(a=>{const i=a.name??"";return t.jsx(ee,{icon:t.jsx(Mt,{fontSize:"small"}),label:i,to:`/${i}`,selected:n.environmentName===i,isCollapsed:e},i)})})]})}function Ot({isCollapsed:e}){const n=xe().pathname.startsWith("/settings/theme");return t.jsxs(f,{sx:{mt:1},children:[!e&&t.jsx(U,{variant:"caption",sx:{display:"block",px:3,py:1,color:"text.secondary",fontWeight:500,textTransform:"uppercase",fontSize:"0.6875rem",letterSpacing:"0.5px"},children:"Settings"}),t.jsx(F,{sx:{py:0},children:t.jsx(ee,{icon:t.jsx(Dt,{fontSize:"small"}),label:"Visualization theme",to:"/settings/theme",selected:n,isCollapsed:e})})]})}function Vt({isCollapsed:e}){const r=[{label:"Malloy Docs",href:ae.docsHome,icon:t.jsx(Pt,{fontSize:"small"}),external:!0},{label:"Publisher Docs",href:ae.publishing,icon:t.jsx(Tt,{fontSize:"small"}),external:!0},{label:"Publisher API",href:"/api-doc.html",icon:t.jsx(It,{fontSize:"small"}),external:!1}];return t.jsx(F,{sx:{py:1},children:r.map(n=>t.jsx(Ut,{label:n.label,href:n.href,icon:n.icon,external:n.external,isCollapsed:e},n.label))})}function ee({icon:e,label:r,to:n,selected:o,isCollapsed:s}){const a=q(),i=t.jsxs(fe,{selected:o,onClick:c=>a(n,c),sx:{justifyContent:s?"center":"flex-start",px:s?0:2},children:[t.jsx(me,{sx:{minWidth:s?0:36,justifyContent:"center",color:o?"text.primary":"text.secondary"},children:e}),!s&&t.jsx(ge,{primary:r,primaryTypographyProps:{variant:"body2",sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}})]});return s?t.jsx(Q,{title:r,placement:"right",children:t.jsx(f,{children:i})}):i}function Ut({label:e,href:r,icon:n,external:o,isCollapsed:s}){const a=t.jsxs(fe,{component:"a",href:r,target:o?"_blank":void 0,rel:o?"noopener noreferrer":void 0,sx:{justifyContent:s?"center":"flex-start",px:s?0:2},children:[t.jsx(me,{sx:{minWidth:s?0:36,justifyContent:"center",color:"text.secondary"},children:n}),!s&&t.jsx(ge,{primary:e,primaryTypographyProps:{variant:"body2",sx:{color:"text.secondary",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}})]});return s?t.jsx(Q,{title:e,placement:"right",children:t.jsx(f,{children:a})}):a}function Qt({open:e,onClose:r,logoHeader:n}){return t.jsx(wt,{anchor:"left",open:e,onClose:r,ModalProps:{keepMounted:!0},sx:{display:{xs:"block",md:"none"},"& .MuiDrawer-paper":{boxSizing:"border-box",width:260}},children:t.jsx(ke,{isCollapsed:!1,onToggleCollapse:r,logoHeader:n})})}function Yt({headerProps:e}){const r=Z(),n=St(r.breakpoints.up("md")),[o,s]=u.useState(!1),[a,i]=u.useState(!1);return u.useEffect(()=>{n&&o&&s(!1)},[n,o]),t.jsxs(f,{sx:{height:"100dvh",display:"flex",flexDirection:"row",bgcolor:"background.default"},children:[n&&t.jsx(ke,{isCollapsed:a,onToggleCollapse:()=>i(c=>!c),logoHeader:e?.logoHeader}),t.jsxs(f,{component:"main",sx:{flex:1,display:"flex",flexDirection:"column",minWidth:0},children:[t.jsxs(f,{sx:{flexShrink:0,display:"flex",alignItems:"center",justifyContent:"space-between",height:Ye.headerHeight,px:{xs:1,md:3},backgroundColor:"background.default"},children:[t.jsx(f,{sx:{display:{xs:"flex",md:"none"},alignItems:"center",mr:1},children:t.jsx(V,{size:"small",onClick:()=>s(!0),"aria-label":"Open navigation",children:t.jsx(G,{fontSize:"small"})})}),t.jsx(f,{sx:{flex:1,minWidth:0,display:"flex",alignItems:"center"},children:t.jsx(Lt,{})}),t.jsxs(f,{id:"header-actions-portal",sx:{display:"flex",alignItems:"center",flexShrink:0,gap:1},children:[t.jsx(Bt,{}),e?.endCap]})]}),t.jsx(f,{sx:{flex:1,overflow:"auto",minWidth:320,minHeight:0},children:t.jsx(u.Suspense,{fallback:t.jsx(Ke,{}),children:t.jsx(_e,{})})})]}),t.jsx(Qt,{open:o,onClose:()=>s(!1),logoHeader:e?.logoHeader})]})}export{Yt as default};
@@ -1 +1 @@
1
- import{H as r,$ as t,j as e,a1 as c,a9 as o}from"./index-B8MmVXwE.js";function m(){const{environmentName:a,packageName:n}=r(),s=t();if(a)if(n){const i=c({environmentName:a,packageName:n});return e.jsx(o,{onClickPackageFile:s,resourceUri:i})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{m as default};
1
+ import{H as r,$ as t,j as e,a1 as c,a9 as o}from"./index-DJ-3RN5W.js";function m(){const{environmentName:a,packageName:n}=r(),s=t();if(a)if(n){const i=c({environmentName:a,packageName:n});return e.jsx(o,{onClickPackageFile:s,resourceUri:i})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{m as default};
@@ -1 +1 @@
1
- import{H as f,L as u,$ as v,O as k,j as e,a0 as W,a1 as p,a2 as $,J as s,a3 as b,a4 as F,a5 as R,T as o,a6 as t,a7 as d}from"./index-B8MmVXwE.js";function O(){const a=f(),n=a["*"],{search:h,hash:x}=u(),g=v(),{server:j}=k();if(!a.environmentName)return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})});if(!a.packageName)return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});if(n?.startsWith("pages/")&&!n.endsWith(".malloy")&&!n.endsWith(".malloynb")){const r=`data-apps/${n.slice(6)}`,c=encodeURIComponent(a.environmentName),N=encodeURIComponent(a.packageName);return e.jsx(W,{to:`/${c}/${N}/${r}${h}${x}`,replace:!0})}const i={p:3,maxWidth:1200,mx:"auto"};if(n?.startsWith("data-apps/")&&!n.endsWith(".malloy")&&!n.endsWith(".malloynb")){const r=n.slice(10),c=p({environmentName:a.environmentName,packageName:a.packageName,modelPath:r});return e.jsx($,{resourceUri:c})}const m=p({environmentName:a.environmentName,packageName:a.packageName,modelPath:n});if(n?.endsWith(".malloy"))return e.jsx(s,{sx:i,children:e.jsx(b,{resourceUri:m,runOnDemand:!0,maxResultSize:512*1024})});if(n?.endsWith(".malloynb"))return e.jsx(s,{sx:i,children:e.jsx(F,{resourceUri:m,maxResultSize:1024*1024,onNavigate:g})});const y=/\.[^./]+$/.test(n??""),l=R({server:j,environmentName:a.environmentName,packageName:a.packageName,path:n??""});return e.jsxs(s,{sx:i,children:[e.jsx(o,{variant:"h6",sx:{fontWeight:600},children:"Nothing to open at this path"}),e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:[e.jsx(s,{component:"span",sx:{fontFamily:t},children:n})," ","does not name a"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloy"})," ","or"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloynb"})," ","file in package"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:a.packageName}),". This address opens"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloy"})," ","and"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloynb"})," ","files."]}),y&&e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:["A file from the package's"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:"public/"})," ","directory is served at ",e.jsx(d,{href:l,children:l}),"."]}),e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:[e.jsxs(d,{href:`/${encodeURIComponent(a.environmentName)}/${encodeURIComponent(a.packageName)}`,children:["Back to ",a.packageName]})," ","lists this package's models, notebooks, and data apps."]})]})}export{O as default};
1
+ import{H as f,L as u,$ as v,O as k,j as e,a0 as W,a1 as p,a2 as $,J as s,a3 as b,a4 as F,a5 as R,T as o,a6 as t,a7 as d}from"./index-DJ-3RN5W.js";function O(){const a=f(),n=a["*"],{search:h,hash:x}=u(),g=v(),{server:j}=k();if(!a.environmentName)return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})});if(!a.packageName)return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});if(n?.startsWith("pages/")&&!n.endsWith(".malloy")&&!n.endsWith(".malloynb")){const r=`data-apps/${n.slice(6)}`,c=encodeURIComponent(a.environmentName),N=encodeURIComponent(a.packageName);return e.jsx(W,{to:`/${c}/${N}/${r}${h}${x}`,replace:!0})}const i={p:3,maxWidth:1200,mx:"auto"};if(n?.startsWith("data-apps/")&&!n.endsWith(".malloy")&&!n.endsWith(".malloynb")){const r=n.slice(10),c=p({environmentName:a.environmentName,packageName:a.packageName,modelPath:r});return e.jsx($,{resourceUri:c})}const m=p({environmentName:a.environmentName,packageName:a.packageName,modelPath:n});if(n?.endsWith(".malloy"))return e.jsx(s,{sx:i,children:e.jsx(b,{resourceUri:m,runOnDemand:!0,maxResultSize:512*1024})});if(n?.endsWith(".malloynb"))return e.jsx(s,{sx:i,children:e.jsx(F,{resourceUri:m,maxResultSize:1024*1024,onNavigate:g})});const y=/\.[^./]+$/.test(n??""),l=R({server:j,environmentName:a.environmentName,packageName:a.packageName,path:n??""});return e.jsxs(s,{sx:i,children:[e.jsx(o,{variant:"h6",sx:{fontWeight:600},children:"Nothing to open at this path"}),e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:[e.jsx(s,{component:"span",sx:{fontFamily:t},children:n})," ","does not name a"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloy"})," ","or"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloynb"})," ","file in package"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:a.packageName}),". This address opens"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloy"})," ","and"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloynb"})," ","files."]}),y&&e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:["A file from the package's"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:"public/"})," ","directory is served at ",e.jsx(d,{href:l,children:l}),"."]}),e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:[e.jsxs(d,{href:`/${encodeURIComponent(a.environmentName)}/${encodeURIComponent(a.packageName)}`,children:["Back to ",a.packageName]})," ","lists this package's models, notebooks, and data apps."]})]})}export{O as default};
@@ -1 +1 @@
1
- import{H as r,$ as t,j as e,a1 as c,a8 as o}from"./index-B8MmVXwE.js";function l(){const{environmentName:a,packageName:n}=r(),s=t();if(a)if(n){const i=c({environmentName:a,packageName:n});return e.jsx(o,{onClickPackageFile:s,resourceUri:i})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{l as default};
1
+ import{H as r,$ as t,j as e,a1 as c,a8 as o}from"./index-DJ-3RN5W.js";function l(){const{environmentName:a,packageName:n}=r(),s=t();if(a)if(n){const i=c({environmentName:a,packageName:n});return e.jsx(o,{onClickPackageFile:s,resourceUri:i})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{l as default};
@@ -1 +1 @@
1
- import{ab as o,j as r,ac as s,ad as n,J as t,T as a}from"./index-B8MmVXwE.js";function x(){const e=o();return console.error(e),r.jsx(s,{maxWidth:"lg",component:"main",sx:{display:"flex",flexDirection:"column",my:2,gap:0},children:r.jsxs(n,{sx:{m:"auto",flexDirection:"column"},children:[r.jsx(t,{sx:{height:"300px"}}),r.jsx("img",{src:"/error.png"}),r.jsx(a,{variant:"subtitle1",children:"An unexpected error occurred"})]})})}export{x as default};
1
+ import{ab as o,j as r,ac as s,ad as n,J as t,T as a}from"./index-DJ-3RN5W.js";function x(){const e=o();return console.error(e),r.jsx(s,{maxWidth:"lg",component:"main",sx:{display:"flex",flexDirection:"column",my:2,gap:0},children:r.jsxs(n,{sx:{m:"auto",flexDirection:"column"},children:[r.jsx(t,{sx:{height:"300px"}}),r.jsx("img",{src:"/error.png"}),r.jsx(a,{variant:"subtitle1",children:"An unexpected error occurred"})]})})}export{x as default};