@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,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The fold rule: consecutive successful reads fold, nothing else ever does,
|
|
5
|
+
* and a group never crosses a write.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, expect, it } from "vitest";
|
|
8
|
+
import { formatElapsed, groupCalls, turnFooter } from "./activityGroups";
|
|
9
|
+
const call = (id, toolId, effect, status = "ok") => ({
|
|
10
|
+
id,
|
|
11
|
+
toolId,
|
|
12
|
+
action: "x",
|
|
13
|
+
label: `${toolId} ${id}`,
|
|
14
|
+
status,
|
|
15
|
+
effect
|
|
16
|
+
});
|
|
17
|
+
describe("groupCalls", () => {
|
|
18
|
+
it("leaves a single read as an ordinary row", () => {
|
|
19
|
+
const items = groupCalls([call("a", "console", "read")]);
|
|
20
|
+
expect(items).toEqual([{
|
|
21
|
+
kind: "call",
|
|
22
|
+
call: expect.objectContaining({
|
|
23
|
+
id: "a"
|
|
24
|
+
})
|
|
25
|
+
}]);
|
|
26
|
+
});
|
|
27
|
+
it("folds consecutive successful reads and names the tools once each", () => {
|
|
28
|
+
const items = groupCalls([call("a", "network", "read"), call("b", "storage", "read"), call("c", "storage", "read")]);
|
|
29
|
+
expect(items).toHaveLength(1);
|
|
30
|
+
const g = items[0];
|
|
31
|
+
expect(g.kind).toBe("reads");
|
|
32
|
+
expect(g.kind === "reads" && g.count).toBe(3);
|
|
33
|
+
expect(g.kind === "reads" && g.label).toBe("Looked at Network and Storage");
|
|
34
|
+
});
|
|
35
|
+
it("never folds a write, and never folds reads across one", () => {
|
|
36
|
+
const items = groupCalls([call("a", "network", "read"), call("b", "storage", "read"), call("w", "zustand", "write"), call("c", "storage", "read"), call("d", "console", "read")]);
|
|
37
|
+
expect(items.map(i => i.kind === "reads" ? `reads:${i.count}` : `call:${i.call.id}`)).toEqual(["reads:2", "call:w", "reads:2"]);
|
|
38
|
+
});
|
|
39
|
+
it("keeps failed, refused, declined, stopped and running reads as their own rows", () => {
|
|
40
|
+
const items = groupCalls([call("a", "network", "read"), call("f", "storage", "read", "failed"), call("b", "storage", "read"), call("r", "storage", "read", "running")]);
|
|
41
|
+
expect(items.map(i => i.kind)).toEqual(["call", "call", "call", "call"]);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("turnFooter", () => {
|
|
45
|
+
it("reports duration and action count", () => {
|
|
46
|
+
expect(turnFooter({
|
|
47
|
+
startedAt: 1_000,
|
|
48
|
+
endedAt: 13_000,
|
|
49
|
+
toolCalls: [call("a", "network", "read"), call("b", "zustand", "write")]
|
|
50
|
+
})).toBe("12s · 2 actions");
|
|
51
|
+
});
|
|
52
|
+
it("separates the outcomes that were not plain successes", () => {
|
|
53
|
+
expect(turnFooter({
|
|
54
|
+
startedAt: 0,
|
|
55
|
+
endedAt: 48_000,
|
|
56
|
+
toolCalls: [call("a", "network", "read"), call("b", "storage", "write", "failed"), call("c", "storage", "destructive", "declined"), call("d", "storage", "write", "stopped")]
|
|
57
|
+
})).toBe("48s · 4 actions · 1 failed · 1 declined · 1 not run");
|
|
58
|
+
});
|
|
59
|
+
it("invents no duration for a note with no start time", () => {
|
|
60
|
+
expect(turnFooter({
|
|
61
|
+
endedAt: 5_000,
|
|
62
|
+
toolCalls: []
|
|
63
|
+
})).toBeNull();
|
|
64
|
+
expect(turnFooter({
|
|
65
|
+
endedAt: 5_000,
|
|
66
|
+
toolCalls: [call("a", "network", "read")]
|
|
67
|
+
})).toBe("1 action");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe("formatElapsed", () => {
|
|
71
|
+
it("is compact", () => {
|
|
72
|
+
expect(formatElapsed(4_200)).toBe("4s");
|
|
73
|
+
expect(formatElapsed(64_000)).toBe("1m 04s");
|
|
74
|
+
expect(formatElapsed(3_720_000)).toBe("1h 02m");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=activityGroups.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","formatElapsed","groupCalls","turnFooter","call","id","toolId","effect","status","action","label","items","toEqual","kind","objectContaining","toHaveLength","g","toBe","count","map","i","startedAt","endedAt","toolCalls","toBeNull"],"sourceRoot":"../../../src","sources":["store/activityGroups.test.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -10,11 +10,16 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { definePersistedSetting, devToolsStorageKeys } from "@buoy-gg/shared-ui";
|
|
12
12
|
export const DEFAULT_SETTINGS = {
|
|
13
|
-
showThinking: false
|
|
13
|
+
showThinking: false,
|
|
14
|
+
bypassApprovals: false,
|
|
15
|
+
readOnly: false
|
|
14
16
|
};
|
|
15
17
|
const store = definePersistedSetting(`${devToolsStorageKeys.base}_ask_buoy_settings`, DEFAULT_SETTINGS, {
|
|
16
18
|
sanitize: merged => ({
|
|
17
|
-
showThinking: merged.showThinking === true
|
|
19
|
+
showThinking: merged.showThinking === true,
|
|
20
|
+
// Fails closed: anything but a literal `true` on disk means "ask me".
|
|
21
|
+
bypassApprovals: merged.bypassApprovals === true,
|
|
22
|
+
readOnly: merged.readOnly === true
|
|
18
23
|
})
|
|
19
24
|
});
|
|
20
25
|
let current = DEFAULT_SETTINGS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["definePersistedSetting","devToolsStorageKeys","DEFAULT_SETTINGS","showThinking","store","base","sanitize","merged","current","loaded","listeners","Set","emit","fn","askBuoySettings","get","subscribe","add","load","then","value","delete","set","key","save","reset","clear"],"sourceRoot":"../../../src","sources":["store/askBuoySettings.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,sBAAsB,EAAEC,mBAAmB,QAAQ,oBAAoB;
|
|
1
|
+
{"version":3,"names":["definePersistedSetting","devToolsStorageKeys","DEFAULT_SETTINGS","showThinking","bypassApprovals","readOnly","store","base","sanitize","merged","current","loaded","listeners","Set","emit","fn","askBuoySettings","get","subscribe","add","load","then","value","delete","set","key","save","reset","clear"],"sourceRoot":"../../../src","sources":["store/askBuoySettings.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,sBAAsB,EAAEC,mBAAmB,QAAQ,oBAAoB;AAwChF,OAAO,MAAMC,gBAAiC,GAAG;EAC/CC,YAAY,EAAE,KAAK;EACnBC,eAAe,EAAE,KAAK;EACtBC,QAAQ,EAAE;AACZ,CAAC;AAED,MAAMC,KAAK,GAAGN,sBAAsB,CAClC,GAAGC,mBAAmB,CAACM,IAAI,oBAAoB,EAC/CL,gBAAgB,EAChB;EACEM,QAAQ,EAAGC,MAAM,KAAM;IACrBN,YAAY,EAAEM,MAAM,CAACN,YAAY,KAAK,IAAI;IAC1C;IACAC,eAAe,EAAEK,MAAM,CAACL,eAAe,KAAK,IAAI;IAChDC,QAAQ,EAAEI,MAAM,CAACJ,QAAQ,KAAK;EAChC,CAAC;AACH,CACF,CAAC;AAED,IAAIK,OAAwB,GAAGR,gBAAgB;AAC/C,IAAIS,MAAM,GAAG,KAAK;AAClB,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAa,CAAC;AAEvC,SAASC,IAAIA,CAAA,EAAS;EACpB,KAAK,MAAMC,EAAE,IAAIH,SAAS,EAAE;IAC1B,IAAI;MACFG,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;AACF;AAEA,OAAO,MAAMC,eAAe,GAAG;EAC7BC,GAAG,EAAEA,CAAA,KAAuBP,OAAO;EAEnCQ,SAASA,CAACH,EAAc,EAAc;IACpCH,SAAS,CAACO,GAAG,CAACJ,EAAE,CAAC;IACjB;IACA,IAAI,CAACJ,MAAM,EAAE;MACXA,MAAM,GAAG,IAAI;MACb,KAAKL,KAAK,CAACc,IAAI,CAAC,CAAC,CAACC,IAAI,CAAEC,KAAK,IAAK;QAChCZ,OAAO,GAAGY,KAAK;QACfR,IAAI,CAAC,CAAC;MACR,CAAC,CAAC;IACJ;IACA,OAAO,MAAMF,SAAS,CAACW,MAAM,CAACR,EAAE,CAAC;EACnC,CAAC;EAEDS,GAAGA,CAAkCC,GAAM,EAAEH,KAAyB,EAAQ;IAC5E,IAAIZ,OAAO,CAACe,GAAG,CAAC,KAAKH,KAAK,EAAE;IAC5BZ,OAAO,GAAG;MAAE,GAAGA,OAAO;MAAE,CAACe,GAAG,GAAGH;IAAM,CAAC;IACtCR,IAAI,CAAC,CAAC;IACN,KAAKR,KAAK,CAACoB,IAAI,CAAChB,OAAO,CAAC;EAC1B,CAAC;EAED;EACAiB,KAAKA,CAAA,EAAS;IACZjB,OAAO,GAAGR,gBAAgB;IAC1BS,MAAM,GAAG,KAAK;IACd,KAAKL,KAAK,CAACsB,KAAK,CAAC,CAAC;EACpB;AACF,CAAC","ignoreList":[]}
|
|
@@ -27,6 +27,25 @@ import { idFactory } from "@buoy-gg/agent-core";
|
|
|
27
27
|
* all the thoughts in a lump at the top would misreport it.
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
/**
|
|
31
|
+
* A message typed while a turn was running.
|
|
32
|
+
*
|
|
33
|
+
* A list with ids, not a string: the single slot it replaced OVERWROTE — type
|
|
34
|
+
* two things mid-turn and the first vanished, which is precisely the loss the
|
|
35
|
+
* queue exists to prevent. Ids so two identical requests stay distinguishable
|
|
36
|
+
* and the list can be edited by row.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The one word every component reads to know what the chat is doing.
|
|
41
|
+
*
|
|
42
|
+
* Presentation state (minimised, settings open) is NOT in here on purpose —
|
|
43
|
+
* it sits on top. This exists because the header, the composer, the queue
|
|
44
|
+
* flush and the modal each used to derive their own answer from five
|
|
45
|
+
* overlapping booleans, and disagreed: the queue fired after an error because
|
|
46
|
+
* "not busy" looked like "idle" to it.
|
|
47
|
+
*/
|
|
48
|
+
|
|
30
49
|
/**
|
|
31
50
|
* Message ids carry this run's token — see agent-core's `runId`. A plain `m1`
|
|
32
51
|
* collided head-on with the `m1` in a restored transcript, and the message
|
|
@@ -49,16 +68,21 @@ function encodeParams(params) {
|
|
|
49
68
|
return undefined;
|
|
50
69
|
}
|
|
51
70
|
}
|
|
71
|
+
|
|
72
|
+
/** Queue ids carry the run token too — a restored queue keys on them. */
|
|
73
|
+
const nextQueuedId = idFactory("q");
|
|
52
74
|
let state = {
|
|
53
75
|
messages: [],
|
|
54
76
|
busy: false,
|
|
77
|
+
stopping: false,
|
|
55
78
|
pending: null,
|
|
56
79
|
notice: null,
|
|
57
80
|
configured: false,
|
|
58
81
|
answers: {},
|
|
59
82
|
awaitingBlockId: null,
|
|
60
83
|
actionState: {},
|
|
61
|
-
queued:
|
|
84
|
+
queued: [],
|
|
85
|
+
draft: null,
|
|
62
86
|
usage: {
|
|
63
87
|
input: 0,
|
|
64
88
|
output: 0,
|
|
@@ -149,10 +173,58 @@ export const askBuoyStore = {
|
|
|
149
173
|
busy: true
|
|
150
174
|
});
|
|
151
175
|
},
|
|
152
|
-
/** Park a message typed mid-turn
|
|
153
|
-
|
|
176
|
+
/** Park a message typed mid-turn, behind whatever is already parked. */
|
|
177
|
+
enqueue(text) {
|
|
178
|
+
const item = {
|
|
179
|
+
id: nextQueuedId(),
|
|
180
|
+
text
|
|
181
|
+
};
|
|
182
|
+
set({
|
|
183
|
+
queued: [...state.queued, item]
|
|
184
|
+
});
|
|
185
|
+
return item;
|
|
186
|
+
},
|
|
187
|
+
/** Drop one parked message — the ✕ on its row. */
|
|
188
|
+
removeQueued(id) {
|
|
189
|
+
if (!state.queued.some(q => q.id === id)) return;
|
|
190
|
+
set({
|
|
191
|
+
queued: state.queued.filter(q => q.id !== id)
|
|
192
|
+
});
|
|
193
|
+
},
|
|
194
|
+
/** Take the FIRST parked message off the queue — the flush path. */
|
|
195
|
+
shiftQueued() {
|
|
196
|
+
const [next, ...rest] = state.queued;
|
|
197
|
+
if (!next) return undefined;
|
|
198
|
+
set({
|
|
199
|
+
queued: rest
|
|
200
|
+
});
|
|
201
|
+
return next;
|
|
202
|
+
},
|
|
203
|
+
/** Hand one parked message back to the composer to edit. See `draft`. */
|
|
204
|
+
takeQueuedToDraft(id) {
|
|
205
|
+
const item = state.queued.find(q => q.id === id);
|
|
206
|
+
if (!item) return;
|
|
207
|
+
set({
|
|
208
|
+
queued: state.queued.filter(q => q.id !== id),
|
|
209
|
+
draft: item.text
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
/**
|
|
213
|
+
* The user pressed Stop. The turn is still winding down — the abort is only
|
|
214
|
+
* read between calls — so the phase is `stopping`, not `idle`, until
|
|
215
|
+
* `finishAssistant` lands.
|
|
216
|
+
*/
|
|
217
|
+
requestStop() {
|
|
218
|
+
if (!state.busy || state.stopping) return;
|
|
219
|
+
set({
|
|
220
|
+
stopping: true
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
/** The composer has taken the draft into its input. */
|
|
224
|
+
clearDraft() {
|
|
225
|
+
if (state.draft === null) return;
|
|
154
226
|
set({
|
|
155
|
-
|
|
227
|
+
draft: null
|
|
156
228
|
});
|
|
157
229
|
},
|
|
158
230
|
/** Drop one message — the failed assistant bubble a retry replaces. */
|
|
@@ -204,13 +276,33 @@ export const askBuoyStore = {
|
|
|
204
276
|
* only form a non-developer can actually check.
|
|
205
277
|
*/
|
|
206
278
|
applyEvent(messageId, ev) {
|
|
279
|
+
if (ev.type === "history-trimmed") {
|
|
280
|
+
// Before the answer it affects, so it reads as a caption on the gap
|
|
281
|
+
// rather than as part of the reply.
|
|
282
|
+
const at = state.messages.findIndex(m => m.id === messageId);
|
|
283
|
+
const line = {
|
|
284
|
+
id: nextId(),
|
|
285
|
+
role: "assistant",
|
|
286
|
+
system: true,
|
|
287
|
+
text: `Older messages were trimmed from the agent's memory (${ev.droppedRounds} exchange${ev.droppedRounds === 1 ? "" : "s"}). It may not recall setup from earlier in this chat — the changes bar still lists what is applied.`,
|
|
288
|
+
toolCalls: [],
|
|
289
|
+
blocks: [],
|
|
290
|
+
endedAt: Date.now()
|
|
291
|
+
};
|
|
292
|
+
const next = [...state.messages];
|
|
293
|
+
next.splice(at < 0 ? next.length : at, 0, line);
|
|
294
|
+
set({
|
|
295
|
+
messages: next
|
|
296
|
+
});
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
207
299
|
const messages = state.messages.map(m => {
|
|
208
300
|
if (m.id !== messageId) return m;
|
|
209
301
|
switch (ev.type) {
|
|
210
302
|
case "text":
|
|
211
303
|
return {
|
|
212
304
|
...m,
|
|
213
|
-
text: m.breakBeforeNextText && m.text ? `${m.text.trimEnd()}\n\n${ev.delta}` : m.text + ev.delta,
|
|
305
|
+
text: (m.breakBeforeNextText || ev.breakBefore) && m.text ? `${m.text.trimEnd()}\n\n${ev.delta}` : m.text + ev.delta,
|
|
214
306
|
breakBeforeNextText: false
|
|
215
307
|
};
|
|
216
308
|
case "reasoning":
|
|
@@ -243,7 +335,7 @@ export const askBuoyStore = {
|
|
|
243
335
|
breakBeforeNextText: true,
|
|
244
336
|
toolCalls: m.toolCalls.map(c => c.id === ev.id ? {
|
|
245
337
|
...c,
|
|
246
|
-
status: !ev.ok && ev.summary === "refused" ? "refused" : ev.ok ? "ok" : "failed",
|
|
338
|
+
status: !ev.ok && ev.summary === "refused" ? "refused" : !ev.ok && ev.summary === "declined" ? "declined" : !ev.ok && ev.summary === "stopped" ? "stopped" : ev.ok ? "ok" : "failed",
|
|
247
339
|
summary: ev.summary,
|
|
248
340
|
durationMs: ev.durationMs,
|
|
249
341
|
result: ev.result
|
|
@@ -293,6 +385,15 @@ export const askBuoyStore = {
|
|
|
293
385
|
} : {})
|
|
294
386
|
});
|
|
295
387
|
},
|
|
388
|
+
/** The user pressed Stop on this turn. See `ChatMessage.stopped`. */
|
|
389
|
+
markStopped(messageId) {
|
|
390
|
+
set({
|
|
391
|
+
messages: state.messages.map(m => m.id === messageId ? {
|
|
392
|
+
...m,
|
|
393
|
+
stopped: true
|
|
394
|
+
} : m)
|
|
395
|
+
});
|
|
396
|
+
},
|
|
296
397
|
finishAssistant(messageId) {
|
|
297
398
|
set({
|
|
298
399
|
messages: state.messages.map(m => m.id === messageId ? {
|
|
@@ -300,7 +401,8 @@ export const askBuoyStore = {
|
|
|
300
401
|
streaming: false,
|
|
301
402
|
endedAt: Date.now()
|
|
302
403
|
} : m),
|
|
303
|
-
busy: false
|
|
404
|
+
busy: false,
|
|
405
|
+
stopping: false
|
|
304
406
|
});
|
|
305
407
|
},
|
|
306
408
|
askApproval(input) {
|
|
@@ -320,6 +422,49 @@ export const askBuoyStore = {
|
|
|
320
422
|
});
|
|
321
423
|
pending?.resolve(approved);
|
|
322
424
|
},
|
|
425
|
+
/**
|
|
426
|
+
* Put an unanswered approval back after a restart.
|
|
427
|
+
*
|
|
428
|
+
* A question the app asked and then forgot is worse than not asking: the
|
|
429
|
+
* user tapped nothing, so as far as they are concerned the change is still
|
|
430
|
+
* waiting for them. `resolve` is a no-op because nothing is waiting on this
|
|
431
|
+
* one any more; `restored` is what tells the sheet to run the call rather
|
|
432
|
+
* than answer a dead promise.
|
|
433
|
+
*
|
|
434
|
+
* Refused once a turn is under way, for the same reason `hydrate` is: a slow
|
|
435
|
+
* disk read must not shove an old question in front of a live conversation.
|
|
436
|
+
*/
|
|
437
|
+
restorePending(input) {
|
|
438
|
+
if (state.pending || state.busy) return false;
|
|
439
|
+
set({
|
|
440
|
+
pending: {
|
|
441
|
+
...input,
|
|
442
|
+
restored: true,
|
|
443
|
+
resolve: () => {}
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
return true;
|
|
447
|
+
},
|
|
448
|
+
/**
|
|
449
|
+
* A line in the transcript from Buoy itself rather than from the model.
|
|
450
|
+
*
|
|
451
|
+
* It wears the assistant's bubble because that is the only shape the list
|
|
452
|
+
* renders, but nothing is sent to the model and nothing lands in its
|
|
453
|
+
* history — it exists so an approval answered after a restart leaves a
|
|
454
|
+
* trace, instead of the card silently vanishing a second time.
|
|
455
|
+
*/
|
|
456
|
+
addNote(text) {
|
|
457
|
+
set({
|
|
458
|
+
messages: [...state.messages, {
|
|
459
|
+
id: nextId(),
|
|
460
|
+
role: "assistant",
|
|
461
|
+
text,
|
|
462
|
+
toolCalls: [],
|
|
463
|
+
blocks: [],
|
|
464
|
+
endedAt: Date.now()
|
|
465
|
+
}]
|
|
466
|
+
});
|
|
467
|
+
},
|
|
323
468
|
/**
|
|
324
469
|
* Put a saved conversation back, once, at open.
|
|
325
470
|
*
|
|
@@ -329,9 +474,13 @@ export const askBuoyStore = {
|
|
|
329
474
|
hydrate(input) {
|
|
330
475
|
if (state.messages.length > 0 || state.busy) return false;
|
|
331
476
|
set({
|
|
332
|
-
messages: input.messages
|
|
477
|
+
messages: input.messages.map(m => ({
|
|
478
|
+
...m,
|
|
479
|
+
restored: true
|
|
480
|
+
})),
|
|
333
481
|
answers: input.answers,
|
|
334
|
-
usage: input.usage
|
|
482
|
+
usage: input.usage,
|
|
483
|
+
queued: input.queued ?? []
|
|
335
484
|
});
|
|
336
485
|
return true;
|
|
337
486
|
},
|
|
@@ -342,12 +491,14 @@ export const askBuoyStore = {
|
|
|
342
491
|
set({
|
|
343
492
|
messages: [],
|
|
344
493
|
busy: false,
|
|
494
|
+
stopping: false,
|
|
345
495
|
pending: null,
|
|
346
496
|
notice: null,
|
|
347
497
|
answers: {},
|
|
348
498
|
awaitingBlockId: null,
|
|
349
499
|
actionState: {},
|
|
350
|
-
queued:
|
|
500
|
+
queued: [],
|
|
501
|
+
draft: null,
|
|
351
502
|
usage: {
|
|
352
503
|
input: 0,
|
|
353
504
|
output: 0,
|
|
@@ -358,4 +509,33 @@ export const askBuoyStore = {
|
|
|
358
509
|
});
|
|
359
510
|
}
|
|
360
511
|
};
|
|
512
|
+
|
|
513
|
+
/** See TurnPhase. Pure, so every component and the flush effect agree. */
|
|
514
|
+
export function turnPhaseOf(s) {
|
|
515
|
+
if (s.pending) return "awaitingApproval";
|
|
516
|
+
if (s.busy) return s.stopping ? "stopping" : "running";
|
|
517
|
+
if (s.awaitingBlockId) return "awaitingAnswer";
|
|
518
|
+
return "idle";
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Why parked messages are NOT being sent right now, in the user's words — or
|
|
523
|
+
* null when the queue may deliver.
|
|
524
|
+
*
|
|
525
|
+
* A queued message is a next TASK, not an answer. It used to go the moment
|
|
526
|
+
* `busy` dropped: after an error it fired into the same dead connection, and
|
|
527
|
+
* with a choice block open it was sent as the reply to the question. So the
|
|
528
|
+
* queue holds on error, Stop, an approval and an unanswered Ask block, and
|
|
529
|
+
* says which.
|
|
530
|
+
*/
|
|
531
|
+
export function queuePauseReason(s) {
|
|
532
|
+
const phase = turnPhaseOf(s);
|
|
533
|
+
if (phase === "running" || phase === "stopping") return null;
|
|
534
|
+
if (phase === "awaitingApproval") return "Paused — answer the approval above first.";
|
|
535
|
+
if (phase === "awaitingAnswer") return "Paused — answer the question above first.";
|
|
536
|
+
const last = s.messages[s.messages.length - 1];
|
|
537
|
+
if (last?.role === "assistant" && last.error) return "Paused — the last turn failed.";
|
|
538
|
+
if (last?.role === "assistant" && last.stopped) return "Paused — you stopped the last turn.";
|
|
539
|
+
return null;
|
|
540
|
+
}
|
|
361
541
|
//# sourceMappingURL=askBuoyStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["idFactory","nextId","MAX_PARAM_CHARS","encodeParams","params","Object","keys","length","undefined","json","JSON","stringify","slice","state","messages","busy","pending","notice","configured","answers","awaitingBlockId","actionState","queued","usage","input","output","requests","meta","listeners","Set","ledgerRef","heldSession","set","next","fn","askBuoyStore","getState","subscribe","add","delete","setLedger","ledger","getLedger","holdSession","session","signature","getHeldSession","setNotice","setConfigured","setMeta","same","every","k","addUser","text","id","role","toolCalls","blocks","beginTurn","setQueued","removeMessage","filter","m","recordAnswer","answer","blockId","setActionState","key","value","startAssistant","streaming","startedAt","Date","now","applyEvent","messageId","ev","map","type","breakBeforeNextText","trimEnd","delta","reasoning","afterCalls","toolId","action","label","description","status","effect","c","ok","summary","durationMs","result","block","forToolCallId","error","message","finishAssistant","endedAt","askApproval","Promise","resolve","answerApproval","approved","hydrate","reset"],"sourceRoot":"../../../src","sources":["store/askBuoyStore.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["idFactory","nextId","MAX_PARAM_CHARS","encodeParams","params","Object","keys","length","undefined","json","JSON","stringify","slice","nextQueuedId","state","messages","busy","stopping","pending","notice","configured","answers","awaitingBlockId","actionState","queued","draft","usage","input","output","requests","meta","listeners","Set","ledgerRef","heldSession","set","next","fn","askBuoyStore","getState","subscribe","add","delete","setLedger","ledger","getLedger","holdSession","session","signature","getHeldSession","setNotice","setConfigured","setMeta","same","every","k","addUser","text","id","role","toolCalls","blocks","beginTurn","enqueue","item","removeQueued","some","q","filter","shiftQueued","rest","takeQueuedToDraft","find","requestStop","clearDraft","removeMessage","m","recordAnswer","answer","blockId","setActionState","key","value","startAssistant","streaming","startedAt","Date","now","applyEvent","messageId","ev","type","at","findIndex","line","system","droppedRounds","endedAt","splice","map","breakBeforeNextText","breakBefore","trimEnd","delta","reasoning","afterCalls","toolId","action","label","description","status","effect","c","ok","summary","durationMs","result","block","forToolCallId","error","message","markStopped","stopped","finishAssistant","askApproval","Promise","resolve","answerApproval","approved","restorePending","restored","addNote","hydrate","reset","turnPhaseOf","s","queuePauseReason","phase","last"],"sourceRoot":"../../../src","sources":["store/askBuoyStore.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Where each block of a turn is drawn: inside a step row, after the prose as
|
|
5
|
+
* the answer itself, or last of all as the thing being asked.
|
|
6
|
+
*
|
|
7
|
+
* Pure and separate from MessageList because the rule is subtle and the cost
|
|
8
|
+
* of getting it wrong is silent — a block that lands in no bucket renders
|
|
9
|
+
* nowhere at all, and nothing in the UI says so. That is exactly what
|
|
10
|
+
* happened: "show me the shop as pictures" built its imageGrid, the engine
|
|
11
|
+
* accepted it, and the sheet dropped it on the floor twice while the model
|
|
12
|
+
* narrated the artwork in prose.
|
|
13
|
+
*/
|
|
14
|
+
import { isAskBlock } from "@buoy-gg/agent-core";
|
|
15
|
+
/**
|
|
16
|
+
* A receipt that belongs inside its step row rather than in the answer: it
|
|
17
|
+
* came from a tool call, and it reports what was READ, not what was changed.
|
|
18
|
+
*
|
|
19
|
+
* ONLY a receipt nests, which is why this tests for the receipt provenances
|
|
20
|
+
* rather than for "not changed". A model-authored block (`buoy_ui`, source
|
|
21
|
+
* "model") also carries the id of the call that produced it — but `buoy_ui`
|
|
22
|
+
* emits no activity row, so there was no step for it to nest under.
|
|
23
|
+
*/
|
|
24
|
+
function nestsUnderStep({
|
|
25
|
+
block,
|
|
26
|
+
forToolCallId
|
|
27
|
+
}) {
|
|
28
|
+
if (!forToolCallId) return false;
|
|
29
|
+
const source = "source" in block ? block.source : undefined;
|
|
30
|
+
return source === "live" || source === "mocked";
|
|
31
|
+
}
|
|
32
|
+
export function placeBlocks(blocks, stepIds) {
|
|
33
|
+
const steps = new Set(stepIds);
|
|
34
|
+
const nested = new Map();
|
|
35
|
+
const afterText = [];
|
|
36
|
+
const ask = [];
|
|
37
|
+
for (const placed of blocks) {
|
|
38
|
+
if (isAskBlock(placed.block)) {
|
|
39
|
+
ask.push(placed);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
// A block may only nest under a step that actually has a row. Anything
|
|
43
|
+
// pointing at a call the activity list never drew renders with the answer
|
|
44
|
+
// — never nowhere.
|
|
45
|
+
if (nestsUnderStep(placed) && steps.has(placed.forToolCallId)) {
|
|
46
|
+
const list = nested.get(placed.forToolCallId) ?? [];
|
|
47
|
+
list.push(placed.block);
|
|
48
|
+
nested.set(placed.forToolCallId, list);
|
|
49
|
+
} else {
|
|
50
|
+
afterText.push(placed);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
nested,
|
|
55
|
+
afterText,
|
|
56
|
+
ask
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=blockPlacement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isAskBlock","nestsUnderStep","block","forToolCallId","source","undefined","placeBlocks","blocks","stepIds","steps","Set","nested","Map","afterText","ask","placed","push","has","list","get","set"],"sourceRoot":"../../../src","sources":["store/blockPlacement.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,UAAU,QAAoB,qBAAqB;AAoB5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,cAAcA,CAAC;EAAEC,KAAK;EAAEC;AAA2B,CAAC,EAAW;EACtE,IAAI,CAACA,aAAa,EAAE,OAAO,KAAK;EAChC,MAAMC,MAAM,GAAG,QAAQ,IAAIF,KAAK,GAAGA,KAAK,CAACE,MAAM,GAAGC,SAAS;EAC3D,OAAOD,MAAM,KAAK,MAAM,IAAIA,MAAM,KAAK,QAAQ;AACjD;AAEA,OAAO,SAASE,WAAWA,CAACC,MAAqB,EAAEC,OAAyB,EAAkB;EAC5F,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAACF,OAAO,CAAC;EAC9B,MAAMG,MAAM,GAAG,IAAIC,GAAG,CAAkB,CAAC;EACzC,MAAMC,SAAwB,GAAG,EAAE;EACnC,MAAMC,GAAkB,GAAG,EAAE;EAE7B,KAAK,MAAMC,MAAM,IAAIR,MAAM,EAAE;IAC3B,IAAIP,UAAU,CAACe,MAAM,CAACb,KAAK,CAAC,EAAE;MAC5BY,GAAG,CAACE,IAAI,CAACD,MAAM,CAAC;MAChB;IACF;IACA;IACA;IACA;IACA,IAAId,cAAc,CAACc,MAAM,CAAC,IAAIN,KAAK,CAACQ,GAAG,CAACF,MAAM,CAACZ,aAAc,CAAC,EAAE;MAC9D,MAAMe,IAAI,GAAGP,MAAM,CAACQ,GAAG,CAACJ,MAAM,CAACZ,aAAc,CAAC,IAAI,EAAE;MACpDe,IAAI,CAACF,IAAI,CAACD,MAAM,CAACb,KAAK,CAAC;MACvBS,MAAM,CAACS,GAAG,CAACL,MAAM,CAACZ,aAAa,EAAGe,IAAI,CAAC;IACzC,CAAC,MAAM;MACLL,SAAS,CAACG,IAAI,CAACD,MAAM,CAAC;IACxB;EACF;EAEA,OAAO;IAAEJ,MAAM;IAAEE,SAAS;IAAEC;EAAI,CAAC;AACnC","ignoreList":[]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The bug this file exists for: a model-authored block carries the id of the
|
|
5
|
+
* `buoy_ui` call that made it, `buoy_ui` never draws an activity row, and the
|
|
6
|
+
* nesting rule ("anything from a call, unless it's a write receipt") swept it
|
|
7
|
+
* into a bucket keyed by a row that does not exist. Two consecutive asks for
|
|
8
|
+
* pictures of a shop came back as prose.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, expect, it } from "vitest";
|
|
11
|
+
import { placeBlocks } from "./blockPlacement";
|
|
12
|
+
const placed = (b, forToolCallId) => ({
|
|
13
|
+
block: b,
|
|
14
|
+
forToolCallId
|
|
15
|
+
});
|
|
16
|
+
const grid = (id = "ui1") => placed({
|
|
17
|
+
id,
|
|
18
|
+
kind: "imageGrid",
|
|
19
|
+
source: "model",
|
|
20
|
+
images: [{
|
|
21
|
+
url: "https://cdn.example.com/25.png",
|
|
22
|
+
alt: "Pikachu"
|
|
23
|
+
}]
|
|
24
|
+
}, "call-ui");
|
|
25
|
+
describe("model-authored blocks", () => {
|
|
26
|
+
it("renders in the answer, never nested under a step that has no row", () => {
|
|
27
|
+
const {
|
|
28
|
+
afterText,
|
|
29
|
+
nested
|
|
30
|
+
} = placeBlocks([grid()], ["c1"]);
|
|
31
|
+
expect(afterText.map(p => p.block.id)).toEqual(["ui1"]);
|
|
32
|
+
expect(nested.size).toBe(0);
|
|
33
|
+
});
|
|
34
|
+
it("still renders even when a step with that id somehow exists", () => {
|
|
35
|
+
const {
|
|
36
|
+
afterText
|
|
37
|
+
} = placeBlocks([grid()], ["call-ui"]);
|
|
38
|
+
expect(afterText.map(p => p.block.id)).toEqual(["ui1"]);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("receipts", () => {
|
|
42
|
+
it("folds a read receipt into its own step row", () => {
|
|
43
|
+
const read = placed({
|
|
44
|
+
id: "r1",
|
|
45
|
+
kind: "keyValue",
|
|
46
|
+
source: "live",
|
|
47
|
+
pairs: []
|
|
48
|
+
}, "c1");
|
|
49
|
+
const {
|
|
50
|
+
nested,
|
|
51
|
+
afterText
|
|
52
|
+
} = placeBlocks([read], ["c1"]);
|
|
53
|
+
expect(afterText).toEqual([]);
|
|
54
|
+
expect(nested.get("c1")?.map(b => b.id)).toEqual(["r1"]);
|
|
55
|
+
});
|
|
56
|
+
it("keeps a write receipt afterText — the user must see it without asking", () => {
|
|
57
|
+
const write = placed({
|
|
58
|
+
id: "w1",
|
|
59
|
+
kind: "diff",
|
|
60
|
+
source: "changed",
|
|
61
|
+
changes: []
|
|
62
|
+
}, "c1");
|
|
63
|
+
const {
|
|
64
|
+
nested,
|
|
65
|
+
afterText
|
|
66
|
+
} = placeBlocks([write], ["c1"]);
|
|
67
|
+
expect(nested.size).toBe(0);
|
|
68
|
+
expect(afterText.map(p => p.block.id)).toEqual(["w1"]);
|
|
69
|
+
});
|
|
70
|
+
it("falls back to afterText when its step row was never drawn", () => {
|
|
71
|
+
const orphan = placed({
|
|
72
|
+
id: "r2",
|
|
73
|
+
kind: "keyValue",
|
|
74
|
+
source: "live",
|
|
75
|
+
pairs: []
|
|
76
|
+
}, "gone");
|
|
77
|
+
const {
|
|
78
|
+
afterText
|
|
79
|
+
} = placeBlocks([orphan], []);
|
|
80
|
+
expect(afterText.map(p => p.block.id)).toEqual(["r2"]);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("ask blocks", () => {
|
|
84
|
+
it("come out in their own bucket, after the answer", () => {
|
|
85
|
+
const confirm = placed({
|
|
86
|
+
id: "a1",
|
|
87
|
+
kind: "confirm",
|
|
88
|
+
source: "model",
|
|
89
|
+
change: "Wipe storage"
|
|
90
|
+
}, "call-ui");
|
|
91
|
+
const {
|
|
92
|
+
ask,
|
|
93
|
+
afterText,
|
|
94
|
+
nested
|
|
95
|
+
} = placeBlocks([confirm, grid("ui2")], ["c1"]);
|
|
96
|
+
expect(ask.map(p => p.block.id)).toEqual(["a1"]);
|
|
97
|
+
expect(afterText.map(p => p.block.id)).toEqual(["ui2"]);
|
|
98
|
+
expect(nested.size).toBe(0);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The order the transcript draws these in, asserted here rather than left to
|
|
104
|
+
* MessageList's JSX.
|
|
105
|
+
*
|
|
106
|
+
* Off a real device: "show me all the pokemon from our poke mart shop". The
|
|
107
|
+
* agent navigated to /shop, paged through 28 menu items and built the grid —
|
|
108
|
+
* and the grid rendered at the TOP of the bubble with five paragraphs of
|
|
109
|
+
* narration beneath it, so the finished answer arrived before the sentence
|
|
110
|
+
* introducing it. The bucket is named for its position so a future edit has
|
|
111
|
+
* to contradict the name to put it back.
|
|
112
|
+
*/
|
|
113
|
+
describe("the answer comes after the prose", () => {
|
|
114
|
+
it("puts a model-authored card in the after-text bucket, never before it", () => {
|
|
115
|
+
const placed = placeBlocks([grid()], ["c1"]);
|
|
116
|
+
expect(placed.afterText.map(p => p.block.id)).toEqual(["ui1"]);
|
|
117
|
+
// `nested` is the only bucket that draws ABOVE the text (inside the
|
|
118
|
+
// activity card's step rows), and only read receipts belong there.
|
|
119
|
+
expect(placed.nested.size).toBe(0);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=blockPlacement.test.js.map
|