@buoy-gg/ask-buoy 7.0.34 → 7.0.35

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 (239) hide show
  1. package/README.md +1 -1
  2. package/lib/commonjs/blocks/AskBlocks.js +338 -1
  3. package/lib/commonjs/blocks/AskBlocks.js.map +1 -0
  4. package/lib/commonjs/blocks/BlockRenderer.js +250 -1
  5. package/lib/commonjs/blocks/BlockRenderer.js.map +1 -0
  6. package/lib/commonjs/blocks/ChromePrototypes.js +514 -1
  7. package/lib/commonjs/blocks/ChromePrototypes.js.map +1 -0
  8. package/lib/commonjs/blocks/DataBlocks.js +688 -1
  9. package/lib/commonjs/blocks/DataBlocks.js.map +1 -0
  10. package/lib/commonjs/blocks/ExtraBlocks.js +1854 -1
  11. package/lib/commonjs/blocks/ExtraBlocks.js.map +1 -0
  12. package/lib/commonjs/blocks/MediaBlocks.js +140 -1
  13. package/lib/commonjs/blocks/MediaBlocks.js.map +1 -0
  14. package/lib/commonjs/blocks/ReceiptBlocks.js +586 -1
  15. package/lib/commonjs/blocks/ReceiptBlocks.js.map +1 -0
  16. package/lib/commonjs/blocks/context.js +42 -1
  17. package/lib/commonjs/blocks/context.js.map +1 -0
  18. package/lib/commonjs/blocks/icons.js +96 -1
  19. package/lib/commonjs/blocks/icons.js.map +1 -0
  20. package/lib/commonjs/blocks/index.js +95 -1
  21. package/lib/commonjs/blocks/index.js.map +1 -0
  22. package/lib/commonjs/blocks/listRow.test.js +55 -0
  23. package/lib/commonjs/blocks/listRow.test.js.map +1 -0
  24. package/lib/commonjs/blocks/pageState.js +34 -0
  25. package/lib/commonjs/blocks/pageState.js.map +1 -0
  26. package/lib/commonjs/blocks/pageState.test.js +57 -0
  27. package/lib/commonjs/blocks/pageState.test.js.map +1 -0
  28. package/lib/commonjs/blocks/primitives.js +401 -1
  29. package/lib/commonjs/blocks/primitives.js.map +1 -0
  30. package/lib/commonjs/blocks/primitivesIndex.js +62 -1
  31. package/lib/commonjs/blocks/primitivesIndex.js.map +1 -0
  32. package/lib/commonjs/components/ApprovalCard.js +140 -1
  33. package/lib/commonjs/components/ApprovalCard.js.map +1 -0
  34. package/lib/commonjs/components/AskBuoyHeader.js +164 -1
  35. package/lib/commonjs/components/AskBuoyHeader.js.map +1 -0
  36. package/lib/commonjs/components/AskBuoyIcon.js +19 -1
  37. package/lib/commonjs/components/AskBuoyIcon.js.map +1 -0
  38. package/lib/commonjs/components/AskBuoyModal.js +353 -1
  39. package/lib/commonjs/components/AskBuoyModal.js.map +1 -0
  40. package/lib/commonjs/components/AskBuoySettings.js +69 -0
  41. package/lib/commonjs/components/AskBuoySettings.js.map +1 -0
  42. package/lib/commonjs/components/ChangesBar.js +211 -1
  43. package/lib/commonjs/components/ChangesBar.js.map +1 -0
  44. package/lib/commonjs/components/Composer.js +175 -1
  45. package/lib/commonjs/components/Composer.js.map +1 -0
  46. package/lib/commonjs/components/EmptyState.js +154 -1
  47. package/lib/commonjs/components/EmptyState.js.map +1 -0
  48. package/lib/commonjs/components/Markdown.js +252 -1
  49. package/lib/commonjs/components/Markdown.js.map +1 -0
  50. package/lib/commonjs/components/MessageList.js +683 -1
  51. package/lib/commonjs/components/MessageList.js.map +1 -0
  52. package/lib/commonjs/components/ThinkingStrip.js +223 -0
  53. package/lib/commonjs/components/ThinkingStrip.js.map +1 -0
  54. package/lib/commonjs/components/TypingDots.js +63 -1
  55. package/lib/commonjs/components/TypingDots.js.map +1 -0
  56. package/lib/commonjs/components/useCopyAction.js +50 -0
  57. package/lib/commonjs/components/useCopyAction.js.map +1 -0
  58. package/lib/commonjs/index.js +252 -1
  59. package/lib/commonjs/index.js.map +1 -0
  60. package/lib/commonjs/preset.js +90 -1
  61. package/lib/commonjs/preset.js.map +1 -0
  62. package/lib/commonjs/store/askBuoySettings.js +67 -0
  63. package/lib/commonjs/store/askBuoySettings.js.map +1 -0
  64. package/lib/commonjs/store/askBuoyStore.js +365 -1
  65. package/lib/commonjs/store/askBuoyStore.js.map +1 -0
  66. package/lib/commonjs/store/restoredIds.test.js +47 -0
  67. package/lib/commonjs/store/restoredIds.test.js.map +1 -0
  68. package/lib/commonjs/store/traceText.js +81 -0
  69. package/lib/commonjs/store/traceText.js.map +1 -0
  70. package/lib/commonjs/store/traceText.test.js +112 -0
  71. package/lib/commonjs/store/traceText.test.js.map +1 -0
  72. package/lib/commonjs/store/transcriptPersistence.js +208 -0
  73. package/lib/commonjs/store/transcriptPersistence.js.map +1 -0
  74. package/lib/commonjs/store/transcriptPersistence.test.js +185 -0
  75. package/lib/commonjs/store/transcriptPersistence.test.js.map +1 -0
  76. package/lib/commonjs/store/useAskBuoy.js +400 -1
  77. package/lib/commonjs/store/useAskBuoy.js.map +1 -0
  78. package/lib/commonjs/store/useAskBuoySettings.js +14 -0
  79. package/lib/commonjs/store/useAskBuoySettings.js.map +1 -0
  80. package/lib/commonjs/sync/askBuoySyncAdapter.js +119 -1
  81. package/lib/commonjs/sync/askBuoySyncAdapter.js.map +1 -0
  82. package/lib/commonjs/sync/askBuoySyncAdapter.test.js +141 -1
  83. package/lib/commonjs/sync/askBuoySyncAdapter.test.js.map +1 -0
  84. package/lib/commonjs/sync/wire.js +58 -1
  85. package/lib/commonjs/sync/wire.js.map +1 -0
  86. package/lib/commonjs/types.js +6 -1
  87. package/lib/commonjs/types.js.map +1 -0
  88. package/lib/module/blocks/AskBlocks.js +331 -1
  89. package/lib/module/blocks/AskBlocks.js.map +1 -0
  90. package/lib/module/blocks/BlockRenderer.js +245 -1
  91. package/lib/module/blocks/BlockRenderer.js.map +1 -0
  92. package/lib/module/blocks/ChromePrototypes.js +503 -1
  93. package/lib/module/blocks/ChromePrototypes.js.map +1 -0
  94. package/lib/module/blocks/DataBlocks.js +674 -1
  95. package/lib/module/blocks/DataBlocks.js.map +1 -0
  96. package/lib/module/blocks/ExtraBlocks.js +1827 -1
  97. package/lib/module/blocks/ExtraBlocks.js.map +1 -0
  98. package/lib/module/blocks/MediaBlocks.js +135 -1
  99. package/lib/module/blocks/MediaBlocks.js.map +1 -0
  100. package/lib/module/blocks/ReceiptBlocks.js +574 -1
  101. package/lib/module/blocks/ReceiptBlocks.js.map +1 -0
  102. package/lib/module/blocks/context.js +35 -1
  103. package/lib/module/blocks/context.js.map +1 -0
  104. package/lib/module/blocks/icons.js +91 -1
  105. package/lib/module/blocks/icons.js.map +1 -0
  106. package/lib/module/blocks/index.js +8 -1
  107. package/lib/module/blocks/index.js.map +1 -0
  108. package/lib/module/blocks/listRow.test.js +56 -0
  109. package/lib/module/blocks/listRow.test.js.map +1 -0
  110. package/lib/module/blocks/pageState.js +30 -0
  111. package/lib/module/blocks/pageState.js.map +1 -0
  112. package/lib/module/blocks/pageState.test.js +56 -0
  113. package/lib/module/blocks/pageState.test.js.map +1 -0
  114. package/lib/module/blocks/primitives.js +389 -1
  115. package/lib/module/blocks/primitives.js.map +1 -0
  116. package/lib/module/blocks/primitivesIndex.js +5 -1
  117. package/lib/module/blocks/primitivesIndex.js.map +1 -0
  118. package/lib/module/components/ApprovalCard.js +135 -1
  119. package/lib/module/components/ApprovalCard.js.map +1 -0
  120. package/lib/module/components/AskBuoyHeader.js +161 -1
  121. package/lib/module/components/AskBuoyHeader.js.map +1 -0
  122. package/lib/module/components/AskBuoyIcon.js +8 -1
  123. package/lib/module/components/AskBuoyIcon.js.map +1 -0
  124. package/lib/module/components/AskBuoyModal.js +348 -1
  125. package/lib/module/components/AskBuoyModal.js.map +1 -0
  126. package/lib/module/components/AskBuoySettings.js +64 -0
  127. package/lib/module/components/AskBuoySettings.js.map +1 -0
  128. package/lib/module/components/ChangesBar.js +206 -1
  129. package/lib/module/components/ChangesBar.js.map +1 -0
  130. package/lib/module/components/Composer.js +170 -1
  131. package/lib/module/components/Composer.js.map +1 -0
  132. package/lib/module/components/EmptyState.js +149 -1
  133. package/lib/module/components/EmptyState.js.map +1 -0
  134. package/lib/module/components/Markdown.js +246 -1
  135. package/lib/module/components/Markdown.js.map +1 -0
  136. package/lib/module/components/MessageList.js +677 -1
  137. package/lib/module/components/MessageList.js.map +1 -0
  138. package/lib/module/components/ThinkingStrip.js +218 -0
  139. package/lib/module/components/ThinkingStrip.js.map +1 -0
  140. package/lib/module/components/TypingDots.js +58 -1
  141. package/lib/module/components/TypingDots.js.map +1 -0
  142. package/lib/module/components/useCopyAction.js +46 -0
  143. package/lib/module/components/useCopyAction.js.map +1 -0
  144. package/lib/module/index.js +34 -1
  145. package/lib/module/index.js.map +1 -0
  146. package/lib/module/preset.js +73 -1
  147. package/lib/module/preset.js.map +1 -0
  148. package/lib/module/store/askBuoySettings.js +62 -0
  149. package/lib/module/store/askBuoySettings.js.map +1 -0
  150. package/lib/module/store/askBuoyStore.js +361 -1
  151. package/lib/module/store/askBuoyStore.js.map +1 -0
  152. package/lib/module/store/restoredIds.test.js +46 -0
  153. package/lib/module/store/restoredIds.test.js.map +1 -0
  154. package/lib/module/store/traceText.js +75 -0
  155. package/lib/module/store/traceText.js.map +1 -0
  156. package/lib/module/store/traceText.test.js +111 -0
  157. package/lib/module/store/traceText.test.js.map +1 -0
  158. package/lib/module/store/transcriptPersistence.js +198 -0
  159. package/lib/module/store/transcriptPersistence.js.map +1 -0
  160. package/lib/module/store/transcriptPersistence.test.js +184 -0
  161. package/lib/module/store/transcriptPersistence.test.js.map +1 -0
  162. package/lib/module/store/useAskBuoy.js +394 -1
  163. package/lib/module/store/useAskBuoy.js.map +1 -0
  164. package/lib/module/store/useAskBuoySettings.js +9 -0
  165. package/lib/module/store/useAskBuoySettings.js.map +1 -0
  166. package/lib/module/sync/askBuoySyncAdapter.js +114 -1
  167. package/lib/module/sync/askBuoySyncAdapter.js.map +1 -0
  168. package/lib/module/sync/askBuoySyncAdapter.test.js +140 -1
  169. package/lib/module/sync/askBuoySyncAdapter.test.js.map +1 -0
  170. package/lib/module/sync/wire.js +47 -1
  171. package/lib/module/sync/wire.js.map +1 -0
  172. package/lib/module/types.js +4 -1
  173. package/lib/module/types.js.map +1 -0
  174. package/lib/typescript/blocks/AskBlocks.d.ts.map +1 -0
  175. package/lib/typescript/blocks/BlockRenderer.d.ts.map +1 -0
  176. package/lib/typescript/blocks/ChromePrototypes.d.ts.map +1 -0
  177. package/lib/typescript/blocks/DataBlocks.d.ts +31 -0
  178. package/lib/typescript/blocks/DataBlocks.d.ts.map +1 -0
  179. package/lib/typescript/blocks/ExtraBlocks.d.ts +11 -0
  180. package/lib/typescript/blocks/ExtraBlocks.d.ts.map +1 -0
  181. package/lib/typescript/blocks/MediaBlocks.d.ts.map +1 -0
  182. package/lib/typescript/blocks/ReceiptBlocks.d.ts.map +1 -0
  183. package/lib/typescript/blocks/context.d.ts.map +1 -0
  184. package/lib/typescript/blocks/icons.d.ts.map +1 -0
  185. package/lib/typescript/blocks/index.d.ts.map +1 -0
  186. package/lib/typescript/blocks/listRow.test.d.ts +2 -0
  187. package/lib/typescript/blocks/listRow.test.d.ts.map +1 -0
  188. package/lib/typescript/blocks/pageState.d.ts +23 -0
  189. package/lib/typescript/blocks/pageState.d.ts.map +1 -0
  190. package/lib/typescript/blocks/pageState.test.d.ts +2 -0
  191. package/lib/typescript/blocks/pageState.test.d.ts.map +1 -0
  192. package/lib/typescript/blocks/primitives.d.ts +39 -9
  193. package/lib/typescript/blocks/primitives.d.ts.map +1 -0
  194. package/lib/typescript/blocks/primitivesIndex.d.ts +2 -1
  195. package/lib/typescript/blocks/primitivesIndex.d.ts.map +1 -0
  196. package/lib/typescript/components/ApprovalCard.d.ts.map +1 -0
  197. package/lib/typescript/components/AskBuoyHeader.d.ts +11 -1
  198. package/lib/typescript/components/AskBuoyHeader.d.ts.map +1 -0
  199. package/lib/typescript/components/AskBuoyIcon.d.ts.map +1 -0
  200. package/lib/typescript/components/AskBuoyModal.d.ts.map +1 -0
  201. package/lib/typescript/components/AskBuoySettings.d.ts +2 -0
  202. package/lib/typescript/components/AskBuoySettings.d.ts.map +1 -0
  203. package/lib/typescript/components/ChangesBar.d.ts.map +1 -0
  204. package/lib/typescript/components/Composer.d.ts.map +1 -0
  205. package/lib/typescript/components/EmptyState.d.ts.map +1 -0
  206. package/lib/typescript/components/Markdown.d.ts.map +1 -0
  207. package/lib/typescript/components/MessageList.d.ts +12 -5
  208. package/lib/typescript/components/MessageList.d.ts.map +1 -0
  209. package/lib/typescript/components/ThinkingStrip.d.ts +5 -0
  210. package/lib/typescript/components/ThinkingStrip.d.ts.map +1 -0
  211. package/lib/typescript/components/TypingDots.d.ts.map +1 -0
  212. package/lib/typescript/components/useCopyAction.d.ts +5 -0
  213. package/lib/typescript/components/useCopyAction.d.ts.map +1 -0
  214. package/lib/typescript/index.d.ts +5 -0
  215. package/lib/typescript/index.d.ts.map +1 -0
  216. package/lib/typescript/preset.d.ts.map +1 -0
  217. package/lib/typescript/store/askBuoySettings.d.ts +22 -0
  218. package/lib/typescript/store/askBuoySettings.d.ts.map +1 -0
  219. package/lib/typescript/store/askBuoyStore.d.ts +74 -13
  220. package/lib/typescript/store/askBuoyStore.d.ts.map +1 -0
  221. package/lib/typescript/store/restoredIds.test.d.ts +2 -0
  222. package/lib/typescript/store/restoredIds.test.d.ts.map +1 -0
  223. package/lib/typescript/store/traceText.d.ts +33 -0
  224. package/lib/typescript/store/traceText.d.ts.map +1 -0
  225. package/lib/typescript/store/traceText.test.d.ts +2 -0
  226. package/lib/typescript/store/traceText.test.d.ts.map +1 -0
  227. package/lib/typescript/store/transcriptPersistence.d.ts +40 -0
  228. package/lib/typescript/store/transcriptPersistence.d.ts.map +1 -0
  229. package/lib/typescript/store/transcriptPersistence.test.d.ts +2 -0
  230. package/lib/typescript/store/transcriptPersistence.test.d.ts.map +1 -0
  231. package/lib/typescript/store/useAskBuoy.d.ts.map +1 -0
  232. package/lib/typescript/store/useAskBuoySettings.d.ts +3 -0
  233. package/lib/typescript/store/useAskBuoySettings.d.ts.map +1 -0
  234. package/lib/typescript/sync/askBuoySyncAdapter.d.ts.map +1 -0
  235. package/lib/typescript/sync/askBuoySyncAdapter.test.d.ts.map +1 -0
  236. package/lib/typescript/sync/wire.d.ts.map +1 -0
  237. package/lib/typescript/types.d.ts +24 -1
  238. package/lib/typescript/types.d.ts.map +1 -0
  239. package/package.json +8 -8
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TRANSCRIPT_KEY = void 0;
7
+ exports.buildPayload = buildPayload;
8
+ exports.clearTranscript = clearTranscript;
9
+ exports.fitToCaps = fitToCaps;
10
+ exports.parsePayload = parsePayload;
11
+ exports.readTranscript = readTranscript;
12
+ exports.writeTranscript = writeTranscript;
13
+ var _sharedUi = require("@buoy-gg/shared-ui");
14
+ var _wire = require("../sync/wire");
15
+ /**
16
+ * The conversation, across a reload or a crash.
17
+ *
18
+ * This reverses a deliberate earlier decision, so the reasoning is worth
19
+ * stating. The transcript used to live only in memory because it can quote
20
+ * anything the agent read — a storage value, a response body, a customer
21
+ * record — and a Buoy key on disk is readable by the Storage tool, which the
22
+ * unauthenticated broker mirrors to every connected dashboard. That risk did
23
+ * not go away; it is now a trade the host app makes knowingly, and can decline
24
+ * with `askBuoy={{ persistTranscript: false }}`.
25
+ *
26
+ * What lowers it:
27
+ * - Tool RESULTS are never written. The model's saved history keeps the shape
28
+ * of each round (which tool ran, what it was asked) and replaces every result
29
+ * payload with a placeholder — so the agent resumes knowing what it did, not
30
+ * what it saw. Raw payloads are the sensitive part and they stay in memory.
31
+ * - Everything written passes `redactForWire`, the same credential scrubber the
32
+ * broker wire uses.
33
+ * - It is capped, oldest-first, so a long QA session cannot grow a file without
34
+ * bound.
35
+ * - "New conversation" deletes it, rather than leaving the last chat on disk.
36
+ */
37
+
38
+ /** `@react_buoy` prefix, so the Storage tool treats it as one of its own. */
39
+ const TRANSCRIPT_KEY = exports.TRANSCRIPT_KEY = `${_sharedUi.devToolsStorageKeys.base}_ask_buoy_transcript`;
40
+
41
+ /** Bumped when the saved shape changes; an older payload is dropped, not parsed. */
42
+ const VERSION = 1;
43
+
44
+ /** Newest N bubbles. Beyond this a reader is scrolling history, not testing. */
45
+ const MAX_MESSAGES = 60;
46
+
47
+ /**
48
+ * Hard ceiling on the file. Blocks carry image URLs and table rows, so a
49
+ * message is not a small object; this is checked AFTER the message cap and
50
+ * drops from the oldest end until it fits.
51
+ */
52
+ const MAX_BYTES = 256_000;
53
+
54
+ /** What replaces a tool result. Addressed to the model, which will read it. */
55
+ const DROPPED_RESULT = "[not kept across a restart — read it again if you need it]";
56
+ function scrub(text) {
57
+ return text ? (0, _wire.redactForWire)(text) : text;
58
+ }
59
+
60
+ /**
61
+ * A bubble as it should look after a restart.
62
+ *
63
+ * `streaming` is cleared because nothing is streaming into a bubble the app
64
+ * has just rebuilt, and a message caught mid-turn is marked as interrupted
65
+ * rather than left looking like a silent, empty answer — which is exactly the
66
+ * crash case this feature exists for. `actionState` is not saved at all: a
67
+ * button stuck on "running" would be a lie about work that died with the
68
+ * process.
69
+ */
70
+ function settle(m) {
71
+ const cutOff = m.streaming === true;
72
+ return {
73
+ ...m,
74
+ text: scrub(m.text),
75
+ streaming: false,
76
+ // The thinking view's payloads go through the same scrubber as the answer:
77
+ // step parameters carry whatever the model passed a tool, which is exactly
78
+ // where a token ends up when the agent has been asked to set one.
79
+ reasoning: m.reasoning?.map(r => ({
80
+ ...r,
81
+ text: scrub(r.text)
82
+ })),
83
+ toolCalls: m.toolCalls.map(c => {
84
+ const params = c.params ? scrub(c.params) : undefined;
85
+ // `result` is dropped, never scrubbed. It is the tool payload itself —
86
+ // a store's whole state, a response body — and "tool results are never
87
+ // written to disk" is the promise this file is built on. It stays in
88
+ // memory for the thinking view and the JSON export.
89
+ const {
90
+ result: _dropped,
91
+ ...rest
92
+ } = c;
93
+ return c.status === "running" ? {
94
+ ...rest,
95
+ params,
96
+ status: "failed",
97
+ summary: "Interrupted"
98
+ } : {
99
+ ...rest,
100
+ params
101
+ };
102
+ }),
103
+ error: m.error ?? (cutOff && !m.text ? "This answer was interrupted — the app restarted mid-turn." : undefined)
104
+ };
105
+ }
106
+
107
+ /** Model history with every tool result replaced by a placeholder. */
108
+ function withoutResults(history) {
109
+ return history.map(m => {
110
+ if (m.role === "tool-results") {
111
+ return {
112
+ ...m,
113
+ results: m.results.map(r => ({
114
+ ...r,
115
+ content: DROPPED_RESULT
116
+ }))
117
+ };
118
+ }
119
+ if (m.role === "assistant") return {
120
+ ...m,
121
+ text: scrub(m.text)
122
+ };
123
+ return {
124
+ ...m,
125
+ text: scrub(m.text)
126
+ };
127
+ });
128
+ }
129
+
130
+ /**
131
+ * Trim to the caps. Messages and history are trimmed together and from the
132
+ * same end, so what the user sees and what the model remembers stay the same
133
+ * conversation rather than drifting apart across restarts.
134
+ */
135
+ function fitToCaps(payload) {
136
+ let out = {
137
+ ...payload,
138
+ messages: payload.messages.slice(-MAX_MESSAGES),
139
+ history: payload.history.slice(-MAX_MESSAGES * 2)
140
+ };
141
+ let json = JSON.stringify(out);
142
+ while (json.length > MAX_BYTES && out.messages.length > 1) {
143
+ out = {
144
+ ...out,
145
+ messages: out.messages.slice(1),
146
+ history: out.history.slice(Math.min(2, out.history.length))
147
+ };
148
+ json = JSON.stringify(out);
149
+ }
150
+ return out;
151
+ }
152
+ function buildPayload(input) {
153
+ return fitToCaps({
154
+ v: VERSION,
155
+ savedAt: Date.now(),
156
+ messages: input.messages.map(settle),
157
+ history: withoutResults(input.history),
158
+ answers: input.answers,
159
+ usage: input.usage
160
+ });
161
+ }
162
+
163
+ /** Anything unparseable, or from an older shape, is treated as "no transcript". */
164
+ function parsePayload(raw) {
165
+ if (!raw) return null;
166
+ try {
167
+ const parsed = JSON.parse(raw);
168
+ if (parsed?.v !== VERSION || !Array.isArray(parsed.messages)) return null;
169
+ if (parsed.messages.length === 0) return null;
170
+ return {
171
+ v: VERSION,
172
+ savedAt: typeof parsed.savedAt === "number" ? parsed.savedAt : 0,
173
+ messages: parsed.messages,
174
+ history: Array.isArray(parsed.history) ? parsed.history : [],
175
+ answers: parsed.answers ?? {},
176
+ usage: parsed.usage ?? {
177
+ input: 0,
178
+ output: 0,
179
+ requests: 0
180
+ }
181
+ };
182
+ } catch {
183
+ return null;
184
+ }
185
+ }
186
+ async function readTranscript() {
187
+ try {
188
+ return parsePayload(await _sharedUi.persistentStorage.getItem(TRANSCRIPT_KEY));
189
+ } catch {
190
+ return null;
191
+ }
192
+ }
193
+ async function writeTranscript(payload) {
194
+ try {
195
+ await _sharedUi.persistentStorage.setItem(TRANSCRIPT_KEY, JSON.stringify(payload));
196
+ } catch {
197
+ // A transcript that cannot be saved must never break the chat that
198
+ // produced it.
199
+ }
200
+ }
201
+ async function clearTranscript() {
202
+ try {
203
+ await _sharedUi.persistentStorage.removeItem(TRANSCRIPT_KEY);
204
+ } catch {
205
+ /* nothing to do — see writeTranscript */
206
+ }
207
+ }
208
+ //# sourceMappingURL=transcriptPersistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_sharedUi","require","_wire","TRANSCRIPT_KEY","exports","devToolsStorageKeys","base","VERSION","MAX_MESSAGES","MAX_BYTES","DROPPED_RESULT","scrub","text","redactForWire","settle","m","cutOff","streaming","reasoning","map","r","toolCalls","c","params","undefined","result","_dropped","rest","status","summary","error","withoutResults","history","role","results","content","fitToCaps","payload","out","messages","slice","json","JSON","stringify","length","Math","min","buildPayload","input","v","savedAt","Date","now","answers","usage","parsePayload","raw","parsed","parse","Array","isArray","output","requests","readTranscript","persistentStorage","getItem","writeTranscript","setItem","clearTranscript","removeItem"],"sourceRoot":"../../../src","sources":["store/transcriptPersistence.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+
3
+ var _vitest = require("vitest");
4
+ var _transcriptPersistence = require("./transcriptPersistence");
5
+ /**
6
+ * What a saved conversation is allowed to contain, and what it looks like on
7
+ * the way back in.
8
+ *
9
+ * The transcript is on disk under a `@react_buoy` key now, which the Storage
10
+ * tool can read and the unauthenticated broker mirrors. Everything below is a
11
+ * property that keeps that trade bounded: no tool-result payloads, no
12
+ * credentials, no unbounded growth, and nothing that comes back claiming to
13
+ * still be running.
14
+ */
15
+
16
+ const msg = (over = {}) => ({
17
+ id: "m1",
18
+ role: "assistant",
19
+ text: "ok",
20
+ toolCalls: [],
21
+ blocks: [],
22
+ ...over
23
+ });
24
+ const build = (messages, history = []) => (0, _transcriptPersistence.buildPayload)({
25
+ messages,
26
+ history,
27
+ answers: {},
28
+ usage: {
29
+ input: 0,
30
+ output: 0,
31
+ requests: 0
32
+ }
33
+ });
34
+ (0, _vitest.describe)("what reaches the disk", () => {
35
+ (0, _vitest.it)("never writes a tool result", () => {
36
+ // The payloads are the sensitive half: storage values, response bodies, a
37
+ // customer's record. The ROUND survives so the model can resume; what it
38
+ // saw does not.
39
+ const history = [{
40
+ role: "user",
41
+ text: "what's in the bag?"
42
+ }, {
43
+ role: "assistant",
44
+ text: "",
45
+ toolCalls: [{
46
+ id: "c1",
47
+ name: "buoy_zustand",
48
+ input: {}
49
+ }]
50
+ }, {
51
+ role: "tool-results",
52
+ results: [{
53
+ toolCallId: "c1",
54
+ content: '{"lines":[{"card":"4111111111111111"}]}'
55
+ }]
56
+ }, {
57
+ role: "assistant",
58
+ text: "Five items."
59
+ }];
60
+ const saved = build([msg()], history);
61
+ const json = JSON.stringify(saved);
62
+ (0, _vitest.expect)(json).not.toContain("4111111111111111");
63
+ // The round itself is intact, so the pairing every provider requires holds.
64
+ (0, _vitest.expect)(saved.history.map(m => m.role)).toEqual(["user", "assistant", "tool-results", "assistant"]);
65
+ });
66
+ (0, _vitest.it)("never writes a step's result, even when it writes the step", () => {
67
+ // The step survives so the trace still reads; the payload is the thing the
68
+ // no-tool-results-on-disk promise is about.
69
+ const saved = build([msg({
70
+ toolCalls: [{
71
+ id: "c1",
72
+ toolId: "zustand",
73
+ action: "getStoreState",
74
+ label: "Read the bag",
75
+ status: "ok",
76
+ summary: "Done",
77
+ params: '{"storeName":"bag"}',
78
+ result: '{"card":"4111111111111111"}'
79
+ }]
80
+ })]);
81
+ (0, _vitest.expect)(JSON.stringify(saved)).not.toContain("4111111111111111");
82
+ (0, _vitest.expect)(saved.messages[0].toolCalls[0].result).toBeUndefined();
83
+ (0, _vitest.expect)(saved.messages[0].toolCalls[0].action).toBe("getStoreState");
84
+ });
85
+ (0, _vitest.it)("scrubs credential shapes out of what the agent said", () => {
86
+ const saved = build([msg({
87
+ text: "The header was Bearer abcdefghijklmnop123456"
88
+ })]);
89
+ (0, _vitest.expect)(saved.messages[0].text).not.toContain("abcdefghijklmnop123456");
90
+ });
91
+ (0, _vitest.it)("caps a long session instead of growing a file forever", () => {
92
+ const many = Array.from({
93
+ length: 400
94
+ }, (_, i) => msg({
95
+ id: `m${i}`,
96
+ text: `answer ${i}`
97
+ }));
98
+ const saved = build(many);
99
+ (0, _vitest.expect)(saved.messages.length).toBeLessThanOrEqual(60);
100
+ // Newest kept, oldest dropped — the end of a session is the useful end.
101
+ (0, _vitest.expect)(saved.messages[saved.messages.length - 1].text).toBe("answer 399");
102
+ });
103
+ (0, _vitest.it)("drops from the oldest end until a heavy transcript fits", () => {
104
+ const heavy = Array.from({
105
+ length: 20
106
+ }, (_, i) => msg({
107
+ id: `m${i}`,
108
+ text: "x".repeat(40_000)
109
+ }));
110
+ const saved = (0, _transcriptPersistence.fitToCaps)({
111
+ v: 1,
112
+ savedAt: 0,
113
+ messages: heavy,
114
+ history: [],
115
+ answers: {},
116
+ usage: {
117
+ input: 0,
118
+ output: 0,
119
+ requests: 0
120
+ }
121
+ });
122
+ (0, _vitest.expect)(JSON.stringify(saved).length).toBeLessThanOrEqual(256_000);
123
+ (0, _vitest.expect)(saved.messages.length).toBeGreaterThan(0);
124
+ });
125
+ });
126
+ (0, _vitest.describe)("what comes back", () => {
127
+ (0, _vitest.it)("marks a turn the app died in as interrupted rather than blank", () => {
128
+ // The crash case this feature exists for. An empty bubble with no
129
+ // explanation reads as the model having nothing to say.
130
+ const saved = build([msg({
131
+ text: "",
132
+ streaming: true
133
+ })]);
134
+ (0, _vitest.expect)(saved.messages[0].streaming).toBe(false);
135
+ (0, _vitest.expect)(saved.messages[0].error).toMatch(/interrupted/i);
136
+ });
137
+ (0, _vitest.it)("never restores a tool call still claiming to run", () => {
138
+ const saved = build([msg({
139
+ streaming: true,
140
+ toolCalls: [{
141
+ id: "c1",
142
+ toolId: "storage",
143
+ action: "set",
144
+ label: "Write a key",
145
+ status: "running"
146
+ }]
147
+ })]);
148
+ (0, _vitest.expect)(saved.messages[0].toolCalls[0].status).toBe("failed");
149
+ (0, _vitest.expect)(saved.messages[0].toolCalls[0].summary).toBe("Interrupted");
150
+ });
151
+ (0, _vitest.it)("keeps an answer that already finished exactly as it was", () => {
152
+ const saved = build([msg({
153
+ text: "Five items.",
154
+ streaming: false
155
+ })]);
156
+ (0, _vitest.expect)(saved.messages[0].error).toBeUndefined();
157
+ (0, _vitest.expect)(saved.messages[0].text).toBe("Five items.");
158
+ });
159
+ (0, _vitest.it)("treats anything it cannot trust as no transcript at all", () => {
160
+ (0, _vitest.expect)((0, _transcriptPersistence.parsePayload)(null)).toBeNull();
161
+ (0, _vitest.expect)((0, _transcriptPersistence.parsePayload)("not json")).toBeNull();
162
+ // An older shape is dropped, not coerced — a half-read transcript is worse
163
+ // than a missing one.
164
+ (0, _vitest.expect)((0, _transcriptPersistence.parsePayload)(JSON.stringify({
165
+ v: 0,
166
+ messages: [msg()]
167
+ }))).toBeNull();
168
+ (0, _vitest.expect)((0, _transcriptPersistence.parsePayload)(JSON.stringify({
169
+ v: 1,
170
+ messages: []
171
+ }))).toBeNull();
172
+ });
173
+ (0, _vitest.it)("round-trips a real conversation", () => {
174
+ const saved = build([msg({
175
+ role: "user",
176
+ text: "hi"
177
+ }), msg({
178
+ id: "m2",
179
+ text: "hello"
180
+ })]);
181
+ const back = (0, _transcriptPersistence.parsePayload)(JSON.stringify(saved));
182
+ (0, _vitest.expect)(back?.messages.map(m => m.text)).toEqual(["hi", "hello"]);
183
+ });
184
+ });
185
+ //# sourceMappingURL=transcriptPersistence.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_vitest","require","_transcriptPersistence","msg","over","id","role","text","toolCalls","blocks","build","messages","history","buildPayload","answers","usage","input","output","requests","describe","it","name","results","toolCallId","content","saved","json","JSON","stringify","expect","not","toContain","map","m","toEqual","toolId","action","label","status","summary","params","result","toBeUndefined","toBe","many","Array","from","length","_","i","toBeLessThanOrEqual","heavy","repeat","fitToCaps","v","savedAt","toBeGreaterThan","streaming","error","toMatch","parsePayload","toBeNull","back"],"sourceRoot":"../../../src","sources":["store/transcriptPersistence.test.ts"],"mappings":"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","ignoreList":[]}