vibes-diy 14.1.2 → 14.1.4

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.
@@ -16,78 +16,73 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
16
16
  type: "core-cli.res-device-id-register";
17
17
  output: string;
18
18
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
19
- type: "vibes-diy.cli.skills";
19
+ type: "use-vibes.cli.themes";
20
20
  }, {
21
- type: "vibes-diy.cli.res-skills-list";
22
- skills: {
21
+ type: "use-vibes.cli.res-themes-list";
22
+ themes: {
23
+ slug: string;
23
24
  name: string;
24
- description: string;
25
25
  }[];
26
26
  } | {
27
- type: "vibes-diy.cli.res-skill-content";
28
- name: string;
27
+ type: "use-vibes.cli.res-theme-content";
28
+ slug: string;
29
29
  content: string;
30
30
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
31
- type: "vibes-diy.cli.db.list";
32
- apiUrl: string;
31
+ type: "vibes-diy.cli.put-asset";
32
+ file: string;
33
33
  appSlug: string;
34
34
  ownerHandle: string;
35
- admin: boolean;
35
+ apiUrl: string;
36
+ mimeType: string;
37
+ verifyFetch: boolean;
36
38
  }, {
37
- type: "vibes-diy.cli.db.list-res";
38
- dbNames: string[];
39
+ type: "vibes-diy.cli.res-put-asset";
40
+ cid: string;
41
+ getURL: string;
42
+ size: number;
43
+ uploadId: string;
44
+ verified?: boolean | undefined;
39
45
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
40
- type: "vibes-diy.cli.db.query";
46
+ type: "vibes-diy.cli.db.get";
41
47
  apiUrl: string;
42
48
  appSlug: string;
43
49
  ownerHandle: string;
44
50
  dbName: string;
45
- field: string;
46
- key: string;
47
- prefix: string;
48
- range: string;
49
- limit: number;
50
- descending: boolean;
51
+ docId: string;
51
52
  admin: boolean;
52
53
  actingHandle: string;
53
54
  }, {
54
- type: "vibes-diy.cli.db.query-res";
55
- docs: {
55
+ type: "vibes-diy.cli.db.get-res";
56
+ doc: {
56
57
  [x: string]: unknown;
57
- }[];
58
+ };
58
59
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
59
- type: "vibes-diy.cli.codegen-log";
60
+ type: "vibes-diy.cli.db.subscribe";
61
+ apiUrl: string;
62
+ appSlug: string;
63
+ ownerHandle: string;
64
+ dbName: string;
65
+ }, never> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
66
+ type: "vibes-diy.cli.app-chats";
60
67
  appSlug: string;
61
68
  ownerHandle: string;
62
69
  chatId?: string | undefined;
63
70
  apiUrl: string;
64
- response?: boolean | undefined;
65
- raw?: boolean | undefined;
66
- files?: boolean | undefined;
67
- jsonl?: boolean | undefined;
68
- user?: boolean | undefined;
69
- promptId?: string | undefined;
70
71
  }, {
71
- type: "vibes-diy.cli.res-codegen-log-response";
72
- output: string;
73
- } | {
74
- type: "vibes-diy.cli.res-codegen-log-list";
72
+ type: "vibes-diy.cli.res-app-chats-list";
75
73
  items: {
76
74
  chatId: string;
77
75
  appSlug: string;
78
76
  ownerHandle: string;
79
77
  created: string;
78
+ userHandle?: string | undefined;
80
79
  }[];
81
80
  } | {
82
- type: "vibes-diy.cli.res-codegen-log-detail";
81
+ type: "vibes-diy.cli.res-app-chats-detail";
83
82
  chatId: string;
84
- ownerHandle: string;
85
- appSlug: string;
86
- prompts: {
87
- prompt: string;
88
- fsId: string;
89
- created: string;
90
- }[];
83
+ ownerHandle?: string | undefined;
84
+ appSlug?: string | undefined;
85
+ output: string;
91
86
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
92
87
  type: "vibes-diy.cli.list";
93
88
  apiUrl: string;
@@ -337,6 +332,9 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
337
332
  type: "contactEmail";
338
333
  email: string;
339
334
  updatedAt: string;
335
+ } | {
336
+ type: "onboarding";
337
+ completedAt: string;
340
338
  } | {
341
339
  type: "geoCountry";
342
340
  country: string;
@@ -347,9 +345,6 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
347
345
  [x: string]: string;
348
346
  };
