@ekairos/domain 1.22.34-beta.development.0 → 1.22.35-beta.development.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 (58) hide show
  1. package/README.md +123 -128
  2. package/dist/cli/bin.d.ts +9 -0
  3. package/dist/cli/bin.d.ts.map +1 -0
  4. package/dist/cli/bin.js +488 -0
  5. package/dist/cli/bin.js.map +1 -0
  6. package/dist/cli/client-runtime.d.ts +25 -0
  7. package/dist/cli/client-runtime.d.ts.map +1 -0
  8. package/dist/cli/client-runtime.js +60 -0
  9. package/dist/cli/client-runtime.js.map +1 -0
  10. package/dist/cli/config.d.ts +5 -0
  11. package/dist/cli/config.d.ts.map +1 -0
  12. package/dist/cli/config.js +44 -0
  13. package/dist/cli/config.js.map +1 -0
  14. package/dist/cli/create-app.d.ts +33 -0
  15. package/dist/cli/create-app.d.ts.map +1 -0
  16. package/dist/cli/create-app.js +1317 -0
  17. package/dist/cli/create-app.js.map +1 -0
  18. package/dist/cli/http.d.ts +28 -0
  19. package/dist/cli/http.d.ts.map +1 -0
  20. package/dist/cli/http.js +117 -0
  21. package/dist/cli/http.js.map +1 -0
  22. package/dist/cli/index.d.ts +8 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +7 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/cli/server.d.ts +3 -0
  27. package/dist/cli/server.d.ts.map +1 -0
  28. package/dist/cli/server.js +437 -0
  29. package/dist/cli/server.js.map +1 -0
  30. package/dist/cli/types.d.ts +60 -0
  31. package/dist/cli/types.d.ts.map +1 -0
  32. package/dist/cli/types.js +2 -0
  33. package/dist/cli/types.js.map +1 -0
  34. package/dist/cli/ui.d.ts +3 -0
  35. package/dist/cli/ui.d.ts.map +1 -0
  36. package/dist/cli/ui.js +136 -0
  37. package/dist/cli/ui.js.map +1 -0
  38. package/dist/index.d.ts +70 -11
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +121 -18
  41. package/dist/index.js.map +1 -1
  42. package/dist/next.d.ts +21 -21
  43. package/dist/next.d.ts.map +1 -1
  44. package/dist/next.js +212 -345
  45. package/dist/next.js.map +1 -1
  46. package/dist/polyfills/dom-events.d.ts +2 -0
  47. package/dist/polyfills/dom-events.d.ts.map +1 -0
  48. package/dist/polyfills/dom-events.js +92 -0
  49. package/dist/polyfills/dom-events.js.map +1 -0
  50. package/dist/runtime-handle.d.ts +34 -0
  51. package/dist/runtime-handle.d.ts.map +1 -0
  52. package/dist/runtime-handle.js +82 -0
  53. package/dist/runtime-handle.js.map +1 -0
  54. package/dist/runtime.d.ts +3 -2
  55. package/dist/runtime.d.ts.map +1 -1
  56. package/dist/runtime.js +72 -19
  57. package/dist/runtime.js.map +1 -1
  58. package/package.json +37 -4
