@malloy-publisher/server 0.9.7 → 0.9.9

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 (30) hide show
  1. package/dist/app/api-doc.yaml +1475 -578
  2. package/dist/app/assets/EnvironmentPage-DaNUmaHg.js +1 -0
  3. package/dist/app/assets/{HomePage-BM31X4Y8.js → HomePage-CRLoVDIs.js} +1 -1
  4. package/dist/app/assets/MainPage-BsV5UnlK.js +1 -0
  5. package/dist/app/assets/ModelPage-DOOiyJAE.js +2 -0
  6. package/dist/app/assets/PackagePage-QHG55rBw.js +1 -0
  7. package/dist/app/assets/{RenderedResult-CkUS04tl.es-CNz9JsEK.js → RenderedResult-BHuJpdSn.es-C37LMpwi.js} +2 -2
  8. package/dist/app/assets/{RouteError-DLJlCtRG.js → RouteError-ziodz3bt.js} +1 -1
  9. package/dist/app/assets/ThemeEditorPage-Cs3rIs4e.js +1 -0
  10. package/dist/app/assets/{ToggleButtonGroup-Bwj7gIJm.js → ToggleButtonGroup-BrygJ1WP.js} +1 -1
  11. package/dist/app/assets/documentRoutes-1Qgo5Pvl.js +1 -0
  12. package/dist/app/assets/index-BK0mbcyQ.js +483 -0
  13. package/dist/app/assets/{index-BcsfsLm3.js → index-Bwc6-9Dc.js} +1 -1
  14. package/dist/app/assets/{index-wawGd6k1.js → index-CA5a5gJj.js} +1 -1
  15. package/dist/app/assets/{index-D3HZqxOW.js → index-CXJpj7He.js} +1 -1
  16. package/dist/app/assets/index.es-CxcPJdYO.js +195 -0
  17. package/dist/app/index.html +1 -1
  18. package/dist/instrumentation.mjs +23 -24
  19. package/dist/package_load_worker.mjs +18741 -17793
  20. package/dist/server.mjs +120201 -119366
  21. package/dist/sshcrypto-cqb52edz.node +0 -0
  22. package/package.json +1 -1
  23. package/dist/app/assets/EnvironmentPage-V6cQ_Kpr.js +0 -1
  24. package/dist/app/assets/MainPage-CQW3P4wB.js +0 -1
  25. package/dist/app/assets/ModelPage-dBHaHb6u.js +0 -2
  26. package/dist/app/assets/PackagePage-B-ruDCyR.js +0 -1
  27. package/dist/app/assets/ThemeEditorPage-Ck4rJ1vv.js +0 -1
  28. package/dist/app/assets/documentRoutes-DGm_-EUy.js +0 -1
  29. package/dist/app/assets/index-hnA8HjeH.js +0 -484
  30. package/dist/app/assets/index.es-B2kJpnhe.js +0 -195
@@ -65,16 +65,28 @@ tags:
65
65
  distribution
66
66
  - name: models
67
67
  description: Malloy model access and compilation operations
68
+ - name: reports
69
+ description:
70
+ Reports - any `.malloy` file in a package carrying an artifact tag,
71
+ wherever it lives, with a linear or grid layout - their listing,
72
+ manifests, and cells
68
73
  - name: notebooks
69
- description: Malloy notebook access and execution operations
74
+ description: Deprecated aliases for the linear reports. Use the `reports` routes.
70
75
  - name: dashboards
71
- description:
72
- Discovery and manifests for `# artifact` dashboards - layout, tiles, and
73
- the given specs behind their controls
76
+ description: Deprecated aliases for the grid reports. Use the `reports` routes.
74
77
  - name: data-apps
75
78
  description:
76
79
  In-package HTML data apps (static pages served from a package's public/
77
80
  directory)
81
+ - name: skills
82
+ description:
83
+ Agent skills in force for a package - the bundled guides plus the package's
84
+ own `skills/`, with the package's copy replacing a bundled one of the same
85
+ name
86
+ - name: agents
87
+ description:
88
+ Agents a package declares in `publisher.json`, resolved to their
89
+ instructions, skill files and schedules (served, never run)
78
90
  - name: databases
79
91
  description: Embedded database management and access
80
92
  - name: watch-mode
@@ -1635,11 +1647,10 @@ paths:
1635
1647
 
1636
1648
  On a package with a surface (a root `index.malloy`, or a legacy `explores`), only the
1637
1649
  files on that surface are listed, unless `includeHiddenFilesAndSources` is true. With it, every
1638
- model file is listed, and `isHidden` marks the ones the package hides. Dashboard files
1639
- are listed by the dashboards route either way. Served notebooks (a `.malloy` at the top of
1640
- `notebooks/` or `dashboards/` whose model-level `## artifact` tag says `kind=notebook`, or
1641
- names no `kind` and sits under `notebooks/`) are not models here, with or without a
1642
- surface; they are listed by list-notebooks.
1650
+ model file is listed, and `isHidden` marks the ones the package hides. Reports (any
1651
+ `.malloy` outside `public/` carrying an artifact tag, other than the root `index.malloy`;
1652
+ see list-reports) are listed by list-reports. A grid report is not a model here on a
1653
+ package with a surface; a linear report is not a model here with or without one.
1643
1654
  parameters:
1644
1655
  - name: environmentName
1645
1656
  in: path
@@ -1694,15 +1705,14 @@ paths:
1694
1705
  On a package with a surface (a root `index.malloy`, or a legacy `explores`), a file off
1695
1706
  that surface answers 404 with the same message a query to it gets, unless
1696
1707
  `includeHiddenFilesAndSources` is true. With it, the file is returned with its `sourceText`, whatever
1697
- sources the text names. Dashboard files and served notebooks (a `.malloy` at the top of
1698
- `notebooks/` or `dashboards/` whose model-level `## artifact` tag says `kind=notebook`, or
1699
- names no `kind` and sits under `notebooks/`) are always returned. A package with no surface, or with
1708
+ sources the text names. Reports (see list-reports), wherever they live in the package,
1709
+ are always returned. A package with no surface, or with
1700
1710
  `queryableSources: "all"`, returns every file. For a file it returns, `modelDef.contents` and `modelDef.exports`,
1701
1711
  `modelInfo`, `sources` and `sourceInfos` are limited to the names the file publishes, so
1702
1712
  the surface file does not carry the hidden sources it imports. A join to a hidden source
1703
1713
  keeps only its name and the names and types of its fields. `sourceText` is left out
1704
1714
  when the text names a source the file does not publish, unless
1705
- `includeHiddenFilesAndSources` is true; the text of a dashboard is always returned.
1715
+ `includeHiddenFilesAndSources` is true; the text of a report is always returned.
1706
1716
  parameters:
1707
1717
  - name: environmentName
1708
1718
  in: path
@@ -1750,15 +1760,29 @@ paths:
1750
1760
  tags:
1751
1761
  - models
1752
1762
  operationId: update-model-source
1753
- summary: Write a dashboard or notebook file into the package
1763
+ summary: Write a report file into the package
1754
1764
  description: |
1755
- Writes the Malloy text of a dashboard file — `dashboards/<slug>.malloy` —
1756
- or a notebook file — `notebooks/<slug>.malloy`, which must carry an
1757
- `## artifact` tag (an untagged file there is a shared include and is
1758
- refused with 400, and so is a write over an existing file that is
1759
- not a notebook) — the only paths this endpoint accepts,
1760
- into the package, and reloads the package in place so it is served from
1761
- the new text. This is the dashboard and notebook builder's save.
1765
+ Writes the Malloy text of a report into the package, and reloads the
1766
+ package in place so it is served from the new text. This is the report
1767
+ builder's save. A report is any `.malloy` file carrying an artifact tag
1768
+ (see list-reports), of either layout, wherever it lives in the package.
1769
+
1770
+ What it accepts:
1771
+
1772
+ - CREATE (no `expectedHash`): any `.malloy` path in the package that
1773
+ does not exist yet, outside `public/`, and never the root
1774
+ `index.malloy`. Missing directories are created, inside the package
1775
+ root only. The text must carry an artifact tag (`## artifact`, or the
1776
+ deprecated query-level `# artifact`): an `artifact` property anywhere
1777
+ on a tag line, outside a string. Text without one is refused with 400.
1778
+ - REPLACE (with `expectedHash`): only a file the package currently reads
1779
+ as an editable report: a tagged `.malloy` report of either layout,
1780
+ including a tagged grid report that has no tiles yet. A model, an
1781
+ untagged file, a `.malloynb`, the root `index.malloy` and anything in
1782
+ `public/` cannot be overwritten, wherever they live, and answer 400.
1783
+
1784
+ Two reports may share a basename in different directories; a report is
1785
+ identified by its path, so a taken basename is not refused.
1762
1786
 
1763
1787
  The text is compiled first, as the file, and refused with its problems
