@xanots/sdk 0.0.3 → 0.0.5
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 +79 -0
- package/README.md +38 -1
- package/dist/.build-fingerprint +1 -1
- package/dist/agent-file-refresh-IJ7GN2FJ.js +17 -0
- package/dist/bin.js +12 -153
- package/dist/{capture-HUV5BNTC.js → capture-7PO6SGB4.js} +2 -2
- package/dist/{chunk-CMZLPTGW.js → chunk-7SISR3CS.js} +2 -2
- package/dist/{chunk-XQ22GLYS.js → chunk-AAFBSOSD.js} +6 -6
- package/dist/{chunk-BT2CSEC5.js → chunk-APOR6TCV.js} +4 -4
- package/dist/{chunk-55VHDNW5.js → chunk-BPEEGJJA.js} +108 -3
- package/dist/{chunk-U3G2UW65.js → chunk-CYJ7R3AD.js} +3 -3
- package/dist/{agent-file-refresh-6M5M7T24.js → chunk-D6OGU2AI.js} +5 -6
- package/dist/chunk-ERQZFWIW.js +22 -0
- package/dist/{chunk-DYCLVQXW.js → chunk-F5T45NAM.js} +31 -2
- package/dist/{chunk-TQUO2OXY.js → chunk-FN4OQT2J.js} +4 -4
- package/dist/{chunk-6USV65XA.js → chunk-IVP6TS26.js} +2 -2
- package/dist/{chunk-HQ2CBRVI.js → chunk-KXCPZUUM.js} +10 -8
- package/dist/{chunk-7REDODS2.js → chunk-LLWK6H77.js} +20 -2
- package/dist/{chunk-HJPTWBLH.js → chunk-MFIHIS6B.js} +2 -2
- package/dist/{chunk-3NFUWXOC.js → chunk-MS3BRZAZ.js} +146 -45
- package/dist/{chunk-2V4YE6QC.js → chunk-OARSPAIE.js} +112 -21
- package/dist/{chunk-7DKX2SPN.js → chunk-OR43PDCW.js} +4 -4
- package/dist/chunk-PGBK64U5.js +59 -0
- package/dist/{chunk-F6JCFRKO.js → chunk-PXXLBXOP.js} +2 -2
- package/dist/{chunk-W2G2WPTB.js → chunk-QA5ICJ4M.js} +3 -3
- package/dist/{chunk-YZ4GU6F5.js → chunk-QUUB7HYK.js} +5 -838
- package/dist/{chunk-C56BC2FY.js → chunk-SG4UBJ47.js} +2 -2
- package/dist/{chunk-76QBEIGO.js → chunk-T4XPCJRF.js} +3 -2
- package/dist/{chunk-VTIL47DT.js → chunk-W5NOKYEG.js} +6 -2
- package/dist/chunk-WGDAOOXG.js +845 -0
- package/dist/{chunk-DGSF2Q5H.js → chunk-WJYB7DSI.js} +2 -2
- package/dist/{chunk-4YMD2OOZ.js → chunk-XHEXOES3.js} +1 -1
- package/dist/{chunk-4HT3BNZ7.js → chunk-YUBJLB6G.js} +10 -2
- package/dist/{chunk-5L4X5LS6.js → chunk-YUPQOLFX.js} +77 -2
- package/dist/chunk-ZGA5MUNC.js +173 -0
- package/dist/{chunk-P3TTMWUP.js → chunk-ZOYMZZ3S.js} +8 -1
- package/dist/chunk-ZSYZTGJH.js +81 -0
- package/dist/cli.d.ts +14 -1
- package/dist/cli.js +8 -8
- package/dist/codegen-command-BLOS3GR3.js +43 -0
- package/dist/{completion-BKAFCZBE.js → completion-GHP5RRLQ.js} +2 -2
- package/dist/{deploy-command-4R6BYC6G.js → deploy-command-XOH76USO.js} +27 -27
- package/dist/{env-target-XWS2ZZ2Y.js → env-target-POGJMD6Q.js} +7 -7
- package/dist/{ephemeral-command-JL4TPIRQ.js → ephemeral-command-46SL27GJ.js} +25 -25
- package/dist/index.d.ts +2 -2
- package/dist/index.js +13 -7
- package/dist/init-command-NCRPVFGE.js +30 -0
- package/dist/internal.d.ts +2 -2
- package/dist/internal.js +50 -5
- package/dist/{io-AMIKRLPC.js → io-7VIA5SON.js} +3 -3
- package/dist/{live-diff-RXSJCVJ7.js → live-diff-FP4SFNT4.js} +2 -2
- package/dist/{lock-3CVKALKT.js → lock-KXOJIGCG.js} +2 -2
- package/dist/{lock-commands-XOYS75YQ.js → lock-commands-6UONZW26.js} +9 -9
- package/dist/{login-command-ACJF6KWQ.js → login-command-SG7IWTHW.js} +140 -37
- package/dist/{logout-command-MX3MJS5U.js → logout-command-J2AG5NKC.js} +3 -3
- package/dist/{loop-SAWAOUFO.js → loop-7SAIGRCZ.js} +3 -3
- package/dist/{marketplace-command-UVV3XAOL.js → marketplace-command-NKTQ3VPS.js} +11 -25
- package/dist/meta-client-OW5WKWW7.js +1 -1
- package/dist/node.d.ts +2 -2
- package/dist/node.js +18 -12
- package/dist/onboard-command-EHOHKQQU.js +36 -0
- package/dist/{profile-command-SWJ3SPKR.js → profile-command-ZPC2DPFV.js} +6 -6
- package/dist/{release-command-HZUY2XZX.js → release-command-FKQ6E3TD.js} +25 -25
- package/dist/{sandbox-details-command-HJE5SPVG.js → sandbox-details-command-DMY2KGA2.js} +5 -5
- package/dist/{sandbox-export-command-QCJY4GMV.js → sandbox-export-command-R6QMEK3D.js} +8 -8
- package/dist/scaffold.js +4 -2
- package/dist/{store-g45zwB33.d.ts → store-BJONDJoZ.d.ts} +171 -2
- package/dist/{test-command-72Y5S22H.js → test-command-56IAEYHX.js} +11 -11
- package/dist/upgrade-command-M2DZ3ZPD.js +177 -0
- package/dist/{validate-command-KDGH537H.js → validate-command-CIBQJND7.js} +12 -12
- package/dist/{workspace-command-ICSI6PKO.js → workspace-command-HZS43PHJ.js} +28 -27
- package/dist/workspace-export-AJMGN3CQ.js +1 -1
- package/guides/README.md +30 -0
- package/guides/authoring.md +642 -0
- package/guides/cli.md +192 -0
- package/guides/codegen.md +83 -0
- package/guides/coverage.md +67 -0
- package/guides/deploying.md +358 -0
- package/guides/environment.md +132 -0
- package/guides/object-kinds.md +376 -0
- package/guides/project-structure.md +43 -0
- package/guides/scaffold.md +198 -0
- package/guides/typed-frontend.md +201 -0
- package/llms/kinds-knowledge.md +20 -0
- package/llms/object-kinds.md +1 -0
- package/llms-full.txt +25 -2
- package/llms.txt +3 -2
- package/manifest.json +31 -4
- package/package.json +5 -2
- package/dist/chunk-WUSKBXXD.js +0 -25
- package/dist/chunk-ZO3HJOCJ.js +0 -29
- package/dist/codegen-command-FIADGXRN.js +0 -42
- package/dist/init-command-LOK75W64.js +0 -29
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# The typed frontend surface
|
|
2
|
+
|
|
3
|
+
Every type and helper a frontend gets from a deployed def — path resolution, input and response inference, and the two ways to pay for it.
|
|
4
|
+
|
|
5
|
+
## Endpoint names, path params, and encoding
|
|
6
|
+
|
|
7
|
+
- **URL path params** → name the endpoint with `{param}` segments and declare an input per
|
|
8
|
+
segment. `getPath({ params })` fills them, with the keys typed from the name itself:
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
const getPost = query({
|
|
12
|
+
name: "blog/{slug}/review/{review_id}", // segments chain; no wildcards
|
|
13
|
+
verb: "GET",
|
|
14
|
+
apiGroup: api,
|
|
15
|
+
input: { slug: input.text(), review_id: input.int(), verbose: input.bool() },
|
|
16
|
+
stack: [s.db.get({ table: post, fieldName: "slug", fieldValue: inp("slug"), as: "row" })],
|
|
17
|
+
response: ref("row"),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
getPost.getPath({ params: { slug: "hello", review_id: 7 } });
|
|
21
|
+
// → "/api:<canonical>/blog/hello/review/7"
|
|
22
|
+
getPost.toSearchParams({ verbose: true }); // → "verbose=true" (path params dropped)
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Every `{param}` must have a matching input or `query()` throws — Xano treats an unbound
|
|
26
|
+
marker as inert route text, so the endpoint would answer on the path and see nothing.
|
|
27
|
+
Inputs that aren't in the path (`verbose`) stay ordinary query-string params. Never
|
|
28
|
+
interpolate the path by hand: `getPath` percent-encodes each value, so a `?`, `#` or space
|
|
29
|
+
stays inside its segment instead of restructuring the URL, and it throws on the two values
|
|
30
|
+
encoding can't contain — one holding `/`, and one that *is* `.` or `..` (a URL parser drops
|
|
31
|
+
those before routing, addressing a different endpoint). `realtimeChannel()` paths work
|
|
32
|
+
identically, minus the encoding: a channel address is matched literally, not parsed as a URL.
|
|
33
|
+
- **`InferRow<typeof post>`** → the table's row type. Rename or retype a column and every
|
|
34
|
+
consumer breaks at compile time — exactly where you want it.
|
|
35
|
+
- **`InferResponse<typeof someQuery>`** → the endpoint's **response** type, closing the round
|
|
36
|
+
trip. It auto-derives the common shapes with no codegen: an object-literal response yields
|
|
37
|
+
those keys, and a query that returns a variable filled by a db op derives that op's result —
|
|
38
|
+
the full row for `db.add`/`db.edit`/`db.patch`/`db.add_or_edit` (→ `Row` — each binds the
|
|
39
|
+
full written row rather than null, so it stays non-nullable; a genuine miss throws instead of
|
|
40
|
+
yielding null — `NotFound`/404 for `edit`/`patch`, a unique-constraint error for `add`, while
|
|
41
|
+
`add_or_edit` upserts and never misses), `Row | null` for `db.get` (it binds
|
|
42
|
+
`null` on a miss rather than throwing — handle the not-found path), a row list for
|
|
43
|
+
|
|
44
|
+
## Inferring the response type
|
|
45
|
+
|
|
46
|
+
`db.query`/`db.bulk.patch` (→ `Row[]`), a `boolean` for `db.has`, a `number` count for
|
|
47
|
+
`db.bulk.delete`, and a `get`/`query` `output: [...]` selection narrows to a `Pick` (still
|
|
48
|
+
`| null` for `get`). A dotted entry selects sub-keys of an object column
|
|
49
|
+
(`output: ["id", "meta.url"]`, on a statement or an addon); the narrowing keys off the
|
|
50
|
+
path's root, since an object column's sub-keys aren't declared in the schema.
|
|
51
|
+
Where the shape isn't statically knowable — a value reshaped by a filter/lambda, built by
|
|
52
|
+
control flow, or from an op the engine itself leaves untyped (`db.del`, `db.bulk.add`/`bulk.update`,
|
|
53
|
+
raw `direct_query`) — it resolves to `unknown`; declare `responseShape` to close it.
|
|
54
|
+
In an object-literal response the **keys** are always known, but a **value** is typed only
|
|
55
|
+
when it traces to a binding: `response: { success: c.bool(true) }` derives
|
|
56
|
+
`{ success: unknown }`, not `{ success: boolean }`. A constant carries no reference to
|
|
57
|
+
follow. Reach for `responseShape` when a client needs those keys typed.
|
|
58
|
+
A **nested** member resolves by those same rules, to any depth, in either spelling —
|
|
59
|
+
`response: { user: obj({ id: ref("row.id") }) }` and the raw literal
|
|
60
|
+
`response: { user: { id: ref("row.id") } }` both derive `{ user: { id: number | null } }`.
|
|
61
|
+
A **call** carries the shape across: `s.function.call`/`s.function.run`, `s.tool.call` and
|
|
62
|
+
`s.api.call` (workflow-test only, above) given a def **handle** bind their `as` with the
|
|
63
|
+
target's own `InferResponse`,
|
|
64
|
+
so `ref("discount_result.discount_cents")` in the caller types to that field instead of
|
|
65
|
+
`unknown`. What the target resolves to is what propagates, so declaring `responseShape` on
|
|
66
|
+
the **target** fixes every caller at once. A target named by *string* has no def to read and
|
|
67
|
+
stays `unknown`, as does an async `s.function.run` (it binds a job handle, not the result).
|
|
68
|
+
The same derivation runs on every response-bearing kind — `query()`, `defineFunction()`,
|
|
69
|
+
`realtimeMessage()`, `tool()`, `middleware()`, and the response-bearing triggers — and each
|
|
70
|
+
of them takes `responseShape`. A trigger builds its stack and response through *callbacks*
|
|
71
|
+
(`stack: (t) => [...]`), and the trace follows through them. This matters most where a
|
|
72
|
+
handler's response is the only type a client has: a realtime message's broadcast payload,
|
|
73
|
+
or a channel `deliver` trigger's return, which is that recipient's copy of the message.
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import { listPosts, getPost } from "../xano/index.js";
|
|
77
|
+
import type { InferResponse } from "@xanots/sdk";
|
|
78
|
+
|
|
79
|
+
type Posts = InferResponse<typeof listPosts>; // Post[] — derived from the db.query it returns
|
|
80
|
+
type Post = InferResponse<typeof getPost>; // Post | null — a db.get misses to null
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
For a **computed or multi-key object response**, author it as a *record of values* —
|
|
84
|
+
`response: { success: c.bool(true), id: inp("id") }` — **not** `c.obj({ ... })`. `c.obj` builds a
|
|
85
|
+
*constant*, so a tagged value nested inside it would serialize as internal representation the
|
|
86
|
+
engine can't decode (a runtime 500); nesting one is now a compile error that points you at the
|
|
87
|
+
record form (issue #42). A **nested plain object** in a record
|
|
88
|
+
response (`response: { user: { id: ref("u"), age: 3 } }`) is auto-wrapped for you — no manual
|
|
89
|
+
`obj({ ... })` — and raw literals in a call/agent `input` map coerce too
|
|
90
|
+
(`s.function.run({ fn, input: { max_age_days: 3 } })` — no `c.int(3)`).
|
|
91
|
+
|
|
92
|
+
When a response is filtered, computed, or otherwise opaque to the static walk, declare it once
|
|
93
|
+
on the query and every caller derives from that single source of truth:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
const getPost = query({
|
|
97
|
+
verb: "GET", apiGroup: blog, name: "get_post",
|
|
98
|
+
input: { id: input.int({ required: true }) },
|
|
99
|
+
stack: [s.db.query({ table: post, where: expr(col("id"), "=", inp("id")), as: "rows" })],
|
|
100
|
+
// A filtered response is opaque to the static walk, so derivation is `unknown`.
|
|
101
|
+
response: withFilters(ref("rows"), fl.first()),
|
|
102
|
+
responseShape: null as InferRow<typeof post> | null, // declare the real shape once
|
|
103
|
+
});
|
|
104
|
+
type MaybePost = InferResponse<typeof getPost>; // InferRow<typeof post> | null
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
(A plain `response: ref("row")` off a `s.db.get` needs no `responseShape` — it already
|
|
108
|
+
derives `InferRow<typeof post> | null`, since `db.get` misses to `null`.)
|
|
109
|
+
|
|
110
|
+
**Factoring statements into a helper.** The trace walks the stack's *tuple*, so spreading a
|
|
111
|
+
helper typed `Statement[]` widens the stack and nothing in it resolves any more — the response
|
|
112
|
+
types as `StackTupleWidened`, which names the cause. Return `statements(...)` from the helper
|
|
113
|
+
and the tuple survives the spread:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
import { statements } from "@xanots/sdk";
|
|
117
|
+
|
|
118
|
+
function assertOk(v: string) { // no `: Statement[]` annotation
|
|
119
|
+
return statements(s.lambda({ ... }), s.precondition({ ... }));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
stack: [...assertOk("res"), s.db.add({ table: post, row, as: "created" })],
|
|
123
|
+
response: ref("created"), // still traced
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Fixed arity only — a helper that builds its array in a loop can't be a tuple, so declare
|
|
127
|
+
`responseShape` there.
|
|
128
|
+
|
|
129
|
+
This mirrors how the Xano engine itself derives an endpoint's response schema (a static walk of
|
|
130
|
+
the stack), so what you get in the type is what the endpoint actually returns — and it degrades
|
|
131
|
+
to `unknown` in exactly the cases the engine can't resolve either.
|
|
132
|
+
|
|
133
|
+
A GET endpoint carries its inputs in the query string rather than a JSON body:
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
import { getSnippet } from "../xano/index.js";
|
|
137
|
+
import { query, type InferInput } from "@xanots/sdk";
|
|
138
|
+
|
|
139
|
+
const BASE = "https://your-instance.xano.io";
|
|
140
|
+
|
|
141
|
+
async function fetchSnippet(id: number) {
|
|
142
|
+
const params = { id } satisfies InferInput<typeof getSnippet>; // { id: number }
|
|
143
|
+
const res = await fetch(`${BASE}${getSnippet.getPath()}?${query.toSearchParams(params)}`);
|
|
144
|
+
return res.json();
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The `@xanots/sdk` entry has **zero Node dependencies**, so importing your workspace
|
|
149
|
+
graph into a browser bundle just works. The `node:fs`-backed emitters live in the
|
|
150
|
+
separate `@xanots/sdk/node` entry a frontend never pulls in.
|
|
151
|
+
|
|
152
|
+
## Bundle size, and the route manifest
|
|
153
|
+
|
|
154
|
+
**Bundle size & tree-shaking.** `@xanots/sdk` is `sideEffects: false`, so a bundler drops
|
|
155
|
+
the SDK exports your frontend doesn't use. But importing a query **def** for its `getPath()`
|
|
156
|
+
also pulls whatever its `stack` builds — the `s.*`/`c.*` factory *calls* run at module load
|
|
157
|
+
to construct the def, so they can't be tree-shaken out. Types are free (`InferInput`/
|
|
158
|
+
`InferRow` erase to nothing — use `import type`). That cost is a **floor**, not a function of
|
|
159
|
+
how lean the def is. Measured on a Vite lib build against the published package: one
|
|
160
|
+
`apiGroup` + one empty `query`, imported for a single `getPath()`, is **289 kB minified
|
|
161
|
+
(57 kB gzipped)** against 56 B for a hand-written path string. A realistic def — two
|
|
162
|
+
tables, a foreign key, a typed input, a `db.query` with a `where` and a sort, plus a
|
|
163
|
+
second endpoint — measures 290 kB. That 1 kB spread is the point: the floor is the SDK
|
|
164
|
+
runtime itself, so splitting modules or simplifying a def does not move it, and the cost
|
|
165
|
+
is paid by importing any def at all.
|
|
166
|
+
|
|
167
|
+
**Generate a route manifest instead.** It keeps the derived-not-hardcoded contract at
|
|
168
|
+
almost no bundle cost:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
xanots paths ./xano/index.ts --emit xano/routes.gen.ts
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
The emitted file is plain data plus one interpolator and imports nothing at all — the same
|
|
175
|
+
app builds to 1.3 kB, a 214x saving, with no SDK code in the output. Route names and their `{param}` keys are still checked at compile
|
|
176
|
+
time, so a backend rename is a compile error rather than a 404:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
import { routePath, ROUTES } from "../xano/routes.gen";
|
|
180
|
+
|
|
181
|
+
fetch(BASE + routePath("blog/{slug}", { slug }), { method: ROUTES["blog/{slug}"].verb });
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Realtime is in the same file when the workspace has any: `socketUrl(server, baseUrl)` for the
|
|
185
|
+
websocket URL and `channelPath(channel, params)` for the path a frame's `channel` field takes,
|
|
186
|
+
both keyed and `{param}`-checked exactly like the routes. `socketUrl` is the equivalent of
|
|
187
|
+
`realtimeServer().getUrl()` down to the tenant rule — a base URL that names a tenant
|
|
188
|
+
(`https://host/tenant/ab-cd`, what deploy injects as `window.XANO_HOST`) is rewritten to the
|
|
189
|
+
socket's own `wss://host/ws/ab-cd:<canonical>` form, which is the one address a frontend has no
|
|
190
|
+
way to reconstruct. Resolve once, from the `https://` base — feeding a resolved socket URL back
|
|
191
|
+
in as a `baseUrl` throws rather than append a second `/ws/…`:
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
import { socketUrl, channelPath } from "../xano/routes.gen";
|
|
195
|
+
|
|
196
|
+
const ws = new WebSocket(socketUrl("chat", window.XANO_HOST), token);
|
|
197
|
+
ws.send(JSON.stringify({ action: "join", channel: channelPath("rooms/{room_id}", { room_id }) }));
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Add `--strict` in CI to fail when the committed manifest is out of date. A hand-typed
|
|
201
|
+
`ROUTES` table is the option that gives up both the bundle saving and the rename safety.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Knowledge def shape
|
|
2
|
+
|
|
3
|
+
> Read when the workspace defines a `knowledge()` item — the markdown its AI agents read.
|
|
4
|
+
|
|
5
|
+
- `knowledge({ name, description?, type?, mode?, enabled?, body, refs?, guid?, tags? })` — markdown the workspace's AI agents read before they act. Takes `registerKnowledge`.
|
|
6
|
+
- `body` (REQUIRED): `knowledgeFile("./runbook.md", import.meta.url)` — a path to a real markdown FILE. There is no inline-string form. The path resolves relative to the MODULE THAT DECLARES the item, not the process working directory and not the workspace entry; `import.meta.url` is required and is what makes that true.
|
|
7
|
+
- `refs?`: `knowledgeDir("./runbook", import.meta.url)` — a directory whose WHOLE tree ships as reference files, recursively, POSIX-relative paths preserved. Keep the body OUT of that directory: everything under it is collected, so a body beside its refs would ship as one of its own reference files.
|
|
8
|
+
- `type?`: `"skill"` (default) | `"doc"` | `"agents.md"`. `skill` and `doc` differ in how they are filed, not in what an agent receives.
|
|
9
|
+
- `mode?`: `"auto"` (default) | `"always"` | `"referenced"`.
|
|
10
|
+
- `enabled?` defaults `true`. A disabled item is stored and never reaches an agent.
|
|
11
|
+
|
|
12
|
+
### What reaches the agent
|
|
13
|
+
|
|
14
|
+
- `type: "agents.md"` — full body on EVERY turn, whatever `mode` says. At most ONE per workspace; a second is an export error. Setting `mode` on one warns, because nothing reads it.
|
|
15
|
+
- `mode: "always"` — full body on every turn.
|
|
16
|
+
- `mode: "referenced"` — full body only on turns whose message names the item (bare name or `@name`).
|
|
17
|
+
- `mode: "auto"` — name and `description` only; the agent loads the body when a request matches.
|
|
18
|
+
- Reference files are never injected wholesale — an agent searches them on demand. That is what makes a large `mode: "auto"` item cheap.
|
|
19
|
+
- ⚠ `mode: "always"` on a long body spends its whole length on every request, and nothing in the types says so. `"auto"` is the default for that reason. For an `auto` item `description` is ALL the agent sees until it decides to load the body, so write it to be matched against a request rather than as a title.
|
|
20
|
+
- `name` takes letters, digits, and `/ _ - { } . ` or a space; anything else is an export error.
|
package/llms/object-kinds.md
CHANGED
|
@@ -28,4 +28,5 @@ Author with the factory, register on the Xano instance, lands under the payload
|
|
|
28
28
|
- channel: `realtimeChannel` → `Xano.registerRealtimeChannels` → payload `channel` — A realtime channel: a joinable path on a realtime server (`rooms/{room_id}`) with typed path params, join/publish policy, a client-visible conversation transcript, and delivery semantics. Owns message handlers. Returns a handle with `getChannel(params)` for the path a client joins.
|
|
29
29
|
- message: `realtimeMessage` → `Xano.registerRealtimeMessages` → payload `message` — A realtime message handler: a named message type on a channel with its own typed payload and stack — the realtime analogue of a query. Pass the `realtimeChannel()` handle as `channel` and the owning server comes with it.
|
|
30
30
|
- microservice: `microservice` → `Xano.registerMicroservices` → payload `microservice` — A container workload deployed alongside the workspace, called from a stack with `s.microservice.request`. Two mutually exclusive shapes via `kind`: `builtin` declares containers (image/ports/resources/env/command/args) plus optional `ingresses`, and `helm` points at a chart and its `values` — passing both throws. EARLY SURFACE, expected to change — every export of a workspace declaring one prints a notice saying so. `configs`/`volumes` are typed and `@deprecated` but NOT deployable: the engine rejects an import carrying either, so `export()` fails the build rather than letting the deploy fatal. Put a value the workload reads in a container's `env`, and storage in a container's own `volumes` (`emptyDir`/`persistent`/`config`). Container names are free-form — they need not match the microservice name, which is what a stack addresses. SECRETS RIDE ALONG — `chart.values` and `registryAuth.dockerconfigjson` are carried into the bundle, and into a pulled tree, verbatim (they must be, or a pulled microservice could not be redeployed). Both are stored strings with NO deploy-time indirection: `process.env.X` in the def resolves at EXPORT and writes the literal into the bundle, so it is not a way to keep the credential out. Either leave `registryAuth` unset (public image, or a credential attached outside this workspace) or treat the bundle and any pulled tree as secret material — keep them out of git, or rotate after. Export prints a notice per microservice carrying either field; `--strict` does not promote it. For a secret a STACK reads, the mapped surface is `workspaceConfig({ env })` + `env("NAME")`.
|
|
31
|
+
- knowledge: `knowledge` → `Xano.registerKnowledge` → payload `knowledge` — Markdown the workspace's AI agents read before they act — an `agents.md` of standing instructions, a `skill`, or a `doc`. The body is a real markdown FILE via `knowledgeFile("./x.md", import.meta.url)`, and `mode` decides how much of it reaches the agent.
|
|
31
32
|
- workspace: `workspaceConfig` → `Xano.registerWorkspace` → payload `workspace` — Workspace-level configuration such as default middleware chains and request-history defaults per host kind.
|
package/llms-full.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# xanots v0.0.
|
|
1
|
+
# xanots v0.0.5
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.
|
|
4
4
|
|
|
@@ -6,7 +6,7 @@ Author a Xano workspace in TypeScript: build typed objects, register them on a
|
|
|
6
6
|
`new Xano()` instance, and call `.export()` to get one importable bundle. Compile
|
|
7
7
|
with `xanots export ./xano/index.js`.
|
|
8
8
|
|
|
9
|
-
Coverage: object kinds
|
|
9
|
+
Coverage: object kinds 25/31, statement surfaces 214/214, filters 226 (226 typed).
|
|
10
10
|
Not authorable here: branch, market_item, realtime_channel, run.job, run.service, tablemap — these cannot be authored and do not survive a pull; see `coverage.objectKinds.unmodeled` in `manifest.json`.
|
|
11
11
|
|
|
12
12
|
This file is the whole always-read surface: the mental model, the deploy contract,
|
|
@@ -32,6 +32,7 @@ that wants one fetch, not for an agent that can open the two files it needs.
|
|
|
32
32
|
- [Core def shapes](llms/kinds-core.md): Read when authoring a function, query, api group, task, workflow test, middleware, or tool — and for the `response` and `expr` shapes every one of them uses.
|
|
33
33
|
- [Saved unit tests, assertions, and mocks](llms/tests.md): Read when authoring a `workflowTest()` stack, when a query/function/middleware carries `tests`, when a statement should mock a value, or when running a deployed environment's tests.
|
|
34
34
|
- [Agent and MCP def shapes](llms/kinds-agent-mcp.md): Read when the workspace defines an `agent()` or an `mcpServer()`.
|
|
35
|
+
- [Knowledge def shape](llms/kinds-knowledge.md): Read when the workspace defines a `knowledge()` item — the markdown its AI agents read.
|
|
35
36
|
- [Realtime def shapes](llms/kinds-realtime.md): Read when the workspace defines a `realtimeServer()`, `realtimeChannel()`, or `realtimeMessage()` handler.
|
|
36
37
|
- [Triggers](llms/triggers.md): Read when authoring any trigger. A trigger's `stack` is a callback rather than the plain array every other kind takes, so the shape does not carry over.
|
|
37
38
|
- [Array and database statements](llms/statements-data.md): Read when the stack reads or writes rows (`s.db.*`), or transforms an array in place (`s.array.map`, `s.array.union`).
|
|
@@ -512,6 +513,7 @@ Author with the factory, register on the Xano instance, lands under the payload
|
|
|
512
513
|
- channel: `realtimeChannel` → `Xano.registerRealtimeChannels` → payload `channel` — A realtime channel: a joinable path on a realtime server (`rooms/{room_id}`) with typed path params, join/publish policy, a client-visible conversation transcript, and delivery semantics. Owns message handlers. Returns a handle with `getChannel(params)` for the path a client joins.
|
|
513
514
|
- message: `realtimeMessage` → `Xano.registerRealtimeMessages` → payload `message` — A realtime message handler: a named message type on a channel with its own typed payload and stack — the realtime analogue of a query. Pass the `realtimeChannel()` handle as `channel` and the owning server comes with it.
|
|
514
515
|
- microservice: `microservice` → `Xano.registerMicroservices` → payload `microservice` — A container workload deployed alongside the workspace, called from a stack with `s.microservice.request`. Two mutually exclusive shapes via `kind`: `builtin` declares containers (image/ports/resources/env/command/args) plus optional `ingresses`, and `helm` points at a chart and its `values` — passing both throws. EARLY SURFACE, expected to change — every export of a workspace declaring one prints a notice saying so. `configs`/`volumes` are typed and `@deprecated` but NOT deployable: the engine rejects an import carrying either, so `export()` fails the build rather than letting the deploy fatal. Put a value the workload reads in a container's `env`, and storage in a container's own `volumes` (`emptyDir`/`persistent`/`config`). Container names are free-form — they need not match the microservice name, which is what a stack addresses. SECRETS RIDE ALONG — `chart.values` and `registryAuth.dockerconfigjson` are carried into the bundle, and into a pulled tree, verbatim (they must be, or a pulled microservice could not be redeployed). Both are stored strings with NO deploy-time indirection: `process.env.X` in the def resolves at EXPORT and writes the literal into the bundle, so it is not a way to keep the credential out. Either leave `registryAuth` unset (public image, or a credential attached outside this workspace) or treat the bundle and any pulled tree as secret material — keep them out of git, or rotate after. Export prints a notice per microservice carrying either field; `--strict` does not promote it. For a secret a STACK reads, the mapped surface is `workspaceConfig({ env })` + `env("NAME")`.
|
|
516
|
+
- knowledge: `knowledge` → `Xano.registerKnowledge` → payload `knowledge` — Markdown the workspace's AI agents read before they act — an `agents.md` of standing instructions, a `skill`, or a `doc`. The body is a real markdown FILE via `knowledgeFile("./x.md", import.meta.url)`, and `mode` decides how much of it reaches the agent.
|
|
515
517
|
- workspace: `workspaceConfig` → `Xano.registerWorkspace` → payload `workspace` — Workspace-level configuration such as default middleware chains and request-history defaults per host kind.
|
|
516
518
|
|
|
517
519
|
# Core def shapes
|
|
@@ -655,6 +657,27 @@ The run is isolated in ways that make a correct test fail for reasons the failur
|
|
|
655
657
|
- **Run + read recipe (`s.ai.agent.run`):** bind the run to a var (`s.ai.agent.run({ agent, args, as: "run" })`) — it produces a rich envelope, and the completion is at **`.result`**. Read one structured field with a dotted ref (`response: ref("run.result.priority")`) or the whole completion (`ref("run.result")`, typed from `output.schema`); persist it in a later step the same way (`s.set_var({ name, value: ref("run.result.summary") })`). `args` is a plain object of run inputs (`{ topic: inp("topic") }` — raw literals are fine, e.g. `{ max_steps: 3 }`) surfaced to the agent as `{{ $args.topic }}`. Tool-call / per-step data (when tools ran) rides `.toolCalls` / `.steps` on the same envelope — both optional, absent or empty when no tools executed.
|
|
656
658
|
- **Marketplace:** for chat history, use `@xanots/chatbot`; for vector RAG, use `@xanots/vector` (`tools: [vector.searchTool]`). Find add-ons with `xanots marketplace search <q>`.
|
|
657
659
|
|
|
660
|
+
# Knowledge def shape
|
|
661
|
+
|
|
662
|
+
> Read when the workspace defines a `knowledge()` item — the markdown its AI agents read.
|
|
663
|
+
|
|
664
|
+
- `knowledge({ name, description?, type?, mode?, enabled?, body, refs?, guid?, tags? })` — markdown the workspace's AI agents read before they act. Takes `registerKnowledge`.
|
|
665
|
+
- `body` (REQUIRED): `knowledgeFile("./runbook.md", import.meta.url)` — a path to a real markdown FILE. There is no inline-string form. The path resolves relative to the MODULE THAT DECLARES the item, not the process working directory and not the workspace entry; `import.meta.url` is required and is what makes that true.
|
|
666
|
+
- `refs?`: `knowledgeDir("./runbook", import.meta.url)` — a directory whose WHOLE tree ships as reference files, recursively, POSIX-relative paths preserved. Keep the body OUT of that directory: everything under it is collected, so a body beside its refs would ship as one of its own reference files.
|
|
667
|
+
- `type?`: `"skill"` (default) | `"doc"` | `"agents.md"`. `skill` and `doc` differ in how they are filed, not in what an agent receives.
|
|
668
|
+
- `mode?`: `"auto"` (default) | `"always"` | `"referenced"`.
|
|
669
|
+
- `enabled?` defaults `true`. A disabled item is stored and never reaches an agent.
|
|
670
|
+
|
|
671
|
+
### What reaches the agent
|
|
672
|
+
|
|
673
|
+
- `type: "agents.md"` — full body on EVERY turn, whatever `mode` says. At most ONE per workspace; a second is an export error. Setting `mode` on one warns, because nothing reads it.
|
|
674
|
+
- `mode: "always"` — full body on every turn.
|
|
675
|
+
- `mode: "referenced"` — full body only on turns whose message names the item (bare name or `@name`).
|
|
676
|
+
- `mode: "auto"` — name and `description` only; the agent loads the body when a request matches.
|
|
677
|
+
- Reference files are never injected wholesale — an agent searches them on demand. That is what makes a large `mode: "auto"` item cheap.
|
|
678
|
+
- ⚠ `mode: "always"` on a long body spends its whole length on every request, and nothing in the types says so. `"auto"` is the default for that reason. For an `auto` item `description` is ALL the agent sees until it decides to load the body, so write it to be matched against a request rather than as a title.
|
|
679
|
+
- `name` takes letters, digits, and `/ _ - { } . ` or a space; anything else is an export error.
|
|
680
|
+
|
|
658
681
|
# Realtime def shapes
|
|
659
682
|
|
|
660
683
|
> Read when the workspace defines a `realtimeServer()`, `realtimeChannel()`, or `realtimeMessage()` handler.
|
package/llms.txt
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# xanots v0.0.
|
|
1
|
+
# xanots v0.0.5
|
|
2
2
|
|
|
3
3
|
> TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.
|
|
4
4
|
|
|
@@ -6,7 +6,7 @@ Author a Xano workspace in TypeScript: build typed objects, register them on a
|
|
|
6
6
|
`new Xano()` instance, and call `.export()` to get one importable bundle. Compile
|
|
7
7
|
with `xanots export ./xano/index.js`.
|
|
8
8
|
|
|
9
|
-
Coverage: object kinds
|
|
9
|
+
Coverage: object kinds 25/31, statement surfaces 214/214, filters 226 (226 typed).
|
|
10
10
|
Not authorable here: branch, market_item, realtime_channel, run.job, run.service, tablemap — these cannot be authored and do not survive a pull; see `coverage.objectKinds.unmodeled` in `manifest.json`.
|
|
11
11
|
|
|
12
12
|
This file is the whole always-read surface: the mental model, the deploy contract,
|
|
@@ -32,6 +32,7 @@ that wants one fetch, not for an agent that can open the two files it needs.
|
|
|
32
32
|
- [Core def shapes](llms/kinds-core.md): Read when authoring a function, query, api group, task, workflow test, middleware, or tool — and for the `response` and `expr` shapes every one of them uses.
|
|
33
33
|
- [Saved unit tests, assertions, and mocks](llms/tests.md): Read when authoring a `workflowTest()` stack, when a query/function/middleware carries `tests`, when a statement should mock a value, or when running a deployed environment's tests.
|
|
34
34
|
- [Agent and MCP def shapes](llms/kinds-agent-mcp.md): Read when the workspace defines an `agent()` or an `mcpServer()`.
|
|
35
|
+
- [Knowledge def shape](llms/kinds-knowledge.md): Read when the workspace defines a `knowledge()` item — the markdown its AI agents read.
|
|
35
36
|
- [Realtime def shapes](llms/kinds-realtime.md): Read when the workspace defines a `realtimeServer()`, `realtimeChannel()`, or `realtimeMessage()` handler.
|
|
36
37
|
- [Triggers](llms/triggers.md): Read when authoring any trigger. A trigger's `stack` is a callback rather than the plain array every other kind takes, so the shape does not carry over.
|
|
37
38
|
- [Array and database statements](llms/statements-data.md): Read when the stack reads or writes rows (`s.db.*`), or transforms an array in place (`s.array.map`, `s.array.union`).
|
package/manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xanots",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "TypeScript SDK that compiles a typed Xano workspace into the importable packageExport JSON bundle.",
|
|
5
5
|
"coverage": {
|
|
6
6
|
"objectKinds": {
|
|
7
|
-
"implemented":
|
|
8
|
-
"total":
|
|
7
|
+
"implemented": 25,
|
|
8
|
+
"total": 31,
|
|
9
9
|
"unmodeled": [
|
|
10
10
|
{
|
|
11
11
|
"kind": "branch",
|
|
@@ -361,6 +361,14 @@
|
|
|
361
361
|
"registerMethod": "registerMicroservices",
|
|
362
362
|
"registered": true
|
|
363
363
|
},
|
|
364
|
+
{
|
|
365
|
+
"kind": "knowledge",
|
|
366
|
+
"payloadKey": "knowledge",
|
|
367
|
+
"authorFactory": "knowledge",
|
|
368
|
+
"description": "Markdown the workspace's AI agents read before they act — an `agents.md` of standing instructions, a `skill`, or a `doc`. The body is a real markdown FILE via `knowledgeFile(\"./x.md\", import.meta.url)`, and `mode` decides how much of it reaches the agent.",
|
|
369
|
+
"registerMethod": "registerKnowledge",
|
|
370
|
+
"registered": true
|
|
371
|
+
},
|
|
364
372
|
{
|
|
365
373
|
"kind": "workspace",
|
|
366
374
|
"payloadKey": "workspace",
|
|
@@ -9068,9 +9076,13 @@
|
|
|
9068
9076
|
"flag": "--local",
|
|
9069
9077
|
"description": "Use the project-local ./.xano/auth.json instead of the shared cache"
|
|
9070
9078
|
},
|
|
9079
|
+
{
|
|
9080
|
+
"flag": "--paste",
|
|
9081
|
+
"description": "Sign in without the loopback callback: open the printed URL in any browser and paste the redirect back. For a host whose 127.0.0.1 the browser cannot reach — remote shell, container, Codespace. Needs a terminal."
|
|
9082
|
+
},
|
|
9071
9083
|
{
|
|
9072
9084
|
"flag": "--port <n>",
|
|
9073
|
-
"description": "
|
|
9085
|
+
"description": "Loopback callback port (default: 47100)"
|
|
9074
9086
|
},
|
|
9075
9087
|
{
|
|
9076
9088
|
"flag": "--scope \"<list>\"",
|
|
@@ -9134,6 +9146,11 @@
|
|
|
9134
9146
|
"args": "<string>",
|
|
9135
9147
|
"description": "Search add-ons by keyword across name, tagline and description"
|
|
9136
9148
|
},
|
|
9149
|
+
{
|
|
9150
|
+
"command": "onboard",
|
|
9151
|
+
"args": "[dir]",
|
|
9152
|
+
"description": "Pick a framework, theme and add-ons in a browser, then scaffold"
|
|
9153
|
+
},
|
|
9137
9154
|
{
|
|
9138
9155
|
"command": "paths",
|
|
9139
9156
|
"args": "<file>",
|
|
@@ -9507,6 +9524,16 @@
|
|
|
9507
9524
|
],
|
|
9508
9525
|
"description": "Run every test in an environment and report pass/fail"
|
|
9509
9526
|
},
|
|
9527
|
+
{
|
|
9528
|
+
"command": "upgrade",
|
|
9529
|
+
"flags": [
|
|
9530
|
+
{
|
|
9531
|
+
"flag": "--check",
|
|
9532
|
+
"description": "Report whether an upgrade is available and exit 7, without installing it"
|
|
9533
|
+
}
|
|
9534
|
+
],
|
|
9535
|
+
"description": "Install the latest @xanots/sdk, or report an available upgrade with --check"
|
|
9536
|
+
},
|
|
9510
9537
|
{
|
|
9511
9538
|
"command": "validate",
|
|
9512
9539
|
"args": "<file>",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xanots/sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "XanoTS — your Xano backend as TypeScript. `xanots deploy` ships your typed workspace (and an optional static frontend) to a live, auto-expiring ephemeral environment and prints its URL. init → deploy → URL.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"xanots",
|
|
@@ -61,7 +61,9 @@
|
|
|
61
61
|
"llms.txt",
|
|
62
62
|
"llms-full.txt",
|
|
63
63
|
"llms",
|
|
64
|
-
"
|
|
64
|
+
"guides",
|
|
65
|
+
"README.md",
|
|
66
|
+
"CHANGELOG.md"
|
|
65
67
|
],
|
|
66
68
|
"scripts": {
|
|
67
69
|
"build": "tsup",
|
|
@@ -78,6 +80,7 @@
|
|
|
78
80
|
"audit:output-flag": "tsx scripts/audit-output-flag.ts",
|
|
79
81
|
"audit:decode-coverage": "tsx scripts/audit-decode-coverage.ts",
|
|
80
82
|
"manifest": "tsx scripts/manifest.ts",
|
|
83
|
+
"changelog": "tsx scripts/changelog.ts",
|
|
81
84
|
"measure:llms": "tsx scripts/measure-llms.ts",
|
|
82
85
|
"typecheck": "tsc --noEmit",
|
|
83
86
|
"test": "vitest run",
|
package/dist/chunk-WUSKBXXD.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
// src/emit/npm.ts
|
|
2
|
-
import { spawnSync } from "child_process";
|
|
3
|
-
function npmBinary() {
|
|
4
|
-
return process.platform === "win32" ? "npm.cmd" : "npm";
|
|
5
|
-
}
|
|
6
|
-
function runNpm(args, cwd) {
|
|
7
|
-
const res = spawnSync(npmBinary(), [...args], { cwd, stdio: "inherit" });
|
|
8
|
-
return res.status ?? 1;
|
|
9
|
-
}
|
|
10
|
-
function runNpmCapturingStderr(args, cwd) {
|
|
11
|
-
const res = spawnSync(npmBinary(), [...args], {
|
|
12
|
-
cwd,
|
|
13
|
-
stdio: ["inherit", "inherit", "pipe"],
|
|
14
|
-
encoding: "utf8"
|
|
15
|
-
});
|
|
16
|
-
const stderr = res.stderr ?? "";
|
|
17
|
-
if (stderr !== "") process.stderr.write(stderr);
|
|
18
|
-
return { status: res.status ?? 1, stderr };
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export {
|
|
22
|
-
runNpm,
|
|
23
|
-
runNpmCapturingStderr
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=chunk-WUSKBXXD.js.map
|
package/dist/chunk-ZO3HJOCJ.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
UsageError
|
|
3
|
-
} from "./chunk-6USV65XA.js";
|
|
4
|
-
import {
|
|
5
|
-
style
|
|
6
|
-
} from "./chunk-EZG76F7R.js";
|
|
7
|
-
|
|
8
|
-
// src/emit/prompt.ts
|
|
9
|
-
import { createInterface } from "readline";
|
|
10
|
-
async function confirm(message, opts) {
|
|
11
|
-
if (process.stdin.isTTY !== true) {
|
|
12
|
-
throw new UsageError(
|
|
13
|
-
`Cannot ask for confirmation: stdin is not a terminal. Re-run with ${opts.flag} to confirm without being asked.`,
|
|
14
|
-
{ helpFor: opts.helpFor }
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
18
|
-
try {
|
|
19
|
-
const answer = await new Promise((res) => rl.question(`${style.yellow("?")} ${message} (y/N) `, res));
|
|
20
|
-
return /^y(es)?$/i.test(answer.trim());
|
|
21
|
-
} finally {
|
|
22
|
-
rl.close();
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export {
|
|
27
|
-
confirm
|
|
28
|
-
};
|
|
29
|
-
//# sourceMappingURL=chunk-ZO3HJOCJ.js.map
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
blameGeneratedFile,
|
|
3
|
-
fetchWorkspaceBundle,
|
|
4
|
-
isMissingDependencyError,
|
|
5
|
-
runCodegenCommand,
|
|
6
|
-
verifyCrashEntry
|
|
7
|
-
} from "./chunk-2V4YE6QC.js";
|
|
8
|
-
import "./chunk-P3TTMWUP.js";
|
|
9
|
-
import "./chunk-QTNO2WD6.js";
|
|
10
|
-
import "./chunk-ZUTSMMAG.js";
|
|
11
|
-
import "./chunk-HQ2CBRVI.js";
|
|
12
|
-
import "./chunk-CMZLPTGW.js";
|
|
13
|
-
import "./chunk-WUSKBXXD.js";
|
|
14
|
-
import "./chunk-3IGNIP6R.js";
|
|
15
|
-
import "./chunk-C56BC2FY.js";
|
|
16
|
-
import "./chunk-7REDODS2.js";
|
|
17
|
-
import "./chunk-X4DVXBFY.js";
|
|
18
|
-
import "./chunk-F6JCFRKO.js";
|
|
19
|
-
import "./chunk-LU7TRWMC.js";
|
|
20
|
-
import "./chunk-YZ4GU6F5.js";
|
|
21
|
-
import "./chunk-6DHJVLYP.js";
|
|
22
|
-
import "./chunk-4BXJGVZ3.js";
|
|
23
|
-
import "./chunk-U3G2UW65.js";
|
|
24
|
-
import "./chunk-3NFUWXOC.js";
|
|
25
|
-
import "./chunk-6USV65XA.js";
|
|
26
|
-
import "./chunk-HJPTWBLH.js";
|
|
27
|
-
import "./chunk-EZG76F7R.js";
|
|
28
|
-
import "./chunk-GNPVYOPB.js";
|
|
29
|
-
import "./chunk-55VHDNW5.js";
|
|
30
|
-
import "./chunk-DYCLVQXW.js";
|
|
31
|
-
import "./chunk-5L4X5LS6.js";
|
|
32
|
-
import "./chunk-WHOJWOSV.js";
|
|
33
|
-
import "./chunk-5XZ744TS.js";
|
|
34
|
-
import "./chunk-4HT3BNZ7.js";
|
|
35
|
-
export {
|
|
36
|
-
blameGeneratedFile,
|
|
37
|
-
fetchWorkspaceBundle,
|
|
38
|
-
isMissingDependencyError,
|
|
39
|
-
runCodegenCommand,
|
|
40
|
-
verifyCrashEntry
|
|
41
|
-
};
|
|
42
|
-
//# sourceMappingURL=codegen-command-FIADGXRN.js.map
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
projectShellFiles,
|
|
3
|
-
runInitCommand,
|
|
4
|
-
sanitizeAppName
|
|
5
|
-
} from "./chunk-HQ2CBRVI.js";
|
|
6
|
-
import {
|
|
7
|
-
resolveAiFlags
|
|
8
|
-
} from "./chunk-CMZLPTGW.js";
|
|
9
|
-
import "./chunk-WUSKBXXD.js";
|
|
10
|
-
import "./chunk-YZ4GU6F5.js";
|
|
11
|
-
import "./chunk-6DHJVLYP.js";
|
|
12
|
-
import "./chunk-3NFUWXOC.js";
|
|
13
|
-
import "./chunk-6USV65XA.js";
|
|
14
|
-
import "./chunk-HJPTWBLH.js";
|
|
15
|
-
import "./chunk-EZG76F7R.js";
|
|
16
|
-
import "./chunk-GNPVYOPB.js";
|
|
17
|
-
import "./chunk-55VHDNW5.js";
|
|
18
|
-
import "./chunk-DYCLVQXW.js";
|
|
19
|
-
import "./chunk-5L4X5LS6.js";
|
|
20
|
-
import "./chunk-WHOJWOSV.js";
|
|
21
|
-
import "./chunk-5XZ744TS.js";
|
|
22
|
-
import "./chunk-4HT3BNZ7.js";
|
|
23
|
-
export {
|
|
24
|
-
projectShellFiles,
|
|
25
|
-
resolveAiFlags,
|
|
26
|
-
runInitCommand,
|
|
27
|
-
sanitizeAppName
|
|
28
|
-
};
|
|
29
|
-
//# sourceMappingURL=init-command-LOK75W64.js.map
|