@buoy-gg/ask-buoy 7.0.35 → 7.0.36
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.
- package/README.md +35 -8
- package/lib/commonjs/blocks/BlockRenderer.js +13 -1
- package/lib/commonjs/blocks/BlockRenderer.js.map +1 -1
- package/lib/commonjs/blocks/DataBlocks.js +126 -33
- package/lib/commonjs/blocks/DataBlocks.js.map +1 -1
- package/lib/commonjs/blocks/ExtraBlocks.js +12 -6
- package/lib/commonjs/blocks/ExtraBlocks.js.map +1 -1
- package/lib/commonjs/blocks/MediaBlocks.js +22 -6
- package/lib/commonjs/blocks/MediaBlocks.js.map +1 -1
- package/lib/commonjs/blocks/blockText.js +60 -0
- package/lib/commonjs/blocks/blockText.js.map +1 -0
- package/lib/commonjs/blocks/blockText.test.js +53 -0
- package/lib/commonjs/blocks/blockText.test.js.map +1 -0
- package/lib/commonjs/blocks/primitives.js +58 -2
- package/lib/commonjs/blocks/primitives.js.map +1 -1
- package/lib/commonjs/components/ApprovalCard.js +111 -7
- package/lib/commonjs/components/ApprovalCard.js.map +1 -1
- package/lib/commonjs/components/AskBuoyHeader.js +36 -4
- package/lib/commonjs/components/AskBuoyHeader.js.map +1 -1
- package/lib/commonjs/components/AskBuoyModal.js +160 -34
- package/lib/commonjs/components/AskBuoyModal.js.map +1 -1
- package/lib/commonjs/components/AskBuoySettings.js +50 -0
- package/lib/commonjs/components/AskBuoySettings.js.map +1 -1
- package/lib/commonjs/components/Composer.js +94 -14
- package/lib/commonjs/components/Composer.js.map +1 -1
- package/lib/commonjs/components/EmptyState.js +12 -5
- package/lib/commonjs/components/EmptyState.js.map +1 -1
- package/lib/commonjs/components/KeyboardPad.js +80 -0
- package/lib/commonjs/components/KeyboardPad.js.map +1 -0
- package/lib/commonjs/components/Markdown.js +148 -90
- package/lib/commonjs/components/Markdown.js.map +1 -1
- package/lib/commonjs/components/MessageList.js +339 -92
- package/lib/commonjs/components/MessageList.js.map +1 -1
- package/lib/commonjs/components/QueuedMessages.js +145 -0
- package/lib/commonjs/components/QueuedMessages.js.map +1 -0
- package/lib/commonjs/components/markdownParse.js +131 -0
- package/lib/commonjs/components/markdownParse.js.map +1 -0
- package/lib/commonjs/components/markdownParse.test.js +99 -0
- package/lib/commonjs/components/markdownParse.test.js.map +1 -0
- package/lib/commonjs/store/activityGroups.js +110 -0
- package/lib/commonjs/store/activityGroups.js.map +1 -0
- package/lib/commonjs/store/activityGroups.test.js +78 -0
- package/lib/commonjs/store/activityGroups.test.js.map +1 -0
- package/lib/commonjs/store/askBuoySettings.js +7 -2
- package/lib/commonjs/store/askBuoySettings.js.map +1 -1
- package/lib/commonjs/store/askBuoyStore.js +192 -10
- package/lib/commonjs/store/askBuoyStore.js.map +1 -1
- package/lib/commonjs/store/blockPlacement.js +64 -0
- package/lib/commonjs/store/blockPlacement.js.map +1 -0
- package/lib/commonjs/store/blockPlacement.test.js +123 -0
- package/lib/commonjs/store/blockPlacement.test.js.map +1 -0
- package/lib/commonjs/store/queue.test.js +150 -0
- package/lib/commonjs/store/queue.test.js.map +1 -0
- package/lib/commonjs/store/resetConversation.js +77 -0
- package/lib/commonjs/store/resetConversation.js.map +1 -0
- package/lib/commonjs/store/restorePending.test.js +63 -0
- package/lib/commonjs/store/restorePending.test.js.map +1 -0
- package/lib/commonjs/store/suggestions.js +54 -0
- package/lib/commonjs/store/suggestions.js.map +1 -0
- package/lib/commonjs/store/suggestions.test.js +58 -0
- package/lib/commonjs/store/suggestions.test.js.map +1 -0
- package/lib/commonjs/store/systemLine.test.js +77 -0
- package/lib/commonjs/store/systemLine.test.js.map +1 -0
- package/lib/commonjs/store/ticketPrompt.js +17 -0
- package/lib/commonjs/store/ticketPrompt.js.map +1 -0
- package/lib/commonjs/store/transcriptPersistence.js +92 -3
- package/lib/commonjs/store/transcriptPersistence.js.map +1 -1
- package/lib/commonjs/store/transcriptPersistence.test.js +148 -0
- package/lib/commonjs/store/transcriptPersistence.test.js.map +1 -1
- package/lib/commonjs/store/turnRendering.test.js +151 -0
- package/lib/commonjs/store/turnRendering.test.js.map +1 -0
- package/lib/commonjs/store/useAskBuoy.js +271 -49
- package/lib/commonjs/store/useAskBuoy.js.map +1 -1
- package/lib/commonjs/sync/askBuoySyncAdapter.js +25 -4
- package/lib/commonjs/sync/askBuoySyncAdapter.js.map +1 -1
- package/lib/module/blocks/BlockRenderer.js +13 -1
- package/lib/module/blocks/BlockRenderer.js.map +1 -1
- package/lib/module/blocks/DataBlocks.js +128 -35
- package/lib/module/blocks/DataBlocks.js.map +1 -1
- package/lib/module/blocks/ExtraBlocks.js +12 -6
- package/lib/module/blocks/ExtraBlocks.js.map +1 -1
- package/lib/module/blocks/MediaBlocks.js +22 -6
- package/lib/module/blocks/MediaBlocks.js.map +1 -1
- package/lib/module/blocks/blockText.js +55 -0
- package/lib/module/blocks/blockText.js.map +1 -0
- package/lib/module/blocks/blockText.test.js +53 -0
- package/lib/module/blocks/blockText.test.js.map +1 -0
- package/lib/module/blocks/primitives.js +58 -2
- package/lib/module/blocks/primitives.js.map +1 -1
- package/lib/module/components/ApprovalCard.js +113 -9
- package/lib/module/components/ApprovalCard.js.map +1 -1
- package/lib/module/components/AskBuoyHeader.js +37 -5
- package/lib/module/components/AskBuoyHeader.js.map +1 -1
- package/lib/module/components/AskBuoyModal.js +163 -37
- package/lib/module/components/AskBuoyModal.js.map +1 -1
- package/lib/module/components/AskBuoySettings.js +52 -2
- package/lib/module/components/AskBuoySettings.js.map +1 -1
- package/lib/module/components/Composer.js +95 -15
- package/lib/module/components/Composer.js.map +1 -1
- package/lib/module/components/EmptyState.js +12 -5
- package/lib/module/components/EmptyState.js.map +1 -1
- package/lib/module/components/KeyboardPad.js +75 -0
- package/lib/module/components/KeyboardPad.js.map +1 -0
- package/lib/module/components/Markdown.js +149 -90
- package/lib/module/components/Markdown.js.map +1 -1
- package/lib/module/components/MessageList.js +341 -94
- package/lib/module/components/MessageList.js.map +1 -1
- package/lib/module/components/QueuedMessages.js +140 -0
- package/lib/module/components/QueuedMessages.js.map +1 -0
- package/lib/module/components/markdownParse.js +125 -0
- package/lib/module/components/markdownParse.js.map +1 -0
- package/lib/module/components/markdownParse.test.js +98 -0
- package/lib/module/components/markdownParse.test.js.map +1 -0
- package/lib/module/store/activityGroups.js +103 -0
- package/lib/module/store/activityGroups.js.map +1 -0
- package/lib/module/store/activityGroups.test.js +77 -0
- package/lib/module/store/activityGroups.test.js.map +1 -0
- package/lib/module/store/askBuoySettings.js +7 -2
- package/lib/module/store/askBuoySettings.js.map +1 -1
- package/lib/module/store/askBuoyStore.js +190 -10
- package/lib/module/store/askBuoyStore.js.map +1 -1
- package/lib/module/store/blockPlacement.js +59 -0
- package/lib/module/store/blockPlacement.js.map +1 -0
- package/lib/module/store/blockPlacement.test.js +122 -0
- package/lib/module/store/blockPlacement.test.js.map +1 -0
- package/lib/module/store/queue.test.js +149 -0
- package/lib/module/store/queue.test.js.map +1 -0
- package/lib/module/store/resetConversation.js +72 -0
- package/lib/module/store/resetConversation.js.map +1 -0
- package/lib/module/store/restorePending.test.js +62 -0
- package/lib/module/store/restorePending.test.js.map +1 -0
- package/lib/module/store/suggestions.js +49 -0
- package/lib/module/store/suggestions.js.map +1 -0
- package/lib/module/store/suggestions.test.js +57 -0
- package/lib/module/store/suggestions.test.js.map +1 -0
- package/lib/module/store/systemLine.test.js +76 -0
- package/lib/module/store/systemLine.test.js.map +1 -0
- package/lib/module/store/ticketPrompt.js +13 -0
- package/lib/module/store/ticketPrompt.js.map +1 -0
- package/lib/module/store/transcriptPersistence.js +92 -3
- package/lib/module/store/transcriptPersistence.js.map +1 -1
- package/lib/module/store/transcriptPersistence.test.js +148 -0
- package/lib/module/store/transcriptPersistence.test.js.map +1 -1
- package/lib/module/store/turnRendering.test.js +150 -0
- package/lib/module/store/turnRendering.test.js.map +1 -0
- package/lib/module/store/useAskBuoy.js +275 -53
- package/lib/module/store/useAskBuoy.js.map +1 -1
- package/lib/module/sync/askBuoySyncAdapter.js +25 -4
- package/lib/module/sync/askBuoySyncAdapter.js.map +1 -1
- package/lib/typescript/blocks/BlockRenderer.d.ts.map +1 -1
- package/lib/typescript/blocks/DataBlocks.d.ts +11 -0
- package/lib/typescript/blocks/DataBlocks.d.ts.map +1 -1
- package/lib/typescript/blocks/ExtraBlocks.d.ts +18 -2
- package/lib/typescript/blocks/ExtraBlocks.d.ts.map +1 -1
- package/lib/typescript/blocks/MediaBlocks.d.ts.map +1 -1
- package/lib/typescript/blocks/blockText.d.ts +14 -0
- package/lib/typescript/blocks/blockText.d.ts.map +1 -0
- package/lib/typescript/blocks/blockText.test.d.ts +2 -0
- package/lib/typescript/blocks/blockText.test.d.ts.map +1 -0
- package/lib/typescript/blocks/primitives.d.ts +16 -1
- package/lib/typescript/blocks/primitives.d.ts.map +1 -1
- package/lib/typescript/components/ApprovalCard.d.ts.map +1 -1
- package/lib/typescript/components/AskBuoyHeader.d.ts +31 -1
- package/lib/typescript/components/AskBuoyHeader.d.ts.map +1 -1
- package/lib/typescript/components/AskBuoyModal.d.ts.map +1 -1
- package/lib/typescript/components/AskBuoySettings.d.ts.map +1 -1
- package/lib/typescript/components/Composer.d.ts +16 -1
- package/lib/typescript/components/Composer.d.ts.map +1 -1
- package/lib/typescript/components/EmptyState.d.ts +5 -1
- package/lib/typescript/components/EmptyState.d.ts.map +1 -1
- package/lib/typescript/components/KeyboardPad.d.ts +33 -0
- package/lib/typescript/components/KeyboardPad.d.ts.map +1 -0
- package/lib/typescript/components/Markdown.d.ts +0 -10
- package/lib/typescript/components/Markdown.d.ts.map +1 -1
- package/lib/typescript/components/MessageList.d.ts +7 -2
- package/lib/typescript/components/MessageList.d.ts.map +1 -1
- package/lib/typescript/components/QueuedMessages.d.ts +10 -0
- package/lib/typescript/components/QueuedMessages.d.ts.map +1 -0
- package/lib/typescript/components/markdownParse.d.ts +49 -0
- package/lib/typescript/components/markdownParse.d.ts.map +1 -0
- package/lib/typescript/components/markdownParse.test.d.ts +2 -0
- package/lib/typescript/components/markdownParse.test.d.ts.map +1 -0
- package/lib/typescript/store/activityGroups.d.ts +29 -0
- package/lib/typescript/store/activityGroups.d.ts.map +1 -0
- package/lib/typescript/store/activityGroups.test.d.ts +2 -0
- package/lib/typescript/store/activityGroups.test.d.ts.map +1 -0
- package/lib/typescript/store/askBuoySettings.d.ts +22 -0
- package/lib/typescript/store/askBuoySettings.d.ts.map +1 -1
- package/lib/typescript/store/askBuoyStore.d.ts +142 -5
- package/lib/typescript/store/askBuoyStore.d.ts.map +1 -1
- package/lib/typescript/store/blockPlacement.d.ts +30 -0
- package/lib/typescript/store/blockPlacement.d.ts.map +1 -0
- package/lib/typescript/store/blockPlacement.test.d.ts +2 -0
- package/lib/typescript/store/blockPlacement.test.d.ts.map +1 -0
- package/lib/typescript/store/queue.test.d.ts +2 -0
- package/lib/typescript/store/queue.test.d.ts.map +1 -0
- package/lib/typescript/store/resetConversation.d.ts +38 -0
- package/lib/typescript/store/resetConversation.d.ts.map +1 -0
- package/lib/typescript/store/restorePending.test.d.ts +2 -0
- package/lib/typescript/store/restorePending.test.d.ts.map +1 -0
- package/lib/typescript/store/suggestions.d.ts +32 -0
- package/lib/typescript/store/suggestions.d.ts.map +1 -0
- package/lib/typescript/store/suggestions.test.d.ts +2 -0
- package/lib/typescript/store/suggestions.test.d.ts.map +1 -0
- package/lib/typescript/store/systemLine.test.d.ts +2 -0
- package/lib/typescript/store/systemLine.test.d.ts.map +1 -0
- package/lib/typescript/store/ticketPrompt.d.ts +11 -0
- package/lib/typescript/store/ticketPrompt.d.ts.map +1 -0
- package/lib/typescript/store/transcriptPersistence.d.ts +41 -2
- package/lib/typescript/store/transcriptPersistence.d.ts.map +1 -1
- package/lib/typescript/store/turnRendering.test.d.ts +2 -0
- package/lib/typescript/store/turnRendering.test.d.ts.map +1 -0
- package/lib/typescript/store/useAskBuoy.d.ts +23 -1
- package/lib/typescript/store/useAskBuoy.d.ts.map +1 -1
- package/lib/typescript/sync/askBuoySyncAdapter.d.ts +26 -6
- package/lib/typescript/sync/askBuoySyncAdapter.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","placeBlocks","placed","b","forToolCallId","block","grid","id","kind","source","images","url","alt","afterText","nested","map","p","toEqual","size","toBe","read","pairs","get","write","changes","orphan","confirm","change","ask"],"sourceRoot":"../../../src","sources":["store/blockPlacement.test.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The queue is a list, and it knows when to hold.
|
|
5
|
+
*
|
|
6
|
+
* Both rules were written from a defect: the single slot this replaced
|
|
7
|
+
* OVERWROTE — type two things mid-turn and the first vanished — and its flush
|
|
8
|
+
* ran on `!busy` alone, so a parked message fired into a dead connection after
|
|
9
|
+
* an error and was sent as the answer to an open choice block.
|
|
10
|
+
*/
|
|
11
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
12
|
+
import { askBuoyStore, queuePauseReason, turnPhaseOf } from "./askBuoyStore";
|
|
13
|
+
beforeEach(() => askBuoyStore.reset());
|
|
14
|
+
const texts = () => askBuoyStore.getState().queued.map(q => q.text);
|
|
15
|
+
describe("queue", () => {
|
|
16
|
+
it("keeps every message, in the order typed", () => {
|
|
17
|
+
askBuoyStore.enqueue("then set points to 1500");
|
|
18
|
+
askBuoyStore.enqueue("and clear the cart after");
|
|
19
|
+
expect(texts()).toEqual(["then set points to 1500", "and clear the cart after"]);
|
|
20
|
+
});
|
|
21
|
+
it("gives identical requests distinct ids", () => {
|
|
22
|
+
const a = askBuoyStore.enqueue("again");
|
|
23
|
+
const b = askBuoyStore.enqueue("again");
|
|
24
|
+
expect(a.id).not.toBe(b.id);
|
|
25
|
+
askBuoyStore.removeQueued(a.id);
|
|
26
|
+
expect(texts()).toEqual(["again"]);
|
|
27
|
+
});
|
|
28
|
+
it("delivers from the front, one at a time", () => {
|
|
29
|
+
askBuoyStore.enqueue("one");
|
|
30
|
+
askBuoyStore.enqueue("two");
|
|
31
|
+
expect(askBuoyStore.shiftQueued()?.text).toBe("one");
|
|
32
|
+
expect(texts()).toEqual(["two"]);
|
|
33
|
+
expect(askBuoyStore.shiftQueued()?.text).toBe("two");
|
|
34
|
+
expect(askBuoyStore.shiftQueued()).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
it("comes back from disk as unsent rows", () => {
|
|
37
|
+
const ok = askBuoyStore.hydrate({
|
|
38
|
+
messages: [{
|
|
39
|
+
id: "m1",
|
|
40
|
+
role: "user",
|
|
41
|
+
text: "hi",
|
|
42
|
+
toolCalls: [],
|
|
43
|
+
blocks: []
|
|
44
|
+
}],
|
|
45
|
+
answers: {},
|
|
46
|
+
usage: {
|
|
47
|
+
input: 0,
|
|
48
|
+
output: 0,
|
|
49
|
+
requests: 0
|
|
50
|
+
},
|
|
51
|
+
queued: [{
|
|
52
|
+
id: "q1",
|
|
53
|
+
text: "still waiting"
|
|
54
|
+
}]
|
|
55
|
+
});
|
|
56
|
+
expect(ok).toBe(true);
|
|
57
|
+
expect(texts()).toEqual(["still waiting"]);
|
|
58
|
+
// Idle with nothing wrong — but hydrate itself never sends; the flush
|
|
59
|
+
// effect in the hook does, and only once the user is looking.
|
|
60
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("idle");
|
|
61
|
+
});
|
|
62
|
+
it("is emptied by a new conversation", () => {
|
|
63
|
+
askBuoyStore.enqueue("gone");
|
|
64
|
+
askBuoyStore.reset();
|
|
65
|
+
expect(texts()).toEqual([]);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("turnPhase", () => {
|
|
69
|
+
it("is idle with nothing going on", () => {
|
|
70
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("idle");
|
|
71
|
+
});
|
|
72
|
+
it("is running during a turn, and stopping once Stop is pressed", () => {
|
|
73
|
+
askBuoyStore.addUser("go");
|
|
74
|
+
askBuoyStore.startAssistant();
|
|
75
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("running");
|
|
76
|
+
askBuoyStore.requestStop();
|
|
77
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("stopping");
|
|
78
|
+
});
|
|
79
|
+
it("is awaitingApproval while a card is up, even though the turn is busy", () => {
|
|
80
|
+
askBuoyStore.addUser("wipe it");
|
|
81
|
+
askBuoyStore.startAssistant();
|
|
82
|
+
void askBuoyStore.askApproval({
|
|
83
|
+
id: "c1",
|
|
84
|
+
toolId: "storage",
|
|
85
|
+
action: "clearAll",
|
|
86
|
+
label: "Clear all saved app data",
|
|
87
|
+
reason: "Wipes everything"
|
|
88
|
+
});
|
|
89
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("awaitingApproval");
|
|
90
|
+
});
|
|
91
|
+
it("is awaitingAnswer after a turn ends on an Ask block", () => {
|
|
92
|
+
const id = askBuoyStore.startAssistant();
|
|
93
|
+
askBuoyStore.applyEvent(id, {
|
|
94
|
+
type: "awaiting-user",
|
|
95
|
+
blockId: "b1"
|
|
96
|
+
});
|
|
97
|
+
askBuoyStore.finishAssistant(id);
|
|
98
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("awaitingAnswer");
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe("when the queue holds", () => {
|
|
102
|
+
it("delivers when idle and the last turn was fine", () => {
|
|
103
|
+
askBuoyStore.addUser("hi");
|
|
104
|
+
const id = askBuoyStore.startAssistant();
|
|
105
|
+
askBuoyStore.applyEvent(id, {
|
|
106
|
+
type: "text",
|
|
107
|
+
delta: "Hello."
|
|
108
|
+
});
|
|
109
|
+
askBuoyStore.finishAssistant(id);
|
|
110
|
+
expect(queuePauseReason(askBuoyStore.getState())).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
it("holds after an error, and says so", () => {
|
|
113
|
+
askBuoyStore.addUser("hi");
|
|
114
|
+
const id = askBuoyStore.startAssistant();
|
|
115
|
+
askBuoyStore.applyEvent(id, {
|
|
116
|
+
type: "error",
|
|
117
|
+
message: "fetch failed"
|
|
118
|
+
});
|
|
119
|
+
askBuoyStore.finishAssistant(id);
|
|
120
|
+
expect(queuePauseReason(askBuoyStore.getState())).toMatch(/failed/);
|
|
121
|
+
});
|
|
122
|
+
it("holds while an approval card is up", () => {
|
|
123
|
+
askBuoyStore.addUser("wipe");
|
|
124
|
+
askBuoyStore.startAssistant();
|
|
125
|
+
void askBuoyStore.askApproval({
|
|
126
|
+
id: "c1",
|
|
127
|
+
toolId: "storage",
|
|
128
|
+
action: "clearAll",
|
|
129
|
+
label: "Clear all saved app data",
|
|
130
|
+
reason: "Wipes everything"
|
|
131
|
+
});
|
|
132
|
+
expect(queuePauseReason(askBuoyStore.getState())).toMatch(/approval/);
|
|
133
|
+
});
|
|
134
|
+
it("holds while a question is unanswered — a queued task is not the answer", () => {
|
|
135
|
+
const id = askBuoyStore.startAssistant();
|
|
136
|
+
askBuoyStore.applyEvent(id, {
|
|
137
|
+
type: "awaiting-user",
|
|
138
|
+
blockId: "b1"
|
|
139
|
+
});
|
|
140
|
+
askBuoyStore.finishAssistant(id);
|
|
141
|
+
expect(queuePauseReason(askBuoyStore.getState())).toMatch(/question/);
|
|
142
|
+
});
|
|
143
|
+
it("says nothing while a turn is still running — the queue is simply waiting", () => {
|
|
144
|
+
askBuoyStore.addUser("go");
|
|
145
|
+
askBuoyStore.startAssistant();
|
|
146
|
+
expect(queuePauseReason(askBuoyStore.getState())).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","it","askBuoyStore","queuePauseReason","turnPhaseOf","reset","texts","getState","queued","map","q","text","enqueue","toEqual","a","b","id","not","toBe","removeQueued","shiftQueued","toBeUndefined","ok","hydrate","messages","role","toolCalls","blocks","answers","usage","input","output","requests","addUser","startAssistant","requestStop","askApproval","toolId","action","label","reason","applyEvent","type","blockId","finishAssistant","delta","toBeNull","message","toMatch"],"sourceRoot":"../../../src","sources":["store/queue.test.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAEzD,SAASC,YAAY,EAAEC,gBAAgB,EAAEC,WAAW,QAAQ,gBAAgB;AAE5EN,UAAU,CAAC,MAAMI,YAAY,CAACG,KAAK,CAAC,CAAC,CAAC;AAEtC,MAAMC,KAAK,GAAGA,CAAA,KAAMJ,YAAY,CAACK,QAAQ,CAAC,CAAC,CAACC,MAAM,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,CAAC;AAErEZ,QAAQ,CAAC,OAAO,EAAE,MAAM;EACtBE,EAAE,CAAC,yCAAyC,EAAE,MAAM;IAClDC,YAAY,CAACU,OAAO,CAAC,yBAAyB,CAAC;IAC/CV,YAAY,CAACU,OAAO,CAAC,0BAA0B,CAAC;IAChDZ,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;EAClF,CAAC,CAAC;EAEFZ,EAAE,CAAC,uCAAuC,EAAE,MAAM;IAChD,MAAMa,CAAC,GAAGZ,YAAY,CAACU,OAAO,CAAC,OAAO,CAAC;IACvC,MAAMG,CAAC,GAAGb,YAAY,CAACU,OAAO,CAAC,OAAO,CAAC;IACvCZ,MAAM,CAACc,CAAC,CAACE,EAAE,CAAC,CAACC,GAAG,CAACC,IAAI,CAACH,CAAC,CAACC,EAAE,CAAC;IAC3Bd,YAAY,CAACiB,YAAY,CAACL,CAAC,CAACE,EAAE,CAAC;IAC/BhB,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;EACpC,CAAC,CAAC;EAEFZ,EAAE,CAAC,wCAAwC,EAAE,MAAM;IACjDC,YAAY,CAACU,OAAO,CAAC,KAAK,CAAC;IAC3BV,YAAY,CAACU,OAAO,CAAC,KAAK,CAAC;IAC3BZ,MAAM,CAACE,YAAY,CAACkB,WAAW,CAAC,CAAC,EAAET,IAAI,CAAC,CAACO,IAAI,CAAC,KAAK,CAAC;IACpDlB,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;IAChCb,MAAM,CAACE,YAAY,CAACkB,WAAW,CAAC,CAAC,EAAET,IAAI,CAAC,CAACO,IAAI,CAAC,KAAK,CAAC;IACpDlB,MAAM,CAACE,YAAY,CAACkB,WAAW,CAAC,CAAC,CAAC,CAACC,aAAa,CAAC,CAAC;EACpD,CAAC,CAAC;EAEFpB,EAAE,CAAC,qCAAqC,EAAE,MAAM;IAC9C,MAAMqB,EAAE,GAAGpB,YAAY,CAACqB,OAAO,CAAC;MAC9BC,QAAQ,EAAE,CAAC;QAAER,EAAE,EAAE,IAAI;QAAES,IAAI,EAAE,MAAM;QAAEd,IAAI,EAAE,IAAI;QAAEe,SAAS,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAG,CAAC,CAAC;MAC7EC,OAAO,EAAE,CAAC,CAAC;MACXC,KAAK,EAAE;QAAEC,KAAK,EAAE,CAAC;QAAEC,MAAM,EAAE,CAAC;QAAEC,QAAQ,EAAE;MAAE,CAAC;MAC3CxB,MAAM,EAAE,CAAC;QAAEQ,EAAE,EAAE,IAAI;QAAEL,IAAI,EAAE;MAAgB,CAAC;IAC9C,CAAC,CAAC;IACFX,MAAM,CAACsB,EAAE,CAAC,CAACJ,IAAI,CAAC,IAAI,CAAC;IACrBlB,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC;IAC1C;IACA;IACAb,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,MAAM,CAAC;EAC3D,CAAC,CAAC;EAEFjB,EAAE,CAAC,kCAAkC,EAAE,MAAM;IAC3CC,YAAY,CAACU,OAAO,CAAC,MAAM,CAAC;IAC5BV,YAAY,CAACG,KAAK,CAAC,CAAC;IACpBL,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,EAAE,CAAC;EAC7B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFd,QAAQ,CAAC,WAAW,EAAE,MAAM;EAC1BE,EAAE,CAAC,+BAA+B,EAAE,MAAM;IACxCD,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,MAAM,CAAC;EAC3D,CAAC,CAAC;EAEFjB,EAAE,CAAC,6DAA6D,EAAE,MAAM;IACtEC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7BlC,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,SAAS,CAAC;IAC5DhB,YAAY,CAACiC,WAAW,CAAC,CAAC;IAC1BnC,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,UAAU,CAAC;EAC/D,CAAC,CAAC;EAEFjB,EAAE,CAAC,sEAAsE,EAAE,MAAM;IAC/EC,YAAY,CAAC+B,OAAO,CAAC,SAAS,CAAC;IAC/B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7B,KAAKhC,YAAY,CAACkC,WAAW,CAAC;MAC5BpB,EAAE,EAAE,IAAI;MACRqB,MAAM,EAAE,SAAS;MACjBC,MAAM,EAAE,UAAU;MAClBC,KAAK,EAAE,0BAA0B;MACjCC,MAAM,EAAE;IACV,CAAC,CAAC;IACFxC,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,kBAAkB,CAAC;EACvE,CAAC,CAAC;EAEFjB,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC9D,MAAMe,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,eAAe;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC;IACrEzC,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,gBAAgB,CAAC;EACrE,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFnB,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrCE,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxDC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAMjB,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,MAAM;MAAEG,KAAK,EAAE;IAAS,CAAC,CAAC;IAC9D3C,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACuC,QAAQ,CAAC,CAAC;EAC9D,CAAC,CAAC;EAEF7C,EAAE,CAAC,mCAAmC,EAAE,MAAM;IAC5CC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAMjB,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,OAAO;MAAEK,OAAO,EAAE;IAAe,CAAC,CAAC;IACvE7C,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACyC,OAAO,CAAC,QAAQ,CAAC;EACrE,CAAC,CAAC;EAEF/C,EAAE,CAAC,oCAAoC,EAAE,MAAM;IAC7CC,YAAY,CAAC+B,OAAO,CAAC,MAAM,CAAC;IAC5B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7B,KAAKhC,YAAY,CAACkC,WAAW,CAAC;MAC5BpB,EAAE,EAAE,IAAI;MACRqB,MAAM,EAAE,SAAS;MACjBC,MAAM,EAAE,UAAU;MAClBC,KAAK,EAAE,0BAA0B;MACjCC,MAAM,EAAE;IACV,CAAC,CAAC;IACFxC,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACyC,OAAO,CAAC,UAAU,CAAC;EACvE,CAAC,CAAC;EAEF/C,EAAE,CAAC,wEAAwE,EAAE,MAAM;IACjF,MAAMe,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,eAAe;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC;IACrEzC,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACyC,OAAO,CAAC,UAAU,CAAC;EACvE,CAAC,CAAC;EAEF/C,EAAE,CAAC,0EAA0E,EAAE,MAAM;IACnFC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7BlC,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACuC,QAAQ,CAAC,CAAC;EAC9D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* "New conversation" — the ONE way a conversation is cleared.
|
|
5
|
+
*
|
|
6
|
+
* Clearing drops the effect ledger, which is the only undo surface, while the
|
|
7
|
+
* agent's changes stay live in the app. So the path that clears has to be the
|
|
8
|
+
* path that knows whether undo succeeded — and there used to be two paths
|
|
9
|
+
* that did not: the sheet's "Undo, then clear" awaited `revertAll` and reset
|
|
10
|
+
* without reading the outcome (two of five reverts fail, the conversation
|
|
11
|
+
* clears anyway, two changes stay applied with no record), and the desktop's
|
|
12
|
+
* `reset` action skipped the question entirely.
|
|
13
|
+
*
|
|
14
|
+
* Both now come through here. A failed revert does NOT clear: the caller gets
|
|
15
|
+
* the list of what is still applied and clearing becomes a second, explicit
|
|
16
|
+
* choice.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { askBuoyStore } from "./askBuoyStore";
|
|
20
|
+
import { clearTranscript } from "./transcriptPersistence";
|
|
21
|
+
/** Clear everything, unconditionally. The caller has already decided. */
|
|
22
|
+
export function clearConversation() {
|
|
23
|
+
// All three, or the conversation this said it had cleared comes straight
|
|
24
|
+
// back on the next reload with its undo bar intact.
|
|
25
|
+
askBuoyStore.getHeldSession()?.session.reset();
|
|
26
|
+
askBuoyStore.reset();
|
|
27
|
+
void clearTranscript();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Undo what can be undone, then clear — unless something would not go back.
|
|
32
|
+
*
|
|
33
|
+
* Refuses while a turn is running: the ledger is being written to, and a
|
|
34
|
+
* revert racing a dispatch is how "changed since Ask Buoy wrote it" happens
|
|
35
|
+
* to our own write.
|
|
36
|
+
*/
|
|
37
|
+
export async function resetConversation(input) {
|
|
38
|
+
if (askBuoyStore.getState().busy) {
|
|
39
|
+
return {
|
|
40
|
+
cleared: false,
|
|
41
|
+
reverted: 0,
|
|
42
|
+
failed: [{
|
|
43
|
+
label: "A turn is running",
|
|
44
|
+
error: "Stop it first."
|
|
45
|
+
}]
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const ledger = askBuoyStore.getLedger();
|
|
49
|
+
if (input.undoFirst && ledger) {
|
|
50
|
+
const outcome = await ledger.revertAll(input.dispatch);
|
|
51
|
+
if (outcome.failed.length > 0) {
|
|
52
|
+
return {
|
|
53
|
+
cleared: false,
|
|
54
|
+
reverted: outcome.reverted,
|
|
55
|
+
failed: outcome.failed
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
clearConversation();
|
|
59
|
+
return {
|
|
60
|
+
cleared: true,
|
|
61
|
+
reverted: outcome.reverted,
|
|
62
|
+
failed: []
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
clearConversation();
|
|
66
|
+
return {
|
|
67
|
+
cleared: true,
|
|
68
|
+
reverted: 0,
|
|
69
|
+
failed: []
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=resetConversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["askBuoyStore","clearTranscript","clearConversation","getHeldSession","session","reset","resetConversation","input","getState","busy","cleared","reverted","failed","label","error","ledger","getLedger","undoFirst","outcome","revertAll","dispatch","length"],"sourceRoot":"../../../src","sources":["store/resetConversation.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,eAAe,QAAQ,yBAAyB;AAWzD;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAS;EACxC;EACA;EACAF,YAAY,CAACG,cAAc,CAAC,CAAC,EAAEC,OAAO,CAACC,KAAK,CAAC,CAAC;EAC9CL,YAAY,CAACK,KAAK,CAAC,CAAC;EACpB,KAAKJ,eAAe,CAAC,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeK,iBAAiBA,CAACC,KAGvC,EAAyB;EACxB,IAAIP,YAAY,CAACQ,QAAQ,CAAC,CAAC,CAACC,IAAI,EAAE;IAChC,OAAO;MAAEC,OAAO,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC;MAAEC,MAAM,EAAE,CAAC;QAAEC,KAAK,EAAE,mBAAmB;QAAEC,KAAK,EAAE;MAAiB,CAAC;IAAE,CAAC;EAC3G;EACA,MAAMC,MAAM,GAAGf,YAAY,CAACgB,SAAS,CAAC,CAAC;EACvC,IAAIT,KAAK,CAACU,SAAS,IAAIF,MAAM,EAAE;IAC7B,MAAMG,OAAO,GAAG,MAAMH,MAAM,CAACI,SAAS,CAACZ,KAAK,CAACa,QAAQ,CAAC;IACtD,IAAIF,OAAO,CAACN,MAAM,CAACS,MAAM,GAAG,CAAC,EAAE;MAC7B,OAAO;QAAEX,OAAO,EAAE,KAAK;QAAEC,QAAQ,EAAEO,OAAO,CAACP,QAAQ;QAAEC,MAAM,EAAEM,OAAO,CAACN;MAAO,CAAC;IAC/E;IACAV,iBAAiB,CAAC,CAAC;IACnB,OAAO;MAAEQ,OAAO,EAAE,IAAI;MAAEC,QAAQ,EAAEO,OAAO,CAACP,QAAQ;MAAEC,MAAM,EAAE;IAAG,CAAC;EAClE;EACAV,iBAAiB,CAAC,CAAC;EACnB,OAAO;IAAEQ,OAAO,EAAE,IAAI;IAAEC,QAAQ,EAAE,CAAC;IAAEC,MAAM,EAAE;EAAG,CAAC;AACnD","ignoreList":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Putting an unanswered approval back after a restart.
|
|
5
|
+
*
|
|
6
|
+
* The rule this encodes: a question the user never answered is not the app's
|
|
7
|
+
* to drop. Nothing was tapped, so the change is still waiting as far as they
|
|
8
|
+
* know — and a card that vanishes on reload reads as consent nobody gave.
|
|
9
|
+
*
|
|
10
|
+
* The guards matter as much as the restore. The disk read races the tool
|
|
11
|
+
* registry (see the note at the restore site), so it can land late, and an old
|
|
12
|
+
* question shoved in front of a live conversation would be worse than losing
|
|
13
|
+
* it.
|
|
14
|
+
*/
|
|
15
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
16
|
+
import { askBuoyStore } from "./askBuoyStore";
|
|
17
|
+
const card = {
|
|
18
|
+
id: "c1",
|
|
19
|
+
toolId: "zustand",
|
|
20
|
+
action: "setState",
|
|
21
|
+
label: "Update the Poké Mart bag store",
|
|
22
|
+
reason: "This will change the app's state.",
|
|
23
|
+
params: {
|
|
24
|
+
storeName: "bag"
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
beforeEach(() => askBuoyStore.reset());
|
|
28
|
+
describe("restorePending", () => {
|
|
29
|
+
it("puts the card back on screen", () => {
|
|
30
|
+
expect(askBuoyStore.restorePending(card)).toBe(true);
|
|
31
|
+
expect(askBuoyStore.getState().pending).toMatchObject({
|
|
32
|
+
toolId: "zustand",
|
|
33
|
+
action: "setState",
|
|
34
|
+
params: {
|
|
35
|
+
storeName: "bag"
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it("marks it restored, so Allow runs the call instead of answering a dead promise", () => {
|
|
40
|
+
askBuoyStore.restorePending(card);
|
|
41
|
+
expect(askBuoyStore.getState().pending?.restored).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it("refuses once a turn is under way", () => {
|
|
44
|
+
askBuoyStore.beginTurn();
|
|
45
|
+
expect(askBuoyStore.restorePending(card)).toBe(false);
|
|
46
|
+
expect(askBuoyStore.getState().pending).toBeNull();
|
|
47
|
+
});
|
|
48
|
+
it("refuses when a live card is already asking", () => {
|
|
49
|
+
void askBuoyStore.askApproval(card);
|
|
50
|
+
expect(askBuoyStore.restorePending({
|
|
51
|
+
...card,
|
|
52
|
+
id: "c2"
|
|
53
|
+
})).toBe(false);
|
|
54
|
+
expect(askBuoyStore.getState().pending?.id).toBe("c1");
|
|
55
|
+
});
|
|
56
|
+
it("answers without throwing, though nothing is waiting on it", () => {
|
|
57
|
+
askBuoyStore.restorePending(card);
|
|
58
|
+
expect(() => askBuoyStore.answerApproval(true)).not.toThrow();
|
|
59
|
+
expect(askBuoyStore.getState().pending).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=restorePending.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","it","askBuoyStore","card","id","toolId","action","label","reason","params","storeName","reset","restorePending","toBe","getState","pending","toMatchObject","restored","beginTurn","toBeNull","askApproval","answerApproval","not","toThrow"],"sourceRoot":"../../../src","sources":["store/restorePending.test.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAEzD,SAASC,YAAY,QAAQ,gBAAgB;AAE7C,MAAMC,IAAI,GAAG;EACXC,EAAE,EAAE,IAAI;EACRC,MAAM,EAAE,SAAS;EACjBC,MAAM,EAAE,UAAU;EAClBC,KAAK,EAAE,gCAAgC;EACvCC,MAAM,EAAE,mCAAmC;EAC3CC,MAAM,EAAE;IAAEC,SAAS,EAAE;EAAM;AAC7B,CAAC;AAEDZ,UAAU,CAAC,MAAMI,YAAY,CAACS,KAAK,CAAC,CAAC,CAAC;AAEtCZ,QAAQ,CAAC,gBAAgB,EAAE,MAAM;EAC/BE,EAAE,CAAC,8BAA8B,EAAE,MAAM;IACvCD,MAAM,CAACE,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC,CAAC,CAACU,IAAI,CAAC,IAAI,CAAC;IACpDb,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAACC,aAAa,CAAC;MACpDX,MAAM,EAAE,SAAS;MACjBC,MAAM,EAAE,UAAU;MAClBG,MAAM,EAAE;QAAEC,SAAS,EAAE;MAAM;IAC7B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFT,EAAE,CAAC,+EAA+E,EAAE,MAAM;IACxFC,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC;IACjCH,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,EAAEE,QAAQ,CAAC,CAACJ,IAAI,CAAC,IAAI,CAAC;EAC9D,CAAC,CAAC;EAEFZ,EAAE,CAAC,kCAAkC,EAAE,MAAM;IAC3CC,YAAY,CAACgB,SAAS,CAAC,CAAC;IACxBlB,MAAM,CAACE,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC,CAAC,CAACU,IAAI,CAAC,KAAK,CAAC;IACrDb,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAACI,QAAQ,CAAC,CAAC;EACpD,CAAC,CAAC;EAEFlB,EAAE,CAAC,4CAA4C,EAAE,MAAM;IACrD,KAAKC,YAAY,CAACkB,WAAW,CAACjB,IAAI,CAAC;IACnCH,MAAM,CAACE,YAAY,CAACU,cAAc,CAAC;MAAE,GAAGT,IAAI;MAAEC,EAAE,EAAE;IAAK,CAAC,CAAC,CAAC,CAACS,IAAI,CAAC,KAAK,CAAC;IACtEb,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,EAAEX,EAAE,CAAC,CAACS,IAAI,CAAC,IAAI,CAAC;EACxD,CAAC,CAAC;EAEFZ,EAAE,CAAC,2DAA2D,EAAE,MAAM;IACpEC,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC;IACjCH,MAAM,CAAC,MAAME,YAAY,CAACmB,cAAc,CAAC,IAAI,CAAC,CAAC,CAACC,GAAG,CAACC,OAAO,CAAC,CAAC;IAC7DvB,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAACI,QAAQ,CAAC,CAAC;EACpD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The empty state's "try asking" chips, filtered to what will actually work.
|
|
5
|
+
*
|
|
6
|
+
* The list was static, so a release build offered "Make the next request fail
|
|
7
|
+
* with a 500" directly above a line saying simulations need a dev build — and
|
|
8
|
+
* the agent then refused the very thing the screen had just suggested. First
|
|
9
|
+
* impression: broken. Each chip now says what it needs; the empty state keeps
|
|
10
|
+
* the ones this device, build and policy can honour.
|
|
11
|
+
*
|
|
12
|
+
* Deterministic on purpose: no model call, no navigation, no guessed route
|
|
13
|
+
* names or account ids. When the tool registry has not reported yet (it fills
|
|
14
|
+
* in a frame or two after open) only the chips that need nothing are shown —
|
|
15
|
+
* a short list that grows beats a long one that shrinks.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export const SUGGESTIONS = [{
|
|
19
|
+
text: "Why is this screen empty?"
|
|
20
|
+
}, {
|
|
21
|
+
text: "What did the last few network calls return?",
|
|
22
|
+
needs: "network"
|
|
23
|
+
}, {
|
|
24
|
+
text: "Show me what's saved for this user",
|
|
25
|
+
needs: "storage"
|
|
26
|
+
}, {
|
|
27
|
+
text: "Make the next request to this screen fail with a 500",
|
|
28
|
+
needs: "network",
|
|
29
|
+
write: true,
|
|
30
|
+
devOnly: true
|
|
31
|
+
}, {
|
|
32
|
+
text: "Who am I signed in as right now?"
|
|
33
|
+
}, {
|
|
34
|
+
text: "Did anything crash or log an error recently?",
|
|
35
|
+
needs: "console"
|
|
36
|
+
}];
|
|
37
|
+
|
|
38
|
+
/** At most this many chips — the rest of the screen is the point. */
|
|
39
|
+
export const MAX_SUGGESTIONS = 4;
|
|
40
|
+
export function pickSuggestions(input) {
|
|
41
|
+
const known = input.availableToolIds.length > 0;
|
|
42
|
+
return SUGGESTIONS.filter(s => {
|
|
43
|
+
if (s.write && input.readOnly) return false;
|
|
44
|
+
if (s.devOnly && input.isRelease) return false;
|
|
45
|
+
if (s.needs) return known && input.availableToolIds.includes(s.needs);
|
|
46
|
+
return true;
|
|
47
|
+
}).slice(0, MAX_SUGGESTIONS).map(s => s.text);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SUGGESTIONS","text","needs","write","devOnly","MAX_SUGGESTIONS","pickSuggestions","input","known","availableToolIds","length","filter","s","readOnly","isRelease","includes","slice","map"],"sourceRoot":"../../../src","sources":["store/suggestions.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAWA,OAAO,MAAMA,WAAyB,GAAG,CACvC;EAAEC,IAAI,EAAE;AAA4B,CAAC,EACrC;EAAEA,IAAI,EAAE,6CAA6C;EAAEC,KAAK,EAAE;AAAU,CAAC,EACzE;EAAED,IAAI,EAAE,oCAAoC;EAAEC,KAAK,EAAE;AAAU,CAAC,EAChE;EAAED,IAAI,EAAE,sDAAsD;EAAEC,KAAK,EAAE,SAAS;EAAEC,KAAK,EAAE,IAAI;EAAEC,OAAO,EAAE;AAAK,CAAC,EAC9G;EAAEH,IAAI,EAAE;AAAmC,CAAC,EAC5C;EAAEA,IAAI,EAAE,8CAA8C;EAAEC,KAAK,EAAE;AAAU,CAAC,CAC3E;;AAED;AACA,OAAO,MAAMG,eAAe,GAAG,CAAC;AAEhC,OAAO,SAASC,eAAeA,CAACC,KAI/B,EAAY;EACX,MAAMC,KAAK,GAAGD,KAAK,CAACE,gBAAgB,CAACC,MAAM,GAAG,CAAC;EAC/C,OAAOV,WAAW,CAACW,MAAM,CAAEC,CAAC,IAAK;IAC/B,IAAIA,CAAC,CAACT,KAAK,IAAII,KAAK,CAACM,QAAQ,EAAE,OAAO,KAAK;IAC3C,IAAID,CAAC,CAACR,OAAO,IAAIG,KAAK,CAACO,SAAS,EAAE,OAAO,KAAK;IAC9C,IAAIF,CAAC,CAACV,KAAK,EAAE,OAAOM,KAAK,IAAID,KAAK,CAACE,gBAAgB,CAACM,QAAQ,CAACH,CAAC,CAACV,KAAK,CAAC;IACrE,OAAO,IAAI;EACb,CAAC,CAAC,CACCc,KAAK,CAAC,CAAC,EAAEX,eAAe,CAAC,CACzBY,GAAG,CAAEL,CAAC,IAAKA,CAAC,CAACX,IAAI,CAAC;AACvB","ignoreList":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Chips promise things; only promise what this device can keep.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
import { MAX_SUGGESTIONS, pickSuggestions } from "./suggestions";
|
|
8
|
+
const all = ["network", "storage", "console", "query"];
|
|
9
|
+
describe("pickSuggestions", () => {
|
|
10
|
+
it("offers the simulation only on a dev build that may write", () => {
|
|
11
|
+
const dev = pickSuggestions({
|
|
12
|
+
availableToolIds: all,
|
|
13
|
+
readOnly: false,
|
|
14
|
+
isRelease: false
|
|
15
|
+
});
|
|
16
|
+
expect(dev).toContain("Make the next request to this screen fail with a 500");
|
|
17
|
+
const release = pickSuggestions({
|
|
18
|
+
availableToolIds: all,
|
|
19
|
+
readOnly: false,
|
|
20
|
+
isRelease: true
|
|
21
|
+
});
|
|
22
|
+
expect(release).not.toContain("Make the next request to this screen fail with a 500");
|
|
23
|
+
const readOnly = pickSuggestions({
|
|
24
|
+
availableToolIds: all,
|
|
25
|
+
readOnly: true,
|
|
26
|
+
isRelease: false
|
|
27
|
+
});
|
|
28
|
+
expect(readOnly).not.toContain("Make the next request to this screen fail with a 500");
|
|
29
|
+
});
|
|
30
|
+
it("drops chips whose tool is not on this device", () => {
|
|
31
|
+
const noNetwork = pickSuggestions({
|
|
32
|
+
availableToolIds: ["storage"],
|
|
33
|
+
readOnly: false,
|
|
34
|
+
isRelease: false
|
|
35
|
+
});
|
|
36
|
+
expect(noNetwork).not.toContain("What did the last few network calls return?");
|
|
37
|
+
expect(noNetwork).toContain("Show me what's saved for this user");
|
|
38
|
+
});
|
|
39
|
+
it("shows only tool-free chips until the registry has reported", () => {
|
|
40
|
+
const early = pickSuggestions({
|
|
41
|
+
availableToolIds: [],
|
|
42
|
+
readOnly: false,
|
|
43
|
+
isRelease: false
|
|
44
|
+
});
|
|
45
|
+
expect(early).toEqual(["Why is this screen empty?", "Who am I signed in as right now?"]);
|
|
46
|
+
});
|
|
47
|
+
it("never exceeds the cap and keeps the order", () => {
|
|
48
|
+
const out = pickSuggestions({
|
|
49
|
+
availableToolIds: all,
|
|
50
|
+
readOnly: false,
|
|
51
|
+
isRelease: false
|
|
52
|
+
});
|
|
53
|
+
expect(out.length).toBeLessThanOrEqual(MAX_SUGGESTIONS);
|
|
54
|
+
expect(out[0]).toBe("Why is this screen empty?");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=suggestions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","MAX_SUGGESTIONS","pickSuggestions","all","dev","availableToolIds","readOnly","isRelease","toContain","release","not","noNetwork","early","toEqual","out","length","toBeLessThanOrEqual","toBe"],"sourceRoot":"../../../src","sources":["store/suggestions.test.ts"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAE7C,SAASC,eAAe,EAAEC,eAAe,QAAQ,eAAe;AAEhE,MAAMC,GAAG,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC;AAEtDL,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAChCE,EAAE,CAAC,0DAA0D,EAAE,MAAM;IACnE,MAAMI,GAAG,GAAGF,eAAe,CAAC;MAAEG,gBAAgB,EAAEF,GAAG;MAAEG,QAAQ,EAAE,KAAK;MAAEC,SAAS,EAAE;IAAM,CAAC,CAAC;IACzFR,MAAM,CAACK,GAAG,CAAC,CAACI,SAAS,CAAC,sDAAsD,CAAC;IAC7E,MAAMC,OAAO,GAAGP,eAAe,CAAC;MAAEG,gBAAgB,EAAEF,GAAG;MAAEG,QAAQ,EAAE,KAAK;MAAEC,SAAS,EAAE;IAAK,CAAC,CAAC;IAC5FR,MAAM,CAACU,OAAO,CAAC,CAACC,GAAG,CAACF,SAAS,CAAC,sDAAsD,CAAC;IACrF,MAAMF,QAAQ,GAAGJ,eAAe,CAAC;MAAEG,gBAAgB,EAAEF,GAAG;MAAEG,QAAQ,EAAE,IAAI;MAAEC,SAAS,EAAE;IAAM,CAAC,CAAC;IAC7FR,MAAM,CAACO,QAAQ,CAAC,CAACI,GAAG,CAACF,SAAS,CAAC,sDAAsD,CAAC;EACxF,CAAC,CAAC;EAEFR,EAAE,CAAC,8CAA8C,EAAE,MAAM;IACvD,MAAMW,SAAS,GAAGT,eAAe,CAAC;MAAEG,gBAAgB,EAAE,CAAC,SAAS,CAAC;MAAEC,QAAQ,EAAE,KAAK;MAAEC,SAAS,EAAE;IAAM,CAAC,CAAC;IACvGR,MAAM,CAACY,SAAS,CAAC,CAACD,GAAG,CAACF,SAAS,CAAC,6CAA6C,CAAC;IAC9ET,MAAM,CAACY,SAAS,CAAC,CAACH,SAAS,CAAC,oCAAoC,CAAC;EACnE,CAAC,CAAC;EAEFR,EAAE,CAAC,4DAA4D,EAAE,MAAM;IACrE,MAAMY,KAAK,GAAGV,eAAe,CAAC;MAAEG,gBAAgB,EAAE,EAAE;MAAEC,QAAQ,EAAE,KAAK;MAAEC,SAAS,EAAE;IAAM,CAAC,CAAC;IAC1FR,MAAM,CAACa,KAAK,CAAC,CAACC,OAAO,CAAC,CAAC,2BAA2B,EAAE,kCAAkC,CAAC,CAAC;EAC1F,CAAC,CAAC;EAEFb,EAAE,CAAC,2CAA2C,EAAE,MAAM;IACpD,MAAMc,GAAG,GAAGZ,eAAe,CAAC;MAAEG,gBAAgB,EAAEF,GAAG;MAAEG,QAAQ,EAAE,KAAK;MAAEC,SAAS,EAAE;IAAM,CAAC,CAAC;IACzFR,MAAM,CAACe,GAAG,CAACC,MAAM,CAAC,CAACC,mBAAmB,CAACf,eAAe,CAAC;IACvDF,MAAM,CAACe,GAAG,CAAC,CAAC,CAAC,CAAC,CAACG,IAAI,CAAC,2BAA2B,CAAC;EAClD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Buoy's own lines in the transcript — today, the memory-trim notice.
|
|
5
|
+
*/
|
|
6
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
7
|
+
import { askBuoyStore } from "./askBuoyStore";
|
|
8
|
+
import { buildPayload, parsePayload } from "./transcriptPersistence";
|
|
9
|
+
beforeEach(() => askBuoyStore.reset());
|
|
10
|
+
describe("history-trimmed", () => {
|
|
11
|
+
it("inserts a system line before the answer it affects", () => {
|
|
12
|
+
askBuoyStore.addUser("turn off that override");
|
|
13
|
+
const id = askBuoyStore.startAssistant();
|
|
14
|
+
askBuoyStore.applyEvent(id, {
|
|
15
|
+
type: "history-trimmed",
|
|
16
|
+
droppedRounds: 3
|
|
17
|
+
});
|
|
18
|
+
askBuoyStore.applyEvent(id, {
|
|
19
|
+
type: "text",
|
|
20
|
+
delta: "Turning it off."
|
|
21
|
+
});
|
|
22
|
+
const roles = askBuoyStore.getState().messages.map(m => m.system ? "system" : m.role);
|
|
23
|
+
expect(roles).toEqual(["user", "system", "assistant"]);
|
|
24
|
+
const line = askBuoyStore.getState().messages[1];
|
|
25
|
+
expect(line.text).toMatch(/3 exchanges/);
|
|
26
|
+
expect(line.text).toMatch(/changes bar still lists/);
|
|
27
|
+
});
|
|
28
|
+
it("singular for one round", () => {
|
|
29
|
+
const id = askBuoyStore.startAssistant();
|
|
30
|
+
askBuoyStore.applyEvent(id, {
|
|
31
|
+
type: "history-trimmed",
|
|
32
|
+
droppedRounds: 1
|
|
33
|
+
});
|
|
34
|
+
expect(askBuoyStore.getState().messages[0].text).toMatch(/1 exchange\)/);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("restored approval freshness", () => {
|
|
38
|
+
it("carries the target digest to disk and back, never the target", () => {
|
|
39
|
+
const payload = buildPayload({
|
|
40
|
+
messages: [{
|
|
41
|
+
id: "m1",
|
|
42
|
+
role: "user",
|
|
43
|
+
text: "set it",
|
|
44
|
+
toolCalls: [],
|
|
45
|
+
blocks: []
|
|
46
|
+
}],
|
|
47
|
+
history: [],
|
|
48
|
+
answers: {},
|
|
49
|
+
usage: {
|
|
50
|
+
input: 0,
|
|
51
|
+
output: 0,
|
|
52
|
+
requests: 0
|
|
53
|
+
},
|
|
54
|
+
pending: {
|
|
55
|
+
id: "c1",
|
|
56
|
+
toolId: "zustand",
|
|
57
|
+
action: "setState",
|
|
58
|
+
label: "Update the bag store",
|
|
59
|
+
reason: "Replaces part of the store",
|
|
60
|
+
params: {
|
|
61
|
+
storeName: "bag",
|
|
62
|
+
state: {
|
|
63
|
+
qty: 14
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
targetDigest: "1a2b3c:512",
|
|
67
|
+
resolve: () => {}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const json = JSON.stringify(payload);
|
|
71
|
+
expect(json).toContain("1a2b3c:512");
|
|
72
|
+
const back = parsePayload(json);
|
|
73
|
+
expect(back?.pending?.targetDigest).toBe("1a2b3c:512");
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=systemLine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","it","askBuoyStore","buildPayload","parsePayload","reset","addUser","id","startAssistant","applyEvent","type","droppedRounds","delta","roles","getState","messages","map","m","system","role","toEqual","line","text","toMatch","payload","toolCalls","blocks","history","answers","usage","input","output","requests","pending","toolId","action","label","reason","params","storeName","state","qty","targetDigest","resolve","json","JSON","stringify","toContain","back","toBe"],"sourceRoot":"../../../src","sources":["store/systemLine.test.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The "Summarize for a ticket" request, sent as an ordinary user message.
|
|
5
|
+
*
|
|
6
|
+
* One button, one canned sentence, because the machinery already exists: the
|
|
7
|
+
* prompt teaches the `finding` block and the renderer draws it. What was
|
|
8
|
+
* missing was a way to ASK for one without knowing the word, and a Copy that
|
|
9
|
+
* includes it (see blockText.ts). Facts and inference are separated in the
|
|
10
|
+
* ask, nothing is re-run to produce it, and nothing is submitted anywhere.
|
|
11
|
+
*/
|
|
12
|
+
export const TICKET_PROMPT = "Summarize this conversation as a bug ticket, using one buoy_ui finding block and nothing else. " + "Title it with the problem in one line. Evidence rows, in this order: Steps (what we did), Expected, Observed, " + "Build (dev or release, platform), Evidence (the exact requests, statuses, logs or values you actually saw this conversation), " + "Still applied (overrides or changes from your changes list that are still live, or 'none'). " + "Only facts you observed in this conversation; write 'unknown' where you don't know rather than guessing, and put anything " + "you inferred rather than saw in a final row labelled Inference. Do not run any tool or change anything to produce this.";
|
|
13
|
+
//# sourceMappingURL=ticketPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["TICKET_PROMPT"],"sourceRoot":"../../../src","sources":["store/ticketPrompt.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,aAAa,GACxB,iGAAiG,GACjG,gHAAgH,GAChH,gIAAgI,GAChI,8FAA8F,GAC9F,4HAA4H,GAC5H,yHAAyH","ignoreList":[]}
|