1764
1788
  when it does not compile; nothing is written. The write is atomic (a
@@ -1776,21 +1800,16 @@ paths:
1776
1800
  merged: the caller re-opens and reapplies its change. Omit it to CREATE
1777
1801
  the file: a file that already exists is then refused with 409 too, so
1778
1802
  an unconditional overwrite is not something a caller can ask for by
1779
- leaving a field out. A notebook path over an existing file the package
1780
- does not serve as a notebook answers 400 instead, with or without a
1781
- hash, because that check comes before the hash. The check, the write,
1803
+ leaving a field out. A path over an existing file the package does not
1804
+ read as a report answers 400 instead, with or without a hash, because
1805
+ that check comes before the hash. The check, the write,
1782
1806
  the reload and the restore all happen under one hold of the package
1783
1807
  lock, so two saves racing on one file cannot both pass the check, and a
1784
1808
  rollback cannot revert the other writer's text instead of its own.
1785
1809
 
1786
- A dashboard whose name (the file's basename) another file already holds
1787
- is refused with 409 before anything is written, since the name is its
1788
- URL and its `# drill` target. A `dashboards/` file whose text has no
1789
- `# artifact` or `## artifact` tag (an `artifact` property anywhere on a
1790
- tag line, outside a string) is refused with 400 before anything is
1791
- written; a tag only inside a block comment passes that check but the
1792
- compiled model carries none, so it is rolled back and answers 500. A
1793
- tagged dashboard with no tiles saves but is not served until it has one.
1810
+ A tag only inside a block comment passes the tag check but the compiled
1811
+ model carries none, so it is rolled back and answers 500. A tagged grid
1812
+ report with no tiles saves but is not served until it has one.
1794
1813
 
1795
1814
  A create answers 201 and an update 200; `created` in the body says the
1796
1815
  same thing.
@@ -1813,7 +1832,7 @@ paths:
1813
1832
  type: string
1814
1833
  - name: path
1815
1834
  in: path
1816
- description: The file, `dashboards/<slug>.malloy` or `notebooks/<slug>.malloy`
1835
+ description: The report file's path in the package, such as `sales/q3.malloy`
1817
1836
  required: true
1818
1837
  schema:
1819
1838
  $ref: "#/components/schemas/PathPattern"
@@ -1852,9 +1871,8 @@ paths:
1852
1871
  $ref: "#/components/responses/NotFound"
1853
1872
  "409":
1854
1873
  description:
1855
- The file changed since the caller opened it, already exists and
1856
- no `expectedHash` was sent, or is a dashboard whose name another
1857
- file already holds
1874
+ The file changed since the caller opened it, or already exists and
1875
+ no `expectedHash` was sent
1858
1876
  content:
1859
1877
  application/json:
1860
1878
  schema:
@@ -1977,9 +1995,11 @@ paths:
1977
1995
  that is both gated and hidden from the caller answers 404 for the whole
1978
1996
  request, as it does without a document. In a document, problem positions
1979
1997
  are lines of the submitted text, problems carry no `model` tag, and
1980
- `includeSql` returns no `sql`. A tag that names no `kind` is a dashboard
1981
- when it lists `tiles` or carries a `dashboard { … }` grid tag, and a
1982
- notebook otherwise, since submitted text has no folder to take a kind from.
1998
+ `includeSql` returns no `sql`. The document's `layout` follows the one
1999
+ rule every report follows (see list-reports): the tag's `layout=`, else
2000
+ its deprecated `kind=` (`dashboard` is grid, `notebook` is linear), else
2001
+ grid when the tag lists `tiles` or carries a `dashboard { … }` grid tag,
2002
+ else linear. Where a file lives never decides it.
1983
2003
  parameters:
1984
2004
  - name: environmentName
1985
2005
  in: path
@@ -2027,42 +2047,36 @@ paths:
2027
2047
  "503":
2028
2048
  $ref: "#/components/responses/ServiceUnavailable"
2029
2049
 
2030
- /environments/{environmentName}/packages/{packageName}/dashboards:
2050
+ /environments/{environmentName}/packages/{packageName}/reports:
2031
2051
  get:
2032
2052
  tags:
2033
- - dashboards
2034
- operationId: list-dashboards
2035
- summary: List package dashboards
2053
+ - reports
2054
+ operationId: list-reports
2055
+ summary: List package reports
2036
2056
  description: |
2037
- Lists the dashboards in the specified package — every tagged `.malloy`
2038
- file at the top of `dashboards/` or `notebooks/` carrying an
2039
- `# artifact` (or model-level `## artifact`) annotation whose `kind` is
2040
- `dashboard`, or names none under `dashboards/`. A `kind=notebook` file is
2041
- listed as a notebook instead, whichever folder it sits in. A file with
2042
- no artifact tag is a shared include and is not listed, whether or not it
2043
- compiles.
2044
-
2045
- A tagged dashboard that failed to compile is listed carrying its
2046
- `error` where that state can arise at all, so a broken dashboard is
2047
- visibly broken rather than silently absent. In practice it rarely does:
2048
- a package whose model fails to compile is not loaded, and a reload that
2049
- would break one is refused and leaves the previously loaded package
2050
- serving, so `error` is only reachable on the paths that keep per-model
2051
- placeholders. Treat it as present-but-uncommon rather than the normal
2052
- way a broken dashboard surfaces.
2053
-
2054
- Every tagged dashboard is listed, whatever the package's surface. To
2055
- hide one, remove its `# artifact` tag. On a package with a surface (a
2056
- root `index.malloy`, or a legacy `explores`) with `queryableSources`
2057
- left at `"declared"`, a dashboard's tiles, its single query and its
2058
- filter `suggest` queries may read only sources the surface exports. A
2059
- source the dashboard declares on top of a surface source may be read;
2060
- one over a hidden source may not. The dashboard file's own
2061
- `export {}` and named queries add nothing to the surface. A tile over a
2062
- hidden source answers 404 when it runs, and the package's `warnings`
2063
- report each such tile, single query and suggest, with severity
2064
- `error`, as of the last load, naming the source and the fix. Under
2065
- `"all"` nothing is refused, so the situation does not arise.
2057
+ Lists every report in the package, in path order. A report is a
2058
+ `.malloy` file anywhere in the package, outside `public/`, that carries
2059
+ an artifact tag: a model-level `## artifact`, or the deprecated
2060
+ query-level `# artifact` on a `query:`. The package's root
2061
+ `index.malloy` is never a report (it is the surface). A legacy
2062
+ `.malloynb` is also a report, linear and read-only. Where a file lives
2063
+ carries no meaning: `dashboards/` and `notebooks/` are ordinary
2064
+ directory names. Everything else is an ordinary model, which a report
2065
+ may import.
2066
+
2067
+ A report's `layout` is decided by its tags, first match wins: the
2068
+ tag's `layout=` (`grid` or `linear`); else the deprecated `kind=`
2069
+ (`dashboard` is grid, `notebook` is linear); else grid for a
2070
+ query-level `# artifact`; else grid for a model-level tag that lists
2071
+ `tiles` or carries a `dashboard { … }` grid tag; else linear.
2072
+
2073
+ A report is identified by its `path`. `name`, its basename, is a
2074
+ display label only: two reports may share one.
2075
+
2076
+ Every report is listed whatever the package's surface; the surface
2077
+ limits what its tiles and cells may read, not whether it is listed. A
2078
+ report that failed to compile is listed with its `error`. A tagged grid
2079
+ report with no tiles yet is not served and not listed.
2066
2080
  parameters:
2067
2081
  - name: environmentName
2068
2082
  in: path
@@ -2084,13 +2098,13 @@ paths:
2084
2098
  $ref: "#/components/schemas/VersionIdPattern"
2085
2099
  responses:
2086
2100
  "200":
2087
- description: A list of dashboards in the package
2101
+ description: The reports in the package
2088
2102
  content:
2089
2103
  application/json:
2090
2104
  schema:
2091
2105
  type: array
2092
2106
  items:
2093
- $ref: "#/components/schemas/Dashboard"
2107
+ $ref: "#/components/schemas/Report"
2094
2108
  "401":
2095
2109
  $ref: "#/components/responses/Unauthorized"
2096
2110
  "404":
@@ -2102,19 +2116,24 @@ paths:
2102
2116
  "503":
2103
2117
  $ref: "#/components/responses/ServiceUnavailable"
2104
2118
 
2105
- /environments/{environmentName}/packages/{packageName}/dashboards/{dashboardName}:
2119
+ /environments/{environmentName}/packages/{packageName}/reports/{path}:
2106
2120
  get:
2107
2121
  tags:
2108
- - dashboards
2109
- operationId: get-dashboard
2110
- summary: Get a dashboard manifest
2122
+ - reports
2123
+ operationId: get-report
2124
+ summary: Get a report manifest
2111
2125
  description: |
2112
- Retrieves everything a viewer needs to render one dashboard: the artifact
2113
- tag's declarations plus the control contract derived from the givens its
2114
- query references. Running the dashboard needs no further endpoint — its
2115
- query, each tile, and each control's suggest query all run
2116
- through the model query endpoint with `givens`, using the manifest's
2117
- `path` as the model.
2126
+ Everything a viewer needs to render one report, addressed by its path in
2127
+ the package, including its extension, exactly as list-reports gives
2128
+ it (`sales/q3.malloy`). A report written as tiles, of either layout, carries the
2129
+ manifest fields (`tiles` or `query`, `dashboardColumns`,
2130
+ `startingGivens`, `autorun`, `givens`): its tiles run through the model
2131
+ query endpoint with `givens`, using `path` as the model. A linear
2132
+ report written as `run:` cells, or a `.malloynb`, carries `notebook`
2133
+ instead: its cells as get-notebook returned them. A `.malloy` report's
2134
+ cells run through the model query endpoint, each cell's `text` as
2135
+ `query` and `path` as the model; a `.malloynb`'s through the
2136
+ deprecated execute-notebook-cell.
2118
2137
  parameters:
2119
2138
  - name: environmentName
2120
2139
  in: path
@@ -2128,19 +2147,14 @@ paths:
2128
2147
  required: true
2129
2148
  schema:
2130
2149
  $ref: "#/components/schemas/IdentifierPattern"
2131
- - name: dashboardName
2150
+ - name: path
2132
2151
  in: path
2133
2152
  description: >-
2134
- The dashboard's name: its filename basename. Conventionally letters,
2135
- digits, "-" and "_", and a package is warned when one of its
2136
- dashboards falls outside that. It is NOT constrained to it, because
2137
- the name comes from a filename rather than being chosen: a file such
2138
- as `dashboards/v1.2.malloy` is served, and its published `resource`
2139
- carries the name percent-encoded. Send it percent-encoded.
2153
+ The report's path within the package, including `.malloy` (or
2154
+ `.malloynb`): the `path` list-reports returns.
2140
2155
  required: true
2141
2156
  schema:
2142
2157
  type: string
2143
- minLength: 1
2144
2158
  - name: versionId
2145
2159
  in: query
2146
2160
  description: Version identifier for the package
@@ -2149,11 +2163,11 @@ paths:
2149
2163
  $ref: "#/components/schemas/VersionIdPattern"
2150
2164
  responses:
2151
2165
  "200":
2152
- description: The dashboard manifest
2166
+ description: The report manifest
2153
2167
  content:
2154
2168
  application/json:
2155
2169
  schema:
2156
- $ref: "#/components/schemas/DashboardManifest"
2170
+ $ref: "#/components/schemas/ReportManifest"
2157
2171
  "401":
2158
2172
  $ref: "#/components/responses/Unauthorized"
2159
2173
  "404":
@@ -2165,19 +2179,29 @@ paths:
2165
2179
  "503":
2166
2180
  $ref: "#/components/responses/ServiceUnavailable"
2167
2181
 
2168
- /environments/{environmentName}/packages/{packageName}/notebooks:
2182
+ /environments/{environmentName}/packages/{packageName}/skills:
2169
2183
  get:
2170
2184
  tags:
2171
- - notebooks
2172
- operationId: list-notebooks
2173
- summary: List package notebooks
2185
+ - skills
2186
+ operationId: list-skills
2187
+ summary: List the agent skills in force for a package
2174
2188
  description: |
2175
- Retrieves a list of all Malloy notebooks within the specified package: every
2176
- `.malloynb` file, and every `.malloy` file at the top of `notebooks/` or `dashboards/`
2177
- whose model-level `## artifact` tag says `kind=notebook` (or names no `kind` and sits
2178
- under `notebooks/`). Each notebook entry includes the relative path,
2179
- package name, title, description, and any compilation or reading error. This endpoint
2180
- is useful for discovering available notebooks and checking their status.
2189
+ Lists the agent skills that apply to this package: the guides bundled
2190
+ with this server, plus any the package ships under `skills/`.
2191
+
2192
+ Resolution is name shadowing. A package skill whose `name` matches a
2193
+ bundled skill REPLACES it for this package; one with a new name is
2194
+ added. Nothing is merged, because the server does not know which guides
2195
+ the calling agent already holds and so cannot patch one. Read `origin`
2196
+ on each entry to tell a replaced skill from the original.
2197
+
2198
+ Bodies are not returned here. Fetch one with
2199
+ `GET .../skills/{skillName}`. An entry whose `name` contains a slash
2200
+ (`<skill>/<stem>`) is a skill's on-demand reference file, addressed by
2201
+ the pointer at the end of its parent's body.
2202
+
2203
+ The REST half of the `get_skill` MCP tool, for callers running
2204
+ unattended.
2181
2205
  parameters:
2182
2206
  - name: environmentName
2183
2207
  in: path
@@ -2191,45 +2215,38 @@ paths:
2191
2215
  required: true
2192
2216
  schema:
2193
2217
  $ref: "#/components/schemas/IdentifierPattern"
2194
- - name: versionId
2195
- in: query
2196
- description: Version identifier for the package
2197
- required: false
2198
- schema:
2199
- $ref: "#/components/schemas/VersionIdPattern"
2200
2218
  responses:
2201
2219
  "200":
2202
- description: A list of notebooks in the package
2220
+ description: The skills in force for the package
2203
2221
  content:
2204
2222
  application/json:
2205
2223
  schema:
2206
2224
  type: array
2207
2225
  items:
2208
- $ref: "#/components/schemas/Notebook"
2226
+ $ref: "#/components/schemas/SkillSummary"
2209
2227
  "401":
2210
2228
  $ref: "#/components/responses/Unauthorized"
2211
2229
  "404":
2212
2230
  $ref: "#/components/responses/NotFound"
2213
2231
  "500":
2214
2232
  $ref: "#/components/responses/InternalServerError"
2215
- "501":
2216
- $ref: "#/components/responses/NotImplemented"
2217
2233
  "503":
2218
2234
  $ref: "#/components/responses/ServiceUnavailable"
2219
2235
 
2220
- /environments/{environmentName}/packages/{packageName}/notebooks/{path}:
2236
+ /environments/{environmentName}/packages/{packageName}/skills/{skillName}:
2221
2237
  get:
2222
2238
  tags:
2223
- - notebooks
2224
- operationId: get-notebook
2225
- summary: Get Malloy notebook cells
2239
+ - skills
2240
+ operationId: get-skill
2241
+ summary: Get one agent skill, with its body
2226
2242
  description: |
2227
- Retrieves a Malloy notebook with its raw cell contents (markdown and code).
2228
- Cell execution should be done separately via the execute-notebook-cell endpoint.
2229
- A served notebook (a `.malloy` at the top of `notebooks/` or `dashboards/` whose
2230
- model-level `## artifact` tag says `kind=notebook`, or names no `kind` and sits under
2231
- `notebooks/`) answers here as well as a `.malloynb`.
2232
- On a package with a surface, the response shows only the sources the notebook may read.
2243
+ Returns one skill in force for this package, including its full
2244
+ Markdown. `skillName` is a name from the listing, exactly as spelled
2245
+ there; a reference file is addressed as `<skill>/<stem>`. The slash may
2246
+ be sent literally or as `%2F`; a literal `%` in a name must be sent as
2247
+ `%25`.
2248
+
2249
+ 404 when no skill of that name is in force.
2233
2250
  parameters:
2234
2251
  - name: environmentName
2235
2252
  in: path
@@ -2242,55 +2259,44 @@ paths:
2242
2259
  description: Name of the package
2243
2260
  required: true
2244
2261
  schema:
2245
- type: string
2246
- - name: path
2262
+ $ref: "#/components/schemas/IdentifierPattern"
2263
+ - name: skillName
2247
2264
  in: path
2248
- description: Path to notebook within the package.
2265
+ description: >-
2266
+ Skill name as returned by the listing. A reference file is
2267
+ `<skill>/<stem>`; the slash may be literal or `%2F`.
2249
2268
  required: true
2250
2269
  schema:
2251
2270
  type: string
2252
- - name: versionId
2253
- in: query
2254
- description: Version identifier for the package
2255
- required: false
2256
- schema:
2257
- $ref: "#/components/schemas/VersionIdPattern"
2258
2271
  responses:
2259
2272
  "200":
2260
- description: A Malloy notebook with raw cell contents.
2273
+ description: The skill and its body
2261
2274
  content:
2262
- "application/json":
2275
+ application/json:
2263
2276
  schema:
2264
- $ref: "#/components/schemas/RawNotebook"
2277
+ $ref: "#/components/schemas/Skill"
2265
2278
  "401":
2266
2279
  $ref: "#/components/responses/Unauthorized"
2267
2280
  "404":
2268
2281
  $ref: "#/components/responses/NotFound"
2269
2282
  "500":
2270
2283
  $ref: "#/components/responses/InternalServerError"
2271
- "501":
2272
- $ref: "#/components/responses/NotImplemented"
2284
+ "503":
2285
+ $ref: "#/components/responses/ServiceUnavailable"
2273
2286
 
2274
- /environments/{environmentName}/packages/{packageName}/notebooks/{path}/cells/{cellIndex}:
2287
+ /environments/{environmentName}/packages/{packageName}/agents:
2275
2288
  get:
2276
2289
  tags:
2277
- - notebooks
2278
- operationId: execute-notebook-cell
2279
- summary: Execute a specific notebook cell
2290
+ - agents
2291
+ operationId: list-agents
2292
+ summary: List the agents a package declares
2280
2293
  description: |
2281
- Executes a specific cell in a Malloy notebook by index. For code cells, this compiles
2282
- and runs the Malloy code, returning query results and any new sources defined.
2283
- For markdown cells, this simply returns the cell content. A served notebook
2284
- (tagged `kind=notebook`, or untagged-kind under `notebooks/`) answers here as well as a
2285
- `.malloynb`.
2294
+ Lists the agents declared under `agents` in the package's
2295
+ `publisher.json` that passed validation, without instructions or
2296
+ skills. An agent that failed validation is not listed; the package's
2297
+ `warnings` say why. Empty when the manifest declares none.
2286
2298
 
2287
- On a package with a surface (a root `index.malloy`, or a legacy `explores`) with
2288
- `queryableSources` left at `"declared"`, a code cell may read only sources the surface
2289
- exports. A cell over a hidden source answers 404, and 404 rather than 403 even when the
2290
- source is also `#(authorize)`-gated. A source an earlier cell declares on top of a
2291
- published source still works. A cell's own source over a raw table (`duckdb.table(...)`
2292
- or `.sql(...)`) has no published source under it, so it is refused. The response shows
2293
- only the sources the notebook may read.
2299
+ The REST half of the `get_agent` MCP tool.
2294
2300
  parameters:
2295
2301
  - name: environmentName
2296
2302
  in: path
@@ -2303,102 +2309,39 @@ paths:
2303
2309
  description: Name of the package
