@nyte-ai/host 0.0.0-stage → 0.0.19

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 (250) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +6 -2
  3. package/THIRD-PARTY-NOTICES.md +866 -0
  4. package/dist/chunks/canvas-preview-0cmbkp2j.js +65 -0
  5. package/dist/chunks/canvas-preview-0nq75h9k.js +7 -0
  6. package/dist/chunks/canvas-preview-11nadadc.js +241 -0
  7. package/dist/chunks/canvas-preview-1sq7z9jq.js +17 -0
  8. package/dist/chunks/canvas-preview-2jwbe14k.js +130 -0
  9. package/dist/chunks/canvas-preview-2zdyh9ny.js +26 -0
  10. package/dist/chunks/canvas-preview-31w7xm8z.js +34 -0
  11. package/dist/chunks/canvas-preview-4b6sayhg.js +295 -0
  12. package/dist/chunks/canvas-preview-4e0pxa32.js +63 -0
  13. package/dist/chunks/canvas-preview-518dh8by.js +169 -0
  14. package/dist/chunks/canvas-preview-55s0y68g.js +387 -0
  15. package/dist/chunks/canvas-preview-5ekjx6sw.js +613 -0
  16. package/dist/chunks/canvas-preview-5mex725c.js +14 -0
  17. package/dist/chunks/canvas-preview-5z63am63.js +295 -0
  18. package/dist/chunks/canvas-preview-65xqjw7f.js +20 -0
  19. package/dist/chunks/canvas-preview-69fkk9yn.js +95 -0
  20. package/dist/chunks/canvas-preview-8xc0vn7v.js +458 -0
  21. package/dist/chunks/canvas-preview-9aqczacs.js +73 -0
  22. package/dist/chunks/canvas-preview-af86jz8t.js +141 -0
  23. package/dist/chunks/canvas-preview-aq5j4p25.js +240 -0
  24. package/dist/chunks/canvas-preview-b2v8wfnz.js +36 -0
  25. package/dist/chunks/canvas-preview-befkjea2.js +60 -0
  26. package/dist/chunks/canvas-preview-bxnqt8cd.js +103 -0
  27. package/dist/chunks/canvas-preview-cawy6vbz.js +352 -0
  28. package/dist/chunks/canvas-preview-crmzxxt8.js +518 -0
  29. package/dist/chunks/canvas-preview-drctegz4.js +591 -0
  30. package/dist/chunks/canvas-preview-e3vnkkc5.js +134 -0
  31. package/dist/chunks/canvas-preview-ec2mt7es.js +108 -0
  32. package/dist/chunks/canvas-preview-fxa0rfb0.js +61 -0
  33. package/dist/chunks/canvas-preview-g5fkjs34.js +598 -0
  34. package/dist/chunks/canvas-preview-jeddjex8.js +166 -0
  35. package/dist/chunks/canvas-preview-k1yg4fgp.js +571 -0
  36. package/dist/chunks/canvas-preview-kdqgrstc.js +194 -0
  37. package/dist/chunks/canvas-preview-kn7kvbfj.js +12 -0
  38. package/dist/chunks/canvas-preview-kp75gb63.js +141 -0
  39. package/dist/chunks/canvas-preview-mgcx2b2p.js +271 -0
  40. package/dist/chunks/canvas-preview-n2a35zv5.js +81 -0
  41. package/dist/chunks/canvas-preview-pkzqg96v.js +63 -0
  42. package/dist/chunks/canvas-preview-rp4x6y1h.js +144 -0
  43. package/dist/chunks/canvas-preview-s94ebwf5.js +112 -0
  44. package/dist/chunks/canvas-preview-skzwvw4d.js +23 -0
  45. package/dist/chunks/canvas-preview-srgfpdmf.js +60 -0
  46. package/dist/chunks/canvas-preview-tjhabynd.js +252 -0
  47. package/dist/chunks/canvas-preview-tnqe7k0b.js +374 -0
  48. package/dist/chunks/canvas-preview-vaatfznm.js +189 -0
  49. package/dist/chunks/canvas-preview-vm9zdp2t.js +398 -0
  50. package/dist/chunks/canvas-preview-w54ymtb3.js +272 -0
  51. package/dist/chunks/canvas-preview-wg80rbc2.js +46 -0
  52. package/dist/chunks/canvas-preview-y5y6ghaw.js +125 -0
  53. package/dist/chunks/canvas-preview-ycepb05s.js +176 -0
  54. package/dist/chunks/canvas-preview-yjz0f7n4.js +50 -0
  55. package/dist/chunks/canvas-preview-zaaj99wd.js +244 -0
  56. package/dist/src/canvas-preview.d.ts +29 -0
  57. package/dist/src/canvas-preview.js +271 -0
  58. package/dist/src/credentials.d.ts +44 -0
  59. package/dist/src/credentials.js +10 -0
  60. package/dist/src/deploy/cloudflare/worker.d.ts +50 -0
  61. package/dist/src/deploy/cloudflare/worker.js +196 -0
  62. package/dist/src/deploy/vercel/nitro.config.d.ts +2 -0
  63. package/dist/src/deploy/vercel/nitro.config.js +30 -0
  64. package/dist/src/deploy/vercel/server/routes/[...].d.ts +2 -0
  65. package/dist/src/deploy/vercel/server/routes/[...].js +18 -0
  66. package/dist/src/deploy/vercel/server/utils/host.d.ts +13 -0
  67. package/dist/src/deploy/vercel/server/utils/host.js +7 -0
  68. package/dist/src/deploy/vercel/server/utils/repair.d.ts +1 -0
  69. package/dist/src/deploy/vercel/server/utils/repair.js +6 -0
  70. package/dist/src/deploy/vercel/server/utils/step.d.ts +10 -0
  71. package/dist/src/deploy/vercel/server/utils/step.js +6 -0
  72. package/dist/src/deploy/vercel/server/workflows/drive.d.ts +14 -0
  73. package/dist/src/deploy/vercel/server/workflows/drive.js +13 -0
  74. package/dist/src/durable-object.d.ts +14 -0
  75. package/dist/src/durable-object.js +231 -0
  76. package/dist/src/hash.d.ts +1 -0
  77. package/dist/src/hash.js +6 -0
  78. package/dist/src/identity-key.d.ts +11 -0
  79. package/dist/src/identity-key.js +9 -0
  80. package/dist/src/identity.d.ts +12 -0
  81. package/dist/src/identity.js +6 -0
  82. package/dist/src/images/exif.d.ts +1 -0
  83. package/dist/src/images/exif.js +6 -0
  84. package/dist/src/images/node.d.ts +37 -0
  85. package/dist/src/images/node.js +12 -0
  86. package/dist/src/images/photon.d.ts +3 -0
  87. package/dist/src/images/photon.js +7 -0
  88. package/dist/src/images/worker.d.ts +1 -0
  89. package/dist/src/images/worker.js +23 -0
  90. package/dist/src/index.d.ts +20 -0
  91. package/dist/src/index.js +121 -0
  92. package/dist/src/key-file.d.ts +1 -0
  93. package/dist/src/key-file.js +7 -0
  94. package/dist/src/listen-fetch.d.ts +8 -0
  95. package/dist/src/listen-fetch.js +9 -0
  96. package/dist/src/listen.d.ts +4 -0
  97. package/dist/src/listen.js +10 -0
  98. package/dist/src/local/command.d.ts +20 -0
  99. package/dist/src/local/command.js +12 -0
  100. package/dist/src/local/feed.d.ts +7 -0
  101. package/dist/src/local/feed.js +6 -0
  102. package/dist/src/local/files.d.ts +18 -0
  103. package/dist/src/local/files.js +13 -0
  104. package/dist/src/local/git-watch.d.ts +15 -0
  105. package/dist/src/local/git-watch.js +7 -0
  106. package/dist/src/local/git.d.ts +5 -0
  107. package/dist/src/local/git.js +13 -0
  108. package/dist/src/local/github.d.ts +30 -0
  109. package/dist/src/local/github.js +9 -0
  110. package/dist/src/local/identity.d.ts +3 -0
  111. package/dist/src/local/identity.js +7 -0
  112. package/dist/src/local/jobs.d.ts +7 -0
  113. package/dist/src/local/jobs.js +7 -0
  114. package/dist/src/local/legacy-trust.d.ts +10 -0
  115. package/dist/src/local/legacy-trust.js +6 -0
  116. package/dist/src/local/patch.d.ts +16 -0
  117. package/dist/src/local/patch.js +17 -0
  118. package/dist/src/local/provider.d.ts +11 -0
  119. package/dist/src/local/provider.js +20 -0
  120. package/dist/src/local/snapshots.d.ts +7 -0
  121. package/dist/src/local/snapshots.js +11 -0
  122. package/dist/src/local/text.d.ts +1 -0
  123. package/dist/src/local/text.js +6 -0
  124. package/dist/src/local/tree.d.ts +50 -0
  125. package/dist/src/local/tree.js +16 -0
  126. package/dist/src/local/workspace-migration.d.ts +2 -0
  127. package/dist/src/local/workspace-migration.js +7 -0
  128. package/dist/src/local/worktrees.d.ts +46 -0
  129. package/dist/src/local/worktrees.js +14 -0
  130. package/dist/src/mcp/config.d.ts +75 -0
  131. package/dist/src/mcp/config.js +12 -0
  132. package/dist/src/mcp/connect.d.ts +15 -0
  133. package/dist/src/mcp/connect.js +9 -0
  134. package/dist/src/mcp/hub.d.ts +19 -0
  135. package/dist/src/mcp/hub.js +11 -0
  136. package/dist/src/mcp/oauth.d.ts +46 -0
  137. package/dist/src/mcp/oauth.js +12 -0
  138. package/dist/src/mcp/tools.d.ts +29 -0
  139. package/dist/src/mcp/tools.js +12 -0
  140. package/dist/src/open.d.ts +14 -0
  141. package/dist/src/open.js +46 -0
  142. package/dist/src/plugins/loader.d.ts +21 -0
  143. package/dist/src/plugins/loader.js +11 -0
  144. package/dist/src/postgres.d.ts +19 -0
  145. package/dist/src/postgres.js +8 -0
  146. package/dist/src/providers.d.ts +16 -0
  147. package/dist/src/providers.js +112 -0
  148. package/dist/src/secrets.d.ts +12 -0
  149. package/dist/src/secrets.js +8 -0
  150. package/dist/src/serve/binding.d.ts +39 -0
  151. package/dist/src/serve/binding.js +6 -0
  152. package/dist/src/serve/handler.d.ts +15 -0
  153. package/dist/src/serve/handler.js +8 -0
  154. package/dist/src/serve/stream-server.d.ts +6 -0
  155. package/dist/src/serve/stream-server.js +6 -0
  156. package/dist/src/session-index.d.ts +11 -0
  157. package/dist/src/session-index.js +11 -0
  158. package/dist/src/shell-env.d.ts +14 -0
  159. package/dist/src/shell-env.js +108 -0
  160. package/dist/src/sqlite-workers.d.ts +6 -0
  161. package/dist/src/sqlite-workers.js +6 -0
  162. package/dist/src/sqlite.d.ts +8 -0
  163. package/dist/src/sqlite.js +11 -0
  164. package/dist/src/store-rows.d.ts +13 -0
  165. package/dist/src/store-rows.js +26 -0
  166. package/dist/src/store-usage.d.ts +25 -0
  167. package/dist/src/store-usage.js +19 -0
  168. package/dist/src/usage-history.d.ts +54 -0
  169. package/dist/src/usage-history.js +14 -0
  170. package/dist/src/usage-scan.d.ts +24 -0
  171. package/dist/src/usage-scan.js +65 -0
  172. package/dist/src/usage-service.d.ts +23 -0
  173. package/dist/src/usage-service.js +16 -0
  174. package/dist/src/usage-summary.d.ts +9 -0
  175. package/dist/src/usage-summary.js +16 -0
  176. package/dist/src/usage-types.d.ts +86 -0
  177. package/dist/src/usage-types.js +0 -0
  178. package/dist/src/usage-worker.d.ts +1 -0
  179. package/dist/src/usage-worker.js +29 -0
  180. package/dist/src/usage.d.ts +195 -0
  181. package/dist/src/usage.js +23 -0
  182. package/package.json +140 -3
  183. package/src/canvas-preview.ts +403 -0
  184. package/src/credentials.ts +294 -0
  185. package/src/deploy/cloudflare/README.md +3 -0
  186. package/src/deploy/cloudflare/worker.ts +306 -0
  187. package/src/deploy/cloudflare/wrangler.jsonc +12 -0
  188. package/src/deploy/vercel/README.md +3 -0
  189. package/src/deploy/vercel/nitro.config.ts +29 -0
  190. package/src/deploy/vercel/server/routes/[...].ts +10 -0
  191. package/src/deploy/vercel/server/utils/host.ts +104 -0
  192. package/src/deploy/vercel/server/utils/repair.ts +35 -0
  193. package/src/deploy/vercel/server/utils/step.ts +25 -0
  194. package/src/deploy/vercel/server/workflows/drive.ts +46 -0
  195. package/src/deploy/vercel/tsconfig.json +9 -0
  196. package/src/deploy/vercel/types/bun.d.ts +2 -0
  197. package/src/durable-object.ts +386 -0
  198. package/src/hash.ts +5 -0
  199. package/src/identity-key.ts +20 -0
  200. package/src/identity.ts +66 -0
  201. package/src/images/exif.ts +69 -0
  202. package/src/images/node.ts +163 -0
  203. package/src/images/photon.ts +141 -0
  204. package/src/images/worker.ts +29 -0
  205. package/src/index.ts +39 -0
  206. package/src/key-file.ts +53 -0
  207. package/src/listen-fetch.ts +409 -0
  208. package/src/listen.ts +228 -0
  209. package/src/local/command.ts +161 -0
  210. package/src/local/feed.ts +70 -0
  211. package/src/local/files.ts +817 -0
  212. package/src/local/git-watch.ts +199 -0
  213. package/src/local/git.ts +919 -0
  214. package/src/local/github.ts +691 -0
  215. package/src/local/identity.ts +21 -0
  216. package/src/local/jobs.ts +573 -0
  217. package/src/local/legacy-trust.ts +105 -0
  218. package/src/local/patch.ts +334 -0
  219. package/src/local/provider.ts +184 -0
  220. package/src/local/snapshots.ts +778 -0
  221. package/src/local/text.ts +9 -0
  222. package/src/local/tree.ts +398 -0
  223. package/src/local/workspace-migration.ts +95 -0
  224. package/src/local/worktrees.ts +239 -0
  225. package/src/mcp/config.ts +330 -0
  226. package/src/mcp/connect.ts +92 -0
  227. package/src/mcp/hub.ts +836 -0
  228. package/src/mcp/oauth.ts +436 -0
  229. package/src/mcp/tools.ts +333 -0
  230. package/src/open.ts +449 -0
  231. package/src/plugins/loader.ts +186 -0
  232. package/src/postgres.ts +492 -0
  233. package/src/providers.ts +135 -0
  234. package/src/secrets.ts +31 -0
  235. package/src/serve/binding.ts +629 -0
  236. package/src/serve/handler.ts +362 -0
  237. package/src/serve/stream-server.ts +176 -0
  238. package/src/session-index.ts +99 -0
  239. package/src/shell-env.ts +153 -0
  240. package/src/sqlite-workers.ts +283 -0
  241. package/src/sqlite.ts +553 -0
  242. package/src/store-rows.ts +110 -0
  243. package/src/store-usage.ts +347 -0
  244. package/src/usage-history.ts +219 -0
  245. package/src/usage-scan.ts +81 -0
  246. package/src/usage-service.ts +82 -0
  247. package/src/usage-summary.ts +79 -0
  248. package/src/usage-types.ts +87 -0
  249. package/src/usage-worker.ts +24 -0
  250. package/src/usage.ts +776 -0