@@ -0,0 +1,437 @@
1
+ import { executeRuntimeAction, getRuntimeActions, getRuntimeConfig, getRuntimeProjectId, resolveRuntime, } from "../runtime.js";
2
+ import { getDomainActionBinding } from "../index.js";
3
+ import { createRemoteJWKSet, jwtVerify } from "jose";
4
+ function json(data, init) {
5
+ return Response.json(data, init);
6
+ }
7
+ function listKeys(value) {
8
+ if (!value || typeof value !== "object")
9
+ return [];
10
+ return Object.keys(value);
11
+ }
12
+ function resolveSource(config) {
13
+ return (config?.domain ?? null);
14
+ }
15
+ function buildSchema(source) {
16
+ if (!source)
17
+ return null;
18
+ if (typeof source.toInstantSchema === "function")
19
+ return source.toInstantSchema();
20
+ if (typeof source.schema === "function")
21
+ return source.schema();
22
+ return {
23
+ entities: source.entities ?? {},
24
+ links: source.links ?? {},
25
+ rooms: source.rooms ?? {},
26
+ };
27
+ }
28
+ function buildContext(config, source) {
29
+ if (!source || typeof source.context !== "function")
30
+ return null;
31
+ return source.context({ meta: config?.meta });
32
+ }
33
+ function buildContextString(config, source) {
34
+ if (!source || typeof source.contextString !== "function")
35
+ return null;
36
+ return source.contextString({ meta: config?.meta });
37
+ }
38
+ function serializeActionInputSchema(value) {
39
+ if (value === undefined)
40
+ return undefined;
41
+ try {
42
+ return JSON.parse(JSON.stringify(value));
43
+ }
44
+ catch {
45
+ return undefined;
46
+ }
47
+ }
48
+ function resolveDomainActionKeyByName(source, actionName) {
49
+ if (!source || typeof source.getActions !== "function")
50
+ return null;
51
+ const actions = source.getActions();
52
+ for (const action of actions) {
53
+ const name = String(action?.name ?? "").trim();
54
+ if (name !== actionName)
55
+ continue;
56
+ const binding = getDomainActionBinding(action);
57
+ if (typeof binding?.key === "string" && binding.key.trim()) {
58
+ return binding.key.trim();
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ function listActions() {
64
+ const source = resolveSource(getRuntimeConfig());
65
+ return getRuntimeActions().map((action) => {
66
+ const binding = getDomainActionBinding(action);
67
+ return {
68
+ name: String(action.name ?? "").trim(),
69
+ key: typeof binding?.key === "string"
70
+ ? binding.key
71
+ : resolveDomainActionKeyByName(source, String(action.name ?? "").trim()),
72
+ description: typeof action.description === "string" ? action.description : null,
73
+ inputSchema: serializeActionInputSchema(action.inputSchema),
74
+ };
75
+ });
76
+ }
77
+ function resolveInstantAppId() {
78
+ return (String(process.env.EKAIROS_DOMAIN_APP_ID ?? "").trim() ||
79
+ String(process.env.NEXT_PUBLIC_INSTANT_APP_ID ?? "").trim() ||
80
+ String(process.env.INSTANT_APP_ID ?? "").trim() ||
81
+ String(process.env.INSTANTDB_APP_ID ?? "").trim() ||
82
+ null);
83
+ }
84
+ function resolveInstantApiUri() {
85
+ return (String(process.env.EKAIROS_DOMAIN_API_URI ?? "").trim() ||
86
+ String(process.env.INSTANT_API_URI ?? "").trim() ||
87
+ "https://api.instantdb.com");
88
+ }
89
+ const DEFAULT_OIDC_JWKS = "https://oidc.vercel.com/.well-known/jwks.json";
90
+ const DEFAULT_OIDC_ISSUER = "https://oidc.vercel.com";
91
+ const oidcJwksCache = new Map();
92
+ function parseOptionalBoolean(value) {
93
+ const normalized = String(value ?? "").trim().toLowerCase();
94
+ if (!normalized)
95
+ return undefined;
96
+ if (["1", "true", "yes", "y", "on"].includes(normalized))
97
+ return true;
98
+ if (["0", "false", "no", "n", "off"].includes(normalized))
99
+ return false;
100
+ return undefined;
101
+ }
102
+ function resolveBearerToken(req) {
103
+ const header = req.headers.get("authorization") || "";
104
+ if (!header.startsWith("Bearer "))
105
+ return null;
106
+ return header.slice("Bearer ".length).trim();
107
+ }
108
+ function resolveOidcJwksUrl() {
109
+ return String(process.env.EKAIROS_DOMAIN_JWKS_URL ?? "").trim() || DEFAULT_OIDC_JWKS;
110
+ }
111
+ function resolveOidcIssuer() {
112
+ return String(process.env.EKAIROS_DOMAIN_ISSUER ?? "").trim() || DEFAULT_OIDC_ISSUER;
113
+ }
114
+ function resolveOidcAudience() {
115
+ const explicit = String(process.env.EKAIROS_DOMAIN_AUDIENCE ?? "").trim();
116
+ return explicit || null;
117
+ }
118
+ function isAuthRequired() {
119
+ const explicit = parseOptionalBoolean(process.env.EKAIROS_DOMAIN_AUTH_REQUIRED);
120
+ if (explicit !== undefined)
121
+ return explicit;
122
+ return Boolean(process.env.EKAIROS_DOMAIN_TOKEN ||
123
+ process.env.EKAIROS_DOMAIN_JWKS_URL ||
124
+ process.env.EKAIROS_DOMAIN_ISSUER ||
125
+ process.env.EKAIROS_DOMAIN_AUDIENCE);
126
+ }
127
+ async function verifyOidcToken(token) {
128
+ if (!token)
129
+ return false;
130
+ const jwksUrl = resolveOidcJwksUrl();
131
+ const cached = oidcJwksCache.get(jwksUrl);
132
+ const jwks = cached ??
133
+ (() => {
134
+ const created = createRemoteJWKSet(new URL(jwksUrl));
135
+ oidcJwksCache.set(jwksUrl, created);
136
+ return created;
137
+ })();
138
+ const audience = resolveOidcAudience();
139
+ const options = {
140
+ issuer: resolveOidcIssuer(),
141
+ };
142
+ if (audience)
143
+ options.audience = audience;
144
+ await jwtVerify(token, jwks, options);
145
+ return true;
146
+ }
147
+ async function verifyRefreshToken(token, appId) {
148
+ const apiURI = resolveInstantApiUri();
149
+ try {
150
+ const response = await fetch(`${apiURI}/runtime/auth/verify_refresh_token`, {
151
+ method: "POST",
152
+ headers: {
153
+ "content-type": "application/json",
154
+ },
155
+ body: JSON.stringify({
156
+ "app-id": appId,
157
+ "refresh-token": token,
158
+ }),
159
+ });
160
+ if (!response.ok)
161
+ return null;
162
+ const data = (await response.json().catch(() => null));
163
+ const user = data?.user;
164
+ if (!user || typeof user.id !== "string")
165
+ return null;
166
+ return {
167
+ id: user.id,
168
+ email: typeof user.email === "string" ? user.email : null,
169
+ isGuest: Boolean(user.isGuest),
170
+ };
171
+ }
172
+ catch {
173
+ return null;
174
+ }
175
+ }
176
+ async function resolveAuth(req, body, source) {
177
+ const bearerToken = resolveBearerToken(req);
178
+ const appId = String(body?.appId ?? "").trim() ||
179
+ resolveInstantAppId() ||
180
+ null;
181
+ const auth = {
182
+ authorized: !isAuthRequired(),
183
+ bearerToken,
184
+ bearerType: null,
185
+ refreshUser: null,
186
+ appId,
187
+ };
188
+ if (!bearerToken) {
189
+ return auth;
190
+ }
191
+ const staticToken = String(process.env.EKAIROS_DOMAIN_TOKEN ?? "").trim();
192
+ if (staticToken && bearerToken === staticToken) {
193
+ auth.authorized = true;
194
+ auth.bearerType = "static";
195
+ return auth;
196
+ }
197
+ try {
198
+ const ok = await verifyOidcToken(bearerToken);
199
+ if (ok) {
200
+ auth.authorized = true;
201
+ auth.bearerType = "oidc";
202
+ return auth;
203
+ }
204
+ }
205
+ catch {
206
+ // ignore
207
+ }
208
+ if (appId) {
209
+ const user = await verifyRefreshToken(bearerToken, appId);
210
+ if (user) {
211
+ auth.authorized = true;
212
+ auth.bearerType = "refresh-token";
213
+ auth.refreshUser = user;
214
+ return auth;
215
+ }
216
+ }
217
+ return auth;
218
+ }
219
+ function resolveImpersonatedDb(db, auth, body) {
220
+ if (typeof db?.asUser !== "function") {
221
+ return db;
222
+ }
223
+ const asEmail = String(body?.asEmail ?? "").trim();
224
+ const asGuest = Boolean(body?.asGuest);
225
+ if (auth.bearerType === "refresh-token" && auth.bearerToken) {
226
+ return db.asUser({ token: auth.bearerToken });
227
+ }
228
+ if (asEmail) {
229
+ return db.asUser({ email: asEmail });
230
+ }
231
+ if (asGuest) {
232
+ return db.asUser({ guest: true });
233
+ }
234
+ return db;
235
+ }
236
+ function resolveActor(auth, body) {
237
+ if (auth.refreshUser) {
238
+ return auth.refreshUser;
239
+ }
240
+ const asEmail = String(body?.asEmail ?? "").trim();
241
+ if (asEmail) {
242
+ return { email: asEmail, id: null, isGuest: false };
243
+ }
244
+ if (Boolean(body?.asGuest)) {
245
+ return { id: null, email: null, isGuest: true };
246
+ }
247
+ return null;
248
+ }
249
+ function resolveSourceType(auth, body) {
250
+ if (auth.bearerType)
251
+ return auth.bearerType;
252
+ if (String(body?.asEmail ?? "").trim())
253
+ return "email";
254
+ if (Boolean(body?.asGuest))
255
+ return "guest";
256
+ if (Boolean(body?.admin))
257
+ return "admin";
258
+ return "admin";
259
+ }
260
+ function truncateQueryResult(result) {
261
+ const MAX_QUERY_ROWS = 50;
262
+ const output = {};
263
+ const truncation = {};
264
+ for (const [key, value] of Object.entries(result ?? {})) {
265
+ if (Array.isArray(value)) {
266
+ const total = value.length;
267
+ const returned = Math.min(total, MAX_QUERY_ROWS);
268
+ output[key] = value.slice(0, returned);
269
+ if (total > returned) {
270
+ truncation[key] = { returned, total };
271
+ }
272
+ continue;
273
+ }
274
+ output[key] = value;
275
+ }
276
+ return {
277
+ data: output,
278
+ truncated: Object.keys(truncation).length > 0 ? truncation : null,
279
+ };
280
+ }
281
+ function asRecord(value) {
282
+ return value && typeof value === "object" ? value : {};
283
+ }
284
+ function withActorEnv(env, auth) {
285
+ if (auth.bearerType !== "refresh-token" || !auth.refreshUser) {
286
+ return env;
287
+ }
288
+ return {
289
+ ...env,
290
+ ...(env.actorId ? {} : { actorId: auth.refreshUser.id }),
291
+ ...(env.actorEmail ? {} : { actorEmail: auth.refreshUser.email ?? null }),
292
+ ...(env.refreshToken ? {} : { refreshToken: auth.bearerToken }),
293
+ ...(env.appId ? {} : { appId: auth.appId }),
294
+ };
295
+ }
296
+ function createRouteRuntime(env, resolved, db) {
297
+ return {
298
+ env,
299
+ async db() {
300
+ return db;
301
+ },
302
+ async resolve() {
303
+ return {
304
+ db,
305
+ meta: resolved.meta,
306
+ };
307
+ },
308
+ meta: resolved.meta,
309
+ };
310
+ }
311
+ function resolveActionByAlias(name) {
312
+ const normalized = String(name ?? "").trim();
313
+ if (!normalized)
314
+ return null;
315
+ const actions = getRuntimeActions();
316
+ const source = resolveSource(getRuntimeConfig());
317
+ return (actions.find((action) => {
318
+ if (String(action.name ?? "").trim() === normalized)
319
+ return true;
320
+ const binding = getDomainActionBinding(action);
321
+ const key = typeof binding?.key === "string"
322
+ ? binding.key
323
+ : resolveDomainActionKeyByName(source, String(action.name ?? "").trim());
324
+ return typeof key === "string" && key === normalized;
325
+ }) ?? null);
326
+ }
327
+ export async function handleDomainCliGet(req) {
328
+ const config = getRuntimeConfig();
329
+ const source = resolveSource(config);
330
+ const auth = await resolveAuth(req, null, source);
331
+ if (!auth.authorized) {
332
+ return new Response("Unauthorized", { status: 401 });
333
+ }
334
+ const context = buildContext(config, source);
335
+ const schema = context?.schema ?? buildSchema(source);
336
+ const contextString = buildContextString(config, source);
337
+ return json({
338
+ ok: true,
339
+ mode: "full",
340
+ instant: {
341
+ appId: auth.appId,
342
+ apiURI: resolveInstantApiUri(),
343
+ projectId: getRuntimeProjectId() || null,
344
+ },
345
+ auth: {
346
+ required: isAuthRequired(),
347
+ supportsRefreshToken: Boolean(auth.appId),
348
+ supportsBearerToken: true,
349
+ },
350
+ domain: context ?? {
351
+ available: Boolean(source),
352
+ entities: listKeys(source?.entities),
353
+ links: listKeys(source?.links),
354
+ rooms: listKeys(source?.rooms),
355
+ meta: config?.meta ?? {},
356
+ },
357
+ schema,
358
+ contextString,
359
+ actions: listActions(),
360
+ });
361
+ }
362
+ export async function handleDomainCliPost(req) {
363
+ const config = getRuntimeConfig();
364
+ const source = resolveSource(config);
365
+ if (!source) {
366
+ return new Response("Runtime domain not configured", { status: 500 });
367
+ }
368
+ let body = null;
369
+ try {
370
+ body = await req.json();
371
+ }
372
+ catch {
373
+ body = null;
374
+ }
375
+ const op = String(body?.op ?? (body?.action ? "action" : "query")).trim();
376
+ const auth = await resolveAuth(req, body, source);
377
+ if (!auth.authorized) {
378
+ return new Response("Unauthorized", { status: 401 });
379
+ }
380
+ const env = withActorEnv(asRecord(body?.env), auth);
381
+ const resolved = await resolveRuntime(source, env);
382
+ const actor = resolveActor(auth, body);
383
+ const db = resolveImpersonatedDb(resolved.db, auth, body);
384
+ const sourceType = resolveSourceType(auth, body);
385
+ if (op === "action") {
386
+ const action = resolveActionByAlias(String(body?.action ?? ""));
387
+ if (!action) {
388
+ return json({
389
+ ok: false,
390
+ error: `runtime_action_not_found:${String(body?.action ?? "")}`,
391
+ }, { status: 404 });
392
+ }
393
+ try {
394
+ const runtime = createRouteRuntime(env, resolved, db);
395
+ const output = await executeRuntimeAction({
396
+ action,
397
+ runtime,
398
+ input: body?.input ?? {},
399
+ });
400
+ return json({
401
+ ok: true,
402
+ action: action.name,
403
+ output,
404
+ actor,
405
+ source: sourceType,
406
+ });
407
+ }
408
+ catch (error) {
409
+ return json({
410
+ ok: false,
411
+ error: error instanceof Error ? error.message : String(error),
412
+ actor,
413
+ }, { status: 500 });
414
+ }
415
+ }
416
+ const query = body?.query ?? null;
417
+ if (!query) {
418
+ return new Response("Missing query", { status: 400 });
419
+ }
420
+ try {
421
+ const result = await db.query(query);
422
+ return json({
423
+ ok: true,
424
+ actor,
425
+ source: sourceType,
426
+ ...truncateQueryResult(asRecord(result)),
427
+ });
428
+ }
429
+ catch (error) {
430
+ return json({
431
+ ok: false,
432
+ error: error instanceof Error ? error.message : String(error),
433
+ actor,
434
+ }, { status: 500 });
435
+ }
436
+ }
437
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/cli/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export type DomainCliManifestAction = {
2
+ name: string;
3
+ key?: string | null;
4
+ description?: string | null;
5
+ inputSchema?: unknown;
6
+ };
7
+ export type DomainCliManifest = {
8
+ ok: true;
9
+ mode: "full";
10
+ instant: {
11
+ appId?: string | null;
12
+ apiURI?: string | null;
13
+ };
14
+ auth: {
15
+ required: boolean;
16
+ supportsRefreshToken: boolean;
17
+ supportsBearerToken: boolean;
18
+ };
19
+ domain: unknown;
20
+ schema?: unknown;
21
+ contextString?: string | null;
22
+ actions: DomainCliManifestAction[];
23
+ };
24
+ export type DomainCliQueryResponse = {
25
+ ok: boolean;
26
+ data?: unknown;
27
+ truncated?: Record<string, {
28
+ returned: number;
29
+ total: number;
30
+ }> | null;
31
+ error?: string;
32
+ status?: number;
33
+ actor?: {
34
+ id?: string | null;
35
+ email?: string | null;
36
+ isGuest?: boolean;
37
+ } | null;
38
+ source?: "admin" | "guest" | "email" | "refresh-token" | "static" | "oidc" | null;
39
+ };
40
+ export type DomainCliActionResponse = {
41
+ ok: boolean;
42
+ action?: string;
43
+ output?: unknown;
44
+ error?: string;
45
+ status?: number;
46
+ actor?: {
47
+ id?: string | null;
48
+ email?: string | null;
49
+ isGuest?: boolean;
50
+ } | null;
51
+ };
52
+ export type DomainCliSession = {
53
+ version: 1;
54
+ baseUrl: string;
55
+ appId: string;
56
+ refreshToken: string;
57
+ apiURI: string;
58
+ savedAt: string;
59
+ };
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,IAAI,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE;QACP,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KACvB,CAAA;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,OAAO,CAAA;QACjB,oBAAoB,EAAE,OAAO,CAAA;QAC7B,mBAAmB,EAAE,OAAO,CAAA;KAC7B,CAAA;IACD,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,OAAO,EAAE,uBAAuB,EAAE,CAAA;CACnC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAA;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB,GAAG,IAAI,CAAA;IACR,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAA;CAClF,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE;QACN,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,OAAO,CAAC,EAAE,OAAO,CAAA;KAClB,GAAG,IAAI,CAAA;CACT,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,CAAC,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { CreateDomainAppParams, CreateDomainAppResult } from "./create-app.js";
2
+ export declare function runCreateAppInk(params: CreateDomainAppParams): Promise<CreateDomainAppResult>;
3
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/cli/ui.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,qBAAqB,EAGrB,qBAAqB,EACtB,MAAM,iBAAiB,CAAA;AA8LxB,wBAAsB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA2BnG"}
package/dist/cli/ui.js ADDED
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useState } from "react";
3
+ import { Box, Text, render, useApp } from "ink";
4
+ import Spinner from "ink-spinner";
5
+ import { createDomainApp } from "./create-app.js";
6
+ const STAGE_LABELS = [
7
+ { id: "prepare-target", label: "Prepare target" },
8
+ { id: "detect-package-manager", label: "Detect package manager" },
9
+ { id: "resolve-version", label: "Resolve package version" },
10
+ { id: "provision-instant", label: "Provision Instant app" },
11
+ { id: "write-files", label: "Write scaffold files" },
12
+ { id: "write-env", label: "Write environment" },
13
+ { id: "install", label: "Install dependencies" },
14
+ { id: "complete", label: "Complete" },
15
+ ];
16
+ function createInitialState() {
17
+ return {
18
+ currentMessage: "Starting create-app",
19
+ progress: 0,
20
+ logs: [],
21
+ steps: STAGE_LABELS.map((stage) => ({
22
+ id: stage.id,
23
+ label: stage.label,
24
+ state: "pending",
25
+ })),
26
+ result: null,
27
+ error: null,
28
+ };
29
+ }
30
+ function applyProgress(prev, event) {
31
+ if (event.status === "log") {
32
+ return {
33
+ ...prev,
34
+ logs: [...prev.logs, event.message].slice(-10),
35
+ };
36
+ }
37
+ return {
38
+ ...prev,
39
+ currentMessage: event.message,
40
+ progress: event.progress ?? prev.progress,
41
+ steps: prev.steps.map((step) => {
42
+ if (step.id !== event.stage)
43
+ return step;
44
+ return {
45
+ ...step,
46
+ state: event.status === "completed" ? "completed" : "running",
47
+ };
48
+ }),
49
+ };
50
+ }
51
+ function StepRow({ step }) {
52
+ const prefix = step.state === "completed"
53
+ ? _jsx(Text, { color: "green", children: "OK" })
54
+ : step.state === "running"
55
+ ? _jsx(Text, { color: "cyan", children: _jsx(Spinner, { type: "dots" }) })
56
+ : _jsx(Text, { color: "gray", children: "-" });
57
+ return (_jsxs(Box, { children: [_jsxs(Text, { children: [prefix, " "] }), _jsx(Text, { color: step.state === "pending" ? "gray" : undefined, children: step.label })] }));
58
+ }
59
+ function CreateAppInk(props) {
60
+ const { exit } = useApp();
61
+ const [state, setState] = useState(() => createInitialState());
62
+ const summary = useMemo(() => {
63
+ if (!state.result)
64
+ return [];
65
+ return [
66
+ `Directory: ${state.result.directory}`,
67
+ `Package manager: ${state.result.packageManager}`,
68
+ ...(state.result.appId ? [`Instant app: ${state.result.appId}`] : []),
69
+ ];
70
+ }, [state.result]);
71
+ useEffect(() => {
72
+ let active = true;
73
+ const finish = (outcome) => {
74
+ if (!active)
75
+ return;
76
+ props.onSettled(outcome);
77
+ setTimeout(() => {
78
+ if (active)
79
+ exit();
80
+ }, outcome.error ? 900 : 450);
81
+ };
82
+ void createDomainApp({
83
+ ...props.params,
84
+ onProgress: async (event) => {
85
+ if (!active)
86
+ return;
87
+ setState((prev) => applyProgress(prev, event));
88
+ },
89
+ })
90
+ .then((result) => {
91
+ if (!active)
92
+ return;
93
+ setState((prev) => ({
94
+ ...prev,
95
+ currentMessage: "App scaffolded successfully",
96
+ progress: 100,
97
+ result,
98
+ }));
99
+ finish({ result });
100
+ })
101
+ .catch((error) => {
102
+ const message = error instanceof Error ? error.message : String(error);
103
+ if (!active)
104
+ return;
105
+ setState((prev) => ({
106
+ ...prev,
107
+ error: message,
108
+ currentMessage: message,
109
+ }));
110
+ finish({ error: error instanceof Error ? error : new Error(message) });
111
+ });
112
+ return () => {
113
+ active = false;
114
+ };
115
+ }, [exit, props]);
116
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Ekairos Domain CLI" }), _jsxs(Text, { color: state.error ? "red" : "gray", children: [state.error ? "Failed" : `${Math.max(0, Math.min(100, Math.round(state.progress)))}%`, " ", state.currentMessage] }), _jsx(Box, { flexDirection: "column", marginTop: 1, children: state.steps.map((step) => (_jsx(StepRow, { step: step }, step.id))) }), state.logs.length > 0 ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "yellow", children: "Recent output" }), state.logs.map((line, index) => (_jsx(Text, { color: "gray", children: line }, `${index}-${line}`)))] })) : null, summary.length > 0 ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "green", children: "Result" }), summary.map((line) => (_jsx(Text, { children: line }, line)))] })) : null, state.error ? (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", children: state.error }) })) : null] }));
117
+ }
118
+ export async function runCreateAppInk(params) {
119
+ let outcome = null;
120
+ const app = render(_jsx(CreateAppInk, { params: params, onSettled: (next) => {
121
+ outcome = next;
122
+ } }));
123
+ await app.waitUntilExit();
124
+ if (!outcome) {
125
+ throw new Error("create_app_ui_no_outcome");
126
+ }
127
+ const settled = outcome;
128
+ if (settled.error) {
129
+ throw settled.error;
130
+ }
131
+ if (!settled.result) {
132
+ throw new Error("create_app_ui_missing_result");
133
+ }
134
+ return settled.result;
135
+ }
136
+ //# sourceMappingURL=ui.js.map