@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
@@ -1 +1,365 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.askBuoyStore=void 0;let seq=0;const nextId=()=>"m"+ ++seq;let state={messages:[],busy:!1,pending:null,notice:null,configured:!1,answers:{},awaitingBlockId:null,actionState:{},queued:null,usage:{input:0,output:0,requests:0}};const listeners=new Set;let ledgerRef=null,heldSession=null;function set(e){state={...state,...e};for(const e of listeners)try{e()}catch{}}const askBuoyStore=exports.askBuoyStore={getState:()=>state,subscribe:e=>(listeners.add(e),()=>listeners.delete(e)),setLedger(e){ledgerRef=e},getLedger:()=>ledgerRef,holdSession(e,t){heldSession={session:e,signature:t}},getHeldSession:()=>heldSession,setNotice(e){set({notice:e})},setConfigured(e){e!==state.configured&&set({configured:e})},addUser(e){set({messages:[...state.messages,{id:nextId(),role:"user",text:e,toolCalls:[],blocks:[]}],busy:!0})},beginTurn(){set({busy:!0})},setQueued(e){set({queued:e})},removeMessage(e){set({messages:state.messages.filter(t=>t.id!==e)})},recordAnswer(e){set({answers:{...state.answers,[e.blockId]:e},awaitingBlockId:state.awaitingBlockId===e.blockId?null:state.awaitingBlockId})},setActionState(e,t){const s={...state.actionState};null===t?delete s[e]:s[e]=t,set({actionState:s})},startAssistant(){const e=nextId();return set({messages:[...state.messages,{id:e,role:"assistant",text:"",toolCalls:[],blocks:[],streaming:!0}]}),e},applyEvent(e,t){set({messages:state.messages.map(s=>{if(s.id!==e)return s;switch(t.type){case"text":return{...s,text:s.breakBeforeNextText&&s.text?`${s.text.trimEnd()}\n\n${t.delta}`:s.text+t.delta,breakBeforeNextText:!1};case"tool-start":return{...s,toolCalls:[...s.toolCalls,{id:t.id,toolId:t.toolId,action:t.action,label:t.label,description:t.description,status:"running"}]};case"tool-end":return{...s,breakBeforeNextText:!0,toolCalls:s.toolCalls.map(e=>e.id===t.id?{...e,status:t.ok||"refused"!==t.summary?t.ok?"ok":"failed":"refused",summary:t.summary}:e)};case"block":return{...s,breakBeforeNextText:!0,blocks:[...s.blocks,{block:t.block,forToolCallId:t.forToolCallId}]};case"error":return{...s,error:t.message};default:return s}}),..."awaiting-user"===t.type?{awaitingBlockId:t.blockId}:{},..."usage"===t.type?{usage:{input:state.usage.input+t.input,output:state.usage.output+t.output,requests:state.usage.requests+1}}:{}})},finishAssistant(e){set({messages:state.messages.map(t=>t.id===e?{...t,streaming:!1}:t),busy:!1})},askApproval:e=>new Promise(t=>{set({pending:{...e,resolve:t}})}),answerApproval(e){const t=state.pending;set({pending:null}),t?.resolve(e)},reset(){state.pending?.resolve(!1),set({messages:[],busy:!1,pending:null,notice:null,answers:{},awaitingBlockId:null,actionState:{},queued:null,usage:{input:0,output:0,requests:0}})}};
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.askBuoyStore = void 0;
7
+ var _agentCore = require("@buoy-gg/agent-core");
8
+ /**
9
+ * Conversation state for the sheet.
10
+ *
11
+ * A module-level store rather than component state for two reasons: the sheet
12
+ * is unmounted whenever the tool is closed or minimised (and a conversation
13
+ * that vanished because someone tapped away would be maddening), and the sync
14
+ * adapter needs to read the same transcript to show it on the desktop.
15
+ *
16
+ * Persisted across restarts, on purpose, with the payloads left out — see
17
+ * `transcriptPersistence.ts` for what is written and what that costs. The
18
+ * store itself stays a plain in-memory store; saving is a subscriber, and
19
+ * `hydrate` is the one way anything comes back in.
20
+ */
21
+
22
+ /** A block in a message, and (for receipts) the tool call that produced it. */
23
+
24
+ /**
25
+ * A stretch of the model's own reasoning, and where it fell.
26
+ *
27
+ * `afterCalls` is how many tool calls this message had already made when the
28
+ * thought arrived, so the thinking view can lay reasoning and steps out in the
29
+ * order they actually happened. One assistant bubble spans every turn of a
30
+ * multi-step run, so "think, act, think, act" is the normal shape and showing
31
+ * all the thoughts in a lump at the top would misreport it.
32
+ */
33
+
34
+ /**
35
+ * Message ids carry this run's token — see agent-core's `runId`. A plain `m1`
36
+ * collided head-on with the `m1` in a restored transcript, and the message
37
+ * list keys on it.
38
+ */
39
+ const nextId = (0, _agentCore.idFactory)("m");
40
+
41
+ /**
42
+ * Params, as one readable line. Capped because a step can carry a whole
43
+ * response body or a store's full state, and this is chrome inside a chat
44
+ * bubble — the full value is a tool read away.
45
+ */
46
+ const MAX_PARAM_CHARS = 400;
47
+ function encodeParams(params) {
48
+ if (!params || Object.keys(params).length === 0) return undefined;
49
+ try {
50
+ const json = JSON.stringify(params);
51
+ return json.length > MAX_PARAM_CHARS ? `${json.slice(0, MAX_PARAM_CHARS)}…` : json;
52
+ } catch {
53
+ return undefined;
54
+ }
55
+ }
56
+ let state = {
57
+ messages: [],
58
+ busy: false,
59
+ pending: null,
60
+ notice: null,
61
+ configured: false,
62
+ answers: {},
63
+ awaitingBlockId: null,
64
+ actionState: {},
65
+ queued: null,
66
+ usage: {
67
+ input: 0,
68
+ output: 0,
69
+ requests: 0
70
+ },
71
+ meta: {}
72
+ };
73
+ const listeners = new Set();
74
+ let ledgerRef = null;
75
+
76
+ /**
77
+ * The session outlives the sheet the same way the transcript does. Session and
78
+ * ledger used to be per-mount: closing and reopening the tool kept the visible
79
+ * conversation but silently swapped in an empty ledger and a blank model
80
+ * memory — the undo bar vanished while the agent's changes stayed live in the
81
+ * app. Held here, keyed by a config signature so a real reconfiguration
82
+ * (different endpoint/model/tool set) still rebuilds.
83
+ */
84
+ let heldSession = null;
85
+ function set(next) {
86
+ state = {
87
+ ...state,
88
+ ...next
89
+ };
90
+ for (const fn of listeners) {
91
+ try {
92
+ fn();
93
+ } catch {
94
+ // A throwing subscriber must not take the transcript down mid-answer.
95
+ }
96
+ }
97
+ }
98
+ const askBuoyStore = exports.askBuoyStore = {
99
+ getState: () => state,
100
+ subscribe(fn) {
101
+ listeners.add(fn);
102
+ return () => listeners.delete(fn);
103
+ },
104
+ setLedger(ledger) {
105
+ ledgerRef = ledger;
106
+ },
107
+ getLedger() {
108
+ return ledgerRef;
109
+ },
110
+ holdSession(session, signature) {
111
+ heldSession = {
112
+ session,
113
+ signature
114
+ };
115
+ },
116
+ getHeldSession() {
117
+ return heldSession;
118
+ },
119
+ setNotice(notice) {
120
+ set({
121
+ notice
122
+ });
123
+ },
124
+ setConfigured(configured) {
125
+ if (configured !== state.configured) set({
126
+ configured
127
+ });
128
+ },
129
+ setMeta(meta) {
130
+ const same = Object.keys(meta).every(k => state.meta[k] === meta[k]);
131
+ if (!same) set({
132
+ meta: {
133
+ ...state.meta,
134
+ ...meta
135
+ }
136
+ });
137
+ },
138
+ addUser(text) {
139
+ set({
140
+ messages: [...state.messages, {
141
+ id: nextId(),
142
+ role: "user",
143
+ text,
144
+ toolCalls: [],
145
+ blocks: []
146
+ }],
147
+ busy: true
148
+ });
149
+ },
150
+ /** Mark a turn as running without adding a bubble — the retry path. */
151
+ beginTurn() {
152
+ set({
153
+ busy: true
154
+ });
155
+ },
156
+ /** Park a message typed mid-turn instead of silently dropping it. */
157
+ setQueued(text) {
158
+ set({
159
+ queued: text
160
+ });
161
+ },
162
+ /** Drop one message — the failed assistant bubble a retry replaces. */
163
+ removeMessage(id) {
164
+ set({
165
+ messages: state.messages.filter(m => m.id !== id)
166
+ });
167
+ },
168
+ /** The user answered (or skipped) an Ask block. */
169
+ recordAnswer(answer) {
170
+ set({
171
+ answers: {
172
+ ...state.answers,
173
+ [answer.blockId]: answer
174
+ },
175
+ awaitingBlockId: state.awaitingBlockId === answer.blockId ? null : state.awaitingBlockId
176
+ });
177
+ },
178
+ setActionState(key, value) {
179
+ const next = {
180
+ ...state.actionState
181
+ };
182
+ if (value === null) delete next[key];else next[key] = value;
183
+ set({
184
+ actionState: next
185
+ });
186
+ },
187
+ /** Open a new assistant bubble for the turn that is about to stream. */
188
+ startAssistant() {
189
+ const id = nextId();
190
+ set({
191
+ messages: [...state.messages, {
192
+ id,
193
+ role: "assistant",
194
+ text: "",
195
+ toolCalls: [],
196
+ blocks: [],
197
+ streaming: true,
198
+ startedAt: Date.now()
199
+ }]
200
+ });
201
+ return id;
202
+ },
203
+ /**
204
+ * Fold one engine event into the open assistant message.
205
+ *
206
+ * Tool calls render as rows inside the bubble rather than as raw payloads:
207
+ * the label is already domain-flavoured ("Set points to 1500"), which is the
208
+ * only form a non-developer can actually check.
209
+ */
210
+ applyEvent(messageId, ev) {
211
+ const messages = state.messages.map(m => {
212
+ if (m.id !== messageId) return m;
213
+ switch (ev.type) {
214
+ case "text":
215
+ return {
216
+ ...m,
217
+ text: m.breakBeforeNextText && m.text ? `${m.text.trimEnd()}\n\n${ev.delta}` : m.text + ev.delta,
218
+ breakBeforeNextText: false
219
+ };
220
+ case "reasoning":
221
+ return {
222
+ ...m,
223
+ breakBeforeNextText: true,
224
+ reasoning: [...(m.reasoning ?? []), {
225
+ text: ev.text,
226
+ afterCalls: m.toolCalls.length
227
+ }]
228
+ };
229
+ case "tool-start":
230
+ return {
231
+ ...m,
232
+ toolCalls: [...m.toolCalls, {
233
+ id: ev.id,
234
+ toolId: ev.toolId,
235
+ action: ev.action,
236
+ label: ev.label,
237
+ description: ev.description,
238
+ status: "running",
239
+ params: encodeParams(ev.params),
240
+ effect: ev.effect,
241
+ startedAt: Date.now()
242
+ }]
243
+ };
244
+ case "tool-end":
245
+ return {
246
+ ...m,
247
+ breakBeforeNextText: true,
248
+ toolCalls: m.toolCalls.map(c => c.id === ev.id ? {
249
+ ...c,
250
+ status: !ev.ok && ev.summary === "refused" ? "refused" : ev.ok ? "ok" : "failed",
251
+ summary: ev.summary,
252
+ durationMs: ev.durationMs,
253
+ result: ev.result
254
+ } : c)
255
+ };
256
+ case "block":
257
+ return {
258
+ ...m,
259
+ breakBeforeNextText: true,
260
+ blocks: [...m.blocks, {
261
+ block: ev.block,
262
+ forToolCallId: ev.forToolCallId
263
+ }]
264
+ };
265
+ case "usage":
266
+ // Also folded into the session total below. Per MESSAGE as well,
267
+ // because "which answer cost 40k tokens" is the question you ask
268
+ // when a bill looks wrong, and a session total cannot answer it.
269
+ return {
270
+ ...m,
271
+ usage: {
272
+ input: (m.usage?.input ?? 0) + ev.input,
273
+ output: (m.usage?.output ?? 0) + ev.output,
274
+ requests: (m.usage?.requests ?? 0) + 1
275
+ }
276
+ };
277
+ case "error":
278
+ return {
279
+ ...m,
280
+ error: ev.message
281
+ };
282
+ default:
283
+ return m;
284
+ }
285
+ });
286
+ set({
287
+ messages,
288
+ ...(ev.type === "awaiting-user" ? {
289
+ awaitingBlockId: ev.blockId
290
+ } : {}),
291
+ ...(ev.type === "usage" ? {
292
+ usage: {
293
+ input: state.usage.input + ev.input,
294
+ output: state.usage.output + ev.output,
295
+ requests: state.usage.requests + 1
296
+ }
297
+ } : {})
298
+ });
299
+ },
300
+ finishAssistant(messageId) {
301
+ set({
302
+ messages: state.messages.map(m => m.id === messageId ? {
303
+ ...m,
304
+ streaming: false,
305
+ endedAt: Date.now()
306
+ } : m),
307
+ busy: false
308
+ });
309
+ },
310
+ askApproval(input) {
311
+ return new Promise(resolve => {
312
+ set({
313
+ pending: {
314
+ ...input,
315
+ resolve
316
+ }
317
+ });
318
+ });
319
+ },
320
+ answerApproval(approved) {
321
+ const pending = state.pending;
322
+ set({
323
+ pending: null
324
+ });
325
+ pending?.resolve(approved);
326
+ },
327
+ /**
328
+ * Put a saved conversation back, once, at open.
329
+ *
330
+ * Refuses if anything has been said already: a slow disk read landing after
331
+ * the user has started typing must not shove an old chat in front of them.
332
+ */
333
+ hydrate(input) {
334
+ if (state.messages.length > 0 || state.busy) return false;
335
+ set({
336
+ messages: input.messages,
337
+ answers: input.answers,
338
+ usage: input.usage
339
+ });
340
+ return true;
341
+ },
342
+ reset() {
343
+ // Reject anything still waiting, or the turn hangs forever on a promise
344
+ // whose only resolver just left the screen.
345
+ state.pending?.resolve(false);
346
+ set({
347
+ messages: [],
348
+ busy: false,
349
+ pending: null,
350
+ notice: null,
351
+ answers: {},
352
+ awaitingBlockId: null,
353
+ actionState: {},
354
+ queued: null,
355
+ usage: {
356
+ input: 0,
357
+ output: 0,
358
+ requests: 0
359
+ }
360
+ // `meta` survives: it describes the app and the endpoint, not the
361
+ // conversation, and re-deriving it would need another render pass.
362
+ });
363
+ }
364
+ };
365
+ //# sourceMappingURL=askBuoyStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_agentCore","require","nextId","idFactory","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","exports","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":";;;;;;AAaA,IAAAA,UAAA,GAAAC,OAAA;AAbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;;AAsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAmFA;AACA;AACA;AACA;AACA;AACA,MAAMC,MAAM,GAAG,IAAAC,oBAAS,EAAC,GAAG,CAAC;;AAE7B;AACA;AACA;AACA;AACA;AACA,MAAMC,eAAe,GAAG,GAAG;AAE3B,SAASC,YAAYA,CAACC,MAA+B,EAAsB;EACzE,IAAI,CAACA,MAAM,IAAIC,MAAM,CAACC,IAAI,CAACF,MAAM,CAAC,CAACG,MAAM,KAAK,CAAC,EAAE,OAAOC,SAAS;EACjE,IAAI;IACF,MAAMC,IAAI,GAAGC,IAAI,CAACC,SAAS,CAACP,MAAM,CAAC;IACnC,OAAOK,IAAI,CAACF,MAAM,GAAGL,eAAe,GAAG,GAAGO,IAAI,CAACG,KAAK,CAAC,CAAC,EAAEV,eAAe,CAAC,GAAG,GAAGO,IAAI;EACpF,CAAC,CAAC,MAAM;IACN,OAAOD,SAAS;EAClB;AACF;AAEA,IAAIK,KAAmB,GAAG;EACxBC,QAAQ,EAAE,EAAE;EACZC,IAAI,EAAE,KAAK;EACXC,OAAO,EAAE,IAAI;EACbC,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,KAAK;EACjBC,OAAO,EAAE,CAAC,CAAC;EACXC,eAAe,EAAE,IAAI;EACrBC,WAAW,EAAE,CAAC,CAAC;EACfC,MAAM,EAAE,IAAI;EACZC,KAAK,EAAE;IAAEC,KAAK,EAAE,CAAC;IAAEC,MAAM,EAAE,CAAC;IAAEC,QAAQ,EAAE;EAAE,CAAC;EAC3CC,IAAI,EAAE,CAAC;AACT,CAAC;AACD,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAW,CAAC;AACrC,IAAIC,SAA8B,GAAG,IAAI;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAIC,WAAkE,GAAG,IAAI;AAE7E,SAASC,GAAGA,CAACC,IAA2B,EAAQ;EAC9CpB,KAAK,GAAG;IAAE,GAAGA,KAAK;IAAE,GAAGoB;EAAK,CAAC;EAC7B,KAAK,MAAMC,EAAE,IAAIN,SAAS,EAAE;IAC1B,IAAI;MACFM,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,MAAM;MACN;IAAA;EAEJ;AACF;AAEO,MAAMC,YAAY,GAAAC,OAAA,CAAAD,YAAA,GAAG;EAC1BE,QAAQ,EAAEA,CAAA,KAAoBxB,KAAK;EAEnCyB,SAASA,CAACJ,EAAY,EAAc;IAClCN,SAAS,CAACW,GAAG,CAACL,EAAE,CAAC;IACjB,OAAO,MAAMN,SAAS,CAACY,MAAM,CAACN,EAAE,CAAC;EACnC,CAAC;EAEDO,SAASA,CAACC,MAA2B,EAAQ;IAC3CZ,SAAS,GAAGY,MAAM;EACpB,CAAC;EACDC,SAASA,CAAA,EAAwB;IAC/B,OAAOb,SAAS;EAClB,CAAC;EAEDc,WAAWA,CAACC,OAAuB,EAAEC,SAAiB,EAAQ;IAC5Df,WAAW,GAAG;MAAEc,OAAO;MAAEC;IAAU,CAAC;EACtC,CAAC;EACDC,cAAcA,CAAA,EAA0D;IACtE,OAAOhB,WAAW;EACpB,CAAC;EAEDiB,SAASA,CAAC/B,MAAqB,EAAQ;IACrCe,GAAG,CAAC;MAAEf;IAAO,CAAC,CAAC;EACjB,CAAC;EAEDgC,aAAaA,CAAC/B,UAAmB,EAAQ;IACvC,IAAIA,UAAU,KAAKL,KAAK,CAACK,UAAU,EAAEc,GAAG,CAAC;MAAEd;IAAW,CAAC,CAAC;EAC1D,CAAC;EAEDgC,OAAOA,CAACvB,IAAiB,EAAQ;IAC/B,MAAMwB,IAAI,GAAI9C,MAAM,CAACC,IAAI,CAACqB,IAAI,CAAC,CAA2ByB,KAAK,CAC5DC,CAAC,IAAKxC,KAAK,CAACc,IAAI,CAAC0B,CAAC,CAAC,KAAK1B,IAAI,CAAC0B,CAAC,CACjC,CAAC;IACD,IAAI,CAACF,IAAI,EAAEnB,GAAG,CAAC;MAAEL,IAAI,EAAE;QAAE,GAAGd,KAAK,CAACc,IAAI;QAAE,GAAGA;MAAK;IAAE,CAAC,CAAC;EACtD,CAAC;EAED2B,OAAOA,CAACC,IAAY,EAAQ;IAC1BvB,GAAG,CAAC;MACFlB,QAAQ,EAAE,CACR,GAAGD,KAAK,CAACC,QAAQ,EACjB;QAAE0C,EAAE,EAAExD,MAAM,CAAC,CAAC;QAAEyD,IAAI,EAAE,MAAM;QAAEF,IAAI;QAAEG,SAAS,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAG,CAAC,CAChE;MACD5C,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC;EAED;EACA6C,SAASA,CAAA,EAAS;IAChB5B,GAAG,CAAC;MAAEjB,IAAI,EAAE;IAAK,CAAC,CAAC;EACrB,CAAC;EAED;EACA8C,SAASA,CAACN,IAAmB,EAAQ;IACnCvB,GAAG,CAAC;MAAEV,MAAM,EAAEiC;IAAK,CAAC,CAAC;EACvB,CAAC;EAED;EACAO,aAAaA,CAACN,EAAU,EAAQ;IAC9BxB,GAAG,CAAC;MAAElB,QAAQ,EAAED,KAAK,CAACC,QAAQ,CAACiD,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAACR,EAAE,KAAKA,EAAE;IAAE,CAAC,CAAC;EAC9D,CAAC;EAED;EACAS,YAAYA,CAACC,MAAmB,EAAQ;IACtClC,GAAG,CAAC;MACFb,OAAO,EAAE;QAAE,GAAGN,KAAK,CAACM,OAAO;QAAE,CAAC+C,MAAM,CAACC,OAAO,GAAGD;MAAO,CAAC;MACvD9C,eAAe,EAAEP,KAAK,CAACO,eAAe,KAAK8C,MAAM,CAACC,OAAO,GAAG,IAAI,GAAGtD,KAAK,CAACO;IAC3E,CAAC,CAAC;EACJ,CAAC;EAEDgD,cAAcA,CAACC,GAAW,EAAEC,KAA2C,EAAQ;IAC7E,MAAMrC,IAAI,GAAG;MAAE,GAAGpB,KAAK,CAACQ;IAAY,CAAC;IACrC,IAAIiD,KAAK,KAAK,IAAI,EAAE,OAAOrC,IAAI,CAACoC,GAAG,CAAC,CAAC,KAChCpC,IAAI,CAACoC,GAAG,CAAC,GAAGC,KAAK;IACtBtC,GAAG,CAAC;MAAEX,WAAW,EAAEY;IAAK,CAAC,CAAC;EAC5B,CAAC;EAED;EACAsC,cAAcA,CAAA,EAAW;IACvB,MAAMf,EAAE,GAAGxD,MAAM,CAAC,CAAC;IACnBgC,GAAG,CAAC;MACFlB,QAAQ,EAAE,CACR,GAAGD,KAAK,CAACC,QAAQ,EACjB;QACE0C,EAAE;QACFC,IAAI,EAAE,WAAW;QACjBF,IAAI,EAAE,EAAE;QACRG,SAAS,EAAE,EAAE;QACbC,MAAM,EAAE,EAAE;QACVa,SAAS,EAAE,IAAI;QACfC,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC;MACtB,CAAC;IAEL,CAAC,CAAC;IACF,OAAOnB,EAAE;EACX,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEoB,UAAUA,CAACC,SAAiB,EAAEC,EAAa,EAAQ;IACjD,MAAMhE,QAAQ,GAAGD,KAAK,CAACC,QAAQ,CAACiE,GAAG,CAAEf,CAAC,IAAK;MACzC,IAAIA,CAAC,CAACR,EAAE,KAAKqB,SAAS,EAAE,OAAOb,CAAC;MAChC,QAAQc,EAAE,CAACE,IAAI;QACb,KAAK,MAAM;UACT,OAAO;YACL,GAAGhB,CAAC;YACJT,IAAI,EACFS,CAAC,CAACiB,mBAAmB,IAAIjB,CAAC,CAACT,IAAI,GAC3B,GAAGS,CAAC,CAACT,IAAI,CAAC2B,OAAO,CAAC,CAAC,OAAOJ,EAAE,CAACK,KAAK,EAAE,GACpCnB,CAAC,CAACT,IAAI,GAAGuB,EAAE,CAACK,KAAK;YACvBF,mBAAmB,EAAE;UACvB,CAAC;QACH,KAAK,WAAW;UACd,OAAO;YACL,GAAGjB,CAAC;YACJiB,mBAAmB,EAAE,IAAI;YACzBG,SAAS,EAAE,CACT,IAAIpB,CAAC,CAACoB,SAAS,IAAI,EAAE,CAAC,EACtB;cAAE7B,IAAI,EAAEuB,EAAE,CAACvB,IAAI;cAAE8B,UAAU,EAAErB,CAAC,CAACN,SAAS,CAACnD;YAAO,CAAC;UAErD,CAAC;QACH,KAAK,YAAY;UACf,OAAO;YACL,GAAGyD,CAAC;YACJN,SAAS,EAAE,CACT,GAAGM,CAAC,CAACN,SAAS,EACd;cACEF,EAAE,EAAEsB,EAAE,CAACtB,EAAE;cACT8B,MAAM,EAAER,EAAE,CAACQ,MAAM;cACjBC,MAAM,EAAET,EAAE,CAACS,MAAM;cACjBC,KAAK,EAAEV,EAAE,CAACU,KAAK;cACfC,WAAW,EAAEX,EAAE,CAACW,WAAW;cAC3BC,MAAM,EAAE,SAAkB;cAC1BtF,MAAM,EAAED,YAAY,CAAC2E,EAAE,CAAC1E,MAAM,CAAC;cAC/BuF,MAAM,EAAEb,EAAE,CAACa,MAAM;cACjBlB,SAAS,EAAEC,IAAI,CAACC,GAAG,CAAC;YACtB,CAAC;UAEL,CAAC;QACH,KAAK,UAAU;UACb,OAAO;YACL,GAAGX,CAAC;YACJiB,mBAAmB,EAAE,IAAI;YACzBvB,SAAS,EAAEM,CAAC,CAACN,SAAS,CAACqB,GAAG,CAAEa,CAAC,IAC3BA,CAAC,CAACpC,EAAE,KAAKsB,EAAE,CAACtB,EAAE,GACV;cACE,GAAGoC,CAAC;cACJF,MAAM,EAAE,CAACZ,EAAE,CAACe,EAAE,IAAIf,EAAE,CAACgB,OAAO,KAAK,SAAS,GACrC,SAAS,GACVhB,EAAE,CAACe,EAAE,GACF,IAAI,GACJ,QAAkB;cACzBC,OAAO,EAAEhB,EAAE,CAACgB,OAAO;cACnBC,UAAU,EAAEjB,EAAE,CAACiB,UAAU;cACzBC,MAAM,EAAElB,EAAE,CAACkB;YACb,CAAC,GACDJ,CACN;UACF,CAAC;QACH,KAAK,OAAO;UACV,OAAO;YACL,GAAG5B,CAAC;YACJiB,mBAAmB,EAAE,IAAI;YACzBtB,MAAM,EAAE,CAAC,GAAGK,CAAC,CAACL,MAAM,EAAE;cAAEsC,KAAK,EAAEnB,EAAE,CAACmB,KAAK;cAAEC,aAAa,EAAEpB,EAAE,CAACoB;YAAc,CAAC;UAC5E,CAAC;QACH,KAAK,OAAO;UACV;UACA;UACA;UACA,OAAO;YACL,GAAGlC,CAAC;YACJzC,KAAK,EAAE;cACLC,KAAK,EAAE,CAACwC,CAAC,CAACzC,KAAK,EAAEC,KAAK,IAAI,CAAC,IAAIsD,EAAE,CAACtD,KAAK;cACvCC,MAAM,EAAE,CAACuC,CAAC,CAACzC,KAAK,EAAEE,MAAM,IAAI,CAAC,IAAIqD,EAAE,CAACrD,MAAM;cAC1CC,QAAQ,EAAE,CAACsC,CAAC,CAACzC,KAAK,EAAEG,QAAQ,IAAI,CAAC,IAAI;YACvC;UACF,CAAC;QACH,KAAK,OAAO;UACV,OAAO;YAAE,GAAGsC,CAAC;YAAEmC,KAAK,EAAErB,EAAE,CAACsB;UAAQ,CAAC;QACpC;UACE,OAAOpC,CAAC;MACZ;IACF,CAAC,CAAC;IACFhC,GAAG,CAAC;MACFlB,QAAQ;MACR,IAAIgE,EAAE,CAACE,IAAI,KAAK,eAAe,GAAG;QAAE5D,eAAe,EAAE0D,EAAE,CAACX;MAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;MACvE,IAAIW,EAAE,CAACE,IAAI,KAAK,OAAO,GACnB;QACEzD,KAAK,EAAE;UACLC,KAAK,EAAEX,KAAK,CAACU,KAAK,CAACC,KAAK,GAAGsD,EAAE,CAACtD,KAAK;UACnCC,MAAM,EAAEZ,KAAK,CAACU,KAAK,CAACE,MAAM,GAAGqD,EAAE,CAACrD,MAAM;UACtCC,QAAQ,EAAEb,KAAK,CAACU,KAAK,CAACG,QAAQ,GAAG;QACnC;MACF,CAAC,GACD,CAAC,CAAC;IACR,CAAC,CAAC;EACJ,CAAC;EAED2E,eAAeA,CAACxB,SAAiB,EAAQ;IACvC7C,GAAG,CAAC;MACFlB,QAAQ,EAAED,KAAK,CAACC,QAAQ,CAACiE,GAAG,CAAEf,CAAC,IAC7BA,CAAC,CAACR,EAAE,KAAKqB,SAAS,GAAG;QAAE,GAAGb,CAAC;QAAEQ,SAAS,EAAE,KAAK;QAAE8B,OAAO,EAAE5B,IAAI,CAACC,GAAG,CAAC;MAAE,CAAC,GAAGX,CACzE,CAAC;MACDjD,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC;EAEDwF,WAAWA,CAAC/E,KAAuC,EAAoB;IACrE,OAAO,IAAIgF,OAAO,CAAWC,OAAO,IAAK;MACvCzE,GAAG,CAAC;QAAEhB,OAAO,EAAE;UAAE,GAAGQ,KAAK;UAAEiF;QAAQ;MAAE,CAAC,CAAC;IACzC,CAAC,CAAC;EACJ,CAAC;EAEDC,cAAcA,CAACC,QAAiB,EAAQ;IACtC,MAAM3F,OAAO,GAAGH,KAAK,CAACG,OAAO;IAC7BgB,GAAG,CAAC;MAAEhB,OAAO,EAAE;IAAK,CAAC,CAAC;IACtBA,OAAO,EAAEyF,OAAO,CAACE,QAAQ,CAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEC,OAAOA,CAACpF,KAIP,EAAW;IACV,IAAIX,KAAK,CAACC,QAAQ,CAACP,MAAM,GAAG,CAAC,IAAIM,KAAK,CAACE,IAAI,EAAE,OAAO,KAAK;IACzDiB,GAAG,CAAC;MAAElB,QAAQ,EAAEU,KAAK,CAACV,QAAQ;MAAEK,OAAO,EAAEK,KAAK,CAACL,OAAO;MAAEI,KAAK,EAAEC,KAAK,CAACD;IAAM,CAAC,CAAC;IAC7E,OAAO,IAAI;EACb,CAAC;EAEDsF,KAAKA,CAAA,EAAS;IACZ;IACA;IACAhG,KAAK,CAACG,OAAO,EAAEyF,OAAO,CAAC,KAAK,CAAC;IAC7BzE,GAAG,CAAC;MACFlB,QAAQ,EAAE,EAAE;MACZC,IAAI,EAAE,KAAK;MACXC,OAAO,EAAE,IAAI;MACbC,MAAM,EAAE,IAAI;MACZE,OAAO,EAAE,CAAC,CAAC;MACXC,eAAe,EAAE,IAAI;MACrBC,WAAW,EAAE,CAAC,CAAC;MACfC,MAAM,EAAE,IAAI;MACZC,KAAK,EAAE;QAAEC,KAAK,EAAE,CAAC;QAAEC,MAAM,EAAE,CAAC;QAAEC,QAAQ,EAAE;MAAE;MAC1C;MACA;IACF,CAAC,CAAC;EACJ;AACF,CAAC","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _vitest = require("vitest");
4
+ var _agentCore = require("@buoy-gg/agent-core");
5
+ /**
6
+ * Ids from a RESTORED transcript must never collide with a fresh run's.
7
+ *
8
+ * The bug this covers, in full: every id counter restarted at 1 with the
9
+ * process, which was harmless until the transcript started outliving a reload.
10
+ * A restored conversation came back holding `rc1`, `ui1` and `m1`; the next
11
+ * turn minted `rc1` again; React saw two children with one key and rendered
12
+ * one of them twice while dropping the other. On screen that was the same
13
+ * store card appearing twice after a reload.
14
+ *
15
+ * Simulating a restart in one process is the whole difficulty — the module
16
+ * caches its counter. `idFactory` is the seam: a second factory stands in for
17
+ * the second run, and the shared RUN_ID is what has to differ between them.
18
+ */
19
+
20
+ (0, _vitest.describe)("ids across a restart", () => {
21
+ (0, _vitest.it)("never reissues an id a restored transcript already holds", () => {
22
+ // What a saved transcript carries, from a previous launch.
23
+ const restored = ["rcOLDRUN-1", "rcOLDRUN-2", "uiOLDRUN-1", "mOLDRUN-1"];
24
+ const rc = (0, _agentCore.idFactory)("rc");
25
+ const ui = (0, _agentCore.idFactory)("ui");
26
+ const m = (0, _agentCore.idFactory)("m");
27
+ const fresh = [rc(), rc(), ui(), m()];
28
+ for (const id of fresh) (0, _vitest.expect)(restored).not.toContain(id);
29
+ });
30
+ (0, _vitest.it)("still counts up within one run", () => {
31
+ // The counter is what keeps two blocks in the SAME turn apart.
32
+ const rc = (0, _agentCore.idFactory)("rc");
33
+ const ids = [rc(), rc(), rc()];
34
+ (0, _vitest.expect)(new Set(ids).size).toBe(3);
35
+ });
36
+ (0, _vitest.it)("keeps two prefixes apart even at the same count", () => {
37
+ const rc = (0, _agentCore.idFactory)("rc");
38
+ const ui = (0, _agentCore.idFactory)("ui");
39
+ (0, _vitest.expect)(rc()).not.toBe(ui());
40
+ });
41
+ (0, _vitest.it)("stamps a run token that is not a fixed string", () => {
42
+ // A constant here would put every install back where it started.
43
+ (0, _vitest.expect)(_agentCore.RUN_ID).toMatch(/^[a-z0-9]{4,8}$/);
44
+ (0, _vitest.expect)((0, _agentCore.idFactory)("rc")()).toBe(`rc${_agentCore.RUN_ID}-1`);
45
+ });
46
+ });
47
+ //# sourceMappingURL=restoredIds.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_vitest","require","_agentCore","describe","it","restored","rc","idFactory","ui","m","fresh","id","expect","not","toContain","ids","Set","size","toBe","RUN_ID","toMatch"],"sourceRoot":"../../../src","sources":["store/restoredIds.test.ts"],"mappings":";;AAcA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,IAAAE,gBAAQ,EAAC,sBAAsB,EAAE,MAAM;EACrC,IAAAC,UAAE,EAAC,0DAA0D,EAAE,MAAM;IACnE;IACA,MAAMC,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC;IACxE,MAAMC,EAAE,GAAG,IAAAC,oBAAS,EAAC,IAAI,CAAC;IAC1B,MAAMC,EAAE,GAAG,IAAAD,oBAAS,EAAC,IAAI,CAAC;IAC1B,MAAME,CAAC,GAAG,IAAAF,oBAAS,EAAC,GAAG,CAAC;IACxB,MAAMG,KAAK,GAAG,CAACJ,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,EAAEE,EAAE,CAAC,CAAC,EAAEC,CAAC,CAAC,CAAC,CAAC;IACrC,KAAK,MAAME,EAAE,IAAID,KAAK,EAAE,IAAAE,cAAM,EAACP,QAAQ,CAAC,CAACQ,GAAG,CAACC,SAAS,CAACH,EAAE,CAAC;EAC5D,CAAC,CAAC;EAEF,IAAAP,UAAE,EAAC,gCAAgC,EAAE,MAAM;IACzC;IACA,MAAME,EAAE,GAAG,IAAAC,oBAAS,EAAC,IAAI,CAAC;IAC1B,MAAMQ,GAAG,GAAG,CAACT,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,CAAC;IAC9B,IAAAM,cAAM,EAAC,IAAII,GAAG,CAACD,GAAG,CAAC,CAACE,IAAI,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;EACnC,CAAC,CAAC;EAEF,IAAAd,UAAE,EAAC,iDAAiD,EAAE,MAAM;IAC1D,MAAME,EAAE,GAAG,IAAAC,oBAAS,EAAC,IAAI,CAAC;IAC1B,MAAMC,EAAE,GAAG,IAAAD,oBAAS,EAAC,IAAI,CAAC;IAC1B,IAAAK,cAAM,EAACN,EAAE,CAAC,CAAC,CAAC,CAACO,GAAG,CAACK,IAAI,CAACV,EAAE,CAAC,CAAC,CAAC;EAC7B,CAAC,CAAC;EAEF,IAAAJ,UAAE,EAAC,+CAA+C,EAAE,MAAM;IACxD;IACA,IAAAQ,cAAM,EAACO,iBAAM,CAAC,CAACC,OAAO,CAAC,iBAAiB,CAAC;IACzC,IAAAR,cAAM,EAAC,IAAAL,oBAAS,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,KAAKC,iBAAM,IAAI,CAAC;EACjD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.hasTrace = hasTrace;
7
+ exports.traceEntries = traceEntries;
8
+ exports.traceToText = traceToText;
9
+ /**
10
+ * The agent's work for one answer, laid out in the order it happened.
11
+ *
12
+ * `traceEntries` is the ordering, shared by the collapsible strip in the chat
13
+ * and by the JSON export — the two must agree, because the point of the export
14
+ * is reading elsewhere the run you were just looking at. `traceToText` is the
15
+ * plain-text rendering, kept for a quick paste into Slack; the debugging
16
+ * artefact is `sessionExport.ts`.
17
+ *
18
+ * Reasoning and steps INTERLEAVE. One assistant bubble spans every turn of a
19
+ * multi-step run, so the real shape is "think, act, think, act"; lumping the
20
+ * thoughts at the top would misreport when the model knew what.
21
+ */
22
+
23
+ function traceEntries(message) {
24
+ const thoughts = [...(message.reasoning ?? [])].sort((a, b) => a.afterCalls - b.afterCalls);
25
+ const out = [];
26
+ let t = 0;
27
+ const drainTo = calls => {
28
+ while (t < thoughts.length && thoughts[t].afterCalls <= calls) {
29
+ out.push({
30
+ kind: "thought",
31
+ text: thoughts[t].text
32
+ });
33
+ t += 1;
34
+ }
35
+ };
36
+ message.toolCalls.forEach((call, i) => {
37
+ drainTo(i);
38
+ out.push({
39
+ kind: "step",
40
+ n: i + 1,
41
+ call
42
+ });
43
+ });
44
+ // Anything the model thought after its last tool call — usually the reasoning
45
+ // behind the answer itself, which is the most useful line in the trace.
46
+ drainTo(message.toolCalls.length);
47
+ return out;
48
+ }
49
+
50
+ /** Has this message anything to show? Drives whether the strip renders at all. */
51
+ function hasTrace(message) {
52
+ return (message.reasoning?.length ?? 0) > 0 || message.toolCalls.length > 0;
53
+ }
54
+ const statusWord = call => call.status === "ok" ? call.summary || "done" : call.status === "running" ? "running" : `${call.status}${call.summary ? ` — ${call.summary}` : ""}`;
55
+
56
+ /**
57
+ * The trace as plain text, for the clipboard.
58
+ *
59
+ * Indented under the answer it belongs to so a pasted session still reads as a
60
+ * conversation rather than a log dump.
61
+ */
62
+ function traceToText(message, indent = " ") {
63
+ const lines = [];
64
+ for (const entry of traceEntries(message)) {
65
+ if (entry.kind === "thought") {
66
+ lines.push(`${indent}[thinking]`);
67
+ for (const line of entry.text.trim().split("\n")) {
68
+ lines.push(`${indent} ${line}`);
69
+ }
70
+ } else {
71
+ const {
72
+ n,
73
+ call
74
+ } = entry;
75
+ lines.push(`${indent}[${n}] ${call.toolId}.${call.action} — ${statusWord(call)}`);
76
+ if (call.params) lines.push(`${indent} ${call.params}`);
77
+ }
78
+ }
79
+ return lines;
80
+ }
81
+ //# sourceMappingURL=traceText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["traceEntries","message","thoughts","reasoning","sort","a","b","afterCalls","out","t","drainTo","calls","length","push","kind","text","toolCalls","forEach","call","i","n","hasTrace","statusWord","status","summary","traceToText","indent","lines","entry","line","trim","split","toolId","action","params"],"sourceRoot":"../../../src","sources":["store/traceText.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ var _vitest = require("vitest");
4
+ var _traceText = require("./traceText");
5
+ /**
6
+ * The agent's working, as text.
7
+ *
8
+ * This exists so a tester can paste a run somewhere and find the step that
9
+ * broke, which puts two properties on it: reasoning and steps come out in the
10
+ * order they HAPPENED (a multi-step turn is think, act, think, act — not all
11
+ * the thoughts and then all the steps), and a failed step says so with its
12
+ * parameters attached, since "storage.set failed" without the value it wrote
13
+ * is not a bug report.
14
+ */
15
+
16
+ const call = (over = {}) => ({
17
+ id: "c1",
18
+ toolId: "zustand",
19
+ action: "getStoreState",
20
+ label: "Read the bag",
21
+ status: "ok",
22
+ summary: "Done",
23
+ ...over
24
+ });
25
+ const msg = (over = {}) => ({
26
+ id: "m1",
27
+ role: "assistant",
28
+ text: "Five items.",
29
+ toolCalls: [],
30
+ blocks: [],
31
+ ...over
32
+ });
33
+ (0, _vitest.describe)("the order of a trace", () => {
34
+ (0, _vitest.it)("interleaves thinking with the steps it led to", () => {
35
+ const m = msg({
36
+ toolCalls: [call({
37
+ id: "c1"
38
+ }), call({
39
+ id: "c2",
40
+ action: "setState"
41
+ })],
42
+ reasoning: [{
43
+ text: "I should read the bag first.",
44
+ afterCalls: 0
45
+ }, {
46
+ text: "Now I can write the new quantity.",
47
+ afterCalls: 1
48
+ }]
49
+ });
50
+ (0, _vitest.expect)((0, _traceText.traceEntries)(m).map(e => e.kind === "thought" ? "T" : `S${e.n}`)).toEqual(["T", "S1", "T", "S2"]);
51
+ });
52
+ (0, _vitest.it)("keeps a closing thought after the last step", () => {
53
+ // Usually the reasoning behind the ANSWER, which is the most useful line
54
+ // in the whole trace.
55
+ const m = msg({
56
+ toolCalls: [call()],
57
+ reasoning: [{
58
+ text: "That is everything the user asked for.",
59
+ afterCalls: 1
60
+ }]
61
+ });
62
+ const entries = (0, _traceText.traceEntries)(m);
63
+ (0, _vitest.expect)(entries[entries.length - 1]).toEqual({
64
+ kind: "thought",
65
+ text: "That is everything the user asked for."
66
+ });
67
+ });
68
+ (0, _vitest.it)("handles a turn with steps and no reasoning at all", () => {
69
+ // The common case: gpt-4.1 and friends report none.
70
+ const m = msg({
71
+ toolCalls: [call()]
72
+ });
73
+ (0, _vitest.expect)((0, _traceText.traceEntries)(m)).toHaveLength(1);
74
+ (0, _vitest.expect)((0, _traceText.hasTrace)(m)).toBe(true);
75
+ });
76
+ (0, _vitest.it)("has nothing to show for a plain answer", () => {
77
+ (0, _vitest.expect)((0, _traceText.hasTrace)(msg())).toBe(false);
78
+ });
79
+ });
80
+ (0, _vitest.describe)("the text it produces", () => {
81
+ (0, _vitest.it)("names the tool, the action, the outcome and the parameters", () => {
82
+ const m = msg({
83
+ toolCalls: [call({
84
+ params: '{"storeName":"Poké Mart bag"}'
85
+ })]
86
+ });
87
+ (0, _vitest.expect)((0, _traceText.traceToText)(m)).toEqual([" [1] zustand.getStoreState — Done", ' {"storeName":"Poké Mart bag"}']);
88
+ });
89
+ (0, _vitest.it)("makes a failure and its parameters findable", () => {
90
+ const m = msg({
91
+ toolCalls: [call({
92
+ toolId: "storage",
93
+ action: "async.setItem",
94
+ status: "failed",
95
+ summary: "key not found",
96
+ params: '{"key":"@pokemart/bag"}'
97
+ })]
98
+ });
99
+ (0, _vitest.expect)((0, _traceText.traceToText)(m).join("\n")).toContain("failed — key not found");
100
+ (0, _vitest.expect)((0, _traceText.traceToText)(m).join("\n")).toContain("@pokemart/bag");
101
+ });
102
+ (0, _vitest.it)("indents a multi-line thought so a pasted session still reads as one", () => {
103
+ const m = msg({
104
+ reasoning: [{
105
+ text: "First line.\nSecond line.",
106
+ afterCalls: 0
107
+ }]
108
+ });
109
+ (0, _vitest.expect)((0, _traceText.traceToText)(m)).toEqual([" [thinking]", " First line.", " Second line."]);
110
+ });
111
+ });
112
+ //# sourceMappingURL=traceText.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_vitest","require","_traceText","call","over","id","toolId","action","label","status","summary","msg","role","text","toolCalls","blocks","describe","it","m","reasoning","afterCalls","expect","traceEntries","map","e","kind","n","toEqual","entries","length","toHaveLength","hasTrace","toBe","params","traceToText","join","toContain"],"sourceRoot":"../../../src","sources":["store/traceText.test.ts"],"mappings":"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","ignoreList":[]}