@xanots/sdk 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +34 -1
  3. package/dist/agent-file-refresh-IJ7GN2FJ.js +17 -0
  4. package/dist/bin.js +12 -153
  5. package/dist/{capture-HUV5BNTC.js → capture-7PO6SGB4.js} +2 -2
  6. package/dist/{chunk-CMZLPTGW.js → chunk-7SISR3CS.js} +2 -2
  7. package/dist/{chunk-7DKX2SPN.js → chunk-ACQCK4DT.js} +4 -4
  8. package/dist/{chunk-XQ22GLYS.js → chunk-AJ7JQ4OU.js} +5 -5
  9. package/dist/{chunk-ZO3HJOCJ.js → chunk-ALNQCWAW.js} +2 -2
  10. package/dist/{chunk-55VHDNW5.js → chunk-BPEEGJJA.js} +108 -3
  11. package/dist/{chunk-U3G2UW65.js → chunk-CYJ7R3AD.js} +3 -3
  12. package/dist/{agent-file-refresh-6M5M7T24.js → chunk-D6OGU2AI.js} +5 -6
  13. package/dist/{chunk-3NFUWXOC.js → chunk-DUC3PXDG.js} +142 -45
  14. package/dist/{chunk-HQ2CBRVI.js → chunk-EAIR6VUL.js} +10 -8
  15. package/dist/chunk-ERQZFWIW.js +22 -0
  16. package/dist/{chunk-TQUO2OXY.js → chunk-FN4OQT2J.js} +4 -4
  17. package/dist/{chunk-6USV65XA.js → chunk-KGNJM4LN.js} +2 -2
  18. package/dist/{chunk-HJPTWBLH.js → chunk-MFIHIS6B.js} +2 -2
  19. package/dist/{chunk-F6JCFRKO.js → chunk-PXXLBXOP.js} +2 -2
  20. package/dist/{chunk-YZ4GU6F5.js → chunk-QUUB7HYK.js} +5 -838
  21. package/dist/{chunk-W2G2WPTB.js → chunk-SWIXWJIY.js} +3 -3
  22. package/dist/{chunk-76QBEIGO.js → chunk-T4XPCJRF.js} +3 -2
  23. package/dist/chunk-T6N3VMMO.js +173 -0
  24. package/dist/{chunk-2V4YE6QC.js → chunk-VKD3EBKG.js} +112 -21
  25. package/dist/{chunk-BT2CSEC5.js → chunk-VWGJQTNA.js} +3 -3
  26. package/dist/chunk-WGDAOOXG.js +845 -0
  27. package/dist/{chunk-4YMD2OOZ.js → chunk-XHEXOES3.js} +1 -1
  28. package/dist/{chunk-4HT3BNZ7.js → chunk-YUBJLB6G.js} +10 -2
  29. package/dist/{chunk-5L4X5LS6.js → chunk-YUPQOLFX.js} +77 -2
  30. package/dist/{chunk-DYCLVQXW.js → chunk-YYSJAAJM.js} +25 -1
  31. package/dist/{chunk-P3TTMWUP.js → chunk-ZOYMZZ3S.js} +8 -1
  32. package/dist/chunk-ZSYZTGJH.js +81 -0
  33. package/dist/cli.d.ts +6 -0
  34. package/dist/cli.js +8 -8
  35. package/dist/{codegen-command-FIADGXRN.js → codegen-command-Z7WQMOJ7.js} +21 -20
  36. package/dist/{completion-BKAFCZBE.js → completion-4GYN752B.js} +2 -2
  37. package/dist/{deploy-command-4R6BYC6G.js → deploy-command-M2S4HHLC.js} +26 -26
  38. package/dist/{env-target-XWS2ZZ2Y.js → env-target-GSFCYHKZ.js} +6 -6
  39. package/dist/{ephemeral-command-JL4TPIRQ.js → ephemeral-command-6WJW7LP6.js} +24 -24
  40. package/dist/index.d.ts +2 -2
  41. package/dist/index.js +13 -7
  42. package/dist/init-command-GJUPWTKA.js +30 -0
  43. package/dist/internal.d.ts +2 -2
  44. package/dist/internal.js +50 -5
  45. package/dist/{io-AMIKRLPC.js → io-7VIA5SON.js} +3 -3
  46. package/dist/{live-diff-RXSJCVJ7.js → live-diff-FP4SFNT4.js} +2 -2
  47. package/dist/{lock-3CVKALKT.js → lock-KXOJIGCG.js} +2 -2
  48. package/dist/{lock-commands-XOYS75YQ.js → lock-commands-7IH7RSSP.js} +9 -9
  49. package/dist/{login-command-ACJF6KWQ.js → login-command-QM5SBBI2.js} +2 -2
  50. package/dist/{logout-command-MX3MJS5U.js → logout-command-THPASOHM.js} +2 -2
  51. package/dist/{loop-SAWAOUFO.js → loop-7SAIGRCZ.js} +3 -3
  52. package/dist/{marketplace-command-UVV3XAOL.js → marketplace-command-463DT7O7.js} +11 -25
  53. package/dist/meta-client-OW5WKWW7.js +1 -1
  54. package/dist/node.d.ts +2 -2
  55. package/dist/node.js +18 -12
  56. package/dist/onboard-command-EHOHKQQU.js +36 -0
  57. package/dist/{profile-command-SWJ3SPKR.js → profile-command-EUWPVWED.js} +6 -6
  58. package/dist/{release-command-HZUY2XZX.js → release-command-M4CVNTWL.js} +25 -25
  59. package/dist/{sandbox-details-command-HJE5SPVG.js → sandbox-details-command-BRII3QHG.js} +5 -5
  60. package/dist/{sandbox-export-command-QCJY4GMV.js → sandbox-export-command-PCZ5FL4U.js} +8 -8
  61. package/dist/scaffold.js +4 -2
  62. package/dist/{store-g45zwB33.d.ts → store-BJONDJoZ.d.ts} +171 -2
  63. package/dist/{test-command-72Y5S22H.js → test-command-U4G5Y3UM.js} +10 -10
  64. package/dist/upgrade-command-CKJ4BS2P.js +177 -0
  65. package/dist/{validate-command-KDGH537H.js → validate-command-S5N37JRP.js} +12 -12
  66. package/dist/{workspace-command-ICSI6PKO.js → workspace-command-RALSEJSW.js} +28 -27
  67. package/dist/workspace-export-AJMGN3CQ.js +1 -1
  68. package/guides/README.md +30 -0
  69. package/guides/authoring.md +642 -0
  70. package/guides/cli.md +191 -0
  71. package/guides/codegen.md +83 -0
  72. package/guides/coverage.md +67 -0
  73. package/guides/deploying.md +340 -0
  74. package/guides/environment.md +132 -0
  75. package/guides/object-kinds.md +376 -0
  76. package/guides/project-structure.md +43 -0
  77. package/guides/scaffold.md +198 -0
  78. package/guides/typed-frontend.md +201 -0
  79. package/llms/kinds-knowledge.md +20 -0
  80. package/llms/object-kinds.md +1 -0
  81. package/llms-full.txt +25 -2
  82. package/llms.txt +3 -2
  83. package/manifest.json +26 -3
  84. package/package.json +5 -2
  85. package/dist/.build-fingerprint +0 -1
  86. package/dist/chunk-WUSKBXXD.js +0 -25
  87. package/dist/init-command-LOK75W64.js +0 -29
