vibes-diy 2.2.12 → 2.2.13-dev.2

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 (40) hide show
  1. package/cli/cmd-evento.js +18 -1
  2. package/cli/cmd-evento.js.map +1 -1
  3. package/cli/cmd-evento.test.d.ts +1 -0
  4. package/cli/cmd-evento.test.js +11 -0
  5. package/cli/cmd-evento.test.js.map +1 -0
  6. package/cli/cmds/db/del-cmd.d.ts +44 -0
  7. package/cli/cmds/db/del-cmd.js +96 -0
  8. package/cli/cmds/db/del-cmd.js.map +1 -0
  9. package/cli/cmds/db/get-cmd.d.ts +45 -0
  10. package/cli/cmds/db/get-cmd.js +98 -0
  11. package/cli/cmds/db/get-cmd.js.map +1 -0
  12. package/cli/cmds/db/index.d.ts +192 -0
  13. package/cli/cmds/db/index.js +28 -0
  14. package/cli/cmds/db/index.js.map +1 -0
  15. package/cli/cmds/db/list-cmd.d.ts +37 -0
  16. package/cli/cmds/db/list-cmd.js +65 -0
  17. package/cli/cmds/db/list-cmd.js.map +1 -0
  18. package/cli/cmds/db/put-cmd.d.ts +45 -0
  19. package/cli/cmds/db/put-cmd.js +99 -0
  20. package/cli/cmds/db/put-cmd.js.map +1 -0
  21. package/cli/cmds/db/query-cmd.d.ts +58 -0
  22. package/cli/cmds/db/query-cmd.js +166 -0
  23. package/cli/cmds/db/query-cmd.js.map +1 -0
  24. package/cli/cmds/db/shared.d.ts +15 -0
  25. package/cli/cmds/db/shared.js +42 -0
  26. package/cli/cmds/db/shared.js.map +1 -0
  27. package/cli/cmds/db/subscribe-cmd.d.ts +32 -0
  28. package/cli/cmds/db/subscribe-cmd.js +67 -0
  29. package/cli/cmds/db/subscribe-cmd.js.map +1 -0
  30. package/cli/cmds/edit-cmd.d.ts +52 -0
  31. package/cli/cmds/edit-cmd.js +222 -0
  32. package/cli/cmds/edit-cmd.js.map +1 -0
  33. package/cli/cmds/edit-cmd.test.d.ts +1 -0
  34. package/cli/cmds/edit-cmd.test.js +297 -0
  35. package/cli/cmds/edit-cmd.test.js.map +1 -0
  36. package/cli/cmds/resolve-section-stream.test.js +20 -0
  37. package/cli/cmds/resolve-section-stream.test.js.map +1 -1
  38. package/cli/main.js +35 -0
  39. package/cli/main.js.map +1 -1
  40. package/package.json +6 -5
