@vibes.diy/api-svc 2.0.0-dev-cli-d → 2.0.0-dev-cli-i

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 (96) hide show
  1. package/cf-serve.d.ts +1 -4
  2. package/cf-serve.js +10 -15
  3. package/cf-serve.js.map +1 -1
  4. package/check-auth.js +13 -3
  5. package/check-auth.js.map +1 -1
  6. package/create-handler.d.ts +5 -6
  7. package/create-handler.js +6 -32
  8. package/create-handler.js.map +1 -1
  9. package/index.d.ts +0 -1
  10. package/index.js +0 -1
  11. package/index.js.map +1 -1
  12. package/intern/ensure-application-chat-id.js +5 -5
  13. package/intern/ensure-application-chat-id.js.map +1 -1
  14. package/intern/ensure-chat-id.js +45 -33
  15. package/intern/ensure-chat-id.js.map +1 -1
  16. package/intern/ensure-slug-binding.d.ts +12 -26
  17. package/intern/ensure-slug-binding.js +125 -29
  18. package/intern/ensure-slug-binding.js.map +1 -1
  19. package/intern/get-model-defaults.d.ts +12 -0
  20. package/intern/get-model-defaults.js +90 -0
  21. package/intern/get-model-defaults.js.map +1 -0
  22. package/intern/get-slug-binding.d.ts +2 -3
  23. package/intern/get-slug-binding.js +13 -4
  24. package/intern/get-slug-binding.js.map +1 -1
  25. package/intern/grouped-vibe-import-map.d.ts +2 -0
  26. package/intern/grouped-vibe-import-map.js +2 -0
  27. package/intern/grouped-vibe-import-map.js.map +1 -1
  28. package/intern/render-vibe.d.ts +2 -2
  29. package/intern/render-vibe.js.map +1 -1
  30. package/intern/resend-prev-msg.js +5 -13
  31. package/intern/resend-prev-msg.js.map +1 -1
  32. package/intern/write-apps.d.ts +4 -5
  33. package/intern/write-apps.js +27 -18
  34. package/intern/write-apps.js.map +1 -1
  35. package/models.json +179 -0
  36. package/package.json +19 -16
  37. package/peers/s3.d.ts +1 -1
  38. package/public/ensure-app-settings.js +39 -12
  39. package/public/ensure-app-settings.js.map +1 -1
  40. package/public/ensure-app-slug-item.js +23 -47
  41. package/public/ensure-app-slug-item.js.map +1 -1
  42. package/public/ensure-user-settings.js +9 -8
  43. package/public/ensure-user-settings.js.map +1 -1
  44. package/public/get-chat-details.js +7 -5
  45. package/public/get-chat-details.js.map +1 -1
  46. package/public/invite-flow.js +59 -36
  47. package/public/invite-flow.js.map +1 -1
  48. package/public/list-models.d.ts +14 -0
  49. package/public/list-models.js +41 -0
  50. package/public/list-models.js.map +1 -0
  51. package/public/open-chat.js +2 -2
  52. package/public/open-chat.js.map +1 -1
  53. package/public/prompt-chat-section.d.ts +1 -1
  54. package/public/prompt-chat-section.js +40 -15
  55. package/public/prompt-chat-section.js.map +1 -1
  56. package/public/request-flow.js +65 -53
  57. package/public/request-flow.js.map +1 -1
  58. package/public/user-slug-bindings.d.ts +5 -0
  59. package/public/user-slug-bindings.js +144 -0
  60. package/public/user-slug-bindings.js.map +1 -0
  61. package/types.d.ts +37 -18
  62. package/types.js +27 -1
  63. package/types.js.map +1 -1
  64. package/usage-report/README.md +27 -0
  65. package/usage-report/inspect-db-report-template.d.ts +29 -0
  66. package/usage-report/inspect-db-report-template.js +379 -0
  67. package/usage-report/inspect-db-report-template.js.map +1 -0
  68. package/usage-report/inspect-db-report.d.ts +1 -0
  69. package/usage-report/inspect-db-report.js +264 -0
  70. package/usage-report/inspect-db-report.js.map +1 -0
  71. package/usage-report/inspect-db.d.ts +1 -0
  72. package/usage-report/inspect-db.js +226 -0
  73. package/usage-report/inspect-db.js.map +1 -0
  74. package/vibes-msg-evento.js +3 -1
  75. package/vibes-msg-evento.js.map +1 -1
  76. package/intern/ensure-storage.d.ts +0 -26
  77. package/intern/ensure-storage.js +0 -86
  78. package/intern/ensure-storage.js.map +0 -1
  79. package/intern/send-email.d.ts +0 -4
  80. package/intern/send-email.js +0 -55
  81. package/intern/send-email.js.map +0 -1
  82. package/intern/store-screenshot.d.ts +0 -17
  83. package/intern/store-screenshot.js +0 -36
  84. package/intern/store-screenshot.js.map +0 -1
  85. package/peers/sql.d.ts +0 -22
  86. package/peers/sql.js +0 -102
  87. package/peers/sql.js.map +0 -1
  88. package/sql/tables.d.ts +0 -1536
  89. package/sql/tables.js +0 -38
  90. package/sql/tables.js.map +0 -1
  91. package/sql/vibes-diy-api-schema-pg.d.ts +0 -1418
  92. package/sql/vibes-diy-api-schema-pg.js +0 -141
  93. package/sql/vibes-diy-api-schema-pg.js.map +0 -1
  94. package/sql/vibes-diy-api-schema-sqlite.d.ts +0 -1536
  95. package/sql/vibes-diy-api-schema-sqlite.js +0 -131
  96. package/sql/vibes-diy-api-schema-sqlite.js.map +0 -1
@@ -0,0 +1,144 @@
1
+ import { Result, Option, EventoResult } from "@adviser/cement";
2
+ import { and, eq, inArray } from "drizzle-orm/sql/expressions";
3
+ import { sql } from "drizzle-orm/sql";
4
+ import { isReqListUserSlugBindings, isReqCreateUserSlugBinding, isReqDeleteUserSlugBinding, } from "@vibes.diy/api-types";
5
+ import { unwrapMsgBase } from "../unwrap-msg-base.js";
6
+ import { checkAuth } from "../check-auth.js";
7
+ import { writeUserSlugBinding, toRFC2822_32ByteLength } from "../intern/ensure-slug-binding.js";
8
+ import { generate } from "random-words";
9
+ export const listUserSlugBindingsEvento = {
10
+ hash: "list-user-slug-bindings",
11
+ validate: unwrapMsgBase(async (msg) => {
12
+ const ret = isReqListUserSlugBindings(msg.payload);
13
+ if (!ret) {
14
+ return Result.Ok(Option.None());
15
+ }
16
+ return Result.Ok(Option.Some({ ...msg, payload: msg.payload }));
17
+ }),
18
+ handle: checkAuth(async (ctx) => {
19
+ const req = ctx.validated.payload;
20
+ const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
21
+ const userId = req._auth.verifiedAuth.claims.userId;
22
+ const rows = await vctx.sql.db
23
+ .select({
24
+ userSlug: vctx.sql.tables.userSlugBinding.userSlug,
25
+ tenant: vctx.sql.tables.userSlugBinding.tenant,
26
+ created: vctx.sql.tables.userSlugBinding.created,
27
+ appSlugCount: sql `count(${vctx.sql.tables.appSlugBinding.appSlug})`,
28
+ })
29
+ .from(vctx.sql.tables.userSlugBinding)
30
+ .leftJoin(vctx.sql.tables.appSlugBinding, eq(vctx.sql.tables.appSlugBinding.userSlug, vctx.sql.tables.userSlugBinding.userSlug))
31
+ .where(eq(vctx.sql.tables.userSlugBinding.userId, userId))
32
+ .groupBy(vctx.sql.tables.userSlugBinding.userSlug, vctx.sql.tables.userSlugBinding.tenant, vctx.sql.tables.userSlugBinding.created);
33
+ await ctx.send.send(ctx, {
34
+ type: "vibes.diy.res-list-user-slug-bindings",
35
+ items: rows.map((r) => ({ ...r, appSlugCount: Number(r.appSlugCount) })),
36
+ });
37
+ return Result.Ok(EventoResult.Continue);
38
+ }),
39
+ };
40
+ export const createUserSlugBindingEvento = {
41
+ hash: "create-user-slug-binding",
42
+ validate: unwrapMsgBase(async (msg) => {
43
+ const ret = isReqCreateUserSlugBinding(msg.payload);
44
+ if (!ret) {
45
+ return Result.Ok(Option.None());
46
+ }
47
+ return Result.Ok(Option.Some({ ...msg, payload: msg.payload }));
48
+ }),
49
+ handle: checkAuth(async (ctx) => {
50
+ const req = ctx.validated.payload;
51
+ const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
52
+ const userId = req._auth.verifiedAuth.claims.userId;
53
+ let userSlug;
54
+ if (req.userSlug) {
55
+ userSlug = toRFC2822_32ByteLength(req.userSlug);
56
+ }
57
+ else {
58
+ let generated;
59
+ for (let attempts = 0; attempts < 5; attempts++) {
60
+ const candidate = generate({ exactly: 1, wordsPerString: 3, separator: "-" })[0];
61
+ if (candidate.length > 30)
62
+ continue;
63
+ const existing = await vctx.sql.db
64
+ .select()
65
+ .from(vctx.sql.tables.userSlugBinding)
66
+ .where(eq(vctx.sql.tables.userSlugBinding.userSlug, candidate))
67
+ .limit(1)
68
+ .then((r) => r[0]);
69
+ if (!existing) {
70
+ generated = candidate;
71
+ break;
72
+ }
73
+ }
74
+ if (!generated) {
75
+ await ctx.send.send(ctx, {
76
+ type: "vibes.diy.error",
77
+ message: "could not generate unique userSlug after 5 attempts",
78
+ });
79
+ return Result.Ok(EventoResult.Continue);
80
+ }
81
+ userSlug = generated;
82
+ }
83
+ const result = await writeUserSlugBinding(vctx, userId, userSlug);
84
+ if (result.isErr()) {
85
+ await ctx.send.send(ctx, {
86
+ type: "vibes.diy.error",
87
+ message: result.Err().message,
88
+ });
89
+ return Result.Ok(EventoResult.Continue);
90
+ }
91
+ const binding = result.Ok();
92
+ await ctx.send.send(ctx, {
93
+ type: "vibes.diy.res-create-user-slug-binding",
94
+ userSlug: binding.userSlug,
95
+ tenant: binding.tenant,
96
+ created: new Date().toISOString(),
97
+ });
98
+ return Result.Ok(EventoResult.Continue);
99
+ }),
100
+ };
101
+ export const deleteUserSlugBindingEvento = {
102
+ hash: "delete-user-slug-binding",
103
+ validate: unwrapMsgBase(async (msg) => {
104
+ const ret = isReqDeleteUserSlugBinding(msg.payload);
105
+ if (!ret) {
106
+ return Result.Ok(Option.None());
107
+ }
108
+ return Result.Ok(Option.Some({ ...msg, payload: msg.payload }));
109
+ }),
110
+ handle: checkAuth(async (ctx) => {
111
+ const req = ctx.validated.payload;
112
+ const vctx = ctx.ctx.getOrThrow("vibesApiCtx");
113
+ const userId = req._auth.verifiedAuth.claims.userId;
114
+ const { userSlug } = req;
115
+ const t = vctx.sql.tables;
116
+ const chatIdSubquery = vctx.sql.db
117
+ .select({ chatId: t.chatContexts.chatId })
118
+ .from(t.chatContexts)
119
+ .where(and(eq(t.chatContexts.userSlug, userSlug), eq(t.chatContexts.userId, userId)));
120
+ await vctx.sql.db.delete(t.chatSections).where(inArray(t.chatSections.chatId, chatIdSubquery));
121
+ await vctx.sql.db.delete(t.promptContexts).where(inArray(t.promptContexts.chatId, chatIdSubquery));
122
+ await vctx.sql.db.delete(t.chatContexts).where(and(eq(t.chatContexts.userSlug, userSlug), eq(t.chatContexts.userId, userId)));
123
+ await vctx.sql.db
124
+ .delete(t.applicationChats)
125
+ .where(and(eq(t.applicationChats.userSlug, userSlug), eq(t.applicationChats.userId, userId)));
126
+ await vctx.sql.db.delete(t.appSettings).where(and(eq(t.appSettings.userSlug, userSlug), eq(t.appSettings.userId, userId)));
127
+ await vctx.sql.db
128
+ .delete(t.requestGrants)
129
+ .where(and(eq(t.requestGrants.userSlug, userSlug), eq(t.requestGrants.userId, userId)));
130
+ await vctx.sql.db.delete(t.inviteGrants).where(and(eq(t.inviteGrants.userSlug, userSlug), eq(t.inviteGrants.userId, userId)));
131
+ await vctx.sql.db.delete(t.apps).where(and(eq(t.apps.userSlug, userSlug), eq(t.apps.userId, userId)));
132
+ await vctx.sql.db.delete(t.appSlugBinding).where(eq(t.appSlugBinding.userSlug, userSlug));
133
+ await vctx.sql.db
134
+ .delete(t.userSlugBinding)
135
+ .where(and(eq(t.userSlugBinding.userId, userId), eq(t.userSlugBinding.userSlug, userSlug)));
136
+ await ctx.send.send(ctx, {
137
+ type: "vibes.diy.res-delete-user-slug-binding",
138
+ userSlug,
139
+ deleted: true,
140
+ });
141
+ return Result.Ok(EventoResult.Continue);
142
+ }),
143
+ };
144
+ //# sourceMappingURL=user-slug-bindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-slug-bindings.js","sourceRoot":"","sources":["../../jsr/public/user-slug-bindings.ts"],"names":[],"mappings":"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"}
package/types.d.ts CHANGED
@@ -1,24 +1,13 @@
1
1
  import { SuperThis } from "@fireproof/core-types-base";
2
2
  import { FPApiToken } from "@fireproof/core-types-protocols-dashboard";
3
- import { VibesSqlite } from "./create-handler.js";
4
3
  import { WSSendProvider } from "./svc-ws-send-provider.js";
5
4
  import { DeviceIdCAIf } from "@fireproof/core-types-device-id";
6
5
  import { Logger, Result } from "@adviser/cement";
7
6
  import { LLMRequest } from "@vibes.diy/call-ai-v2";
8
- import { FetchResult, LLMHeaders, MsgBase, RawEmailWithoutFrom, VibesFPApiParameters } from "@vibes.diy/api-types";
9
- import { VibesApiTables } from "./sql/tables.js";
7
+ import { LLMHeaders, MsgBase, VibesAssetStorage, VibesFPApiParameters } from "@vibes.diy/api-types";
8
+ import { VibesApiTables, VibesSqlite } from "@vibes.diy/api-sql";
9
+ import { type } from "arktype";
10
10
  export type { VibesApiTables };
11
- export interface StorageResult {
12
- cid: string;
13
- getURL: string;
14
- mode: "created" | "existing";
15
- created: Date;
16
- size: number;
17
- }
18
- export interface Storage {
19
- fetch: (url: string) => Promise<FetchResult>;
20
- ensure: (...items: ReadableStream<Uint8Array | string>[]) => Promise<Result<StorageResult>[]>;
21
- }
22
11
  export interface CfCacheIf {
23
12
  delete(request: RequestInfo | URL, options?: CacheQueryOptions): Promise<boolean>;
24
13
  match(request: RequestInfo | URL, options?: CacheQueryOptions): Promise<Response | undefined>;
@@ -42,9 +31,6 @@ export interface VibesApiSQLCtx {
42
31
  connections: Set<WSSendProvider>;
43
32
  deviceCA: DeviceIdCAIf;
44
33
  logger: Logger;
45
- sendEmail: (email: RawEmailWithoutFrom) => Promise<Result<{
46
- result: unknown;
47
- }>>;
48
34
  postQueue(msg: MsgBase): Promise<void>;
49
35
  netHash(): string;
50
36
  params: VibesFPApiParameters;
@@ -54,8 +40,41 @@ export interface VibesApiSQLCtx {
54
40
  version: string;
55
41
  }>>;
56
42
  fetchAsset(url: string): Promise<Result<ReadableStream<Uint8Array>>>;
57
- storage: Storage;
43
+ storage: VibesAssetStorage;
58
44
  llmRequest(prompt: LLMRequest & {
59
45
  headers: LLMHeaders;
60
46
  }): Promise<Response>;
61
47
  }
48
+ export declare const UserSlugBinding: import("arktype/internal/variants/object.ts").ObjectType<{
49
+ type: "vibes.diy-user-slug-binding";
50
+ userId: string;
51
+ userSlug: string;
52
+ tenant: string;
53
+ }, {}>;
54
+ export type UserSlugBinding = type.infer<typeof UserSlugBinding>;
55
+ export declare function isUserSlugBinding(obj: unknown): obj is UserSlugBinding;
56
+ export declare const AppSlugBinding: import("arktype/internal/variants/object.ts").ObjectType<{
57
+ type: "vibes.diy-app-slug-binding";
58
+ userId: string;
59
+ appSlug: string;
60
+ ledger: string;
61
+ }, {}>;
62
+ export type AppSlugBinding = type.infer<typeof AppSlugBinding>;
63
+ export declare function isAppSlugBinding(obj: unknown): obj is AppSlugBinding;
64
+ export declare const AppUserSlugBinding: import("arktype/internal/variants/object.ts").ObjectType<{
65
+ type: "vibes.diy-app-user-slug-binding";
66
+ userSlug: {
67
+ type: "vibes.diy-user-slug-binding";
68
+ userId: string;
69
+ userSlug: string;
70
+ tenant: string;
71
+ };
72
+ appSlug: {
73
+ type: "vibes.diy-app-slug-binding";
74
+ userId: string;
75
+ appSlug: string;
76
+ ledger: string;
77
+ };
78
+ }, {}>;
79
+ export type AppUserSlugBinding = type.infer<typeof AppUserSlugBinding>;
80
+ export declare function isAppUserSlugBinding(obj: unknown): obj is AppUserSlugBinding;
package/types.js CHANGED
@@ -1,2 +1,28 @@
1
- export {};
1
+ import { type } from "arktype";
2
+ export const UserSlugBinding = type({
3
+ type: "'vibes.diy-user-slug-binding'",
4
+ userId: "string",
5
+ userSlug: "string",
6
+ tenant: "string",
7
+ });
8
+ export function isUserSlugBinding(obj) {
9
+ return !(UserSlugBinding(obj) instanceof type.errors);
10
+ }
11
+ export const AppSlugBinding = type({
12
+ type: "'vibes.diy-app-slug-binding'",
13
+ userId: "string",
14
+ appSlug: "string",
15
+ ledger: "string",
16
+ });
17
+ export function isAppSlugBinding(obj) {
18
+ return !(AppSlugBinding(obj) instanceof type.errors);
19
+ }
20
+ export const AppUserSlugBinding = type({
21
+ type: "'vibes.diy-app-user-slug-binding'",
22
+ userSlug: UserSlugBinding,
23
+ appSlug: AppSlugBinding,
24
+ });
25
+ export function isAppUserSlugBinding(obj) {
26
+ return !(AppUserSlugBinding(obj) instanceof type.errors);
27
+ }
2
28
  //# sourceMappingURL=types.js.map
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../jsr/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../jsr/types.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAyC/B,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;IAClC,IAAI,EAAE,+BAA+B;IACrC,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ;IAClB,MAAM,EAAE,QAAQ;CACjB,CAAC,CAAC;AAGH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,OAAO,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,8BAA8B;IACpC,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,QAAQ;CACjB,CAAC,CAAC;AAGH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;IACrC,IAAI,EAAE,mCAAmC;IACzC,QAAQ,EAAE,eAAe;IACzB,OAAO,EAAE,cAAc;CACxB,CAAC,CAAC;AAGH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,27 @@
1
+ # Usage Report
2
+
3
+ This directory contains the database inspection and usage-report tooling for team reporting.
4
+
5
+ Files:
6
+
7
+ - `inspect-db.ts`: read-only database inspector for connection info, table listings, table samples, and ad hoc SQL.
8
+ - `inspect-db-report.ts`: report generator that queries the database, writes CSV snapshots, and produces the HTML report.
9
+ - `inspect-db-report-template.ts`: HTML template/rendering module used by the report generator.
10
+
11
+ Commands:
12
+
13
+ ```bash
14
+ pnpm --dir /Users/jchris/code/fp/vibes.diy/vibes.diy/api/svc run inspect:db info
15
+ pnpm --dir /Users/jchris/code/fp/vibes.diy/vibes.diy/api/svc run inspect:db tables
16
+ pnpm --dir /Users/jchris/code/fp/vibes.diy/vibes.diy/api/svc run inspect:db-report
17
+ ```
18
+
19
+ Local configuration:
20
+
21
+ - Put `NEON_DATABASE_URL=...` in `/Users/jchris/code/fp/vibes.diy/vibes.diy/api/svc/.dev.vars`
22
+ - `.dev.vars` is gitignored
23
+
24
+ Generated output:
25
+
26
+ - HTML and CSV files are written to `vibes.diy/api/svc/dist/inspect-db-report`
27
+ - rerunning the report overwrites the same files in place
@@ -0,0 +1,29 @@
1
+ interface ReportData {
2
+ readonly generatedAt: string;
3
+ readonly info: {
4
+ readonly database: string;
5
+ readonly current_schema: string;
6
+ readonly current_user: string;
7
+ readonly server_addr: string;
8
+ readonly server_port: number;
9
+ readonly schemas: readonly string[];
10
+ };
11
+ readonly tableCounts: readonly {
12
+ readonly table: string;
13
+ readonly rowCount: number;
14
+ }[];
15
+ readonly membershipSummary: {
16
+ readonly membership_count: number;
17
+ readonly shared_app_count: number;
18
+ readonly distinct_member_count: number;
19
+ };
20
+ readonly membershipTimeseries: readonly Record<string, unknown>[];
21
+ readonly userSlugBindingsTimeseries: readonly Record<string, unknown>[];
22
+ readonly membershipsByApp: readonly Record<string, unknown>[];
23
+ readonly userModelRows: readonly Record<string, unknown>[];
24
+ readonly appModelRows: readonly Record<string, unknown>[];
25
+ readonly userSettingsSample: readonly Record<string, unknown>[];
26
+ readonly appSettingsSample: readonly Record<string, unknown>[];
27
+ }
28
+ export declare function renderHtmlReport(data: ReportData): string;
29
+ export {};