package/CHANGELOG.md ADDED
@@ -0,0 +1,80 @@
1
+ # Changelog
2
+
3
+ All notable changes to [`@xanots/sdk`](https://www.npmjs.com/package/@xanots/sdk).
4
+
5
+ This file is **generated** from the [GitHub releases](https://github.com/xanots/sdk/releases)
6
+ by `npm run changelog` — edit the release, not this file. Each entry summarizes
7
+ one release and links to its full notes.
8
+
9
+ Versions before 0.0.1 belong to the retired `@xanots/core` line and are not
10
+ listed here.
11
+
12
+ ---
13
+
14
+ ## 0.0.4 — Agents get their instructions
15
+
16
+ _2026-08-25_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.4)
17
+
18
+ `knowledge()` lands: the markdown a Xano workspace's AI agents read before they act, authored as real `.md` files in your repo instead of typed into a console. Standing instructions, skills, and reference docs are now workspace source — reviewed in a diff, versioned with the code they describe, and redeployed with it. Nothing changes for a workspace that declares none.
19
+
20
+ - `knowledge()` authors the instructions your agents follow
21
+ - The body is a real markdown file, never a string in a def
22
+ - `refs` ships a whole folder the agent searches on demand
23
+ - `type` and `mode` decide what the agent actually receives
24
+ - Authoring mistakes that used to deploy silently are now build errors
25
+ - `xanots codegen` writes the markdown back out as files
26
+ - Repeated releases update knowledge instead of duplicating it
27
+
28
+ ---
29
+
30
+ ## 0.0.3 — The scaffold gets a look
31
+
32
+ _2026-08-25_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.3)
33
+
34
+ `xanots init` wrote one hard-coded stylesheet, so every scaffolded project looked
35
+ identical. It now takes a theme, a corner radius, a dark-mode strategy, three
36
+ typeface slots and an icon set — 126 themes composed from shadcn/ui's own tables,
37
+ or any registry theme URL. The same command can install **and register**
38
+ marketplace add-ons in one line, and the agent grounding now points assistants at
39
+ a prebuilt module instead of hand-rolling one. Nothing changes for anyone not
40
+ passing the new flags: no flags and no TTY scaffolds exactly what it did before.
41
+
42
+ - `xanots init` takes a theme, typefaces and an icon set
43
+ - `chart-*` and `sidebar-*` were missing from every scaffolded stylesheet
44
+ - `components.json` hard-coded a base color the stylesheet no longer used
45
+ - Dark mode shipped inert
46
+ - `--marketplace` installs add-ons and registers them
47
+ - Agents are grounded in marketplace discovery and the first-party modules
48
+ - New `@xanots/sdk/scaffold` export carries the scaffold's palette as data
49
+
50
+ ---
51
+
52
+ ## 0.0.2 — What the engine actually requires
53
+
54
+ _2026-08-25_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.2)
55
+
56
+ This release is about the statement surface refusing what the engine cannot accept, while you are writing rather than after you deploy. An absent required argument does not error on Xano — it substitutes a type default and answers HTTP 200 with a confident wrong result, which nothing downstream can distinguish from a right one. So 50-odd arguments that were typed optional are now required, one field the engine never reads is gone, and the wrappers that used to pass a missing field along now name it. If your code omitted any of them it will stop type-checking; it was already producing the wrong answer.
57
+
58
+ - ⚠️ 25 arguments across 15 statements are now required
59
+ - ⚠️ The Elasticsearch and OpenSearch credentials and target are required
60
+ - ⚠️ `webflow.request` no longer offers a `headers` field
61
+ - ⚠️ Statements that passed a missing field along now refuse it
62
+ - A zero-argument call names the field it needs
63
+ - A pulled workspace decodes where it used to fall back to `raw()`
64
+ - Every statement in the catalog has byte evidence behind it
65
+
66
+ ---
67
+
68
+ ## 0.0.1 — The new name, and a README to match
69
+
70
+ _2026-08-24_ · [release notes](https://github.com/xanots/sdk/releases/tag/v0.0.1)
71
+
72
+ The SDK is now published as **`@xanots/sdk`**, starting a fresh version line at 0.0.1. The name says what the package is — the authoring surface, the compiler, and the CLI — rather than implying one member of a family with a shared core. Alongside the rename: two new build-time warnings for shapes that used to ship clean and then misbehave at request time, and a README rebuilt as a landing page with its reference material split into browsable guides.
73
+
74
+ - ⚠️ The package is now `@xanots/sdk`
75
+ - `s.switch` fell through without `break: true`
76
+ - A filtered operand in a `where` could 500 at request time
77
+ - The README is a landing page again
78
+ - Scaffolds build the frontend before deploying it
79
+ - `@xanots/auth` is authentication, not authorization
80
+ - `InferResponse`: the shapes that never derive, and the line that closes each
package/README.md CHANGED
@@ -115,6 +115,20 @@ The starter backend is empty but already compiles and deploys — grow it from t
115
115
  in `xano/EXAMPLE.md`. For the flags, the two presets, theming, and add-ons, see
116
116
  [The scaffolded project](https://github.com/xanots/sdk/blob/main/guides/scaffold.md).
117
117
 
118
+ Prefer to see the theme before you commit to it? `xanots onboard` picks the framework, the
119
+ palette, the typefaces and the add-ons in a browser, against a live preview, and hands the
120
+ result back to `init` here in your terminal.
121
+
122
+ ```bash
123
+ npx @xanots/sdk onboard my-app
124
+ ```
125
+
126
+ It is a nicer way to arrive at the flags above, not a second scaffolder — it prints the
127
+ equivalent `init` command when it is done, so the project stays reproducible from a script.
128
+ The configurator is downloaded on demand, so `onboard` needs the registry before it can
129
+ start; `init` reaches out only to install the new project's dependencies, which
130
+ `--no-install` skips.
131
+
118
132
  **3. Build the frontend.**
119
133
 
120
134
  ```bash
@@ -214,7 +228,25 @@ the Xano engine, and the output is proven byte-for-byte against the engine's own
214
228
  fixtures.
215
229
 
216
230
  Give a table a `seed` array and those rows ship into the database on deploy, so a fresh
217
- environment comes up with its lookup tables and fixtures already in place. Tables, fields,
231
+ environment comes up with its lookup tables and fixtures already in place.
232
+
233
+ Your workspace's own AI agents are configured the same way. `knowledge()` is the markdown
234
+ they read before they act — standing instructions, a skill, or reference docs — and the body
235
+ is a real `.md` file in your repo rather than a string in a def:
236
+
237
+ ```ts
238
+ knowledge({
239
+ name: "deploy-runbook",
240
+ description: "How this workspace ships: environments, gates, and rollback.",
241
+ body: knowledgeFile("./deploy-runbook.md", import.meta.url),
242
+ refs: knowledgeDir("./deploy-runbook", import.meta.url),
243
+ });
244
+ ```
245
+
246
+ So the instructions your agents follow are reviewed in a diff, versioned with the code they
247
+ describe, and redeployed with it — instead of living in a console where nothing tracks them.
248
+
249
+ Tables, fields,
218
250
  statements, values, inputs, and middleware are all in the
219
251
  [Authoring reference](https://github.com/xanots/sdk/blob/main/guides/authoring.md); every kind you can author is in
220
252
  [Object kinds](https://github.com/xanots/sdk/blob/main/guides/object-kinds.md).
@@ -386,6 +418,7 @@ Both are readable by people too.
386
418
  [npm](https://www.npmjs.com/package/@xanots/sdk) ·
387
419
  [GitHub](https://github.com/xanots/sdk) ·
388
420
  [Issues](https://github.com/xanots/sdk/issues) ·
421
+ [Changelog](CHANGELOG.md) ·
389
422
  [`llms.txt`](llms.txt) — the agent-facing router, mapping the `llms/` topic files
390
423
 
391
424
  XanoTS is the official TypeScript SDK for [Xano](https://xano.com). MIT licensed.
@@ -0,0 +1,17 @@
1
+ import {
2
+ CI_ENV_VARS,
3
+ codingAgentDetected,
4
+ isCI,
5
+ refreshAgentFiles
6
+ } from "./chunk-D6OGU2AI.js";
7
+ import "./chunk-7SISR3CS.js";
8
+ import "./chunk-ZSYZTGJH.js";
9
+ import "./chunk-6DHJVLYP.js";
10
+ import "./chunk-EZG76F7R.js";
11
+ export {
12
+ CI_ENV_VARS,
13
+ codingAgentDetected,
14
+ isCI,
15
+ refreshAgentFiles
16
+ };
17
+ //# sourceMappingURL=agent-file-refresh-IJ7GN2FJ.js.map
package/dist/bin.js CHANGED
@@ -1,168 +1,27 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ maybeNotifyUpdate
4
+ } from "./chunk-T6N3VMMO.js";
2
5
  import {
3
6
  readVersion,
4
7
  run
5
- } from "./chunk-3NFUWXOC.js";
8
+ } from "./chunk-DUC3PXDG.js";
6
9
  import {
7
10
  exitCodeOf,
8
11
  reportFailure
9
- } from "./chunk-6USV65XA.js";
10
- import "./chunk-HJPTWBLH.js";
12
+ } from "./chunk-KGNJM4LN.js";
13
+ import "./chunk-MFIHIS6B.js";
14
+ import "./chunk-GNPVYOPB.js";
11
15
  import {
12
- blank,
13
16
  clearProgress,
14
- detail,
15
- error,
16
- style,
17
- warn
17
+ error
18
18
  } from "./chunk-EZG76F7R.js";
19
- import {
20
- atomicWrite
21
- } from "./chunk-GNPVYOPB.js";
22
- import "./chunk-55VHDNW5.js";
23
- import "./chunk-DYCLVQXW.js";
24
- import "./chunk-5L4X5LS6.js";
19
+ import "./chunk-BPEEGJJA.js";
20
+ import "./chunk-YYSJAAJM.js";
21
+ import "./chunk-YUPQOLFX.js";
25
22
  import "./chunk-WHOJWOSV.js";
26
23
  import "./chunk-5XZ744TS.js";
27
- import "./chunk-4HT3BNZ7.js";
28
-
29
- // src/emit/update-check.ts
30
- import { existsSync, readFileSync, mkdirSync } from "fs";
31
- import { homedir } from "os";
32
- import { dirname, join } from "path";
33
- import { createRequire } from "module";
34
- function registryUrl() {
35
- return process.env.XANOTS_UPDATE_REGISTRY ?? "https://registry.npmjs.org/@xanots/sdk/latest";
36
- }
37
- function cachePath() {
38
- return process.env.XANOTS_UPDATE_CACHE ?? join(homedir(), ".xanots", "update-check.json");
39
- }
40
- var CHECK_INTERVAL_MS = 60 * 60 * 1e3;
41
- var FETCH_TIMEOUT_MS = 2e3;
42
- function isNewer(candidate, current) {
43
- const a = parseSemver(candidate);
44
- const b = parseSemver(current);
45
- if (!a || !b) return false;
46
- for (let i = 0; i < 3; i++) {
47
- if (a.nums[i] !== b.nums[i]) return a.nums[i] > b.nums[i];
48
- }
49
- if (a.pre.length === 0) return b.pre.length > 0;
50
- if (b.pre.length === 0) return false;
51
- return comparePre(a.pre, b.pre) > 0;
52
- }
53
- function parseSemver(v) {
54
- const m = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/.exec(v.trim());
55
- if (!m) return null;
56
- return {
57
- nums: [Number(m[1]), Number(m[2]), Number(m[3])],
58
- pre: m[4] ? m[4].split(".") : []
59
- };
60
- }
61
- function comparePre(a, b) {
62
- const len = Math.max(a.length, b.length);
63
- for (let i = 0; i < len; i++) {
64
- if (i >= a.length) return -1;
65
- if (i >= b.length) return 1;
66
- const x = a[i];
67
- const y = b[i];
68
- const xn = /^\d+$/.test(x);
69
- const yn = /^\d+$/.test(y);
70
- if (xn && yn) {
71
- if (Number(x) !== Number(y)) return Number(x) < Number(y) ? -1 : 1;
72
- } else if (xn !== yn) {
73
- return xn ? -1 : 1;
74
- } else if (x !== y) {
75
- return x < y ? -1 : 1;
76
- }
77
- }
78
- return 0;
79
- }
80
- function readCache() {
81
- const path = cachePath();
82
- if (!existsSync(path)) return void 0;
83
- try {
84
- const parsed = JSON.parse(readFileSync(path, "utf8"));
85
- if (typeof parsed.latest === "string" && typeof parsed.checkedAt === "number") {
86
- return { latest: parsed.latest, checkedAt: parsed.checkedAt };
87
- }
88
- } catch {
89
- }
90
- return void 0;
91
- }
92
- function writeCache(cache) {
93
- try {
94
- const path = cachePath();
95
- mkdirSync(dirname(path), { recursive: true });
96
- atomicWrite(path, JSON.stringify(cache, null, 2) + "\n");
97
- } catch {
98
- }
99
- }
100
- async function fetchLatest() {
101
- try {
102
- const res = await fetch(registryUrl(), {
103
- headers: { accept: "application/json" },
104
- signal: AbortSignal.timeout(FETCH_TIMEOUT_MS)
105
- });
106
- if (!res.ok) return null;
107
- const data = await res.json();
108
- return typeof data.version === "string" ? data.version : null;
109
- } catch {
110
- return null;
111
- }
112
- }
113
- function disabled() {
114
- return Boolean(
115
- process.env.XANOTS_NO_UPDATE_CHECK || process.env.NO_UPDATE_NOTIFIER || process.env.CI
116
- );
117
- }
118
- async function resolveUpdateNotice(opts) {
119
- if (!opts?.force && disabled()) return null;
120
- const current = opts?.current ?? readVersion();
121
- if (current === "unknown") return null;
122
- const cache = readCache();
123
- let latest = cache?.latest;
124
- const now = Date.now();
125
- if (!cache || now - cache.checkedAt > CHECK_INTERVAL_MS) {
126
- const fetched = await fetchLatest();
127
- if (fetched) {
128
- latest = fetched;
129
- writeCache({ latest: fetched, checkedAt: now });
130
- }
131
- }
132
- return latest && isNewer(latest, current) ? { current, latest } : null;
133
- }
134
- function detectInstallMode() {
135
- const override = process.env.XANOTS_INSTALL_MODE;
136
- if (override === "global" || override === "local") return override;
137
- try {
138
- const requireFromCwd = createRequire(join(process.cwd(), "package.json"));
139
- requireFromCwd.resolve("@xanots/sdk/package.json");
140
- return "local";
141
- } catch {
142
- return "global";
143
- }
144
- }
145
- function upgradeCommand(mode) {
146
- return mode === "global" ? "npm i -g @xanots/sdk@latest" : "npm i -D @xanots/sdk@latest";
147
- }
148
- function printUpdateNotice(notice) {
149
- blank();
150
- warn(
151
- `A new @xanots/sdk is available: ${style.dim(notice.current)} \u2192 ${style.green(notice.latest)}`
152
- );
153
- detail(`update: ${upgradeCommand(detectInstallMode())}`);
154
- }
155
- function runExitedClean(code = process.exitCode) {
156
- return code === void 0 || code === 0;
157
- }
158
- async function maybeNotifyUpdate() {
159
- try {
160
- if (disabled() || process.stderr.isTTY !== true || !runExitedClean()) return;
161
- const notice = await resolveUpdateNotice();
162
- if (notice) printUpdateNotice(notice);
163
- } catch {
164
- }
165
- }
24
+ import "./chunk-YUBJLB6G.js";
166
25
 
167
26
  // src/emit/interrupt.ts
168
27
  var EXIT_SIGINT = 130;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  fixtureDirForKind
3
- } from "./chunk-76QBEIGO.js";
3
+ } from "./chunk-T4XPCJRF.js";
4
4
 
5
5
  // src/validate/capture.ts
6
6
  import { mkdirSync, writeFileSync } from "fs";
@@ -29,4 +29,4 @@ function safeName(name) {
29
29
  export {
30
30
  captureFixtures
31
31
  };
32
- //# sourceMappingURL=capture-HUV5BNTC.js.map
32
+ //# sourceMappingURL=capture-7PO6SGB4.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runNpm
3
- } from "./chunk-WUSKBXXD.js";
3
+ } from "./chunk-ZSYZTGJH.js";
4
4
  import {
5
5
  defaultThemeChoice,
6
6
  reactPreset,
@@ -442,4 +442,4 @@ export {
442
442
  resolveAiPresets,
443
443
  scaffoldProject
444
444
  };
445
- //# sourceMappingURL=chunk-CMZLPTGW.js.map
445
+ //# sourceMappingURL=chunk-7SISR3CS.js.map
@@ -2,6 +2,9 @@ import {
2
2
  printMicroserviceSection,
3
3
  readMicroservices
4
4
  } from "./chunk-NDZFBZHC.js";
5
+ import {
6
+ getAccessToken
7
+ } from "./chunk-C56BC2FY.js";
5
8
  import {
6
9
  isMachineOutput,
7
10
  writeJson
@@ -10,9 +13,6 @@ import {
10
13
  fetchOrExplain,
11
14
  httpFailure
12
15
  } from "./chunk-3IGNIP6R.js";
13
- import {
14
- getAccessToken
15
- } from "./chunk-C56BC2FY.js";
16
16
  import {
17
17
  formatFields,
18
18
  stdoutStyle
@@ -97,4 +97,4 @@ export {
97
97
  fetchSandboxDetails,
98
98
  runSandboxDetailsCommand
99
99
  };
100
- //# sourceMappingURL=chunk-7DKX2SPN.js.map
100
+ //# sourceMappingURL=chunk-ACQCK4DT.js.map
@@ -1,12 +1,12 @@
1
- import {
2
- exportWorkspaceBundle
3
- } from "./chunk-QTNO2WD6.js";
4
1
  import {
5
2
  sandboxBaseUrl
6
- } from "./chunk-7DKX2SPN.js";
3
+ } from "./chunk-ACQCK4DT.js";
7
4
  import {
8
5
  getAccessToken
9
6
  } from "./chunk-C56BC2FY.js";
7
+ import {
8
+ exportWorkspaceBundle
9
+ } from "./chunk-QTNO2WD6.js";
10
10
  import {
11
11
  step,
12
12
  success
@@ -115,4 +115,4 @@ export {
115
115
  fetchSandboxBundle,
116
116
  runSandboxExportCommand
117
117
  };
118
- //# sourceMappingURL=chunk-XQ22GLYS.js.map
118
+ //# sourceMappingURL=chunk-AJ7JQ4OU.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  UsageError
3
- } from "./chunk-6USV65XA.js";
3
+ } from "./chunk-KGNJM4LN.js";
4
4
  import {
5
5
  style
6
6
  } from "./chunk-EZG76F7R.js";
@@ -26,4 +26,4 @@ async function confirm(message, opts) {
26
26
  export {
27
27
  confirm
28
28
  };
29
- //# sourceMappingURL=chunk-ZO3HJOCJ.js.map
29
+ //# sourceMappingURL=chunk-ALNQCWAW.js.map
@@ -12,7 +12,7 @@ import {
12
12
  middlewareEntryGuid,
13
13
  stackReferencesAuth,
14
14
  tableColumns
15
- } from "./chunk-5L4X5LS6.js";
15
+ } from "./chunk-YUPQOLFX.js";
16
16
  import {
17
17
  CANONICAL_PAYLOAD_KEYS,
18
18
  REFERENCEABLE_KINDS,
@@ -23,7 +23,7 @@ import {
23
23
  mintCanonical,
24
24
  recordObserved,
25
25
  resolveRef
26
- } from "./chunk-4HT3BNZ7.js";
26
+ } from "./chunk-YUBJLB6G.js";
27
27
 
28
28
  // src/workspace/seed-coerce.ts
29
29
  function coerceScalarValue(label, column, type, value, values) {
@@ -1108,6 +1108,60 @@ function checkRunFamilyHosts(sections, bag) {
1108
1108
  }
1109
1109
  }
1110
1110
  }
1111
+ var KNOWLEDGE_NAME_OK = /^[A-Za-z0-9/_\-{}. ]+$/;
1112
+ var KNOWLEDGE_NAME_MAX = 200;
1113
+ function checkKnowledge(sections, bag, opts) {
1114
+ const items = sections.knowledge ?? [];
1115
+ if (items.length === 0) return;
1116
+ const agentsMd = items.filter((i) => i.knowledge_type === "agents.md");
1117
+ if (agentsMd.length > 1) {
1118
+ bag.error(
1119
+ "knowledge.multiple-agents-md",
1120
+ `A workspace can have at most one \`type: "agents.md"\` knowledge item, and this one declares ${agentsMd.length}: ${agentsMd.map((i) => `"${i.name}"`).join(", ")}. AGENTS.md is the workspace's standing instructions \u2014 merge them into one item, or make the others \`type: "skill"\`.`
1121
+ );
1122
+ }
1123
+ for (const item of items) {
1124
+ const name = String(item.name ?? "");
1125
+ const label = `knowledge "${name}"`;
1126
+ if (name.length > KNOWLEDGE_NAME_MAX) {
1127
+ bag.error(
1128
+ "knowledge.name-too-long",
1129
+ `${label}: name is ${name.length} characters; the platform accepts at most ${KNOWLEDGE_NAME_MAX}.`
1130
+ );
1131
+ } else if (!KNOWLEDGE_NAME_OK.test(name)) {
1132
+ const bad = [...name].filter((c) => !KNOWLEDGE_NAME_OK.test(c));
1133
+ bag.error(
1134
+ "knowledge.name-charset",
1135
+ `${label}: name contains ${bad.map((c) => JSON.stringify(c)).join(", ")}. The platform accepts the deploy and then silently DROPS the item \u2014 the agent ends up with no such knowledge and nothing reports an error. Names may use letters, digits, and \`/ _ - { } . \` or a space.`
1136
+ );
1137
+ }
1138
+ if (item.knowledge_type === "agents.md" && item.mode !== "auto") {
1139
+ bag.warn(
1140
+ "knowledge.agents-md-mode",
1141
+ `${label}: \`mode: "${item.mode}"\` has no effect on an \`agents.md\` item \u2014 its body is injected in full on every turn regardless. Drop \`mode\`, or make this a \`skill\` if you wanted the item loaded on demand.`
1142
+ );
1143
+ }
1144
+ for (const [field, value] of [
1145
+ ["name", name],
1146
+ ["description", String(item.description ?? "")]
1147
+ ]) {
1148
+ if (value.includes("\n")) {
1149
+ bag.warn(
1150
+ "knowledge.newline",
1151
+ `${label}: \`${field}\` contains a newline. It deploys, but the platform writes these into a line-oriented markdown header when a workspace is synced to files, and a newline does not survive that round trip.`
1152
+ );
1153
+ }
1154
+ }
1155
+ if (opts.resolved) {
1156
+ if (String(item.content ?? "").trim() === "") {
1157
+ bag.warn(
1158
+ "knowledge.empty-body",
1159
+ `${label}: the markdown body is empty. An enabled item still occupies a slot in the agent's menu and contributes nothing when loaded.`
1160
+ );
1161
+ }
1162
+ }
1163
+ }
1164
+ }
1111
1165
 
