@malloy-publisher/app 0.0.204 → 0.0.206

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.
package/dist/api-doc.yaml CHANGED
@@ -38,26 +38,29 @@ tags:
38
38
  - name: publisher
39
39
  description: Publisher status and health check operations
40
40
  - name: environments
41
- description: Environment lifecycle management including creation, configuration,
41
+ description:
42
+ Environment lifecycle management including creation, configuration,
42
43
  and deletion of data modeling environments
43
44
  - name: connections
44
- description: Database connection management for secure data source configuration
45
+ description:
46
+ Database connection management for secure data source configuration
45
47
  and access
46
48
  - name: packages
47
- description: Package management for Malloy data models, including versioning and
49
+ description:
50
+ Package management for Malloy data models, including versioning and
48
51
  distribution
49
52
  - name: models
50
53
  description: Malloy model access and compilation operations
51
54
  - name: notebooks
52
55
  description: Malloy notebook access and execution operations
56
+ - name: pages
57
+ description: Static HTML pages (in-package data apps)
53
58
  - name: databases
54
59
  description: Embedded database management and access
55
60
  - name: watch-mode
56
61
  description: Real-time file watching for development workflows
57
62
  - name: materializations
58
63
  description: Package-level materializations for persisting Malloy sources
59
- - name: manifests
60
- description: Build manifest management for tracking materialized source tables
61
64
 
62
65
  paths:
63
66
  /status:
@@ -618,55 +621,7 @@ paths:
618
621
  "503":
619
622
  $ref: "#/components/responses/ServiceUnavailable"
620
623
 
621
- # TODO: Remove this endpoint.
622
624
  /environments/{environmentName}/connections/{connectionName}/sqlSource:
623
- get:
624
- tags:
625
- - connections
626
- operationId: get-sqlsource
627
- deprecated: true
628
- summary: Get SQL source (deprecated)
629
- description: |
630
- **DEPRECATED**: This endpoint is deprecated and may be removed in future versions.
631
- Use the POST version instead for better security and functionality.
632
-
633
- Creates a Malloy source from a SQL statement using the specified connection.
634
- The SQL statement is executed to generate a source definition that can be used in Malloy models.
635
- parameters:
636
- - name: environmentName
637
- in: path
638
- description: Name of the environment
639
- required: true
640
- schema:
641
- $ref: "#/components/schemas/IdentifierPattern"
642
- - name: connectionName
643
- in: path
644
- description: Name of the connection
645
- required: true
646
- schema:
647
- $ref: "#/components/schemas/IdentifierPattern"
648
- - name: sqlStatement
649
- in: query
650
- description: SQL statement
651
- required: false
652
- schema:
653
- type: string
654
- responses:
655
- "200":
656
- description: SQL source information
657
- content:
658
- application/json:
659
- schema:
660
- $ref: "#/components/schemas/SqlSource"
661
- "401":
662
- $ref: "#/components/responses/Unauthorized"
663
- "404":
664
- $ref: "#/components/responses/NotFound"
665
- "500":
666
- $ref: "#/components/responses/InternalServerError"
667
- "503":
668
- $ref: "#/components/responses/ServiceUnavailable"
669
-
670
625
  post:
671
626
  tags:
672
627
  - connections
@@ -743,13 +698,6 @@ paths:
743
698
  required: true
744
699
  schema:
745
700
  $ref: "#/components/schemas/IdentifierPattern"
746
- - name: options
747
- in: query
748
- description: Options (deprecated; pass in body instead)
749
- deprecated: true
750
- required: false
751
- schema:
752
- type: string
753
701
  requestBody:
754
702
  description: SQL statement to execute
755
703
  required: true
@@ -831,55 +779,6 @@ paths:
831
779
  "503":
832
780
  $ref: "#/components/responses/ServiceUnavailable"
833
781
 
834
- # TODO: Remove this endpoint.
835
- /environments/{environmentName}/connections/{connectionName}/temporaryTable:
836
- get:
837
- tags:
838
- - connections
839
- operationId: get-temporarytable
840
- deprecated: true
841
- summary: Create temporary table (deprecated)
842
- description: |
843
- **DEPRECATED**: This endpoint is deprecated and may be removed in future versions.
844
- Use the POST version instead for better security and functionality.
845
-
846
- Creates a temporary table from a SQL statement using the specified connection.
847
- Temporary tables are useful for storing intermediate results during complex queries.
848
- parameters:
849
- - name: environmentName
850
- in: path
851
- description: Name of the environment
852
- required: true
853
- schema:
854
- $ref: "#/components/schemas/IdentifierPattern"
855
- - name: connectionName
856
- in: path
857
- description: Name of the connection
858
- required: true
859
- schema:
860
- $ref: "#/components/schemas/IdentifierPattern"
861
- - name: sqlStatement
862
- in: query
863
- description: SQL statement
864
- required: false
865
- schema:
866
- type: string
867
- responses:
868
- "200":
869
- description: Temporary table information
870
- content:
871
- application/json:
872
- schema:
873
- $ref: "#/components/schemas/TemporaryTable"
874
- "401":
875
- $ref: "#/components/responses/Unauthorized"
876
- "404":
877
- $ref: "#/components/responses/NotFound"
878
- "500":
879
- $ref: "#/components/responses/InternalServerError"
880
- "503":
881
- $ref: "#/components/responses/ServiceUnavailable"
882
-
883
782
  # NOTE: The GET …/connections/{connectionName}/queryData endpoint
884
783
  # was removed alongside the operational-guards changes. Use the
885
784
  # POST …/sqlQuery endpoint above instead — it accepts the SQL in
@@ -1064,60 +963,7 @@ paths:
1064
963
  "503":
1065
964
  $ref: "#/components/responses/ServiceUnavailable"
1066
965
 
1067
- # TODO: Remove the GET (deprecated) form once clients migrate.
1068
966
  /environments/{environmentName}/packages/{packageName}/connections/{connectionName}/sqlSource:
1069
- get:
1070
- tags:
1071
- - connections
1072
- operationId: get-sqlsource-in-package
1073
- deprecated: true
1074
- summary: Get SQL source (per-package, deprecated)
1075
- description: |
1076
- **DEPRECATED**: Use the POST version instead.
1077
-
1078
- Creates a Malloy source from a SQL statement using the specified
1079
- connection, resolved in the context of the named package.
1080
- parameters:
1081
- - name: environmentName
1082
- in: path
1083
- description: Name of the environment
1084
- required: true
1085
- schema:
1086
- $ref: "#/components/schemas/IdentifierPattern"
1087
- - name: packageName
1088
- in: path
1089
- description: Name of the package whose connection context to use
1090
- required: true
1091
- schema:
1092
- $ref: "#/components/schemas/IdentifierPattern"
1093
- - name: connectionName
1094
- in: path
1095
- description: Name of the connection
1096
- required: true
1097
- schema:
1098
- $ref: "#/components/schemas/IdentifierPattern"
1099
- - name: sqlStatement
1100
- in: query
1101
- description: SQL statement
1102
- required: false
1103
- schema:
1104
- type: string
1105
- responses:
1106
- "200":
1107
- description: SQL source information
1108
- content:
1109
- application/json:
1110
- schema:
1111
- $ref: "#/components/schemas/SqlSource"
1112
- "401":
1113
- $ref: "#/components/responses/Unauthorized"
1114
- "404":
1115
- $ref: "#/components/responses/NotFound"
1116
- "500":
1117
- $ref: "#/components/responses/InternalServerError"
1118
- "503":
1119
- $ref: "#/components/responses/ServiceUnavailable"
1120
-
1121
967
  post:
1122
968
  tags:
1123
969
  - connections
@@ -1202,13 +1048,6 @@ paths:
1202
1048
  required: true
1203
1049
  schema:
1204
1050
  $ref: "#/components/schemas/IdentifierPattern"
1205
- - name: options
1206
- in: query
1207
- description: Options (deprecated; pass in body instead)
1208
- deprecated: true
1209
- required: false
1210
- schema:
1211
- type: string
1212
1051
  requestBody:
1213
1052
  description: SQL statement to execute
1214
1053
  required: true
@@ -1296,60 +1135,6 @@ paths:
1296
1135
  "503":
1297
1136
  $ref: "#/components/responses/ServiceUnavailable"
1298
1137
 
1299
- # TODO: Remove this endpoint.
1300
- /environments/{environmentName}/packages/{packageName}/connections/{connectionName}/temporaryTable:
1301
- get:
1302
- tags:
1303
- - connections
1304
- operationId: get-temporarytable-in-package
1305
- deprecated: true
1306
- summary: Create temporary table (per-package, deprecated)
1307
- description: |
1308
- **DEPRECATED**: Use the POST version instead.
1309
-
1310
- Creates a temporary table from a SQL statement using the specified
1311
- connection, resolved in the context of the named package.
1312
- parameters:
1313
- - name: environmentName
1314
- in: path
1315
- description: Name of the environment
1316
- required: true
1317
- schema:
1318
- $ref: "#/components/schemas/IdentifierPattern"
1319
- - name: packageName
1320
- in: path
1321
- description: Name of the package whose connection context to use
1322
- required: true
1323
- schema:
1324
- $ref: "#/components/schemas/IdentifierPattern"
1325
- - name: connectionName
1326
- in: path
1327
- description: Name of the connection
1328
- required: true
1329
- schema:
1330
- $ref: "#/components/schemas/IdentifierPattern"
1331
- - name: sqlStatement
1332
- in: query
1333
- description: SQL statement
1334
- required: false
1335
- schema:
1336
- type: string
1337
- responses:
1338
- "200":
1339
- description: Temporary table information
1340
- content:
1341
- application/json:
1342
- schema:
1343
- $ref: "#/components/schemas/TemporaryTable"
1344
- "401":
1345
- $ref: "#/components/responses/Unauthorized"
1346
- "404":
1347
- $ref: "#/components/responses/NotFound"
1348
- "500":
1349
- $ref: "#/components/responses/InternalServerError"
1350
- "503":
1351
- $ref: "#/components/responses/ServiceUnavailable"
1352
-
1353
1138
  # NOTE: The GET …/packages/{packageName}/connections/{connectionName}/queryData
1354
1139
  # endpoint was removed alongside the operational-guards changes.
1355
1140
  # Use the matching POST …/sqlQuery endpoint instead.
@@ -1404,16 +1189,6 @@ paths:
1404
1189
  required: true
1405
1190
  schema:
1406
1191
  $ref: "#/components/schemas/IdentifierPattern"
1407
- - name: autoLoadManifest
1408
- in: query
1409
- description: |
1410
- When true, automatically loads any existing build manifest
1411
- for the package so materialized table references resolve immediately.
1412
- Defaults to false.
1413
- required: false
1414
- schema:
1415
- type: boolean
1416
- default: false
1417
1192
  requestBody:
1418
1193
  required: true
1419
1194
  content:
@@ -1427,6 +1202,8 @@ paths:
1427
1202
  application/json:
1428
1203
  schema:
1429
1204
  $ref: "#/components/schemas/Package"
1205
+ "400":
1206
+ $ref: "#/components/responses/BadRequest"
1430
1207
  "401":
1431
1208
  $ref: "#/components/responses/Unauthorized"
1432
1209
  "500":
@@ -1524,6 +1301,8 @@ paths:
1524
1301
  application/json:
1525
1302
  schema:
1526
1303
  $ref: "#/components/schemas/Package"
1304
+ "400":
1305
+ $ref: "#/components/responses/BadRequest"
1527
1306
  "401":
1528
1307
  $ref: "#/components/responses/Unauthorized"
1529
1308
  "404":
@@ -1763,7 +1542,8 @@ paths:
1763
1542
  type: string
1764
1543
  - name: path
1765
1544
  in: path
