@assistant-ui/core 0.3.12 → 0.3.13
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/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/react/client/interactable-model-context.d.ts.map +1 -1
- package/dist/react/client/interactable-model-context.js +5 -1
- package/dist/react/client/interactable-model-context.js.map +1 -1
- package/dist/runtime/api/thread-runtime.d.ts.map +1 -1
- package/dist/runtime/api/thread-runtime.js +5 -1
- package/dist/runtime/api/thread-runtime.js.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.d.ts +25 -0
- package/dist/runtime/base/base-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-composer-runtime-core.js +64 -11
- package/dist/runtime/base/base-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.d.ts +14 -0
- package/dist/runtime/base/base-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/base-thread-runtime-core.js +31 -0
- package/dist/runtime/base/base-thread-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-edit-composer-runtime-core.js +1 -6
- package/dist/runtime/base/default-edit-composer-runtime-core.js.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.d.ts.map +1 -1
- package/dist/runtime/base/default-thread-composer-runtime-core.js +1 -4
- package/dist/runtime/base/default-thread-composer-runtime-core.js.map +1 -1
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts +15 -0
- package/dist/runtime/queue/external-thread-queue-adapter.d.ts.map +1 -1
- package/dist/runtime/queue/message-queue.js +23 -10
- package/dist/runtime/queue/message-queue.js.map +1 -1
- package/dist/runtimes/external-store/external-store-adapter.d.ts +7 -0
- package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts +3 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js +49 -13
- package/dist/runtimes/external-store/external-store-thread-runtime-core.js.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.d.ts.map +1 -1
- package/dist/runtimes/local/local-thread-runtime-core.js +2 -1
- package/dist/runtimes/local/local-thread-runtime-core.js.map +1 -1
- package/dist/store/clients/external-thread.d.ts +7 -0
- package/dist/store/clients/external-thread.d.ts.map +1 -1
- package/dist/store/clients/external-thread.js +460 -369
- package/dist/store/clients/external-thread.js.map +1 -1
- package/dist/store/clients/runtime-adapter.d.ts.map +1 -1
- package/dist/store/clients/runtime-adapter.js +5 -2
- package/dist/store/clients/runtime-adapter.js.map +1 -1
- package/dist/store/clients/single-thread-list.d.ts.map +1 -1
- package/dist/store/clients/single-thread-list.js +31 -27
- package/dist/store/clients/single-thread-list.js.map +1 -1
- package/dist/store/clients/suggestions.d.ts +3 -1
- package/dist/store/clients/suggestions.d.ts.map +1 -1
- package/dist/store/clients/suggestions.js +65 -37
- package/dist/store/clients/suggestions.js.map +1 -1
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.js +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js +64 -50
- package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.d.ts.map +1 -1
- package/dist/store/runtime-clients/thread-runtime-client.js +98 -82
- package/dist/store/runtime-clients/thread-runtime-client.js.map +1 -1
- package/dist/store/scope-registration.d.ts +2 -2
- package/dist/store/scopes/suggestions.d.ts +6 -1
- package/dist/store/scopes/suggestions.d.ts.map +1 -1
- package/dist/store/scopes/thread.d.ts +17 -0
- package/dist/store/scopes/thread.d.ts.map +1 -1
- package/dist/types/error.d.ts +15 -1
- package/dist/types/error.d.ts.map +1 -1
- package/dist/types/error.js +18 -1
- package/dist/types/error.js.map +1 -1
- package/dist/types/message.d.ts +2 -0
- package/dist/types/message.d.ts.map +1 -1
- package/dist/types/message.js.map +1 -1
- package/package.json +5 -5
- package/src/index.ts +1 -0
- package/src/react/client/interactable-model-context.ts +6 -1
- package/src/react/runtimes/useExternalStoreRuntime.suggestions.test.tsx +114 -0
- package/src/runtime/api/thread-runtime.ts +8 -1
- package/src/runtime/base/base-composer-runtime-core.ts +100 -8
- package/src/runtime/base/base-thread-runtime-core.ts +36 -0
- package/src/runtime/base/default-edit-composer-runtime-core.ts +1 -15
- package/src/runtime/base/default-thread-composer-runtime-core.ts +1 -11
- package/src/runtime/queue/external-thread-queue-adapter.ts +17 -0
- package/src/runtime/queue/message-queue.ts +26 -9
- package/src/runtimes/external-store/external-store-adapter.ts +7 -0
- package/src/runtimes/external-store/external-store-thread-runtime-core.ts +100 -26
- package/src/runtimes/local/local-thread-runtime-core.ts +4 -1
- package/src/store/clients/external-thread.ts +119 -16
- package/src/store/clients/runtime-adapter.ts +5 -2
- package/src/store/clients/single-thread-list.ts +2 -1
- package/src/store/clients/suggestions.ts +39 -13
- package/src/store/runtime-clients/thread-list-item-runtime-client.ts +13 -28
- package/src/store/runtime-clients/thread-runtime-client.ts +5 -0
- package/src/store/scopes/suggestions.ts +6 -0
- package/src/store/scopes/thread.ts +17 -0
- package/src/tests/append-interactable-snapshots.test.ts +350 -0
- package/src/tests/base-composer-runtime-core-send.test.ts +126 -0
- package/src/tests/base-composer-runtime-core.test.ts +108 -1
- package/src/tests/default-edit-composer-runtime-core.test.ts +0 -68
- package/src/tests/external-store-thread-runtime-core-adapter.test.ts +300 -0
- package/src/tests/external-thread-attachments.test.tsx +214 -0
- package/src/tests/external-thread-parity.test.tsx +54 -0
- package/src/tests/external-thread-refetch.test.tsx +117 -0
- package/src/tests/external-thread-suggestions.test.tsx +59 -0
- package/src/tests/message-queue.test.ts +26 -0
- package/src/tests/thread-message-like.test.ts +39 -0
- package/src/tests/thread-switch-events.test.tsx +136 -0
- package/src/types/error.ts +24 -0
- package/src/types/message.ts +2 -0
- package/src/tests/default-thread-composer-runtime-core.test.ts +0 -82
|
@@ -23,8 +23,10 @@ const createMessageQueue = (driver) => {
|
|
|
23
23
|
const subscribers = /* @__PURE__ */ new Set();
|
|
24
24
|
let running = false;
|
|
25
25
|
let paused = false;
|
|
26
|
+
let dispatchTransform = (m) => m;
|
|
26
27
|
let suppressIdle = 0;
|
|
27
28
|
let cancelSettles = 0;
|
|
29
|
+
let interrupting = false;
|
|
28
30
|
const notify = () => {
|
|
29
31
|
for (const callback of subscribers) callback();
|
|
30
32
|
};
|
|
@@ -56,15 +58,20 @@ const createMessageQueue = (driver) => {
|
|
|
56
58
|
});
|
|
57
59
|
if (!message) return;
|
|
58
60
|
running = true;
|
|
59
|
-
driver.run(message, { steer: false });
|
|
61
|
+
driver.run(dispatchTransform(message), { steer: false });
|
|
60
62
|
};
|
|
61
63
|
const interrupt = (message) => {
|
|
62
64
|
paused = false;
|
|
63
65
|
suppressIdle += Math.max(cancelSettles, 1);
|
|
64
66
|
cancelSettles = 0;
|
|
65
|
-
|
|
67
|
+
interrupting = true;
|
|
68
|
+
try {
|
|
69
|
+
driver.cancel();
|
|
70
|
+
} finally {
|
|
71
|
+
interrupting = false;
|
|
72
|
+
}
|
|
66
73
|
running = true;
|
|
67
|
-
driver.run(message, { steer: true });
|
|
74
|
+
driver.run(dispatchTransform(message), { steer: true });
|
|
68
75
|
};
|
|
69
76
|
const push = (lane, message) => {
|
|
70
77
|
paused = false;
|
|
@@ -146,6 +153,13 @@ const createMessageQueue = (driver) => {
|
|
|
146
153
|
steer: lanes.steer.filter((item) => item.id !== queueItemId)
|
|
147
154
|
});
|
|
148
155
|
};
|
|
156
|
+
const notifyCancelled = () => {
|
|
157
|
+
if (interrupting) return;
|
|
158
|
+
if (running && cancelSettles === 0) {
|
|
159
|
+
paused = true;
|
|
160
|
+
cancelSettles = 1;
|
|
161
|
+
}
|
|
162
|
+
};
|
|
149
163
|
const adapter = {
|
|
150
164
|
items: lanes.queue,
|
|
151
165
|
steerItems: lanes.steer,
|
|
@@ -153,7 +167,11 @@ const createMessageQueue = (driver) => {
|
|
|
153
167
|
steer,
|
|
154
168
|
move,
|
|
155
169
|
edit,
|
|
156
|
-
remove
|
|
170
|
+
remove,
|
|
171
|
+
__internal_setDispatchTransform: (transform) => {
|
|
172
|
+
dispatchTransform = transform;
|
|
173
|
+
},
|
|
174
|
+
__internal_notifyCancelled: notifyCancelled
|
|
157
175
|
};
|
|
158
176
|
return {
|
|
159
177
|
adapter,
|
|
@@ -172,12 +190,7 @@ const createMessageQueue = (driver) => {
|
|
|
172
190
|
running = false;
|
|
173
191
|
advance();
|
|
174
192
|
},
|
|
175
|
-
notifyCancelled
|
|
176
|
-
if (running && cancelSettles === 0) {
|
|
177
|
-
paused = true;
|
|
178
|
-
cancelSettles = 1;
|
|
179
|
-
}
|
|
180
|
-
},
|
|
193
|
+
notifyCancelled,
|
|
181
194
|
clear: () => {
|
|
182
195
|
messages.clear();
|
|
183
196
|
setLanes({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-queue.js","names":["AppendMessage","FileMessagePart","TextMessagePart","EMPTY_QUEUE_ITEMS","QueueItemState","generateId","getThreadMessageText","ExternalThreadQueueAdapter","QueuePlacement","MessageQueueDriver","run","message","options","steer","cancel","MessageQueueController","adapter","notifyBusy","notifyIdle","notifyCancelled","clear","subscribe","callback","Lane","getQueueItemParts","source","content","attachments","flatMap","attachment","filter","part","type","parts","push","data","image","mimeType","filename","undefined","createMessageQueue","driver","lanes","Record","queue","messages","Map","subscribers","Set","running","paused","suppressIdle","cancelSettles","notify","setLanes","next","items","steerItems","toItem","id","prompt","laneOf","queueItemId","some","item","advance","lane","length","head","get","delete","slice","interrupt","Math","max","set","enqueue","move","placement","fromLane","Error","toLane","find","i","dest","anchorIndex","anchor","index","findIndex","insertAfter","insertBefore","after","before","nextDest","edit","map","remove","add"],"sources":["../../../src/runtime/queue/message-queue.ts"],"sourcesContent":["import type {\n AppendMessage,\n FileMessagePart,\n TextMessagePart,\n} from \"../../types/message\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { generateId } from \"../../utils/id\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n ExternalThreadQueueAdapter,\n QueuePlacement,\n} from \"./external-thread-queue-adapter\";\n\nexport type MessageQueueDriver = {\n run: (message: AppendMessage, options: { steer: boolean }) => void;\n /** When omitted, steering degrades to \"process next\" instead of interrupting. */\n cancel?: (() => void) | undefined;\n};\n\nexport type MessageQueueController = {\n readonly adapter: ExternalThreadQueueAdapter;\n /** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */\n notifyBusy: () => void;\n /** Advances to the next pending message; call on the run's falling edge. */\n notifyIdle: () => void;\n /**\n * Pauses queue advance for a user-initiated cancel, so the cancelled run's\n * settle keeps the pending items instead of dispatching the next one; the\n * next explicit send or run start re-arms draining. Call before aborting\n * the run.\n */\n notifyCancelled: () => void;\n /** Empties both lanes without dispatching. */\n clear: () => void;\n subscribe: (callback: () => void) => () => void;\n};\n\ntype Lane = \"queue\" | \"steer\";\n\nconst getQueueItemParts = (\n message: AppendMessage,\n): readonly (FileMessagePart | TextMessagePart)[] => {\n // attachment-derived text is the file body, not user-authored prose;\n // project only the file/image content of attachments\n const source = [\n ...message.content,\n ...(message.attachments ?? []).flatMap((attachment) =>\n (attachment.content ?? []).filter((part) => part.type !== \"text\"),\n ),\n ];\n const parts: (FileMessagePart | TextMessagePart)[] = [];\n for (const part of source) {\n if (part.type === \"file\" || part.type === \"text\") {\n parts.push(part);\n } else if (part.type === \"image\") {\n parts.push({\n type: \"file\",\n data: part.image,\n mimeType: \"image/*\",\n ...(part.filename !== undefined && { filename: part.filename }),\n });\n }\n }\n return parts;\n};\n\nexport const createMessageQueue = (\n driver: MessageQueueDriver,\n): MessageQueueController => {\n let lanes: Record<Lane, readonly QueueItemState[]> = {\n queue: EMPTY_QUEUE_ITEMS,\n steer: EMPTY_QUEUE_ITEMS,\n };\n const messages = new Map<string, AppendMessage>();\n const subscribers = new Set<() => void>();\n\n let running = false;\n let paused = false;\n // swallow the cancelled run's settle when steering so it does not double-advance\n let suppressIdle = 0;\n // settles from cancelled runs that must drop `running` without advancing\n let cancelSettles = 0;\n\n const notify = () => {\n for (const callback of subscribers) callback();\n };\n\n const setLanes = (next: Record<Lane, readonly QueueItemState[]>) => {\n lanes = next;\n adapter.items = next.queue;\n adapter.steerItems = next.steer;\n notify();\n };\n\n const toItem = (id: string, message: AppendMessage): QueueItemState => ({\n id,\n prompt: getThreadMessageText(message),\n parts: getQueueItemParts(message),\n });\n\n const laneOf = (queueItemId: string): Lane | undefined => {\n if (lanes.steer.some((item) => item.id === queueItemId)) return \"steer\";\n if (lanes.queue.some((item) => item.id === queueItemId)) return \"queue\";\n return undefined;\n };\n\n const advance = () => {\n if (running || paused) return;\n const lane: Lane = lanes.steer.length > 0 ? \"steer\" : \"queue\";\n const head = lanes[lane][0];\n if (!head) return;\n const message = messages.get(head.id);\n messages.delete(head.id);\n setLanes({ ...lanes, [lane]: lanes[lane].slice(1) });\n if (!message) return;\n running = true;\n driver.run(message, { steer: false });\n };\n\n const interrupt = (message: AppendMessage) => {\n paused = false;\n // the interrupted run settles exactly once, whether or not it was\n // already cancel-notified\n suppressIdle += Math.max(cancelSettles, 1);\n cancelSettles = 0;\n driver.cancel!();\n running = true;\n driver.run(message, { steer: true });\n };\n\n const push = (lane: Lane, message: AppendMessage) => {\n paused = false;\n const id = generateId();\n messages.set(id, message);\n setLanes({ ...lanes, [lane]: [...lanes[lane], toItem(id, message)] });\n advance();\n };\n\n const enqueue = (message: AppendMessage) => {\n push(\"queue\", message);\n };\n\n const steer = (message: AppendMessage) => {\n if (running && driver.cancel) {\n interrupt(message);\n return;\n }\n push(\"steer\", message);\n };\n\n const move = (queueItemId: string, placement: QueuePlacement) => {\n const fromLane = laneOf(queueItemId);\n if (!fromLane) throw new Error(`Unknown queue item \"${queueItemId}\".`);\n const toLane = placement.lane ?? fromLane;\n\n const item = lanes[fromLane].find((i) => i.id === queueItemId)!;\n const dest = (toLane === fromLane ? lanes[fromLane] : lanes[toLane]).filter(\n (i) => i.id !== queueItemId,\n );\n\n const anchorIndex = (anchor: string) => {\n if (anchor === queueItemId)\n throw new Error(`Queue item \"${queueItemId}\" cannot anchor itself.`);\n const index = dest.findIndex((i) => i.id === anchor);\n if (index === -1)\n throw new Error(`Unknown anchor \"${anchor}\" in lane \"${toLane}\".`);\n return index;\n };\n\n const { insertAfter, insertBefore } = placement;\n let index: number;\n if (insertAfter === undefined && insertBefore === undefined) {\n index =\n toLane === fromLane\n ? lanes[fromLane].findIndex((i) => i.id === queueItemId)\n : dest.length;\n } else if (insertAfter !== undefined && insertBefore !== undefined) {\n const after = insertAfter === null ? -1 : anchorIndex(insertAfter);\n const before =\n insertBefore === null ? dest.length : anchorIndex(insertBefore);\n if (before !== after + 1)\n throw new Error(\n `insertAfter \"${insertAfter}\" and insertBefore \"${insertBefore}\" are not adjacent in lane \"${toLane}\".`,\n );\n index = after + 1;\n } else if (insertAfter !== undefined) {\n index = insertAfter === null ? 0 : anchorIndex(insertAfter) + 1;\n } else {\n index = insertBefore === null ? dest.length : anchorIndex(insertBefore!);\n }\n\n // placement and immediate dispatch cannot coexist: an anchored move into\n // the steer lane places without interrupting; only an unanchored one\n // cancels the live run and dispatches\n if (\n insertAfter === undefined &&\n insertBefore === undefined &&\n toLane === \"steer\" &&\n fromLane !== \"steer\" &&\n running &&\n driver.cancel\n ) {\n const message = messages.get(queueItemId)!;\n messages.delete(queueItemId);\n setLanes({\n queue: lanes.queue.filter((i) => i.id !== queueItemId),\n steer: lanes.steer,\n });\n interrupt(message);\n return;\n }\n\n const nextDest = [...dest.slice(0, index), item, ...dest.slice(index)];\n const next = { ...lanes, [toLane]: nextDest };\n if (toLane !== fromLane)\n next[fromLane] = lanes[fromLane].filter((i) => i.id !== queueItemId);\n setLanes(next);\n advance();\n };\n\n const edit = (queueItemId: string, message: AppendMessage) => {\n const lane = laneOf(queueItemId);\n if (!lane) throw new Error(`Unknown queue item \"${queueItemId}\".`);\n messages.set(queueItemId, message);\n setLanes({\n ...lanes,\n [lane]: lanes[lane].map((item) =>\n item.id === queueItemId ? toItem(queueItemId, message) : item,\n ),\n });\n };\n\n const remove = (queueItemId: string) => {\n if (!messages.delete(queueItemId)) return;\n setLanes({\n queue: lanes.queue.filter((item) => item.id !== queueItemId),\n steer: lanes.steer.filter((item) => item.id !== queueItemId),\n });\n };\n\n const adapter: ExternalThreadQueueAdapter = {\n items: lanes.queue,\n steerItems: lanes.steer,\n enqueue,\n steer,\n move,\n edit,\n remove,\n };\n\n return {\n adapter,\n notifyBusy: () => {\n paused = false;\n // a cancelled run's settle that is still outstanding belongs to a run\n // this new one replaces; swallow it entirely\n suppressIdle += cancelSettles;\n cancelSettles = 0;\n running = true;\n },\n notifyIdle: () => {\n if (suppressIdle > 0) {\n suppressIdle--;\n return;\n }\n if (cancelSettles > 0) cancelSettles--;\n running = false;\n advance();\n },\n notifyCancelled: () => {\n if (running && cancelSettles === 0) {\n paused = true;\n cancelSettles = 1;\n }\n },\n clear: () => {\n messages.clear();\n setLanes({ queue: EMPTY_QUEUE_ITEMS, steer: EMPTY_QUEUE_ITEMS });\n },\n subscribe: (callback) => {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"message-queue.js","names":["AppendMessage","FileMessagePart","TextMessagePart","EMPTY_QUEUE_ITEMS","QueueItemState","generateId","getThreadMessageText","ExternalThreadQueueAdapter","QueuePlacement","MessageQueueDriver","run","message","options","steer","cancel","MessageQueueController","adapter","notifyBusy","notifyIdle","notifyCancelled","clear","subscribe","callback","Lane","getQueueItemParts","source","content","attachments","flatMap","attachment","filter","part","type","parts","push","data","image","mimeType","filename","undefined","createMessageQueue","driver","lanes","Record","queue","messages","Map","subscribers","Set","running","paused","dispatchTransform","m","suppressIdle","cancelSettles","interrupting","notify","setLanes","next","items","steerItems","toItem","id","prompt","laneOf","queueItemId","some","item","advance","lane","length","head","get","delete","slice","interrupt","Math","max","set","enqueue","move","placement","fromLane","Error","toLane","find","i","dest","anchorIndex","anchor","index","findIndex","insertAfter","insertBefore","after","before","nextDest","edit","map","remove","__internal_setDispatchTransform","transform","__internal_notifyCancelled","add"],"sources":["../../../src/runtime/queue/message-queue.ts"],"sourcesContent":["import type {\n AppendMessage,\n FileMessagePart,\n TextMessagePart,\n} from \"../../types/message\";\nimport {\n EMPTY_QUEUE_ITEMS,\n type QueueItemState,\n} from \"../../store/scopes/queue-item\";\nimport { generateId } from \"../../utils/id\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n ExternalThreadQueueAdapter,\n QueuePlacement,\n} from \"./external-thread-queue-adapter\";\n\nexport type MessageQueueDriver = {\n run: (message: AppendMessage, options: { steer: boolean }) => void;\n /** When omitted, steering degrades to \"process next\" instead of interrupting. */\n cancel?: (() => void) | undefined;\n};\n\nexport type MessageQueueController = {\n readonly adapter: ExternalThreadQueueAdapter;\n /** Mark a run as in flight so concurrent sends buffer; call on the rising edge. */\n notifyBusy: () => void;\n /** Advances to the next pending message; call on the run's falling edge. */\n notifyIdle: () => void;\n /**\n * Pauses queue advance for a user-initiated cancel, so the cancelled run's\n * settle keeps the pending items instead of dispatching the next one; the\n * next explicit send or run start re-arms draining. Call before aborting\n * the run.\n */\n notifyCancelled: () => void;\n /** Empties both lanes without dispatching. */\n clear: () => void;\n subscribe: (callback: () => void) => () => void;\n};\n\ntype Lane = \"queue\" | \"steer\";\n\nconst getQueueItemParts = (\n message: AppendMessage,\n): readonly (FileMessagePart | TextMessagePart)[] => {\n // attachment-derived text is the file body, not user-authored prose;\n // project only the file/image content of attachments\n const source = [\n ...message.content,\n ...(message.attachments ?? []).flatMap((attachment) =>\n (attachment.content ?? []).filter((part) => part.type !== \"text\"),\n ),\n ];\n const parts: (FileMessagePart | TextMessagePart)[] = [];\n for (const part of source) {\n if (part.type === \"file\" || part.type === \"text\") {\n parts.push(part);\n } else if (part.type === \"image\") {\n parts.push({\n type: \"file\",\n data: part.image,\n mimeType: \"image/*\",\n ...(part.filename !== undefined && { filename: part.filename }),\n });\n }\n }\n return parts;\n};\n\nexport const createMessageQueue = (\n driver: MessageQueueDriver,\n): MessageQueueController => {\n let lanes: Record<Lane, readonly QueueItemState[]> = {\n queue: EMPTY_QUEUE_ITEMS,\n steer: EMPTY_QUEUE_ITEMS,\n };\n const messages = new Map<string, AppendMessage>();\n const subscribers = new Set<() => void>();\n\n let running = false;\n let paused = false;\n let dispatchTransform: (message: AppendMessage) => AppendMessage = (m) => m;\n // swallow the cancelled run's settle when steering so it does not double-advance\n let suppressIdle = 0;\n // settles from cancelled runs that must drop `running` without advancing\n let cancelSettles = 0;\n let interrupting = false;\n\n const notify = () => {\n for (const callback of subscribers) callback();\n };\n\n const setLanes = (next: Record<Lane, readonly QueueItemState[]>) => {\n lanes = next;\n adapter.items = next.queue;\n adapter.steerItems = next.steer;\n notify();\n };\n\n const toItem = (id: string, message: AppendMessage): QueueItemState => ({\n id,\n prompt: getThreadMessageText(message),\n parts: getQueueItemParts(message),\n });\n\n const laneOf = (queueItemId: string): Lane | undefined => {\n if (lanes.steer.some((item) => item.id === queueItemId)) return \"steer\";\n if (lanes.queue.some((item) => item.id === queueItemId)) return \"queue\";\n return undefined;\n };\n\n const advance = () => {\n if (running || paused) return;\n const lane: Lane = lanes.steer.length > 0 ? \"steer\" : \"queue\";\n const head = lanes[lane][0];\n if (!head) return;\n const message = messages.get(head.id);\n messages.delete(head.id);\n setLanes({ ...lanes, [lane]: lanes[lane].slice(1) });\n if (!message) return;\n running = true;\n driver.run(dispatchTransform(message), { steer: false });\n };\n\n const interrupt = (message: AppendMessage) => {\n paused = false;\n // the interrupted run settles exactly once, whether or not it was\n // already cancel-notified\n suppressIdle += Math.max(cancelSettles, 1);\n cancelSettles = 0;\n // a driver whose cancel routes through the runtime notifies this queue\n // back; the interrupt already accounted for that settle and is dispatching\n // in its place\n interrupting = true;\n try {\n driver.cancel!();\n } finally {\n interrupting = false;\n }\n running = true;\n driver.run(dispatchTransform(message), { steer: true });\n };\n\n const push = (lane: Lane, message: AppendMessage) => {\n paused = false;\n const id = generateId();\n messages.set(id, message);\n setLanes({ ...lanes, [lane]: [...lanes[lane], toItem(id, message)] });\n advance();\n };\n\n const enqueue = (message: AppendMessage) => {\n push(\"queue\", message);\n };\n\n const steer = (message: AppendMessage) => {\n if (running && driver.cancel) {\n interrupt(message);\n return;\n }\n push(\"steer\", message);\n };\n\n const move = (queueItemId: string, placement: QueuePlacement) => {\n const fromLane = laneOf(queueItemId);\n if (!fromLane) throw new Error(`Unknown queue item \"${queueItemId}\".`);\n const toLane = placement.lane ?? fromLane;\n\n const item = lanes[fromLane].find((i) => i.id === queueItemId)!;\n const dest = (toLane === fromLane ? lanes[fromLane] : lanes[toLane]).filter(\n (i) => i.id !== queueItemId,\n );\n\n const anchorIndex = (anchor: string) => {\n if (anchor === queueItemId)\n throw new Error(`Queue item \"${queueItemId}\" cannot anchor itself.`);\n const index = dest.findIndex((i) => i.id === anchor);\n if (index === -1)\n throw new Error(`Unknown anchor \"${anchor}\" in lane \"${toLane}\".`);\n return index;\n };\n\n const { insertAfter, insertBefore } = placement;\n let index: number;\n if (insertAfter === undefined && insertBefore === undefined) {\n index =\n toLane === fromLane\n ? lanes[fromLane].findIndex((i) => i.id === queueItemId)\n : dest.length;\n } else if (insertAfter !== undefined && insertBefore !== undefined) {\n const after = insertAfter === null ? -1 : anchorIndex(insertAfter);\n const before =\n insertBefore === null ? dest.length : anchorIndex(insertBefore);\n if (before !== after + 1)\n throw new Error(\n `insertAfter \"${insertAfter}\" and insertBefore \"${insertBefore}\" are not adjacent in lane \"${toLane}\".`,\n );\n index = after + 1;\n } else if (insertAfter !== undefined) {\n index = insertAfter === null ? 0 : anchorIndex(insertAfter) + 1;\n } else {\n index = insertBefore === null ? dest.length : anchorIndex(insertBefore!);\n }\n\n // placement and immediate dispatch cannot coexist: an anchored move into\n // the steer lane places without interrupting; only an unanchored one\n // cancels the live run and dispatches\n if (\n insertAfter === undefined &&\n insertBefore === undefined &&\n toLane === \"steer\" &&\n fromLane !== \"steer\" &&\n running &&\n driver.cancel\n ) {\n const message = messages.get(queueItemId)!;\n messages.delete(queueItemId);\n setLanes({\n queue: lanes.queue.filter((i) => i.id !== queueItemId),\n steer: lanes.steer,\n });\n interrupt(message);\n return;\n }\n\n const nextDest = [...dest.slice(0, index), item, ...dest.slice(index)];\n const next = { ...lanes, [toLane]: nextDest };\n if (toLane !== fromLane)\n next[fromLane] = lanes[fromLane].filter((i) => i.id !== queueItemId);\n setLanes(next);\n advance();\n };\n\n const edit = (queueItemId: string, message: AppendMessage) => {\n const lane = laneOf(queueItemId);\n if (!lane) throw new Error(`Unknown queue item \"${queueItemId}\".`);\n messages.set(queueItemId, message);\n setLanes({\n ...lanes,\n [lane]: lanes[lane].map((item) =>\n item.id === queueItemId ? toItem(queueItemId, message) : item,\n ),\n });\n };\n\n const remove = (queueItemId: string) => {\n if (!messages.delete(queueItemId)) return;\n setLanes({\n queue: lanes.queue.filter((item) => item.id !== queueItemId),\n steer: lanes.steer.filter((item) => item.id !== queueItemId),\n });\n };\n\n const notifyCancelled = () => {\n if (interrupting) return;\n if (running && cancelSettles === 0) {\n paused = true;\n cancelSettles = 1;\n }\n };\n\n const adapter: ExternalThreadQueueAdapter = {\n items: lanes.queue,\n steerItems: lanes.steer,\n enqueue,\n steer,\n move,\n edit,\n remove,\n __internal_setDispatchTransform: (transform) => {\n dispatchTransform = transform;\n },\n __internal_notifyCancelled: notifyCancelled,\n };\n\n return {\n adapter,\n notifyBusy: () => {\n paused = false;\n // a cancelled run's settle that is still outstanding belongs to a run\n // this new one replaces; swallow it entirely\n suppressIdle += cancelSettles;\n cancelSettles = 0;\n running = true;\n },\n notifyIdle: () => {\n if (suppressIdle > 0) {\n suppressIdle--;\n return;\n }\n if (cancelSettles > 0) cancelSettles--;\n running = false;\n advance();\n },\n notifyCancelled,\n clear: () => {\n messages.clear();\n setLanes({ queue: EMPTY_QUEUE_ITEMS, steer: EMPTY_QUEUE_ITEMS });\n },\n subscribe: (callback) => {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -83,6 +83,13 @@ type ExternalStoreAdapterBase<T> = {
|
|
|
83
83
|
suggestions?: readonly ThreadSuggestion[] | undefined;
|
|
84
84
|
state?: ReadonlyJSONValue | undefined;
|
|
85
85
|
extras?: unknown;
|
|
86
|
+
/**
|
|
87
|
+
* Applies a message list the runtime rewrote, and is what tells the runtime
|
|
88
|
+
* a removal it makes will survive the next snapshot. Without it, cancelling a
|
|
89
|
+
* run leaves a trailing user message in the thread and the composer
|
|
90
|
+
* untouched; an adapter that removes that message itself owns handing it
|
|
91
|
+
* back, because the runtime cannot see a removal it did not make.
|
|
92
|
+
*/
|
|
86
93
|
setMessages?: ((messages: readonly T[]) => void) | undefined;
|
|
87
94
|
/**
|
|
88
95
|
* Fires when the user explicitly switches branches via the runtime's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;KAqBY,wBAAwB;EAClC,QAAQ;EACR;EACA;EACA;EACA;EACA,SAAS;;KAGC;;;;EAIV;EACA;EACA,mBAAmB;EACnB,2BAA2B;;;;EAI3B,6BAA6B;;;;EAI7B,qBAAqB,qBAAqB;EAC1C,YACE,kBACA,sBACI;EACN,mBAEM,kBACA,QAAQ,wCACL;EAET,cAAc,qBAAqB;EACnC,gBAAgB,qBAAqB;EACrC,aAAa,qBAAqB;;KAGxB,8BAA8B,MACxC,SAAS,GACT,gBACG;;;;KAKO;EACV;EACA;;KAGG,qCAAqC;EACxC,gBAAgB,8BAA8B;;KAG3C,yBAAyB;;;;;;;EAO5B;;;;;;;;;EASA;;;;;;;;;EASA;EACA;EACA,oBAAoB;EACpB,oBAAoB;EACpB,uBAAuB;EACvB,QAAQ;EACR
|
|
1
|
+
{"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;KAqBY,wBAAwB;EAClC,QAAQ;EACR;EACA;EACA;EACA;EACA,SAAS;;KAGC;;;;EAIV;EACA;EACA,mBAAmB;EACnB,2BAA2B;;;;EAI3B,6BAA6B;;;;EAI7B,qBAAqB,qBAAqB;EAC1C,YACE,kBACA,sBACI;EACN,mBAEM,kBACA,QAAQ,wCACL;EAET,cAAc,qBAAqB;EACnC,gBAAgB,qBAAqB;EACrC,aAAa,qBAAqB;;KAGxB,8BAA8B,MACxC,SAAS,GACT,gBACG;;;;KAKO;EACV;EACA;;KAGG,qCAAqC;EACxC,gBAAgB,8BAA8B;;KAG3C,yBAAyB;;;;;;;EAO5B;;;;;;;;;EASA;;;;;;;;;EASA;EACA;EACA,oBAAoB;EACpB,oBAAoB;EACpB,uBAAuB;EACvB,QAAQ;EACR;;;;;;;;EASA,gBAAgB,mBAAmB;;;;;;;;;;;;;;;;;;EAkBnC,4BACM,OAAO;EAEb,aAAa,mBAAmB;EAChC;EACA,wBAAwB;EACxB,QAAQ,SAAS,kBAAkB;;EAEnC,QAAQ;EACR,WAAW,SAAS,kBAAkB;EACtC,aAAa,sBAAsB;EACnC,aACM,yBAAyB,QAAQ,mBAAmB;EAE1D,aAAa,QAAQ,oBAAoB;EACzC,kBAAkB;;;;;;;;;EASlB,yBAAyB;EACzB,oBACM,SAAS,yBAAyB;EAExC,qBACM;IAAW;IAAoB;;EAErC,4BACM,SAAS,iCAAiC;EAEhD,iBAAiB,8BAA8B;EAC/C;IAEM,cAAc;IACd,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,WAAW;;;;IAIX,aAAa;;EAGnB;IAEM;;;;;;;;;;;;;;;;;;;;;EAsBN;;;;;;;;;;EAUA,oBACM,UAAU,eAAe;;KAIrB,qBAAqB,IAAI,iBACnC,yBAAyB,MACtB,UAAU,yBAEP,qCAAqC"}
|
|
@@ -38,6 +38,7 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
|
|
|
38
38
|
extras: unknown;
|
|
39
39
|
private _converter;
|
|
40
40
|
private _store;
|
|
41
|
+
private _transformedQueue;
|
|
41
42
|
/**
|
|
42
43
|
* Client-side tool-invocations pipeline. Constructed lazily on first
|
|
43
44
|
* snapshot — only when `adapter.unstable_enableToolInvocations === true`.
|
|
@@ -76,7 +77,7 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
|
|
|
76
77
|
* head elsewhere in the meantime.
|
|
77
78
|
*/
|
|
78
79
|
private _notifyBranchChange;
|
|
79
|
-
append(
|
|
80
|
+
append(rawMessage: AppendMessage): Promise<void>;
|
|
80
81
|
deleteMessage(messageId: string): Promise<void>;
|
|
81
82
|
getQueueItems(): readonly QueueItemState[];
|
|
82
83
|
getSteerQueueItems(): readonly QueueItemState[];
|
|
@@ -87,6 +88,7 @@ declare class ExternalStoreThreadRuntimeCore extends BaseThreadRuntimeCore imple
|
|
|
87
88
|
exportExternalState(): any;
|
|
88
89
|
importExternalState(state: any): void;
|
|
89
90
|
cancelRun(): void;
|
|
91
|
+
private dropEmptyOptimisticHead;
|
|
90
92
|
addToolResult(options: AddToolResultOptions): void;
|
|
91
93
|
resumeToolCall(options: ResumeToolCallOptions): void;
|
|
92
94
|
respondToToolApproval(options: RespondToToolApprovalOptions): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"external-store-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;;;;cAwDa,qBACX,oBACA,mBAAmB;cAKR,uCACH,iCACG;UAEH;MAiBG,gBAAY;UAIf;EACD;EACA;MACI;MAIA;YAIQ,6BAA6B;MAI5B,sEAAK,sDAAA;MAId;kBARqC;;;;;;;MAarC,iCAAiC;EAKrC,sBAAsB;EACtB;UAEC;UAEA;UAEA;;;;;UAMA;EAEQ,UAAU;EAQxB,YAAA,iBAAiB,sBACjB,OAAO;EAMF,sBAAsB,OAAO;;;;;;;UA2M5B;;;;;UAmEA;UACA;;;;;;;UAQA;EAmBQ,eAAe;;;;;;;;;UA6BvB;EAaK,OAAO,YAAY,gBAAgB;EA2CnC,cAAc,oBAAoB;EAoBxC,0BApBwC;EA0BxC,+BANa;EAUb,cAAc,qBAAqB,WAAW;EAI9C,gBAAgB;EAIV,SAAS,QAAQ,iBAAiB;EAYlC,UAAU,QAAQ,kBAAkB;EAO1C;EAOA,oBAAoB;EAmBpB;UA+EC;EAOD,cAAc,SAAS;EAMvB,eAAe,SAAS;EAoBxB,sBAAsB,SAAS;EAMtB,MAAM,2BAA2B;EAMjC,OAAO,MAAM;UAQrB"}
|
|
@@ -65,6 +65,7 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
65
65
|
extras = void 0;
|
|
66
66
|
_converter = new ThreadMessageConverter();
|
|
67
67
|
_store;
|
|
68
|
+
_transformedQueue;
|
|
68
69
|
/**
|
|
69
70
|
* Client-side tool-invocations pipeline. Constructed lazily on first
|
|
70
71
|
* snapshot — only when `adapter.unstable_enableToolInvocations === true`.
|
|
@@ -85,6 +86,17 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
85
86
|
this.isSendDisabled = store.isSendDisabled ?? false;
|
|
86
87
|
const oldStore = this._store;
|
|
87
88
|
this._store = store;
|
|
89
|
+
if (oldStore?.queue !== store.queue) {
|
|
90
|
+
this._transformedQueue = void 0;
|
|
91
|
+
store.queue?.__internal_setDispatchTransform?.((message) => {
|
|
92
|
+
const parentId = this.messages.at(-1)?.id ?? null;
|
|
93
|
+
return this.enrichAppendMetadata({
|
|
94
|
+
...message,
|
|
95
|
+
parentId
|
|
96
|
+
}, parentId);
|
|
97
|
+
});
|
|
98
|
+
if (store.queue?.__internal_setDispatchTransform) this._transformedQueue = store.queue;
|
|
99
|
+
}
|
|
88
100
|
if (this.extras !== store.extras) this.extras = store.extras;
|
|
89
101
|
const newSuggestions = store.suggestions ?? EMPTY_ARRAY;
|
|
90
102
|
if (!shallowEqual(this.suggestions, newSuggestions)) this.suggestions = newSuggestions;
|
|
@@ -276,13 +288,15 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
276
288
|
visibleMessageIds: this.repository.getMessages().map((m) => m.id)
|
|
277
289
|
});
|
|
278
290
|
}
|
|
279
|
-
async append(
|
|
280
|
-
const isEdit =
|
|
291
|
+
async append(rawMessage) {
|
|
292
|
+
const isEdit = rawMessage.sourceId != null || rawMessage.parentId !== (this.messages.at(-1)?.id ?? null);
|
|
281
293
|
if (!isEdit && this._store.queue) {
|
|
282
|
-
|
|
283
|
-
|
|
294
|
+
const queued = this._store.queue === this._transformedQueue ? rawMessage : this.enrichAppendMetadata(rawMessage);
|
|
295
|
+
if (queued.steer ?? this._store.isRunning ?? false) this._store.queue.steer(queued);
|
|
296
|
+
else this._store.queue.enqueue(queued);
|
|
284
297
|
return;
|
|
285
298
|
}
|
|
299
|
+
const message = this.enrichAppendMetadata(rawMessage);
|
|
286
300
|
if (message.startRun ?? message.role === "user") await this._toolInvocations?.abort();
|
|
287
301
|
if (isEdit) {
|
|
288
302
|
if (!this._store.onEdit) throw new Error("Runtime does not support editing messages.");
|
|
@@ -336,20 +350,42 @@ var ExternalStoreThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
336
350
|
cancelRun() {
|
|
337
351
|
if (!this._store.onCancel) throw new Error("Runtime does not support cancelling runs.");
|
|
338
352
|
this._toolInvocations?.abort();
|
|
353
|
+
this._store.queue?.__internal_notifyCancelled?.();
|
|
339
354
|
this._store.onCancel();
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
let messages = this.repository.getMessages();
|
|
355
|
+
this.dropEmptyOptimisticHead();
|
|
356
|
+
const messages = this.repository.getMessages();
|
|
343
357
|
const previousMessage = messages[messages.length - 1];
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
358
|
+
const trailingUserLeaf = this._store.setMessages !== void 0 && previousMessage?.role === "user" && previousMessage.id === messages.at(-1)?.id && previousMessage.content.every((part) => part.type === "text") ? previousMessage : void 0;
|
|
359
|
+
let movedLeaf;
|
|
360
|
+
if (trailingUserLeaf) {
|
|
361
|
+
const draft = {
|
|
362
|
+
text: getThreadMessageText(trailingUserLeaf),
|
|
363
|
+
attachments: trailingUserLeaf.attachments,
|
|
364
|
+
quote: trailingUserLeaf.metadata.custom.quote
|
|
365
|
+
};
|
|
366
|
+
if (this.composer.restoreDraft(draft)) {
|
|
367
|
+
this.repository.deleteMessage(trailingUserLeaf.id);
|
|
368
|
+
movedLeaf = {
|
|
369
|
+
id: trailingUserLeaf.id,
|
|
370
|
+
draft
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (!movedLeaf) this._notifySubscribers();
|
|
349
375
|
setTimeout(() => {
|
|
350
|
-
this.
|
|
376
|
+
this.dropEmptyOptimisticHead();
|
|
377
|
+
if (movedLeaf) {
|
|
378
|
+
const current = this.repository.getMessages();
|
|
379
|
+
if (current.at(-1)?.id === movedLeaf.id) this.repository.deleteMessage(movedLeaf.id);
|
|
380
|
+
else if (current.some((m) => m.id === movedLeaf.id)) this.composer.retractDraft(movedLeaf.draft);
|
|
381
|
+
}
|
|
382
|
+
this.updateMessages(this.repository.getMessages());
|
|
351
383
|
}, 0);
|
|
352
384
|
}
|
|
385
|
+
dropEmptyOptimisticHead() {
|
|
386
|
+
const head = this.repository.getMessages().at(-1);
|
|
387
|
+
if (head && head.metadata.isOptimistic && head.content.length === 0) this.repository.deleteMessage(head.id);
|
|
388
|
+
}
|
|
353
389
|
addToolResult(options) {
|
|
354
390
|
if (!this._store.onAddToolResult) throw new Error("Runtime does not support tool results.");
|
|
355
391
|
this._store.onAddToolResult?.(options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"external-store-thread-runtime-core.js","names":["AppendMessage","ThreadMessage","AddToolResultOptions","ResumeRunConfig","ResumeToolCallOptions","RespondToToolApprovalOptions","StartRunConfig","ThreadSuggestion","ExternalStoreAdapter","ExternalStoreBranchChange","getExternalStoreMessages","bindExternalStoreMessage","ThreadMessageConverter","getAutoStatus","isAutoStatus","fromThreadMessageLike","ThreadMessageLike","getThreadMessageText","RuntimeCapabilities","ThreadRuntimeCore","QueuePlacement","BaseThreadRuntimeCore","ModelContextProvider","ExportedMessageRepository","MessageRepository","generateId","ToolInvocationTracker","EMPTY_QUEUE_ITEMS","EMPTY_ARRAY","Object","freeze","shallowEqual","a","b","aKeys","keys","length","key","hasUpcomingMessage","isRunning","messages","role","ExternalStoreThreadRuntimeCore","_capabilities","switchToBranch","switchBranchDuringRun","edit","delete","reload","refetchThread","cancel","unstable_copy","speech","dictation","voice","attachments","feedback","queue","capabilities","_messages","isDisabled","isSendDisabled","isLoading","_store","_getBaseMessages","state","adapters","unstable_refetchThread","Promise","onRefetchThread","undefined","suggestions","extras","_converter","_toolInvocations","beginEdit","messageId","onEdit","Error","constructor","contextProvider","store","__internal_setAdapter","oldStore","newSuggestions","newCapabilities","setMessages","onDelete","onReload","onCancel","unstable_capabilities","copy","messageRepository","_notifySubscribers","incoming","headId","at","message","id","repository","resetHead","getMessages","incomingIds","Set","map","parentId","addOrUpdateMessage","export","has","deleteMessage","convertMessage","convertMessages","cache","m","idx","isLast","autoStatus","status","messageLike","newMessage","toString","seenIds","deduped","i","console","warn","add","push","reverse","parent","ensureInitialized","_notifyEventSubscribers","optimisticId","content","metadata","isOptimistic","type","_driveToolInvocations","unstable_enableToolInvocations","reset","setToolStatuses","getModelContext","tools","onResult","command","_findMessageIdForToolCall","toolCallId","onAddToolResult","toolName","result","isError","artifact","modelContent","err","error","onStatusesChange","statuses","fromEntries","setState","_toolCallToMessageId","Map","_messagesForToolCallIndex","clear","visit","Array","isArray","part","set","get","branchId","onBranchChange","unstable_onBranchChange","previousHeadId","canonicalHeadId","updateMessages","_notifyBranchChange","event","visibleMessageIds","append","isEdit","sourceId","steer","enqueue","startRun","abort","onNew","messageIndex","findIndex","filter","getQueueItems","items","getSteerQueueItems","steerItems","moveQueueItem","queueItemId","placement","move","removeQueueItem","remove","config","resumeRun","onResume","exportExternalState","onExportExternalState","importExternalState","onLoadExternalState","cancelRun","head","previousMessage","composer","text","trim","setText","setTimeout","addToolResult","options","resumeToolCall","handled","resume","payload","onResumeToolCall","respondToToolApproval","onRespondToToolApproval","initialMessages","repo","import","fromArray","data","onImport","hasConverter","flatMap"],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n StartRunConfig,\n ThreadSuggestion,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type {\n ExternalStoreAdapter,\n ExternalStoreBranchChange,\n} from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport { getAutoStatus, isAutoStatus } from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport type { QueuePlacement } from \"../../runtime/queue/external-thread-queue-adapter\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\nimport { generateId } from \"../../utils/id\";\nimport { ToolInvocationTracker } from \"../tool-invocations/ToolInvocationTracker\";\nimport { EMPTY_QUEUE_ITEMS } from \"../../store/scopes/queue-item\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst shallowEqual = (a: object, b: object): boolean => {\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if ((a as any)[key] !== (b as any)[key]) return false;\n }\n return true;\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n delete: false,\n reload: false,\n refetchThread: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n // A getter, not a method, so its presence tracks the adapter.\n public get unstable_refetchThread(): (() => Promise<void>) | undefined {\n if (!this._store.onRefetchThread) return undefined;\n return () => this._store.onRefetchThread!();\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n private _store!: ExternalStoreAdapter<any>;\n\n /**\n * Client-side tool-invocations pipeline. Constructed lazily on first\n * snapshot — only when `adapter.unstable_enableToolInvocations === true`.\n */\n private _toolInvocations: ToolInvocationTracker | null = null;\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n const isRunning = store.isRunning ?? false;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n delete:\n this._store.onDelete !== undefined ||\n this._store.setMessages !== undefined,\n reload: this._store.onReload !== undefined,\n refetchThread: this._store.onRefetchThread !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: this._store.queue !== undefined,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this._notifySubscribers();\n return;\n }\n\n const incoming = store.messageRepository.messages;\n const headId =\n store.messageRepository.headId ?? incoming.at(-1)?.message.id ?? null;\n\n if (oldStore && oldStore.messageRepository === store.messageRepository) {\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n } else {\n const incomingIds = new Set(incoming.map(({ message }) => message.id));\n for (const { message, parentId } of incoming) {\n this.repository.addOrUpdateMessage(parentId, message);\n }\n for (const { message } of this.repository.export().messages) {\n if (!incomingIds.has(message.id)) {\n this.repository.deleteMessage(message.id);\n }\n }\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n }\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const autoStatus = getAutoStatus(\n isLast,\n isRunning,\n false,\n false,\n undefined,\n );\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status === autoStatus)\n )\n return cache;\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n idx.toString(),\n autoStatus,\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n const seenIds = new Set<string>();\n const deduped: ThreadMessage[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (seenIds.has(message.id)) {\n console.warn(\n `ExternalStoreThreadRuntimeCore: duplicate message id \"${message.id}\" in the provided messages array; keeping the last occurrence.`,\n );\n continue;\n }\n seenIds.add(message.id);\n deduped.push(message);\n }\n if (deduped.length !== messages.length) messages = deduped.reverse();\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n if ((oldStore?.isRunning ?? false) !== (store.isRunning ?? false)) {\n if (store.isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n // Append an optimistic placeholder while running but before a trailing\n // assistant message exists. resetHead evicts off-branch optimistic messages\n // (prior placeholders, mid-run id-swap siblings); export() never persists them.\n let optimisticId: string | null = null;\n if (hasUpcomingMessage(isRunning, messages)) {\n optimisticId = generateId();\n this.repository.addOrUpdateMessage(\n messages.at(-1)?.id ?? null,\n fromThreadMessageLike(\n { role: \"assistant\", content: [], metadata: { isOptimistic: true } },\n optimisticId,\n { type: \"running\" },\n ),\n );\n }\n\n this.repository.resetHead(optimisticId ?? messages.at(-1)?.id ?? null);\n\n this._messages = this.repository.getMessages();\n\n this._driveToolInvocations();\n\n this._notifySubscribers();\n }\n\n /**\n * Feed the current message snapshot into the tool-invocations tracker.\n * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker\n * itself is fail-silent — see ToolInvocationTracker for the\n * state-transition contract.\n */\n private _driveToolInvocations(): void {\n if (!this._store.unstable_enableToolInvocations) {\n // Adapter did not opt in (default). If a tracker was previously\n // constructed (e.g. the adapter just toggled the flag off via a\n // dynamic swap), drop it so subsequent snapshots are no-ops.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._toolInvocations = null;\n this._store.setToolStatuses?.({});\n }\n return;\n }\n\n if (!this._toolInvocations) {\n this._toolInvocations = new ToolInvocationTracker(\n () => this.getModelContext().tools,\n {\n onResult: (command) => {\n try {\n const messageId = this._findMessageIdForToolCall(\n command.toolCallId,\n );\n if (messageId === undefined) {\n // The tool call no longer exists in the snapshot (e.g.\n // rolled back). Drop the result.\n return;\n }\n this._store.onAddToolResult?.({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact !== undefined && {\n artifact: command.artifact,\n }),\n ...(command.modelContent !== undefined && {\n modelContent: command.modelContent,\n }),\n });\n } catch (err) {\n console.error(\n \"[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed\",\n err,\n );\n }\n },\n onStatusesChange: (statuses) => {\n this._store.setToolStatuses?.(Object.fromEntries(statuses));\n },\n },\n );\n }\n\n this._toolInvocations.setState({\n messages: this._messages,\n isRunning: this._store.isRunning ?? false,\n ...(this._store.isLoading !== undefined && {\n isLoading: this._store.isLoading,\n }),\n });\n }\n\n /**\n * Lookup table from `toolCallId` to the owning assistant message's `id`,\n * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).\n */\n private _toolCallToMessageId = new Map<string, string>();\n private _messagesForToolCallIndex: readonly ThreadMessage[] | null = null;\n\n /**\n * Look up the assistant message that owns a tool-call part. Lazily builds\n * (and caches) a `toolCallId → messageId` map keyed off the current\n * `_messages` reference, so onResult dispatches stay O(1) instead of\n * walking the full thread on every result.\n */\n private _findMessageIdForToolCall(toolCallId: string): string | undefined {\n if (this._messagesForToolCallIndex !== this._messages) {\n this._toolCallToMessageId.clear();\n const visit = (messages: readonly ThreadMessage[]): void => {\n for (const message of messages) {\n if (!Array.isArray(message.content)) continue;\n for (const part of message.content) {\n if (!part || part.type !== \"tool-call\") continue;\n this._toolCallToMessageId.set(part.toolCallId, message.id);\n if (part.messages) visit(part.messages);\n }\n }\n };\n visit(this._messages);\n this._messagesForToolCallIndex = this._messages;\n }\n return this._toolCallToMessageId.get(toolCallId);\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._store.isRunning) {\n return;\n }\n\n const onBranchChange = this._store.unstable_onBranchChange;\n const previousHeadId = onBranchChange\n ? this.repository.canonicalHeadId\n : null;\n\n this.repository.switchToBranch(branchId);\n this.updateMessages(this.repository.getMessages());\n if (onBranchChange) {\n this._notifyBranchChange(previousHeadId, onBranchChange);\n }\n }\n\n /**\n * Emit `unstable_onBranchChange` for an explicit branch switch. Reads the\n * canonical head from the repository (which skips optimistic/transient\n * messages) and de-dupes switches that leave the canonical head unchanged.\n * Comparing against the head observed just before the switch — rather than the\n * last emitted head — keeps a switch firing after an adapter resync moved the\n * head elsewhere in the meantime.\n */\n private _notifyBranchChange(\n previousHeadId: string | null,\n onBranchChange: (event: ExternalStoreBranchChange) => void,\n ): void {\n const headId = this.repository.canonicalHeadId;\n if (headId === previousHeadId) return;\n\n onBranchChange({\n headId,\n visibleMessageIds: this.repository.getMessages().map((m) => m.id),\n });\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // sourceId marks an edit send; the parent may coincide with the head\n // after a resync (e.g. cancelRun dropped the edited message).\n const isEdit =\n message.sourceId != null ||\n message.parentId !== (this.messages.at(-1)?.id ?? null);\n\n // Buffering does not start a run, so the tool-abort below must wait until\n // the queue flushes. By then the prior run (and its tools) has settled.\n if (!isEdit && this._store.queue) {\n if (message.steer ?? this._store.isRunning ?? false)\n this._store.queue.steer(message);\n else this._store.queue.enqueue(message);\n return;\n }\n\n // Auto-abort in-flight client-side tool executions when a new run is\n // about to start. Without this, a tool that finishes after the new turn\n // begins would feed a stale result into `onAddToolResult`, racing with\n // the new turn the user just initiated. `startRun` defaults to true for\n // user messages — matches the satellites' historical opt-in cancel\n // behavior, which is now built in.\n if (message.startRun ?? message.role === \"user\") {\n await this._toolInvocations?.abort();\n }\n\n if (isEdit) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n public async deleteMessage(messageId: string): Promise<void> {\n if (this._store.onDelete) {\n await this._store.onDelete(messageId);\n return;\n }\n\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support deleting messages.\");\n\n if (this._store.isRunning) {\n await this._toolInvocations?.abort();\n }\n\n const messages = this.repository.getMessages();\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) throw new Error(\"Message not found.\");\n\n this.updateMessages(messages.filter((message) => message.id !== messageId));\n }\n\n public getQueueItems() {\n // The composer reads this during base-thread construction, before the\n // constructor assigns `_store`, so guard against the unset field.\n return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;\n }\n\n public getSteerQueueItems() {\n return this._store?.queue?.steerItems ?? EMPTY_QUEUE_ITEMS;\n }\n\n public moveQueueItem(queueItemId: string, placement: QueuePlacement) {\n this._store?.queue?.move(queueItemId, placement);\n }\n\n public removeQueueItem(queueItemId: string) {\n this._store?.queue?.remove(queueItemId);\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n\n // Auto-abort in-flight client-side tool executions when a run reloads;\n // any results that land afterward would target a turn that no longer\n // exists. See `append` above for full rationale.\n await this._toolInvocations?.abort();\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n // Re-arm the tracker so the next adapter snapshot (containing the\n // imported state) is treated as historical — no streamCall/execute\n // fires for the loaded tool calls. The adapter is expected to update\n // its messages in response to onLoadExternalState; that update flows\n // back here via __internal_setAdapter. We only clear adapter-side\n // tool statuses when the tracker is the source of truth — otherwise\n // we'd wipe statuses the adapter is managing on its own.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._store.setToolStatuses?.({});\n }\n\n this._store.onLoadExternalState(state);\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n // Abort any in-flight client-side tool executions. Fire-and-forget —\n // the abort resolves once executions settle, but we don't gate the\n // cancel on it.\n void this._toolInvocations?.abort();\n\n this._store.onCancel();\n\n // Drop an empty optimistic head (placeholder or pre-stream message); a\n // partially-streamed one is kept and re-supplied by the store on resync.\n const head = this.repository.getMessages().at(-1);\n if (head && head.metadata.isOptimistic && head.content.length === 0) {\n this.repository.deleteMessage(head.id);\n }\n\n let messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.repository.deleteMessage(previousMessage.id);\n if (!this.composer.text.trim()) {\n this.composer.setText(getThreadMessageText(previousMessage));\n }\n\n messages = this.repository.getMessages();\n } else {\n this._notifySubscribers();\n }\n\n // resync messages (for reloading, to restore the previous branch)\n setTimeout(() => {\n this.updateMessages(messages);\n }, 0);\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n this._store.onAddToolResult?.(options);\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n // Tracker owns its own human-input handlers — let it resume in-process\n // tool calls without round-tripping through the adapter. Falls back to\n // the adapter's onResumeToolCall (if any) for tool calls the tracker\n // doesn't know about.\n const handled =\n this._toolInvocations?.resume(options.toolCallId, options.payload) ??\n false;\n if (handled) return;\n\n if (this._store.onResumeToolCall) {\n this._store.onResumeToolCall(options);\n return;\n }\n\n throw new Error(\n `Tool call ${options.toolCallId} is not waiting for resume.`,\n );\n }\n\n public respondToToolApproval(options: RespondToToolApprovalOptions) {\n if (!this._store.onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n this._store.onRespondToToolApproval(options);\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"external-store-thread-runtime-core.js","names":["AppendMessage","ThreadMessage","Attachment","AddToolResultOptions","ResumeRunConfig","ResumeToolCallOptions","RespondToToolApprovalOptions","StartRunConfig","ThreadSuggestion","ExternalStoreAdapter","ExternalStoreBranchChange","getExternalStoreMessages","bindExternalStoreMessage","ThreadMessageConverter","getAutoStatus","isAutoStatus","fromThreadMessageLike","ThreadMessageLike","getThreadMessageText","RuntimeCapabilities","ThreadRuntimeCore","ExternalThreadQueueAdapter","QueuePlacement","BaseThreadRuntimeCore","ModelContextProvider","ExportedMessageRepository","MessageRepository","generateId","ToolInvocationTracker","EMPTY_QUEUE_ITEMS","QuoteInfo","EMPTY_ARRAY","Object","freeze","shallowEqual","a","b","aKeys","keys","length","key","hasUpcomingMessage","isRunning","messages","role","ExternalStoreThreadRuntimeCore","_capabilities","switchToBranch","switchBranchDuringRun","edit","delete","reload","refetchThread","cancel","unstable_copy","speech","dictation","voice","attachments","feedback","queue","capabilities","_messages","isDisabled","isSendDisabled","isLoading","_store","_getBaseMessages","state","adapters","unstable_refetchThread","Promise","onRefetchThread","undefined","suggestions","extras","_converter","_transformedQueue","_toolInvocations","beginEdit","messageId","onEdit","Error","constructor","contextProvider","store","__internal_setAdapter","oldStore","__internal_setDispatchTransform","message","parentId","at","id","enrichAppendMetadata","newSuggestions","newCapabilities","setMessages","onDelete","onReload","onCancel","unstable_capabilities","copy","messageRepository","_notifySubscribers","incoming","headId","repository","resetHead","getMessages","incomingIds","Set","map","addOrUpdateMessage","export","has","deleteMessage","convertMessage","convertMessages","cache","m","idx","isLast","autoStatus","status","messageLike","newMessage","toString","seenIds","deduped","i","console","warn","add","push","reverse","parent","ensureInitialized","_notifyEventSubscribers","optimisticId","content","metadata","isOptimistic","type","_driveToolInvocations","unstable_enableToolInvocations","reset","setToolStatuses","getModelContext","tools","onResult","command","_findMessageIdForToolCall","toolCallId","onAddToolResult","toolName","result","isError","artifact","modelContent","err","error","onStatusesChange","statuses","fromEntries","setState","_toolCallToMessageId","Map","_messagesForToolCallIndex","clear","visit","Array","isArray","part","set","get","branchId","onBranchChange","unstable_onBranchChange","previousHeadId","canonicalHeadId","updateMessages","_notifyBranchChange","event","visibleMessageIds","append","rawMessage","isEdit","sourceId","queued","steer","enqueue","startRun","abort","onNew","messageIndex","findIndex","filter","getQueueItems","items","getSteerQueueItems","steerItems","moveQueueItem","queueItemId","placement","move","removeQueueItem","remove","config","resumeRun","onResume","exportExternalState","onExportExternalState","importExternalState","onLoadExternalState","cancelRun","__internal_notifyCancelled","dropEmptyOptimisticHead","previousMessage","trailingUserLeaf","every","movedLeaf","draft","text","quote","custom","composer","restoreDraft","setTimeout","current","some","retractDraft","head","addToolResult","options","resumeToolCall","handled","resume","payload","onResumeToolCall","respondToToolApproval","onRespondToToolApproval","initialMessages","repo","import","fromArray","data","onImport","hasConverter","flatMap"],"sources":["../../../src/runtimes/external-store/external-store-thread-runtime-core.ts"],"sourcesContent":["import type { AppendMessage, ThreadMessage } from \"../../types/message\";\nimport type { Attachment } from \"../../types/attachment\";\nimport type {\n AddToolResultOptions,\n ResumeRunConfig,\n ResumeToolCallOptions,\n RespondToToolApprovalOptions,\n StartRunConfig,\n ThreadSuggestion,\n} from \"../../runtime/interfaces/thread-runtime-core\";\n\nimport type {\n ExternalStoreAdapter,\n ExternalStoreBranchChange,\n} from \"./external-store-adapter\";\nimport {\n getExternalStoreMessages,\n bindExternalStoreMessage,\n} from \"../../runtime/utils/external-store-message\";\nimport { ThreadMessageConverter } from \"./thread-message-converter\";\nimport { getAutoStatus, isAutoStatus } from \"../../runtime/utils/auto-status\";\nimport {\n fromThreadMessageLike,\n type ThreadMessageLike,\n} from \"../../runtime/utils/thread-message-like\";\nimport { getThreadMessageText } from \"../../utils/text\";\nimport type {\n RuntimeCapabilities,\n ThreadRuntimeCore,\n} from \"../../runtime/interfaces/thread-runtime-core\";\nimport type {\n ExternalThreadQueueAdapter,\n QueuePlacement,\n} from \"../../runtime/queue/external-thread-queue-adapter\";\nimport { BaseThreadRuntimeCore } from \"../../runtime/base/base-thread-runtime-core\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport {\n ExportedMessageRepository,\n MessageRepository,\n} from \"../../runtime/utils/message-repository\";\nimport { generateId } from \"../../utils/id\";\nimport { ToolInvocationTracker } from \"../tool-invocations/ToolInvocationTracker\";\nimport { EMPTY_QUEUE_ITEMS } from \"../../store/scopes/queue-item\";\nimport type { QuoteInfo } from \"../../types/quote\";\n\nconst EMPTY_ARRAY: readonly ThreadSuggestion[] = Object.freeze([]);\n\nconst shallowEqual = (a: object, b: object): boolean => {\n const aKeys = Object.keys(a);\n if (aKeys.length !== Object.keys(b).length) return false;\n for (const key of aKeys) {\n if ((a as any)[key] !== (b as any)[key]) return false;\n }\n return true;\n};\n\nexport const hasUpcomingMessage = (\n isRunning: boolean,\n messages: readonly ThreadMessage[],\n) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class ExternalStoreThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n private _capabilities: RuntimeCapabilities = {\n switchToBranch: false,\n switchBranchDuringRun: false,\n edit: false,\n delete: false,\n reload: false,\n refetchThread: false,\n cancel: false,\n unstable_copy: false,\n speech: false,\n dictation: false,\n voice: false,\n attachments: false,\n feedback: false,\n queue: false,\n };\n\n public get capabilities() {\n return this._capabilities;\n }\n\n private _messages!: readonly ThreadMessage[];\n public isDisabled!: boolean;\n public isSendDisabled!: boolean;\n public get isLoading() {\n return this._store.isLoading ?? false;\n }\n // Unlike `isLoading`: pass `undefined` through to preserve the `getThreadState` fallback.\n public get isRunning(): boolean | undefined {\n return this._store.isRunning;\n }\n\n protected override _getBaseMessages(): readonly ThreadMessage[] {\n return this._messages;\n }\n\n public override get state() {\n return this._store.state ?? super.state;\n }\n\n public get adapters() {\n return this._store.adapters;\n }\n\n // A getter, not a method, so its presence tracks the adapter.\n public get unstable_refetchThread(): (() => Promise<void>) | undefined {\n if (!this._store.onRefetchThread) return undefined;\n return () => this._store.onRefetchThread!();\n }\n\n public suggestions: readonly ThreadSuggestion[] = [];\n public extras: unknown = undefined;\n\n private _converter = new ThreadMessageConverter();\n\n private _store!: ExternalStoreAdapter<any>;\n\n private _transformedQueue: ExternalThreadQueueAdapter | undefined;\n\n /**\n * Client-side tool-invocations pipeline. Constructed lazily on first\n * snapshot — only when `adapter.unstable_enableToolInvocations === true`.\n */\n private _toolInvocations: ToolInvocationTracker | null = null;\n\n public override beginEdit(messageId: string) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing.\");\n\n super.beginEdit(messageId);\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n store: ExternalStoreAdapter<any>,\n ) {\n super(contextProvider);\n this.__internal_setAdapter(store);\n }\n\n public __internal_setAdapter(store: ExternalStoreAdapter<any>) {\n if (this._store === store) return;\n\n const isRunning = store.isRunning ?? false;\n this.isDisabled = store.isDisabled ?? false;\n this.isSendDisabled = store.isSendDisabled ?? false;\n\n const oldStore = this._store as ExternalStoreAdapter<any> | undefined;\n this._store = store;\n if (oldStore?.queue !== store.queue) {\n this._transformedQueue = undefined;\n store.queue?.__internal_setDispatchTransform?.((message) => {\n // Re-point at the tail, as LocalThreadRuntimeCore's driver does, so\n // the prefix gated against is the one the message lands on whatever\n // the host routes by. Queuing only ever accepts a tail append, so a\n // later tail is the same intent.\n const parentId = this.messages.at(-1)?.id ?? null;\n return this.enrichAppendMetadata({ ...message, parentId }, parentId);\n });\n if (store.queue?.__internal_setDispatchTransform)\n this._transformedQueue = store.queue;\n }\n if (this.extras !== store.extras) {\n this.extras = store.extras;\n }\n\n const newSuggestions = store.suggestions ?? EMPTY_ARRAY;\n if (!shallowEqual(this.suggestions, newSuggestions)) {\n this.suggestions = newSuggestions;\n }\n\n const newCapabilities: RuntimeCapabilities = {\n switchToBranch: this._store.setMessages !== undefined,\n switchBranchDuringRun: false,\n edit: this._store.onEdit !== undefined,\n delete:\n this._store.onDelete !== undefined ||\n this._store.setMessages !== undefined,\n reload: this._store.onReload !== undefined,\n refetchThread: this._store.onRefetchThread !== undefined,\n cancel: this._store.onCancel !== undefined,\n speech: this._store.adapters?.speech !== undefined,\n dictation: this._store.adapters?.dictation !== undefined,\n voice: this._store.adapters?.voice !== undefined,\n unstable_copy: this._store.unstable_capabilities?.copy !== false,\n attachments: !!this._store.adapters?.attachments,\n feedback: !!this._store.adapters?.feedback,\n queue: this._store.queue !== undefined,\n };\n if (!shallowEqual(this._capabilities, newCapabilities)) {\n this._capabilities = newCapabilities;\n }\n\n let messages: readonly ThreadMessage[];\n\n if (store.messageRepository) {\n // Handle messageRepository\n if (\n oldStore &&\n oldStore.isRunning === store.isRunning &&\n oldStore.messageRepository === store.messageRepository\n ) {\n this._notifySubscribers();\n return;\n }\n\n const incoming = store.messageRepository.messages;\n const headId =\n store.messageRepository.headId ?? incoming.at(-1)?.message.id ?? null;\n\n if (oldStore && oldStore.messageRepository === store.messageRepository) {\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n } else {\n const incomingIds = new Set(incoming.map(({ message }) => message.id));\n for (const { message, parentId } of incoming) {\n this.repository.addOrUpdateMessage(parentId, message);\n }\n for (const { message } of this.repository.export().messages) {\n if (!incomingIds.has(message.id)) {\n this.repository.deleteMessage(message.id);\n }\n }\n this.repository.resetHead(headId);\n messages = this.repository.getMessages();\n }\n } else if (store.messages) {\n // Handle messages array\n\n if (oldStore) {\n // flush the converter cache when the convertMessage prop changes\n if (oldStore.convertMessage !== store.convertMessage) {\n this._converter = new ThreadMessageConverter();\n } else if (\n oldStore.isRunning === store.isRunning &&\n oldStore.messages === store.messages\n ) {\n this._notifySubscribers();\n // no conversion update\n return;\n }\n }\n\n messages = !store.convertMessage\n ? store.messages\n : this._converter.convertMessages(store.messages, (cache, m, idx) => {\n if (!store.convertMessage) return m;\n\n const isLast = idx === (store.messages?.length ?? 0) - 1;\n const autoStatus = getAutoStatus(\n isLast,\n isRunning,\n false,\n false,\n undefined,\n );\n\n if (\n cache &&\n (cache.role !== \"assistant\" ||\n !isAutoStatus(cache.status) ||\n cache.status === autoStatus)\n )\n return cache;\n\n const messageLike = store.convertMessage(m, idx);\n const newMessage = fromThreadMessageLike(\n messageLike,\n idx.toString(),\n autoStatus,\n );\n bindExternalStoreMessage(newMessage, m);\n return newMessage;\n });\n\n const seenIds = new Set<string>();\n const deduped: ThreadMessage[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]!;\n if (seenIds.has(message.id)) {\n console.warn(\n `ExternalStoreThreadRuntimeCore: duplicate message id \"${message.id}\" in the provided messages array; keeping the last occurrence.`,\n );\n continue;\n }\n seenIds.add(message.id);\n deduped.push(message);\n }\n if (deduped.length !== messages.length) messages = deduped.reverse();\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!;\n const parent = messages[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n } else {\n throw new Error(\n \"ExternalStoreAdapter must provide either 'messages' or 'messageRepository'\",\n );\n }\n\n // Common logic for both paths\n if (messages.length > 0) this.ensureInitialized();\n\n if ((oldStore?.isRunning ?? false) !== (store.isRunning ?? false)) {\n if (store.isRunning) {\n this._notifyEventSubscribers(\"runStart\", {});\n } else {\n this._notifyEventSubscribers(\"runEnd\", {});\n }\n }\n\n // Append an optimistic placeholder while running but before a trailing\n // assistant message exists. resetHead evicts off-branch optimistic messages\n // (prior placeholders, mid-run id-swap siblings); export() never persists them.\n let optimisticId: string | null = null;\n if (hasUpcomingMessage(isRunning, messages)) {\n optimisticId = generateId();\n this.repository.addOrUpdateMessage(\n messages.at(-1)?.id ?? null,\n fromThreadMessageLike(\n { role: \"assistant\", content: [], metadata: { isOptimistic: true } },\n optimisticId,\n { type: \"running\" },\n ),\n );\n }\n\n this.repository.resetHead(optimisticId ?? messages.at(-1)?.id ?? null);\n\n this._messages = this.repository.getMessages();\n\n this._driveToolInvocations();\n\n this._notifySubscribers();\n }\n\n /**\n * Feed the current message snapshot into the tool-invocations tracker.\n * Opt-in via `adapter.unstable_enableToolInvocations: true`. The tracker\n * itself is fail-silent — see ToolInvocationTracker for the\n * state-transition contract.\n */\n private _driveToolInvocations(): void {\n if (!this._store.unstable_enableToolInvocations) {\n // Adapter did not opt in (default). If a tracker was previously\n // constructed (e.g. the adapter just toggled the flag off via a\n // dynamic swap), drop it so subsequent snapshots are no-ops.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._toolInvocations = null;\n this._store.setToolStatuses?.({});\n }\n return;\n }\n\n if (!this._toolInvocations) {\n this._toolInvocations = new ToolInvocationTracker(\n () => this.getModelContext().tools,\n {\n onResult: (command) => {\n try {\n const messageId = this._findMessageIdForToolCall(\n command.toolCallId,\n );\n if (messageId === undefined) {\n // The tool call no longer exists in the snapshot (e.g.\n // rolled back). Drop the result.\n return;\n }\n this._store.onAddToolResult?.({\n messageId,\n toolCallId: command.toolCallId,\n toolName: command.toolName,\n result: command.result,\n isError: command.isError,\n ...(command.artifact !== undefined && {\n artifact: command.artifact,\n }),\n ...(command.modelContent !== undefined && {\n modelContent: command.modelContent,\n }),\n });\n } catch (err) {\n console.error(\n \"[ExternalStoreThreadRuntimeCore] onAddToolResult dispatch failed\",\n err,\n );\n }\n },\n onStatusesChange: (statuses) => {\n this._store.setToolStatuses?.(Object.fromEntries(statuses));\n },\n },\n );\n }\n\n this._toolInvocations.setState({\n messages: this._messages,\n isRunning: this._store.isRunning ?? false,\n ...(this._store.isLoading !== undefined && {\n isLoading: this._store.isLoading,\n }),\n });\n }\n\n /**\n * Lookup table from `toolCallId` to the owning assistant message's `id`,\n * rebuilt lazily when `_messages` changes (see `_messagesForToolCallIndex`).\n */\n private _toolCallToMessageId = new Map<string, string>();\n private _messagesForToolCallIndex: readonly ThreadMessage[] | null = null;\n\n /**\n * Look up the assistant message that owns a tool-call part. Lazily builds\n * (and caches) a `toolCallId → messageId` map keyed off the current\n * `_messages` reference, so onResult dispatches stay O(1) instead of\n * walking the full thread on every result.\n */\n private _findMessageIdForToolCall(toolCallId: string): string | undefined {\n if (this._messagesForToolCallIndex !== this._messages) {\n this._toolCallToMessageId.clear();\n const visit = (messages: readonly ThreadMessage[]): void => {\n for (const message of messages) {\n if (!Array.isArray(message.content)) continue;\n for (const part of message.content) {\n if (!part || part.type !== \"tool-call\") continue;\n this._toolCallToMessageId.set(part.toolCallId, message.id);\n if (part.messages) visit(part.messages);\n }\n }\n };\n visit(this._messages);\n this._messagesForToolCallIndex = this._messages;\n }\n return this._toolCallToMessageId.get(toolCallId);\n }\n\n public override switchToBranch(branchId: string): void {\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support switching branches.\");\n\n // Silently ignore branch switches while running\n if (this._store.isRunning) {\n return;\n }\n\n const onBranchChange = this._store.unstable_onBranchChange;\n const previousHeadId = onBranchChange\n ? this.repository.canonicalHeadId\n : null;\n\n this.repository.switchToBranch(branchId);\n this.updateMessages(this.repository.getMessages());\n if (onBranchChange) {\n this._notifyBranchChange(previousHeadId, onBranchChange);\n }\n }\n\n /**\n * Emit `unstable_onBranchChange` for an explicit branch switch. Reads the\n * canonical head from the repository (which skips optimistic/transient\n * messages) and de-dupes switches that leave the canonical head unchanged.\n * Comparing against the head observed just before the switch — rather than the\n * last emitted head — keeps a switch firing after an adapter resync moved the\n * head elsewhere in the meantime.\n */\n private _notifyBranchChange(\n previousHeadId: string | null,\n onBranchChange: (event: ExternalStoreBranchChange) => void,\n ): void {\n const headId = this.repository.canonicalHeadId;\n if (headId === previousHeadId) return;\n\n onBranchChange({\n headId,\n visibleMessageIds: this.repository.getMessages().map((m) => m.id),\n });\n }\n\n public async append(rawMessage: AppendMessage): Promise<void> {\n // sourceId marks an edit send; the parent may coincide with the head\n // after a resync (e.g. cancelRun dropped the edited message).\n const isEdit =\n rawMessage.sourceId != null ||\n rawMessage.parentId !== (this.messages.at(-1)?.id ?? null);\n\n // Buffering does not start a run, so the tool-abort below must wait until\n // the queue flushes. By then the prior run (and its tools) has settled.\n if (!isEdit && this._store.queue) {\n // Skip only for the queue this core actually installed on: another\n // core's transform would gate against its own thread's messages.\n const queued =\n this._store.queue === this._transformedQueue\n ? rawMessage\n : this.enrichAppendMetadata(rawMessage);\n if (queued.steer ?? this._store.isRunning ?? false)\n this._store.queue.steer(queued);\n else this._store.queue.enqueue(queued);\n return;\n }\n\n const message = this.enrichAppendMetadata(rawMessage);\n\n // Auto-abort in-flight client-side tool executions when a new run is\n // about to start. Without this, a tool that finishes after the new turn\n // begins would feed a stale result into `onAddToolResult`, racing with\n // the new turn the user just initiated. `startRun` defaults to true for\n // user messages — matches the satellites' historical opt-in cancel\n // behavior, which is now built in.\n if (message.startRun ?? message.role === \"user\") {\n await this._toolInvocations?.abort();\n }\n\n if (isEdit) {\n if (!this._store.onEdit)\n throw new Error(\"Runtime does not support editing messages.\");\n await this._store.onEdit(message);\n } else {\n await this._store.onNew(message);\n }\n }\n\n public async deleteMessage(messageId: string): Promise<void> {\n if (this._store.onDelete) {\n await this._store.onDelete(messageId);\n return;\n }\n\n if (!this._store.setMessages)\n throw new Error(\"Runtime does not support deleting messages.\");\n\n if (this._store.isRunning) {\n await this._toolInvocations?.abort();\n }\n\n const messages = this.repository.getMessages();\n const messageIndex = messages.findIndex((m) => m.id === messageId);\n if (messageIndex === -1) throw new Error(\"Message not found.\");\n\n this.updateMessages(messages.filter((message) => message.id !== messageId));\n }\n\n public getQueueItems() {\n // The composer reads this during base-thread construction, before the\n // constructor assigns `_store`, so guard against the unset field.\n return this._store?.queue?.items ?? EMPTY_QUEUE_ITEMS;\n }\n\n public getSteerQueueItems() {\n return this._store?.queue?.steerItems ?? EMPTY_QUEUE_ITEMS;\n }\n\n public moveQueueItem(queueItemId: string, placement: QueuePlacement) {\n this._store?.queue?.move(queueItemId, placement);\n }\n\n public removeQueueItem(queueItemId: string) {\n this._store?.queue?.remove(queueItemId);\n }\n\n public async startRun(config: StartRunConfig): Promise<void> {\n if (!this._store.onReload)\n throw new Error(\"Runtime does not support reloading messages.\");\n\n // Auto-abort in-flight client-side tool executions when a run reloads;\n // any results that land afterward would target a turn that no longer\n // exists. See `append` above for full rationale.\n await this._toolInvocations?.abort();\n\n await this._store.onReload(config.parentId, config);\n }\n\n public async resumeRun(config: ResumeRunConfig): Promise<void> {\n if (!this._store.onResume)\n throw new Error(\"Runtime does not support resuming runs.\");\n\n await this._store.onResume(config);\n }\n\n public exportExternalState(): any {\n if (!this._store.onExportExternalState)\n throw new Error(\"Runtime does not support exporting external states.\");\n\n return this._store.onExportExternalState();\n }\n\n public importExternalState(state: any): void {\n if (!this._store.onLoadExternalState)\n throw new Error(\"Runtime does not support importing external states.\");\n\n // Re-arm the tracker so the next adapter snapshot (containing the\n // imported state) is treated as historical — no streamCall/execute\n // fires for the loaded tool calls. The adapter is expected to update\n // its messages in response to onLoadExternalState; that update flows\n // back here via __internal_setAdapter. We only clear adapter-side\n // tool statuses when the tracker is the source of truth — otherwise\n // we'd wipe statuses the adapter is managing on its own.\n if (this._toolInvocations) {\n this._toolInvocations.reset();\n this._store.setToolStatuses?.({});\n }\n\n this._store.onLoadExternalState(state);\n }\n\n public cancelRun(): void {\n if (!this._store.onCancel)\n throw new Error(\"Runtime does not support cancelling runs.\");\n\n // Abort any in-flight client-side tool executions. Fire-and-forget —\n // the abort resolves once executions settle, but we don't gate the\n // cancel on it.\n void this._toolInvocations?.abort();\n\n // Before the run is aborted, so the settle it produces keeps the pending\n // items instead of dispatching the next one at the moment the user\n // stopped.\n this._store.queue?.__internal_notifyCancelled?.();\n\n this._store.onCancel();\n\n this.dropEmptyOptimisticHead();\n\n const messages = this.repository.getMessages();\n const previousMessage = messages[messages.length - 1];\n const trailingUserLeaf =\n this._store.setMessages !== undefined &&\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id && // ensure the previous message is a leaf node\n previousMessage.content.every((part) => part.type === \"text\")\n ? previousMessage\n : undefined;\n\n // Handing the message to the composer and taking it out of the thread are\n // one move: the composer refuses while the user is writing, and removing\n // the message then would leave it nowhere. A message the composer cannot\n // hold whole, carrying content parts it has no home for, is not moved.\n let movedLeaf:\n | {\n id: string;\n draft: {\n text: string;\n attachments: readonly Attachment[];\n quote: QuoteInfo | undefined;\n };\n }\n | undefined;\n if (trailingUserLeaf) {\n const draft = {\n text: getThreadMessageText(trailingUserLeaf),\n attachments: trailingUserLeaf.attachments,\n quote: trailingUserLeaf.metadata.custom.quote as QuoteInfo | undefined,\n };\n if (this.composer.restoreDraft(draft)) {\n this.repository.deleteMessage(trailingUserLeaf.id);\n movedLeaf = { id: trailingUserLeaf.id, draft };\n }\n }\n if (!movedLeaf) this._notifySubscribers();\n\n // The resync commits what the cancel left (a kept optimistic message, the\n // restored branch) back to the store a macrotask later. The store may move\n // in that gap; a server settling the cancelled turn lands in the same\n // tick. Read the repository at flush time and re-apply the rollbacks to\n // it, instead of stamping a snapshot captured above over the newer state.\n setTimeout(() => {\n this.dropEmptyOptimisticHead();\n if (movedLeaf) {\n const current = this.repository.getMessages();\n if (current.at(-1)?.id === movedLeaf.id) {\n // Unanswered tail: the removal has not reached the store yet.\n this.repository.deleteMessage(movedLeaf.id);\n } else if (current.some((m) => m.id === movedLeaf.id)) {\n // The store kept the turn in the thread; take the untouched draft\n // back so the same content does not sit in both places.\n this.composer.retractDraft(movedLeaf.draft);\n }\n }\n this.updateMessages(this.repository.getMessages());\n }, 0);\n }\n\n // Placeholder or pre-stream message; a partially-streamed one is kept and\n // committed to the store by the cancel resync.\n private dropEmptyOptimisticHead(): void {\n const head = this.repository.getMessages().at(-1);\n if (head && head.metadata.isOptimistic && head.content.length === 0) {\n this.repository.deleteMessage(head.id);\n }\n }\n\n public addToolResult(options: AddToolResultOptions) {\n if (!this._store.onAddToolResult)\n throw new Error(\"Runtime does not support tool results.\");\n this._store.onAddToolResult?.(options);\n }\n\n public resumeToolCall(options: ResumeToolCallOptions) {\n // Tracker owns its own human-input handlers — let it resume in-process\n // tool calls without round-tripping through the adapter. Falls back to\n // the adapter's onResumeToolCall (if any) for tool calls the tracker\n // doesn't know about.\n const handled =\n this._toolInvocations?.resume(options.toolCallId, options.payload) ??\n false;\n if (handled) return;\n\n if (this._store.onResumeToolCall) {\n this._store.onResumeToolCall(options);\n return;\n }\n\n throw new Error(\n `Tool call ${options.toolCallId} is not waiting for resume.`,\n );\n }\n\n public respondToToolApproval(options: RespondToToolApprovalOptions) {\n if (!this._store.onRespondToToolApproval)\n throw new Error(\"Runtime does not support tool approvals.\");\n this._store.onRespondToToolApproval(options);\n }\n\n public override reset(initialMessages?: readonly ThreadMessageLike[]) {\n const repo = new MessageRepository();\n repo.import(ExportedMessageRepository.fromArray(initialMessages ?? []));\n this.updateMessages(repo.getMessages());\n }\n\n public override import(data: ExportedMessageRepository) {\n super.import(data);\n\n if (this._store.onImport) {\n this._store.onImport(this.repository.getMessages());\n }\n }\n\n private updateMessages = (messages: readonly ThreadMessage[]) => {\n const hasConverter = this._store.convertMessage !== undefined;\n if (hasConverter) {\n this._store.setMessages?.(messages.flatMap(getExternalStoreMessages));\n } else {\n // TODO mark this as readonly in v0.12.0\n this._store.setMessages?.(messages as ThreadMessage[]);\n }\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;;;;cA8Ca,+BACH,iCACG;WAEK;;;;;;;;;;;;;;;;UAiBR;UAEA;UACA;UACA;UACA;UAEA;UAIA;UAuBA;WAYQ;WACA;UAER;MACG;UAIH;UACA;MACG,wBAAwB;MAIxB;;;;;;;;;;EAKT,YAAA,iBAAiB,sBACjB,SAAS;UAMH;UAEA;UAEA;EAED,0BAA0B;UAIzB;EAED,mCACL,kBAAkB;MAKT;EAIJ,sBAAsB,SAAS;UA6E9B;EACD,mBAAe;EAuCT,OAAO,SAAS,gBAAgB;EAkBtC,0BAA0B;EAM1B,+BAA+B;EAI/B,cAAc,qBAAqB,WAAW;EAI9C,gBAAgB;UAIT;
|
|
1
|
+
{"version":3,"file":"local-thread-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/local/local-thread-runtime-core.ts"],"mappings":";;;;;;;;;;;;;;;;cA8Ca,+BACH,iCACG;WAEK;;;;;;;;;;;;;;;;UAiBR;UAEA;UACA;UACA;UACA;UAEA;UAIA;UAuBA;WAYQ;WACA;UAER;MACG;UAIH;UACA;MACG,wBAAwB;MAIxB;;;;;;;;;;EAKT,YAAA,iBAAiB,sBACjB,SAAS;UAMH;UAEA;UAEA;EAED,0BAA0B;UAIzB;EAED,mCACL,kBAAkB;MAKT;EAIJ,sBAAsB,SAAS;UA6E9B;EACD,mBAAe;EAuCT,OAAO,SAAS,gBAAgB;EAkBtC,0BAA0B;EAM1B,+BAA+B;EAI/B,cAAc,qBAAqB,WAAW;EAI9C,gBAAgB;UAIT;EAmCD,cAAc,oBAAoB;EAmBxC,YAAY,WAAW,eAAe,kBAAkB;EAMxD;EAIA;EAIM,WACT,UAAU,aAAa,gBACzB,cAAc,0BACb;UAuBW;UAyEA;EAkMP;EAUA;EAgBA,gBACL,WACA,YACA,QACA,SACA,YACC;EA6CI,eAAe,UAAU;EAMzB,wBACL,YACA,UACA,UACA,UACC"}
|
|
@@ -189,7 +189,8 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
|
|
|
189
189
|
removeQueueItem(queueItemId) {
|
|
190
190
|
this._queue?.adapter.remove(queueItemId);
|
|
191
191
|
}
|
|
192
|
-
async _runAppend(
|
|
192
|
+
async _runAppend(rawMessage) {
|
|
193
|
+
const message = this.enrichAppendMetadata(rawMessage);
|
|
193
194
|
this.ensureInitialized();
|
|
194
195
|
const initPromise = this._getInitializePromise?.();
|
|
195
196
|
if (initPromise) await initPromise;
|