1112
1166
  // src/workspace/xano.ts
1113
1167
  var XANO_BRAND = /* @__PURE__ */ Symbol.for("xanots.Xano");
@@ -1118,6 +1172,7 @@ var Xano = class {
1118
1172
  sections = /* @__PURE__ */ new Map();
1119
1173
  /** Table defs, encoded lazily at {@link export} so each can inherit the workspace `use_xdo`. */
1120
1174
  tableDefs = [];
1175
+ knowledgeDefs = [];
1121
1176
  workspaceConfig = {};
1122
1177
  bundleType = "workspace";
1123
1178
  /** True for any `Xano` registry, even one created by a different module instance. */
@@ -1146,6 +1201,9 @@ var Xano = class {
1146
1201
  for (const def of defs) this.tableDefs.push(def);
1147
1202
  return this;
1148
1203
  }
1204
+ if (kind.name === "knowledge") {
1205
+ for (const def of defs) this.knowledgeDefs.push(def);
1206
+ }
1149
1207
  const bucket = this.sections.get(kind.payloadKey) ?? [];
1150
1208
  for (const def of defs) bucket.push(this.encodeOne(kind, def));
1151
1209
  this.sections.set(kind.payloadKey, bucket);
@@ -1200,6 +1258,35 @@ var Xano = class {
1200
1258
  this.workspaceConfig = encodeObject("workspace", withName);
1201
1259
  return this;
1202
1260
  }
1261
+ /**
1262
+ * Fill each encoded knowledge item's `content` and emit its reference files as
1263
+ * the sibling `knowledge_file` section.
1264
+ *
1265
+ * Reference rows name their parent by GUID rather than by row id: the id does
1266
+ * not exist until the import inserts the parent, and the importer resolves the
1267
+ * guid back to it. `references` stays empty — the platform derives that list
1268
+ * from the stored files itself, so anything written here is overwritten.
1269
+ */
1270
+ fillKnowledge(sections, resolved) {
1271
+ const byName = new Map(resolved.map((r) => [r.name, r]));
1272
+ const items = sections.knowledge ?? [];
1273
+ const files = [];
1274
+ for (const item of items) {
1275
+ const match = byName.get(item.name);
1276
+ if (match === void 0) continue;
1277
+ item.content = match.content;
1278
+ for (const file of match.files) {
1279
+ files.push({
1280
+ knowledge: { id: item.guid },
1281
+ path: file.path,
1282
+ content: file.content,
1283
+ size: file.size,
1284
+ guid: deriveGuid("knowledge_file", `${item.name}/${file.path}`)
1285
+ });
1286
+ }
1287
+ }
1288
+ if (files.length > 0) sections.knowledge_file = files;
1289
+ }
1203
1290
  /** Set the bundle `type` (defaults to "workspace"). */
1204
1291
  setBundleType(type) {
1205
1292
  this.bundleType = type;
@@ -1214,9 +1301,23 @@ var Xano = class {
1214
1301
  tables() {
1215
1302
  return [...this.tableDefs];
1216
1303
  }
1304
+ /**
1305
+ * The registered knowledge defs (with their authored `body`/`refs` path
1306
+ * markers), for the Node compile path to read markdown off disk. Deliberately
1307
+ * NOT reached from `export()` — a file read has no place in the browser-safe
1308
+ * bundle, so the encoder emits an empty `content` and the compile path fills
1309
+ * it. See {@link import("./knowledge.js")}.
1310
+ */
1311
+ knowledge() {
1312
+ return [...this.knowledgeDefs];
1313
+ }
1217
1314
  registerFunctions(defs) {
1218
1315
  return this.register("function", defs);
1219
1316
  }
1317
+ /** Register knowledge items — the markdown a workspace's AI agents read. */
1318
+ registerKnowledge(defs) {
1319
+ return this.register("knowledge", defs);
1320
+ }
1220
1321
  registerTriggers(defs) {
1221
1322
  return this.register("trigger", defs);
1222
1323
  }
@@ -1294,6 +1395,9 @@ var Xano = class {
1294
1395
  return { ...encoded, import: { mode: "standard" } };
1295
1396
  });
1296
1397
  }
1398
+ if (options.knowledge !== void 0 && options.knowledge.length > 0) {
1399
+ this.fillKnowledge(sections, options.knowledge);
1400
+ }
1297
1401
  const bag = new DiagnosticBag(options.strict === true);
1298
1402
  this.validateQueryAuth(sections, bag);
1299
1403
  this.validateMiddlewareAuth(sections, bag);
@@ -1315,6 +1419,7 @@ var Xano = class {
1315
1419
  checkNullMatchArgs(sections, bag);
1316
1420
  checkSameNameSiblings(sections, bag);
1317
1421
  checkSeed(this.tableDefs, bag);
1422
+ checkKnowledge(sections, bag, { resolved: options.knowledge !== void 0 });
1318
1423
  checkRealtimePublish(this.bundleType, sections, bag);
1319
1424
  bag.flush();
1320
1425
  if (lockCtx) this.applyLock(lockCtx, sections);
@@ -1547,4 +1652,4 @@ export {
1547
1652
  Xano,
1548
1653
  workspace
1549
1654
  };
1550
- //# sourceMappingURL=chunk-55VHDNW5.js.map
1655
+ //# sourceMappingURL=chunk-BPEEGJJA.js.map
@@ -35,7 +35,7 @@ import {
35
35
  registerKind,
36
36
  tableColumns,
37
37
  withFilters
38
- } from "./chunk-5L4X5LS6.js";
38
+ } from "./chunk-YUPQOLFX.js";
39
39
  import {
40
40
  assertPathParamInputs,
41
41
  fillPathParams,
@@ -51,7 +51,7 @@ import {
51
51
  deriveGuid,
52
52
  realtimeChannelSeedName,
53
53
  resolveRef
54
- } from "./chunk-4HT3BNZ7.js";
54
+ } from "./chunk-YUBJLB6G.js";
55
55
 
56
56
  // src/statements/set-var.ts
57
57
  var SET_VAR = "mvp:set_var";
@@ -3721,4 +3721,4 @@ export {
3721
3721
  workspaceKind,
3722
3722
  workspaceConfig
3723
3723
  };
3724
- //# sourceMappingURL=chunk-U3G2UW65.js.map
3724
+ //# sourceMappingURL=chunk-CYJ7R3AD.js.map
@@ -5,9 +5,7 @@ import {
5
5
  presetFilePath,
6
6
  renderPreset,
7
7
  upsertManagedBlock
8
- } from "./chunk-CMZLPTGW.js";
9
- import "./chunk-WUSKBXXD.js";
10
- import "./chunk-6DHJVLYP.js";
8
+ } from "./chunk-7SISR3CS.js";
11
9
  import {
12
10
  warn
13
11
  } from "./chunk-EZG76F7R.js";
@@ -50,7 +48,7 @@ function appNameFor(projectDir) {
50
48
  }
51
49
  function refreshAgentFiles(opts) {
52
50
  const env = opts.env ?? process.env;
53
- if (isCI(env) || !codingAgentDetected(env)) return [];
51
+ if (opts.explicit !== true && (isCI(env) || !codingAgentDetected(env))) return [];
54
52
  const mode = opts.mode ?? guidanceModeFor(opts.projectDir);
55
53
  const appName = opts.appName ?? appNameFor(opts.projectDir);
56
54
  const managed = [];
@@ -87,10 +85,11 @@ function refreshAgentFiles(opts) {
87
85
  }
88
86
  return refreshed;
89
87
  }
88
+
90
89
  export {
91
- CI_ENV_VARS,
92
90
  codingAgentDetected,
91
+ CI_ENV_VARS,
93
92
  isCI,
94
93
  refreshAgentFiles
95
94
  };
96
- //# sourceMappingURL=agent-file-refresh-6M5M7T24.js.map
95
+ //# sourceMappingURL=chunk-D6OGU2AI.js.map