1766
- description: Path to the model within the package (used to resolve relative
1545
+ description:
1546
+ Path to the model within the package (used to resolve relative
1767
1547
  imports)
1768
1548
  required: true
1769
1549
  schema:
@@ -2035,6 +1815,110 @@ paths:
2035
1815
  "503":
2036
1816
  $ref: "#/components/responses/ServiceUnavailable"
2037
1817
 
1818
+ /environments/{environmentName}/packages/{packageName}/pages:
1819
+ get:
1820
+ tags:
1821
+ - pages
1822
+ operationId: list-pages
1823
+ summary: List package pages
1824
+ description: |
1825
+ Retrieves a list of all static HTML pages (in-package data apps) within
1826
+ the specified package. Each page entry includes the relative path, the
1827
+ package name, a canonical resource URL, and the page title (extracted
1828
+ from the file's <title> tag, falling back to the path). Used by the
1829
+ Publisher SPA to surface a clickable "Pages" section on the package
1830
+ detail view, and by anyone who wants to discover in-package data apps
1831
+ programmatically without scraping the directory. Recursive depth is
1832
+ capped server-side to keep this cheap on large packages.
1833
+ parameters:
1834
+ - name: environmentName
1835
+ in: path
1836
+ description: Name of the environment
1837
+ required: true
1838
+ schema:
1839
+ $ref: "#/components/schemas/IdentifierPattern"
1840
+ - name: packageName
1841
+ in: path
1842
+ description: Name of the package
1843
+ required: true
1844
+ schema:
1845
+ $ref: "#/components/schemas/IdentifierPattern"
1846
+ responses:
1847
+ "200":
1848
+ description: A list of pages in the package
1849
+ content:
1850
+ application/json:
1851
+ schema:
1852
+ type: array
1853
+ items:
1854
+ $ref: "#/components/schemas/Page"
1855
+ "400":
1856
+ $ref: "#/components/responses/BadRequest"
1857
+ "401":
1858
+ $ref: "#/components/responses/Unauthorized"
1859
+ "404":
1860
+ $ref: "#/components/responses/NotFound"
1861
+ "500":
1862
+ $ref: "#/components/responses/InternalServerError"
1863
+ "501":
1864
+ $ref: "#/components/responses/NotImplemented"
1865
+ "503":
1866
+ $ref: "#/components/responses/ServiceUnavailable"
1867
+
1868
+ /environments/{environmentName}/packages/{packageName}/events:
1869
+ get:
1870
+ tags:
1871
+ - watch-mode
1872
+ operationId: stream-package-events
1873
+ summary: Stream package change events (SSE)
1874
+ description: |
1875
+ Opens a Server-Sent Events (SSE) stream of file-change events for the
1876
+ package, used by in-package HTML data apps (via the publisher.js
1877
+ runtime) to live-reload when their sources are edited.
1878
+
1879
+ This is a long-lived `text/event-stream` connection, not a JSON
1880
+ endpoint, and is therefore not surfaced through the generated API
1881
+ clients — consume it with an `EventSource`. The stream emits:
1882
+ - `event: hello` (`data: connected`) once on connect.
1883
+ - `event: mode` (`data: enabled|disabled`) reporting whether watch
1884
+ mode is currently active for the environment. When `disabled`, no
1885
+ `changed` events will follow until watch mode is started.
1886
+ - `event: changed` (`data: changed`) each time a watched file in the
1887
+ package changes.
1888
+ - periodic `: heartbeat` comments to keep idle proxies from closing
1889
+ the connection.
1890
+ parameters:
1891
+ - name: environmentName
1892
+ in: path
1893
+ description: Name of the environment
1894
+ required: true
1895
+ schema:
1896
+ $ref: "#/components/schemas/IdentifierPattern"
1897
+ - name: packageName
1898
+ in: path
1899
+ description: Name of the package
1900
+ required: true
1901
+ schema:
1902
+ $ref: "#/components/schemas/IdentifierPattern"
1903
+ responses:
1904
+ "200":
1905
+ description: An open Server-Sent Events stream of change events
1906
+ content:
1907
+ text/event-stream:
1908
+ schema:
1909
+ type: string
1910
+ description: SSE event stream (see endpoint description for event types)
1911
+ "400":
1912
+ $ref: "#/components/responses/BadRequest"
1913
+ "401":
1914
+ $ref: "#/components/responses/Unauthorized"
1915
+ "404":
1916
+ $ref: "#/components/responses/NotFound"
1917
+ "500":
1918
+ $ref: "#/components/responses/InternalServerError"
1919
+ "503":
1920
+ $ref: "#/components/responses/ServiceUnavailable"
1921
+
2038
1922
  /connections/test:
2039
1923
  post:
2040
1924
  tags:
@@ -2145,10 +2029,13 @@ paths:
2145
2029
  tags:
2146
2030
  - materializations
2147
2031
  operationId: create-materialization
2148
- summary: Create a materialization
2032
+ summary: Create a materialization (Round 1)
2149
2033
  description: |
2150
- Creates a new materialization in PENDING state for all persist sources across all
2151
- models in the package. Use POST .../materializations/{materializationId}?action=start to begin execution.
2034
+ Starts Round 1 of the two-round build protocol: asynchronously compiles the package,
2035
+ computes a build plan (per-source buildId, output columns, dependency/column lineage,
2036
+ connection capability), and pauses at BUILD_PLAN_READY without writing any tables.
2037
+ The control plane then issues Round 2 via
2038
+ POST .../materializations/{materializationId}?action=build with build instructions.
2152
2039
  parameters:
2153
2040
  - $ref: "#/components/parameters/environmentName"
2154
2041
  - $ref: "#/components/parameters/packageName"
@@ -2177,7 +2064,8 @@ paths:
2177
2064
  - materializations
2178
2065
  operationId: list-materializations
2179
2066
  summary: List materializations for a package
2180
- description: Returns the materialization history for the package, ordered by
2067
+ description:
2068
+ Returns the materialization history for the package, ordered by
2181
2069
  most recent first.
2182
2070
  parameters:
2183
2071
  - $ref: "#/components/parameters/environmentName"
@@ -2235,8 +2123,11 @@ paths:
2235
2123
  description: |
2236
2124
  Performs an action on a materialization. The action is specified via
2237
2125
  the `action` query parameter:
2238
- * `start` - Transitions a PENDING materialization to RUNNING and begins execution in the background. Returns 202.
2239
- * `stop` - Cancels a PENDING or RUNNING materialization. Returns 200.
2126
+ * `build` - Round 2. Provide BuildInstructions (CP-assigned table id, physical
2127
+ table name, and realization per source). Builds only the instructed sources into
2128
+ the exact names provided and assembles the manifest. Valid only when the
2129
+ materialization is at BUILD_PLAN_READY. Returns 202.
2130
+ * `stop` - Cancels a PENDING, BUILD_PLAN_READY, or building materialization. Returns 200.
2240
2131
  parameters:
2241
2132
  - $ref: "#/components/parameters/environmentName"
2242
2133
  - $ref: "#/components/parameters/packageName"
@@ -2247,9 +2138,15 @@ paths:
2247
2138
  schema:
2248
2139
  type: string
2249
2140
  enum:
2250
- - start
2141
+ - build
2251
2142
  - stop
2252
2143
  description: Action to perform on the materialization
2144
+ requestBody:
2145
+ required: false
2146
+ content:
2147
+ application/json:
2148
+ schema:
2149
+ $ref: "#/components/schemas/BuildInstructions"
2253
2150
  responses:
2254
2151
  "200":
2255
2152
  description: Materialization cancelled (action=stop)
@@ -2258,7 +2155,7 @@ paths:
2258
2155
  schema:
2259
2156
  $ref: "#/components/schemas/Materialization"
2260
2157
  "202":
2261
- description: Materialization started (action=start)
2158
+ description: Round 2 build accepted (action=build)
2262
2159
  content:
2263
2160
  application/json:
2264
2161
  schema:
@@ -2278,86 +2175,43 @@ paths:
2278
2175
  - materializations
2279
2176
  operationId: delete-materialization
2280
2177
  summary: Delete a materialization
2281
- description: Deletes a terminal (SUCCESS, FAILED, or CANCELLED) materialization
2282
- record.
2178
+ description: |
2179
+ Deletes a terminal (MANIFEST_FILE_READY, FAILED, or CANCELLED)
2180
+ materialization record. By default this removes the publisher's record
2181
+ only; the control plane owns table GC. Set dropTables=true to also drop
2182
+ the physical tables this run produced (from the materialization's
2183
+ manifest) as a best-effort cleanup.
2283
2184
  parameters:
2284
2185
  - $ref: "#/components/parameters/environmentName"
2285
2186
  - $ref: "#/components/parameters/packageName"
2286
2187
  - $ref: "#/components/parameters/materializationId"
2188
+ - name: dropTables
2189
+ in: query
2190
+ required: false
2191
+ description: |
2192
+ When true, also drop the physical tables recorded in the
2193
+ materialization's manifest before deleting the record. Defaults to
2194
+ false (record-only delete; the control plane owns table GC).
2195
+ schema:
2196
+ type: boolean
2197
+ default: false
2287
2198
  responses:
2288
2199
  "204":
2289
2200
  description: Materialization deleted
2290
2201
  "404":
2291
2202
  $ref: "#/components/responses/NotFound"
2292
2203
  "409":
2293
- description: Materialization cannot be deleted (PENDING or RUNNING)
2204
+ description: Materialization cannot be deleted while it is active
2294
2205
  content:
2295
2206
  application/json:
2296
2207
  schema:
2297
2208
  $ref: "#/components/schemas/Error"
2298
2209
 
2299
- /environments/{environmentName}/packages/{packageName}/manifest:
2300
- get:
2301
- tags:
2302
- - manifests
2303
- operationId: get-manifest
2304
- summary: Get the build manifest for a package
2305
- description: |
2306
- Returns the current build manifest containing buildId-to-tableName mappings
2307
- for all materialized sources in the package.
2308
- parameters:
2309
- - $ref: "#/components/parameters/environmentName"
2310
- - $ref: "#/components/parameters/packageName"
2311
- responses:
2312
- "200":
2313
- description: Build manifest
2314
- content:
2315
- application/json:
2316
- schema:
2317
- $ref: "#/components/schemas/BuildManifest"
2318
- "404":
2319
- $ref: "#/components/responses/NotFound"
2320
- post:
2321
- tags:
2322
- - manifests
2323
- operationId: manifest-action
2324
- summary: Perform an action on the package manifest
2325
- description: |
2326
- Performs an action on the package manifest. The action is specified via
2327
- the `action` query parameter:
2328
- * `reload` - Reads the build manifest from the shared store (DuckLake
2329
- in orchestrated mode, local DuckDB in standalone mode) and recompiles
2330
- every model in the package so subsequent queries resolve persisted
2331
- sources to their materialized tables. Intended for orchestrated
2332
- workers that did not themselves run the build; the endpoint does
2333
- not write anything *into* storage.
2334
- parameters:
2335
- - $ref: "#/components/parameters/environmentName"
2336
- - $ref: "#/components/parameters/packageName"
2337
- - name: action
2338
- in: query
2339
- required: true
2340
- schema:
2341
- type: string
2342
- enum:
2343
- - reload
2344
- description: Action to perform on the manifest
2345
- responses:
2346
- "200":
2347
- description: Manifest loaded
2348
- content:
2349
- application/json:
2350
- schema:
2351
- $ref: "#/components/schemas/BuildManifest"
2352
- "400":
2353
- $ref: "#/components/responses/BadRequest"
2354
- "404":
2355
- $ref: "#/components/responses/NotFound"
2356
-
2357
2210
  components:
2358
2211
  responses:
2359
2212
  BadRequest:
2360
- description: The request was malformed or cannot be performed given the current
2213
+ description:
2214
+ The request was malformed or cannot be performed given the current
2361
2215
  state of the system
2362
2216
  content:
2363
2217
  application/json:
@@ -2480,8 +2334,9 @@ components:
2480
2334
  description: Whether the server is fully initialized and ready to serve requests
2481
2335
  operationalState:
2482
2336
  type: string
2483
- enum: [ "initializing", "serving", "draining", "throttled" ]
2484
- description: Status of the server; initializing when the server is loading
2337
+ enum: ["initializing", "serving", "draining", "throttled"]
2338
+ description:
2339
+ Status of the server; initializing when the server is loading
2485
2340
  environments, packages and connections, serving when the server is
2486
2341
  initialized and ready to serve requests, draining when the
2487
2342
  server is going to shut down, and throttled when the server has hit
@@ -2492,12 +2347,14 @@ components:
2492
2347
  Only reported when the memory governor is enabled.
2493
2348
  frozenConfig:
2494
2349
  type: boolean
2495
- description: Whether the server configuration is frozen (read-only mode). When
2350
+ description:
2351
+ Whether the server configuration is frozen (read-only mode). When
2496
2352
  true, all mutation operations are disabled.
2497
2353
 
2498
2354
  Environment:
2499
2355
  type: object
2500
- description: Represents a Malloy environment containing packages, connections,
2356
+ description:
2357
+ Represents a Malloy environment containing packages, connections,
2501
2358
  and other resources
2502
2359
  properties:
2503
2360
  resource:
@@ -2511,7 +2368,8 @@ components:
2511
2368
  description: Environment README content
2512
2369
  location:
2513
2370
  type: string
2514
- description: Environment location, can be an absolute path or URI (e.g. github,
2371
+ description:
2372
+ Environment location, can be an absolute path or URI (e.g. github,
2515
2373
  s3, gcs, etc.)
2516
2374
  connections:
2517
2375
  type: array
@@ -2523,19 +2381,6 @@ components:
2523
2381
  description: List of Malloy packages in this environment
2524
2382
  items:
2525
2383
  $ref: "#/components/schemas/Package"
2526
- materializationStorage:
2527
- type: object
2528
- nullable: true
2529
- description: Optional DuckLake-backed storage for materialization manifests
2530
- (orchestrated mode). When set, manifests are stored in a shared
2531
- DuckLake catalog instead of the local DuckDB database.
2532
- properties:
2533
- catalogUrl:
2534
- type: string
2535
- description: PostgreSQL connection URL for the DuckLake catalog metadata store
2536
- dataPath:
2537
- type: string
2538
- description: Cloud storage path (s3:// or gs://) for DuckLake data files
2539
2384
 
2540
2385
  Package:
2541
2386
  type: object
@@ -2553,8 +2398,59 @@ components:
2553
2398
  description: Package description
2554
2399
  location:
2555
2400
  type: string
2556
- description: Package location, can be an absolute path or URI (e.g. github, s3,
2401
+ description:
2402
+ Package location, can be an absolute path or URI (e.g. github, s3,
2557
2403
  gcs, etc.)
2404
+ explores:
2405
+ type: array
2406
+ items:
2407
+ type: string
2408
+ description: >-
2409
+ Optional opt-in for curated discovery. When present, only these
2410
+ model file paths (relative to the package root) are listed via
2411
+ `listModels()`, and within-file discovery is filtered to each
2412
+ model's `export {}` closure. When absent or empty, every model is
2413
+ listed with its full source set (backward-compatible). Every other
2414
+ .malloy file still compiles for import/join resolution but is
2415
+ hidden from listings once `explores` is declared. Notebooks are
2416
+ always listed regardless of this field.
2417
+ exploresWarnings:
2418
+ type: array
2419
+ readOnly: true
2420
+ items:
2421
+ type: string
2422
+ description: >-
2423
+ Actionable messages for declared explores that do not resolve to
2424
+ a real model in this package (e.g. a misspelled path, or a notebook
2425
+ listed as an explore). Server-computed and read-only: it is
2426
+ ignored on create/update requests and only ever returned in
2427
+ responses. Present only when there are such problems. Loading is
2428
+ fail-safe — the unresolved entry simply lists nothing rather than
2429
+ exposing everything — so this is the signal that a package is
2430
+ misconfigured; publishing such a package is rejected.
2431
+ queryableSources:
2432
+ type: string
2433
+ enum:
2434
+ - declared
2435
+ - all
2436
+ description: >-
2437
+ Controls whether the discovery surface is also a query boundary.
2438
+ `"declared"` (the default) makes queryable == discoverable: when
2439
+ `explores` is declared, only `explores` model files — and within
2440
+ them only the `export {}` closure — are valid top-level query
2441
+ targets; every other source still compiles, imports, joins, and
2442
+ extends but is not directly queryable (denied with 404). `"all"`
2443
+ decouples them: `explores`/`export {}` gate discovery only and every
2444
+ compiled source stays directly queryable. When `explores` is absent
2445
+ there is no curated surface, so both modes are equivalent
2446
+ (everything queryable). Invalid values fall back to `"declared"`.
2447
+ Identity-based access is a separate concern — see `#(authorize)`.
2448
+ manifestLocation:
2449
+ type: ["string", "null"]
2450
+ description: |
2451
+ URI (gs:// or s3://) of the control-plane-computed manifest for this package.
2452
+ On (re)load the worker reads it and binds persist references
2453
+ (buildId -> physicalTableName). Null = serve live.
2558
2454
 
2559
2455
  Model:
2560
2456
  type: object
@@ -2590,6 +2486,28 @@ components:
2590
2486
  type: string
2591
2487
  description: Error message if the notebook failed to compile or load
2592
2488
 
2489
+ Page:
2490
+ type: object
2491
+ description: Static HTML page (in-package data app) within a Malloy package
2492
+ properties:
2493
+ resource:
2494
+ type: string
2495
+ description:
2496
+ Canonical URL to the served page. Root-relative and does NOT
2497
+ carry the /api/v0 prefix, because pages are static assets served off
2498
+ the server root rather than API resources.
2499
+ packageName:
2500
+ type: string
2501
+ description: Name of the package containing this page
2502
+ path:
2503
+ type: string
2504
+ description: Relative path to the HTML file within its package directory
2505
+ title:
2506
+ type: string
2507
+ description:
2508
+ Title extracted from the file's <title> tag, or the path if
2509
+ not present
2510
+
2593
2511
  RawNotebook:
2594
2512
  type: object
2595
2513
  description: Raw Malloy notebook with unexecuted cell contents
@@ -2643,7 +2561,8 @@ components:
2643
2561
  description: JSON string containing model metadata and structure information
2644
2562
  sourceInfos:
2645
2563
  type: array
2646
- description: Array of JSON strings containing source information for each data
2564
+ description:
2565
+ Array of JSON strings containing source information for each data
2647
2566
  source
2648
2567
  items:
2649
2568
  type: string
@@ -2659,7 +2578,8 @@ components:
2659
2578
  $ref: "#/components/schemas/Source"
2660
2579
  givens:
2661
2580
  type: array
2662
- description: Givens (runtime parameters) declared on this model via the
2581
+ description:
2582
+ Givens (runtime parameters) declared on this model via the
2663
2583
  `given:` keyword
2664
2584
  items:
2665
2585
  $ref: "#/components/schemas/Given"
@@ -2725,12 +2645,14 @@ components:
2725
2645
  description: Whether a value must be provided
2726
2646
  dimensionType:
2727
2647
  type: string
2728
- description: Malloy data type of the dimension (e.g. string, number, boolean,
2648
+ description:
2649
+ Malloy data type of the dimension (e.g. string, number, boolean,
2729
2650
  date, timestamp)
2730
2651
 
2731
2652
  Given:
2732
2653
  type: object
2733
- description: A given (runtime parameter) declared on a Malloy model via the
2654
+ description:
2655
+ A given (runtime parameter) declared on a Malloy model via the
2734
2656
  `given:` keyword. Surfaced on `CompiledModel.givens` and `Source.givens`
2735
2657
  so callers can introspect what runtime values a model accepts.
2736
2658
  properties:
@@ -2786,7 +2708,8 @@ components:
2786
2708
  $ref: "#/components/schemas/Filter"
2787
2709
  givens:
2788
2710
  type: array
2789
- description: Model-level givens (runtime parameters) available to queries
2711
+ description:
2712
+ Model-level givens (runtime parameters) available to queries
2790
2713
  on this source. Identical to `CompiledModel.givens`; repeated here
2791
2714
  for SDK ergonomics so consumers iterating sources can render inputs
2792
2715
  without a second lookup.
@@ -2794,12 +2717,15 @@ components:
2794
2717
  $ref: "#/components/schemas/Given"
2795
2718
  authorize:
2796
2719
  type: array
2797
- description: Effective authorize expressions declared on this source via
2720
+ description: >-
2721
+ Effective authorize expressions declared on this source via
2798
2722
  `#(authorize)` / `##(authorize)` annotations — file-level expressions
2799
2723
  first, then the source's own. Each is a Malloy boolean expression over
2800
- declared givens. Surfaced for introspection only; these expressions
2801
- are NOT yet enforced by the query path (enforcement lands in a later
2802
- release), so their presence does not currently restrict access.
2724
+ declared givens, evaluated as a disjunction (OR) and enforced at query
2725
+ time. A request that reads this source is denied with HTTP 403 unless
2726
+ at least one expression evaluates true for the supplied givens; an
2727
+ empty or absent list means unrestricted. Givens are caller-asserted, so
2728
+ this is a boundary only behind a trusted tier — see docs/authorize.md.
2803
2729
  items:
2804
2730
  type: string
2805
2731
 
@@ -2809,23 +2735,27 @@ components:
2809
2735
  properties:
2810
2736
  query:
2811
2737
  type: string
2812
- description: Query string to execute on the model. If the query parameter is
2738
+ description:
2739
+ Query string to execute on the model. If the query parameter is
2813
2740
  set, the queryName parameter must be empty.
2814
2741
  sourceName:
2815
2742
  type: string
2816
- description: Name of the source in the model to use for queryName, search, and
2743
+ description:
2744
+ Name of the source in the model to use for queryName, search, and
2817
2745
  topValue requests.
2818
2746
  queryName:
2819
2747
  type: string
2820
- description: Name of a query to execute on a source in the model. Requires the
2748
+ description:
2749
+ Name of a query to execute on a source in the model. Requires the
2821
2750
  sourceName parameter is set. If the queryName parameter is set, the
2822
2751
  query parameter must be empty.
2823
2752
  compactJson:
2824
2753
  type: boolean
2825
2754
  default: false
2826
- description: "If true, returns a simple JSON array of row objects in the form
2827
- {\"columnName\": value}. If false (default), returns the full Malloy
2828
- result with type metadata for rendering."
2755
+ description:
2756
+ 'If true, returns a simple JSON array of row objects in the form
2757
+ {"columnName": value}. If false (default), returns the full Malloy
2758
+ result with type metadata for rendering.'
2829
2759
  versionId:
2830
2760
  type: string
2831
2761
  description: Version ID
@@ -2859,20 +2789,22 @@ components:
2859
2789
  properties:
2860
2790
  type:
2861
2791
  type: string
2862
- enum: [ "markdown", "code" ]
2792
+ enum: ["markdown", "code"]
2863
2793
  description: Type of notebook cell
2864
2794
  text:
2865
2795
  type: string
2866
2796
  description: Text contents of the notebook cell (either markdown or Malloy code)
2867
2797
  newSources:
2868
2798
  type: array
2869
- description: Array of JSON strings containing SourceInfo objects made available
2799
+ description:
2800
+ Array of JSON strings containing SourceInfo objects made available
2870
2801
  in this cell
2871
2802
  items:
2872
2803
  type: string
2873
2804
  queryInfo:
2874
2805
  type: string
2875
- description: JSON string containing QueryInfo object for the query in this cell
2806
+ description:
2807
+ JSON string containing QueryInfo object for the query in this cell
2876
2808
  (if the cell contains a query)
2877
2809
 
2878
2810
  NotebookCellResult:
@@ -2881,7 +2813,7 @@ components:
2881
2813
  properties:
2882
2814
  type:
2883
2815
  type: string
2884
- enum: [ "markdown", "code" ]
2816
+ enum: ["markdown", "code"]
2885
2817
  description: Type of notebook cell
2886
2818
  text:
2887
2819
  type: string
@@ -2891,7 +2823,8 @@ components:
2891
2823
  description: JSON string containing the execution result for this cell
2892
2824
  newSources:
2893
2825
  type: array
2894
- description: Array of JSON strings containing SourceInfo objects made available
2826
+ description:
2827
+ Array of JSON strings containing SourceInfo objects made available
2895
2828
  in this cell
2896
2829
  items:
2897
2830
  type: string
@@ -2902,14 +2835,16 @@ components:
2902
2835
  properties:
2903
2836
  result:
2904
2837
  type: string
2905
- description: JSON string containing the query results, metadata, and execution
2838
+ description:
2839
+ JSON string containing the query results, metadata, and execution
2906
2840
  information
2907
2841
  resource:
2908
2842
  type: string
2909
2843
  description: Resource path to the query result
2910
2844
  renderLogs:
2911
2845
  type: array
2912
- description: Render tag validation messages (errors, warnings) detected during
2846
+ description:
2847
+ Render tag validation messages (errors, warnings) detected during
2913
2848
  query preparation
2914
2849
  items:
2915
2850
  $ref: "#/components/schemas/LogMessage"
@@ -2942,7 +2877,7 @@ components:
2942
2877
  severity:
2943
2878
  type: string
2944
2879
  description: Severity level of the log message
2945
- enum: [ "debug", "info", "warn", "error" ]
2880
+ enum: ["debug", "info", "warn", "error"]
2946
2881
  message:
2947
2882
  type: string
2948
2883
  description: Human-readable log message
@@ -2962,7 +2897,7 @@ components:
2962
2897
  type:
2963
2898
  type: string
2964
2899
  description: Type of embedded database
2965
- enum: [ "embedded", "materialized" ]
2900
+ enum: ["embedded", "materialized"]
2966
2901
 
2967
2902
  Schema:
2968
2903
  description: A schema name in a Connection.
@@ -3065,7 +3000,8 @@ components:
3065
3000
  description: PostgreSQL password for authentication
3066
3001
  connectionString:
3067
3002
  type: string
3068
- description: Complete PostgreSQL connection string (alternative to individual
3003
+ description:
3004
+ Complete PostgreSQL connection string (alternative to individual
3069
3005
  parameters)
3070
3006
 
3071
3007
  MysqlConnection:
@@ -3135,7 +3071,7 @@ components:
3135
3071
  properties:
3136
3072
  authType:
3137
3073
  type: string
3138
- enum: [ service_principal, sas_token ]
3074
+ enum: [service_principal, sas_token]
3139
3075
  description: Authentication method for Azure Storage
3140
3076
  sasUrl:
3141
3077
  type: string
@@ -3176,7 +3112,8 @@ components:
3176
3112
  properties:
3177
3113
  bucketUrl:
3178
3114
  type: string
3179
- description: URL of the storage bucket (e.g. s3://my-bucket/path or
3115
+ description:
3116
+ URL of the storage bucket (e.g. s3://my-bucket/path or
3180
3117
  gs://my-bucket/path)
3181
3118
  s3Connection:
3182
3119
  $ref: "#/components/schemas/S3Connection"
@@ -3349,7 +3286,7 @@ components:
3349
3286
  type:
3350
3287
  type: string
3351
3288
  description: Type of database connection
3352
- enum: [ bigquery, snowflake, postgres, gcs, s3, azure ]
3289
+ enum: [bigquery, snowflake, postgres, gcs, s3, azure]
3353
3290
  attributes:
3354
3291
  $ref: "#/components/schemas/ConnectionAttributes"
3355
3292
  bigqueryConnection:
@@ -3390,24 +3327,6 @@ components:
3390
3327
  items:
3391
3328
  $ref: "#/components/schemas/Column"
3392
3329
 
3393
- # TODO: Remove this. Replaced by Table
3394
- TableSource:
3395
- type: object
3396
- deprecated: true
3397
- properties:
3398
- resource:
3399
- type: string
3400
- description: Resource path to the table source.
3401
- # Pass source as an opaque JSON string that is malloyVersion dependent.
3402
- # TODO: Remove this once we update the Malloy Publisher connection.
3403
- source:
3404
- type: string
3405
- columns:
3406
- description: Table fields
3407
- type: array
3408
- items:
3409
- $ref: "#/components/schemas/Column"
3410
-
3411
3330
  TemporaryTable:
3412
3331
  type: object
3413
3332
  properties:
@@ -3480,7 +3399,8 @@ components:
3480
3399
  description: Name of the environment being watched for file changes
3481
3400
  watchingPath:
3482
3401
  type: string
3483
- description: The file system path being monitored for changes, null if not
3402
+ description:
3403
+ The file system path being monitored for changes, null if not
3484
3404
  watching
3485
3405
  required:
3486
3406
  - enabled
@@ -3504,7 +3424,7 @@ components:
3504
3424
  status:
3505
3425
  type: string
3506
3426
  description: Connection test result status
3507
- enum: [ "ok", "failed" ]
3427
+ enum: ["ok", "failed"]
3508
3428
  errorMessage:
3509
3429
  type: string
3510
3430
  description: Error message if the connection test failed, null if successful
@@ -3519,7 +3439,8 @@ components:
3519
3439
  includeSql:
3520
3440
  type: boolean
3521
3441
  default: false
3522
- description: If true, returns the generated SQL alongside compilation results
3442
+ description:
3443
+ If true, returns the generated SQL alongside compilation results
3523
3444
  (only available when compilation succeeds and the source contains a
3524
3445
  runnable query).
3525
3446
  givens:
@@ -3533,9 +3454,10 @@ components:
3533
3454
  properties:
3534
3455
  status:
3535
3456
  type: string
3536
- description: Overall compilation status — "error" if any problems have error
3457
+ description:
3458
+ Overall compilation status — "error" if any problems have error
3537
3459
  severity
3538
- enum: [ "success", "error" ]
3460
+ enum: ["success", "error"]
3539
3461
  problems:
3540
3462
  type: array
3541
3463
  description: List of compilation problems (errors and warnings)
@@ -3543,7 +3465,8 @@ components:
3543
3465
  $ref: "#/components/schemas/CompileProblem"
3544
3466
  sql:
3545
3467
  type: string
3546
- description: Generated SQL for the compiled query. Only present when includeSql
3468
+ description:
3469
+ Generated SQL for the compiled query. Only present when includeSql
3547
3470
  is true and compilation succeeds with a runnable query.
3548
3471
 
3549
3472
  CompileProblem:
@@ -3556,7 +3479,7 @@ components:
3556
3479
  severity:
3557
3480
  type: string
3558
3481
  description: Severity level of the problem
3559
- enum: [ "error", "warn", "debug" ]
3482
+ enum: ["error", "warn", "debug"]
3560
3483
  code:
3561
3484
  type: string
3562
3485
  description: Machine-readable error code
@@ -3573,22 +3496,46 @@ components:
3573
3496
 
3574
3497
  CreateMaterializationRequest:
3575
3498
  type: object
3576
- description: Options for creating a materialization
3499
+ description:
3500
+ Options for starting a materialization. Auto-run by default; opt into the
3501
+ two-round control-plane-driven flow with pauseBetweenPhases.
3577
3502
  properties:
3578
- forceRefresh:
3503
+ pauseBetweenPhases:
3579
3504
  type: boolean
3580
3505
  default: false
3581
- description: If true, forces rebuild of all sources even if their BuildID is
3582
- unchanged
3583
- autoLoadManifest:
3506
+ description:
3507
+ When false (default) the publisher runs all phases in one pass —
3508
+ self-assigns table names (the "#@ persist name=" value, else the
3509
+ source name), builds with realization=COPY, assembles the manifest,
3510
+ and auto-loads it into the package models. When true it pauses at
3511
+ BUILD_PLAN_READY for the control plane to send Round 2 build
3512
+ instructions.
3513
+ forceRefresh:
3584
3514
  type: boolean
3585
3515
  default: false
3586
- description: If true, automatically reloads the manifest into the Malloy Runtime
3587
- after a successful materialization
3516
+ description: Build a new table even when a source's buildId is unchanged.
3517
+ sourceNames:
3518
+ type: array
3519
+ items:
3520
+ type: string
3521
+ description:
3522
+ Restrict the plan/build to these persist source names. Omit = all
3523
+ persist sources.
3524
+
3525
+ MaterializationStatus:
3526
+ type: string
3527
+ description: Phase-aware status of a two-round materialization run.
3528
+ enum:
3529
+ - PENDING
3530
+ - BUILD_PLAN_READY
3531
+ - MANIFEST_ROWS_READY
3532
+ - MANIFEST_FILE_READY
3533
+ - FAILED
3534
+ - CANCELLED
3588
3535
 
3589
3536
  Materialization:
3590
3537
  type: object
3591
- description: A record of a package materialization
3538
+ description: A record of one two-round materialization run for a package.
3592
3539
  properties:
3593
3540
  id:
3594
3541
  type: string
@@ -3596,21 +3543,36 @@ components:
3596
3543
  type: string
3597
3544
  packageName:
3598
3545
  type: string
3546
+ pauseBetweenPhases:
3547
+ type: boolean
3548
+ description:
3549
+ Echoes the create-time flag. False (default) = auto-run all phases;
3550
+ true = pause at BUILD_PLAN_READY for control-plane-driven Round 2.
3599
3551
  status:
3600
- type: string
3601
- enum: [ "PENDING", "RUNNING", "SUCCESS", "FAILED", "CANCELLED" ]
3552
+ $ref: "#/components/schemas/MaterializationStatus"
3553
+ buildPlan:
3554
+ oneOf:
3555
+ - $ref: "#/components/schemas/BuildPlan"
3556
+ - type: "null"
3557
+ description: Round 1 output. Null until status >= BUILD_PLAN_READY.
3558
+ manifest:
3559
+ oneOf:
3560
+ - $ref: "#/components/schemas/BuildManifest"
3561
+ - type: "null"
3562
+ description: Round 2 output. Null until status = MANIFEST_FILE_READY.
3602
3563
  startedAt:
3603
- type: [ "string", "null" ]
3564
+ type: ["string", "null"]
3604
3565
  format: date-time
3605
3566
  completedAt:
3606
- type: [ "string", "null" ]
3567
+ type: ["string", "null"]
3607
3568
  format: date-time
3608
3569
  error:
3609
- type: [ "string", "null" ]
3570
+ type: ["string", "null"]
3610
3571
  description: Error message if the materialization failed
3611
3572
  metadata:
3612
- type: [ "object", "null" ]
3613
- description: Materialization metadata including build options, source counts,
3573
+ type: ["object", "null"]
3574
+ description:
3575
+ Materialization metadata including build options, source counts,
3614
3576
  and durations
3615
3577
  createdAt:
3616
3578
  type: string
@@ -3619,26 +3581,161 @@ components:
3619
3581
  type: string
3620
3582
  format: date-time
3621
3583
 
3584
+ BuildPlan:
3585
+ type: object
3586
+ description: |
3587
+ Round 1 output. Mirrors Malloy's native build plan plus the minimal
3588
+ per-source detail the control plane needs in v0 to assign
3589
+ identity/naming/realization. Lineage, policy, and connection
3590
+ capability are intentionally omitted until they carry real data.
3591
+ required: [graphs, sources]
3592
+ properties:
3593
+ graphs:
3594
+ type: array
3595
+ description: Dependency-ordered build graphs, one per connection.
3596
+ items:
3597
+ $ref: "#/components/schemas/BuildGraph"
3598
+ sources:
3599
+ type: object
3600
+ description: Map of sourceID ("sourceName@modelURL") to per-source plan.
3601
+ additionalProperties:
3602
+ $ref: "#/components/schemas/PersistSourcePlan"
3603
+
3604
+ BuildGraph:
3605
+ type: object
3606
+ required: [connectionName, nodes]
3607
+ properties:
3608
+ connectionName:
3609
+ type: string
3610
+ nodes:
3611
+ type: array
3612
+ description:
3613
+ Leveled build nodes; each inner array is one parallelizable level,
3614
+ levels run in order.
3615
+ items:
3616
+ type: array
3617
+ items:
3618
+ $ref: "#/components/schemas/BuildNode"
3619
+
3620
+ BuildNode:
3621
+ type: object
3622
+ required: [sourceID]
3623
+ properties:
3624
+ sourceID:
3625
+ type: string
3626
+ description: "sourceName@modelURL"
3627
+ dependsOn:
3628
+ type: array
3629
+ description: Upstream sourceIDs in this graph.
3630
+ items:
3631
+ type: string
3632
+
3633
+ PersistSourcePlan:
3634
+ type: object
3635
+ required: [name, sourceID, connectionName, buildId, sql, columns]
3636
+ properties:
3637
+ name:
3638
+ type: string
3639
+ sourceID:
3640
+ type: string
3641
+ connectionName:
3642
+ type: string
3643
+ dialect:
3644
+ type: string
3645
+ buildId:
3646
+ type: string
3647
+ description: hash(connectionDigest + canonical logical SQL).
3648
+ sql:
3649
+ type: string
3650
+ description:
3651
+ The source's build SQL (with the build manifest applied for upstream
3652
+ rewrites).
3653
+ columns:
3654
+ type: array
3655
+ description: Output schema of the source.
3656
+ items:
3657
+ $ref: "#/components/schemas/Column"
3658
+
3659
+ Realization:
3660
+ type: string
3661
+ enum: [SNAPSHOT, COPY]
3662
+ description: SNAPSHOT = warehouse clone/snapshot; COPY = CREATE TABLE AS SELECT.
3663
+
3664
+ BuildInstructions:
3665
+ type: object
3666
+ description: Round 2 input. Per-source instructions assigned by the control plane.
3667
+ required: [sources]
3668
+ properties:
3669
+ sources:
3670
+ type: array
3671
+ items:
3672
+ $ref: "#/components/schemas/BuildInstruction"
3673
+
3674
+ BuildInstruction:
3675
+ type: object
3676
+ required: [buildId, materializedTableId, physicalTableName, realization]
3677
+ properties:
3678
+ buildId:
3679
+ type: string
3680
+ description: Identifies which planned source this instruction is for
3681
+ (matches PersistSourcePlan.buildId).
3682
+ sourceID:
3683
+ type: string
3684
+ description:
3685
+ Optional convenience echo of "sourceName@modelURL"; buildId is
3686
+ authoritative.
3687
+ materializedTableId:
3688
+ type: string
3689
+ description:
3690
+ CP-assigned surrogate id for the materialized table about to be
3691
+ produced.
3692
+ physicalTableName:
3693
+ type: string
3694
+ description:
3695
+ Fully-qualified, dialect-quoted table name to create. The publisher
3696
+ writes here verbatim.
3697
+ realization:
3698
+ $ref: "#/components/schemas/Realization"
3699
+
3622
3700
  BuildManifest:
3623
3701
  type: object
3624
- description: Manifest mapping BuildIDs to materialized table names
3702
+ description:
3703
+ Round 2 output. Maps each buildId a build produced to its physical table.
3704
+ Returned inline; the control plane persists it.
3625
3705
  properties:
3706
+ builtAt:
3707
+ type: string
3708
+ format: date-time
3626
3709
  entries:
3627
3710
  type: object
3628
3711
  additionalProperties:
3629
3712
  $ref: "#/components/schemas/ManifestEntry"
3630
- description: Map of BuildID to manifest entry
3713
+ description: Map of buildId to manifest entry.
3631
3714
  strict:
3632
3715
  type: boolean
3633
- description: Whether the manifest is in strict mode
3716
+ description: Whether unresolved references should error.
3634
3717
 
3635
3718
  ManifestEntry:
3636
3719
  type: object
3637
- description: A single entry in the build manifest
3720
+ description: A single entry in the build manifest.
3721
+ required: [buildId, physicalTableName]
3638
3722
  properties:
3639
- tableName:
3723
+ buildId:
3640
3724
  type: string
3641
- description: Name of the materialized table
3725
+ sourceName:
3726
+ type: string
3727
+ materializedTableId:
3728
+ type: string
3729
+ description: Echoes the CP-assigned id from the BuildInstruction.
3730
+ physicalTableName:
3731
+ type: string
3732
+ description: Name of the materialized table.
3733
+ connectionName:
3734
+ type: string
3735
+ realization:
3736
+ $ref: "#/components/schemas/Realization"
3737
+ rowCount:
3738
+ type: ["integer", "null"]
3642
3739
 
3643
3740
  parameters:
3644
3741
  environmentName: