@xanots/sdk 0.0.11 → 0.0.13
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/CHANGELOG.md +37 -0
- package/README.md +16 -9
- package/dist/.build-fingerprint +1 -1
- package/dist/{agent-file-refresh-QNKN5RYD.js → agent-file-refresh-GQWAAOBV.js} +4 -4
- package/dist/bin.js +11 -11
- package/dist/{branch-commands-2BLOC2GR.js → branch-commands-5KMPAAZV.js} +7 -7
- package/dist/bundle.d.ts +2 -2
- package/dist/bundle.js +2 -2
- package/dist/{capture-4WVJY4DQ.js → capture-YLUVAITI.js} +2 -2
- package/dist/{chunk-22TKBSDV.js → chunk-2AY3PKF4.js} +2 -2
- package/dist/chunk-2VTJSI6X.js +192 -0
- package/dist/{chunk-5XZ744TS.js → chunk-2ZCUO2UG.js} +1 -1
- package/dist/{chunk-XEOX6AM7.js → chunk-3LQGF2WS.js} +2 -2
- package/dist/{chunk-WP4OZZV4.js → chunk-3VFCKHOB.js} +2 -2
- package/dist/{chunk-XHEXOES3.js → chunk-5YDINUAP.js} +1 -1
- package/dist/{chunk-LU7TRWMC.js → chunk-6VNRMKFJ.js} +2 -2
- package/dist/{chunk-CTD5ZCV6.js → chunk-7WRJPKGK.js} +2 -2
- package/dist/{chunk-3INK4Y4E.js → chunk-AE3PDSDS.js} +1 -1
- package/dist/{chunk-DBFU47BJ.js → chunk-AOFFKSJC.js} +2 -2
- package/dist/{chunk-TCFIPDB3.js → chunk-AVGDL6RB.js} +1 -1
- package/dist/{chunk-UOZMSF4C.js → chunk-BYQHCCYU.js} +5 -5
- package/dist/{chunk-BC2C5GVI.js → chunk-DCMANKMX.js} +1 -1
- package/dist/{chunk-WHOJWOSV.js → chunk-EETVJZAZ.js} +1 -1
- package/dist/{chunk-VNQM3V2C.js → chunk-EXENFOWE.js} +2 -2
- package/dist/{chunk-AIZKXUNP.js → chunk-IMLYGQK6.js} +2 -2
- package/dist/{chunk-OWGCOGKK.js → chunk-MEFMTICH.js} +83 -8
- package/dist/{chunk-QK7ZQJLP.js → chunk-N74KDCBD.js} +39 -25
- package/dist/{chunk-3IGNIP6R.js → chunk-NDP7OUPS.js} +1 -1
- package/dist/{chunk-4Q7ZOHH7.js → chunk-OONT4ZL4.js} +3 -3
- package/dist/{chunk-EQW3YT5U.js → chunk-P6PVBQL6.js} +2 -2
- package/dist/{chunk-QYMAZRAU.js → chunk-PJNWOZMT.js} +5 -5
- package/dist/{chunk-BSK7ELHU.js → chunk-PR7OXHGZ.js} +1 -1
- package/dist/{chunk-RCT7UX7B.js → chunk-RLI6XD4O.js} +32 -27
- package/dist/{chunk-ZQ2PKR6R.js → chunk-RQ3FXV4K.js} +2 -2
- package/dist/{chunk-Q77KNEUL.js → chunk-RQNMTDXD.js} +1703 -2
- package/dist/{chunk-4IF54NU5.js → chunk-S3DOJOW4.js} +41 -21
- package/dist/{chunk-HYBN4H3F.js → chunk-SS2V2QOG.js} +27 -20
- package/dist/{chunk-QKM4U5UK.js → chunk-TJS2AF5Y.js} +2 -2
- package/dist/{chunk-DIA7CT7J.js → chunk-V5Y7D4LH.js} +11 -2
- package/dist/{chunk-KA6G2L7U.js → chunk-VK26K7AY.js} +3 -3
- package/dist/{chunk-VAF6A3YD.js → chunk-XWFRNJMQ.js} +1 -1
- package/dist/{chunk-7ZYW652H.js → chunk-YHS6VVLJ.js} +2 -2
- package/dist/{chunk-G4EJMQLD.js → chunk-YX22LKQE.js} +2 -2
- package/dist/{chunk-F6CYJ7TN.js → chunk-Z2ZIE5CO.js} +2 -2
- package/dist/cli.d.ts +13 -6
- package/dist/cli.js +10 -10
- package/dist/codegen-command-ZDHMGFWZ.js +47 -0
- package/dist/codegen.d.ts +5 -5
- package/dist/codegen.js +2 -2
- package/dist/{completion-WF46272M.js → completion-HJU5QEFB.js} +2 -2
- package/dist/{deploy-command-IP7V7GT4.js → deploy-command-CGVKRWUE.js} +19 -19
- package/dist/{ephemeral-command-U4AQ3TXX.js → ephemeral-command-2NKPEXUU.js} +8 -8
- package/dist/index.d.ts +88 -104
- package/dist/index.js +9 -9
- package/dist/init-command-DNDONP3O.js +32 -0
- package/dist/internal.d.ts +10 -16
- package/dist/internal.js +34 -34
- package/dist/{io-P2H75UV2.js → io-UBDMMDH6.js} +3 -3
- package/dist/{live-diff-IXKBVG4K.js → live-diff-HCOTN5WC.js} +3 -3
- package/dist/{lock-46FWYE4D.js → lock-HQ4KARU2.js} +2 -2
- package/dist/{lock-commands-ZZKZ4LZJ.js → lock-commands-6U7UIJGR.js} +11 -11
- package/dist/{login-command-Z6CHTA57.js → login-command-P7LXD5TE.js} +6 -6
- package/dist/{loop-D5NPL4VH.js → loop-IC5ISSYB.js} +3 -3
- package/dist/{marketplace-command-P4IPLJ6J.js → marketplace-command-T6JCHW7J.js} +4 -4
- package/dist/{meta-client-K2J4XH64.js → meta-client-LKRKR3L2.js} +4 -4
- package/dist/node.d.ts +6 -6
- package/dist/node.js +14 -14
- package/dist/{preflight-command-K346GPTY.js → preflight-command-UYE7SUQV.js} +16 -16
- package/dist/{profile-command-LJSBDV2L.js → profile-command-WBNSMQSI.js} +3 -3
- package/dist/{release-command-IMNTIVWK.js → release-command-CMMYT6XK.js} +26 -26
- package/dist/{response-BQVQ24l1.d.ts → response-D6xGLEIn.d.ts} +18 -23
- package/dist/{routes-manifest-PWZHDOI5.js → routes-manifest-MN6XBYRE.js} +25 -14
- package/dist/{runtime-V4C3AC3A.js → runtime-LSLIDALK.js} +1 -1
- package/dist/scaffold.d.ts +16 -8
- package/dist/scaffold.js +7 -11
- package/dist/{static-host-3WMV7IZO.js → static-host-4JDQCHUW.js} +1 -1
- package/dist/{status-command-AL47VG7H.js → status-command-VARULAR5.js} +4 -4
- package/dist/{store-BLyNeQ8S.d.ts → store-9Psd0jiF.d.ts} +115 -102
- package/dist/{test-command-YAZLKLGQ.js → test-command-YCAR4O35.js} +7 -7
- package/dist/{upgrade-command-BN3EHAOI.js → upgrade-command-A75DOIUH.js} +15 -16
- package/dist/{workspace-2COHDBM3.js → workspace-33KHFLX3.js} +2 -2
- package/dist/{workspace-command-MNK7Y7MQ.js → workspace-command-YELP47SJ.js} +26 -28
- package/dist/{workspace-export-DURY5WYL.js → workspace-export-MLYTYZS5.js} +3 -3
- package/dist/{xdo-BjJj5W_E.d.ts → xdo-ODuJklk6.d.ts} +27 -23
- package/guides/authoring.md +11 -2
- package/guides/typed-frontend.md +23 -6
- package/llms/kinds-realtime.md +2 -2
- package/llms/statements-data.md +3 -2
- package/llms/tests.md +1 -1
- package/llms/triggers.md +2 -2
- package/llms/values.md +1 -1
- package/llms-full.txt +26 -26
- package/llms.txt +17 -18
- package/manifest.json +6 -2
- package/package.json +1 -1
- package/dist/chunk-ANUDXFEX.js +0 -881
- package/dist/chunk-JGCWTCA7.js +0 -95
- package/dist/chunk-YBC3IKMF.js +0 -845
- package/dist/codegen-command-FUT2KJB6.js +0 -49
- package/dist/init-command-NPVL32L6.js +0 -34
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { V as Value, g as FieldXdo, d as ExprNode, S as StackItemXdo, p as TestDef, C as CacheXdo, h as FilterXdo, I as InputXdo, k as ResultItemXdo, s as TestXdo } from './xdo-
|
|
2
|
-
import { W as FieldOptions, h as FieldMap, Y as Prettify, x as RowFromFieldMap, l as FromFieldMap, Z as ReadonlyMethods, M as MethodArg, C as TextMethod, G as TypeBrand, I as IntMethod, D as DecimalMethod, E as EmailMethod, P as PasswordMethod, _ as XanoFileUpload, v as ObjectRef, $ as XanoDbLink, a0 as ConstMethodOpts, f as FieldDescriptor, X as XanoFileRef, K as XanoGeoValue, H as VectorMethod, T as TableRefMethod, b as BrandValue, S as Statement, w as ResponseDef, p as MockMap } from './response-
|
|
1
|
+
import { V as Value, g as FieldXdo, d as ExprNode, S as StackItemXdo, p as TestDef, C as CacheXdo, h as FilterXdo, I as InputXdo, k as ResultItemXdo, s as TestXdo } from './xdo-ODuJklk6.js';
|
|
2
|
+
import { W as FieldOptions, h as FieldMap, Y as Prettify, x as RowFromFieldMap, l as FromFieldMap, Z as ReadonlyMethods, M as MethodArg, C as TextMethod, G as TypeBrand, I as IntMethod, D as DecimalMethod, E as EmailMethod, P as PasswordMethod, _ as XanoFileUpload, v as ObjectRef, $ as XanoDbLink, a0 as ConstMethodOpts, f as FieldDescriptor, X as XanoFileRef, K as XanoGeoValue, H as VectorMethod, T as TableRefMethod, b as BrandValue, S as Statement, w as ResponseDef, p as MockMap } from './response-D6xGLEIn.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* The single boolean-expression algebra shared by every SDK surface that emits
|
|
@@ -18,8 +18,7 @@ import { W as FieldOptions, h as FieldMap, Y as Prettify, x as RowFromFieldMap,
|
|
|
18
18
|
*
|
|
19
19
|
* Operands pass their tag/filters straight through — a filtered operand
|
|
20
20
|
* (`withFilters(...)`) is valid inline in every condition/`where` surface
|
|
21
|
-
* (conditional, while, db.query/addon, …), verified against a live engine
|
|
22
|
-
* (the old #118 db-search rejection no longer reproduces).
|
|
21
|
+
* (conditional, while, db.query/addon, …), verified against a live engine.
|
|
23
22
|
*/
|
|
24
23
|
|
|
25
24
|
/**
|
|
@@ -125,7 +124,7 @@ type Condition = SearchNode | SearchNode[];
|
|
|
125
124
|
* `cmp(col("owner"), "in", ids)` with an empty `ids` matches nothing, and the
|
|
126
125
|
* same clause with `{ ignoreEmpty: true }` returns the UNFILTERED table. Never
|
|
127
126
|
* put it on a clause that scopes rows to a permitted set — an empty permission
|
|
128
|
-
* list then returns everything
|
|
127
|
+
* list then returns everything. It is for an OPTIONAL search filter,
|
|
129
128
|
* where "the caller left this box blank" really does mean "do not filter".
|
|
130
129
|
*/
|
|
131
130
|
declare function cmp(left: Value, op: SearchOp, right: Value, opts?: {
|
|
@@ -173,8 +172,8 @@ declare function encodeObject<Xdo = unknown>(name: string, def: unknown): Xdo;
|
|
|
173
172
|
declare function registeredKinds(): ObjectKind[];
|
|
174
173
|
|
|
175
174
|
/**
|
|
176
|
-
* Table (database) kind
|
|
177
|
-
* field encoder
|
|
175
|
+
* Table (database) kind → payload key `dbo`. Columns reuse the shared
|
|
176
|
+
* field encoder with the column context; indexes, views, and
|
|
178
177
|
* autocomplete have their own small shapes. Validated against the Xano engine's
|
|
179
178
|
* persisted table shape (the full rich field-type corpus).
|
|
180
179
|
*/
|
|
@@ -306,7 +305,7 @@ type SeedRow<Row = unknown> = [Row] extends [never] ? Record<string, unknown> :
|
|
|
306
305
|
*
|
|
307
306
|
* Distinct from {@link RowOf}, the READ shape, where every declared column is
|
|
308
307
|
* present. Using the read shape here demanded every column on every seed row —
|
|
309
|
-
* stricter than both the runtime validator and the engine
|
|
308
|
+
* stricter than both the runtime validator and the engine.
|
|
310
309
|
*/
|
|
311
310
|
type SeedRowOf<S extends FieldMap, IdT extends "int" | "uuid" = "int", Sys extends boolean = true> = Prettify<([Sys] extends [false] ? Record<never, never> : Partial<Omit<SystemRow<IdT>, keyof S>>) & FromFieldMap<S>>;
|
|
312
311
|
/**
|
|
@@ -316,7 +315,7 @@ type SeedRowOf<S extends FieldMap, IdT extends "int" | "uuid" = "int", Sys exten
|
|
|
316
315
|
* deferred source keeps large or sensitive seed data out of any frontend bundle
|
|
317
316
|
* that value-imports the table def, and is erased entirely under `import type`.
|
|
318
317
|
* Prefer the thunk form for anything beyond a handful of inline rows — it costs
|
|
319
|
-
* no typing (row and column inference survive every form
|
|
318
|
+
* no typing (row and column inference survive every form).
|
|
320
319
|
*
|
|
321
320
|
* A JSON `import()` resolves to a module namespace at runtime, not the array
|
|
322
321
|
* TypeScript types the specifier as; the deploy path unwraps `.default`, so
|
|
@@ -329,7 +328,7 @@ type SeedSource<Row = unknown> = ReadonlyArray<SeedRow<Row>> | SeedFileSource |
|
|
|
329
328
|
*/
|
|
330
329
|
type WidenSeedValue<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends ReadonlyArray<infer E> ? ReadonlyArray<WidenSeedValue<E>> : T;
|
|
331
330
|
/**
|
|
332
|
-
* A seed row as a DEFERRED source can actually be typed
|
|
331
|
+
* A seed row as a DEFERRED source can actually be typed.
|
|
333
332
|
*
|
|
334
333
|
* A `.json` module's strings infer as `string`, never as the literal union an
|
|
335
334
|
* `f.enum` column brands — so `seed: () => import("./rows.json")` matched no
|
|
@@ -377,7 +376,7 @@ interface SeedFileSource {
|
|
|
377
376
|
* module, not in `@xanots/sdk`, so a bundler sees an ordinary dynamic import
|
|
378
377
|
* and emits the JSON as a served chunk. Nothing the SDK does to its own code can
|
|
379
378
|
* prevent that. A frontend that value-imports any def whose module graph reaches
|
|
380
|
-
* the table then ships the seed to the browser
|
|
379
|
+
* the table then ships the seed to the browser.
|
|
381
380
|
*
|
|
382
381
|
* A path is a plain string, so there is nothing for a bundler to follow. The
|
|
383
382
|
* file is read with `node:fs` in the deploy pipeline only.
|
|
@@ -550,7 +549,7 @@ declare function table<S extends FieldMap, IdT extends "int" | "uuid" = "int", S
|
|
|
550
549
|
* too, and TypeScript's overload resolution silently falls through to a later
|
|
551
550
|
* candidate whenever the generic one does not resolve on the first pass — which
|
|
552
551
|
* a function-form `seed` triggers. The result was a table whose `Cols` and `Row`
|
|
553
|
-
* both collapsed with no error reported at the `table()` call
|
|
552
|
+
* both collapsed with no error reported at the `table()` call. With
|
|
554
553
|
* this overload unable to match a `FieldMap`, the generic signature is the only
|
|
555
554
|
* candidate and resolves, or reports a real error.
|
|
556
555
|
*/
|
|
@@ -604,7 +603,7 @@ declare const input: {
|
|
|
604
603
|
* password on **both** signup and login, let the `f.password` *column* hash on write,
|
|
605
604
|
* and pass the plaintext straight to `check_password`. See the auth recipe in the
|
|
606
605
|
* README. Reach for `input.password` only when you specifically want bind-time hashing
|
|
607
|
-
* and are not also comparing it with `check_password
|
|
606
|
+
* and are not also comparing it with `check_password`.
|
|
608
607
|
*/
|
|
609
608
|
password: <const O extends ConstInputOpts<PasswordMethod> = Record<string, never>>(options?: O) => InputDescriptor & TypeBrand<string, O>;
|
|
610
609
|
/**
|
|
@@ -864,14 +863,14 @@ declare function encodeContainerHistory<P extends ContainerPrefix>(prefix: P, in
|
|
|
864
863
|
* Workspace-tier flat map (terminal fallback — no `inherit`). Wholesale: every
|
|
865
864
|
* object type is emitted; a type absent from `map` falls back to its engine
|
|
866
865
|
* default (`enabled` per the kind rule, `limit:100`). Matches the 14-key stored
|
|
867
|
-
* shape
|
|
866
|
+
* shape.
|
|
868
867
|
*/
|
|
869
868
|
declare function buildWorkspaceHistory(map: WorkspaceHistoryDef): WorkspaceHistoryXdo;
|
|
870
869
|
|
|
871
870
|
/**
|
|
872
|
-
* `defineFunction` + the in-memory `FunctionDef` model
|
|
871
|
+
* `defineFunction` + the in-memory `FunctionDef` model.
|
|
873
872
|
*
|
|
874
|
-
* The authoring API is a flat declarative factory
|
|
873
|
+
* The authoring API is a flat declarative factory: data in → JSON out,
|
|
875
874
|
* no hidden control-flow inference.
|
|
876
875
|
*/
|
|
877
876
|
|
|
@@ -956,10 +955,10 @@ declare function defineFunction<const I extends Record<string, InputDescriptor>
|
|
|
956
955
|
/** A surface that takes a JavaScript body: the lambda statement, or a filter. */
|
|
957
956
|
type LambdaSurface = "s.lambda" | "fl.lambda" | "map" | "filter" | "some" | "every" | "find" | "findIndex" | "reduce";
|
|
958
957
|
/**
|
|
959
|
-
* Surface → the identifiers a body may reference. Live-probed
|
|
960
|
-
*
|
|
961
|
-
*
|
|
962
|
-
*
|
|
958
|
+
* Surface → the identifiers a body may reference. Live-probed rather than read
|
|
959
|
+
* off any documentation, and asserted against the recorded probe output in the
|
|
960
|
+
* tests, so the guard, the types, and the docs cannot disagree with the engine
|
|
961
|
+
* or with each other.
|
|
963
962
|
*
|
|
964
963
|
* `console` and `crypto` are globals inside the body rather than destructured
|
|
965
964
|
* bindings, so they are legal to reference but are not part of the parameter
|
|
@@ -971,7 +970,7 @@ declare const LAMBDA_BINDINGS: Readonly<Record<LambdaSurface, readonly string[]>
|
|
|
971
970
|
declare const LAMBDA_GLOBALS: readonly string[];
|
|
972
971
|
/**
|
|
973
972
|
* The libraries the engine preloads as GLOBALS in a lambda body — the only
|
|
974
|
-
* dependency route that works on every instance
|
|
973
|
+
* dependency route that works on every instance.
|
|
975
974
|
*
|
|
976
975
|
* A body is prepared for execution in one of two ways depending on the
|
|
977
976
|
* instance's executor generation, and the two disagree about `import()`:
|
|
@@ -1000,14 +999,15 @@ declare const LAMBDA_MODULE_GLOBALS: readonly string[];
|
|
|
1000
999
|
*
|
|
1001
1000
|
* The slot is fixed rather than looked up because it is what the guard has to
|
|
1002
1001
|
* key on: `filter()` sees positions, not argument names. `reduce`'s body is the
|
|
1003
|
-
* SECOND argument (the accumulator's initial value comes first, and
|
|
1004
|
-
*
|
|
1002
|
+
* SECOND argument (the accumulator's initial value comes first, and that slot
|
|
1003
|
+
* being invisible is the other half of the same failure); every other lambda
|
|
1004
|
+
* filter's is the
|
|
1005
1005
|
* first.
|
|
1006
1006
|
*
|
|
1007
1007
|
* `fl.transform` is deliberately absent. It takes Xano Expression Engine source,
|
|
1008
1008
|
* not a JavaScript body, and binds the operand as `$0` rather than `$this` — so
|
|
1009
1009
|
* validating it against THIS contract would reject correct code. It has its own
|
|
1010
|
-
* guard, on its own probed contract, in `./expression-arg.ts
|
|
1010
|
+
* guard, on its own probed contract, in `./expression-arg.ts`; a
|
|
1011
1011
|
* `return` there is not merely refused but sometimes silently mis-evaluated.
|
|
1012
1012
|
* `test/values/filters.test.ts` enumerates the `code`-taking filters from
|
|
1013
1013
|
* `FILTER_SPECS` and fails if one is missing here.
|
|
@@ -1056,7 +1056,7 @@ interface IteratingBindings extends AmbientBindings {
|
|
|
1056
1056
|
}
|
|
1057
1057
|
/** The bindings in scope in a body at `S` — the type of a {@link lam.fn} parameter. */
|
|
1058
1058
|
type LambdaBindings<S extends LambdaSurface = "reduce"> = S extends "reduce" ? IteratingBindings & {
|
|
1059
|
-
/** The accumulator.
|
|
1059
|
+
/** The accumulator. Commonly mis-typed as `$acc`. */
|
|
1060
1060
|
$result: any;
|
|
1061
1061
|
} : S extends "s.lambda" ? AmbientBindings : S extends "fl.lambda" ? AmbientBindings & {
|
|
1062
1062
|
/** The piped value the filter is applied to. */
|
|
@@ -1088,7 +1088,7 @@ type CaptureValue = string | number | boolean | null | {
|
|
|
1088
1088
|
* stays open to declaration merging. So `capture: { band }` compiled when `band`
|
|
1089
1089
|
* was a `type` and failed when the identical shape was an `interface`, with the
|
|
1090
1090
|
* error naming `CaptureValue` rather than the one keyword that differed, and the
|
|
1091
|
-
* body's second parameter then degrading to the constraint
|
|
1091
|
+
* body's second parameter then degrading to the constraint.
|
|
1092
1092
|
*
|
|
1093
1093
|
* A homomorphic mapped type is the way through: `keyof` an interface is the same
|
|
1094
1094
|
* as `keyof` the alias, so this accepts both and still rejects what genuinely
|
|
@@ -2007,7 +2007,7 @@ declare const fl: {
|
|
|
2007
2007
|
* statement the database runs, so they are reachable only from a query's own
|
|
2008
2008
|
* expression surfaces — and, being absent from the runtime catalog, every one of
|
|
2009
2009
|
* them used to be reported by `findUnresolvableFilters` as "will 500 at runtime"
|
|
2010
|
-
|
|
2010
|
+
*. That warning steered authors off the only spelling that works.
|
|
2011
2011
|
*
|
|
2012
2012
|
* The distinction is worth stating because it is what makes vector search
|
|
2013
2013
|
* possible at all: `f.vector` columns and their pgvector indexes had no query
|
|
@@ -2092,7 +2092,7 @@ type OutputPath<C extends string> = QualifiedCol<C> | PagingEnvelopeField;
|
|
|
2092
2092
|
* ⚠ `comments.id` is only the bound table's own alias WHEN THE QUERY DECLARES ONE
|
|
2093
2093
|
* (`tableAlias`) — that is why Xano's editor can write it and a hand-authored
|
|
2094
2094
|
* query cannot. Without `tableAlias`, qualifying the bound table by its NAME does
|
|
2095
|
-
* not resolve, and the query fails at runtime
|
|
2095
|
+
* not resolve, and the query fails at runtime; `db.query` checks the
|
|
2096
2096
|
* `where`/`sort`/`eval` paths for it at export. Bare is the form to reach for.
|
|
2097
2097
|
*/
|
|
2098
2098
|
type QualifiedCol<C extends string> = C | `${string}.${string}`;
|
|
@@ -2114,7 +2114,7 @@ type OutputRoot<P extends string> = P extends `${infer Head}.${string}` ? Head :
|
|
|
2114
2114
|
* The boolean-expression algebra (`cmp`/`and`/`or`, the node types, the tree
|
|
2115
2115
|
* walk) now lives in {@link ../expression.js}; this module keeps the db-specific
|
|
2116
2116
|
* pieces — `where`/`additionalWhere` merge, sort, eval — and supplies the
|
|
2117
|
-
* filter-rejecting operand encoder
|
|
2117
|
+
* filter-rejecting operand encoder to the shared walk.
|
|
2118
2118
|
*/
|
|
2119
2119
|
|
|
2120
2120
|
/** Sort direction for a {@link SortDirective} — the engine's `orderBy` values. */
|
|
@@ -2233,7 +2233,7 @@ declare function resolveAuthRef(hostLabel: string, host: string, auth: AuthRef |
|
|
|
2233
2233
|
* spec/tags/tool-refs). Verified against the Xano engine's stored mcp_server and
|
|
2234
2234
|
* agent formats.
|
|
2235
2235
|
*
|
|
2236
|
-
* Notes from that verification
|
|
2236
|
+
* Notes from that verification:
|
|
2237
2237
|
* - Xano's MCP server has **no** server-level `authentication` field — auth is
|
|
2238
2238
|
* per-tool (`tool[].auth`, a stored `json`, engine default `false`).
|
|
2239
2239
|
* - Toolset-level middleware is **not** an engine feature: neither transform
|
|
@@ -2246,7 +2246,7 @@ declare function resolveAuthRef(hostLabel: string, host: string, auth: AuthRef |
|
|
|
2246
2246
|
/**
|
|
2247
2247
|
* Generic over its input map `I`, branded stack tuple `S`, literal response
|
|
2248
2248
|
* `Resp`, and declared `Res` — the same carriers `QueryDef` holds, so
|
|
2249
|
-
* `InferInput`/`InferResponse` work identically here
|
|
2249
|
+
* `InferInput`/`InferResponse` work identically here. All default,
|
|
2250
2250
|
* so a bare `ToolDef` is unchanged.
|
|
2251
2251
|
*
|
|
2252
2252
|
* A tool's response is the value an AGENT reads back, which makes it as
|
|
@@ -2329,7 +2329,7 @@ declare const toolKind: ObjectKind<AnyToolDef$1, ToolXdo>;
|
|
|
2329
2329
|
/**
|
|
2330
2330
|
* Authoring factory for a `tool` — a function-like operation a toolset
|
|
2331
2331
|
* references. The exact input map, stack tuple, and response are preserved on
|
|
2332
|
-
* the return type, so `InferInput`/`InferResponse` recover them
|
|
2332
|
+
* the return type, so `InferInput`/`InferResponse` recover them.
|
|
2333
2333
|
*/
|
|
2334
2334
|
declare function tool<const I extends Record<string, InputDescriptor>, Res = never, Resp extends ResponseDef = ResponseDef, const S extends readonly Statement[] = readonly []>(def: ToolDef<I, Res, Resp, S>): ToolDef<I, Res, Resp, S>;
|
|
2335
2335
|
/**
|
|
@@ -2365,7 +2365,7 @@ interface ToolsetToolRef {
|
|
|
2365
2365
|
* directly (`registerTools([saveNote])`, `bind: [{ table: users }]`), so
|
|
2366
2366
|
* `tools: [saveNote]` is the spelling authors reach for by analogy — and the
|
|
2367
2367
|
* wrapper's fields are all optional, so TypeScript's weak-type check let a bare
|
|
2368
|
-
* handle through and the export emitted `id: 0`, a null reference
|
|
2368
|
+
* handle through and the export emitted `id: 0`, a null reference.
|
|
2369
2369
|
* Normalizing here removes the failure mode rather than documenting around it.
|
|
2370
2370
|
*/
|
|
2371
2371
|
type ToolsetToolEntry = ToolsetToolRef | ToolDef | string;
|
|
@@ -2556,7 +2556,7 @@ interface XanoFreeProvider extends LlmCommon {
|
|
|
2556
2556
|
dynamicRetrieval?: string;
|
|
2557
2557
|
}
|
|
2558
2558
|
/**
|
|
2559
|
-
* The run prompt, in exactly one of its two spellings
|
|
2559
|
+
* The run prompt, in exactly one of its two spellings.
|
|
2560
2560
|
*
|
|
2561
2561
|
* The engine stores ONE prompt behind a `prompt_type` discriminator: either a
|
|
2562
2562
|
* `prompt` string or a `prompt_messages` template, never both. Authoring both
|
|
@@ -2597,7 +2597,7 @@ type LlmSettings = AnthropicLlm | OpenAiLlm | GoogleGenAiLlm | XanoFreeLlm;
|
|
|
2597
2597
|
* stored `structuredOutputsSchema` is the same wire shape as function inputs, so
|
|
2598
2598
|
* `encodeInput` produces it verbatim (no parallel encoder). e.g.
|
|
2599
2599
|
* `output: { schema: { priority: input.enum(["low","high"]), summary: input.text() } }`.
|
|
2600
|
-
* The item shape is byte-verified against a captured live-engine golden
|
|
2600
|
+
* The item shape is byte-verified against a captured live-engine golden.
|
|
2601
2601
|
*/
|
|
2602
2602
|
interface AgentOutput {
|
|
2603
2603
|
schema: Record<string, InputDescriptor>;
|
|
@@ -2611,7 +2611,7 @@ interface AgentOutput {
|
|
|
2611
2611
|
* `A` is whatever `s.ai.agent.run({ agent })` was handed: an {@link AgentHandle}
|
|
2612
2612
|
* (or {@link AgentDef}) carries a precise, branded `output.schema`, so this reads
|
|
2613
2613
|
* the shape the agent already declares once — no second `resultShape` witness at
|
|
2614
|
-
* the call site
|
|
2614
|
+
* the call site. A bare name/ref carries no schema → `string`.
|
|
2615
2615
|
*
|
|
2616
2616
|
* The schema is a *response* shape (the object the model returns), so every
|
|
2617
2617
|
* declared field is treated as present — {@link RowFromFieldMap}, not the
|
|
@@ -2701,12 +2701,12 @@ type AgentHandle<D extends AgentDef = AgentDef> = D & {
|
|
|
2701
2701
|
* branded `output.schema`. That lets `s.ai.agent.run({ agent })` read the
|
|
2702
2702
|
* completion shape straight off the handle via {@link AgentResultOf} — the
|
|
2703
2703
|
* structured-output type is declared once here, not re-stated as a `resultShape`
|
|
2704
|
-
* witness at every call site
|
|
2704
|
+
* witness at every call site.
|
|
2705
2705
|
*/
|
|
2706
2706
|
declare function agent<const D extends AgentDef>(def: D): AgentHandle<D>;
|
|
2707
2707
|
|
|
2708
2708
|
/**
|
|
2709
|
-
* Addon kind
|
|
2709
|
+
* Addon kind → payload key `addon`. An addon is a single table-bound db
|
|
2710
2710
|
* query (an `input` block + an `output` selection + a `context` that carries the
|
|
2711
2711
|
* dbo binding and `return`), *not* a statement stack — the engine runs it
|
|
2712
2712
|
* straight off `context`. The MVP models the common shape;
|
|
@@ -2718,7 +2718,7 @@ declare function agent<const D extends AgentDef>(def: D): AgentHandle<D>;
|
|
|
2718
2718
|
* matches on) and brands the returned handle with the addon's **graft shape** —
|
|
2719
2719
|
* `Pick<InferRow<table>, output>`, wrapped per {@link AddonDef.cardinality} — so
|
|
2720
2720
|
* a `db.query`/`db.get` attaching the addon can type the grafted row field
|
|
2721
|
-
* instead of falling back to `unknown
|
|
2721
|
+
* instead of falling back to `unknown`.
|
|
2722
2722
|
*/
|
|
2723
2723
|
|
|
2724
2724
|
/** An addon's `output` selection: a typed column-name list, or the raw customize block. */
|
|
@@ -2861,7 +2861,7 @@ interface AddonArgs<Tbl extends ObjectRef | null, Out extends readonly string[],
|
|
|
2861
2861
|
declare function addon<const Out extends readonly string[] = readonly [], Tbl extends ObjectRef | null = ObjectRef, Card extends AddonCardinality = "list", const Grp extends readonly DbEval[] = readonly [], const Ev extends readonly DbEval[] = readonly []>(def: AddonArgs<Tbl, Out, Card, Grp, Ev>): AddonDef<AddonGraft<Tbl, Out, Card, Grp, Ev>>;
|
|
2862
2862
|
|
|
2863
2863
|
/**
|
|
2864
|
-
* Schema-DSL interpreter
|
|
2864
|
+
* Schema-DSL interpreter. Turns a declarative statement schema's
|
|
2865
2865
|
* `transform` rules into a runtime encoder, so the ~169 declarative statements
|
|
2866
2866
|
* are driven by data (a `StatementSpec`) rather than hand-written per statement.
|
|
2867
2867
|
*
|
|
@@ -2879,11 +2879,11 @@ declare function addon<const Out extends readonly string[] = readonly [], Tbl ex
|
|
|
2879
2879
|
* `output` (whether the stored item carries `output:{filters:[]}`) is NOT
|
|
2880
2880
|
* derivable from the transform schema — it is engine statement-class metadata
|
|
2881
2881
|
* (e.g. `uuid4` has an `as` but no `output`; `return` has a value block but no
|
|
2882
|
-
* `output`). The codegen pins it from the persisted golden fixture
|
|
2882
|
+
* `output`). The codegen pins it from the persisted golden fixture,
|
|
2883
2883
|
* never guessing.
|
|
2884
2884
|
*
|
|
2885
2885
|
* Validated against real persisted fixtures (math_add, bitwise_and, object_keys,
|
|
2886
|
-
* array_push, array_pop). The codegen pipeline
|
|
2886
|
+
* array_push, array_pop). The codegen pipeline populates the
|
|
2887
2887
|
* spec catalog from the Xano engine's schema definitions; uninterpretable schemas are
|
|
2888
2888
|
* logged, never guessed.
|
|
2889
2889
|
*/
|
|
@@ -2915,7 +2915,7 @@ type Route = {
|
|
|
2915
2915
|
name: string;
|
|
2916
2916
|
};
|
|
2917
2917
|
/**
|
|
2918
|
-
* Per-statement envelope shape, pinned from the persisted fixture
|
|
2918
|
+
* Per-statement envelope shape, pinned from the persisted fixture — the
|
|
2919
2919
|
* engine-class metadata that isn't in the transform schema. "Full" statements
|
|
2920
2920
|
* (api_request, db ops, file ops) carry richer `input[]` entries and extra
|
|
2921
2921
|
* top-level keys; lean statements (math, array, object) carry none of these.
|
|
@@ -3281,14 +3281,11 @@ declare function microservice<const D extends MicroserviceDef>(def: D): D;
|
|
|
3281
3281
|
declare const microserviceKind: ObjectKind<MicroserviceDef, MicroserviceXdo>;
|
|
3282
3282
|
|
|
3283
3283
|
/**
|
|
3284
|
-
*
|
|
3285
|
-
*
|
|
3286
|
-
* Typed, namespaced factories for the declarative statement catalog (U9): every
|
|
3284
|
+
* Typed, namespaced factories for the declarative statement catalog: every
|
|
3287
3285
|
* generated statement is reachable + autocomplete-discoverable as
|
|
3288
3286
|
* `generated.<namespace>.<method>({…})` (e.g. `generated.math.add`,
|
|
3289
3287
|
* `generated.db.get`). The unified public surface is `s` in ../s.ts, which
|
|
3290
|
-
* merges these with the hand-authored control-flow specials.
|
|
3291
|
-
* `npm run codegen`.
|
|
3288
|
+
* merges these with the hand-authored control-flow specials.
|
|
3292
3289
|
*/
|
|
3293
3290
|
|
|
3294
3291
|
declare const generated: {
|
|
@@ -4677,7 +4674,7 @@ declare const generated: {
|
|
|
4677
4674
|
};
|
|
4678
4675
|
|
|
4679
4676
|
/**
|
|
4680
|
-
* Implied-input catalog per trigger `obj_type
|
|
4677
|
+
* Implied-input catalog per trigger `obj_type`. Xano trigger inputs are
|
|
4681
4678
|
* **fixed by type** — they are generated by `mvp:trigger_update_defaults` and
|
|
4682
4679
|
* cannot be edited in the UI. This module is the XanoTS mirror of that
|
|
4683
4680
|
* generator: `impliedInputs(objType)` returns the exact input array Xano stores
|
|
@@ -4690,9 +4687,7 @@ declare const generated: {
|
|
|
4690
4687
|
* Fields are built through the canonical `input.*` / `f.*` constructors + shared
|
|
4691
4688
|
* `encodeInput`, so they carry the same stored shape and defaults as every other
|
|
4692
4689
|
* XanoTS input (`customize:{}`, `_xsid:""`, numeric `market_item`) and cannot
|
|
4693
|
-
* drift from the field encoder.
|
|
4694
|
-
* the older `customize:""` parser-generation format; conformance compares
|
|
4695
|
-
* structurally, normalizing that legacy drift and the engine-assigned `_xsid`.
|
|
4690
|
+
* drift from the field encoder.
|
|
4696
4691
|
*/
|
|
4697
4692
|
|
|
4698
4693
|
/**
|
|
@@ -4713,7 +4708,7 @@ type TriggerInputObjType = "database" | "toolset" | "workspace" | "workspace_rea
|
|
|
4713
4708
|
* factories pass a typed handle `t` to `stack: (t) => [...]` (and `response:
|
|
4714
4709
|
* (t) => ...` on response-bearing types). Each member is a {@link FieldAccessor}:
|
|
4715
4710
|
* it is a {@link Value} referencing the whole input **and** callable for typed
|
|
4716
|
-
* column/child access — `t.new("email")` → `inp("new.email")
|
|
4711
|
+
* column/child access — `t.new("email")` → `inp("new.email")`. This
|
|
4717
4712
|
* mirrors the `auth("id")` callable-value precedent and keeps the
|
|
4718
4713
|
* `{value,tag,filters}` shape so it composes with `withFilters`.
|
|
4719
4714
|
*
|
|
@@ -4768,13 +4763,24 @@ interface RealtimeServerTriggerInputs {
|
|
|
4768
4763
|
/** The connecting client — `permissions` gates its realtime row/table access. */
|
|
4769
4764
|
client: RealtimeClient;
|
|
4770
4765
|
}
|
|
4771
|
-
/** Realtime channel lifecycle trigger inputs (join / leave). */
|
|
4766
|
+
/** Realtime channel lifecycle trigger inputs (join / leave / deliver). */
|
|
4772
4767
|
interface RealtimeChannelTriggerInputs {
|
|
4773
|
-
/** The membership action (`"join"` | `"leave"`). */
|
|
4768
|
+
/** The membership action (`"join"` | `"leave"` | `"deliver"`). */
|
|
4774
4769
|
action: Value;
|
|
4775
4770
|
/** The channel path the client addressed. */
|
|
4776
4771
|
channel: Value;
|
|
4777
|
-
/**
|
|
4772
|
+
/**
|
|
4773
|
+
* The message body on a `deliver` run, null on join/leave. It arrives NESTED,
|
|
4774
|
+
* so read a field as `t.payload("text")`. A flat `inp("text")` names an input
|
|
4775
|
+
* this trigger does not declare and RAISES at runtime, which for `deliver`
|
|
4776
|
+
* means the hook fails open and the recipient gets the original.
|
|
4777
|
+
*/
|
|
4778
|
+
payload: FieldAccessor;
|
|
4779
|
+
/**
|
|
4780
|
+
* The client — the JOINING client on join/leave, and the SENDING client on
|
|
4781
|
+
* `deliver` (the recipient that run is for is `s.realtime.get_session`).
|
|
4782
|
+
* `permissions` gates its realtime row/table access.
|
|
4783
|
+
*/
|
|
4778
4784
|
client: RealtimeClient;
|
|
4779
4785
|
}
|
|
4780
4786
|
/** Toolset trigger inputs (MCP server / agent). */
|
|
@@ -5050,7 +5056,7 @@ type RealtimeServerHandle = RealtimeServerDef & {
|
|
|
5050
5056
|
* connection hash — so pass `{ tenant }` explicitly there.
|
|
5051
5057
|
*
|
|
5052
5058
|
* IN A BROWSER BUNDLE, prefer the generated manifest: importing this def for
|
|
5053
|
-
* its `getUrl()` pulls the SDK runtime in with it (the same ~
|
|
5059
|
+
* its `getUrl()` pulls the SDK runtime in with it (the same ~267 kB floor a
|
|
5054
5060
|
* query def costs — the factory CALLS that build the def run at module load).
|
|
5055
5061
|
* `xanots routes <entry> --emit xano/routes.gen.ts` writes the identical
|
|
5056
5062
|
* address, tenant lift included, as `socketUrl("<server>", baseUrl)` in a file
|
|
@@ -5373,7 +5379,7 @@ declare function realtimeChannel<const I extends Record<string, InputDescriptor>
|
|
|
5373
5379
|
declare function realtimeChannelGuid(def: Pick<RealtimeChannelDef, "name" | "server" | "guid">): string;
|
|
5374
5380
|
|
|
5375
5381
|
/**
|
|
5376
|
-
* Trigger kinds
|
|
5382
|
+
* Trigger kinds. All 6 trigger types share ONE stored envelope
|
|
5377
5383
|
* discriminated by `obj_type` + a per-type `meta` block —
|
|
5378
5384
|
* confirmed against the Xano engine's stored trigger shape. The canonical `meta`
|
|
5379
5385
|
* carries all four action groups (database / toolset / workspace /
|
|
@@ -5419,8 +5425,7 @@ interface RealtimeActions {
|
|
|
5419
5425
|
* Same return shape as a channel `join`: `{ allowed: c.bool(true) }` or any truthy value
|
|
5420
5426
|
* admits, and an EMPTY OR FALSY return DENIES — including a gating trigger with
|
|
5421
5427
|
* no `response`, which returns nothing and so refuses every client. A CRASH also
|
|
5422
|
-
* DENIES:
|
|
5423
|
-
* it when the stack throws, because a gate that cannot answer must not admit.
|
|
5428
|
+
* DENIES: a gate that cannot answer must not admit.
|
|
5424
5429
|
*
|
|
5425
5430
|
* So both failure modes lock the door rather than open it, and the risk to plan
|
|
5426
5431
|
* for is a self-inflicted lockout — an unguarded drill into a `db.get` that
|
|
@@ -5449,16 +5454,24 @@ interface RealtimeServerActions {
|
|
|
5449
5454
|
* optional `reason` surfaces in the client's error frame) or any other truthy
|
|
5450
5455
|
* value to admit. AN EMPTY OR FALSY RETURN DENIES — a stack that just falls
|
|
5451
5456
|
* through, or a gating trigger with no `response`, refuses the join. A CRASH
|
|
5452
|
-
* DENIES TOO
|
|
5453
|
-
*
|
|
5454
|
-
*
|
|
5455
|
-
*
|
|
5456
|
-
*
|
|
5457
|
-
*
|
|
5458
|
-
* `
|
|
5459
|
-
*
|
|
5460
|
-
*
|
|
5461
|
-
*
|
|
5457
|
+
* DENIES TOO, which is the INVERSE of a normal message: a message whose
|
|
5458
|
+
* stack crashes still delivers, so one workspace bug cannot black-hole a
|
|
5459
|
+
* channel. Note the asymmetry with `deliver` below, which is a hook that
|
|
5460
|
+
* fails OPEN.
|
|
5461
|
+
*
|
|
5462
|
+
* A lifecycle trigger's inputs are PINNED to `action`/`channel`/`payload`/
|
|
5463
|
+
* `client`, so a channel path param is NOT among them: `inp("room_id")`
|
|
5464
|
+
* RAISES inside a gate, which crashes it and so refuses every client. Take
|
|
5465
|
+
* the param from `s.realtime.get_session` under `params`
|
|
5466
|
+
* (`ref("session.params.room_id")`) and the gate can decide per room. A
|
|
5467
|
+
* SERVER `connect`/`disconnect` trigger has no channel and so no params
|
|
5468
|
+
* at all.
|
|
5469
|
+
*
|
|
5470
|
+
* A gate also establishes NO auth, so `ref("auth.id")` reads 0 even for an
|
|
5471
|
+
* authenticated client — identity is `t.client("permissions.dbo_id")` (0 is
|
|
5472
|
+
* anonymous) or the session. And once the returned object carries an
|
|
5473
|
+
* `allowed` key, admission needs STRICTLY `true`: a computed `1` or `"yes"`
|
|
5474
|
+
* in that shape DENIES, so produce a real bool.
|
|
5462
5475
|
* - `leave` is OBSERVATIONAL (return ignored, throws swallowed).
|
|
5463
5476
|
* - `deliver` GATES delivery PER RECIPIENT — it runs once for each client the
|
|
5464
5477
|
* message is about to reach. It is the heaviest of the three by a wide
|
|
@@ -5473,7 +5486,7 @@ interface RealtimeServerActions {
|
|
|
5473
5486
|
* null instead.
|
|
5474
5487
|
*
|
|
5475
5488
|
* The delivered payload arrives NESTED under `payload`, so read
|
|
5476
|
-
* `
|
|
5489
|
+
* `t.payload("<field>")`. And the two identities differ: `t.client` is the
|
|
5477
5490
|
* SENDER, while `s.realtime.get_session` describes the RECIPIENT this run is
|
|
5478
5491
|
* for — per-viewer redaction needs both, and reaching for the wrong one is
|
|
5479
5492
|
* silent.
|
|
@@ -5932,7 +5945,7 @@ declare const apiGroupKind: ObjectKind<ApiGroupDef, ApiGroupXdo>;
|
|
|
5932
5945
|
declare function apiGroup(def: ApiGroupDef): ApiGroupDef;
|
|
5933
5946
|
|
|
5934
5947
|
/**
|
|
5935
|
-
* Query (API endpoint) kind
|
|
5948
|
+
* Query (API endpoint) kind → payload key `query`. Function-like
|
|
5936
5949
|
* (input/run/result) plus HTTP fields: `verb`, `app` (api_group binding),
|
|
5937
5950
|
* `auth`, `response_type`, `cache`, `output`. Validated against
|
|
5938
5951
|
* the Xano engine's persisted shape.
|
|
@@ -6097,7 +6110,7 @@ interface QueryDef<I extends Record<string, InputDescriptor> = Record<string, In
|
|
|
6097
6110
|
/**
|
|
6098
6111
|
* The endpoint's statement stack. Captured as the literal tuple `S` (via
|
|
6099
6112
|
* `query()`'s `const` inference) so `InferResponse` can trace a single-variable
|
|
6100
|
-
* response back to the branded `db.get`/`db.query` that bound it
|
|
6113
|
+
* response back to the branded `db.get`/`db.query` that bound it. A
|
|
6101
6114
|
* dynamically-built `Statement[]` widens `S` and the trace degrades to
|
|
6102
6115
|
* `unknown` — the override (`responseShape`) remains the escape hatch.
|
|
6103
6116
|
*/
|
|
@@ -6105,8 +6118,8 @@ interface QueryDef<I extends Record<string, InputDescriptor> = Record<string, In
|
|
|
6105
6118
|
/**
|
|
6106
6119
|
* The response assignment: a single {@link Value} (returned directly) or a
|
|
6107
6120
|
* record of named values (an object with those keys). Captured as the literal
|
|
6108
|
-
* `Resp` so `InferResponse` can auto-derive object-literal keys
|
|
6109
|
-
* the branded stack, trace a single-variable response
|
|
6121
|
+
* `Resp` so `InferResponse` can auto-derive object-literal keys and, with
|
|
6122
|
+
* the branded stack, trace a single-variable response.
|
|
6110
6123
|
*/
|
|
6111
6124
|
response?: Resp;
|
|
6112
6125
|
/**
|
|
@@ -6251,7 +6264,7 @@ declare const query: typeof queryImpl & {
|
|
|
6251
6264
|
};
|
|
6252
6265
|
|
|
6253
6266
|
/**
|
|
6254
|
-
* Task (scheduled/background job) kind
|
|
6267
|
+
* Task (scheduled/background job) kind → payload key `task`. Function-like
|
|
6255
6268
|
* `run[]` plus a `schedule[]` of cron-like entries. Validated against
|
|
6256
6269
|
* the Xano engine's persisted shape.
|
|
6257
6270
|
*/
|
|
@@ -6403,7 +6416,7 @@ declare const workflowTestKind: ObjectKind<WorkflowTestDef, WorkflowTestXdo>;
|
|
|
6403
6416
|
declare function workflowTest(def: WorkflowTestDef): WorkflowTestDef;
|
|
6404
6417
|
|
|
6405
6418
|
/**
|
|
6406
|
-
* Middleware kind
|
|
6419
|
+
* Middleware kind → payload key `middleware`. Function-like
|
|
6407
6420
|
* (input/run/result) plus `result_type` (merge|replace) and `exception`
|
|
6408
6421
|
* (silent|rethrow|critical). Validated against the Xano engine's persisted shape.
|
|
6409
6422
|
*/
|
|
@@ -6442,13 +6455,13 @@ type ResultStrategy = "merge" | "replace";
|
|
|
6442
6455
|
* author who writes a rate limiter and does not think about this field gets, by
|
|
6443
6456
|
* default, a limiter that does nothing and says nothing. An inert guard is
|
|
6444
6457
|
* worse than a loud one, so the safe reading is the default and the permissive
|
|
6445
|
-
* one is opt-in
|
|
6458
|
+
* one is opt-in.
|
|
6446
6459
|
*/
|
|
6447
6460
|
type ExceptionPolicy = "silent" | "rethrow" | "critical";
|
|
6448
6461
|
/**
|
|
6449
6462
|
* Generic over its branded stack tuple `S`, literal response `Resp`, and
|
|
6450
6463
|
* declared `Res`, so `InferResponse` can trace a response ref back to the
|
|
6451
|
-
* statement that bound it
|
|
6464
|
+
* statement that bound it. All default, so a bare `MiddlewareDef`
|
|
6452
6465
|
* is unchanged.
|
|
6453
6466
|
*
|
|
6454
6467
|
* No input generic, deliberately: a middleware's declared `input` is NEVER bound
|
|
@@ -6631,9 +6644,9 @@ type MessageDeliverTo = "channel" | "sender" | "others" | "explicit";
|
|
|
6631
6644
|
* a declared `Res` (the `responseShape` override). All default, so every existing
|
|
6632
6645
|
* use — a bare `RealtimeMessageDef` — works unchanged.
|
|
6633
6646
|
*
|
|
6634
|
-
*
|
|
6635
|
-
* non-tuple, so no `as` binding in it
|
|
6636
|
-
* handler's response
|
|
6647
|
+
* Carrying `I` alone is not enough. A `Statement[]` stack is a widened
|
|
6648
|
+
* non-tuple, so no `as` binding in it is visible and every `ref()` in a
|
|
6649
|
+
* handler's response bottoms out — and with no `responseShape` field there is
|
|
6637
6650
|
* no override either. That gap costs more here than on an HTTP kind: a realtime
|
|
6638
6651
|
* client's whole data path is the socket (the transcript hydrates a joiner, so
|
|
6639
6652
|
* there is deliberately no hydration endpoint to derive a shape from), which
|
|
@@ -6771,7 +6784,7 @@ declare const realtimeMessageKind: ObjectKind<AnyRealtimeMessageDef$1, RealtimeM
|
|
|
6771
6784
|
*
|
|
6772
6785
|
* The exact input map, stack tuple, and response are preserved on the return
|
|
6773
6786
|
* type, so `InferInput<typeof msg>` types what a client SENDS and
|
|
6774
|
-
* `InferResponse<typeof msg>` types what it RECEIVES
|
|
6787
|
+
* `InferResponse<typeof msg>` types what it RECEIVES.
|
|
6775
6788
|
*/
|
|
6776
6789
|
declare function realtimeMessage<const I extends Record<string, InputDescriptor>, Res = never, Resp extends ResponseDef = ResponseDef, const S extends readonly Statement[] = readonly []>(def: RealtimeMessageDef<I, Res, Resp, S>): RealtimeMessageDef<I, Res, Resp, S>;
|
|
6777
6790
|
|
|
@@ -6903,9 +6916,9 @@ declare function knowledge(def: KnowledgeDef): KnowledgeDef;
|
|
|
6903
6916
|
declare const knowledgeKind: ObjectKind<KnowledgeDef, KnowledgeXdo>;
|
|
6904
6917
|
|
|
6905
6918
|
/**
|
|
6906
|
-
* Workspace config kind
|
|
6919
|
+
* Workspace config kind → payload key `workspace` (singleton object, not
|
|
6907
6920
|
* an array). Emits the author-provided settings subset; the engine fills the
|
|
6908
|
-
* remaining server-managed fields on import
|
|
6921
|
+
* remaining server-managed fields on import. Authoring shape validated
|
|
6909
6922
|
* against the Xano engine's persisted workspace shape.
|
|
6910
6923
|
*
|
|
6911
6924
|
* Two blocks — `preferences` and `settings` — merge over a named engine default
|
|
@@ -6978,7 +6991,7 @@ interface WorkspaceDefaultsDef {
|
|
|
6978
6991
|
interface WorkspaceConfigDef {
|
|
6979
6992
|
/**
|
|
6980
6993
|
* OPTIONAL — omit it and the workspace inherits the name `workspace("…")`
|
|
6981
|
-
* already gave it
|
|
6994
|
+
* already gave it.
|
|
6982
6995
|
*
|
|
6983
6996
|
* There is exactly one config per workspace and the entry point names it, so
|
|
6984
6997
|
* restating it here was pure duplication that every documented example got
|
|
@@ -7065,7 +7078,7 @@ interface WorkspaceConfigDef {
|
|
|
7065
7078
|
* dropped, and an empty value is written as an empty string.
|
|
7066
7079
|
* - `release` (merge) is ADD-ONLY. It creates keys that do not yet exist and
|
|
7067
7080
|
* does NOT update or remove ones that do. Changing a value in code and
|
|
7068
|
-
* releasing leaves the live value as it was
|
|
7081
|
+
* releasing leaves the live value as it was.
|
|
7069
7082
|
* - `release --replace` replaces, but it rebuilds the whole workspace to do it.
|
|
7070
7083
|
*
|
|
7071
7084
|
* So a value you need to CHANGE on an instance workspace cannot be changed by
|
|
@@ -7309,7 +7322,7 @@ interface ManifestFilter {
|
|
|
7309
7322
|
/**
|
|
7310
7323
|
* Named, typed args (richly-specified filters only). `enum` carries the exact
|
|
7311
7324
|
* accepted spellings where the arg has a closed set — printed in place of the
|
|
7312
|
-
* bare word "enum", which told a reader nothing
|
|
7325
|
+
* bare word "enum", which told a reader nothing.
|
|
7313
7326
|
*/
|
|
7314
7327
|
args?: Array<{
|
|
7315
7328
|
name: string;
|
|
@@ -7466,7 +7479,7 @@ interface LockFile {
|
|
|
7466
7479
|
declare function emptyLock(): LockFile;
|
|
7467
7480
|
/**
|
|
7468
7481
|
* Parse + strictly validate lock file text. Every failure is a hard error
|
|
7469
|
-
*
|
|
7482
|
+
* — the caller must never fall back to an unlocked export when a lock
|
|
7470
7483
|
* file exists but is broken.
|
|
7471
7484
|
*/
|
|
7472
7485
|
declare function parseLock(text: string, path?: string): LockFile;
|
|
@@ -7508,7 +7521,7 @@ interface LockExportContext {
|
|
|
7508
7521
|
declare function createLockContext(lock?: LockFile): LockExportContext;
|
|
7509
7522
|
/**
|
|
7510
7523
|
* Record one emitted identity into `ctx.observed`, hard-erroring on an
|
|
7511
|
-
* explicit-vs-lock guid split
|
|
7524
|
+
* explicit-vs-lock guid split: within one bundle every reference resolves
|
|
7512
7525
|
* through the seeded lock, so an object whose payload guid disagrees with its
|
|
7513
7526
|
* lock entry would ship a bundle where references point at a guid the target
|
|
7514
7527
|
* no longer carries — never emit that silently.
|
|
@@ -7521,7 +7534,7 @@ interface RenameResult {
|
|
|
7521
7534
|
discardedNewcomer?: LockEntry;
|
|
7522
7535
|
}
|
|
7523
7536
|
/**
|
|
7524
|
-
* Move a lock entry to a new name keeping its identity values
|
|
7537
|
+
* Move a lock entry to a new name keeping its identity values, so the
|
|
7525
7538
|
* next export emits the ORIGINAL guid under the new name and the engine
|
|
7526
7539
|
* renames in place.
|
|
7527
7540
|
*
|
|
@@ -7553,7 +7566,7 @@ interface AdoptResult {
|
|
|
7553
7566
|
vaultCount: number;
|
|
7554
7567
|
}
|
|
7555
7568
|
/**
|
|
7556
|
-
* Seed/update the lock from a live engine `packageExport` bundle
|
|
7569
|
+
* Seed/update the lock from a live engine `packageExport` bundle —
|
|
7557
7570
|
* capturing the workspace's random guids and canonicals by `(type, name)` so
|
|
7558
7571
|
* an existing workspace can be adopted into code without a delete+create sync.
|
|
7559
7572
|
*
|
|
@@ -7580,7 +7593,7 @@ interface MergeResult {
|
|
|
7580
7593
|
*
|
|
7581
7594
|
* Observed values win field-by-field (an explicit in-code value updates the
|
|
7582
7595
|
* recorded one, per R2). Entries nothing matched are kept as orphans and
|
|
7583
|
-
* reported — renames are never guessed
|
|
7596
|
+
* reported — renames are never guessed — with one exception: an orphan
|
|
7584
7597
|
* whose GUID now belongs to a LIVE entry is dropped. That happens when a
|
|
7585
7598
|
* rename is reverted after a `lock rename` fix-up (the old name re-derives the
|
|
7586
7599
|
* pinned guid): keeping the orphan would wedge the lock on its own
|
|
@@ -7616,7 +7629,7 @@ interface Bundle {
|
|
|
7616
7629
|
sig: string;
|
|
7617
7630
|
}
|
|
7618
7631
|
/**
|
|
7619
|
-
* Iterative, like the guards' walkers
|
|
7632
|
+
* Iterative, like the guards' walkers, and for the same reason: what
|
|
7620
7633
|
* is being crossed here is the author's own structure — a deep expression tree,
|
|
7621
7634
|
* or a `raw()` envelope carrying whatever the engine handed back on a pull — and
|
|
7622
7635
|
* a recursive encoder turns that into a bare `RangeError` at `export()`. Depth
|
|
@@ -7658,7 +7671,7 @@ interface ResolvedKnowledge {
|
|
|
7658
7671
|
|
|
7659
7672
|
/**
|
|
7660
7673
|
* The register methods take the WIDEST instantiation of each def type, not the
|
|
7661
|
-
* bare name
|
|
7674
|
+
* bare name.
|
|
7662
7675
|
*
|
|
7663
7676
|
* A def's `Res` parameter surfaces as `responseShape?: Res` and defaults to
|
|
7664
7677
|
* `never`, so the bare `FunctionDef` — the spelling the issue proposed —
|
|
@@ -7667,7 +7680,7 @@ interface ResolvedKnowledge {
|
|
|
7667
7680
|
* never` and the registration they were already making stops compiling. Pinning
|
|
7668
7681
|
* `Res` to `unknown` (and every other parameter to its own constraint) accepts
|
|
7669
7682
|
* every instantiation while still rejecting an object that is not that kind of
|
|
7670
|
-
* def at all
|
|
7683
|
+
* def at all.
|
|
7671
7684
|
*/
|
|
7672
7685
|
type AnyInputs = Record<string, InputDescriptor>;
|
|
7673
7686
|
type AnyStack = readonly Statement[];
|
|
@@ -7707,7 +7720,7 @@ declare class Xano {
|
|
|
7707
7720
|
register(kindName: string, defOrDefs: unknown): this;
|
|
7708
7721
|
/**
|
|
7709
7722
|
* Every def object handed to {@link register}, by identity, so the SAME one
|
|
7710
|
-
* registered twice is caught at the call that did it
|
|
7723
|
+
* registered twice is caught at the call that did it.
|
|
7711
7724
|
*
|
|
7712
7725
|
* Identity, not structure. Two separately constructed defs sharing a name are
|
|
7713
7726
|
* a genuine collision, and the guid check at export already diagnoses that
|
|
@@ -7733,7 +7746,7 @@ declare class Xano {
|
|
|
7733
7746
|
* what `workspace("my-app")` set — so the natural chain
|
|
7734
7747
|
* `workspace("my-app").registerWorkspace(workspaceConfig({ history }))` no
|
|
7735
7748
|
* longer makes an author restate a name this registry has held since its
|
|
7736
|
-
* first call
|
|
7749
|
+
* first call. An explicit `name` still wins, and a rename this way is
|
|
7737
7750
|
* a rename of the workspace.
|
|
7738
7751
|
*/
|
|
7739
7752
|
registerWorkspace(def: WorkspaceConfigDef): this;
|
|
@@ -7795,7 +7808,7 @@ declare class Xano {
|
|
|
7795
7808
|
* With `options.strict`, every build WARNING fails the export instead of
|
|
7796
7809
|
* printing — the shapes that deploy clean and then lose data or return the
|
|
7797
7810
|
* wrong rows. Nothing about the emitted bundle changes; it either exports or
|
|
7798
|
-
* it does not
|
|
7811
|
+
* it does not.
|
|
7799
7812
|
*/
|
|
7800
7813
|
export(options?: {
|
|
7801
7814
|
lock?: LockExportContext;
|
|
@@ -7828,7 +7841,7 @@ declare class Xano {
|
|
|
7828
7841
|
private validateQueryAuth;
|
|
7829
7842
|
/**
|
|
7830
7843
|
* Warn about an `auth()`-keyed middleware **directly attached** to a host where
|
|
7831
|
-
* `auth()` may resolve to `null
|
|
7844
|
+
* `auth()` may resolve to `null`.
|
|
7832
7845
|
*
|
|
7833
7846
|
* The footgun: a rate limiter keyed by `auth("id")` is the canonical middleware,
|
|
7834
7847
|
* but attach it to a host with no authenticated caller and `auth()` silently
|
|
@@ -7843,7 +7856,7 @@ declare class Xano {
|
|
|
7843
7856
|
* false positives on legitimate use. The warning names the host and reason so
|
|
7844
7857
|
* the author can confirm intent, vary the key, or move to an authenticated host.
|
|
7845
7858
|
*
|
|
7846
|
-
* Scope: the host's EFFECTIVE chain, across all three tiers
|
|
7859
|
+
* Scope: the host's EFFECTIVE chain, across all three tiers. The
|
|
7847
7860
|
* guard used to see only a host's own `middleware.pre`/`post`, so an author who
|
|
7848
7861
|
* DRY'd a per-user limiter up to `apiGroup({ middleware })` or to the workspace
|
|
7849
7862
|
* tier silently reintroduced the shared bucket — the same collapse, attached
|
|
@@ -7930,7 +7943,7 @@ declare function emitBundle(xano: Xano, opts?: {
|
|
|
7930
7943
|
* choke point instead makes reference and target agree everywhere by
|
|
7931
7944
|
* construction, with zero changes at call sites.
|
|
7932
7945
|
*
|
|
7933
|
-
* That yields the seeding contract
|
|
7946
|
+
* That yields the seeding contract: **seed once per process, BEFORE any
|
|
7934
7947
|
* def module is evaluated.** Node's module cache means seeding after defs have
|
|
7935
7948
|
* loaded is a silent no-op for already-baked references. The CLI honors this
|
|
7936
7949
|
* automatically (it seeds before importing the workspace entry); programmatic
|