theokit 0.12.1 → 0.14.0

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 (103) hide show
  1. package/dist/{actions-virtual-module-SQDY3V5X.js → actions-virtual-module-3CDQTWOC.js} +6 -6
  2. package/dist/{actions-virtual-module-PNPRCEOS.js → actions-virtual-module-RM7JRY5N.js} +9 -9
  3. package/dist/agents-typed-client-SAWAAH7K.js +142 -0
  4. package/dist/agents-typed-client-SAWAAH7K.js.map +1 -0
  5. package/dist/agents-typed-client-UTEQUA63.js +143 -0
  6. package/dist/agents-typed-client-UTEQUA63.js.map +1 -0
  7. package/dist/{app-typed-client-5GYEOYP3.js → app-typed-client-5VQE6DNF.js} +9 -9
  8. package/dist/{app-typed-client-QG7BVZYW.js → app-typed-client-CSOK7NPC.js} +6 -6
  9. package/dist/body-parser-web-FV5HWCY3.js +71 -0
  10. package/dist/body-parser-web-FV5HWCY3.js.map +1 -0
  11. package/dist/boot/index.js +3 -3
  12. package/dist/{build-QFRLSEZ4.js → build-5K7LK77K.js} +11 -11
  13. package/dist/{chunk-223EFY5X.js → chunk-2J7XU3PW.js} +68 -27
  14. package/dist/chunk-2J7XU3PW.js.map +1 -0
  15. package/dist/chunk-5UUOGAJH.js +445 -0
  16. package/dist/chunk-5UUOGAJH.js.map +1 -0
  17. package/dist/{chunk-43D6XNDR.js → chunk-637WJB7Z.js} +91 -18
  18. package/dist/chunk-637WJB7Z.js.map +1 -0
  19. package/dist/{chunk-6FYD34NX.js → chunk-BQDGES7C.js} +28 -28
  20. package/dist/{chunk-6FYD34NX.js.map → chunk-BQDGES7C.js.map} +1 -1
  21. package/dist/chunk-F4YUPDJ2.js +115 -0
  22. package/dist/chunk-F4YUPDJ2.js.map +1 -0
  23. package/dist/{chunk-TGTNRUH3.js → chunk-H243MR3F.js} +2 -2
  24. package/dist/chunk-JZHT3LW7.js +32 -0
  25. package/dist/chunk-JZHT3LW7.js.map +1 -0
  26. package/dist/chunk-KGFNWIMS.js +94 -0
  27. package/dist/chunk-KGFNWIMS.js.map +1 -0
  28. package/dist/{chunk-NAZ4E2GT.js → chunk-KXA37ONC.js} +2 -2
  29. package/dist/{chunk-7CBRKNQA.js → chunk-RBHCJHRR.js} +251 -22
  30. package/dist/chunk-RBHCJHRR.js.map +1 -0
  31. package/dist/chunk-RSVN727G.js +1 -0
  32. package/dist/chunk-S7Y5WLZY.js +235 -0
  33. package/dist/chunk-S7Y5WLZY.js.map +1 -0
  34. package/dist/{chunk-GFMQJHXX.js → chunk-WR4F4EEZ.js} +1082 -1074
  35. package/dist/chunk-WR4F4EEZ.js.map +1 -0
  36. package/dist/{chunk-WFNLNIJX.js → chunk-Z5IGLBWE.js} +1 -1
  37. package/dist/cli/index.js +5 -5
  38. package/dist/client/index.d.ts +41 -134
  39. package/dist/client/index.js +60 -202
  40. package/dist/client/index.js.map +1 -1
  41. package/dist/{dev-GBXOTXUP.js → dev-QOEVYNBG.js} +10 -10
  42. package/dist/{dev-emit-FEFEDLZF.js → dev-emit-5MDSBP5D.js} +3 -3
  43. package/dist/{dev-emit-O4EGOSNV.js → dev-emit-QH2YGZXN.js} +2 -2
  44. package/dist/index.js +13 -12
  45. package/dist/index.js.map +1 -1
  46. package/dist/internal-api-5BDI6N5U.js +83 -0
  47. package/dist/internal-api-EFKZWIYZ.js +66 -0
  48. package/dist/{openapi-VR6AFBLJ.js → openapi-FHY6HC6I.js} +7 -7
  49. package/dist/{registry-Q2TZQLUH.js → registry-34LL7NF4.js} +1 -1
  50. package/dist/{routes-LRYOIIAI.js → routes-EW7TP7NJ.js} +2 -2
  51. package/dist/server/auth/index.js +1 -1
  52. package/dist/server/define/index.d.ts +3 -70
  53. package/dist/server/define/index.js +4 -4
  54. package/dist/server/http/index.js +2 -2
  55. package/dist/server/index.d.ts +2 -4
  56. package/dist/server/index.js +94 -394
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/server/jobs/index.js +4 -4
  59. package/dist/server/observability/index.js +1 -1
  60. package/dist/server/scan/index.d.ts +22 -2
  61. package/dist/server/scan/index.js +2 -2
  62. package/dist/{start-3ZHAXSJE.js → start-2KG4JSXM.js} +76 -13
  63. package/dist/start-2KG4JSXM.js.map +1 -0
  64. package/dist/vite-plugin/index.js +13 -12
  65. package/dist/{vite-plugin-WO72VLYR.js → vite-plugin-TDIDZ5U7.js} +7 -7
  66. package/dist/vite-plugin-TDIDZ5U7.js.map +1 -0
  67. package/package.json +3 -7
  68. package/dist/agent-events-DosDXkSV.d.ts +0 -94
  69. package/dist/chunk-223EFY5X.js.map +0 -1
  70. package/dist/chunk-3LVRAGAZ.js +0 -73
  71. package/dist/chunk-3LVRAGAZ.js.map +0 -1
  72. package/dist/chunk-43D6XNDR.js.map +0 -1
  73. package/dist/chunk-7CBRKNQA.js.map +0 -1
  74. package/dist/chunk-AD74EAK3.js +0 -237
  75. package/dist/chunk-AD74EAK3.js.map +0 -1
  76. package/dist/chunk-GFMQJHXX.js.map +0 -1
  77. package/dist/chunk-PBEH6NXR.js +0 -44
  78. package/dist/chunk-PBEH6NXR.js.map +0 -1
  79. package/dist/chunk-PIVX3DYW.js +0 -142
  80. package/dist/chunk-PIVX3DYW.js.map +0 -1
  81. package/dist/chunk-PPPR5DGR.js +0 -1
  82. package/dist/chunk-RESN62GB.js +0 -269
  83. package/dist/chunk-RESN62GB.js.map +0 -1
  84. package/dist/server/agent/index.d.ts +0 -229
  85. package/dist/server/agent/index.js +0 -16
  86. package/dist/start-3ZHAXSJE.js.map +0 -1
  87. /package/dist/{actions-virtual-module-SQDY3V5X.js.map → actions-virtual-module-3CDQTWOC.js.map} +0 -0
  88. /package/dist/{actions-virtual-module-PNPRCEOS.js.map → actions-virtual-module-RM7JRY5N.js.map} +0 -0
  89. /package/dist/{app-typed-client-5GYEOYP3.js.map → app-typed-client-5VQE6DNF.js.map} +0 -0
  90. /package/dist/{app-typed-client-QG7BVZYW.js.map → app-typed-client-CSOK7NPC.js.map} +0 -0
  91. /package/dist/{build-QFRLSEZ4.js.map → build-5K7LK77K.js.map} +0 -0
  92. /package/dist/{chunk-TGTNRUH3.js.map → chunk-H243MR3F.js.map} +0 -0
  93. /package/dist/{chunk-NAZ4E2GT.js.map → chunk-KXA37ONC.js.map} +0 -0
  94. /package/dist/{chunk-PPPR5DGR.js.map → chunk-RSVN727G.js.map} +0 -0
  95. /package/dist/{chunk-WFNLNIJX.js.map → chunk-Z5IGLBWE.js.map} +0 -0
  96. /package/dist/{dev-GBXOTXUP.js.map → dev-QOEVYNBG.js.map} +0 -0
  97. /package/dist/{dev-emit-FEFEDLZF.js.map → dev-emit-5MDSBP5D.js.map} +0 -0
  98. /package/dist/{dev-emit-O4EGOSNV.js.map → dev-emit-QH2YGZXN.js.map} +0 -0
  99. /package/dist/{server/agent/index.js.map → internal-api-5BDI6N5U.js.map} +0 -0
  100. /package/dist/{vite-plugin-WO72VLYR.js.map → internal-api-EFKZWIYZ.js.map} +0 -0
  101. /package/dist/{openapi-VR6AFBLJ.js.map → openapi-FHY6HC6I.js.map} +0 -0
  102. /package/dist/{registry-Q2TZQLUH.js.map → registry-34LL7NF4.js.map} +0 -0
  103. /package/dist/{routes-LRYOIIAI.js.map → routes-EW7TP7NJ.js.map} +0 -0
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import "tsx/esm";
3
- import "./chunk-NAZ4E2GT.js";
4
- import "./chunk-GFMQJHXX.js";
5
- import "./chunk-HGZL5EOI.js";
6
- import "./chunk-3LVRAGAZ.js";
3
+ import "./chunk-KXA37ONC.js";
4
+ import "./chunk-WR4F4EEZ.js";
5
+ import "./chunk-F4YUPDJ2.js";
7
6
  import {
8
7
  scanServerActionsEnriched
9
- } from "./chunk-6FYD34NX.js";
8
+ } from "./chunk-BQDGES7C.js";
9
+ import "./chunk-HGZL5EOI.js";
10
10
 