@@ -0,0 +1,240 @@
1
+ import {
2
+ bindConnection2
3
+ } from "./canvas-preview-55s0y68g.js";
4
+ import {
5
+ createStreamChannels2
6
+ } from "./canvas-preview-rp4x6y1h.js";
7
+
8
+ // src/serve/handler.ts
9
+ import { Type } from "typebox";
10
+ import { compile, isJsonObject, OPERATIONS, SdkError } from "@nyte-ai/schema";
11
+ import {
12
+ CANCEL_PATH,
13
+ CHANNEL_HEADER,
14
+ CHANNEL_PATH,
15
+ HOST_HEADER,
16
+ INPUT_HEADER,
17
+ STREAM_HEADER,
18
+ abortable,
19
+ answersBytes,
20
+ answersOnce,
21
+ asSdkError,
22
+ decodeInput,
23
+ encodeError,
24
+ encodeOutput,
25
+ errorStatus,
26
+ mapped,
27
+ namesOperation,
28
+ octetStream,
29
+ outputFrames,
30
+ parseJson,
31
+ readInputHeader,
32
+ sseFrames
33
+ } from "@nyte-ai/protocol";
34
+ var MAX_BODY_BYTES = 8 * 1024 * 1024;
35
+ var UPLOADS = new Set([
36
+ "files.write",
37
+ "job.write",
38
+ "files.upload"
39
+ ]);
40
+ var ALLOWED_HEADERS = `Authorization, Content-Type, ${INPUT_HEADER}, ${CHANNEL_HEADER}, ${STREAM_HEADER}`;
41
+ var EXPOSED_HEADERS = `X-Nyte-Version, X-Nyte-Mime, X-Nyte-Credential, ${HOST_HEADER}, ${CHANNEL_HEADER}`;
42
+ var tooLarge = new WeakSet;
43
+ var cancellations = compile(Type.Object({ channel: Type.String(), stream: Type.String() }));
44
+ function createHandler2(options) {
45
+ const limit = options.maxBodyBytes ?? MAX_BODY_BYTES;
46
+ const bindings = new WeakMap;
47
+ const channels = createStreamChannels2();
48
+ const bind = (connection) => {
49
+ const known = bindings.get(connection);
50
+ if (known !== undefined)
51
+ return known;
52
+ const created = bindConnection2(connection, options);
53
+ bindings.set(connection, created);
54
+ return created;
55
+ };
56
+ return async (request) => {
57
+ const cors = corsHeaders(request, options.origins);
58
+ if (cors === null)
59
+ return errorResponse(new SdkError("denied", "This origin may not call the host."), {});
60
+ if (request.method === "OPTIONS")
61
+ return new Response(null, {
62
+ status: 204,
63
+ headers: {
64
+ ...cors,
65
+ "Access-Control-Allow-Methods": "POST",
66
+ "Access-Control-Allow-Headers": ALLOWED_HEADERS,
67
+ "Access-Control-Max-Age": "600"
68
+ }
69
+ });
70
+ try {
71
+ const path = new URL(request.url).pathname.slice(1);
72
+ const name = request.method === "POST" && (path === CHANNEL_PATH || path === CANCEL_PATH) ? path : readOperation(request);
73
+ const authenticated = await options.connection(request);
74
+ if (name === CHANNEL_PATH) {
75
+ const value = await readBody(request, limit);
76
+ const deflate = isJsonObject(value) && value.deflate === true;
77
+ return withHeaders(channels.open(authenticated.connection, request.signal, deflate), {
78
+ ...cors,
79
+ ...authenticated.headers
80
+ });
81
+ }
82
+ if (name === CANCEL_PATH) {
83
+ const value = await readBody(request, limit);
84
+ if (!cancellations.Check(value))
85
+ throw new SdkError("invalid", "A stream cancellation needs its channel and stream.");
86
+ channels.cancel(authenticated.connection, value.channel, value.stream);
87
+ return withHeaders(new Response(null, { status: 204 }), {
88
+ ...cors,
89
+ ...authenticated.headers
90
+ });
91
+ }
92
+ const needed = OPERATIONS[name].authority;
93
+ if (!authenticated.authority.has(needed))
94
+ throw new SdkError("denied", `${name} needs ${needed} authority.`);
95
+ const binding = bind(authenticated.connection);
96
+ let response;
97
+ const channel = request.headers.get(CHANNEL_HEADER);
98
+ const stream = request.headers.get(STREAM_HEADER);
99
+ if (channel !== null || stream !== null) {
100
+ if (channel === null || stream === null)
101
+ throw new SdkError("invalid", "A shared stream needs its channel and identifier.");
102
+ const value = await readBody(request, limit);
103
+ response = await channels.start(authenticated.connection, channel, stream, request.signal, (signal) => answer(binding, name, value, request, signal));
104
+ } else
105
+ response = await serve(binding, name, request, limit);
106
+ return withHeaders(response, { ...cors, ...authenticated.headers });
107
+ } catch (error) {
108
+ return errorResponse(asSdkError(error), cors);
109
+ }
110
+ };
111
+ }
112
+ async function serve(binding, name, request, limit) {
113
+ if (UPLOADS.has(name) && answersOnce(name)) {
114
+ const body = limited(request, limit);
115
+ return json(await call(binding, name, readInputHeader(request) ?? {}, { body, signal: request.signal }));
116
+ }
117
+ return answer(binding, name, await readBody(request, limit), request, request.signal);
118
+ }
119
+ async function answer(binding, name, value, request, signal) {
120
+ const context = { body: null, signal };
121
+ if (answersOnce(name))
122
+ return json(await call(binding, name, value, context));
123
+ if (name === "job.output")
124
+ return new Response(outputFrames(abortable(await binding["job.output"](decodeInput(name, value), context), signal)), { status: 200, headers: { "Content-Type": "application/octet-stream" } });
125
+ if (answersBytes(name))
126
+ return octetStream(await bytes(binding, name, value, context), request.signal);
127
+ return new Response(sseFrames(ending(await frames(binding, name, value, context), signal)), {
128
+ status: 200,
129
+ headers: { "Content-Type": "text/event-stream", "Cache-Control": "no-cache" }
130
+ });
131
+ }
132
+ async function call(binding, name, value, request) {
133
+ return encodeOutput(name, await binding[name](decodeInput(name, value), request));
134
+ }
135
+ async function bytes(binding, name, value, request) {
136
+ return binding[name](decodeInput(name, value), request);
137
+ }
138
+ async function frames(binding, name, value, request) {
139
+ return mapped(await binding[name](decodeInput(name, value), request), (frame) => encodeOutput(name, frame));
140
+ }
141
+ function ending(source, signal) {
142
+ return {
143
+ [Symbol.asyncIterator]() {
144
+ const iterator = abortable(source, signal)[Symbol.asyncIterator]();
145
+ return {
146
+ async next() {
147
+ const next = await iterator.next();
148
+ if (next.done === true && signal.reason instanceof SdkError)
149
+ throw signal.reason;
150
+ return next;
151
+ },
152
+ async return() {
153
+ await iterator.return?.();
154
+ return { done: true, value: undefined };
155
+ }
156
+ };
157
+ }
158
+ };
159
+ }
160
+ async function readBody(request, limit) {
161
+ const stream = limited(request, limit);
162
+ if (stream === null)
163
+ return {};
164
+ const chunks = [];
165
+ const reader = stream.getReader();
166
+ for (;; ) {
167
+ const read = await reader.read();
168
+ if (read.done)
169
+ break;
170
+ chunks.push(read.value);
171
+ }
172
+ const decoder = new TextDecoder;
173
+ const text = chunks.map((chunk) => decoder.decode(chunk, { stream: true })).join("") + decoder.decode();
174
+ return text.trim() === "" ? {} : parseJson(text);
175
+ }
176
+ function limited(request, limit) {
177
+ const declared = Number(request.headers.get("Content-Length") ?? "0");
178
+ if (declared > limit)
179
+ throw largerThan(limit);
180
+ if (request.body === null)
181
+ return null;
182
+ let total = 0;
183
+ return request.body.pipeThrough(new TransformStream({
184
+ transform(chunk, controller) {
185
+ total += chunk.byteLength;
186
+ if (total > limit)
187
+ controller.error(largerThan(limit));
188
+ else
189
+ controller.enqueue(chunk);
190
+ }
191
+ }), { signal: request.signal });
192
+ }
193
+ function largerThan(limit) {
194
+ const error = new SdkError("invalid", `The body is larger than ${limit} bytes.`);
195
+ tooLarge.add(error);
196
+ return error;
197
+ }
198
+ function corsHeaders(request, origins) {
199
+ const origin = request.headers.get("Origin");
200
+ if (origin === null || origin === new URL(request.url).origin)
201
+ return {};
202
+ if (!(origins ?? []).includes(origin))
203
+ return null;
204
+ return {
205
+ "Access-Control-Allow-Origin": origin,
206
+ "Access-Control-Expose-Headers": EXPOSED_HEADERS,
207
+ Vary: "Origin"
208
+ };
209
+ }
210
+ function readOperation(request) {
211
+ const path = new URL(request.url).pathname;
212
+ const name = path.slice(1);
213
+ if (request.method !== "POST" || !namesOperation(name))
214
+ throw new SdkError("unknown", `No operation answers ${request.method} ${path}.`);
215
+ return name;
216
+ }
217
+ function json(value) {
218
+ return new Response(JSON.stringify(value), {
219
+ status: 200,
220
+ headers: { "Content-Type": "application/json" }
221
+ });
222
+ }
223
+ function errorResponse(failure, headers) {
224
+ return new Response(JSON.stringify(encodeError(failure)), {
225
+ status: tooLarge.has(failure) ? 413 : errorStatus[failure.code],
226
+ headers: { ...headers, "Content-Type": "application/json" }
227
+ });
228
+ }
229
+ function withHeaders(response, headers) {
230
+ const merged = new Headers(response.headers);
231
+ for (const [key, value] of Object.entries(headers))
232
+ merged.set(key, value);
233
+ return new Response(response.body, {
234
+ status: response.status,
235
+ statusText: response.statusText,
236
+ headers: merged
237
+ });
238
+ }
239
+
240
+ export { createHandler2 };
@@ -0,0 +1,36 @@
1
+ import {
2
+ vercelHost2
3
+ } from "./canvas-preview-n2a35zv5.js";
4
+ import {
5
+ stepFrom2
6
+ } from "./canvas-preview-65xqjw7f.js";
7
+
8
+ // src/deploy/vercel/server/workflows/drive.ts
9
+ import { sleep } from "workflow";
10
+ import { start } from "workflow/api";
11
+ async function dispatchHead2(target) {
12
+ await start(driveHead2, [target]);
13
+ }
14
+ async function driveHead2(input) {
15
+ "use workflow";
16
+ for (;; ) {
17
+ const next = stepFrom2(await advanceHead2(input), Date.now());
18
+ if (next.kind === "stop")
19
+ return;
20
+ if (next.kind === "sleep")
21
+ await sleep(next.ms);
22
+ }
23
+ }
24
+ async function advanceHead2(input) {
25
+ "use step";
26
+ const { host } = await vercelHost2(dispatchHead2);
27
+ const coverage = await host.execution.cover({ kind: "sessions", sessions: [input.session] });
28
+ try {
29
+ await host.server.tick(Date.now());
30
+ return await host.execution.advance(input);
31
+ } finally {
32
+ await coverage.close();
33
+ }
34
+ }
35
+
36
+ export { dispatchHead2, driveHead2, advanceHead2 };
@@ -0,0 +1,60 @@
1
+ // src/images/exif.ts
2
+ var ORIENTATION_TAG = 274;
3
+ function exifOrientation2(bytes) {
4
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
5
+ const tiff = tiffStart(bytes, view);
6
+ if (tiff < 0 || tiff + 8 > bytes.length)
7
+ return 1;
8
+ const little = bytes[tiff] === 73 && bytes[tiff + 1] === 73;
9
+ const directory = tiff + view.getUint32(tiff + 4, little);
10
+ if (directory + 2 > bytes.length)
11
+ return 1;
12
+ const entries = view.getUint16(directory, little);
13
+ for (let index = 0;index < entries; index++) {
14
+ const entry = directory + 2 + index * 12;
15
+ if (entry + 12 > bytes.length)
16
+ return 1;
17
+ if (view.getUint16(entry, little) === ORIENTATION_TAG) {
18
+ const value = view.getUint16(entry + 8, little);
19
+ return value >= 1 && value <= 8 ? value : 1;
20
+ }
21
+ }
22
+ return 1;
23
+ }
24
+ function tiffStart(bytes, view) {
25
+ if (bytes[0] === 255 && bytes[1] === 216) {
26
+ for (let offset = 2;offset + 4 <= bytes.length; ) {
27
+ if (bytes[offset] !== 255)
28
+ return -1;
29
+ const marker = view.getUint8(offset + 1);
30
+ if (marker === 255) {
31
+ offset++;
32
+ continue;
33
+ }
34
+ if (marker === 225 && startsExif(bytes, offset + 4))
35
+ return offset + 10;
36
+ offset += 2 + view.getUint16(offset + 2);
37
+ }
38
+ return -1;
39
+ }
40
+ if (ascii(bytes, 0, "RIFF") && ascii(bytes, 8, "WEBP")) {
41
+ for (let offset = 12;offset + 8 <= bytes.length; ) {
42
+ const size = view.getUint32(offset + 4, true);
43
+ if (ascii(bytes, offset, "EXIF"))
44
+ return startsExif(bytes, offset + 8) ? offset + 14 : offset + 8;
45
+ offset += 8 + size + size % 2;
46
+ }
47
+ }
48
+ return -1;
49
+ }
50
+ function startsExif(bytes, offset) {
51
+ return ascii(bytes, offset, "Exif") && bytes[offset + 4] === 0 && bytes[offset + 5] === 0;
52
+ }
53
+ function ascii(bytes, offset, text) {
54
+ for (let index = 0;index < text.length; index++)
55
+ if (bytes[offset + index] !== text.charCodeAt(index))
56
+ return false;
57
+ return true;
58
+ }
59
+
60
+ export { exifOrientation2 };
@@ -0,0 +1,103 @@
1
+ // src/local/command.ts
2
+ import { spawn } from "node:child_process";
3
+ import { constants } from "node:fs";
4
+ import { access, stat } from "node:fs/promises";
5
+ import { delimiter, extname, isAbsolute, join } from "node:path";
6
+ import { SdkError } from "@nyte-ai/schema";
7
+ import { processEnvironment } from "@nyte-ai/core";
8
+ async function run2(file, args, options) {
9
+ await processEnvironment();
10
+ const resolved = process.platform === "win32" ? await findExecutable2(file) ?? file : file;
11
+ return new Promise((resolve, reject) => {
12
+ const child = spawnCommand2(resolved, args, {
13
+ cwd: options.cwd,
14
+ env: { ...process.env, ...options.env },
15
+ stdio: ["pipe", "pipe", "pipe"],
16
+ windowsHide: true,
17
+ timeout: options.timeoutMs
18
+ });
19
+ const stdout = [];
20
+ const stderr = [];
21
+ const limit = options.limit ?? Number.POSITIVE_INFINITY;
22
+ let size = 0;
23
+ let truncated = false;
24
+ child.on("error", (error) => reject(new SdkError("unavailable", `Cannot run ${file}: ${error.message}`)));
25
+ child.stdout?.on("data", (chunk) => {
26
+ if (truncated)
27
+ return;
28
+ size += chunk.byteLength;
29
+ if (size > limit) {
30
+ truncated = true;
31
+ stdout.push(chunk.subarray(0, chunk.byteLength - (size - limit)));
32
+ child.kill("SIGKILL");
33
+ return;
34
+ }
35
+ stdout.push(chunk);
36
+ });
37
+ child.stderr?.on("data", (chunk) => stderr.push(chunk));
38
+ child.stdin?.on("error", () => {
39
+ return;
40
+ });
41
+ child.on("close", (code) => resolve({
42
+ code,
43
+ stdout: Buffer.concat(stdout),
44
+ stderr: Buffer.concat(stderr).toString("utf8"),
45
+ truncated
46
+ }));
47
+ child.stdin?.end(options.input);
48
+ });
49
+ }
50
+ function spawnCommand2(file, args, options) {
51
+ if (process.platform !== "win32" || !/\.(cmd|bat)$/i.test(file))
52
+ return spawn(file, args, options);
53
+ const shim = /node_modules[\\/]\.bin[\\/][^\\/]+\.cmd$/i.test(file);
54
+ const line = [escapeCommand(file), ...args.map((arg) => escapeArgument(arg, shim))].join(" ");
55
+ return spawn(process.env.ComSpec ?? "cmd.exe", ["/d", "/s", "/c", `"${line}"`], {
56
+ ...options,
57
+ windowsVerbatimArguments: true
58
+ });
59
+ }
60
+ function killTree2(child, signal) {
61
+ if (process.platform !== "win32" || child.pid === undefined) {
62
+ child.kill(signal);
63
+ return;
64
+ }
65
+ spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
66
+ stdio: "ignore",
67
+ windowsHide: true
68
+ }).on("error", () => child.kill(signal));
69
+ }
70
+ var CMD_META = /([()\][%!^"`<>&|;, *?])/g;
71
+ function escapeCommand(command) {
72
+ return command.replace(CMD_META, "^$1");
73
+ }
74
+ function escapeArgument(argument, twice) {
75
+ const quoted = `"${argument.replace(/(\\*)"/g, "$1$1\\\"").replace(/(\\*)$/, "$1$1")}"`;
76
+ const escaped = quoted.replace(CMD_META, "^$1");
77
+ return twice ? escaped.replace(CMD_META, "^$1") : escaped;
78
+ }
79
+ async function findExecutable2(name, directories = []) {
80
+ const pathext = (process.env.PATHEXT ?? ".EXE;.CMD;.BAT").split(";").filter((ext) => ext !== "");
81
+ const extensions = process.platform !== "win32" ? [""] : extname(name) === "" ? pathext : ["", ...pathext];
82
+ if (isAbsolute(name)) {
83
+ for (const extension of extensions)
84
+ if (await executable(`${name}${extension}`))
85
+ return `${name}${extension}`;
86
+ return null;
87
+ }
88
+ await processEnvironment();
89
+ const path = (process.env.PATH ?? "").split(delimiter).filter((entry) => entry !== "");
90
+ for (const directory of [...directories, ...path])
91
+ for (const extension of extensions) {
92
+ const candidate = join(directory, `${name}${extension}`);
93
+ if (await executable(candidate))
94
+ return candidate;
95
+ }
96
+ return null;
97
+ }
98
+ async function executable(path) {
99
+ const found = await stat(path).catch(() => null);
100
+ return found !== null && found.isFile() && await access(path, constants.X_OK).then(() => true, () => false);
101
+ }
102
+
103
+ export { run2, spawnCommand2, killTree2, findExecutable2 };