@@ -0,0 +1,65 @@
1
+ import { command } from "cmd-ts";
2
+ import { type } from "arktype";
3
+ import { Result, Option } from "@adviser/cement";
4
+ import { cmdTsDefaultArgs } from "../../cli-ctx.js";
5
+ import { sendMsg } from "../../cmd-evento.js";
6
+ import { dbCommonArgs, resolveUserSlug } from "./shared.js";
7
+ export const ReqDbList = type({
8
+ type: "'vibes-diy.cli.db.list'",
9
+ apiUrl: "string",
10
+ appSlug: "string",
11
+ userSlug: "string",
12
+ });
13
+ export function isReqDbList(obj) {
14
+ return !(ReqDbList(obj) instanceof type.errors);
15
+ }
16
+ export const ResDbList = type({
17
+ type: "'vibes-diy.cli.db.list-res'",
18
+ dbNames: type("string").array(),
19
+ });
20
+ export function isResDbList(obj) {
21
+ return !(ResDbList(obj) instanceof type.errors);
22
+ }
23
+ export const dbListEvento = {
24
+ hash: "vibes-diy.cli.db.list",
25
+ validate: (ctx) => {
26
+ if (isReqDbList(ctx.enRequest)) {
27
+ return Promise.resolve(Result.Ok(Option.Some(ctx.enRequest)));
28
+ }
29
+ return Promise.resolve(Result.Ok(Option.None()));
30
+ },
31
+ handle: async (ctx) => {
32
+ const ectx = ctx.ctx.getOrThrow("cliCtx");
33
+ if (ectx.vibesDiyApiFactory === undefined) {
34
+ return Result.Err("Not logged in. Run 'vibes-diy login' first.");
35
+ }
36
+ const api = ectx.vibesDiyApiFactory(ctx.validated.apiUrl);
37
+ const rUser = await resolveUserSlug(api, ctx.validated.userSlug);
38
+ if (rUser.isErr())
39
+ return Result.Err(rUser.Err());
40
+ const r = await api.listDbNames({ appSlug: ctx.validated.appSlug, userSlug: rUser.Ok() });
41
+ if (r.isErr())
42
+ return Result.Err(r.Err());
43
+ return sendMsg(ctx, {
44
+ type: "vibes-diy.cli.db.list-res",
45
+ dbNames: r.Ok().dbNames,
46
+ });
47
+ },
48
+ };
49
+ export function dbListCmd(ctx) {
50
+ return command({
51
+ name: "list",
52
+ description: "List database names for an app",
53
+ args: {
54
+ ...cmdTsDefaultArgs(ctx),
55
+ ...dbCommonArgs(ctx),
56
+ },
57
+ handler: ctx.cliStream.enqueue((args) => ({
58
+ type: "vibes-diy.cli.db.list",
59
+ apiUrl: args.apiUrl,
60
+ appSlug: args.appSlug,
61
+ userSlug: args.userSlug,
62
+ })),
63
+ });
64
+ }
65
+ //# sourceMappingURL=list-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-cmd.js","sourceRoot":"","sources":["../../../../jsr/cli/cmds/db/list-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { EventoHandler } from "@adviser/cement";
2
+ import type { CliCtx } from "../../cli-ctx.js";
3
+ import { WrapCmdTSMsg } from "../../cmd-evento.js";
4
+ export declare const ReqDbPut: import("arktype/internal/variants/object.ts").ObjectType<{
5
+ type: "vibes-diy.cli.db.put";
6
+ apiUrl: string;
7
+ appSlug: string;
8
+ userSlug: string;
9
+ dbName: string;
10
+ docJson: string;
11
+ docId: string;
12
+ }, {}>;
13
+ export type ReqDbPut = typeof ReqDbPut.infer;
14
+ export declare function isReqDbPut(obj: unknown): obj is ReqDbPut;
15
+ export declare const ResDbPut: import("arktype/internal/variants/object.ts").ObjectType<{
16
+ type: "vibes-diy.cli.db.put-res";
17
+ id: string;
18
+ ok: true;
19
+ }, {}>;
20
+ export type ResDbPut = typeof ResDbPut.infer;
21
+ export declare function isResDbPut(obj: unknown): obj is ResDbPut;
22
+ export declare const dbPutEvento: EventoHandler<WrapCmdTSMsg<unknown>, ReqDbPut, ResDbPut>;
23
+ export declare function dbPutCmd(ctx: CliCtx): Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
24
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<{
25
+ appSlug: string;
26
+ userSlug: string;
27
+ dbName: string;
28
+ docJson: string;
29
+ docId: string;
30
+ apiUrl: string;
31
+ json: boolean;
32
+ text: boolean;
33
+ }>>;
34
+ } & import("cmd-ts/dist/cjs/helpdoc.js").PrintHelp & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & import("cmd-ts/dist/cjs/helpdoc.js").Named & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned> & import("cmd-ts/dist/cjs/argparser.js").Register & import("cmd-ts/dist/cjs/runner.js").Handling<{
35
+ appSlug: string;
36
+ userSlug: string;
37
+ dbName: string;
38
+ docJson: string;
39
+ docId: string;
40
+ apiUrl: string;
41
+ json: boolean;
42
+ text: boolean;
43
+ }, never> & {
44
+ run(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<never>>;
45
+ } & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned & import("cmd-ts/dist/cjs/helpdoc.js").Descriptive & import("cmd-ts/dist/cjs/helpdoc.js").Aliased>;
@@ -0,0 +1,99 @@
1
+ import { command, positional, option, string } from "cmd-ts";
2
+ import { readFileSync } from "node:fs";
3
+ import { type } from "arktype";
4
+ import { Result, Option, exception2Result } from "@adviser/cement";
5
+ import { FireflyApiAdapter } from "@vibes.diy/api-impl";
6
+ import { isResPutDoc } from "@vibes.diy/api-types";
7
+ import { cmdTsDefaultArgs } from "../../cli-ctx.js";
8
+ import { sendMsg } from "../../cmd-evento.js";
9
+ import { dbCommonArgs, resolveUserSlug } from "./shared.js";
10
+ export const ReqDbPut = type({
11
+ type: "'vibes-diy.cli.db.put'",
12
+ apiUrl: "string",
13
+ appSlug: "string",
14
+ userSlug: "string",
15
+ dbName: "string",
16
+ docJson: "string",
17
+ docId: "string",
18
+ });
19
+ export function isReqDbPut(obj) {
20
+ return !(ReqDbPut(obj) instanceof type.errors);
21
+ }
22
+ export const ResDbPut = type({
23
+ type: "'vibes-diy.cli.db.put-res'",
24
+ id: "string",
25
+ ok: "true",
26
+ });
27
+ export function isResDbPut(obj) {
28
+ return !(ResDbPut(obj) instanceof type.errors);
29
+ }
30
+ export const dbPutEvento = {
31
+ hash: "vibes-diy.cli.db.put",
32
+ validate: (ctx) => {
33
+ if (isReqDbPut(ctx.enRequest)) {
34
+ return Promise.resolve(Result.Ok(Option.Some(ctx.enRequest)));
35
+ }
36
+ return Promise.resolve(Result.Ok(Option.None()));
37
+ },
38
+ handle: async (ctx) => {
39
+ const ectx = ctx.ctx.getOrThrow("cliCtx");
40
+ if (ectx.vibesDiyApiFactory === undefined) {
41
+ return Result.Err("Not logged in. Run 'vibes-diy login' first.");
42
+ }
43
+ const rawJson = ctx.validated.docJson === "-" ? readFileSync(0, "utf8") : ctx.validated.docJson;
44
+ const rParsed = await exception2Result(() => JSON.parse(rawJson));
45
+ if (rParsed.isErr())
46
+ return Result.Err(`Invalid JSON: ${rParsed.Err()}`);
47
+ const doc = rParsed.Ok();
48
+ const api = ectx.vibesDiyApiFactory(ctx.validated.apiUrl);
49
+ const rUser = await resolveUserSlug(api, ctx.validated.userSlug);
50
+ if (rUser.isErr())
51
+ return Result.Err(rUser.Err());
52
+ const adapter = new FireflyApiAdapter(api, ctx.validated.appSlug, { userSlug: rUser.Ok() });
53
+ const docId = ctx.validated.docId === "" ? undefined : ctx.validated.docId;
54
+ const r = await adapter.putDoc(doc, docId, ctx.validated.dbName);
55
+ if (r.isErr())
56
+ return Result.Err(r.Err());
57
+ const res = r.Ok();
58
+ if (!isResPutDoc(res)) {
59
+ return Result.Err(`Unexpected response: ${JSON.stringify(res)}`);
60
+ }
61
+ return sendMsg(ctx, {
62
+ type: "vibes-diy.cli.db.put-res",
63
+ id: res.id,
64
+ ok: true,
65
+ });
66
+ },
67
+ };
68
+ export function dbPutCmd(ctx) {
69
+ return command({
70
+ name: "put",
71
+ description: "Put (create or update) a document. Pass JSON on argv or '-' to read from stdin.",
72
+ args: {
73
+ ...cmdTsDefaultArgs(ctx),
74
+ ...dbCommonArgs(ctx),
75
+ docJson: positional({
76
+ type: string,
77
+ displayName: "json",
78
+ description: "JSON document to store, or '-' to read from stdin",
79
+ }),
80
+ docId: option({
81
+ long: "id",
82
+ description: "Document ID (_id); generated if omitted",
83
+ type: string,
84
+ defaultValue: () => "",
85
+ defaultValueIsSerializable: true,
86
+ }),
87
+ },
88
+ handler: ctx.cliStream.enqueue((args) => ({
89
+ type: "vibes-diy.cli.db.put",
90
+ apiUrl: args.apiUrl,
91
+ appSlug: args.appSlug,
92
+ userSlug: args.userSlug,
93
+ dbName: args.dbName,
94
+ docJson: args.docJson,
95
+ docId: args.docId,
96
+ })),
97
+ });
98
+ }
99
+ //# sourceMappingURL=put-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"put-cmd.js","sourceRoot":"","sources":["../../../../jsr/cli/cmds/db/put-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { EventoHandler } from "@adviser/cement";
2
+ import type { CliCtx } from "../../cli-ctx.js";
3
+ import { WrapCmdTSMsg } from "../../cmd-evento.js";
4
+ export declare const ReqDbQuery: import("arktype/internal/variants/object.ts").ObjectType<{
5
+ type: "vibes-diy.cli.db.query";
6
+ apiUrl: string;
7
+ appSlug: string;
8
+ userSlug: string;
9
+ dbName: string;
10
+ field: string;
11
+ key: string;
12
+ prefix: string;
13
+ range: string;
14
+ limit: number;
15
+ descending: boolean;
16
+ }, {}>;
17
+ export type ReqDbQuery = typeof ReqDbQuery.infer;
18
+ export declare function isReqDbQuery(obj: unknown): obj is ReqDbQuery;
19
+ export declare const ResDbQuery: import("arktype/internal/variants/object.ts").ObjectType<{
20
+ type: "vibes-diy.cli.db.query-res";
21
+ docs: {
22
+ [x: string]: unknown;
23
+ }[];
24
+ }, {}>;
25
+ export type ResDbQuery = typeof ResDbQuery.infer;
26
+ export declare function isResDbQuery(obj: unknown): obj is ResDbQuery;
27
+ export declare const dbQueryEvento: EventoHandler<WrapCmdTSMsg<unknown>, ReqDbQuery, ResDbQuery>;
28
+ export declare function dbQueryCmd(ctx: CliCtx): Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
29
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<{
30
+ appSlug: string;
31
+ userSlug: string;
32
+ dbName: string;
33
+ field: string;
34
+ key: string;
35
+ prefix: string;
36
+ range: string;
37
+ limit: number;
38
+ descending: boolean;
39
+ apiUrl: string;
40
+ json: boolean;
41
+ text: boolean;
42
+ }>>;
43
+ } & import("cmd-ts/dist/cjs/helpdoc.js").PrintHelp & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & import("cmd-ts/dist/cjs/helpdoc.js").Named & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned> & import("cmd-ts/dist/cjs/argparser.js").Register & import("cmd-ts/dist/cjs/runner.js").Handling<{
44
+ appSlug: string;
45
+ userSlug: string;
46
+ dbName: string;
47
+ field: string;
48
+ key: string;
49
+ prefix: string;
50
+ range: string;
51
+ limit: number;
52
+ descending: boolean;
53
+ apiUrl: string;
54
+ json: boolean;
55
+ text: boolean;
56
+ }, never> & {
57
+ run(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<never>>;
58
+ } & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned & import("cmd-ts/dist/cjs/helpdoc.js").Descriptive & import("cmd-ts/dist/cjs/helpdoc.js").Aliased>;
@@ -0,0 +1,166 @@
1
+ import { command, flag, option, positional, string, number } from "cmd-ts";
2
+ import { type } from "arktype";
3
+ import { Result, Option, exception2Result } from "@adviser/cement";
4
+ import { FireflyApiAdapter } from "@vibes.diy/api-impl";
5
+ import { isResQueryDocs } from "@vibes.diy/api-types";
6
+ import charwise from "charwise";
7
+ import { cmdTsDefaultArgs } from "../../cli-ctx.js";
8
+ import { sendMsg } from "../../cmd-evento.js";
9
+ import { dbCommonArgs, resolveUserSlug } from "./shared.js";
10
+ export const ReqDbQuery = type({
11
+ type: "'vibes-diy.cli.db.query'",
12
+ apiUrl: "string",
13
+ appSlug: "string",
14
+ userSlug: "string",
15
+ dbName: "string",
16
+ field: "string",
17
+ key: "string",
18
+ prefix: "string",
19
+ range: "string",
20
+ limit: "number",
21
+ descending: "boolean",
22
+ });
23
+ export function isReqDbQuery(obj) {
24
+ return !(ReqDbQuery(obj) instanceof type.errors);
25
+ }
26
+ export const ResDbQuery = type({
27
+ type: "'vibes-diy.cli.db.query-res'",
28
+ docs: type({ "[string]": "unknown" }).array(),
29
+ });
30
+ export function isResDbQuery(obj) {
31
+ return !(ResDbQuery(obj) instanceof type.errors);
32
+ }
33
+ export const dbQueryEvento = {
34
+ hash: "vibes-diy.cli.db.query",
35
+ validate: (ctx) => {
36
+ if (isReqDbQuery(ctx.enRequest)) {
37
+ return Promise.resolve(Result.Ok(Option.Some(ctx.enRequest)));
38
+ }
39
+ return Promise.resolve(Result.Ok(Option.None()));
40
+ },
41
+ handle: async (ctx) => {
42
+ const ectx = ctx.ctx.getOrThrow("cliCtx");
43
+ if (ectx.vibesDiyApiFactory === undefined) {
44
+ return Result.Err("Not logged in. Run 'vibes-diy login' first.");
45
+ }
46
+ const api = ectx.vibesDiyApiFactory(ctx.validated.apiUrl);
47
+ const rUser = await resolveUserSlug(api, ctx.validated.userSlug);
48
+ if (rUser.isErr())
49
+ return Result.Err(rUser.Err());
50
+ const adapter = new FireflyApiAdapter(api, ctx.validated.appSlug, { userSlug: rUser.Ok() });
51
+ const r = await adapter.queryDocs(ctx.validated.dbName);
52
+ if (r.isErr())
53
+ return Result.Err(r.Err());
54
+ const res = r.Ok();
55
+ if (!isResQueryDocs(res)) {
56
+ return Result.Err(`Unexpected response: ${JSON.stringify(res)}`);
57
+ }
58
+ const field = ctx.validated.field;
59
+ let rows = res.docs
60
+ .filter((doc) => doc[field] !== undefined)
61
+ .map((doc) => ({
62
+ doc,
63
+ encodedKey: charwise.encode(doc[field]),
64
+ }));
65
+ if (ctx.validated.key !== "") {
66
+ const rKey = await exception2Result(() => JSON.parse(ctx.validated.key));
67
+ if (rKey.isErr())
68
+ return Result.Err(`Invalid --key JSON: ${rKey.Err()}`);
69
+ const encodedKey = charwise.encode(rKey.Ok());
70
+ rows = rows.filter((r) => r.encodedKey === encodedKey);
71
+ }
72
+ if (ctx.validated.prefix !== "") {
73
+ const rPrefix = await exception2Result(() => JSON.parse(ctx.validated.prefix));
74
+ if (rPrefix.isErr())
75
+ return Result.Err(`Invalid --prefix JSON: ${rPrefix.Err()}`);
76
+ const prefixVal = rPrefix.Ok();
77
+ let encodedPrefix = charwise.encode(prefixVal);
78
+ if (Array.isArray(prefixVal) && encodedPrefix.endsWith("!")) {
79
+ encodedPrefix = encodedPrefix.slice(0, -1);
80
+ }
81
+ rows = rows.filter((r) => r.encodedKey.startsWith(encodedPrefix));
82
+ }
83
+ if (ctx.validated.range !== "") {
84
+ const rRange = await exception2Result(() => JSON.parse(ctx.validated.range));
85
+ if (rRange.isErr())
86
+ return Result.Err(`Invalid --range JSON: ${rRange.Err()}`);
87
+ const [rangeStart, rangeEnd] = rRange.Ok();
88
+ const encodedStart = charwise.encode(rangeStart);
89
+ const encodedEnd = charwise.encode(rangeEnd);
90
+ rows = rows.filter((r) => r.encodedKey >= encodedStart && r.encodedKey <= encodedEnd);
91
+ }
92
+ rows.sort((a, b) => (a.encodedKey < b.encodedKey ? -1 : a.encodedKey > b.encodedKey ? 1 : 0));
93
+ if (ctx.validated.descending) {
94
+ rows.reverse();
95
+ }
96
+ if (ctx.validated.limit > 0) {
97
+ rows = rows.slice(0, ctx.validated.limit);
98
+ }
99
+ const docs = rows.map((r) => r.doc);
100
+ return sendMsg(ctx, {
101
+ type: "vibes-diy.cli.db.query-res",
102
+ docs,
103
+ });
104
+ },
105
+ };
106
+ export function dbQueryCmd(ctx) {
107
+ return command({
108
+ name: "query",
109
+ description: "Query documents by field value with optional key/prefix/range/limit filters",
110
+ args: {
111
+ ...cmdTsDefaultArgs(ctx),
112
+ ...dbCommonArgs(ctx),
113
+ field: positional({
114
+ type: string,
115
+ displayName: "field",
116
+ description: "Field name to index on",
117
+ }),
118
+ key: option({
119
+ long: "key",
120
+ description: "Exact key match (JSON value)",
121
+ type: string,
122
+ defaultValue: () => "",
123
+ defaultValueIsSerializable: true,
124
+ }),
125
+ prefix: option({
126
+ long: "prefix",
127
+ description: "Prefix match (JSON value)",
128
+ type: string,
129
+ defaultValue: () => "",
130
+ defaultValueIsSerializable: true,
131
+ }),
132
+ range: option({
133
+ long: "range",
134
+ description: "Range filter as JSON two-element array [start, end]",
135
+ type: string,
136
+ defaultValue: () => "",
137
+ defaultValueIsSerializable: true,
138
+ }),
139
+ limit: option({
140
+ long: "limit",
141
+ description: "Maximum number of results (0 = no limit)",
142
+ type: number,
143
+ defaultValue: () => 0,
144
+ defaultValueIsSerializable: true,
145
+ }),
146
+ descending: flag({
147
+ long: "descending",
148
+ description: "Return results in descending order",
149
+ }),
150
+ },
151
+ handler: ctx.cliStream.enqueue((args) => ({
152
+ type: "vibes-diy.cli.db.query",
153
+ apiUrl: args.apiUrl,
154
+ appSlug: args.appSlug,
155
+ userSlug: args.userSlug,
156
+ dbName: args.dbName,
157
+ field: args.field,
158
+ key: args.key,
159
+ prefix: args.prefix,
160
+ range: args.range,
161
+ limit: args.limit,
162
+ descending: args.descending,
163
+ })),
164
+ });
165
+ }
166
+ //# sourceMappingURL=query-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-cmd.js","sourceRoot":"","sources":["../../../../jsr/cli/cmds/db/query-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CliCtx } from "../../cli-ctx.js";
2
+ import type { VibesDiyApi } from "@vibes.diy/api-impl";
3
+ import { Result } from "@adviser/cement";
4
+ export declare function dbCommonArgs(ctx: CliCtx): {
5
+ appSlug: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
6
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<string>>;
7
+ } & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
8
+ userSlug: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
9
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<string>>;
10
+ } & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
11
+ dbName: Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
12
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<string>>;
13
+ } & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Descriptive>;
14
+ };
15
+ export declare function resolveUserSlug(api: VibesDiyApi, explicit: string): Promise<Result<string>>;
@@ -0,0 +1,42 @@
1
+ import { option, string } from "cmd-ts";
2
+ import { basename } from "node:path";
3
+ import { Result } from "@adviser/cement";
4
+ import { isUserSettingDefaultUserSlug } from "@vibes.diy/api-types";
5
+ export function dbCommonArgs(ctx) {
6
+ return {
7
+ appSlug: option({
8
+ long: "app-slug",
9
+ description: "App slug; defaults to env VIBES_APP_SLUG or basename(cwd)",
10
+ type: string,
11
+ defaultValue: () => ctx.sthis.env.get("VIBES_APP_SLUG") ?? basename(process.cwd()),
12
+ defaultValueIsSerializable: true,
13
+ }),
14
+ userSlug: option({
15
+ long: "user-slug",
16
+ description: "User slug; defaults to defaultUserSlug from user settings",
17
+ type: string,
18
+ defaultValue: () => "",
19
+ defaultValueIsSerializable: true,
20
+ }),
21
+ dbName: option({
22
+ long: "db",
23
+ description: "Database name",
24
+ type: string,
25
+ defaultValue: () => "default",
26
+ defaultValueIsSerializable: true,
27
+ }),
28
+ };
29
+ }
30
+ export async function resolveUserSlug(api, explicit) {
31
+ if (explicit !== "")
32
+ return Result.Ok(explicit);
33
+ const r = await api.ensureUserSettings({ settings: [] });
34
+ if (r.isErr())
35
+ return Result.Err(r.Err());
36
+ const def = r.Ok().settings.find(isUserSettingDefaultUserSlug);
37
+ if (def === undefined) {
38
+ return Result.Err("No defaultUserSlug — pass --user-slug or run 'vibes-diy login' first");
39
+ }
40
+ return Result.Ok(def.userSlug);
41
+ }
42
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../jsr/cli/cmds/db/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO;QACL,OAAO,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,2DAA2D;YACxE,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAClF,0BAA0B,EAAE,IAAI;SACjC,CAAC;QACF,QAAQ,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,2DAA2D;YACxE,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE;YACtB,0BAA0B,EAAE,IAAI;SACjC,CAAC;QACF,MAAM,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,eAAe;YAC5B,IAAI,EAAE,MAAM;YACZ,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;YAC7B,0BAA0B,EAAE,IAAI;SACjC,CAAC;KACH,CAAC;AACJ,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAgB,EAAE,QAAgB;IACtE,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC/D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { EventoHandler } from "@adviser/cement";
2
+ import type { CliCtx } from "../../cli-ctx.js";
3
+ import { WrapCmdTSMsg } from "../../cmd-evento.js";
4
+ export declare const ReqDbSubscribe: import("arktype/internal/variants/object.ts").ObjectType<{
5
+ type: "vibes-diy.cli.db.subscribe";
6
+ apiUrl: string;
7
+ appSlug: string;
8
+ userSlug: string;
9
+ dbName: string;
10
+ }, {}>;
11
+ export type ReqDbSubscribe = typeof ReqDbSubscribe.infer;
12
+ export declare function isReqDbSubscribe(obj: unknown): obj is ReqDbSubscribe;
13
+ export declare const dbSubscribeEvento: EventoHandler<WrapCmdTSMsg<unknown>, ReqDbSubscribe, never>;
14
+ export declare function dbSubscribeCmd(ctx: CliCtx): Partial<import("cmd-ts/dist/cjs/argparser.js").Register> & {
15
+ parse(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<{
16
+ appSlug: string;
17
+ userSlug: string;
18
+ dbName: string;
19
+ apiUrl: string;
20
+ json: boolean;
21
+ text: boolean;
22
+ }>>;
23
+ } & import("cmd-ts/dist/cjs/helpdoc.js").PrintHelp & import("cmd-ts/dist/cjs/helpdoc.js").ProvidesHelp & import("cmd-ts/dist/cjs/helpdoc.js").Named & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned> & import("cmd-ts/dist/cjs/argparser.js").Register & import("cmd-ts/dist/cjs/runner.js").Handling<{
24
+ appSlug: string;
25
+ userSlug: string;
26
+ dbName: string;
27
+ apiUrl: string;
28
+ json: boolean;
29
+ text: boolean;
30
+ }, never> & {
31
+ run(context: import("cmd-ts/dist/cjs/argparser.js").ParseContext): Promise<import("cmd-ts/dist/cjs/argparser.js").ParsingResult<never>>;
32
+ } & Partial<import("cmd-ts/dist/cjs/helpdoc.js").Versioned & import("cmd-ts/dist/cjs/helpdoc.js").Descriptive & import("cmd-ts/dist/cjs/helpdoc.js").Aliased>;
@@ -0,0 +1,67 @@
1
+ import { command } from "cmd-ts";
2
+ import { type } from "arktype";
3
+ import { Result, Option, EventoResult } from "@adviser/cement";
4
+ import { FireflyApiAdapter } from "@vibes.diy/api-impl";
5
+ import { cmdTsDefaultArgs } from "../../cli-ctx.js";
6
+ import { sendProgress } from "../../cmd-evento.js";
7
+ import { dbCommonArgs, resolveUserSlug } from "./shared.js";
8
+ export const ReqDbSubscribe = type({
9
+ type: "'vibes-diy.cli.db.subscribe'",
10
+ apiUrl: "string",
11
+ appSlug: "string",
12
+ userSlug: "string",
13
+ dbName: "string",
14
+ });
15
+ export function isReqDbSubscribe(obj) {
16
+ return !(ReqDbSubscribe(obj) instanceof type.errors);
17
+ }
18
+ export const dbSubscribeEvento = {
19
+ hash: "vibes-diy.cli.db.subscribe",
20
+ validate: (ctx) => {
21
+ if (isReqDbSubscribe(ctx.enRequest)) {
22
+ return Promise.resolve(Result.Ok(Option.Some(ctx.enRequest)));
23
+ }
24
+ return Promise.resolve(Result.Ok(Option.None()));
25
+ },
26
+ handle: async (ctx) => {
27
+ const ectx = ctx.ctx.getOrThrow("cliCtx");
28
+ if (ectx.vibesDiyApiFactory === undefined) {
29
+ return Result.Err("Not logged in. Run 'vibes-diy login' first.");
30
+ }
31
+ const api = ectx.vibesDiyApiFactory(ctx.validated.apiUrl);
32
+ const rUser = await resolveUserSlug(api, ctx.validated.userSlug);
33
+ if (rUser.isErr())
34
+ return Result.Err(rUser.Err());
35
+ const adapter = new FireflyApiAdapter(api, ctx.validated.appSlug, { userSlug: rUser.Ok() });
36
+ const rSub = await adapter.subscribeDocs(ctx.validated.dbName);
37
+ if (rSub.isErr()) {
38
+ return Result.Err(`Subscribe failed on initial connect: ${rSub.Err()}. Check your network connection and retry.`);
39
+ }
40
+ await sendProgress(ctx, "info", `Subscribed to ${ctx.validated.appSlug}/${ctx.validated.dbName} — waiting for events (Ctrl+C to exit)`);
41
+ adapter.onMsg((event) => {
42
+ sendProgress(ctx, "info", JSON.stringify(event.data)).catch(() => {
43
+ });
44
+ });
45
+ await new Promise(() => {
46
+ });
47
+ return Result.Ok(EventoResult.Continue);
48
+ },
49
+ };
50
+ export function dbSubscribeCmd(ctx) {
51
+ return command({
52
+ name: "subscribe",
53
+ description: "Tail real-time doc-changed events for a database (Ctrl+C to exit). Reconnects mid-stream; events that fire during the gap are not backfilled.",
54
+ args: {
55
+ ...cmdTsDefaultArgs(ctx),
56
+ ...dbCommonArgs(ctx),
57
+ },
58
+ handler: ctx.cliStream.enqueue((args) => ({
59
+ type: "vibes-diy.cli.db.subscribe",
60
+ apiUrl: args.apiUrl,
61
+ appSlug: args.appSlug,
62
+ userSlug: args.userSlug,
63
+ dbName: args.dbName,
64
+ })),
65
+ });
66
+ }
67
+ //# sourceMappingURL=subscribe-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe-cmd.js","sourceRoot":"","sources":["../../../../jsr/cli/cmds/db/subscribe-cmd.ts"],"names":[],"mappings":"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"}