11
11
  // src/vite-plugin/actions-virtual-module.ts
12
12
  import { existsSync, mkdirSync, renameSync, watch as fsWatch, writeFileSync } from "fs";
@@ -209,4 +209,4 @@ export const actions = manifest
209
209
  export {
210
210
  actionsVirtualModule
211
211
  };
212
- //# sourceMappingURL=actions-virtual-module-SQDY3V5X.js.map
212
+ //# sourceMappingURL=actions-virtual-module-3CDQTWOC.js.map
@@ -1,23 +1,23 @@
1
- import "./chunk-PPPR5DGR.js";
2
- import "./chunk-TGTNRUH3.js";
3
- import "./chunk-GY5Q27BJ.js";
1
+ import "./chunk-RSVN727G.js";
4
2
  import "./chunk-5QW7IQQU.js";
5
- import "./chunk-WFNLNIJX.js";
6
3
  import "./chunk-IAJ2JVEH.js";
7
4
  import "./chunk-VMEWD57H.js";
8
5
  import "./chunk-JQSKBMXP.js";
9
6
  import {
10
7
  scanServerActionsEnriched
11
- } from "./chunk-223EFY5X.js";
8
+ } from "./chunk-2J7XU3PW.js";
12
9
  import "./chunk-WSJKACWB.js";
13
- import "./chunk-ZEGYW52B.js";
14
10
  import "./chunk-JBCHWRKF.js";
11
+ import "./chunk-C3ZZ56YZ.js";
12
+ import "./chunk-X2VVCJ4V.js";
13
+ import "./chunk-H243MR3F.js";
14
+ import "./chunk-GY5Q27BJ.js";
15
+ import "./chunk-Z5IGLBWE.js";
16
+ import "./chunk-ZEGYW52B.js";
15
17
  import "./chunk-TSLSIRBR.js";
16
18
  import "./chunk-UD3LFGDL.js";
17
19
  import "./chunk-X32XEJXR.js";
18
20
  import "./chunk-UVXB2ER7.js";
19
- import "./chunk-C3ZZ56YZ.js";
20
- import "./chunk-X2VVCJ4V.js";
21
21
  import "./chunk-DGUM43GV.js";
22
22
 
23
23
  // src/vite-plugin/actions-virtual-module.ts
@@ -221,4 +221,4 @@ export const actions = manifest
221
221
  export {
222
222
  actionsVirtualModule
223
223
  };
