@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.
Files changed (217) hide show
  1. package/README.md +35 -8
  2. package/lib/commonjs/blocks/BlockRenderer.js +13 -1
  3. package/lib/commonjs/blocks/BlockRenderer.js.map +1 -1
  4. package/lib/commonjs/blocks/DataBlocks.js +126 -33
  5. package/lib/commonjs/blocks/DataBlocks.js.map +1 -1
  6. package/lib/commonjs/blocks/ExtraBlocks.js +12 -6
  7. package/lib/commonjs/blocks/ExtraBlocks.js.map +1 -1
  8. package/lib/commonjs/blocks/MediaBlocks.js +22 -6
  9. package/lib/commonjs/blocks/MediaBlocks.js.map +1 -1
  10. package/lib/commonjs/blocks/blockText.js +60 -0
  11. package/lib/commonjs/blocks/blockText.js.map +1 -0
  12. package/lib/commonjs/blocks/blockText.test.js +53 -0
  13. package/lib/commonjs/blocks/blockText.test.js.map +1 -0
  14. package/lib/commonjs/blocks/primitives.js +58 -2
  15. package/lib/commonjs/blocks/primitives.js.map +1 -1
  16. package/lib/commonjs/components/ApprovalCard.js +111 -7
  17. package/lib/commonjs/components/ApprovalCard.js.map +1 -1
  18. package/lib/commonjs/components/AskBuoyHeader.js +36 -4
  19. package/lib/commonjs/components/AskBuoyHeader.js.map +1 -1
  20. package/lib/commonjs/components/AskBuoyModal.js +160 -34
  21. package/lib/commonjs/components/AskBuoyModal.js.map +1 -1
  22. package/lib/commonjs/components/AskBuoySettings.js +50 -0
  23. package/lib/commonjs/components/AskBuoySettings.js.map +1 -1
  24. package/lib/commonjs/components/Composer.js +94 -14
  25. package/lib/commonjs/components/Composer.js.map +1 -1
  26. package/lib/commonjs/components/EmptyState.js +12 -5
  27. package/lib/commonjs/components/EmptyState.js.map +1 -1
  28. package/lib/commonjs/components/KeyboardPad.js +80 -0
  29. package/lib/commonjs/components/KeyboardPad.js.map +1 -0
  30. package/lib/commonjs/components/Markdown.js +148 -90
  31. package/lib/commonjs/components/Markdown.js.map +1 -1
  32. package/lib/commonjs/components/MessageList.js +339 -92
  33. package/lib/commonjs/components/MessageList.js.map +1 -1
  34. package/lib/commonjs/components/QueuedMessages.js +145 -0
  35. package/lib/commonjs/components/QueuedMessages.js.map +1 -0
  36. package/lib/commonjs/components/markdownParse.js +131 -0
  37. package/lib/commonjs/components/markdownParse.js.map +1 -0
  38. package/lib/commonjs/components/markdownParse.test.js +99 -0
  39. package/lib/commonjs/components/markdownParse.test.js.map +1 -0
  40. package/lib/commonjs/store/activityGroups.js +110 -0
  41. package/lib/commonjs/store/activityGroups.js.map +1 -0
  42. package/lib/commonjs/store/activityGroups.test.js +78 -0
  43. package/lib/commonjs/store/activityGroups.test.js.map +1 -0
  44. package/lib/commonjs/store/askBuoySettings.js +7 -2
  45. package/lib/commonjs/store/askBuoySettings.js.map +1 -1
  46. package/lib/commonjs/store/askBuoyStore.js +192 -10
  47. package/lib/commonjs/store/askBuoyStore.js.map +1 -1
  48. package/lib/commonjs/store/blockPlacement.js +64 -0
  49. package/lib/commonjs/store/blockPlacement.js.map +1 -0
  50. package/lib/commonjs/store/blockPlacement.test.js +123 -0
  51. package/lib/commonjs/store/blockPlacement.test.js.map +1 -0
  52. package/lib/commonjs/store/queue.test.js +150 -0
  53. package/lib/commonjs/store/queue.test.js.map +1 -0
  54. package/lib/commonjs/store/resetConversation.js +77 -0
  55. package/lib/commonjs/store/resetConversation.js.map +1 -0
  56. package/lib/commonjs/store/restorePending.test.js +63 -0
  57. package/lib/commonjs/store/restorePending.test.js.map +1 -0
  58. package/lib/commonjs/store/suggestions.js +54 -0
  59. package/lib/commonjs/store/suggestions.js.map +1 -0
  60. package/lib/commonjs/store/suggestions.test.js +58 -0
  61. package/lib/commonjs/store/suggestions.test.js.map +1 -0
  62. package/lib/commonjs/store/systemLine.test.js +77 -0
  63. package/lib/commonjs/store/systemLine.test.js.map +1 -0
  64. package/lib/commonjs/store/ticketPrompt.js +17 -0
  65. package/lib/commonjs/store/ticketPrompt.js.map +1 -0
  66. package/lib/commonjs/store/transcriptPersistence.js +92 -3
  67. package/lib/commonjs/store/transcriptPersistence.js.map +1 -1
  68. package/lib/commonjs/store/transcriptPersistence.test.js +148 -0
  69. package/lib/commonjs/store/transcriptPersistence.test.js.map +1 -1
  70. package/lib/commonjs/store/turnRendering.test.js +151 -0
  71. package/lib/commonjs/store/turnRendering.test.js.map +1 -0
  72. package/lib/commonjs/store/useAskBuoy.js +271 -49
  73. package/lib/commonjs/store/useAskBuoy.js.map +1 -1
  74. package/lib/commonjs/sync/askBuoySyncAdapter.js +25 -4
  75. package/lib/commonjs/sync/askBuoySyncAdapter.js.map +1 -1
  76. package/lib/module/blocks/BlockRenderer.js +13 -1
  77. package/lib/module/blocks/BlockRenderer.js.map +1 -1
  78. package/lib/module/blocks/DataBlocks.js +128 -35
  79. package/lib/module/blocks/DataBlocks.js.map +1 -1
  80. package/lib/module/blocks/ExtraBlocks.js +12 -6
  81. package/lib/module/blocks/ExtraBlocks.js.map +1 -1
  82. package/lib/module/blocks/MediaBlocks.js +22 -6
  83. package/lib/module/blocks/MediaBlocks.js.map +1 -1
  84. package/lib/module/blocks/blockText.js +55 -0
  85. package/lib/module/blocks/blockText.js.map +1 -0
  86. package/lib/module/blocks/blockText.test.js +53 -0
  87. package/lib/module/blocks/blockText.test.js.map +1 -0
  88. package/lib/module/blocks/primitives.js +58 -2
  89. package/lib/module/blocks/primitives.js.map +1 -1
  90. package/lib/module/components/ApprovalCard.js +113 -9
  91. package/lib/module/components/ApprovalCard.js.map +1 -1
  92. package/lib/module/components/AskBuoyHeader.js +37 -5
  93. package/lib/module/components/AskBuoyHeader.js.map +1 -1
  94. package/lib/module/components/AskBuoyModal.js +163 -37
  95. package/lib/module/components/AskBuoyModal.js.map +1 -1
  96. package/lib/module/components/AskBuoySettings.js +52 -2
  97. package/lib/module/components/AskBuoySettings.js.map +1 -1
  98. package/lib/module/components/Composer.js +95 -15
  99. package/lib/module/components/Composer.js.map +1 -1
  100. package/lib/module/components/EmptyState.js +12 -5
  101. package/lib/module/components/EmptyState.js.map +1 -1
  102. package/lib/module/components/KeyboardPad.js +75 -0
  103. package/lib/module/components/KeyboardPad.js.map +1 -0
  104. package/lib/module/components/Markdown.js +149 -90
  105. package/lib/module/components/Markdown.js.map +1 -1
  106. package/lib/module/components/MessageList.js +341 -94
  107. package/lib/module/components/MessageList.js.map +1 -1
  108. package/lib/module/components/QueuedMessages.js +140 -0
  109. package/lib/module/components/QueuedMessages.js.map +1 -0
  110. package/lib/module/components/markdownParse.js +125 -0
  111. package/lib/module/components/markdownParse.js.map +1 -0
  112. package/lib/module/components/markdownParse.test.js +98 -0
  113. package/lib/module/components/markdownParse.test.js.map +1 -0
  114. package/lib/module/store/activityGroups.js +103 -0
  115. package/lib/module/store/activityGroups.js.map +1 -0
  116. package/lib/module/store/activityGroups.test.js +77 -0
  117. package/lib/module/store/activityGroups.test.js.map +1 -0
  118. package/lib/module/store/askBuoySettings.js +7 -2
  119. package/lib/module/store/askBuoySettings.js.map +1 -1
  120. package/lib/module/store/askBuoyStore.js +190 -10
  121. package/lib/module/store/askBuoyStore.js.map +1 -1
  122. package/lib/module/store/blockPlacement.js +59 -0
  123. package/lib/module/store/blockPlacement.js.map +1 -0
  124. package/lib/module/store/blockPlacement.test.js +122 -0
  125. package/lib/module/store/blockPlacement.test.js.map +1 -0
  126. package/lib/module/store/queue.test.js +149 -0
  127. package/lib/module/store/queue.test.js.map +1 -0
  128. package/lib/module/store/resetConversation.js +72 -0
  129. package/lib/module/store/resetConversation.js.map +1 -0
  130. package/lib/module/store/restorePending.test.js +62 -0
  131. package/lib/module/store/restorePending.test.js.map +1 -0
  132. package/lib/module/store/suggestions.js +49 -0
  133. package/lib/module/store/suggestions.js.map +1 -0
  134. package/lib/module/store/suggestions.test.js +57 -0
  135. package/lib/module/store/suggestions.test.js.map +1 -0
  136. package/lib/module/store/systemLine.test.js +76 -0
  137. package/lib/module/store/systemLine.test.js.map +1 -0
  138. package/lib/module/store/ticketPrompt.js +13 -0
  139. package/lib/module/store/ticketPrompt.js.map +1 -0
  140. package/lib/module/store/transcriptPersistence.js +92 -3
  141. package/lib/module/store/transcriptPersistence.js.map +1 -1
  142. package/lib/module/store/transcriptPersistence.test.js +148 -0
  143. package/lib/module/store/transcriptPersistence.test.js.map +1 -1
  144. package/lib/module/store/turnRendering.test.js +150 -0
  145. package/lib/module/store/turnRendering.test.js.map +1 -0
  146. package/lib/module/store/useAskBuoy.js +275 -53
  147. package/lib/module/store/useAskBuoy.js.map +1 -1
  148. package/lib/module/sync/askBuoySyncAdapter.js +25 -4
  149. package/lib/module/sync/askBuoySyncAdapter.js.map +1 -1
  150. package/lib/typescript/blocks/BlockRenderer.d.ts.map +1 -1
  151. package/lib/typescript/blocks/DataBlocks.d.ts +11 -0
  152. package/lib/typescript/blocks/DataBlocks.d.ts.map +1 -1
  153. package/lib/typescript/blocks/ExtraBlocks.d.ts +18 -2
  154. package/lib/typescript/blocks/ExtraBlocks.d.ts.map +1 -1
  155. package/lib/typescript/blocks/MediaBlocks.d.ts.map +1 -1
  156. package/lib/typescript/blocks/blockText.d.ts +14 -0
  157. package/lib/typescript/blocks/blockText.d.ts.map +1 -0
  158. package/lib/typescript/blocks/blockText.test.d.ts +2 -0
  159. package/lib/typescript/blocks/blockText.test.d.ts.map +1 -0
  160. package/lib/typescript/blocks/primitives.d.ts +16 -1
  161. package/lib/typescript/blocks/primitives.d.ts.map +1 -1
  162. package/lib/typescript/components/ApprovalCard.d.ts.map +1 -1
  163. package/lib/typescript/components/AskBuoyHeader.d.ts +31 -1
  164. package/lib/typescript/components/AskBuoyHeader.d.ts.map +1 -1
  165. package/lib/typescript/components/AskBuoyModal.d.ts.map +1 -1
  166. package/lib/typescript/components/AskBuoySettings.d.ts.map +1 -1
  167. package/lib/typescript/components/Composer.d.ts +16 -1
  168. package/lib/typescript/components/Composer.d.ts.map +1 -1
  169. package/lib/typescript/components/EmptyState.d.ts +5 -1
  170. package/lib/typescript/components/EmptyState.d.ts.map +1 -1
  171. package/lib/typescript/components/KeyboardPad.d.ts +33 -0
  172. package/lib/typescript/components/KeyboardPad.d.ts.map +1 -0
  173. package/lib/typescript/components/Markdown.d.ts +0 -10
  174. package/lib/typescript/components/Markdown.d.ts.map +1 -1
  175. package/lib/typescript/components/MessageList.d.ts +7 -2
  176. package/lib/typescript/components/MessageList.d.ts.map +1 -1
  177. package/lib/typescript/components/QueuedMessages.d.ts +10 -0
  178. package/lib/typescript/components/QueuedMessages.d.ts.map +1 -0
  179. package/lib/typescript/components/markdownParse.d.ts +49 -0
  180. package/lib/typescript/components/markdownParse.d.ts.map +1 -0
  181. package/lib/typescript/components/markdownParse.test.d.ts +2 -0
  182. package/lib/typescript/components/markdownParse.test.d.ts.map +1 -0
  183. package/lib/typescript/store/activityGroups.d.ts +29 -0
  184. package/lib/typescript/store/activityGroups.d.ts.map +1 -0
  185. package/lib/typescript/store/activityGroups.test.d.ts +2 -0
  186. package/lib/typescript/store/activityGroups.test.d.ts.map +1 -0
  187. package/lib/typescript/store/askBuoySettings.d.ts +22 -0
  188. package/lib/typescript/store/askBuoySettings.d.ts.map +1 -1
  189. package/lib/typescript/store/askBuoyStore.d.ts +142 -5
  190. package/lib/typescript/store/askBuoyStore.d.ts.map +1 -1
  191. package/lib/typescript/store/blockPlacement.d.ts +30 -0
  192. package/lib/typescript/store/blockPlacement.d.ts.map +1 -0
  193. package/lib/typescript/store/blockPlacement.test.d.ts +2 -0
  194. package/lib/typescript/store/blockPlacement.test.d.ts.map +1 -0
  195. package/lib/typescript/store/queue.test.d.ts +2 -0
  196. package/lib/typescript/store/queue.test.d.ts.map +1 -0
  197. package/lib/typescript/store/resetConversation.d.ts +38 -0
  198. package/lib/typescript/store/resetConversation.d.ts.map +1 -0
  199. package/lib/typescript/store/restorePending.test.d.ts +2 -0
  200. package/lib/typescript/store/restorePending.test.d.ts.map +1 -0
  201. package/lib/typescript/store/suggestions.d.ts +32 -0
  202. package/lib/typescript/store/suggestions.d.ts.map +1 -0
  203. package/lib/typescript/store/suggestions.test.d.ts +2 -0
  204. package/lib/typescript/store/suggestions.test.d.ts.map +1 -0
  205. package/lib/typescript/store/systemLine.test.d.ts +2 -0
  206. package/lib/typescript/store/systemLine.test.d.ts.map +1 -0
  207. package/lib/typescript/store/ticketPrompt.d.ts +11 -0
  208. package/lib/typescript/store/ticketPrompt.d.ts.map +1 -0
  209. package/lib/typescript/store/transcriptPersistence.d.ts +41 -2
  210. package/lib/typescript/store/transcriptPersistence.d.ts.map +1 -1
  211. package/lib/typescript/store/turnRendering.test.d.ts +2 -0
  212. package/lib/typescript/store/turnRendering.test.d.ts.map +1 -0
  213. package/lib/typescript/store/useAskBuoy.d.ts +23 -1
  214. package/lib/typescript/store/useAskBuoy.d.ts.map +1 -1
  215. package/lib/typescript/sync/askBuoySyncAdapter.d.ts +26 -6
  216. package/lib/typescript/sync/askBuoySyncAdapter.d.ts.map +1 -1
  217. 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;AAgBhF,OAAO,MAAMC,gBAAiC,GAAG;EAAEC,YAAY,EAAE;AAAM,CAAC;AAExE,MAAMC,KAAK,GAAGJ,sBAAsB,CAClC,GAAGC,mBAAmB,CAACI,IAAI,oBAAoB,EAC/CH,gBAAgB,EAChB;EACEI,QAAQ,EAAGC,MAAM,KAAM;IAAEJ,YAAY,EAAEI,MAAM,CAACJ,YAAY,KAAK;EAAK,CAAC;AACvE,CACF,CAAC;AAED,IAAIK,OAAwB,GAAGN,gBAAgB;AAC/C,IAAIO,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,GAAGN,gBAAgB;IAC1BO,MAAM,GAAG,KAAK;IACd,KAAKL,KAAK,CAACsB,KAAK,CAAC,CAAC;EACpB;AACF,CAAC","ignoreList":[]}
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: null,
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 instead of silently dropping it. */
153
- setQueued(text) {
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
- queued: text
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: null,
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