@buoy-gg/ask-buoy 7.0.38 → 7.0.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/blocks/AskBlocks.js +338 -1
- package/lib/commonjs/blocks/AskBlocks.js.map +1 -0
- package/lib/commonjs/blocks/BlockRenderer.js +262 -1
- package/lib/commonjs/blocks/BlockRenderer.js.map +1 -0
- package/lib/commonjs/blocks/ChromePrototypes.js +514 -1
- package/lib/commonjs/blocks/ChromePrototypes.js.map +1 -0
- package/lib/commonjs/blocks/DataBlocks.js +781 -1
- package/lib/commonjs/blocks/DataBlocks.js.map +1 -0
- package/lib/commonjs/blocks/ExtraBlocks.js +1860 -1
- package/lib/commonjs/blocks/ExtraBlocks.js.map +1 -0
- package/lib/commonjs/blocks/MediaBlocks.js +156 -1
- package/lib/commonjs/blocks/MediaBlocks.js.map +1 -0
- package/lib/commonjs/blocks/ReceiptBlocks.js +586 -1
- package/lib/commonjs/blocks/ReceiptBlocks.js.map +1 -0
- package/lib/commonjs/blocks/blockText.js +60 -1
- package/lib/commonjs/blocks/blockText.js.map +1 -0
- package/lib/commonjs/blocks/blockText.test.js +53 -1
- package/lib/commonjs/blocks/blockText.test.js.map +1 -0
- package/lib/commonjs/blocks/context.js +42 -1
- package/lib/commonjs/blocks/context.js.map +1 -0
- package/lib/commonjs/blocks/icons.js +96 -1
- package/lib/commonjs/blocks/icons.js.map +1 -0
- package/lib/commonjs/blocks/index.js +95 -1
- package/lib/commonjs/blocks/index.js.map +1 -0
- package/lib/commonjs/blocks/listRow.test.js +55 -1
- package/lib/commonjs/blocks/listRow.test.js.map +1 -0
- package/lib/commonjs/blocks/pageState.js +34 -1
- package/lib/commonjs/blocks/pageState.js.map +1 -0
- package/lib/commonjs/blocks/pageState.test.js +57 -1
- package/lib/commonjs/blocks/pageState.test.js.map +1 -0
- package/lib/commonjs/blocks/primitives.js +457 -1
- package/lib/commonjs/blocks/primitives.js.map +1 -0
- package/lib/commonjs/blocks/primitivesIndex.js +62 -1
- package/lib/commonjs/blocks/primitivesIndex.js.map +1 -0
- package/lib/commonjs/components/ApprovalCard.js +297 -1
- package/lib/commonjs/components/ApprovalCard.js.map +1 -0
- package/lib/commonjs/components/AskBuoyHeader.js +196 -1
- package/lib/commonjs/components/AskBuoyHeader.js.map +1 -0
- package/lib/commonjs/components/AskBuoyIcon.js +19 -1
- package/lib/commonjs/components/AskBuoyIcon.js.map +1 -0
- package/lib/commonjs/components/AskBuoyModal.js +479 -1
- package/lib/commonjs/components/AskBuoyModal.js.map +1 -0
- package/lib/commonjs/components/AskBuoySettings.js +181 -1
- package/lib/commonjs/components/AskBuoySettings.js.map +1 -0
- package/lib/commonjs/components/ChangesBar.js +211 -1
- package/lib/commonjs/components/ChangesBar.js.map +1 -0
- package/lib/commonjs/components/Composer.js +255 -1
- package/lib/commonjs/components/Composer.js.map +1 -0
- package/lib/commonjs/components/EmptyState.js +161 -1
- package/lib/commonjs/components/EmptyState.js.map +1 -0
- package/lib/commonjs/components/KeyboardPad.js +80 -1
- package/lib/commonjs/components/KeyboardPad.js.map +1 -0
- package/lib/commonjs/components/Markdown.js +310 -1
- package/lib/commonjs/components/Markdown.js.map +1 -0
- package/lib/commonjs/components/MessageList.js +970 -1
- package/lib/commonjs/components/MessageList.js.map +1 -0
- package/lib/commonjs/components/QueuedMessages.js +145 -1
- package/lib/commonjs/components/QueuedMessages.js.map +1 -0
- package/lib/commonjs/components/ThinkingStrip.js +223 -1
- package/lib/commonjs/components/ThinkingStrip.js.map +1 -0
- package/lib/commonjs/components/TypingDots.js +63 -1
- package/lib/commonjs/components/TypingDots.js.map +1 -0
- package/lib/commonjs/components/markdownParse.js +131 -1
- package/lib/commonjs/components/markdownParse.js.map +1 -0
- package/lib/commonjs/components/markdownParse.test.js +99 -1
- package/lib/commonjs/components/markdownParse.test.js.map +1 -0
- package/lib/commonjs/components/useCopyAction.js +50 -1
- package/lib/commonjs/components/useCopyAction.js.map +1 -0
- package/lib/commonjs/index.js +252 -1
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/preset.js +91 -1
- package/lib/commonjs/preset.js.map +1 -0
- package/lib/commonjs/store/activityGroups.js +110 -1
- package/lib/commonjs/store/activityGroups.js.map +1 -0
- package/lib/commonjs/store/activityGroups.test.js +78 -1
- package/lib/commonjs/store/activityGroups.test.js.map +1 -0
- package/lib/commonjs/store/askBuoySettings.js +72 -1
- package/lib/commonjs/store/askBuoySettings.js.map +1 -0
- package/lib/commonjs/store/askBuoyStore.js +589 -1
- package/lib/commonjs/store/askBuoyStore.js.map +1 -0
- package/lib/commonjs/store/blockPlacement.js +64 -1
- package/lib/commonjs/store/blockPlacement.js.map +1 -0
- package/lib/commonjs/store/blockPlacement.test.js +123 -1
- package/lib/commonjs/store/blockPlacement.test.js.map +1 -0
- package/lib/commonjs/store/queue.test.js +150 -1
- package/lib/commonjs/store/queue.test.js.map +1 -0
- package/lib/commonjs/store/resetConversation.js +77 -1
- package/lib/commonjs/store/resetConversation.js.map +1 -0
- package/lib/commonjs/store/restorePending.test.js +63 -1
- package/lib/commonjs/store/restorePending.test.js.map +1 -0
- package/lib/commonjs/store/restoredIds.test.js +47 -1
- package/lib/commonjs/store/restoredIds.test.js.map +1 -0
- package/lib/commonjs/store/suggestions.js +54 -1
- package/lib/commonjs/store/suggestions.js.map +1 -0
- package/lib/commonjs/store/suggestions.test.js +58 -1
- package/lib/commonjs/store/suggestions.test.js.map +1 -0
- package/lib/commonjs/store/systemLine.test.js +77 -1
- package/lib/commonjs/store/systemLine.test.js.map +1 -0
- package/lib/commonjs/store/ticketPrompt.js +17 -1
- package/lib/commonjs/store/ticketPrompt.js.map +1 -0
- package/lib/commonjs/store/traceText.js +81 -1
- package/lib/commonjs/store/traceText.js.map +1 -0
- package/lib/commonjs/store/traceText.test.js +112 -1
- package/lib/commonjs/store/traceText.test.js.map +1 -0
- package/lib/commonjs/store/transcriptPersistence.js +297 -1
- package/lib/commonjs/store/transcriptPersistence.js.map +1 -0
- package/lib/commonjs/store/transcriptPersistence.test.js +333 -1
- package/lib/commonjs/store/transcriptPersistence.test.js.map +1 -0
- package/lib/commonjs/store/turnRendering.test.js +151 -1
- package/lib/commonjs/store/turnRendering.test.js.map +1 -0
- package/lib/commonjs/store/useAskBuoy.js +651 -1
- package/lib/commonjs/store/useAskBuoy.js.map +1 -0
- package/lib/commonjs/store/useAskBuoySettings.js +14 -1
- package/lib/commonjs/store/useAskBuoySettings.js.map +1 -0
- package/lib/commonjs/sync/askBuoySyncAdapter.js +153 -1
- package/lib/commonjs/sync/askBuoySyncAdapter.js.map +1 -0
- package/lib/commonjs/sync/askBuoySyncAdapter.test.js +141 -1
- package/lib/commonjs/sync/askBuoySyncAdapter.test.js.map +1 -0
- package/lib/commonjs/sync/wire.js +58 -1
- package/lib/commonjs/sync/wire.js.map +1 -0
- package/lib/commonjs/types.js +6 -1
- package/lib/commonjs/types.js.map +1 -0
- package/lib/module/blocks/AskBlocks.js +331 -1
- package/lib/module/blocks/AskBlocks.js.map +1 -0
- package/lib/module/blocks/BlockRenderer.js +257 -1
- package/lib/module/blocks/BlockRenderer.js.map +1 -0
- package/lib/module/blocks/ChromePrototypes.js +503 -1
- package/lib/module/blocks/ChromePrototypes.js.map +1 -0
- package/lib/module/blocks/DataBlocks.js +767 -1
- package/lib/module/blocks/DataBlocks.js.map +1 -0
- package/lib/module/blocks/ExtraBlocks.js +1833 -1
- package/lib/module/blocks/ExtraBlocks.js.map +1 -0
- package/lib/module/blocks/MediaBlocks.js +151 -1
- package/lib/module/blocks/MediaBlocks.js.map +1 -0
- package/lib/module/blocks/ReceiptBlocks.js +574 -1
- package/lib/module/blocks/ReceiptBlocks.js.map +1 -0
- package/lib/module/blocks/blockText.js +55 -1
- package/lib/module/blocks/blockText.js.map +1 -0
- package/lib/module/blocks/blockText.test.js +53 -1
- package/lib/module/blocks/blockText.test.js.map +1 -0
- package/lib/module/blocks/context.js +35 -1
- package/lib/module/blocks/context.js.map +1 -0
- package/lib/module/blocks/icons.js +91 -1
- package/lib/module/blocks/icons.js.map +1 -0
- package/lib/module/blocks/index.js +8 -1
- package/lib/module/blocks/index.js.map +1 -0
- package/lib/module/blocks/listRow.test.js +56 -1
- package/lib/module/blocks/listRow.test.js.map +1 -0
- package/lib/module/blocks/pageState.js +30 -1
- package/lib/module/blocks/pageState.js.map +1 -0
- package/lib/module/blocks/pageState.test.js +56 -1
- package/lib/module/blocks/pageState.test.js.map +1 -0
- package/lib/module/blocks/primitives.js +445 -1
- package/lib/module/blocks/primitives.js.map +1 -0
- package/lib/module/blocks/primitivesIndex.js +5 -1
- package/lib/module/blocks/primitivesIndex.js.map +1 -0
- package/lib/module/components/ApprovalCard.js +292 -1
- package/lib/module/components/ApprovalCard.js.map +1 -0
- package/lib/module/components/AskBuoyHeader.js +193 -1
- package/lib/module/components/AskBuoyHeader.js.map +1 -0
- package/lib/module/components/AskBuoyIcon.js +8 -1
- package/lib/module/components/AskBuoyIcon.js.map +1 -0
- package/lib/module/components/AskBuoyModal.js +474 -1
- package/lib/module/components/AskBuoyModal.js.map +1 -0
- package/lib/module/components/AskBuoySettings.js +176 -1
- package/lib/module/components/AskBuoySettings.js.map +1 -0
- package/lib/module/components/ChangesBar.js +206 -1
- package/lib/module/components/ChangesBar.js.map +1 -0
- package/lib/module/components/Composer.js +250 -1
- package/lib/module/components/Composer.js.map +1 -0
- package/lib/module/components/EmptyState.js +156 -1
- package/lib/module/components/EmptyState.js.map +1 -0
- package/lib/module/components/KeyboardPad.js +75 -1
- package/lib/module/components/KeyboardPad.js.map +1 -0
- package/lib/module/components/Markdown.js +305 -1
- package/lib/module/components/Markdown.js.map +1 -0
- package/lib/module/components/MessageList.js +964 -1
- package/lib/module/components/MessageList.js.map +1 -0
- package/lib/module/components/QueuedMessages.js +140 -1
- package/lib/module/components/QueuedMessages.js.map +1 -0
- package/lib/module/components/ThinkingStrip.js +218 -1
- package/lib/module/components/ThinkingStrip.js.map +1 -0
- package/lib/module/components/TypingDots.js +58 -1
- package/lib/module/components/TypingDots.js.map +1 -0
- package/lib/module/components/markdownParse.js +125 -1
- package/lib/module/components/markdownParse.js.map +1 -0
- package/lib/module/components/markdownParse.test.js +98 -1
- package/lib/module/components/markdownParse.test.js.map +1 -0
- package/lib/module/components/useCopyAction.js +46 -1
- package/lib/module/components/useCopyAction.js.map +1 -0
- package/lib/module/index.js +34 -1
- package/lib/module/index.js.map +1 -0
- package/lib/module/preset.js +74 -1
- package/lib/module/preset.js.map +1 -0
- package/lib/module/store/activityGroups.js +103 -1
- package/lib/module/store/activityGroups.js.map +1 -0
- package/lib/module/store/activityGroups.test.js +77 -1
- package/lib/module/store/activityGroups.test.js.map +1 -0
- package/lib/module/store/askBuoySettings.js +67 -1
- package/lib/module/store/askBuoySettings.js.map +1 -0
- package/lib/module/store/askBuoyStore.js +583 -1
- package/lib/module/store/askBuoyStore.js.map +1 -0
- package/lib/module/store/blockPlacement.js +59 -1
- package/lib/module/store/blockPlacement.js.map +1 -0
- package/lib/module/store/blockPlacement.test.js +122 -1
- package/lib/module/store/blockPlacement.test.js.map +1 -0
- package/lib/module/store/queue.test.js +149 -1
- package/lib/module/store/queue.test.js.map +1 -0
- package/lib/module/store/resetConversation.js +72 -1
- package/lib/module/store/resetConversation.js.map +1 -0
- package/lib/module/store/restorePending.test.js +62 -1
- package/lib/module/store/restorePending.test.js.map +1 -0
- package/lib/module/store/restoredIds.test.js +46 -1
- package/lib/module/store/restoredIds.test.js.map +1 -0
- package/lib/module/store/suggestions.js +49 -1
- package/lib/module/store/suggestions.js.map +1 -0
- package/lib/module/store/suggestions.test.js +57 -1
- package/lib/module/store/suggestions.test.js.map +1 -0
- package/lib/module/store/systemLine.test.js +76 -1
- package/lib/module/store/systemLine.test.js.map +1 -0
- package/lib/module/store/ticketPrompt.js +13 -1
- package/lib/module/store/ticketPrompt.js.map +1 -0
- package/lib/module/store/traceText.js +75 -1
- package/lib/module/store/traceText.js.map +1 -0
- package/lib/module/store/traceText.test.js +111 -1
- package/lib/module/store/traceText.test.js.map +1 -0
- package/lib/module/store/transcriptPersistence.js +287 -1
- package/lib/module/store/transcriptPersistence.js.map +1 -0
- package/lib/module/store/transcriptPersistence.test.js +332 -1
- package/lib/module/store/transcriptPersistence.test.js.map +1 -0
- package/lib/module/store/turnRendering.test.js +150 -1
- package/lib/module/store/turnRendering.test.js.map +1 -0
- package/lib/module/store/useAskBuoy.js +646 -1
- package/lib/module/store/useAskBuoy.js.map +1 -0
- package/lib/module/store/useAskBuoySettings.js +9 -1
- package/lib/module/store/useAskBuoySettings.js.map +1 -0
- package/lib/module/sync/askBuoySyncAdapter.js +148 -1
- package/lib/module/sync/askBuoySyncAdapter.js.map +1 -0
- package/lib/module/sync/askBuoySyncAdapter.test.js +140 -1
- package/lib/module/sync/askBuoySyncAdapter.test.js.map +1 -0
- package/lib/module/sync/wire.js +47 -1
- package/lib/module/sync/wire.js.map +1 -0
- package/lib/module/types.js +4 -1
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/blocks/AskBlocks.d.ts.map +1 -0
- package/lib/typescript/blocks/BlockRenderer.d.ts.map +1 -0
- package/lib/typescript/blocks/ChromePrototypes.d.ts.map +1 -0
- package/lib/typescript/blocks/DataBlocks.d.ts.map +1 -0
- package/lib/typescript/blocks/ExtraBlocks.d.ts.map +1 -0
- package/lib/typescript/blocks/MediaBlocks.d.ts.map +1 -0
- package/lib/typescript/blocks/ReceiptBlocks.d.ts.map +1 -0
- package/lib/typescript/blocks/blockText.d.ts.map +1 -0
- package/lib/typescript/blocks/blockText.test.d.ts.map +1 -0
- package/lib/typescript/blocks/context.d.ts.map +1 -0
- package/lib/typescript/blocks/icons.d.ts.map +1 -0
- package/lib/typescript/blocks/index.d.ts.map +1 -0
- package/lib/typescript/blocks/listRow.test.d.ts.map +1 -0
- package/lib/typescript/blocks/pageState.d.ts.map +1 -0
- package/lib/typescript/blocks/pageState.test.d.ts.map +1 -0
- package/lib/typescript/blocks/primitives.d.ts.map +1 -0
- package/lib/typescript/blocks/primitivesIndex.d.ts.map +1 -0
- package/lib/typescript/components/ApprovalCard.d.ts.map +1 -0
- package/lib/typescript/components/AskBuoyHeader.d.ts.map +1 -0
- package/lib/typescript/components/AskBuoyIcon.d.ts.map +1 -0
- package/lib/typescript/components/AskBuoyModal.d.ts.map +1 -0
- package/lib/typescript/components/AskBuoySettings.d.ts.map +1 -0
- package/lib/typescript/components/ChangesBar.d.ts.map +1 -0
- package/lib/typescript/components/Composer.d.ts.map +1 -0
- package/lib/typescript/components/EmptyState.d.ts.map +1 -0
- package/lib/typescript/components/KeyboardPad.d.ts.map +1 -0
- package/lib/typescript/components/Markdown.d.ts.map +1 -0
- package/lib/typescript/components/MessageList.d.ts.map +1 -0
- package/lib/typescript/components/QueuedMessages.d.ts.map +1 -0
- package/lib/typescript/components/ThinkingStrip.d.ts.map +1 -0
- package/lib/typescript/components/TypingDots.d.ts.map +1 -0
- package/lib/typescript/components/markdownParse.d.ts.map +1 -0
- package/lib/typescript/components/markdownParse.test.d.ts.map +1 -0
- package/lib/typescript/components/useCopyAction.d.ts.map +1 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/preset.d.ts.map +1 -0
- package/lib/typescript/store/activityGroups.d.ts.map +1 -0
- package/lib/typescript/store/activityGroups.test.d.ts.map +1 -0
- package/lib/typescript/store/askBuoySettings.d.ts.map +1 -0
- package/lib/typescript/store/askBuoyStore.d.ts.map +1 -0
- package/lib/typescript/store/blockPlacement.d.ts.map +1 -0
- package/lib/typescript/store/blockPlacement.test.d.ts.map +1 -0
- package/lib/typescript/store/queue.test.d.ts.map +1 -0
- package/lib/typescript/store/resetConversation.d.ts.map +1 -0
- package/lib/typescript/store/restorePending.test.d.ts.map +1 -0
- package/lib/typescript/store/restoredIds.test.d.ts.map +1 -0
- package/lib/typescript/store/suggestions.d.ts.map +1 -0
- package/lib/typescript/store/suggestions.test.d.ts.map +1 -0
- package/lib/typescript/store/systemLine.test.d.ts.map +1 -0
- package/lib/typescript/store/ticketPrompt.d.ts.map +1 -0
- package/lib/typescript/store/traceText.d.ts.map +1 -0
- package/lib/typescript/store/traceText.test.d.ts.map +1 -0
- package/lib/typescript/store/transcriptPersistence.d.ts.map +1 -0
- package/lib/typescript/store/transcriptPersistence.test.d.ts.map +1 -0
- package/lib/typescript/store/turnRendering.test.d.ts.map +1 -0
- package/lib/typescript/store/useAskBuoy.d.ts.map +1 -0
- package/lib/typescript/store/useAskBuoySettings.d.ts.map +1 -0
- package/lib/typescript/sync/askBuoySyncAdapter.d.ts.map +1 -0
- package/lib/typescript/sync/askBuoySyncAdapter.test.d.ts.map +1 -0
- package/lib/typescript/sync/wire.d.ts.map +1 -0
- package/lib/typescript/types.d.ts.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1 @@
|
|
|
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","trusted","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","droppedPinned","endedAt","splice","map","secs","Math","max","round","inMs","waiting","reason","attempt","maxAttempts","breakBeforeNextText","breakBefore","trimEnd","delta","reasoning","afterCalls","toolId","action","label","description","status","effect","c","ok","summary","durationMs","result","verification","block","forToolCallId","error","message","markStopped","stopped","finishAssistant","askApproval","Promise","resolve","answerApproval","approved","trust","t","untrust","restorePending","restored","addNote","hydrate","reset","turnPhaseOf","s","queuePauseReason","phase","last"],"sourceRoot":"../../../src","sources":["store/askBuoyStore.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1,59 @@
|
|
|
1
|
-
"use strict";
|
|
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":[]}
|
|
@@ -1 +1,122 @@
|
|
|
1
|
-
"use strict";
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","placeBlocks","placed","b","forToolCallId","block","grid","id","kind","source","images","url","alt","afterText","nested","map","p","toEqual","size","toBe","read","pairs","get","write","changes","orphan","confirm","change","ask"],"sourceRoot":"../../../src","sources":["store/blockPlacement.test.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1,149 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The queue is a list, and it knows when to hold.
|
|
5
|
+
*
|
|
6
|
+
* Both rules were written from a defect: the single slot this replaced
|
|
7
|
+
* OVERWROTE — type two things mid-turn and the first vanished — and its flush
|
|
8
|
+
* ran on `!busy` alone, so a parked message fired into a dead connection after
|
|
9
|
+
* an error and was sent as the answer to an open choice block.
|
|
10
|
+
*/
|
|
11
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
12
|
+
import { askBuoyStore, queuePauseReason, turnPhaseOf } from "./askBuoyStore";
|
|
13
|
+
beforeEach(() => askBuoyStore.reset());
|
|
14
|
+
const texts = () => askBuoyStore.getState().queued.map(q => q.text);
|
|
15
|
+
describe("queue", () => {
|
|
16
|
+
it("keeps every message, in the order typed", () => {
|
|
17
|
+
askBuoyStore.enqueue("then set points to 1500");
|
|
18
|
+
askBuoyStore.enqueue("and clear the cart after");
|
|
19
|
+
expect(texts()).toEqual(["then set points to 1500", "and clear the cart after"]);
|
|
20
|
+
});
|
|
21
|
+
it("gives identical requests distinct ids", () => {
|
|
22
|
+
const a = askBuoyStore.enqueue("again");
|
|
23
|
+
const b = askBuoyStore.enqueue("again");
|
|
24
|
+
expect(a.id).not.toBe(b.id);
|
|
25
|
+
askBuoyStore.removeQueued(a.id);
|
|
26
|
+
expect(texts()).toEqual(["again"]);
|
|
27
|
+
});
|
|
28
|
+
it("delivers from the front, one at a time", () => {
|
|
29
|
+
askBuoyStore.enqueue("one");
|
|
30
|
+
askBuoyStore.enqueue("two");
|
|
31
|
+
expect(askBuoyStore.shiftQueued()?.text).toBe("one");
|
|
32
|
+
expect(texts()).toEqual(["two"]);
|
|
33
|
+
expect(askBuoyStore.shiftQueued()?.text).toBe("two");
|
|
34
|
+
expect(askBuoyStore.shiftQueued()).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
it("comes back from disk as unsent rows", () => {
|
|
37
|
+
const ok = askBuoyStore.hydrate({
|
|
38
|
+
messages: [{
|
|
39
|
+
id: "m1",
|
|
40
|
+
role: "user",
|
|
41
|
+
text: "hi",
|
|
42
|
+
toolCalls: [],
|
|
43
|
+
blocks: []
|
|
44
|
+
}],
|
|
45
|
+
answers: {},
|
|
46
|
+
usage: {
|
|
47
|
+
input: 0,
|
|
48
|
+
output: 0,
|
|
49
|
+
requests: 0
|
|
50
|
+
},
|
|
51
|
+
queued: [{
|
|
52
|
+
id: "q1",
|
|
53
|
+
text: "still waiting"
|
|
54
|
+
}]
|
|
55
|
+
});
|
|
56
|
+
expect(ok).toBe(true);
|
|
57
|
+
expect(texts()).toEqual(["still waiting"]);
|
|
58
|
+
// Idle with nothing wrong — but hydrate itself never sends; the flush
|
|
59
|
+
// effect in the hook does, and only once the user is looking.
|
|
60
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("idle");
|
|
61
|
+
});
|
|
62
|
+
it("is emptied by a new conversation", () => {
|
|
63
|
+
askBuoyStore.enqueue("gone");
|
|
64
|
+
askBuoyStore.reset();
|
|
65
|
+
expect(texts()).toEqual([]);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("turnPhase", () => {
|
|
69
|
+
it("is idle with nothing going on", () => {
|
|
70
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("idle");
|
|
71
|
+
});
|
|
72
|
+
it("is running during a turn, and stopping once Stop is pressed", () => {
|
|
73
|
+
askBuoyStore.addUser("go");
|
|
74
|
+
askBuoyStore.startAssistant();
|
|
75
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("running");
|
|
76
|
+
askBuoyStore.requestStop();
|
|
77
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("stopping");
|
|
78
|
+
});
|
|
79
|
+
it("is awaitingApproval while a card is up, even though the turn is busy", () => {
|
|
80
|
+
askBuoyStore.addUser("wipe it");
|
|
81
|
+
askBuoyStore.startAssistant();
|
|
82
|
+
void askBuoyStore.askApproval({
|
|
83
|
+
id: "c1",
|
|
84
|
+
toolId: "storage",
|
|
85
|
+
action: "clearAll",
|
|
86
|
+
label: "Clear all saved app data",
|
|
87
|
+
reason: "Wipes everything"
|
|
88
|
+
});
|
|
89
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("awaitingApproval");
|
|
90
|
+
});
|
|
91
|
+
it("is awaitingAnswer after a turn ends on an Ask block", () => {
|
|
92
|
+
const id = askBuoyStore.startAssistant();
|
|
93
|
+
askBuoyStore.applyEvent(id, {
|
|
94
|
+
type: "awaiting-user",
|
|
95
|
+
blockId: "b1"
|
|
96
|
+
});
|
|
97
|
+
askBuoyStore.finishAssistant(id);
|
|
98
|
+
expect(turnPhaseOf(askBuoyStore.getState())).toBe("awaitingAnswer");
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe("when the queue holds", () => {
|
|
102
|
+
it("delivers when idle and the last turn was fine", () => {
|
|
103
|
+
askBuoyStore.addUser("hi");
|
|
104
|
+
const id = askBuoyStore.startAssistant();
|
|
105
|
+
askBuoyStore.applyEvent(id, {
|
|
106
|
+
type: "text",
|
|
107
|
+
delta: "Hello."
|
|
108
|
+
});
|
|
109
|
+
askBuoyStore.finishAssistant(id);
|
|
110
|
+
expect(queuePauseReason(askBuoyStore.getState())).toBeNull();
|
|
111
|
+
});
|
|
112
|
+
it("holds after an error, and says so", () => {
|
|
113
|
+
askBuoyStore.addUser("hi");
|
|
114
|
+
const id = askBuoyStore.startAssistant();
|
|
115
|
+
askBuoyStore.applyEvent(id, {
|
|
116
|
+
type: "error",
|
|
117
|
+
message: "fetch failed"
|
|
118
|
+
});
|
|
119
|
+
askBuoyStore.finishAssistant(id);
|
|
120
|
+
expect(queuePauseReason(askBuoyStore.getState())).toMatch(/failed/);
|
|
121
|
+
});
|
|
122
|
+
it("holds while an approval card is up", () => {
|
|
123
|
+
askBuoyStore.addUser("wipe");
|
|
124
|
+
askBuoyStore.startAssistant();
|
|
125
|
+
void askBuoyStore.askApproval({
|
|
126
|
+
id: "c1",
|
|
127
|
+
toolId: "storage",
|
|
128
|
+
action: "clearAll",
|
|
129
|
+
label: "Clear all saved app data",
|
|
130
|
+
reason: "Wipes everything"
|
|
131
|
+
});
|
|
132
|
+
expect(queuePauseReason(askBuoyStore.getState())).toMatch(/approval/);
|
|
133
|
+
});
|
|
134
|
+
it("holds while a question is unanswered — a queued task is not the answer", () => {
|
|
135
|
+
const id = askBuoyStore.startAssistant();
|
|
136
|
+
askBuoyStore.applyEvent(id, {
|
|
137
|
+
type: "awaiting-user",
|
|
138
|
+
blockId: "b1"
|
|
139
|
+
});
|
|
140
|
+
askBuoyStore.finishAssistant(id);
|
|
141
|
+
expect(queuePauseReason(askBuoyStore.getState())).toMatch(/question/);
|
|
142
|
+
});
|
|
143
|
+
it("says nothing while a turn is still running — the queue is simply waiting", () => {
|
|
144
|
+
askBuoyStore.addUser("go");
|
|
145
|
+
askBuoyStore.startAssistant();
|
|
146
|
+
expect(queuePauseReason(askBuoyStore.getState())).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
//# sourceMappingURL=queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","it","askBuoyStore","queuePauseReason","turnPhaseOf","reset","texts","getState","queued","map","q","text","enqueue","toEqual","a","b","id","not","toBe","removeQueued","shiftQueued","toBeUndefined","ok","hydrate","messages","role","toolCalls","blocks","answers","usage","input","output","requests","addUser","startAssistant","requestStop","askApproval","toolId","action","label","reason","applyEvent","type","blockId","finishAssistant","delta","toBeNull","message","toMatch"],"sourceRoot":"../../../src","sources":["store/queue.test.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAEzD,SAASC,YAAY,EAAEC,gBAAgB,EAAEC,WAAW,QAAQ,gBAAgB;AAE5EN,UAAU,CAAC,MAAMI,YAAY,CAACG,KAAK,CAAC,CAAC,CAAC;AAEtC,MAAMC,KAAK,GAAGA,CAAA,KAAMJ,YAAY,CAACK,QAAQ,CAAC,CAAC,CAACC,MAAM,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,IAAI,CAAC;AAErEZ,QAAQ,CAAC,OAAO,EAAE,MAAM;EACtBE,EAAE,CAAC,yCAAyC,EAAE,MAAM;IAClDC,YAAY,CAACU,OAAO,CAAC,yBAAyB,CAAC;IAC/CV,YAAY,CAACU,OAAO,CAAC,0BAA0B,CAAC;IAChDZ,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,yBAAyB,EAAE,0BAA0B,CAAC,CAAC;EAClF,CAAC,CAAC;EAEFZ,EAAE,CAAC,uCAAuC,EAAE,MAAM;IAChD,MAAMa,CAAC,GAAGZ,YAAY,CAACU,OAAO,CAAC,OAAO,CAAC;IACvC,MAAMG,CAAC,GAAGb,YAAY,CAACU,OAAO,CAAC,OAAO,CAAC;IACvCZ,MAAM,CAACc,CAAC,CAACE,EAAE,CAAC,CAACC,GAAG,CAACC,IAAI,CAACH,CAAC,CAACC,EAAE,CAAC;IAC3Bd,YAAY,CAACiB,YAAY,CAACL,CAAC,CAACE,EAAE,CAAC;IAC/BhB,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;EACpC,CAAC,CAAC;EAEFZ,EAAE,CAAC,wCAAwC,EAAE,MAAM;IACjDC,YAAY,CAACU,OAAO,CAAC,KAAK,CAAC;IAC3BV,YAAY,CAACU,OAAO,CAAC,KAAK,CAAC;IAC3BZ,MAAM,CAACE,YAAY,CAACkB,WAAW,CAAC,CAAC,EAAET,IAAI,CAAC,CAACO,IAAI,CAAC,KAAK,CAAC;IACpDlB,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;IAChCb,MAAM,CAACE,YAAY,CAACkB,WAAW,CAAC,CAAC,EAAET,IAAI,CAAC,CAACO,IAAI,CAAC,KAAK,CAAC;IACpDlB,MAAM,CAACE,YAAY,CAACkB,WAAW,CAAC,CAAC,CAAC,CAACC,aAAa,CAAC,CAAC;EACpD,CAAC,CAAC;EAEFpB,EAAE,CAAC,qCAAqC,EAAE,MAAM;IAC9C,MAAMqB,EAAE,GAAGpB,YAAY,CAACqB,OAAO,CAAC;MAC9BC,QAAQ,EAAE,CAAC;QAAER,EAAE,EAAE,IAAI;QAAES,IAAI,EAAE,MAAM;QAAEd,IAAI,EAAE,IAAI;QAAEe,SAAS,EAAE,EAAE;QAAEC,MAAM,EAAE;MAAG,CAAC,CAAC;MAC7EC,OAAO,EAAE,CAAC,CAAC;MACXC,KAAK,EAAE;QAAEC,KAAK,EAAE,CAAC;QAAEC,MAAM,EAAE,CAAC;QAAEC,QAAQ,EAAE;MAAE,CAAC;MAC3CxB,MAAM,EAAE,CAAC;QAAEQ,EAAE,EAAE,IAAI;QAAEL,IAAI,EAAE;MAAgB,CAAC;IAC9C,CAAC,CAAC;IACFX,MAAM,CAACsB,EAAE,CAAC,CAACJ,IAAI,CAAC,IAAI,CAAC;IACrBlB,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC;IAC1C;IACA;IACAb,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,MAAM,CAAC;EAC3D,CAAC,CAAC;EAEFjB,EAAE,CAAC,kCAAkC,EAAE,MAAM;IAC3CC,YAAY,CAACU,OAAO,CAAC,MAAM,CAAC;IAC5BV,YAAY,CAACG,KAAK,CAAC,CAAC;IACpBL,MAAM,CAACM,KAAK,CAAC,CAAC,CAAC,CAACO,OAAO,CAAC,EAAE,CAAC;EAC7B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFd,QAAQ,CAAC,WAAW,EAAE,MAAM;EAC1BE,EAAE,CAAC,+BAA+B,EAAE,MAAM;IACxCD,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,MAAM,CAAC;EAC3D,CAAC,CAAC;EAEFjB,EAAE,CAAC,6DAA6D,EAAE,MAAM;IACtEC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7BlC,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,SAAS,CAAC;IAC5DhB,YAAY,CAACiC,WAAW,CAAC,CAAC;IAC1BnC,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,UAAU,CAAC;EAC/D,CAAC,CAAC;EAEFjB,EAAE,CAAC,sEAAsE,EAAE,MAAM;IAC/EC,YAAY,CAAC+B,OAAO,CAAC,SAAS,CAAC;IAC/B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7B,KAAKhC,YAAY,CAACkC,WAAW,CAAC;MAC5BpB,EAAE,EAAE,IAAI;MACRqB,MAAM,EAAE,SAAS;MACjBC,MAAM,EAAE,UAAU;MAClBC,KAAK,EAAE,0BAA0B;MACjCC,MAAM,EAAE;IACV,CAAC,CAAC;IACFxC,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,kBAAkB,CAAC;EACvE,CAAC,CAAC;EAEFjB,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC9D,MAAMe,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,eAAe;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC;IACrEzC,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACI,WAAW,CAACF,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACW,IAAI,CAAC,gBAAgB,CAAC;EACrE,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFnB,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrCE,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxDC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAMjB,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,MAAM;MAAEG,KAAK,EAAE;IAAS,CAAC,CAAC;IAC9D3C,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACuC,QAAQ,CAAC,CAAC;EAC9D,CAAC,CAAC;EAEF7C,EAAE,CAAC,mCAAmC,EAAE,MAAM;IAC5CC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAMjB,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,OAAO;MAAEK,OAAO,EAAE;IAAe,CAAC,CAAC;IACvE7C,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACyC,OAAO,CAAC,QAAQ,CAAC;EACrE,CAAC,CAAC;EAEF/C,EAAE,CAAC,oCAAoC,EAAE,MAAM;IAC7CC,YAAY,CAAC+B,OAAO,CAAC,MAAM,CAAC;IAC5B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7B,KAAKhC,YAAY,CAACkC,WAAW,CAAC;MAC5BpB,EAAE,EAAE,IAAI;MACRqB,MAAM,EAAE,SAAS;MACjBC,MAAM,EAAE,UAAU;MAClBC,KAAK,EAAE,0BAA0B;MACjCC,MAAM,EAAE;IACV,CAAC,CAAC;IACFxC,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACyC,OAAO,CAAC,UAAU,CAAC;EACvE,CAAC,CAAC;EAEF/C,EAAE,CAAC,wEAAwE,EAAE,MAAM;IACjF,MAAMe,EAAE,GAAGd,YAAY,CAACgC,cAAc,CAAC,CAAC;IACxChC,YAAY,CAACuC,UAAU,CAACzB,EAAE,EAAE;MAAE0B,IAAI,EAAE,eAAe;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC;IACrEzC,YAAY,CAAC0C,eAAe,CAAC5B,EAAE,CAAC;IAChChB,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACyC,OAAO,CAAC,UAAU,CAAC;EACvE,CAAC,CAAC;EAEF/C,EAAE,CAAC,0EAA0E,EAAE,MAAM;IACnFC,YAAY,CAAC+B,OAAO,CAAC,IAAI,CAAC;IAC1B/B,YAAY,CAACgC,cAAc,CAAC,CAAC;IAC7BlC,MAAM,CAACG,gBAAgB,CAACD,YAAY,CAACK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACuC,QAAQ,CAAC,CAAC;EAC9D,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1,72 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* "New conversation" — the ONE way a conversation is cleared.
|
|
5
|
+
*
|
|
6
|
+
* Clearing drops the effect ledger, which is the only undo surface, while the
|
|
7
|
+
* agent's changes stay live in the app. So the path that clears has to be the
|
|
8
|
+
* path that knows whether undo succeeded — and there used to be two paths
|
|
9
|
+
* that did not: the sheet's "Undo, then clear" awaited `revertAll` and reset
|
|
10
|
+
* without reading the outcome (two of five reverts fail, the conversation
|
|
11
|
+
* clears anyway, two changes stay applied with no record), and the desktop's
|
|
12
|
+
* `reset` action skipped the question entirely.
|
|
13
|
+
*
|
|
14
|
+
* Both now come through here. A failed revert does NOT clear: the caller gets
|
|
15
|
+
* the list of what is still applied and clearing becomes a second, explicit
|
|
16
|
+
* choice.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { askBuoyStore } from "./askBuoyStore";
|
|
20
|
+
import { clearTranscript } from "./transcriptPersistence";
|
|
21
|
+
/** Clear everything, unconditionally. The caller has already decided. */
|
|
22
|
+
export function clearConversation() {
|
|
23
|
+
// All three, or the conversation this said it had cleared comes straight
|
|
24
|
+
// back on the next reload with its undo bar intact.
|
|
25
|
+
askBuoyStore.getHeldSession()?.session.reset();
|
|
26
|
+
askBuoyStore.reset();
|
|
27
|
+
void clearTranscript();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Undo what can be undone, then clear — unless something would not go back.
|
|
32
|
+
*
|
|
33
|
+
* Refuses while a turn is running: the ledger is being written to, and a
|
|
34
|
+
* revert racing a dispatch is how "changed since Ask Buoy wrote it" happens
|
|
35
|
+
* to our own write.
|
|
36
|
+
*/
|
|
37
|
+
export async function resetConversation(input) {
|
|
38
|
+
if (askBuoyStore.getState().busy) {
|
|
39
|
+
return {
|
|
40
|
+
cleared: false,
|
|
41
|
+
reverted: 0,
|
|
42
|
+
failed: [{
|
|
43
|
+
label: "A turn is running",
|
|
44
|
+
error: "Stop it first."
|
|
45
|
+
}]
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const ledger = askBuoyStore.getLedger();
|
|
49
|
+
if (input.undoFirst && ledger) {
|
|
50
|
+
const outcome = await ledger.revertAll(input.dispatch);
|
|
51
|
+
if (outcome.failed.length > 0) {
|
|
52
|
+
return {
|
|
53
|
+
cleared: false,
|
|
54
|
+
reverted: outcome.reverted,
|
|
55
|
+
failed: outcome.failed
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
clearConversation();
|
|
59
|
+
return {
|
|
60
|
+
cleared: true,
|
|
61
|
+
reverted: outcome.reverted,
|
|
62
|
+
failed: []
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
clearConversation();
|
|
66
|
+
return {
|
|
67
|
+
cleared: true,
|
|
68
|
+
reverted: 0,
|
|
69
|
+
failed: []
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=resetConversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["askBuoyStore","clearTranscript","clearConversation","getHeldSession","session","reset","resetConversation","input","getState","busy","cleared","reverted","failed","label","error","ledger","getLedger","undoFirst","outcome","revertAll","dispatch","length"],"sourceRoot":"../../../src","sources":["store/resetConversation.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,YAAY,QAAQ,gBAAgB;AAC7C,SAASC,eAAe,QAAQ,yBAAyB;AAWzD;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAS;EACxC;EACA;EACAF,YAAY,CAACG,cAAc,CAAC,CAAC,EAAEC,OAAO,CAACC,KAAK,CAAC,CAAC;EAC9CL,YAAY,CAACK,KAAK,CAAC,CAAC;EACpB,KAAKJ,eAAe,CAAC,CAAC;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeK,iBAAiBA,CAACC,KAGvC,EAAyB;EACxB,IAAIP,YAAY,CAACQ,QAAQ,CAAC,CAAC,CAACC,IAAI,EAAE;IAChC,OAAO;MAAEC,OAAO,EAAE,KAAK;MAAEC,QAAQ,EAAE,CAAC;MAAEC,MAAM,EAAE,CAAC;QAAEC,KAAK,EAAE,mBAAmB;QAAEC,KAAK,EAAE;MAAiB,CAAC;IAAE,CAAC;EAC3G;EACA,MAAMC,MAAM,GAAGf,YAAY,CAACgB,SAAS,CAAC,CAAC;EACvC,IAAIT,KAAK,CAACU,SAAS,IAAIF,MAAM,EAAE;IAC7B,MAAMG,OAAO,GAAG,MAAMH,MAAM,CAACI,SAAS,CAACZ,KAAK,CAACa,QAAQ,CAAC;IACtD,IAAIF,OAAO,CAACN,MAAM,CAACS,MAAM,GAAG,CAAC,EAAE;MAC7B,OAAO;QAAEX,OAAO,EAAE,KAAK;QAAEC,QAAQ,EAAEO,OAAO,CAACP,QAAQ;QAAEC,MAAM,EAAEM,OAAO,CAACN;MAAO,CAAC;IAC/E;IACAV,iBAAiB,CAAC,CAAC;IACnB,OAAO;MAAEQ,OAAO,EAAE,IAAI;MAAEC,QAAQ,EAAEO,OAAO,CAACP,QAAQ;MAAEC,MAAM,EAAE;IAAG,CAAC;EAClE;EACAV,iBAAiB,CAAC,CAAC;EACnB,OAAO;IAAEQ,OAAO,EAAE,IAAI;IAAEC,QAAQ,EAAE,CAAC;IAAEC,MAAM,EAAE;EAAG,CAAC;AACnD","ignoreList":[]}
|
|
@@ -1 +1,62 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Putting an unanswered approval back after a restart.
|
|
5
|
+
*
|
|
6
|
+
* The rule this encodes: a question the user never answered is not the app's
|
|
7
|
+
* to drop. Nothing was tapped, so the change is still waiting as far as they
|
|
8
|
+
* know — and a card that vanishes on reload reads as consent nobody gave.
|
|
9
|
+
*
|
|
10
|
+
* The guards matter as much as the restore. The disk read races the tool
|
|
11
|
+
* registry (see the note at the restore site), so it can land late, and an old
|
|
12
|
+
* question shoved in front of a live conversation would be worse than losing
|
|
13
|
+
* it.
|
|
14
|
+
*/
|
|
15
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
16
|
+
import { askBuoyStore } from "./askBuoyStore";
|
|
17
|
+
const card = {
|
|
18
|
+
id: "c1",
|
|
19
|
+
toolId: "zustand",
|
|
20
|
+
action: "setState",
|
|
21
|
+
label: "Update the Poké Mart bag store",
|
|
22
|
+
reason: "This will change the app's state.",
|
|
23
|
+
params: {
|
|
24
|
+
storeName: "bag"
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
beforeEach(() => askBuoyStore.reset());
|
|
28
|
+
describe("restorePending", () => {
|
|
29
|
+
it("puts the card back on screen", () => {
|
|
30
|
+
expect(askBuoyStore.restorePending(card)).toBe(true);
|
|
31
|
+
expect(askBuoyStore.getState().pending).toMatchObject({
|
|
32
|
+
toolId: "zustand",
|
|
33
|
+
action: "setState",
|
|
34
|
+
params: {
|
|
35
|
+
storeName: "bag"
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
it("marks it restored, so Allow runs the call instead of answering a dead promise", () => {
|
|
40
|
+
askBuoyStore.restorePending(card);
|
|
41
|
+
expect(askBuoyStore.getState().pending?.restored).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it("refuses once a turn is under way", () => {
|
|
44
|
+
askBuoyStore.beginTurn();
|
|
45
|
+
expect(askBuoyStore.restorePending(card)).toBe(false);
|
|
46
|
+
expect(askBuoyStore.getState().pending).toBeNull();
|
|
47
|
+
});
|
|
48
|
+
it("refuses when a live card is already asking", () => {
|
|
49
|
+
void askBuoyStore.askApproval(card);
|
|
50
|
+
expect(askBuoyStore.restorePending({
|
|
51
|
+
...card,
|
|
52
|
+
id: "c2"
|
|
53
|
+
})).toBe(false);
|
|
54
|
+
expect(askBuoyStore.getState().pending?.id).toBe("c1");
|
|
55
|
+
});
|
|
56
|
+
it("answers without throwing, though nothing is waiting on it", () => {
|
|
57
|
+
askBuoyStore.restorePending(card);
|
|
58
|
+
expect(() => askBuoyStore.answerApproval(true)).not.toThrow();
|
|
59
|
+
expect(askBuoyStore.getState().pending).toBeNull();
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=restorePending.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","it","askBuoyStore","card","id","toolId","action","label","reason","params","storeName","reset","restorePending","toBe","getState","pending","toMatchObject","restored","beginTurn","toBeNull","askApproval","answerApproval","not","toThrow"],"sourceRoot":"../../../src","sources":["store/restorePending.test.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAEzD,SAASC,YAAY,QAAQ,gBAAgB;AAE7C,MAAMC,IAAI,GAAG;EACXC,EAAE,EAAE,IAAI;EACRC,MAAM,EAAE,SAAS;EACjBC,MAAM,EAAE,UAAU;EAClBC,KAAK,EAAE,gCAAgC;EACvCC,MAAM,EAAE,mCAAmC;EAC3CC,MAAM,EAAE;IAAEC,SAAS,EAAE;EAAM;AAC7B,CAAC;AAEDZ,UAAU,CAAC,MAAMI,YAAY,CAACS,KAAK,CAAC,CAAC,CAAC;AAEtCZ,QAAQ,CAAC,gBAAgB,EAAE,MAAM;EAC/BE,EAAE,CAAC,8BAA8B,EAAE,MAAM;IACvCD,MAAM,CAACE,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC,CAAC,CAACU,IAAI,CAAC,IAAI,CAAC;IACpDb,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAACC,aAAa,CAAC;MACpDX,MAAM,EAAE,SAAS;MACjBC,MAAM,EAAE,UAAU;MAClBG,MAAM,EAAE;QAAEC,SAAS,EAAE;MAAM;IAC7B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFT,EAAE,CAAC,+EAA+E,EAAE,MAAM;IACxFC,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC;IACjCH,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,EAAEE,QAAQ,CAAC,CAACJ,IAAI,CAAC,IAAI,CAAC;EAC9D,CAAC,CAAC;EAEFZ,EAAE,CAAC,kCAAkC,EAAE,MAAM;IAC3CC,YAAY,CAACgB,SAAS,CAAC,CAAC;IACxBlB,MAAM,CAACE,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC,CAAC,CAACU,IAAI,CAAC,KAAK,CAAC;IACrDb,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAACI,QAAQ,CAAC,CAAC;EACpD,CAAC,CAAC;EAEFlB,EAAE,CAAC,4CAA4C,EAAE,MAAM;IACrD,KAAKC,YAAY,CAACkB,WAAW,CAACjB,IAAI,CAAC;IACnCH,MAAM,CAACE,YAAY,CAACU,cAAc,CAAC;MAAE,GAAGT,IAAI;MAAEC,EAAE,EAAE;IAAK,CAAC,CAAC,CAAC,CAACS,IAAI,CAAC,KAAK,CAAC;IACtEb,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,EAAEX,EAAE,CAAC,CAACS,IAAI,CAAC,IAAI,CAAC;EACxD,CAAC,CAAC;EAEFZ,EAAE,CAAC,2DAA2D,EAAE,MAAM;IACpEC,YAAY,CAACU,cAAc,CAACT,IAAI,CAAC;IACjCH,MAAM,CAAC,MAAME,YAAY,CAACmB,cAAc,CAAC,IAAI,CAAC,CAAC,CAACC,GAAG,CAACC,OAAO,CAAC,CAAC;IAC7DvB,MAAM,CAACE,YAAY,CAACY,QAAQ,CAAC,CAAC,CAACC,OAAO,CAAC,CAACI,QAAQ,CAAC,CAAC;EACpD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1 +1,46 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Ids from a RESTORED transcript must never collide with a fresh run's.
|
|
5
|
+
*
|
|
6
|
+
* The bug this covers, in full: every id counter restarted at 1 with the
|
|
7
|
+
* process, which was harmless until the transcript started outliving a reload.
|
|
8
|
+
* A restored conversation came back holding `rc1`, `ui1` and `m1`; the next
|
|
9
|
+
* turn minted `rc1` again; React saw two children with one key and rendered
|
|
10
|
+
* one of them twice while dropping the other. On screen that was the same
|
|
11
|
+
* store card appearing twice after a reload.
|
|
12
|
+
*
|
|
13
|
+
* Simulating a restart in one process is the whole difficulty — the module
|
|
14
|
+
* caches its counter. `idFactory` is the seam: a second factory stands in for
|
|
15
|
+
* the second run, and the shared RUN_ID is what has to differ between them.
|
|
16
|
+
*/
|
|
17
|
+
import { describe, expect, it } from "vitest";
|
|
18
|
+
import { idFactory, RUN_ID } from "@buoy-gg/agent-core";
|
|
19
|
+
describe("ids across a restart", () => {
|
|
20
|
+
it("never reissues an id a restored transcript already holds", () => {
|
|
21
|
+
// What a saved transcript carries, from a previous launch.
|
|
22
|
+
const restored = ["rcOLDRUN-1", "rcOLDRUN-2", "uiOLDRUN-1", "mOLDRUN-1"];
|
|
23
|
+
const rc = idFactory("rc");
|
|
24
|
+
const ui = idFactory("ui");
|
|
25
|
+
const m = idFactory("m");
|
|
26
|
+
const fresh = [rc(), rc(), ui(), m()];
|
|
27
|
+
for (const id of fresh) expect(restored).not.toContain(id);
|
|
28
|
+
});
|
|
29
|
+
it("still counts up within one run", () => {
|
|
30
|
+
// The counter is what keeps two blocks in the SAME turn apart.
|
|
31
|
+
const rc = idFactory("rc");
|
|
32
|
+
const ids = [rc(), rc(), rc()];
|
|
33
|
+
expect(new Set(ids).size).toBe(3);
|
|
34
|
+
});
|
|
35
|
+
it("keeps two prefixes apart even at the same count", () => {
|
|
36
|
+
const rc = idFactory("rc");
|
|
37
|
+
const ui = idFactory("ui");
|
|
38
|
+
expect(rc()).not.toBe(ui());
|
|
39
|
+
});
|
|
40
|
+
it("stamps a run token that is not a fixed string", () => {
|
|
41
|
+
// A constant here would put every install back where it started.
|
|
42
|
+
expect(RUN_ID).toMatch(/^[a-z0-9]{4,8}$/);
|
|
43
|
+
expect(idFactory("rc")()).toBe(`rc${RUN_ID}-1`);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=restoredIds.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["describe","expect","it","idFactory","RUN_ID","restored","rc","ui","m","fresh","id","not","toContain","ids","Set","size","toBe","toMatch"],"sourceRoot":"../../../src","sources":["store/restoredIds.test.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAC7C,SAASC,SAAS,EAAEC,MAAM,QAAQ,qBAAqB;AAEvDJ,QAAQ,CAAC,sBAAsB,EAAE,MAAM;EACrCE,EAAE,CAAC,0DAA0D,EAAE,MAAM;IACnE;IACA,MAAMG,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,CAAC;IACxE,MAAMC,EAAE,GAAGH,SAAS,CAAC,IAAI,CAAC;IAC1B,MAAMI,EAAE,GAAGJ,SAAS,CAAC,IAAI,CAAC;IAC1B,MAAMK,CAAC,GAAGL,SAAS,CAAC,GAAG,CAAC;IACxB,MAAMM,KAAK,GAAG,CAACH,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,EAAEC,EAAE,CAAC,CAAC,EAAEC,CAAC,CAAC,CAAC,CAAC;IACrC,KAAK,MAAME,EAAE,IAAID,KAAK,EAAER,MAAM,CAACI,QAAQ,CAAC,CAACM,GAAG,CAACC,SAAS,CAACF,EAAE,CAAC;EAC5D,CAAC,CAAC;EAEFR,EAAE,CAAC,gCAAgC,EAAE,MAAM;IACzC;IACA,MAAMI,EAAE,GAAGH,SAAS,CAAC,IAAI,CAAC;IAC1B,MAAMU,GAAG,GAAG,CAACP,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,EAAEA,EAAE,CAAC,CAAC,CAAC;IAC9BL,MAAM,CAAC,IAAIa,GAAG,CAACD,GAAG,CAAC,CAACE,IAAI,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFd,EAAE,CAAC,iDAAiD,EAAE,MAAM;IAC1D,MAAMI,EAAE,GAAGH,SAAS,CAAC,IAAI,CAAC;IAC1B,MAAMI,EAAE,GAAGJ,SAAS,CAAC,IAAI,CAAC;IAC1BF,MAAM,CAACK,EAAE,CAAC,CAAC,CAAC,CAACK,GAAG,CAACK,IAAI,CAACT,EAAE,CAAC,CAAC,CAAC;EAC7B,CAAC,CAAC;EAEFL,EAAE,CAAC,+CAA+C,EAAE,MAAM;IACxD;IACAD,MAAM,CAACG,MAAM,CAAC,CAACa,OAAO,CAAC,iBAAiB,CAAC;IACzChB,MAAM,CAACE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAACa,IAAI,CAAC,KAAKZ,MAAM,IAAI,CAAC;EACjD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|