224
- //# sourceMappingURL=actions-virtual-module-PNPRCEOS.js.map
224
+ //# sourceMappingURL=actions-virtual-module-RM7JRY5N.js.map
@@ -0,0 +1,142 @@
1
+ import "./chunk-DGUM43GV.js";
2
+
3
+ // src/vite-plugin/agents-typed-client.ts
4
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "fs";
5
+ import { dirname, posix } from "path";
6
+ var FILE_HEADER = `// AUTO-GENERATED by theokit \u2014 do not edit.
7
+ // Source: theokit/packages/theo/src/vite-plugin/agents-typed-client.ts (M2).
8
+ // To refresh: \`pnpm dev\` or \`pnpm build\` regenerates this on every agents/ change.
9
+
10
+ /* eslint-disable */
11
+ `;
12
+ function aliasFor(name) {
13
+ return `_agent_${name.replace(/[^\w$]/g, "_")}`;
14
+ }
15
+ function importPath(dtsOutPath, projectRoot, filePath) {
16
+ const fromDir = dirname(dtsOutPath).replace(/\\/g, "/");
17
+ const abs = posix.join(projectRoot.replace(/\\/g, "/"), filePath.replace(/\\/g, "/"));
18
+ const noExt = abs.replace(/\.[jt]sx?$/, "");
19
+ let rel = posix.relative(fromDir, noExt);
20
+ if (!rel.startsWith(".")) rel = `./${rel}`;
21
+ return rel;
22
+ }
23
+ function generateAgentsDts({
24
+ manifest,
25
+ dtsOutPath,
26
+ projectRoot
27
+ }) {
28
+ const agents = manifest.agents ?? [];
29
+ const imports = [];
30
+ const entries = [];
31
+ for (const agent of agents) {
32
+ const alias = aliasFor(agent.name);
33
+ imports.push(
34
+ ` import type ${alias} from '${importPath(dtsOutPath, projectRoot, agent.filePath)}'`
35
+ );
36
+ entries.push(` '${agent.name}': { input: InferAgentInput<${alias}> }`);
37
+ }
38
+ const body = entries.length > 0 ? `{
39
+ ${entries.join("\n")}
40
+ }` : `{
41
+ // No agents detected \u2014 add \`agents/*.ts\` to populate this binding.
42
+ }`;
43
+ const importBlock = imports.length > 0 ? `${imports.join("\n")}
44
+ ` : "";
45
+ return `${FILE_HEADER}
46
+ declare module '@theo/agents' {
47
+ import type { InferAgentInput } from '@theokit/agents'
48
+ import type { UseAgentReturn } from 'theokit/client'
49
+ ${importBlock}
50
+ export interface AppAgents ${body}
51
+
52
+ export function useAgent<K extends keyof AppAgents>(
53
+ name: K,
54
+ ): UseAgentReturn<AppAgents[K]['input']>
55
+ }
56
+ `;
57
+ }
58
+ var VIRTUAL_AGENTS_ID = "@theo/agents";
59
+ var RESOLVED_AGENTS_ID = "\0@theo/agents";
60
+ function writeIfChanged(filePath, content) {
61
+ if (existsSync(filePath)) {
62
+ try {
63
+ if (readFileSync(filePath, "utf-8") === content) return;
64
+ } catch {
65
+ }
66
+ }
67
+ mkdirSync(dirname(filePath), { recursive: true });
68
+ const tmp = `${filePath}.${process.pid}.tmp`;
69
+ writeFileSync(tmp, content);
70
+ renameSync(tmp, filePath);
71
+ }
72
+ function emitAgentsDts(opts) {
73
+ const dtsOutPath = posix.join(opts.distDir.replace(/\\/g, "/"), "agents.d.ts");
74
+ const content = generateAgentsDts({
75
+ manifest: opts.scanManifest(opts.projectRoot),
76
+ dtsOutPath,
77
+ projectRoot: opts.projectRoot
78
+ });
79
+ writeIfChanged(dtsOutPath, content);
80
+ return dtsOutPath;
81
+ }
82
+ function agentsTypedClientPlugin(opts) {
83
+ let debounce;
84
+ let viteServer;
85
+ const scheduleEmit = () => {
86
+ if (debounce) clearTimeout(debounce);
87
+ debounce = setTimeout(() => {
88
+ try {
89
+ emitAgentsDts(opts);
90
+ if (viteServer) {
91
+ const mod = viteServer.moduleGraph.getModuleById(RESOLVED_AGENTS_ID);
92
+ if (mod) viteServer.moduleGraph.invalidateModule(mod);
93
+ }
94
+ } catch (err) {
95
+ console.error("[theokit:agents-typed-client] codegen error:", err);
96
+ }
97
+ }, 100);
98
+ };
99
+ return {
100
+ name: "theokit:agents-typed-client",
101
+ enforce: "post",
102
+ configResolved() {
103
+ try {
104
+ emitAgentsDts(opts);
105
+ } catch (err) {
106
+ console.error("[theokit:agents-typed-client] initial codegen error:", err);
107
+ }
108
+ },
109
+ buildEnd() {
110
+ try {
111
+ emitAgentsDts(opts);
112
+ } catch (err) {
113
+ console.error("[theokit:agents-typed-client] buildEnd codegen error:", err);
114
+ }
115
+ },
116
+ configureServer(server) {
117
+ viteServer = server;
118
+ const agentsGlob = posix.join(opts.projectRoot.replace(/\\/g, "/"), "agents");
119
+ const onFile = (file) => {
120
+ if (file.replace(/\\/g, "/").startsWith(agentsGlob)) scheduleEmit();
121
+ };
122
+ server.watcher.on("add", onFile);
123
+ server.watcher.on("change", onFile);
124
+ server.watcher.on("unlink", onFile);
125
+ },
126
+ resolveId(id) {
127
+ return id === VIRTUAL_AGENTS_ID ? RESOLVED_AGENTS_ID : null;
128
+ },
129
+ load(id) {
130
+ if (id === RESOLVED_AGENTS_ID) {
131
+ return `export { useAgent } from 'theokit/client'
132
+ `;
133
+ }
134
+ return null;
135
+ }
136
+ };
137
+ }
138
+ export {
139
+ agentsTypedClientPlugin,
140
+ generateAgentsDts
141
+ };
142
+ //# sourceMappingURL=agents-typed-client-SAWAAH7K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin/agents-typed-client.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Codegen-time fs ops: all paths derive from `opts.projectRoot` / `opts.distDir`\n * (vite plugin opts — trusted, set by the framework's CLI). Never serves HTTP input.\n */\n/**\n * M2 (theokit-ai-first) — end-to-end typed binding for the `agents/*.ts` convention.\n *\n * Sibling of `app-typed-client.ts` (kept separate so the `@theo/client` output stays\n * byte-unchanged). Two parts:\n *\n * 1. `generateAgentsDts({ manifest, dtsOutPath, projectRoot })` — pure function emitting\n * `.theokit/agents.d.ts` (the virtual `@theo/agents` module) with `AppAgents` mapping\n * each scanned agent to `InferAgentInput` of its `defineAgent({ input })` schema, plus a\n * typed `useAgent` signature — so the client binds to `/api/agents/<name>` with the right\n * request type and ZERO manual wiring (DoD line 2).\n * 2. `agentsTypedClientPlugin(opts)` — Vite plugin that emits (1), rewrites on `agents/*`\n * changes, and serves the virtual `@theo/agents` runtime (`useAgent` from `theokit/client`).\n */\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'\nimport { dirname, posix } from 'node:path'\n\nimport type { Plugin, ViteDevServer } from 'vite'\n\nimport type { TheoManifest } from '../server/internal-api.js'\n\nconst FILE_HEADER = `// AUTO-GENERATED by theokit — do not edit.\n// Source: theokit/packages/theo/src/vite-plugin/agents-typed-client.ts (M2).\n// To refresh: \\`pnpm dev\\` or \\`pnpm build\\` regenerates this on every agents/ change.\n\n/* eslint-disable */\n`\n\n/** A safe TS identifier alias for an agent (name may contain path separators). */\nfunction aliasFor(name: string): string {\n return `_agent_${name.replace(/[^\\w$]/g, '_')}`\n}\n\n/** Relative `import type` path from the .d.ts dir to the agent source (extension stripped). */\nfunction importPath(dtsOutPath: string, projectRoot: string, filePath: string): string {\n const fromDir = dirname(dtsOutPath).replace(/\\\\/g, '/')\n const abs = posix.join(projectRoot.replace(/\\\\/g, '/'), filePath.replace(/\\\\/g, '/'))\n const noExt = abs.replace(/\\.[jt]sx?$/, '')\n let rel = posix.relative(fromDir, noExt)\n if (!rel.startsWith('.')) rel = `./${rel}`\n return rel\n}\n\nexport interface GenerateAgentsDtsOptions {\n manifest: TheoManifest\n /** Absolute path to the .d.ts that will be emitted (drives the import paths). */\n dtsOutPath: string\n /** Absolute project root — agents live at `<projectRoot>/agents`. */\n projectRoot: string\n}\n\nexport function generateAgentsDts({\n manifest,\n dtsOutPath,\n projectRoot,\n}: GenerateAgentsDtsOptions): string {\n const agents = manifest.agents ?? []\n const imports: string[] = []\n const entries: string[] = []\n for (const agent of agents) {\n const alias = aliasFor(agent.name)\n imports.push(\n ` import type ${alias} from '${importPath(dtsOutPath, projectRoot, agent.filePath)}'`,\n )\n entries.push(` '${agent.name}': { input: InferAgentInput<${alias}> }`)\n }\n\n const body =\n entries.length > 0\n ? `{\\n${entries.join('\\n')}\\n }`\n : `{\\n // No agents detected — add \\`agents/*.ts\\` to populate this binding.\\n }`\n\n const importBlock = imports.length > 0 ? `${imports.join('\\n')}\\n` : ''\n\n return `${FILE_HEADER}\ndeclare module '@theo/agents' {\n import type { InferAgentInput } from '@theokit/agents'\n import type { UseAgentReturn } from 'theokit/client'\n${importBlock}\n export interface AppAgents ${body}\n\n export function useAgent<K extends keyof AppAgents>(\n name: K,\n ): UseAgentReturn<AppAgents[K]['input']>\n}\n`\n}\n\n// ─── Vite plugin ─────────────────────────────────────────────────────────────\n\nconst VIRTUAL_AGENTS_ID = '@theo/agents'\nconst RESOLVED_AGENTS_ID = '\\0@theo/agents'\n\nexport interface AgentsTypedClientPluginOptions {\n /** Absolute project root (agents live at `<projectRoot>/agents`). */\n projectRoot: string\n /** Absolute `.theokit/` output dir (where `agents.d.ts` lands). */\n distDir: string\n /** Injects the scanned agents; returns the current manifest-shaped agent list. */\n scanManifest: (projectRoot: string) => TheoManifest\n}\n\n/** Atomic write via tmp + rename; skips when content is unchanged. */\nfunction writeIfChanged(filePath: string, content: string): void {\n if (existsSync(filePath)) {\n try {\n if (readFileSync(filePath, 'utf-8') === content) return\n } catch {\n /* fall through to write */\n }\n }\n mkdirSync(dirname(filePath), { recursive: true })\n const tmp = `${filePath}.${process.pid}.tmp`\n writeFileSync(tmp, content)\n renameSync(tmp, filePath)\n}\n\nfunction emitAgentsDts(opts: AgentsTypedClientPluginOptions): string {\n const dtsOutPath = posix.join(opts.distDir.replace(/\\\\/g, '/'), 'agents.d.ts')\n const content = generateAgentsDts({\n manifest: opts.scanManifest(opts.projectRoot),\n dtsOutPath,\n projectRoot: opts.projectRoot,\n })\n writeIfChanged(dtsOutPath, content)\n return dtsOutPath\n}\n\nexport function agentsTypedClientPlugin(opts: AgentsTypedClientPluginOptions): Plugin {\n let debounce: NodeJS.Timeout | undefined\n let viteServer: ViteDevServer | undefined\n\n const scheduleEmit = (): void => {\n if (debounce) clearTimeout(debounce)\n debounce = setTimeout(() => {\n try {\n emitAgentsDts(opts)\n if (viteServer) {\n const mod = viteServer.moduleGraph.getModuleById(RESOLVED_AGENTS_ID)\n if (mod) viteServer.moduleGraph.invalidateModule(mod)\n }\n } catch (err) {\n console.error('[theokit:agents-typed-client] codegen error:', err)\n }\n }, 100)\n }\n\n return {\n name: 'theokit:agents-typed-client',\n enforce: 'post',\n configResolved() {\n try {\n emitAgentsDts(opts)\n } catch (err) {\n console.error('[theokit:agents-typed-client] initial codegen error:', err)\n }\n },\n buildEnd() {\n try {\n emitAgentsDts(opts)\n } catch (err) {\n console.error('[theokit:agents-typed-client] buildEnd codegen error:', err)\n }\n },\n configureServer(server) {\n viteServer = server\n const agentsGlob = posix.join(opts.projectRoot.replace(/\\\\/g, '/'), 'agents')\n const onFile = (file: string): void => {\n if (file.replace(/\\\\/g, '/').startsWith(agentsGlob)) scheduleEmit()\n }\n server.watcher.on('add', onFile)\n server.watcher.on('change', onFile)\n server.watcher.on('unlink', onFile)\n },\n resolveId(id) {\n return id === VIRTUAL_AGENTS_ID ? RESOLVED_AGENTS_ID : null\n },\n load(id) {\n if (id === RESOLVED_AGENTS_ID) {\n return `export { useAgent } from 'theokit/client'\\n`\n }\n return null\n },\n }\n}\n"],"mappings":";;;AAkBA,SAAS,YAAY,WAAW,cAAc,YAAY,qBAAqB;AAC/E,SAAS,SAAS,aAAa;AAM/B,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAQpB,SAAS,SAAS,MAAsB;AACtC,SAAO,UAAU,KAAK,QAAQ,WAAW,GAAG,CAAC;AAC/C;AAGA,SAAS,WAAW,YAAoB,aAAqB,UAA0B;AACrF,QAAM,UAAU,QAAQ,UAAU,EAAE,QAAQ,OAAO,GAAG;AACtD,QAAM,MAAM,MAAM,KAAK,YAAY,QAAQ,OAAO,GAAG,GAAG,SAAS,QAAQ,OAAO,GAAG,CAAC;AACpF,QAAM,QAAQ,IAAI,QAAQ,cAAc,EAAE;AAC1C,MAAI,MAAM,MAAM,SAAS,SAAS,KAAK;AACvC,MAAI,CAAC,IAAI,WAAW,GAAG,EAAG,OAAM,KAAK,GAAG;AACxC,SAAO;AACT;AAUO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,GAAqC;AACnC,QAAM,SAAS,SAAS,UAAU,CAAC;AACnC,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,YAAQ;AAAA,MACN,iBAAiB,KAAK,UAAU,WAAW,YAAY,aAAa,MAAM,QAAQ,CAAC;AAAA,IACrF;AACA,YAAQ,KAAK,QAAQ,MAAM,IAAI,+BAA+B,KAAK,KAAK;AAAA,EAC1E;AAEA,QAAM,OACJ,QAAQ,SAAS,IACb;AAAA,EAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,OACxB;AAAA;AAAA;AAEN,QAAM,cAAc,QAAQ,SAAS,IAAI,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA,IAAO;AAErE,SAAO,GAAG,WAAW;AAAA;AAAA;AAAA;AAAA,EAIrB,WAAW;AAAA,+BACkB,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnC;AAIA,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAY3B,SAAS,eAAe,UAAkB,SAAuB;AAC/D,MAAI,WAAW,QAAQ,GAAG;AACxB,QAAI;AACF,UAAI,aAAa,UAAU,OAAO,MAAM,QAAS;AAAA,IACnD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,YAAU,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,QAAM,MAAM,GAAG,QAAQ,IAAI,QAAQ,GAAG;AACtC,gBAAc,KAAK,OAAO;AAC1B,aAAW,KAAK,QAAQ;AAC1B;AAEA,SAAS,cAAc,MAA8C;AACnE,QAAM,aAAa,MAAM,KAAK,KAAK,QAAQ,QAAQ,OAAO,GAAG,GAAG,aAAa;AAC7E,QAAM,UAAU,kBAAkB;AAAA,IAChC,UAAU,KAAK,aAAa,KAAK,WAAW;AAAA,IAC5C;AAAA,IACA,aAAa,KAAK;AAAA,EACpB,CAAC;AACD,iBAAe,YAAY,OAAO;AAClC,SAAO;AACT;AAEO,SAAS,wBAAwB,MAA8C;AACpF,MAAI;AACJ,MAAI;AAEJ,QAAM,eAAe,MAAY;AAC/B,QAAI,SAAU,cAAa,QAAQ;AACnC,eAAW,WAAW,MAAM;AAC1B,UAAI;AACF,sBAAc,IAAI;AAClB,YAAI,YAAY;AACd,gBAAM,MAAM,WAAW,YAAY,cAAc,kBAAkB;AACnE,cAAI,IAAK,YAAW,YAAY,iBAAiB,GAAG;AAAA,QACtD;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,gDAAgD,GAAG;AAAA,MACnE;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,iBAAiB;AACf,UAAI;AACF,sBAAc,IAAI;AAAA,MACpB,SAAS,KAAK;AACZ,gBAAQ,MAAM,wDAAwD,GAAG;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,WAAW;AACT,UAAI;AACF,sBAAc,IAAI;AAAA,MACpB,SAAS,KAAK;AACZ,gBAAQ,MAAM,yDAAyD,GAAG;AAAA,MAC5E;AAAA,IACF;AAAA,IACA,gBAAgB,QAAQ;AACtB,mBAAa;AACb,YAAM,aAAa,MAAM,KAAK,KAAK,YAAY,QAAQ,OAAO,GAAG,GAAG,QAAQ;AAC5E,YAAM,SAAS,CAAC,SAAuB;AACrC,YAAI,KAAK,QAAQ,OAAO,GAAG,EAAE,WAAW,UAAU,EAAG,cAAa;AAAA,MACpE;AACA,aAAO,QAAQ,GAAG,OAAO,MAAM;AAC/B,aAAO,QAAQ,GAAG,UAAU,MAAM;AAClC,aAAO,QAAQ,GAAG,UAAU,MAAM;AAAA,IACpC;AAAA,IACA,UAAU,IAAI;AACZ,aAAO,OAAO,oBAAoB,qBAAqB;AAAA,IACzD;AAAA,IACA,KAAK,IAAI;AACP,UAAI,OAAO,oBAAoB;AAC7B,eAAO;AAAA;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,143 @@
1
+ #!/usr/bin/env node
2
+ import "tsx/esm";
3
+
4
+ // src/vite-plugin/agents-typed-client.ts
5
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "fs";
6
+ import { dirname, posix } from "path";
7
+ var FILE_HEADER = `// AUTO-GENERATED by theokit \u2014 do not edit.
8
+ // Source: theokit/packages/theo/src/vite-plugin/agents-typed-client.ts (M2).
9
+ // To refresh: \`pnpm dev\` or \`pnpm build\` regenerates this on every agents/ change.
10
+
11
+ /* eslint-disable */
12
+ `;
13
+ function aliasFor(name) {
14
+ return `_agent_${name.replace(/[^\w$]/g, "_")}`;
15
+ }
16
+ function importPath(dtsOutPath, projectRoot, filePath) {
17
+ const fromDir = dirname(dtsOutPath).replace(/\\/g, "/");
18
+ const abs = posix.join(projectRoot.replace(/\\/g, "/"), filePath.replace(/\\/g, "/"));
19
+ const noExt = abs.replace(/\.[jt]sx?$/, "");
20
+ let rel = posix.relative(fromDir, noExt);
21
+ if (!rel.startsWith(".")) rel = `./${rel}`;
22
+ return rel;
23
+ }
24
+ function generateAgentsDts({
25
+ manifest,
26
+ dtsOutPath,
27
+ projectRoot
28
+ }) {
29
+ const agents = manifest.agents ?? [];
30
+ const imports = [];
31
+ const entries = [];
32
+ for (const agent of agents) {
33
+ const alias = aliasFor(agent.name);
34
+ imports.push(
35
+ ` import type ${alias} from '${importPath(dtsOutPath, projectRoot, agent.filePath)}'`
36
+ );
37
+ entries.push(` '${agent.name}': { input: InferAgentInput<${alias}> }`);
38
+ }
39
+ const body = entries.length > 0 ? `{
40
+ ${entries.join("\n")}
41
+ }` : `{
42
+ // No agents detected \u2014 add \`agents/*.ts\` to populate this binding.
43
+ }`;
44
+ const importBlock = imports.length > 0 ? `${imports.join("\n")}
45
+ ` : "";
46
+ return `${FILE_HEADER}
47
+ declare module '@theo/agents' {
48
+ import type { InferAgentInput } from '@theokit/agents'
49
+ import type { UseAgentReturn } from 'theokit/client'
50
+ ${importBlock}
51
+ export interface AppAgents ${body}
52
+
53
+ export function useAgent<K extends keyof AppAgents>(
54
+ name: K,
55
+ ): UseAgentReturn<AppAgents[K]['input']>
56
+ }
57
+ `;
58
+ }
59
+ var VIRTUAL_AGENTS_ID = "@theo/agents";
60
+ var RESOLVED_AGENTS_ID = "\0@theo/agents";
61
+ function writeIfChanged(filePath, content) {
62
+ if (existsSync(filePath)) {
63
+ try {
64
+ if (readFileSync(filePath, "utf-8") === content) return;
65
+ } catch {
66
+ }
67
+ }
68
+ mkdirSync(dirname(filePath), { recursive: true });
69
+ const tmp = `${filePath}.${process.pid}.tmp`;
70
+ writeFileSync(tmp, content);
71
+ renameSync(tmp, filePath);
72
+ }
73
+ function emitAgentsDts(opts) {
74
+ const dtsOutPath = posix.join(opts.distDir.replace(/\\/g, "/"), "agents.d.ts");
75
+ const content = generateAgentsDts({
76
+ manifest: opts.scanManifest(opts.projectRoot),
77
+ dtsOutPath,
78
+ projectRoot: opts.projectRoot
79
+ });
80
+ writeIfChanged(dtsOutPath, content);
81
+ return dtsOutPath;
82
+ }
83
+ function agentsTypedClientPlugin(opts) {
84
+ let debounce;
85
+ let viteServer;
86
+ const scheduleEmit = () => {
87
+ if (debounce) clearTimeout(debounce);
88
+ debounce = setTimeout(() => {
89
+ try {
90
+ emitAgentsDts(opts);
91
+ if (viteServer) {
92
+ const mod = viteServer.moduleGraph.getModuleById(RESOLVED_AGENTS_ID);
93
+ if (mod) viteServer.moduleGraph.invalidateModule(mod);
94
+ }
95
+ } catch (err) {
96
+ console.error("[theokit:agents-typed-client] codegen error:", err);
97
+ }
98
+ }, 100);
99
+ };
100
+ return {
101
+ name: "theokit:agents-typed-client",
102
+ enforce: "post",
103
+ configResolved() {
104
+ try {
105
+ emitAgentsDts(opts);
106
+ } catch (err) {
107
+ console.error("[theokit:agents-typed-client] initial codegen error:", err);
108
+ }
109
+ },
110
+ buildEnd() {
111
+ try {
112
+ emitAgentsDts(opts);
113
+ } catch (err) {
114
+ console.error("[theokit:agents-typed-client] buildEnd codegen error:", err);
115
+ }
116
+ },
117
+ configureServer(server) {
118
+ viteServer = server;
119
+ const agentsGlob = posix.join(opts.projectRoot.replace(/\\/g, "/"), "agents");
120
+ const onFile = (file) => {
121
+ if (file.replace(/\\/g, "/").startsWith(agentsGlob)) scheduleEmit();
122
+ };
123
+ server.watcher.on("add", onFile);
124
+ server.watcher.on("change", onFile);
125
+ server.watcher.on("unlink", onFile);
126
+ },
127
+ resolveId(id) {
128
+ return id === VIRTUAL_AGENTS_ID ? RESOLVED_AGENTS_ID : null;
129
+ },
130
+ load(id) {
131
+ if (id === RESOLVED_AGENTS_ID) {
132
+ return `export { useAgent } from 'theokit/client'
133
+ `;
134
+ }
135
+ return null;
136
+ }
137
+ };
138
+ }
139
+ export {
140
+ agentsTypedClientPlugin,
141
+ generateAgentsDts
142
+ };
143
+ //# sourceMappingURL=agents-typed-client-UTEQUA63.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin/agents-typed-client.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Codegen-time fs ops: all paths derive from `opts.projectRoot` / `opts.distDir`\n * (vite plugin opts — trusted, set by the framework's CLI). Never serves HTTP input.\n */\n/**\n * M2 (theokit-ai-first) — end-to-end typed binding for the `agents/*.ts` convention.\n *\n * Sibling of `app-typed-client.ts` (kept separate so the `@theo/client` output stays\n * byte-unchanged). Two parts:\n *\n * 1. `generateAgentsDts({ manifest, dtsOutPath, projectRoot })` — pure function emitting\n * `.theokit/agents.d.ts` (the virtual `@theo/agents` module) with `AppAgents` mapping\n * each scanned agent to `InferAgentInput` of its `defineAgent({ input })` schema, plus a\n * typed `useAgent` signature — so the client binds to `/api/agents/<name>` with the right\n * request type and ZERO manual wiring (DoD line 2).\n * 2. `agentsTypedClientPlugin(opts)` — Vite plugin that emits (1), rewrites on `agents/*`\n * changes, and serves the virtual `@theo/agents` runtime (`useAgent` from `theokit/client`).\n */\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'\nimport { dirname, posix } from 'node:path'\n\nimport type { Plugin, ViteDevServer } from 'vite'\n\nimport type { TheoManifest } from '../server/internal-api.js'\n\nconst FILE_HEADER = `// AUTO-GENERATED by theokit — do not edit.\n// Source: theokit/packages/theo/src/vite-plugin/agents-typed-client.ts (M2).\n// To refresh: \\`pnpm dev\\` or \\`pnpm build\\` regenerates this on every agents/ change.\n\n/* eslint-disable */\n`\n\n/** A safe TS identifier alias for an agent (name may contain path separators). */\nfunction aliasFor(name: string): string {\n return `_agent_${name.replace(/[^\\w$]/g, '_')}`\n}\n\n/** Relative `import type` path from the .d.ts dir to the agent source (extension stripped). */\nfunction importPath(dtsOutPath: string, projectRoot: string, filePath: string): string {\n const fromDir = dirname(dtsOutPath).replace(/\\\\/g, '/')\n const abs = posix.join(projectRoot.replace(/\\\\/g, '/'), filePath.replace(/\\\\/g, '/'))\n const noExt = abs.replace(/\\.[jt]sx?$/, '')\n let rel = posix.relative(fromDir, noExt)\n if (!rel.startsWith('.')) rel = `./${rel}`\n return rel\n}\n\nexport interface GenerateAgentsDtsOptions {\n manifest: TheoManifest\n /** Absolute path to the .d.ts that will be emitted (drives the import paths). */\n dtsOutPath: string\n /** Absolute project root — agents live at `<projectRoot>/agents`. */\n projectRoot: string\n}\n\nexport function generateAgentsDts({\n manifest,\n dtsOutPath,\n projectRoot,\n}: GenerateAgentsDtsOptions): string {\n const agents = manifest.agents ?? []\n const imports: string[] = []\n const entries: string[] = []\n for (const agent of agents) {\n const alias = aliasFor(agent.name)\n imports.push(\n ` import type ${alias} from '${importPath(dtsOutPath, projectRoot, agent.filePath)}'`,\n )\n entries.push(` '${agent.name}': { input: InferAgentInput<${alias}> }`)\n }\n\n const body =\n entries.length > 0\n ? `{\\n${entries.join('\\n')}\\n }`\n : `{\\n // No agents detected — add \\`agents/*.ts\\` to populate this binding.\\n }`\n\n const importBlock = imports.length > 0 ? `${imports.join('\\n')}\\n` : ''\n\n return `${FILE_HEADER}\ndeclare module '@theo/agents' {\n import type { InferAgentInput } from '@theokit/agents'\n import type { UseAgentReturn } from 'theokit/client'\n${importBlock}\n export interface AppAgents ${body}\n\n export function useAgent<K extends keyof AppAgents>(\n name: K,\n ): UseAgentReturn<AppAgents[K]['input']>\n}\n`\n}\n\n// ─── Vite plugin ─────────────────────────────────────────────────────────────\n\nconst VIRTUAL_AGENTS_ID = '@theo/agents'\nconst RESOLVED_AGENTS_ID = '\\0@theo/agents'\n\nexport interface AgentsTypedClientPluginOptions {\n /** Absolute project root (agents live at `<projectRoot>/agents`). */\n projectRoot: string\n /** Absolute `.theokit/` output dir (where `agents.d.ts` lands). */\n distDir: string\n /** Injects the scanned agents; returns the current manifest-shaped agent list. */\n scanManifest: (projectRoot: string) => TheoManifest\n}\n\n/** Atomic write via tmp + rename; skips when content is unchanged. */\nfunction writeIfChanged(filePath: string, content: string): void {\n if (existsSync(filePath)) {\n try {\n if (readFileSync(filePath, 'utf-8') === content) return\n } catch {\n /* fall through to write */\n }\n }\n mkdirSync(dirname(filePath), { recursive: true })\n const tmp = `${filePath}.${process.pid}.tmp`\n writeFileSync(tmp, content)\n renameSync(tmp, filePath)\n}\n\nfunction emitAgentsDts(opts: AgentsTypedClientPluginOptions): string {\n const dtsOutPath = posix.join(opts.distDir.replace(/\\\\/g, '/'), 'agents.d.ts')\n const content = generateAgentsDts({\n manifest: opts.scanManifest(opts.projectRoot),\n dtsOutPath,\n projectRoot: opts.projectRoot,\n })\n writeIfChanged(dtsOutPath, content)\n return dtsOutPath\n}\n\nexport function agentsTypedClientPlugin(opts: AgentsTypedClientPluginOptions): Plugin {\n let debounce: NodeJS.Timeout | undefined\n let viteServer: ViteDevServer | undefined\n\n const scheduleEmit = (): void => {\n if (debounce) clearTimeout(debounce)\n debounce = setTimeout(() => {\n try {\n emitAgentsDts(opts)\n if (viteServer) {\n const mod = viteServer.moduleGraph.getModuleById(RESOLVED_AGENTS_ID)\n if (mod) viteServer.moduleGraph.invalidateModule(mod)\n }\n } catch (err) {\n console.error('[theokit:agents-typed-client] codegen error:', err)\n }\n }, 100)\n }\n\n return {\n name: 'theokit:agents-typed-client',\n enforce: 'post',\n configResolved() {\n try {\n emitAgentsDts(opts)\n } catch (err) {\n console.error('[theokit:agents-typed-client] initial codegen error:', err)\n }\n },\n buildEnd() {\n try {\n emitAgentsDts(opts)\n } catch (err) {\n console.error('[theokit:agents-typed-client] buildEnd codegen error:', err)\n }\n },\n configureServer(server) {\n viteServer = server\n const agentsGlob = posix.join(opts.projectRoot.replace(/\\\\/g, '/'), 'agents')\n const onFile = (file: string): void => {\n if (file.replace(/\\\\/g, '/').startsWith(agentsGlob)) scheduleEmit()\n }\n server.watcher.on('add', onFile)\n server.watcher.on('change', onFile)\n server.watcher.on('unlink', onFile)\n },\n resolveId(id) {\n return id === VIRTUAL_AGENTS_ID ? RESOLVED_AGENTS_ID : null\n },\n load(id) {\n if (id === RESOLVED_AGENTS_ID) {\n return `export { useAgent } from 'theokit/client'\\n`\n }\n return null\n },\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,25 +1,25 @@
1
- import "./chunk-PPPR5DGR.js";
2
- import "./chunk-TGTNRUH3.js";
3
- import "./chunk-GY5Q27BJ.js";
1
+ import "./chunk-RSVN727G.js";
4
2
  import "./chunk-5QW7IQQU.js";
5
- import "./chunk-WFNLNIJX.js";
6
3
  import "./chunk-IAJ2JVEH.js";
7
4
  import "./chunk-VMEWD57H.js";
8
5
  import "./chunk-JQSKBMXP.js";
9
6
  import {
10
7
  generateManifest
11
- } from "./chunk-223EFY5X.js";
8
+ } from "./chunk-2J7XU3PW.js";
12
9
  import {
13
10
  HTTP_METHODS
14
11
  } from "./chunk-WSJKACWB.js";
15
- import "./chunk-ZEGYW52B.js";
16
12
  import "./chunk-JBCHWRKF.js";
13
+ import "./chunk-C3ZZ56YZ.js";
14
+ import "./chunk-X2VVCJ4V.js";
15
+ import "./chunk-H243MR3F.js";
16
+ import "./chunk-GY5Q27BJ.js";
17
+ import "./chunk-Z5IGLBWE.js";
18
+ import "./chunk-ZEGYW52B.js";
17
19
  import "./chunk-TSLSIRBR.js";
18
20
  import "./chunk-UD3LFGDL.js";
19
21
  import "./chunk-X32XEJXR.js";
20
22
  import "./chunk-UVXB2ER7.js";
21
- import "./chunk-C3ZZ56YZ.js";
22
- import "./chunk-X2VVCJ4V.js";
23
23
  import "./chunk-DGUM43GV.js";
24
24
 
25
25
  // src/vite-plugin/app-typed-client.ts
@@ -296,4 +296,4 @@ export {
296
296
  emitClientDts,
297
297
  generateClientDts
298
298
  };
299
- //# sourceMappingURL=app-typed-client-5GYEOYP3.js.map
299
+ //# sourceMappingURL=app-typed-client-5VQE6DNF.js.map
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import "tsx/esm";
3
- import "./chunk-NAZ4E2GT.js";
4
- import "./chunk-GFMQJHXX.js";
5
- import "./chunk-HGZL5EOI.js";
3
+ import "./chunk-KXA37ONC.js";
4
+ import "./chunk-WR4F4EEZ.js";
6
5
  import {
7
6
  generateManifest
8
- } from "./chunk-3LVRAGAZ.js";
7
+ } from "./chunk-F4YUPDJ2.js";
9
8
  import {
10
9
  HTTP_METHODS
11
- } from "./chunk-6FYD34NX.js";
10
+ } from "./chunk-BQDGES7C.js";
11
+ import "./chunk-HGZL5EOI.js";
12
12
 
13
13
  // src/vite-plugin/app-typed-client.ts
14
14
  import { mkdirSync, readFileSync, renameSync, writeFileSync, existsSync } from "fs";
@@ -284,4 +284,4 @@ export {
284
284
  emitClientDts,
285
285
  generateClientDts
286
286
  };