2304
2310
  required: true
2305
2311
  schema:
2306
- type: string
2307
- - name: path
2308
- in: path
2309
- description: Path to notebook within the package
2310
- required: true
2311
- schema:
2312
- type: string
2313
- - name: cellIndex
2314
- in: path
2315
- description: Index of the cell to execute (0-based)
2316
- required: true
2317
- schema:
2318
- type: integer
2319
- - name: versionId
2320
- in: query
2321
- description: Version identifier for the package
2322
- required: false
2323
- schema:
2324
- $ref: "#/components/schemas/VersionIdPattern"
2325
- - name: filter_params
2326
- in: query
2327
- deprecated: true
2328
- description: |
2329
- **DEPRECATED**: Use `givens` (native Malloy runtime parameters) instead.
2330
- Targets the deprecated `#(filter)` annotation path. See docs/givens.md
2331
- for migration recipes.
2332
-
2333
- JSON-encoded filter parameter values keyed by filter name.
2334
- required: false
2335
- schema:
2336
- type: string
2337
- - name: bypass_filters
2338
- in: query
2339
- deprecated: true
2340
- description: |
2341
- **DEPRECATED**: Use `givens` (native Malloy runtime parameters) instead.
2342
- See docs/givens.md for migration recipes.
2343
-
2344
- When true, skip filter injection entirely.
2345
- required: false
2346
- schema:
2347
- type: string
2348
- enum:
2349
- - "true"
2350
- - "false"
2351
- - name: givens
2352
- in: query
2353
- description:
2354
- A `GivenValues` object, JSON-encoded so it can travel in a query
2355
- string. Values are typed as `GivenValues` describes them, not
2356
- string-encoded as `EncodedGivenValues` would be. The parameter keeps
2357
- its name for compatibility; the schema it carries is the one named
2358
- here.
2359
- required: false
2360
- schema:
2361
- type: string
2312
+ $ref: "#/components/schemas/IdentifierPattern"
2362
2313
  responses:
2363
2314
  "200":
2364
- description: Cell execution result
2315
+ description: The agents the package declares
2365
2316
  content:
2366
- "application/json":
2317
+ application/json:
2367
2318
  schema:
2368
- $ref: "#/components/schemas/NotebookCellResult"
2369
- "400":
2370
- $ref: "#/components/responses/BadRequest"
2319
+ type: array
2320
+ items:
2321
+ $ref: "#/components/schemas/AgentSummary"
2371
2322
  "401":
2372
2323
  $ref: "#/components/responses/Unauthorized"
2373
- "403":
2374
- $ref: "#/components/responses/Forbidden"
2375
2324
  "404":
2376
2325
  $ref: "#/components/responses/NotFound"
2377
- "413":
2378
- $ref: "#/components/responses/PayloadTooLarge"
2379
2326
  "500":
2380
2327
  $ref: "#/components/responses/InternalServerError"
2381
- "501":
2382
- $ref: "#/components/responses/NotImplemented"
2383
- "424":
2384
- $ref: "#/components/responses/ConnectionUnavailable"
2385
- "502":
2386
- $ref: "#/components/responses/DatabaseUnreachable"
2387
2328
  "503":
2388
2329
  $ref: "#/components/responses/ServiceUnavailable"
2389
- "504":
2390
- $ref: "#/components/responses/GatewayTimeout"
2391
2330
 
2392
- /environments/{environmentName}/packages/{packageName}/databases:
2331
+ /environments/{environmentName}/packages/{packageName}/agents/{agentName}:
2393
2332
  get:
2394
2333
  tags:
2395
- - databases
2396
- operationId: list-databases
2397
- summary: List embedded databases
2334
+ - agents
2335
+ operationId: get-agent
2336
+ summary: Get one agent, resolved
2398
2337
  description: |
2399
- Retrieves a list of all embedded databases within the specified package. These are typically
2400
- local data files read by DuckDB in place (.parquet, .csv, and .xlsx) that provide local data
2401
- storage for the package. Each database entry includes metadata about the database structure and content.
2338
+ Returns one agent with its instructions, its own skill files and each
2339
+ schedule's task text, plus `source`, which pins the package load and the
2340
+ agent's own content so a runner can prove which bytes ran. Publisher
2341
+ serves the definition and runs nothing: the caller's own harness
2342
+ executes it, and schedules are never fired by the server.
2343
+
2344
+ 404 when no agent of that name is served.
2402
2345
  parameters:
2403
2346
  - name: environmentName
2404
2347
  in: path
@@ -2412,48 +2355,63 @@ paths:
2412
2355
  required: true
2413
2356
  schema:
2414
2357
  $ref: "#/components/schemas/IdentifierPattern"
2415
- - name: versionId
2358
+ - name: agentName
2359
+ in: path
2360
+ description: >-
2361
+ Agent name as returned by the listing. Names are 1-64 lowercase
2362
+ letters, digits and single hyphens; any other value is a 404, not a
2363
+ 400.
2364
+ required: true
2365
+ schema:
2366
+ type: string
2367
+ pattern: "^[a-z0-9]+(-[a-z0-9]+)*$"
2368
+ maxLength: 64
2369
+ - name: skills
2416
2370
  in: query
2417
- description: Version identifier for the package
2371
+ description: >-
2372
+ `full` (the default) returns every skill file with its text.
2373
+ `summary` returns each file's `relative_filepath` and `bytes`, plus
2374
+ `name` and `description` for a `SKILL.md`, and no `file_contents`;
2375
+ fetch a file with `GET .../agents/{agentName}/skills/{path}`. The
2376
+ `source` pin is identical in both. Any other value, including an
2377
+ empty one, is a 400.
2418
2378
  required: false
2419
2379
  schema:
2420
- $ref: "#/components/schemas/VersionIdPattern"
2380
+ type: string
2381
+ enum: [full, summary]
2382
+ default: full
2421
2383
  responses:
2422
2384
  "200":
2423
- description: A list of embedded databases in the package
2385
+ description: The resolved agent
2424
2386
  content:
2425
2387
  application/json:
2426
2388
  schema:
2427
- type: array
2428
- items:
2429
- $ref: "#/components/schemas/Database"
2389
+ $ref: "#/components/schemas/Agent"
2390
+ "400":
2391
+ $ref: "#/components/responses/BadRequest"
2430
2392
  "401":
2431
2393
  $ref: "#/components/responses/Unauthorized"
2432
2394
  "404":
2433
2395
  $ref: "#/components/responses/NotFound"
2434
2396
  "500":
2435
2397
  $ref: "#/components/responses/InternalServerError"
2436
- "501":
2437
- $ref: "#/components/responses/NotImplemented"
2438
2398
  "503":
2439
2399
  $ref: "#/components/responses/ServiceUnavailable"
2440
2400
 
2441
- /environments/{environmentName}/packages/{packageName}/data-apps:
2401
+ /environments/{environmentName}/packages/{packageName}/agents/{agentName}/skills/{relativeFilepath}:
2442
2402
  get:
2443
2403
  tags:
2444
- - data-apps
2445
- operationId: list-data-apps
2446
- summary: List package data apps
2404
+ - agents
2405
+ operationId: get-agent-skill-file
2406
+ summary: Get one of an agent's skill files
2447
2407
  description: |
2448
- Retrieves a list of all in-package HTML data apps (static pages served
2449
- from the package's public/ directory) within the specified package. Each
2450
- entry includes the relative path, the package name, a canonical resource
2451
- URL, and the title (extracted from the file's <title> tag, falling back
2452
- to the path). Used by the Publisher SPA to surface a clickable "Data
2453
- Apps" section on the package detail view, and by anyone who wants to
2454
- discover a package's data apps programmatically without scraping the
2455
- directory. Recursive depth is capped server-side to keep this cheap on
2456
- large packages.
2408
+ Returns one file from the agent's resolved skill set, named by a
2409
+ `relative_filepath` from `GET .../agents/{agentName}?skills=summary`
2410
+ (for example `analyst-conventions/SKILL.md`), with the same `source`
2411
+ pin as the full definition. The path is looked up in the resolved set,
2412
+ never joined onto the filesystem.
2413
+
2414
+ 404 when the agent or the file is not served.
2457
2415
  parameters:
2458
2416
  - name: environmentName
2459
2417
  in: path
@@ -2467,57 +2425,580 @@ paths:
2467
2425
  required: true
2468
2426
  schema:
2469
2427
  $ref: "#/components/schemas/IdentifierPattern"
2428
+ - name: agentName
2429
+ in: path
2430
+ description: >-
2431
+ Agent name as returned by the listing. Names are 1-64 lowercase
2432
+ letters, digits and single hyphens; any other value is a 404, not a
2433
+ 400.
2434
+ required: true
2435
+ schema:
2436
+ type: string
2437
+ pattern: "^[a-z0-9]+(-[a-z0-9]+)*$"
2438
+ maxLength: 64
2439
+ - name: relativeFilepath
2440
+ in: path
2441
+ description: >-
2442
+ A `relative_filepath` from the agent's skill summary. Slashes may be
2443
+ sent literally or as `%2F`; a literal `%` in a name must be sent as
2444
+ `%25`.
2445
+ required: true
2446
+ schema:
2447
+ type: string
2470
2448
  responses:
2471
2449
  "200":
2472
- description: A list of data apps in the package
2450
+ description: The skill file
2473
2451
  content:
2474
2452
  application/json:
2475
2453
  schema:
2476
- type: array
2477
- items:
2478
- $ref: "#/components/schemas/DataApp"
2479
- "400":
2480
- $ref: "#/components/responses/BadRequest"
2454
+ $ref: "#/components/schemas/AgentSkillRead"
2481
2455
  "401":
2482
2456
  $ref: "#/components/responses/Unauthorized"
2483
2457
  "404":
2484
2458
  $ref: "#/components/responses/NotFound"
2485
2459
  "500":
2486
2460
  $ref: "#/components/responses/InternalServerError"
2487
- "501":
2488
- $ref: "#/components/responses/NotImplemented"
2489
2461
  "503":
2490
2462
  $ref: "#/components/responses/ServiceUnavailable"
2491
2463
 
2492
- /environments/{environmentName}/packages/{packageName}/events:
2464
+ # ── DEPRECATED ──────────────────────────────────────────────────────────
2465
+ # The `…/dashboards*` and `…/notebooks*` routes, kept for clients that still
2466
+ # read them, until a later release removes them. Use `…/reports*` above.
2467
+ # Their schemas (`Dashboard`, `DashboardManifest`, `DashboardTile`,
2468
+ # `Notebook`, `RawNotebook`) are in the deprecated section of the schemas;
2469
+ # no report schema references them.
2470
+ /environments/{environmentName}/packages/{packageName}/dashboards:
2493
2471
  get:
2494
2472
  tags:
2495
- - watch-mode
2496
- operationId: stream-package-events
2497
- summary: Stream package change events (SSE)
2473
+ - dashboards
2474
+ operationId: list-dashboards
2475
+ deprecated: true
2476
+ summary: List package dashboards (deprecated; use list-reports)
2498
2477
  description: |
2499
- Opens a Server-Sent Events (SSE) stream of file-change events for the
2500
- package, used by in-package HTML data apps (via the publisher.js
2501
- runtime) to live-reload when their sources are edited.
2478
+ **DEPRECATED**: use list-reports, which lists every report of either
2479
+ layout by path. This route lists the package's grid reports (see
2480
+ list-reports for what makes a file a report and which layout it has),
2481
+ wherever they live in the package. Two may share a `name`; their `path`
2482
+ tells them apart. A file with no artifact tag is an ordinary model and is
2483
+ not listed, whether or not it compiles.
2484
+
2485
+ **Contract change since reports.** This route used to list only
2486
+ `.malloy` files directly under `dashboards/`, so every `name` was unique
2487
+ and every `path` was `dashboards/<name>.malloy`. It now lists grid
2488
+ reports from anywhere in the package (`sales/q3.malloy`,
2489
+ `notebooks/x.malloy`, `a/b/c.malloy`), so `path` may have any depth and
2490
+ `name` may repeat. Key on `path`.
2502
2491
 