349
347
  updatedAt: string;
350
- } | {
351
- type: "onboarding";
352
- completedAt: string;
353
348
  } | {
354
349
  type: "defaultHandle";
355
350
  ownerHandle: string;
@@ -357,16 +352,16 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
357
352
  updated: string;
358
353
  created: string;
359
354
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
360
- type: "use-vibes.cli.themes";
355
+ type: "vibes-diy.cli.skills";
361
356
  }, {
362
- type: "use-vibes.cli.res-themes-list";
363
- themes: {
364
- slug: string;
357
+ type: "vibes-diy.cli.res-skills-list";
358
+ skills: {
365
359
  name: string;
360
+ description: string;
366
361
  }[];
367
362
  } | {
368
- type: "use-vibes.cli.res-theme-content";
369
- slug: string;
363
+ type: "vibes-diy.cli.res-skill-content";
364
+ name: string;
370
365
  content: string;
371
366
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
372
367
  type: "vibes-diy.cli.system";
@@ -442,25 +437,25 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
442
437
  type: "vibes.diy.res-error";
443
438
  error: {
444
439
  message: string;
445
- code: "from-not-owned";
440
+ code: "max-app-slugs-reached";
446
441
  };
447
442
  } | {
448
443
  type: "vibes.diy.res-error";
449
444
  error: {
450
445
  message: string;
451
- code: "from-carry-failed";
446
+ code: "handle-required";
452
447
  };
453
448
  } | {
454
449
  type: "vibes.diy.res-error";
455
450
  error: {
456
451
  message: string;
457
- code: "handle-required";
452
+ code: "from-not-owned";
458
453
  };
459
454
  } | {
460
455
  type: "vibes.diy.res-error";
461
456
  error: {
462
457
  message: string;
463
- code: "max-app-slugs-reached";
458
+ code: "from-carry-failed";
464
459
  };
465
460
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
466
461
  type: "vibes-diy.cli.remix";
@@ -489,21 +484,6 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
489
484
  ownerHandle?: string | undefined;
490
485
  defaultHandleSet?: boolean | undefined;
491
486
  suggestions: string[];
492
- }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
493
- type: "vibes-diy.cli.put-asset";
494
- file: string;
495
- appSlug: string;
496
- ownerHandle: string;
497
- apiUrl: string;
498
- mimeType: string;
499
- verifyFetch: boolean;
500
- }, {
501
- type: "vibes-diy.cli.res-put-asset";
502
- cid: string;
503
- getURL: string;
504
- size: number;
505
- uploadId: string;
506
- verified?: boolean | undefined;
507
487
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
508
488
  type: "vibes-diy.cli.generate";
509
489
  prompt: string;
@@ -513,8 +493,6 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
513
493
  noAccessFn?: boolean | undefined;
514
494
  verbose: boolean;
515
495
  apiUrl: string;
516
- dryRun: boolean;
517
- transcript: boolean;
518
496
  focusPath?: string | undefined;
519
497
  model?: string | undefined;
520
498
  apiKey?: string | undefined;
@@ -571,25 +549,25 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
571
549
  type: "vibes.diy.res-error";
572
550
  error: {
573
551
  message: string;
574
- code: "from-not-owned";
552
+ code: "max-app-slugs-reached";
575
553
  };
576
554
  } | {
577
555
  type: "vibes.diy.res-error";
578
556
  error: {
579
557
  message: string;
580
- code: "from-carry-failed";
558
+ code: "handle-required";
581
559
  };
582
560
  } | {
583
561
  type: "vibes.diy.res-error";
584
562
  error: {
585
563
  message: string;
586
- code: "handle-required";
564
+ code: "from-not-owned";
587
565
  };
588
566
  } | {
589
567
  type: "vibes.diy.res-error";
590
568
  error: {
591
569
  message: string;
592
- code: "max-app-slugs-reached";
570
+ code: "from-carry-failed";
593
571
  };
594
572
  } | {
595
573
  type: "vibes-diy.cli.res-generate";
@@ -597,27 +575,38 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
597
575
  ownerHandle: string;
598
576
  url: string;
599
577
  directory: string;
600
- dryRun?: boolean | undefined;
601
578
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
602
- type: "vibes-diy.cli.app-chats";
579
+ type: "vibes-diy.cli.codegen-log";
603
580
  appSlug: string;
604
581
  ownerHandle: string;
605
582
  chatId?: string | undefined;
606
583
  apiUrl: string;
584
+ response?: boolean | undefined;
585
+ raw?: boolean | undefined;
586
+ files?: boolean | undefined;
587
+ jsonl?: boolean | undefined;
588
+ user?: boolean | undefined;
589
+ promptId?: string | undefined;
607
590
  }, {
608
- type: "vibes-diy.cli.res-app-chats-list";
591
+ type: "vibes-diy.cli.res-codegen-log-list";
609
592
  items: {
610
593
  chatId: string;
611
594
  appSlug: string;
612
595
  ownerHandle: string;
613
596
  created: string;
614
- userHandle?: string | undefined;
615
597
  }[];
616
598
  } | {
617
- type: "vibes-diy.cli.res-app-chats-detail";
599
+ type: "vibes-diy.cli.res-codegen-log-detail";
618
600
  chatId: string;
619
- ownerHandle?: string | undefined;
620
- appSlug?: string | undefined;
601
+ ownerHandle: string;
602
+ appSlug: string;
603
+ prompts: {
604
+ prompt: string;
605
+ fsId: string;
606
+ created: string;
607
+ }[];
608
+ } | {
609
+ type: "vibes-diy.cli.res-codegen-log-response";
621
610
  output: string;
622
611
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
623
612
  type: "vibes-diy.cli.edit";
@@ -687,25 +676,25 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
687
676
  type: "vibes.diy.res-error";
688
677
  error: {
689
678
  message: string;
690
- code: "from-not-owned";
679
+ code: "max-app-slugs-reached";
691
680
  };
692
681
  } | {
693
682
  type: "vibes.diy.res-error";
694
683
  error: {
695
684
  message: string;
696
- code: "from-carry-failed";
685
+ code: "handle-required";
697
686
  };
698
687
  } | {
699
688
  type: "vibes.diy.res-error";
700
689
  error: {
701
690
  message: string;
702
- code: "handle-required";
691
+ code: "from-not-owned";
703
692
  };
704
693
  } | {
705
694
  type: "vibes.diy.res-error";
706
695
  error: {
707
696
  message: string;
708
- code: "max-app-slugs-reached";
697
+ code: "from-carry-failed";
709
698
  };
710
699
  } | {
711
700
  type: "vibes-diy.cli.res-edit";
@@ -827,19 +816,14 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
827
816
  userId: string;
828
817
  cleared: string[];
829
818
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
830
- type: "vibes-diy.cli.db.get";
819
+ type: "vibes-diy.cli.db.list";
831
820
  apiUrl: string;
832
821
  appSlug: string;
833
822
  ownerHandle: string;
834
- dbName: string;
835
- docId: string;
836
823
  admin: boolean;
837
- actingHandle: string;
838
824
  }, {
839
- type: "vibes-diy.cli.db.get-res";
840
- doc: {
841
- [x: string]: unknown;
842
- };
825
+ type: "vibes-diy.cli.db.list-res";
826
+ dbNames: string[];
843
827
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
844
828
  type: "vibes-diy.cli.db.put";
845
829
  apiUrl: string;
@@ -868,10 +852,23 @@ export declare function cliEventoHandlers(): (import("@adviser/cement").EventoHa
868
852
  id: string;
869
853
  ok: true;
870
854
  }> | import("@adviser/cement").EventoHandler<WrapCmdTSMsg<unknown>, {
871
- type: "vibes-diy.cli.db.subscribe";
855
+ type: "vibes-diy.cli.db.query";
872
856
  apiUrl: string;
873
857
  appSlug: string;
874
858
  ownerHandle: string;
875
859
  dbName: string;
876
- }, never>)[];
860
+ field: string;
861
+ key: string;
862
+ prefix: string;
863
+ range: string;
864
+ limit: number;
865
+ descending: boolean;
866
+ admin: boolean;
867
+ actingHandle: string;
868
+ }, {
869
+ type: "vibes-diy.cli.db.query-res";
870
+ docs: {
871
+ [x: string]: unknown;
872
+ }[];
873
+ }>)[];
877
874
  export declare function cmdTsEvento(): import("@adviser/cement").Evento;
@@ -0,0 +1,29 @@
1
+ import { Result } from "@adviser/cement";
2
+ import type { ResError, SectionEvent } from "@vibes.diy/api-types";
3
+ import { resolveSectionStream, type ResolveSectionStreamResult } from "./resolve-section-stream.js";
4
+ export declare const AGENT_TURN_CEILING_MS = 900000;
5
+ export interface FollowChatBuildChat {
6
+ readonly chatId: string;
7
+ readonly ownerHandle: string;
8
+ readonly appSlug: string;
9
+ readonly sectionStream: ReadableStream<unknown>;
10
+ }
11
+ export interface FollowChatBuildOpts {
12
+ readonly chat: FollowChatBuildChat;
13
+ readonly onSectionEvent?: (ev: SectionEvent) => void;
14
+ readonly onUpstreamError?: (err: ResError) => void;
15
+ readonly onProgress?: (msg: string) => void;
16
+ readonly onSnapshot?: Parameters<typeof resolveSectionStream>[0]["onSnapshot"];
17
+ readonly onError?: Parameters<typeof resolveSectionStream>[0]["onError"];
18
+ readonly deadlineMs?: number;
19
+ readonly startAfterPromptId?: string;
20
+ readonly now?: () => number;
21
+ }
22
+ export interface FollowChatBuildOk {
23
+ readonly ownerHandle: string;
24
+ readonly appSlug: string;
25
+ readonly claimed: boolean;
26
+ readonly buildPromptId: string;
27
+ readonly resolved: ResolveSectionStreamResult;
28
+ }
29
+ export declare function followChatBuild(opts: FollowChatBuildOpts): Promise<Result<FollowChatBuildOk>>;
@@ -0,0 +1,150 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { isEvtChatAppClaimed, isPromptBlockEnd, isPromptError, isPromptRaw, isPromptReq, isResError, isSectionEvent, } from "@vibes.diy/api-types";
3
+ import { resolveSectionStream } from "./resolve-section-stream.js";
4
+ export const AGENT_TURN_CEILING_MS = 900_000;
5
+ function agentAnswer(prose, errors) {
6
+ const said = prose.trim();
7
+ const why = errors.length > 0 ? ` (${errors.join("; ")})` : "";
8
+ if (said.length === 0)
9
+ return `The agent ended its turn without building anything${why}.`;
10
+ return `The agent answered instead of building${why}: ${said}`;
11
+ }
12
+ async function readBounded(reader, deadlineAt, now) {
13
+ const remaining = deadlineAt - now();
14
+ if (remaining <= 0)
15
+ return { kind: "deadline" };
16
+ let timer;
17
+ const expiry = new Promise((res) => {
18
+ timer = setTimeout(() => res("deadline"), remaining);
19
+ });
20
+ const raced = await Promise.race([reader.read(), expiry]);
21
+ if (timer !== undefined)
22
+ clearTimeout(timer);
23
+ if (raced === "deadline")
24
+ return { kind: "deadline" };
25
+ if (raced.done === true)
26
+ return { kind: "done" };
27
+ return { kind: "value", value: raced.value };
28
+ }
29
+ export async function followChatBuild(opts) {
30
+ const now = opts.now ?? (() => Date.now());
31
+ const deadlineAt = now() + (opts.deadlineMs ?? AGENT_TURN_CEILING_MS);
32
+ const reader = opts.chat.sectionStream.getReader();
33
+ let ownerHandle = opts.chat.ownerHandle;
34
+ let appSlug = opts.chat.appSlug;
35
+ let claimed = false;
36
+ let buildPromptId;
37
+ const buffered = [];
38
+ const agentProse = [];
39
+ const promptErrors = [];
40
+ const agentTurnsEnded = new Set();
41
+ const agentTurnsSeen = new Set();
42
+ let live = opts.startAfterPromptId === undefined;
43
+ let writer;
44
+ let resolving;
45
+ let resolverSettled = new Promise(() => undefined);
46
+ const startResolving = async (streamId) => {
47
+ const ts = new TransformStream();
48
+ writer = ts.writable.getWriter();
49
+ resolving = resolveSectionStream({
50
+ sectionStream: ts.readable,
51
+ streamId,
52
+ ...(opts.onSnapshot === undefined ? {} : { onSnapshot: opts.onSnapshot }),
53
+ ...(opts.onError === undefined ? {} : { onError: opts.onError }),
54
+ });
55
+ resolverSettled = resolving.then(() => ({ kind: "resolved" }));
56
+ for (const ev of buffered.splice(0))
57
+ await writer.write(ev);
58
+ };
59
+ const finish = async () => {
60
+ if (writer !== undefined)
61
+ await writer.close().catch(() => undefined);
62
+ if (buildPromptId === undefined || resolving === undefined) {
63
+ return Result.Err(agentAnswer(agentProse.join(""), promptErrors));
64
+ }
65
+ const r = await resolving;
66
+ if (r.isErr())
67
+ return Result.Err(r.Err());
68
+ return Result.Ok({ ownerHandle, appSlug, claimed, buildPromptId, resolved: r.Ok() });
69
+ };
70
+ for (;;) {
71
+ const read = await Promise.race([readBounded(reader, deadlineAt, now), resolverSettled]);
72
+ if (read.kind === "resolved") {
73
+ await reader.cancel().catch(() => undefined);
74
+ return finish();
75
+ }
76
+ if (read.kind !== "value") {
77
+ await reader.cancel().catch(() => undefined);
78
+ return finish();
79
+ }
80
+ const msg = read.value;
81
+ if (isEvtChatAppClaimed(msg)) {
82
+ if (msg.chatId === opts.chat.chatId) {
83
+ ownerHandle = msg.ownerHandle;
84
+ appSlug = msg.appSlug;
85
+ claimed = true;
86
+ opts.onProgress?.(`Building ${ownerHandle}/${appSlug}...`);
87
+ }
88
+ continue;
89
+ }
90
+ if (isResError(msg)) {
91
+ opts.onUpstreamError?.(msg);
92
+ continue;
93
+ }
94
+ if (!isSectionEvent(msg))
95
+ continue;
96
+ const ev = msg;
97
+ opts.onSectionEvent?.(ev);
98
+ for (const raw of ev.blocks) {
99
+ const block = raw;
100
+ if (!live) {
101
+ if (block.streamId === opts.startAfterPromptId)
102
+ live = true;
103
+ continue;
104
+ }
105
+ if (isPromptReq(block)) {
106
+ const req = block;
107
+ if (req.agentDispatched === true)
108
+ buildPromptId ??= req.streamId;
109
+ else
110
+ agentTurnsSeen.add(req.streamId);
111
+ continue;
112
+ }
113
+ if (buildPromptId === undefined && typeof block.type === "string") {
114
+ const t = block.type;
115
+ if (t.startsWith("block.code."))
116
+ buildPromptId ??= block.streamId;
117
+ }
118
+ if (isPromptRaw(block)) {
119
+ const rawMsg = block;
120
+ if (rawMsg.streamId !== buildPromptId)
121
+ agentProse.push(rawMsg.text);
122
+ continue;
123
+ }
124
+ if (isPromptError(block)) {
125
+ promptErrors.push(block.error);
126
+ continue;
127
+ }
128
+ if (isPromptBlockEnd(block)) {
129
+ const streamId = block.streamId;
130
+ if (streamId !== undefined && streamId !== buildPromptId)
131
+ agentTurnsEnded.add(streamId);
132
+ continue;
133
+ }
134
+ }
135
+ if (buildPromptId !== undefined && resolving === undefined) {
136
+ await startResolving(buildPromptId);
137
+ }
138
+ if (writer !== undefined)
139
+ await writer.write(ev);
140
+ else
141
+ buffered.push(ev);
142
+ if (resolving !== undefined)
143
+ continue;
144
+ if (agentTurnsSeen.size > 0 && agentTurnsEnded.size >= agentTurnsSeen.size) {
145
+ await reader.cancel().catch(() => undefined);
146
+ return finish();
147
+ }
148
+ }
149
+ }
150
+ //# sourceMappingURL=follow-chat-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-chat-build.js","sourceRoot":"","sources":["../../../jsr/cli/cmds/follow-chat-build.ts"],"names":[],"mappings":"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"}