287
- //# sourceMappingURL=app-typed-client-QG7BVZYW.js.map
287
+ //# sourceMappingURL=app-typed-client-CSOK7NPC.js.map
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env node
2
+ import "tsx/esm";
3
+
4
+ // src/server/body-parser-web.ts
5
+ var DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
6
+ var DEFAULT_MAX_FILES = 10;
7
+ var SAFETY_MARGIN = 1048576;
8
+ var RequestBodyTooLargeError = class extends Error {
9
+ constructor(declared, max) {
10
+ super(`Request body too large: declared Content-Length ${declared} exceeds max ${max}`);
11
+ this.name = "RequestBodyTooLargeError";
12
+ }
13
+ };
14
+ var parseCache = /* @__PURE__ */ new WeakMap();
15
+ function parseWebRequestBody(request, options = {}) {
16
+ const cached = parseCache.get(request);
17
+ if (cached) return cached;
18
+ const promise = parseImpl(request, options);
19
+ parseCache.set(request, promise);
20
+ return promise;
21
+ }
22
+ async function parseImpl(request, options) {
23
+ const maxFileSize = options.maxFileSize ?? DEFAULT_MAX_FILE_SIZE;
24
+ const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES;
25
+ const maxTotal = maxFileSize * maxFiles + SAFETY_MARGIN;
26
+ const cl = Number(request.headers.get("content-length") ?? "0");
27
+ if (cl > maxTotal) {
28
+ throw new RequestBodyTooLargeError(cl, maxTotal);
29
+ }
30
+ const empty = { fields: {}, files: [] };
31
+ if (!request.body) return empty;
32
+ const ct = (request.headers.get("content-type") ?? "").toLowerCase();
33
+ if (ct.includes("application/json")) {
34
+ const text = await request.text();
35
+ if (!text) return empty;
36
+ return { ...empty, json: JSON.parse(text) };
37
+ }
38
+ if (ct.includes("multipart/form-data")) {
39
+ const form = await request.formData();
40
+ const fields = {};
41
+ const files = [];
42
+ let fileCount = 0;
43
+ for (const [key, value] of form.entries()) {
44
+ if (typeof value === "string") {
45
+ fields[key] = value;
46
+ } else {
47
+ if (++fileCount > maxFiles) {
48
+ throw new Error(`Too many files: max ${maxFiles}`);
49
+ }
50
+ if (value.size > maxFileSize) {
51
+ throw new Error(`File ${value.name} exceeds maxFileSize ${maxFileSize}`);
52
+ }
53
+ const buf = new Uint8Array(await value.arrayBuffer());
54
+ files.push({
55
+ fieldName: key,
56
+ filename: value.name,
57
+ contentType: value.type,
58
+ size: value.size,
59
+ buffer: buf
60
+ });
61
+ }
62
+ }
63
+ return { fields, files };
64
+ }
65
+ return empty;
66
+ }
67
+ export {
68
+ RequestBodyTooLargeError,
69
+ parseWebRequestBody
70
+ };
71
+ //# sourceMappingURL=body-parser-web-FV5HWCY3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/body-parser-web.ts"],"sourcesContent":["/**\n * T5.1 — Web Standards body parser for non-Node runtimes (Bun, Deno, edge).\n *\n * Uses `request.formData()` for multipart and `request.json()`/`text()` for\n * JSON/text. EC-4: Content-Length pre-check prevents OOM. EC-12: per-Request\n * cache via WeakMap so multiple parse calls on the same Request are idempotent.\n */\n\nexport interface ParsedWebBody {\n json?: unknown\n fields: Record<string, string>\n files: {\n fieldName: string\n filename: string\n contentType: string\n size: number\n buffer: Uint8Array\n }[]\n}\n\nexport interface WebBodyParserOptions {\n maxFileSize?: number\n maxFiles?: number\n}\n\nconst DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024 // 10MB\nconst DEFAULT_MAX_FILES = 10\nconst SAFETY_MARGIN = 1_048_576 // 1MB encoding overhead\n\nexport class RequestBodyTooLargeError extends Error {\n constructor(declared: number, max: number) {\n super(`Request body too large: declared Content-Length ${declared} exceeds max ${max}`)\n this.name = 'RequestBodyTooLargeError'\n }\n}\n\n// EC-12 cache — idempotent parse per Request\nconst parseCache = new WeakMap<Request, Promise<ParsedWebBody>>()\n\nexport function parseWebRequestBody(\n request: Request,\n options: WebBodyParserOptions = {},\n): Promise<ParsedWebBody> {\n const cached = parseCache.get(request)\n if (cached) return cached\n const promise = parseImpl(request, options)\n parseCache.set(request, promise)\n return promise\n}\n\nasync function parseImpl(request: Request, options: WebBodyParserOptions): Promise<ParsedWebBody> {\n const maxFileSize = options.maxFileSize ?? DEFAULT_MAX_FILE_SIZE\n const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES\n const maxTotal = maxFileSize * maxFiles + SAFETY_MARGIN\n\n // EC-4 — Content-Length pre-check before materializing body\n const cl = Number(request.headers.get('content-length') ?? '0')\n if (cl > maxTotal) {\n throw new RequestBodyTooLargeError(cl, maxTotal)\n }\n\n const empty: ParsedWebBody = { fields: {}, files: [] }\n if (!request.body) return empty\n\n const ct = (request.headers.get('content-type') ?? '').toLowerCase()\n if (ct.includes('application/json')) {\n const text = await request.text()\n if (!text) return empty\n return { ...empty, json: JSON.parse(text) }\n }\n\n if (ct.includes('multipart/form-data')) {\n const form = await request.formData()\n const fields: Record<string, string> = {}\n const files: ParsedWebBody['files'] = []\n let fileCount = 0\n for (const [key, value] of form.entries()) {\n if (typeof value === 'string') {\n fields[key] = value\n } else {\n if (++fileCount > maxFiles) {\n throw new Error(`Too many files: max ${maxFiles}`)\n }\n if (value.size > maxFileSize) {\n throw new Error(`File ${value.name} exceeds maxFileSize ${maxFileSize}`)\n }\n const buf = new Uint8Array(await value.arrayBuffer())\n files.push({\n fieldName: key,\n filename: value.name,\n contentType: value.type,\n size: value.size,\n buffer: buf,\n })\n }\n }\n return { fields, files }\n }\n\n return empty\n}\n"],"mappings":";;;;AAyBA,IAAM,wBAAwB,KAAK,OAAO;AAC1C,IAAM,oBAAoB;AAC1B,IAAM,gBAAgB;AAEf,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD,YAAY,UAAkB,KAAa;AACzC,UAAM,mDAAmD,QAAQ,gBAAgB,GAAG,EAAE;AACtF,SAAK,OAAO;AAAA,EACd;AACF;AAGA,IAAM,aAAa,oBAAI,QAAyC;AAEzD,SAAS,oBACd,SACA,UAAgC,CAAC,GACT;AACxB,QAAM,SAAS,WAAW,IAAI,OAAO;AACrC,MAAI,OAAQ,QAAO;AACnB,QAAM,UAAU,UAAU,SAAS,OAAO;AAC1C,aAAW,IAAI,SAAS,OAAO;AAC/B,SAAO;AACT;AAEA,eAAe,UAAU,SAAkB,SAAuD;AAChG,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAW,cAAc,WAAW;AAG1C,QAAM,KAAK,OAAO,QAAQ,QAAQ,IAAI,gBAAgB,KAAK,GAAG;AAC9D,MAAI,KAAK,UAAU;AACjB,UAAM,IAAI,yBAAyB,IAAI,QAAQ;AAAA,EACjD;AAEA,QAAM,QAAuB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AACrD,MAAI,CAAC,QAAQ,KAAM,QAAO;AAE1B,QAAM,MAAM,QAAQ,QAAQ,IAAI,cAAc,KAAK,IAAI,YAAY;AACnE,MAAI,GAAG,SAAS,kBAAkB,GAAG;AACnC,UAAM,OAAO,MAAM,QAAQ,KAAK;AAChC,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO,EAAE,GAAG,OAAO,MAAM,KAAK,MAAM,IAAI,EAAE;AAAA,EAC5C;AAEA,MAAI,GAAG,SAAS,qBAAqB,GAAG;AACtC,UAAM,OAAO,MAAM,QAAQ,SAAS;AACpC,UAAM,SAAiC,CAAC;AACxC,UAAM,QAAgC,CAAC;AACvC,QAAI,YAAY;AAChB,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,QAAQ,GAAG;AACzC,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,GAAG,IAAI;AAAA,MAChB,OAAO;AACL,YAAI,EAAE,YAAY,UAAU;AAC1B,gBAAM,IAAI,MAAM,uBAAuB,QAAQ,EAAE;AAAA,QACnD;AACA,YAAI,MAAM,OAAO,aAAa;AAC5B,gBAAM,IAAI,MAAM,QAAQ,MAAM,IAAI,wBAAwB,WAAW,EAAE;AAAA,QACzE;AACA,cAAM,MAAM,IAAI,WAAW,MAAM,MAAM,YAAY,CAAC;AACpD,cAAM,KAAK;AAAA,UACT,WAAW;AAAA,UACX,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA,UACnB,MAAM,MAAM;AAAA,UACZ,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,MAAM;AAAA,EACzB;AAEA,SAAO;AACT;","names":[]}
@@ -1,3 +1,6 @@
1
+ import {
2
+ serveReservedRoute
3
+ } from "../chunk-V3LJN2GS.js";
1
4
  import {
2
5
  envelopeCodeToStatus
3
6
  } from "../chunk-X32XEJXR.js";