2503
- This is a long-lived `text/event-stream` connection, not a JSON
2504
- endpoint, and is therefore not surfaced through the generated API
2505
- clients — consume it with an `EventSource`. The stream emits:
2506
- - `event: hello` (`data: connected`) once on connect.
2507
- - `event: mode` (`data: enabled|disabled`) reporting whether watch
2508
- mode is currently active for the environment. When `disabled`, no
2509
- `changed` events will follow until watch mode is started.
2510
- - `event: changed` (`data: changed`) each time a watched file in the
2511
- package changes.
2512
- - periodic `: heartbeat` comments to keep idle proxies from closing
2513
- the connection.
2514
- parameters:
2515
- - name: environmentName
2516
- in: path
2517
- description: Name of the environment
2518
- required: true
2519
- schema:
2520
- $ref: "#/components/schemas/IdentifierPattern"
2492
+ A tagged dashboard that failed to compile is listed carrying its
2493
+ `error` where that state can arise at all, so a broken dashboard is
2494
+ visibly broken rather than silently absent. In practice it rarely does:
2495
+ a package whose model fails to compile is not loaded, and a reload that
2496
+ would break one is refused and leaves the previously loaded package
2497
+ serving, so `error` is only reachable on the paths that keep per-model
2498
+ placeholders. Treat it as present-but-uncommon rather than the normal
2499
+ way a broken dashboard surfaces.
2500
+
2501
+ Every tagged dashboard is listed, whatever the package's surface. To
2502
+ hide one, remove its `# artifact` tag. On a package with a surface (a
2503
+ root `index.malloy`, or a legacy `explores`) with `queryableSources`
2504
+ left at `"declared"`, a dashboard's tiles, its single query and its
2505
+ filter `suggest` queries may read only sources the surface exports. A
2506
+ source the dashboard declares on top of a surface source may be read;
2507
+ one over a hidden source may not. The dashboard file's own
2508
+ `export {}` and named queries add nothing to the surface. A tile over a
2509
+ hidden source answers 404 when it runs, and the package's `warnings`
2510
+ report each such tile, single query and suggest, with severity
2511
+ `error`, as of the last load, naming the source and the fix. Under
2512
+ `"all"` nothing is refused, so the situation does not arise.
2513
+ parameters:
2514
+ - name: environmentName
2515
+ in: path
2516
+ description: Name of the environment
2517
+ required: true
2518
+ schema:
2519
+ $ref: "#/components/schemas/IdentifierPattern"
2520
+ - name: packageName
2521
+ in: path
2522
+ description: Name of the package
2523
+ required: true
2524
+ schema:
2525
+ $ref: "#/components/schemas/IdentifierPattern"
2526
+ - name: versionId
2527
+ in: query
2528
+ description: Version identifier for the package
2529
+ required: false
2530
+ schema:
2531
+ $ref: "#/components/schemas/VersionIdPattern"
2532
+ responses:
2533
+ "200":
2534
+ description: A list of dashboards in the package
2535
+ content:
2536
+ application/json:
2537
+ schema:
2538
+ type: array
2539
+ items:
2540
+ $ref: "#/components/schemas/Dashboard"
2541
+ "401":
2542
+ $ref: "#/components/responses/Unauthorized"
2543
+ "404":
2544
+ $ref: "#/components/responses/NotFound"
2545
+ "500":
2546
+ $ref: "#/components/responses/InternalServerError"
2547
+ "501":
2548
+ $ref: "#/components/responses/NotImplemented"
2549
+ "503":
2550
+ $ref: "#/components/responses/ServiceUnavailable"
2551
+
2552
+ /environments/{environmentName}/packages/{packageName}/dashboards/{dashboardName}:
2553
+ get:
2554
+ tags:
2555
+ - dashboards
2556
+ operationId: get-dashboard
2557
+ deprecated: true
2558
+ summary: Get a dashboard manifest (deprecated; use get-report)
2559
+ description: |
2560
+ **DEPRECATED**: use get-report, which addresses a report by its path.
2561
+ Retrieves everything a viewer needs to render one grid report: the
2562
+ artifact tag's declarations plus the control contract derived from the
2563
+ givens its query references. Running it needs no further endpoint — its
2564
+ query, each tile, and each control's suggest query all run
2565
+ through the model query endpoint with `givens`, using the manifest's
2566
+ `path` as the model.
2567
+
2568
+ `dashboardName` is a basename, which is not an identity: it resolves
2569
+ only when exactly one grid report in the package has it. When several
2570
+ do, the answer is 409 naming every matching path; address the report
2571
+ by path with get-report instead.
2572
+
2573
+ **Contract change since reports.** This route never answered 409
2574
+ before: a dashboard lived directly under `dashboards/`, so its name was
2575
+ unique. A grid report may now live anywhere, two may share a basename,
2576
+ and a client of this route must handle 409. The match also covers grid
2577
+ reports outside `dashboards/`.
2578
+ parameters:
2579
+ - name: environmentName
2580
+ in: path
2581
+ description: Name of the environment
2582
+ required: true
2583
+ schema:
2584
+ $ref: "#/components/schemas/IdentifierPattern"
2585
+ - name: packageName
2586
+ in: path
2587
+ description: Name of the package
2588
+ required: true
2589
+ schema:
2590
+ $ref: "#/components/schemas/IdentifierPattern"
2591
+ - name: dashboardName
2592
+ in: path
2593
+ description: >-
2594
+ The report's name: its filename basename. Conventionally letters,
2595
+ digits, "-" and "_", and a package is warned when one of its
2596
+ grid reports falls outside that. It is NOT constrained to it, because
2597
+ the name comes from a filename rather than being chosen: a file such
2598
+ as `v1.2.malloy` is served, and its published `resource`
2599
+ carries the name percent-encoded. Send it percent-encoded.
2600
+ required: true
2601
+ schema:
2602
+ type: string
2603
+ minLength: 1
2604
+ - name: versionId
2605
+ in: query
2606
+ description: Version identifier for the package
2607
+ required: false
2608
+ schema:
2609
+ $ref: "#/components/schemas/VersionIdPattern"
2610
+ responses:
2611
+ "200":
2612
+ description: The dashboard manifest
2613
+ content:
2614
+ application/json:
2615
+ schema:
2616
+ $ref: "#/components/schemas/DashboardManifest"
2617
+ "401":
2618
+ $ref: "#/components/responses/Unauthorized"
2619
+ "404":
2620
+ $ref: "#/components/responses/NotFound"
2621
+ "409":
2622
+ description:
2623
+ More than one grid report in the package has this basename. The
2624
+ message names every matching path; use get-report with one.
2625
+ content:
2626
+ application/json:
2627
+ schema:
2628
+ $ref: "#/components/schemas/Error"
2629
+ "500":
2630
+ $ref: "#/components/responses/InternalServerError"
2631
+ "501":
2632
+ $ref: "#/components/responses/NotImplemented"
2633
+ "503":
2634
+ $ref: "#/components/responses/ServiceUnavailable"
2635
+
2636
+ /environments/{environmentName}/packages/{packageName}/notebooks:
2637
+ get:
2638
+ tags:
2639
+ - notebooks
2640
+ operationId: list-notebooks
2641
+ deprecated: true
2642
+ summary: List package notebooks (deprecated; use list-reports)
2643
+ description: |
2644
+ **DEPRECATED**: use list-reports. Lists the package's linear reports (see
2645
+ list-reports): every `.malloynb` file outside `public/`, and every tagged
2646
+ `.malloy` report whose layout is linear, wherever it lives. Each entry
2647
+ includes the relative path, package name, title, description, and any
2648
+ compilation or reading error.
2649
+
2650
+ **Contract change since reports.** This route used to list `.malloy`
2651
+ notebooks only directly under `notebooks/`. It now lists linear reports
2652
+ from anywhere in the package, including `dashboards/` and nested
2653
+ directories, and no longer lists a kindless tiled file in `notebooks/`,
2654
+ which is now grid.
2655
+ parameters:
2656
+ - name: environmentName
2657
+ in: path
2658
+ description: Name of the environment
2659
+ required: true
2660
+ schema:
2661
+ $ref: "#/components/schemas/IdentifierPattern"
2662
+ - name: packageName
2663
+ in: path
2664
+ description: Name of the package
2665
+ required: true
2666
+ schema:
2667
+ $ref: "#/components/schemas/IdentifierPattern"
2668
+ - name: versionId
2669
+ in: query
2670
+ description: Version identifier for the package
2671
+ required: false
2672
+ schema:
2673
+ $ref: "#/components/schemas/VersionIdPattern"
2674
+ responses:
2675
+ "200":
2676
+ description: A list of notebooks in the package
2677
+ content:
2678
+ application/json:
2679
+ schema:
2680
+ type: array
2681
+ items:
2682
+ $ref: "#/components/schemas/Notebook"
2683
+ "401":
2684
+ $ref: "#/components/responses/Unauthorized"
2685
+ "404":
2686
+ $ref: "#/components/responses/NotFound"
2687
+ "500":
2688
+ $ref: "#/components/responses/InternalServerError"
2689
+ "501":
2690
+ $ref: "#/components/responses/NotImplemented"
2691
+ "503":
2692
+ $ref: "#/components/responses/ServiceUnavailable"
2693
+
2694
+ /environments/{environmentName}/packages/{packageName}/notebooks/{path}:
2695
+ get:
2696
+ tags:
2697
+ - notebooks
2698
+ operationId: get-notebook
2699
+ deprecated: true
2700
+ summary: Get Malloy notebook cells (deprecated; use get-report)
2701
+ description: |
2702
+ **DEPRECATED**: use get-report. Retrieves a linear report with its raw
2703
+ cell contents (markdown and code). A `.malloy` report's cells run
2704
+ through the model query endpoint (each cell's `text` as the query); a
2705
+ `.malloynb`'s through execute-notebook-cell. A linear `.malloy`
2706
+ report, wherever it lives, answers here as well as a `.malloynb`.
2707
+ On a package with a surface, the response shows only the sources the notebook may read.
2708
+ parameters:
2709
+ - name: environmentName
2710
+ in: path
2711
+ description: Name of the environment
2712
+ required: true
2713
+ schema:
2714
+ $ref: "#/components/schemas/IdentifierPattern"
2715
+ - name: packageName
2716
+ in: path
2717
+ description: Name of the package
2718
+ required: true
2719
+ schema:
2720
+ type: string
2721
+ - name: path
2722
+ in: path
2723
+ description: Path to notebook within the package.
2724
+ required: true
2725
+ schema:
2726
+ type: string
2727
+ - name: versionId
2728
+ in: query
2729
+ description: Version identifier for the package
2730
+ required: false
2731
+ schema:
2732
+ $ref: "#/components/schemas/VersionIdPattern"
2733
+ responses:
2734
+ "200":
2735
+ description: A Malloy notebook with raw cell contents.
2736
+ content:
2737
+ "application/json":
2738
+ schema:
2739
+ $ref: "#/components/schemas/RawNotebook"
2740
+ "401":
2741
+ $ref: "#/components/responses/Unauthorized"
2742
+ "404":
2743
+ $ref: "#/components/responses/NotFound"
2744
+ "500":
2745
+ $ref: "#/components/responses/InternalServerError"
2746
+ "501":
2747
+ $ref: "#/components/responses/NotImplemented"
2748
+
2749
+ /environments/{environmentName}/packages/{packageName}/notebooks/{path}/cells/{cellIndex}:
2750
+ get:
2751
+ tags:
2752
+ - notebooks
2753
+ operationId: execute-notebook-cell
2754
+ deprecated: true
2755
+ summary: Execute a specific notebook cell (deprecated)
2756
+ description: |
2757
+ **DEPRECATED**: removed with the other notebook routes. For a `.malloy`
2758
+ report, run a cell through the model query endpoint instead: the
2759
+ report's path as the model, the cell's `text` (from get-report) as
2760
+ `query`, and `givens` in the body, which applies the same surface,
2761
+ `#(authorize)` and row-level gates. A `.malloynb` has no other route.
2762
+ Executes a specific cell in a linear report by index.
2763
+ For code cells, this compiles and runs the Malloy code, returning query
2764
+ results and any new sources defined. For markdown cells, this simply
2765
+ returns the cell content. A linear `.malloy` report, wherever it lives,
2766
+ answers here as well as a `.malloynb`.
2767
+
2768
+ On a package with a surface (a root `index.malloy`, or a legacy `explores`) with
2769
+ `queryableSources` left at `"declared"`, a code cell may read only sources the surface
2770
+ exports. A cell over a hidden source answers 404, and 404 rather than 403 even when the
2771
+ source is also `#(authorize)`-gated. A source an earlier cell declares on top of a
2772
+ published source still works. A cell's own source over a raw table (`duckdb.table(...)`
2773
+ or `.sql(...)`) has no published source under it, so it is refused. The response shows
2774
+ only the sources the notebook may read.
2775
+ parameters:
2776
+ - name: environmentName
2777
+ in: path
2778
+ description: Name of the environment
2779
+ required: true
2780
+ schema:
2781
+ $ref: "#/components/schemas/IdentifierPattern"
2782
+ - name: packageName
2783
+ in: path
2784
+ description: Name of the package
2785
+ required: true
2786
+ schema:
2787
+ type: string
2788
+ - name: path
2789
+ in: path
2790
+ description: Path to notebook within the package
2791
+ required: true
2792
+ schema:
2793
+ type: string
2794
+ - name: cellIndex
2795
+ in: path
2796
+ description: Index of the cell to execute (0-based)
2797
+ required: true
2798
+ schema:
2799
+ type: integer
2800
+ - name: versionId
2801
+ in: query
2802
+ description: Version identifier for the package
2803
+ required: false
2804
+ schema:
2805
+ $ref: "#/components/schemas/VersionIdPattern"
2806
+ - name: filter_params
2807
+ in: query
2808
+ deprecated: true
2809
+ description: |
2810
+ **DEPRECATED**: Use `givens` (native Malloy runtime parameters) instead.
2811
+ Targets the deprecated `#(filter)` annotation path. See docs/givens.md
2812
+ for migration recipes.
2813
+
2814
+ JSON-encoded filter parameter values keyed by filter name.
2815
+ required: false
2816
+ schema:
2817
+ type: string
2818
+ - name: bypass_filters
2819
+ in: query
2820
+ deprecated: true
2821
+ description: |
2822
+ **DEPRECATED**: Use `givens` (native Malloy runtime parameters) instead.
2823
+ See docs/givens.md for migration recipes.
2824
+
2825
+ When true, skip filter injection entirely.
2826
+ required: false
2827
+ schema:
2828
+ type: string
2829
+ enum:
2830
+ - "true"
2831
+ - "false"
2832
+ - name: givens
2833
+ in: query
2834
+ description:
2835
+ A `GivenValues` object, JSON-encoded so it can travel in a query
2836
+ string. Values are typed as `GivenValues` describes them, not
2837
+ string-encoded as `EncodedGivenValues` would be. The parameter keeps
2838
+ its name for compatibility; the schema it carries is the one named
2839
+ here.
2840
+ required: false
2841
+ schema:
2842
+ type: string
2843
+ responses:
2844
+ "200":
2845
+ description: Cell execution result
2846
+ content:
2847
+ "application/json":
2848
+ schema:
2849
+ $ref: "#/components/schemas/NotebookCellResult"
2850
+ "400":
2851
+ $ref: "#/components/responses/BadRequest"
2852
+ "401":
2853
+ $ref: "#/components/responses/Unauthorized"
2854
+ "403":
2855
+ $ref: "#/components/responses/Forbidden"
2856
+ "404":
2857
+ $ref: "#/components/responses/NotFound"
2858
+ "413":
2859
+ $ref: "#/components/responses/PayloadTooLarge"
2860
+ "500":
2861
+ $ref: "#/components/responses/InternalServerError"
2862
+ "501":
2863
+ $ref: "#/components/responses/NotImplemented"
2864
+ "424":
2865
+ $ref: "#/components/responses/ConnectionUnavailable"
2866
+ "502":
2867
+ $ref: "#/components/responses/DatabaseUnreachable"
2868
+ "503":
2869
+ $ref: "#/components/responses/ServiceUnavailable"
2870
+ "504":
2871
+ $ref: "#/components/responses/GatewayTimeout"
2872
+
2873
+ /environments/{environmentName}/packages/{packageName}/databases:
2874
+ get:
2875
+ tags:
2876
+ - databases
2877
+ operationId: list-databases
2878
+ summary: List embedded databases
2879
+ description: |
2880
+ Retrieves a list of all embedded databases within the specified package. These are typically
2881
+ local data files read by DuckDB in place (.parquet, .csv, and .xlsx) that provide local data
2882
+ storage for the package. Each database entry includes metadata about the database structure and content.
2883
+ parameters:
2884
+ - name: environmentName
2885
+ in: path
2886
+ description: Name of the environment
2887
+ required: true
2888
+ schema:
2889
+ $ref: "#/components/schemas/IdentifierPattern"
2890
+ - name: packageName
2891
+ in: path
2892
+ description: Name of the package
2893
+ required: true
2894
+ schema:
2895
+ $ref: "#/components/schemas/IdentifierPattern"
2896
+ - name: versionId
2897
+ in: query
2898
+ description: Version identifier for the package
2899
+ required: false
2900
+ schema:
2901
+ $ref: "#/components/schemas/VersionIdPattern"
2902
+ responses:
2903
+ "200":
2904
+ description: A list of embedded databases in the package
2905
+ content:
2906
+ application/json:
2907
+ schema:
2908
+ type: array
2909
+ items:
2910
+ $ref: "#/components/schemas/Database"
2911
+ "401":
2912
+ $ref: "#/components/responses/Unauthorized"
2913
+ "404":
2914
+ $ref: "#/components/responses/NotFound"
2915
+ "500":
2916
+ $ref: "#/components/responses/InternalServerError"
2917
+ "501":
2918
+ $ref: "#/components/responses/NotImplemented"
2919
+ "503":
2920
+ $ref: "#/components/responses/ServiceUnavailable"
2921
+
2922
+ /environments/{environmentName}/packages/{packageName}/data-apps:
2923
+ get:
2924
+ tags:
2925
+ - data-apps
2926
+ operationId: list-data-apps
2927
+ summary: List package data apps
2928
+ description: |
2929
+ Retrieves a list of all in-package HTML data apps (static pages served
2930
+ from the package's public/ directory) within the specified package. Each
2931
+ entry includes the relative path, the package name, a canonical resource
2932
+ URL, and the title (extracted from the file's <title> tag, falling back
2933
+ to the path). Used by the Publisher SPA to surface a clickable "Data
2934
+ Apps" section on the package detail view, and by anyone who wants to
2935
+ discover a package's data apps programmatically without scraping the
2936
+ directory. Recursive depth is capped server-side to keep this cheap on
2937
+ large packages.
2938
+ parameters:
2939
+ - name: environmentName
2940
+ in: path
2941
+ description: Name of the environment
2942
+ required: true
2943
+ schema:
2944
+ $ref: "#/components/schemas/IdentifierPattern"
2945
+ - name: packageName
2946
+ in: path
2947
+ description: Name of the package
2948
+ required: true
2949
+ schema:
2950
+ $ref: "#/components/schemas/IdentifierPattern"
2951
+ responses:
2952
+ "200":
2953
+ description: A list of data apps in the package
2954
+ content:
2955
+ application/json:
2956
+ schema:
2957
+ type: array
2958
+ items:
2959
+ $ref: "#/components/schemas/DataApp"
2960
+ "400":
2961
+ $ref: "#/components/responses/BadRequest"
2962
+ "401":
2963
+ $ref: "#/components/responses/Unauthorized"
2964
+ "404":
2965
+ $ref: "#/components/responses/NotFound"
2966
+ "500":
2967
+ $ref: "#/components/responses/InternalServerError"
2968
+ "501":
2969
+ $ref: "#/components/responses/NotImplemented"
2970
+ "503":
2971
+ $ref: "#/components/responses/ServiceUnavailable"
2972
+
2973
+ /environments/{environmentName}/packages/{packageName}/events:
2974
+ get:
2975
+ tags:
2976
+ - watch-mode
2977
+ operationId: stream-package-events
2978
+ summary: Stream package change events (SSE)
2979
+ description: |
2980
+ Opens a Server-Sent Events (SSE) stream of file-change events for the
2981
+ package, used by in-package HTML data apps (via the publisher.js
2982
+ runtime) to live-reload when their sources are edited.
2983
+
2984
+ This is a long-lived `text/event-stream` connection, not a JSON
2985
+ endpoint, and is therefore not surfaced through the generated API
2986
+ clients — consume it with an `EventSource`. The stream emits:
2987
+ - `event: hello` (`data: connected`) once on connect.
2988
+ - `event: mode` (`data: enabled|disabled`) reporting whether watch
2989
+ mode is currently active for the environment. When `disabled`, no
2990
+ `changed` events will follow until watch mode is started.
2991
+ - `event: changed` (`data: changed`) each time a watched file in the
2992
+ package changes.
2993
+ - periodic `: heartbeat` comments to keep idle proxies from closing
2994
+ the connection.
2995
+ parameters:
2996
+ - name: environmentName
2997
+ in: path
2998
+ description: Name of the environment
2999
+ required: true
3000
+ schema:
3001
+ $ref: "#/components/schemas/IdentifierPattern"
2521
3002
  - name: packageName
2522
3003
  in: path
2523
3004
  description: Name of the package
@@ -3394,11 +3875,11 @@ components:
3394
3875
  paths relative to the package root. Only these models are listed
3395
3876
  via `listModels()`, and the surface is the union of their
3396
3877
  `export {}` closures. Every other .malloy file still compiles for
3397
- import/join resolution but is hidden. Notebooks and dashboards are
3398
- always listed regardless of this field, and a dashboard entry
3399
- needs no listing: a tagged dashboard listed here reads the surface
3400
- and adds nothing to it. An untagged file under `dashboards/` that
3401
- is listed is an ordinary surface file.
3878
+ import/join resolution but is hidden. Reports are always listed
3879
+ regardless of this field, and a report needs no listing: a report
3880
+ listed here reads the surface and adds nothing to it, and the
3881
+ package warns about it (`report-on-surface`). An untagged file
3882
+ that is listed is an ordinary surface file, wherever it lives.
3402
3883
  DEPRECATED, still honored. Every non-empty value gets a load
3403
3884
  warning naming the replacement: a root `index.malloy` that imports
3404
3885
  the listed files and exports what they publish. `[]` is deprecated
@@ -3457,23 +3938,28 @@ components:
3457
3938
  `queryableSources: "declared"`, and a root file such as
3458
3939
  `Index.malloy` that differs from `index.malloy` only in case and
3459
3940
  so is ignored. A root `index.malloy` with no manifest keys gets no
3460
- warning. Dashboard findings: a
3461
- `dashboards/` file whose `# artifact` tag does not parse or does not
3462
- describe a dashboard, a tile or suggest query that does not resolve,
3463
- a `# drill` naming a destination that is not a dashboard, and a
3464
- tile, single query or filter suggest that reads a source the
3465
- surface does not export, so it won't load. Two dashboard findings are about Publisher rather
3466
- than about the package: one when a file carrying an artifact tag
3467
- could not be read and so is not served at all, and one when the lint
3468
- stops early, in which case the list must be read as incomplete
3469
- rather than as a clean package. Notebook findings: a `notebooks/`
3470
- file with an `## artifact` note whose cells could not be read, which
3471
- names the line and the fix and is reported with severity `error`,
3472
- because the notebook is served with that error instead of opening.
3473
- The same family carries findings on files under `notebooks/` and
3474
- `dashboards/`, each naming its line and the fix; they are computed
3475
- at discovery and are also returned by `/compile` at file and
3476
- package scope. Eight codes are `error` and fail `/compile`:
3941
+ warning. Report findings (one lint pass per report, of either
3942
+ layout, wherever it lives): a file whose artifact tag does not
3943
+ parse or does not describe a report, a tile or suggest query that
3944
+ does not resolve, a `# drill` naming a destination that is not a
3945
+ report, and a tile, single query or filter suggest that reads a
3946
+ source the surface does not export, so it won't load. A `# drill`
3947
+ destination is a path from the package root (a bare name is a file
3948
+ at the root); one that names no report is unresolved (`error`).
3949
+ Curation findings: a root `index.malloy` carrying an artifact tag,
3950
+ which is ignored (`index-is-not-a-report`, `error`); and a report
3951
+ that `index.malloy` imports or `explores` lists
3952
+ (`report-on-surface`, `warn`). Two report findings are about
3953
+ Publisher rather than about the package: one when a file carrying
3954
+ an artifact tag could not be read and so is not served at all, and
3955
+ one when the lint stops early, in which case the list must be read
3956
+ as incomplete rather than as a clean package. A linear report whose
3957
+ cells could not be read gets a finding that names the line and the
3958
+ fix and is reported with severity `error`, because it is served
3959
+ with that error instead of opening. The per-file report findings
3960
+ each name their line and the fix and carry a `code`; they are
3961
+ computed at discovery and are also returned by `/compile` at file
3962
+ and package scope. Eight codes are `error` and fail `/compile`:
3477
3963
  `notebook-statement-above-artifact` and `notebook-tag-above-artifact`
3478
3964
  (a statement or a tag above a served notebook's `## artifact`),
3479
3965
  `notebook-markdown-above-artifact` (a `(markdown)` annotation above
@@ -3484,9 +3970,21 @@ components:
3484
3970
  `notebook-markdown-attached-nowhere` (a `#(markdown)` annotation
3485
3971
  with no statement to take it), `notebook-artifact-unparsed` (an
3486
3972
  `## artifact` tag does not parse), and `notebook-cells-unreadable`
3487
- (the reader could not read a served notebook's cells). The rest are
3488
- `warn` (a mistyped `(markdown)` opener, a missing `kind=notebook`, a
3489
- block that never closes, and similar).
3973
+ (the reader could not read a linear report's cells), plus
3974
+ `report-kind-removed` (a tag that sets `kind=`, which is no longer
3975
+ read, so the file is not a report; the finding names the `layout=`
3976
+ to write) and `report-layout-unknown` (a `layout=` other than
3977
+ `grid` or `linear`). The rest are `warn` (a mistyped `(markdown)`
3978
+ opener, `report-layout-implicit` for a tag that names no layout and lists
3979
+ no tiles, a block that never closes, and similar).
3980
+ Skill and agent findings, all `warn`: a package skill under
3981
+ `skills/` that is not served (unreadable or linked-out `SKILL.md`,
3982
+ a frontmatter `name` that is not its directory name, a `skills/`
3983
+ directory that links out of the package) or served with a gap (no
3984
+ `description`, a `reference/` that cannot be listed or read); and
3985
+ each agent the manifest declares that is not served, or is served
3986
+ with a finding (an agent skill with no `description`, a skills
3987
+ directory with no skills, an unreadable reference).
3490
3988
  Deprecated-format findings, all `warn`: each `.malloynb` notebook
3491
3989
  (`model` is its path), and each source a file declares deprecated
3492
3990
  `#(filter)` annotations on (`model` is that file, `subject` the
@@ -3582,8 +4080,8 @@ components:
3582
4080
  description: >-
3583
4081
  What the finding is about: the query or view a render finding
3584
4082
  sits on (`by_carrier`, `flights -> by_carrier`), the source a
3585
- materialization finding belongs to, or, for a dashboard
3586
- finding, the dashboard's name or the `source.dimension` a
4083
+ materialization finding belongs to, or, for a report
4084
+ finding, the report's name or the `source.dimension` a
3587
4085
  `# drill` is declared on. Absent when a finding sits on none
3588
4086
  of those, either because it spans several, in which case the
3589
4087
  message names them, or because it is about the lint itself
@@ -3591,13 +4089,33 @@ components:
3591
4089
  message:
3592
4090
  type: string
3593
4091
  description: A description of the problem.
4092
+ code:
4093
+ type: string
4094
+ description: >-
4095
+ A stable identifier for the finding's family, for a client that
4096
+ acts on it rather than only showing it; absent for a family that
4097
+ has none yet. `deprecated-malloynb-notebook`: a `.malloynb`
4098
+ notebook, the deprecated cell format (one per file, `model`
4099
+ naming it). `deprecated-filter-annotation`: a source declaring
4100
+ deprecated `#(filter)` annotations (one per declaring source,
4101
+ `model` naming its file and `subject` the source).
4102
+ `report-name-ambiguous`: two or more grid reports share a
4103
+ basename, so the deprecated `GET …/dashboards/{name}` route
4104
+ answers 409 for it (one per name, `subject` naming it and the
4105
+ message every path; `warn`). The per-file
4106
+ report findings (`notebook-…`, `report-…`) and the report
4107
+ curation findings (`report-on-surface`,
4108
+ `index-is-not-a-report`). The message wording may change; the
4109
+ code does not.
3594
4110
  severity:
3595
4111
  type: string
3596
4112
  enum:
3597
4113
  - error
3598
4114
  - warn
3599
4115
  description: >-
3600
- Finding severity. Render-tag findings use both: `error` for
4116
+ Finding severity, `error` or `warn` and nothing else; a
4117
+ deprecated form that still loads (such as
4118
+ `deprecated-malloynb-notebook`) is `warn`. Render-tag findings use both: `error` for
3601
4119
  a tag malformed for the field it sits on, which renders as
3602
4120
  "[object Object]" or an inline error at query time, and `warn`
3603
4121
  for one that is well-formed but inert where it sits and so is
@@ -3905,10 +4423,242 @@ components:
3905
4423
  - type: "null"
3906
4424
  readOnly: true
3907
4425
  description: >-
3908
- Server-computed, read-only: the state of this package's semantic
3909
- discovery index, which is what `get_context` ranks against
3910
- when an embedding provider is configured. `status: lexical` when
3911
- the server has no provider, because there is no index to describe.
4426
+ Server-computed, read-only: the state of this package's semantic
4427
+ discovery index, which is what `get_context` ranks against
4428
+ when an embedding provider is configured. `status: lexical` when
4429
+ the server has no provider, because there is no index to describe.
4430
+ servedRevision:
4431
+ type: string
4432
+ readOnly: true
4433
+ description: >-
4434
+ Server-computed, read-only: an identifier for the load that produced
4435
+ what this package is currently serving. Minted fresh per load, so
4436
+ two loads of byte-identical files carry different revisions. Use it
4437
+ to tell one load from another, NOT to tell whether content changed:
4438
+ it moves on every reload regardless. `sourceContentSha` answers that.
4439
+ sourceContentSha:
4440
+ type: string
4441
+ readOnly: true
4442
+ description: >-
4443
+ Server-computed, read-only: SHA-256 over the package-relative path
4444
+ and bytes of every file the package is serving: each model file,
4445
+ each package skill file under `skills/`, and, when the manifest
4446
+ declares `agents`, the canonical form of that `agents` object plus
4447
+ every instructions, task and skill file those agents read.
4448
+
4449
+ This is the reload receipt. Publisher serves a COPY of a package
4450
+ under `publisher_data/<env>/<pkg>/` unless the environment was
4451
+ started with `--watch-env`, so an edit to the original source
4452
+ directory reaches nothing and the reload still reports success.
4453
+ Comparing this value across a reload is what distinguishes "the
4454
+ server recompiled my edit" from "the server recompiled the same
4455
+ bytes it already had".
4456
+
4457
+ It covers EVERY model path in the package, so an edit to an imported
4458
+ file moves it where a hash of one model path would not. It covers
4459
+ nothing outside the list above: a data file, a `public/` asset, a
4460
+ `version` bump or any other key in publisher.json (`retrieval`,
4461
+ `explores`, `queryableSources`, `scope`) all leave it unchanged,
4462
+ although some of those do change what is served. An unchanged value
4463
+ therefore proves an edit to a hashed file did not reach the served
4464
+ copy, and says nothing about an edit to anything else.
4465
+ agents:
4466
+ type: array
4467
+ readOnly: true
4468
+ description: >-
4469
+ Server-computed, read-only: the agents this package's
4470
+ `publisher.json` declares and the server accepted, without their
4471
+ instructions. Absent when the manifest declares no `agents`. An
4472
+ agent that failed validation is left out and named in `warnings`.
4473
+ Fetch one with `GET .../agents/{agentName}`.
4474
+ items:
4475
+ $ref: "#/components/schemas/AgentSummary"
4476
+
4477
+ AgentSchedule:
4478
+ type: object
4479
+ readOnly: true
4480
+ description: >-
4481
+ A cron schedule an agent declares. Validated and exposed only: the
4482
+ server never runs it.
4483
+ properties:
4484
+ cron:
4485
+ type: string
4486
+ description: A 5-field UNIX cron expression, evaluated in UTC.
4487
+ task:
4488
+ type: string
4489
+ description: Package-relative path of the task file, as written in the manifest.
4490
+ taskContent:
4491
+ type: string
4492
+ description: >-
4493
+ The task file's Markdown. Only on the resolved agent, not the
4494
+ listing.
4495
+
4496
+ AgentSummary:
4497
+ type: object
4498
+ readOnly: true
4499
+ description: One agent a package declares, without its instructions or skills.
4500
+ properties:
4501
+ name:
4502
+ type: string
4503
+ description: The agent's name (its key in the manifest's `agents` object).
4504
+ description:
4505
+ type: string
4506
+ model:
4507
+ type: string
4508
+ description: The model the agent asks for; `inherit` when the manifest sets none.
4509
+ schedules:
4510
+ type: array
4511
+ items:
4512
+ $ref: "#/components/schemas/AgentSchedule"
4513
+
4514
+ AgentSkillFile:
4515
+ type: object
4516
+ readOnly: true
4517
+ description: >-
4518
+ One of an agent's skill files. The snake_case keys
4519
+ (`relative_filepath`, `file_contents`) mirror the MCP `get_agent` tool
4520
+ the shape is shared with, unlike the camelCase used elsewhere in this
4521
+ API.
4522
+ properties:
4523
+ relative_filepath:
4524
+ type: string
4525
+ description: >-
4526
+ Path relative to the agent's skills directory, for example
4527
+ `analyst-conventions/SKILL.md` or
4528
+ `analyst-conventions/reference/glossary.md`.
4529
+ file_contents:
4530
+ type: string
4531
+ description: >-
4532
+ A `SKILL.md` is re-emitted with only a quoted `name` and
4533
+ `description` in its frontmatter; reference files are served raw.
4534
+ Absent when the agent was fetched with `skills=summary`.
4535
+ name:
4536
+ type: string
4537
+ description: A `SKILL.md`'s name. Only in the `skills=summary` view.
4538
+ description:
4539
+ type: string
4540
+ description: A `SKILL.md`'s description. Only in the `skills=summary` view.
4541
+ bytes:
4542
+ type: integer
4543
+ description: Size of `file_contents` in UTF-8 bytes. Only in the `skills=summary` view.
4544
+
4545
+ AgentSkillRead:
4546
+ type: object
4547
+ readOnly: true
4548
+ description: One agent skill file, with the pin of the definition it belongs to.
4549
+ properties:
4550
+ relative_filepath:
4551
+ type: string
4552
+ file_contents:
4553
+ type: string
4554
+ source:
4555
+ $ref: "#/components/schemas/AgentSource"
4556
+
4557
+ AgentSource:
4558
+ type: object
4559
+ readOnly: true
4560
+ description: What a resolved agent was read from, so a runner can prove which bytes ran.
4561
+ properties:
4562
+ environment:
4563
+ type: string
4564
+ package:
4565
+ type: string
4566
+ sourceContentSha:
4567
+ type: string
4568
+ description: The package's `sourceContentSha` at the load this definition came from.
4569
+ definitionSha:
4570
+ type: string
4571
+ description: >-
4572
+ SHA-256 over this agent's canonical config, instructions, skill
4573
+ files and task files. Editing another agent, or a model, does not
4574
+ move it.
4575
+ servedRevision:
4576
+ type: string
4577
+ description: The package's `servedRevision` at the load this definition came from.
4578
+
4579
+ Agent:
4580
+ type: object
4581
+ readOnly: true
4582
+ description: >-
4583
+ An agent a package declares, resolved to its instructions, skill files
4584
+ and schedules. Adopt it only when the user asks for it by name.
4585
+ properties:
4586
+ name:
4587
+ type: string
4588
+ description:
4589
+ type: string
4590
+ model:
4591
+ type: string
4592
+ description: The model the agent asks for; `inherit` when the manifest sets none.
4593
+ instructions:
4594
+ type: string
4595
+ description: The instructions file's Markdown, at most 16 KB.
4596
+ skills:
4597
+ type: array
4598
+ description: The agent's own skill files, sorted by `relative_filepath`.
4599
+ items:
4600
+ $ref: "#/components/schemas/AgentSkillFile"
4601
+ schedules:
4602
+ type: array
4603
+ items:
4604
+ $ref: "#/components/schemas/AgentSchedule"
4605
+ warnings:
4606
+ type: array
4607
+ items:
4608
+ type: string
4609
+ source:
4610
+ $ref: "#/components/schemas/AgentSource"
4611
+
4612
+ SkillSummary:
4613
+ type: object
4614
+ readOnly: true
4615
+ description: >-
4616
+ One agent skill in force for a package, without its body. This is what
4617
+ a caller reads to decide which skill to fetch.
4618
+ properties:
4619
+ name:
4620
+ type: string
4621
+ description: >-
4622
+ The skill's name, and the identifier for fetching it. A name
4623
+ containing a slash (`<skill>/<stem>`) is one skill's on-demand
4624
+ reference file rather than a skill in its own right.
4625
+ description:
4626
+ type: string
4627
+ description: >-
4628
+ One line saying when to read this skill. Empty when the package
4629
+ author omitted it, which is also reported as a package warning.
4630
+ origin:
4631
+ type: string
4632
+ enum:
4633
+ - bundled
4634
+ - package
4635
+ description: >-
4636
+ `bundled` = shipped with this server. `package` = shipped by the
4637
+ package under `skills/`, which includes a package skill whose name
4638
+ matches a bundled one and therefore REPLACES it for this package.
4639
+ Present so a caller can tell a replaced skill from the original,
4640
+ which is otherwise invisible.
4641
+
4642
+ Skill:
4643
+ type: object
4644
+ readOnly: true
4645
+ description: An agent skill with its full Markdown body.
4646
+ properties:
4647
+ name:
4648
+ type: string
4649
+ description: The skill's name.
4650
+ description:
4651
+ type: string
4652
+ description: One line saying when to read this skill.
4653
+ content:
4654
+ type: string
4655
+ description: The skill's full guidance, Markdown.
4656
+ origin:
4657
+ type: string
4658
+ enum:
4659
+ - bundled
4660
+ - package
4661
+ description: Where this skill came from. See SkillSummary.origin.
3912
4662
 
3913
4663
  PackageEmbeddingIndex:
3914
4664
  type: object
@@ -4170,35 +4920,350 @@ components:
4170
4920
  Declared query-time behavior when the freshness window is missed:
4171
4921
  serve live, serve the stale table, or fail the query.
4172
4922
 
4173
- Model:
4923
+ Model:
4924
+ type: object
4925
+ description: Malloy model metadata and status information
4926
+ properties:
4927
+ resource:
4928
+ type: string
4929
+ description: Resource path to the model
4930
+ packageName:
4931
+ type: string
4932
+ description: Name of the package containing this model
4933
+ path:
4934
+ type: string
4935
+ description: Relative path to the model file within its package directory
4936
+ isHidden:
4937
+ type: boolean
4938
+ description: |
4939
+ True for a file this route lists only because the request set
4940
+ `includeHiddenFilesAndSources`: a file the package's `index.malloy` (or a
4941
+ legacy `explores`) does not expose. False for every other file, so every
4942
+ entry is false without that option. It says whether the file is hidden, not
4943
+ whether a query can reach it: under `queryableSources: "all"` a hidden file
4944
+ can still be queried.
4945
+ error:
4946
+ type: string
4947
+ description: Error message if the model failed to compile or load
4948
+
4949
+ Report:
4950
+ type: object
4951
+ required: [resource, packageName, path, name, layout, title, editable]
4952
+ description: |
4953
+ One report in a package, as list-reports lists it: a `.malloy` file
4954
+ whose model-level `## artifact` tag makes it one, wherever it lives
4955
+ outside `public/`, or a `.malloynb`. See ReportManifest for the detail a viewer needs to render
4956
+ one.
4957
+ properties:
4958
+ resource:
4959
+ type: string
4960
+ description: Resource path to the report (get-report)
4961
+ packageName:
4962
+ type: string
4963
+ description: Name of the package containing this report
4964
+ path:
4965
+ type: string
4966
+ description: >-
4967
+ The report's path within its package, such as `sales/q3.malloy`.
4968
+ Its identity, and the only thing that addresses it.
4969
+ name:
4970
+ type: string
4971
+ description: >-
4972
+ The file's basename without its extension. A display label only:
4973
+ two reports in different directories may share it.
4974
+ layout:
4975
+ type: string
4976
+ enum: [grid, linear]
4977
+ description: >-
4978
+ How its tiles are placed: `linear` top to bottom, one column, or
4979
+ `grid` by `columns`, `colspan` and `break`. Decided by its tags (see
4980
+ list-reports), never by where the file lives.
4981
+ title:
4982
+ type: string
4983
+ description: >-
4984
+ Human title: the artifact tag's `title`, else the first line of the
4985
+ `"` notes above the tag, else,
4986
+ for a linear report, its first markdown heading, else `name`.
4987
+ description:
4988
+ type: string
4989
+ description: The report's doc comment, when it has one.
4990
+ editable:
4991
+ type: boolean
4992
+ description: >-
4993
+ Whether the builder opens it as it is: false for a `.malloynb` and
4994
+ for a linear report written as `run:` cells.
4995
+ error:
4996
+ type: string
4997
+ description: >-
4998
+ Error message when the report failed to compile, or its cells could
4999
+ not be read.
5000
+
5001
+ ReportManifest:
5002
+ description: |
5003
+ A `Report` plus what a viewer needs to draw it. A report written as
5004
+ tiles, of either layout, carries `tiles`, `dashboardColumns`,
5005
+ `startingGivens`, `autorun` and `givens`, whose tiles and suggest
5006
+ queries run through `POST …/models/{path}/query` with `givens`. A
5007
+ linear report written as `run:` cells, or a `.malloynb`, carries
5008
+ `notebook` instead.
5009
+ allOf:
5010
+ - $ref: "#/components/schemas/Report"
5011
+ - type: object
5012
+ properties:
5013
+ tiles:
5014
+ type: array
5015
+ description: >-
5016
+ The report's tiles, each run as its own query (or shown as text),
5017
+ in order. Absent on a `run:`-cell report.
5018
+ items:
5019
+ $ref: "#/components/schemas/ReportTile"
5020
+ dashboardColumns:
5021
+ type: integer
5022
+ description: >-
5023
+ Grid width, from the `# dashboard {columns=N}` tag beside the
5024
+ artifact tag. 1 on a linear report. Absent means the viewer's
5025
+ default.
5026
+ startingGivens:
5027
+ allOf:
5028
+ - $ref: "#/components/schemas/EncodedGivenValues"
5029
+ description: >-
5030
+ Starting values for controls, from the artifact tag. URL
5031
+ parameters override these.
5032
+ autorun:
5033
+ type: boolean
5034
+ description: >-
5035
+ False batches control changes behind an Apply button instead of
5036
+ re-running on every change. Defaults to true.
5037
+ givens:
5038
+ type: array
5039
+ description: >-
5040
+ The control row: one entry per given the report's tiles run with
5041
+ (less a given only a source's gate reads, which a host injects),
5042
+ widened to every given the entry file surfaces when a tile cannot be
5043
+ resolved (see `ReportTile.givenNames`). `default` is the value the
5044
+ query endpoint takes, not the Malloy literal: a `filter<…>` given
5045
+ declared `f'West'` publishes `West`.
5046
+ items:
5047
+ $ref: "#/components/schemas/Given"
5048
+ notebook:
5049
+ allOf:
5050
+ - $ref: "#/components/schemas/ReportCells"
5051
+ description: >-
5052
+ For a linear report written as `run:` cells, or a `.malloynb`: its
5053
+ cells and model. Run a `.malloy`
5054
+ report's cell through the model query endpoint, its `text` as
5055
+ `query`; a `.malloynb`'s with execute-notebook-cell. Absent on a
5056
+ report written as tiles, and on a
5057
+ report that failed to compile.
5058
+
5059
+ ReportTile:
5060
+ type: object
5061
+ description: >-
5062
+ One tile of a report. A `query` tile (the default) runs a query; a
5063
+ `text` tile shows markdown and runs nothing, so a caller that runs a
5064
+ report's tiles skips the ones with `kind` `text`.
5065
+ properties:
5066
+ kind:
5067
+ type: string
5068
+ enum: [query, text]
5069
+ description: >-
5070
+ `query` runs `query` through the model query endpoint; `text` shows
5071
+ `markdown`. Absent means `query`.
5072
+ name:
5073
+ type: string
5074
+ description: >-
5075
+ A text tile's name: the bare word in `tiles=[…]` and on its
5076
+ `##|(markdown) name` block. Absent on a query tile.
5077
+ markdown:
5078
+ type: string
5079
+ description: >-
5080
+ A text tile's body, the text of its `##|(markdown) name` block
5081
+ without the opener. Empty when the file has no such block. Absent on
5082
+ a query tile.
5083
+ query:
5084
+ type: string
5085
+ description: >-
5086
+ Absent on a text tile. The run expression exactly as written in `tiles=[…]`, for example
5087
+ "orders -> by_month". An EXPRESSION rather than a name, so it goes in
5088
+ the `query` field of a `POST …/models/{path}/query` body, prefixed
5089
+ with `run:`.
5090
+ restricted:
5091
+ type: boolean
5092
+ description: >-
5093
+ Set on a tile of a compiled document (`CompileResult.document`) whose
5094
+ source the caller may not read. The tile carries its `query` and
5095
+ nothing derived from the source: no `givenNames`, no layout tags.
5096
+ givenNames:
5097
+ type: array
5098
+ items:
5099
+ type: string
5100
+ description: |
5101
+ Names of the givens this tile's compiled query reads: through its
5102
+ view, its source's `where:`, a joined source's `where:`, a
5103
+ dimension or measure it uses, and its source's `#(authorize)` and
5104
+ `#(access_filter)` gates. A control not listed does not change the
5105
+ tile, which is what a viewer's "Doesn't respond to" chip says. It
5106
+ also tells a caller which tiles a changed control needs to re-run;
5107
+ running a tile with the dashboard's whole control row also works,
5108
+ because an unreferenced given is ignored. Absent when discovery
5109
+ could not resolve the tile (its expression neither compiles nor is
5110
+ a plain `source -> view` or named query the static walk reads), in
5111
+ which case send the whole control row. One such tile
5112
+ widens `ReportManifest.givens` to every given the entry file
5113
+ surfaces, rather than the union over the resolvable tiles, so that
5114
+ the row actually contains the givens that tile filters by.
5115
+ label:
5116
+ type: string
5117
+ description: >-
5118
+ Heading for the tile, from a `# label` on the view or query it names.
5119
+ Absent when it carries none, in which case a viewer derives one from
5120
+ the run expression.
5121
+ subtitle:
5122
+ type: string
5123
+ description:
5124
+ Second line under the heading, from a `# subtitle` on the view or
5125
+ query it names.
5126
+ colspan:
5127
+ type: integer
5128
+ description: >-
5129
+ Grid columns this tile spans, from a `# colspan=N` on the view or
5130
+ query it names, or from `colspan=N` on a text tile's entry in
5131
+ `tiles=[…]`. Clamped to `dashboardColumns` at render time. Absent
5132
+ means one column.
5133
+ break:
5134
+ type: boolean
5135
+ description: >-
5136
+ Start a new grid row at this tile, from a `# break` on the view or
5137
+ query it names, or from `break` on a text tile's entry in
5138
+ `tiles=[…]`. Named for the tag, so every per-tile field on this
5139
+ schema is spelled the way an author writes it. A generated client
5140
+ escapes the attribute where the word is reserved (the Python client
5141
+ exposes `break_`) while the wire key stays `break`.
5142
+ borderless:
5143
+ type: boolean
5144
+ description: >-
5145
+ Draw the result with no card around it, from a `# borderless` on the
5146
+ view or query it names. Together with `label`, `subtitle`, `colspan`
5147
+ and `break` this is the whole per-child tag set `@malloydata/render`
5148
+ resolves for a `# dashboard` nest child, read the same way here so one
5149
+ view presents identically as a tile and as a nest.
5150
+
5151
+ ReportCells:
5152
+ type: object
5153
+ description: >-
5154
+ A linear report written as cells, or a `.malloynb`: its cells, unexecuted,
5155
+ and its model.
5156
+ properties:
5157
+ type:
5158
+ type: string
5159
+ description: Always `notebook`. Distinguishes the payload from the
5160
+ compiled-model shape returned by the model endpoint.
5161
+ packageName:
5162
+ type: string
5163
+ description: Name of the package containing this notebook
5164
+ modelPath:
5165
+ type: string
5166
+ description: Relative path to the notebook file within its package directory
5167
+ format:
5168
+ type: string
5169
+ enum: ["malloynb", "malloy"]
5170
+ description:
5171
+ The file format the notebook is written in. `malloynb` is the
5172
+ cell-separated format; `malloy` is a linear `.malloy` report (see
5173
+ list-reports), wherever it lives, whose cells are
5174
+ its statements and its floating `(markdown)` notes in file order.
5175
+ malloyVersion:
5176
+ type: string
5177
+ description: Version of the Malloy compiler used to generate the notebook data
5178
+ modelInfo:
5179
+ type: string
5180
+ description: JSON string containing model metadata and structure information
5181
+ notebookCells:
5182
+ type: array
5183
+ description: Array of notebook cells containing raw markdown and code content
5184
+ items:
5185
+ $ref: "#/components/schemas/NotebookCell"
5186
+ annotations:
5187
+ type: array
5188
+ description:
5189
+ Array of file-level (##) annotations attached to the notebook. For
5190
+ a `.malloy` notebook, every own note that is not a floating
5191
+ `(markdown)` cell, in file order, each note once. A `"` or `(text)`
5192
+ note below the `## artifact` tag is dropped and not listed.
5193
+ items:
5194
+ type: string
5195
+ startingGivens:
5196
+ allOf:
5197
+ - $ref: "#/components/schemas/EncodedGivenValues"
5198
+ description:
5199
+ Starting values for the notebook's controls. A `.malloy` notebook
5200
+ declares them in its artifact tag (`## artifact { givens { … } }`),
5201
+ a `.malloynb` in its file-level tags (`## givens { … }`). URL
5202
+ parameters override these, which is why the two share a shape.
5203
+ Omitted when the notebook declares none.
5204
+ autorun:
5205
+ type: boolean
5206
+ description:
5207
+ False batches control changes behind an Apply button instead of
5208
+ re-running on every change. Defaults to true. A `.malloy` notebook
5209
+ reads it from its artifact tag (`## artifact { autorun=false }`), a
5210
+ `.malloynb` from its file-level tags (`## autorun=false`). The same
5211
+ flag, with the same default, that `DashboardManifest.autorun`
5212
+ carries.
5213
+ sources:
5214
+ type: array
5215
+ description: Sources defined in the notebook's model
5216
+ items:
5217
+ $ref: "#/components/schemas/Source"
5218
+ queries:
5219
+ type: array
5220
+ description: Named queries defined in the notebook's model
5221
+ items:
5222
+ $ref: "#/components/schemas/Query"
5223
+
5224
+ DataApp:
4174
5225
  type: object
4175
- description: Malloy model metadata and status information
5226
+ description:
5227
+ An in-package HTML data app within a Malloy package - a static page
5228
+ served from the package's public/ directory
4176
5229
  properties:
4177
5230
  resource:
4178
5231
  type: string
4179
- description: Resource path to the model
5232
+ description:
5233
+ Canonical URL to the served data app. Root-relative and does
5234
+ NOT carry the /api/v0 prefix, because a data app is a static asset
5235
+ served off the server root rather than an API resource.
4180
5236
  packageName:
4181
5237
  type: string
4182
- description: Name of the package containing this model
5238
+ description: Name of the package containing this data app
4183
5239
  path:
4184
5240
  type: string
4185
- description: Relative path to the model file within its package directory
4186
- isHidden:
4187
- type: boolean
4188
- description: |
4189
- True for a file this route lists only because the request set
4190
- `includeHiddenFilesAndSources`: a file the package's `index.malloy` (or a
4191
- legacy `explores`) does not expose. False for every other file, so every
4192
- entry is false without that option. It says whether the file is hidden, not
4193
- whether a query can reach it: under `queryableSources: "all"` a hidden file
4194
- can still be queried.
4195
- error:
5241
+ description: Relative path to the HTML file within its package directory
5242
+ title:
4196
5243
  type: string
4197
- description: Error message if the model failed to compile or load
5244
+ description:
5245
+ Title extracted from the file's <title> tag, or the path if
5246
+ not present
5247
+ fit:
5248
+ type: string
5249
+ enum:
5250
+ - viewport
5251
+ description:
5252
+ Layout hint read from a <meta name="publisher:fit"> tag in the
5253
+ page <head>. "viewport" tells the embedded viewer to fill the
5254
+ available height instead of auto-sizing to the content height, for
5255
+ full-screen apps like slide decks. Omitted for an ordinary
5256
+ content-driven app, which keeps content-height auto-sizing.
5257
+
5258
+ # ── DEPRECATED ────────────────────────────────────────────────────────
5259
+ # The shapes of the deprecated `…/dashboards*` and `…/notebooks*` routes.
5260
+ # No report schema references them; each removal deletes its block here.
4198
5261
 
4199
5262
  Notebook:
4200
5263
  type: object
4201
- description: Malloy notebook metadata and status information
5264
+ deprecated: true
5265
+ description: DEPRECATED, use `Report`. A linear report as the deprecated
5266
+ list-notebooks route lists it.
4202
5267
  properties:
4203
5268
  environmentName:
4204
5269
  type: string
@@ -4230,10 +5295,10 @@ components:
4230
5295
 
4231
5296
  Dashboard:
4232
5297
  type: object
5298
+ deprecated: true
4233
5299
  description: |
4234
- A dashboard within a Malloy package: a self-contained `.malloy` file at
4235
- the top of the package's `dashboards/` or `notebooks/` directory carrying an `# artifact` (or
4236
- model-level `## artifact`) annotation. The list entry; see
5300
+ DEPRECATED: use `Report`. A grid report (see list-reports), as the
5301
+ deprecated list-dashboards route lists it. The list entry; see
4237
5302
  DashboardManifest for the detail a viewer needs to render one.
4238
5303
  properties:
4239
5304
  resource:
@@ -4244,14 +5309,17 @@ components:
4244
5309
  description: Name of the package containing this dashboard
4245
5310
  name:
4246
5311
  type: string
4247
- description:
4248
- The dashboard's slug — its filename basename. Addresses it in a URL
4249
- and as a `# drill` target.
5312
+ description: >-
5313
+ The report's filename basename: a display label, and the segment of
5314
+ the deprecated get-dashboard URL. Not an identity: two reports may
5315
+ share it. A change since reports: it used to be unique within the
5316
+ package (every dashboard was directly under `dashboards/`), and a
5317
+ client that keyed a map on it must key on `path` instead.
4250
5318
  path:
4251
5319
  type: string
4252
5320
  description:
4253
- Relative path to the dashboard file within its package directory
4254
- (`dashboards/<name>.malloy`)
5321
+ Relative path to the report file within its package directory,
5322
+ which is its identity
4255
5323
  title:
4256
5324
  type: string
4257
5325
  description:
@@ -4269,7 +5337,9 @@ components:
4269
5337
 
4270
5338
  DashboardManifest:
4271
5339
  type: object
5340
+ deprecated: true
4272
5341
  description: |
5342
+ DEPRECATED: use `ReportManifest`.
4273
5343
  Everything a viewer needs to render one dashboard: the artifact tag's
4274
5344
  declarations plus the control contract derived from the givens its query
4275
5345
  references. Running needs no dashboard-specific endpoint — the query,
@@ -4284,14 +5354,17 @@ components:
4284
5354
  description: Name of the package containing this dashboard
4285
5355
  name:
4286
5356
  type: string
4287
- description:
4288
- The dashboard's slug — its filename basename. Addresses it in a URL
4289
- and as a `# drill` target.
5357
+ description: >-
5358
+ The report's filename basename: a display label, and the segment of
5359
+ the deprecated get-dashboard URL. Not an identity: two reports may
5360
+ share it. A change since reports: it used to be unique within the
5361
+ package (every dashboard was directly under `dashboards/`), and a
5362
+ client that keyed a map on it must key on `path` instead.
4290
5363
  path:
4291
5364
  type: string
4292
5365
  description: |
4293
- Relative path to the dashboard file within its package directory
4294
- (`dashboards/<name>.malloy`). This is also the model to POST to:
5366
+ Relative path to the report file within its package directory,
5367
+ which is its identity. This is also the model to POST to:
4295
5368
  `query`, each tile, and each control's suggest query all run through
4296
5369
  `POST /environments/{environmentName}/packages/{packageName}/models/{path}/query`
4297
5370
  with `givens`, which is why there is no dashboard-specific run
@@ -4310,32 +5383,27 @@ components:
4310
5383
  error:
4311
5384
  type: string
4312
5385
  description: Error message if the dashboard file failed to compile
4313
- kind:
5386
+ layout:
4314
5387
  type: string
4315
- enum: [dashboard, notebook]
5388
+ enum: [grid, linear]
4316
5389
  description: >-
4317
- What the document is, from the `kind` property of its artifact tag
4318
- (the folder only decides the default when the tag says nothing). A
4319
- `notebook` is laid out as one column: `dashboardColumns` is 1
4320
- whatever the file says. Always `dashboard` on
4321
- `GET …/dashboards/{dashboardName}`; a notebook's manifest is the
4322
- `dashboard` field of `GET …/notebooks/{path}`.
4323
- query:
5390
+ The report's layout (see list-reports). A `linear` report is laid
5391
+ out as one column: `dashboardColumns` is 1 whatever the file says.
5392
+ kind:
4324
5393
  type: string
5394
+ enum: [dashboard, notebook]
5395
+ deprecated: true
4325
5396
  description: >-
4326
- Name of the tagged query whose single result IS the page. Set when the
4327
- `# artifact` tag sits on a `query:`; a dashboard authored the ordinary
4328
- way carries `tiles` instead and leaves this absent. A NAME rather than
4329
- an expression, so it goes in the `queryName` field of a
4330
- `POST …/models/{path}/query` body. A tile's `query` is the other shape
4331
- and is not interchangeable with this one; see `DashboardTile.query`.
5397
+ DEPRECATED: read `layout`. The same thing in the old vocabulary:
5398
+ `dashboard` for a grid report, `notebook` for a linear one. Always
5399
+ `dashboard` on `GET …/dashboards/{dashboardName}`; a linear
5400
+ report's manifest is the `dashboard` field of
5401
+ `GET …/notebooks/{path}`.
4332
5402
  tiles:
4333
5403
  type: array
4334
5404
  description: >-
4335
5405
  The dashboard's tiles, each run as its own query and combined into one
4336
- grid. This is how a dashboard is normally authored, and the only form
4337
- that can span sources. Absent when the `# artifact` tag sits on a
4338
- `query:` instead, in which case `query` is set.
5406
+ grid. Absent on a dashboard listed with its compile `error`.
4339
5407
  items:
4340
5408
  $ref: "#/components/schemas/DashboardTile"
4341
5409
  dashboardColumns:
@@ -4391,213 +5459,32 @@ components:
4391
5459
  $ref: "#/components/schemas/Given"
4392
5460
 
4393
5461
  DashboardTile:
4394
- type: object
5462
+ deprecated: true
4395
5463
  description: >-
4396
- One tile of a dashboard. A `query` tile (the default) runs a query; a
4397
- `text` tile shows markdown and runs nothing, so a caller that runs a
4398
- dashboard's tiles skips the ones with `kind` `text`.
4399
- properties:
4400
- kind:
4401
- type: string
4402
- enum: [query, text]
4403
- description: >-
4404
- `query` runs `query` through the model query endpoint; `text` shows
4405
- `markdown`. Absent means `query`.
4406
- name:
4407
- type: string
4408
- description: >-
4409
- A text tile's name: the bare word in `tiles=[…]` and on its
4410
- `##|(markdown) name` block. Absent on a query tile.
4411
- markdown:
4412
- type: string
4413
- description: >-
4414
- A text tile's body, the text of its `##|(markdown) name` block
4415
- without the opener. Empty when the file has no such block. Absent on
4416
- a query tile.
4417
- query:
4418
- type: string
4419
- description: >-
4420
- Absent on a text tile. The run expression exactly as written in `tiles=[…]`, for example
4421
- "orders -> by_month". An EXPRESSION rather than a name, so it goes in
4422
- the `query` field of a `POST …/models/{path}/query` body, prefixed
4423
- with `run:`. Sending it in `queryName`, the field
4424
- `DashboardManifest.query` takes, is rejected.
4425
- restricted:
4426
- type: boolean
4427
- description: >-
4428
- Set on a tile of a compiled document (`CompileResult.document`) whose
4429
- source the caller may not read. The tile carries its `query` and
4430
- nothing derived from the source: no `givenNames`, no layout tags.
4431
- givenNames:
4432
- type: array
4433
- items:
4434
- type: string
4435
- description: |
4436
- Names of the givens this tile's compiled query reads: through its
4437
- view, its source's `where:`, a joined source's `where:`, a
4438
- dimension or measure it uses, and its source's `#(authorize)` and
4439
- `#(access_filter)` gates. A control not listed does not change the
4440
- tile, which is what a viewer's "Doesn't respond to" chip says. It
4441
- also tells a caller which tiles a changed control needs to re-run;
4442
- running a tile with the dashboard's whole control row also works,
4443
- because an unreferenced given is ignored. Absent when discovery
4444
- could not resolve the tile (its expression neither compiles nor is
4445
- a plain `source -> view` or named query the static walk reads), in
4446
- which case send the whole control row. One such tile
4447
- widens `DashboardManifest.givens` to every given the entry file
4448
- surfaces, rather than the union over the resolvable tiles, so that
4449
- the row actually contains the givens that tile filters by.
4450
- label:
4451
- type: string
4452
- description: >-
4453
- Heading for the tile, from a `# label` on the view or query it names.
4454
- Absent when it carries none, in which case a viewer derives one from
4455
- the run expression.
4456
- subtitle:
4457
- type: string
4458
- description:
4459
- Second line under the heading, from a `# subtitle` on the view or
4460
- query it names.
4461
- colspan:
4462
- type: integer
4463
- description: >-
4464
- Grid columns this tile spans, from a `# colspan=N` on the view or
4465
- query it names, or from `colspan=N` on a text tile's entry in
4466
- `tiles=[…]`. Clamped to `dashboardColumns` at render time. Absent
4467
- means one column.
4468
- break:
4469
- type: boolean
4470
- description: >-
4471
- Start a new grid row at this tile, from a `# break` on the view or
4472
- query it names, or from `break` on a text tile's entry in
4473
- `tiles=[…]`. Named for the tag, so every per-tile field on this
4474
- schema is spelled the way an author writes it. A generated client
4475
- escapes the attribute where the word is reserved (the Python client
4476
- exposes `break_`) while the wire key stays `break`.
4477
- borderless:
4478
- type: boolean
4479
- description: >-
4480
- Draw the result with no card around it, from a `# borderless` on the
4481
- view or query it names. Together with `label`, `subtitle`, `colspan`
4482
- and `break` this is the whole per-child tag set `@malloydata/render`
4483
- resolves for a `# dashboard` nest child, read the same way here so one
4484
- view presents identically as a tile and as a nest.
4485
-
4486
- DataApp:
4487
- type: object
4488
- description:
4489
- An in-package HTML data app within a Malloy package - a static page
4490
- served from the package's public/ directory
4491
- properties:
4492
- resource:
4493
- type: string
4494
- description:
4495
- Canonical URL to the served data app. Root-relative and does
4496
- NOT carry the /api/v0 prefix, because a data app is a static asset
4497
- served off the server root rather than an API resource.
4498
- packageName:
4499
- type: string
4500
- description: Name of the package containing this data app
4501
- path:
4502
- type: string
4503
- description: Relative path to the HTML file within its package directory
4504
- title:
4505
- type: string
4506
- description:
4507
- Title extracted from the file's <title> tag, or the path if
4508
- not present
4509
- fit:
4510
- type: string
4511
- enum:
4512
- - viewport
4513
- description:
4514
- Layout hint read from a <meta name="publisher:fit"> tag in the
4515
- page <head>. "viewport" tells the embedded viewer to fill the
4516
- available height instead of auto-sizing to the content height, for
4517
- full-screen apps like slide decks. Omitted for an ordinary
4518
- content-driven app, which keeps content-height auto-sizing.
5464
+ DEPRECATED: `ReportTile`, under the name the deprecated dashboard
5465
+ routes gave it.
5466
+ allOf:
5467
+ - $ref: "#/components/schemas/ReportTile"
4519
5468
 
4520
5469
  RawNotebook:
4521
- type: object
4522
- description: Raw Malloy notebook with unexecuted cell contents
4523
- properties:
4524
- type:
4525
- type: string
4526
- description: Always `notebook`. Distinguishes the payload from the
4527
- compiled-model shape returned by the model endpoint.
4528
- packageName:
4529
- type: string
4530
- description: Name of the package containing this notebook
4531
- modelPath:
4532
- type: string
4533
- description: Relative path to the notebook file within its package directory
4534
- format:
4535
- type: string
4536
- enum: ["malloynb", "malloy"]
4537
- description:
4538
- The file format the notebook is written in. `malloynb` is the
4539
- cell-separated format; `malloy` is a `.malloy` at the top of `notebooks/` or
4540
- `dashboards/` whose model-level `## artifact` tag says `kind=notebook` (or names no
4541
- `kind` and sits under `notebooks/`), whose cells are
4542
- its statements and its floating `(markdown)` notes in file order.
4543
- malloyVersion:
4544
- type: string
4545
- description: Version of the Malloy compiler used to generate the notebook data
4546
- modelInfo:
4547
- type: string
4548
- description: JSON string containing model metadata and structure information
4549
- notebookCells:
4550
- type: array
4551
- description: Array of notebook cells containing raw markdown and code content
4552
- items:
4553
- $ref: "#/components/schemas/NotebookCell"
4554
- dashboard:
4555
- allOf:
4556
- - $ref: "#/components/schemas/DashboardManifest"
4557
- description: >-
4558
- The tile layout of a notebook written as one (`## artifact {
4559
- kind=notebook tiles=[…] }`), in the shape a dashboard has, with
4560
- `kind` `notebook` and one column. Absent on a notebook written as
4561
- cells. Its tiles run through the model query endpoint at
4562
- `modelPath`; `notebookCells` carries the same content as cells for
4563
- readers that do not draw a layout.
4564
- annotations:
4565
- type: array
4566
- description:
4567
- Array of file-level (##) annotations attached to the notebook. For
4568
- a `.malloy` notebook, every own note that is not a floating
4569
- `(markdown)` cell, in file order, each note once. A `"` or `(text)`
4570
- note below the `## artifact` tag is dropped and not listed.
4571
- items:
4572
- type: string
4573
- startingGivens:
4574
- allOf:
4575
- - $ref: "#/components/schemas/EncodedGivenValues"
4576
- description:
4577
- Starting values for the notebook's controls. A `.malloy` notebook
4578
- declares them in its artifact tag (`## artifact { givens { … } }`),
4579
- a `.malloynb` in its file-level tags (`## givens { … }`). URL
4580
- parameters override these, which is why the two share a shape.
4581
- Omitted when the notebook declares none.
4582
- autorun:
4583
- type: boolean
4584
- description:
4585
- False batches control changes behind an Apply button instead of
4586
- re-running on every change. Defaults to true. A `.malloy` notebook
4587
- reads it from its artifact tag (`## artifact { autorun=false }`), a
4588
- `.malloynb` from its file-level tags (`## autorun=false`). The same
4589
- flag, with the same default, that `DashboardManifest.autorun`
4590
- carries.
4591
- sources:
4592
- type: array
4593
- description: Sources defined in the notebook's model
4594
- items:
4595
- $ref: "#/components/schemas/Source"
4596
- queries:
4597
- type: array
4598
- description: Named queries defined in the notebook's model
4599
- items:
4600
- $ref: "#/components/schemas/Query"
5470
+ deprecated: true
5471
+ description: >-
5472
+ DEPRECATED: `ReportCells`, as get-notebook answers them, plus the tile
5473
+ layout of a linear report written as tiles.
5474
+ allOf:
5475
+ - $ref: "#/components/schemas/ReportCells"
5476
+ - type: object
5477
+ properties:
5478
+ dashboard:
5479
+ allOf:
5480
+ - $ref: "#/components/schemas/DashboardManifest"
5481
+ description: >-
5482
+ The tile layout of a linear report written as one (`## artifact {
5483
+ layout=linear tiles=[…] }`), in the shape a dashboard has, with
5484
+ `layout` `linear` and one column. Absent on a notebook written as
5485
+ cells. Its tiles run through the model query endpoint at
5486
+ `modelPath`; `notebookCells` carries the same content as cells for
5487
+ readers that do not draw a layout.
4601
5488
 
4602
5489
  CompiledModel:
4603
5490
  type: object
@@ -5792,8 +6679,7 @@ components:
5792
6679
  type: integer
5793
6680
  minimum: 1
5794
6681
  maximum: 2147483647
5795
- description:
5796
- Maximum run time of each statement on the database, in
6682
+ description: Maximum run time of each statement on the database, in
5797
6683
  milliseconds. The database cancels a statement that exceeds it.
5798
6684
  When omitted, the database's own statement_timeout applies. Not
5799
6685
  applied to a DuckLake catalog connection.
@@ -5999,6 +6885,7 @@ components:
5999
6885
  required:
6000
6886
  - storage
6001
6887
  - catalog
6888
+
6002
6889
  BigqueryConnection:
6003
6890
  type: object
6004
6891
  description: Google BigQuery database connection configuration
@@ -6216,6 +7103,7 @@ components:
6216
7103
  azureConnection:
6217
7104
  $ref: "#/components/schemas/AzureConnection"
6218
7105
  # TODO: What is this? Can we remove it?
7106
+
6219
7107
  SqlSource:
6220
7108
  type: object
6221
7109
  properties:
@@ -6538,13 +7426,20 @@ components:
6538
7426
  serves once saved. Present only when the source carries a model-level
6539
7427
  `## artifact` tag and compiled far enough to read.
6540
7428
  properties:
7429
+ layout:
7430
+ type: string
7431
+ enum: [grid, linear]
7432
+ description: >-
7433
+ The report's layout, by the one rule every report follows: the
7434
+ tag's `layout=`, else grid when it lists `tiles` or carries a
7435
+ `dashboard { … }` grid tag, else linear.
6541
7436
  kind:
6542
7437
  type: string
6543
7438
  enum: [dashboard, notebook]
7439
+ deprecated: true
6544
7440
  description: >-
6545
- From the tag's `kind`. When it names none, a document that lists
6546
- `tiles` or carries a `dashboard { … }` grid tag is a dashboard and
6547
- any other is a notebook: submitted text has no folder to decide.
7441
+ DEPRECATED: read `layout`. The same thing in the old vocabulary:
7442
+ `dashboard` for grid, `notebook` for linear.
6548
7443
  manifest:
6549
7444
  allOf:
6550
7445
  - $ref: "#/components/schemas/DashboardManifest"
@@ -6932,6 +7827,7 @@ components:
6932
7827
  The given names this term reads, in first-seen order. A reader must
6933
7828
  bind these for the term to apply; binding none applies each given's
6934
7829
  declared default, as a live query would.
7830
+
6935
7831
  JoinedTerms:
6936
7832
  type: object
6937
7833
  required: [alias, source, terms]
@@ -6954,6 +7850,7 @@ components:
6954
7850
  description: >-
6955
7851
  The joined source's own stripped terms, which its binding re-applies
6956
7852
  with the caller's values.
7853
+
6957
7854
  PersistSourcePlan:
6958
7855
  type: object
6959
7856
  required: [name, sourceID, connectionName, sourceEntityId, sql, columns]