@@ -5,9 +8,6 @@ import {
5
8
  NotFoundError,
6
9
  serverErrorToEnvelope
7
10
  } from "../chunk-UVXB2ER7.js";
8
- import {
9
- serveReservedRoute
10
- } from "../chunk-V3LJN2GS.js";
11
11
  import "../chunk-DGUM43GV.js";
12
12
 
13
13
  // src/server/boot.ts
@@ -1,11 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import "tsx/esm";
3
+ import {
4
+ validateProjectStructure
5
+ } from "./chunk-JQSFBJR5.js";
3
6
  import {
4
7
  preflightNodeAndBindings
5
8
  } from "./chunk-HNBWZKIQ.js";
6
9
  import {
7
- validateProjectStructure
8
- } from "./chunk-JQSFBJR5.js";
10
+ emitOpenApi,
11
+ loadRoutesForOpenApi
12
+ } from "./chunk-JAIKGP3Q.js";
9
13
  import {
10
14
  importUserModule,
11
15
  loadConfig,
@@ -16,17 +20,13 @@ import {
16
20
  buildManifest,
17
21
  writeManifest
18
22
  } from "./chunk-45C3WUQ7.js";
19
- import {
20
- emitOpenApi,
21
- loadRoutesForOpenApi
22
- } from "./chunk-JAIKGP3Q.js";
23
23
  import {
24
24
  generateManifest,
25
25
  writeManifest as writeManifest2
26
- } from "./chunk-3LVRAGAZ.js";
26
+ } from "./chunk-F4YUPDJ2.js";
27
27
  import {
28
28
  walkSourceFiles
29
- } from "./chunk-6FYD34NX.js";
29
+ } from "./chunk-BQDGES7C.js";
30
30
 
31
31
  // src/cli/commands/build.ts
32
32
  import { existsSync as existsSync4 } from "fs";
@@ -527,7 +527,7 @@ async function buildCommand(options) {
527
527
  `);
528
528
  }
529
529
  async function runAdapterBuild(target, config, cwd) {
530
- const { theoPluginAsync } = await import("./vite-plugin-WO72VLYR.js");
530
+ const { theoPluginAsync } = await import("./vite-plugin-TDIDZ5U7.js");
531
531
  const { default: react } = await import("@vitejs/plugin-react");
532
532
  const ctx = {
533
533
  // `react()` may return Plugin or Plugin[] depending on version; spread the
@@ -535,7 +535,7 @@ async function runAdapterBuild(target, config, cwd) {
535
535
  // type updated to `Plugin[] | Promise<Plugin[]>`).
536
536
  makeVitePlugins: async (opts) => [react(), ...await theoPluginAsync(opts)].flat()
537
537
  };
538
- const { resolveAdapter } = await import("./registry-Q2TZQLUH.js");
538
+ const { resolveAdapter } = await import("./registry-34LL7NF4.js");
539
539
  const adapter = await resolveAdapter(target);
540
540
  await adapter.build(config, cwd, ctx);
541
541
  }
@@ -602,4 +602,4 @@ function relativize3(absPath, root) {
602
602
  export {
603
603
  buildCommand
604
604
  };
605
- //# sourceMappingURL=build-QFRLSEZ4.js.map
605
+ //# sourceMappingURL=build-5K7LK77K.js.map