@ulearning/ai-generative-frame 0.0.0-stage → 1.0.0-next.0
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/LICENSE +21 -0
- package/README.md +233 -2
- package/dist/assistant-ui/entry.d.ts +34 -0
- package/dist/assistant-ui/entry.d.ts.map +1 -0
- package/dist/assistant-ui/entry.js +50 -0
- package/dist/assistant-ui/entry.js.map +1 -0
- package/dist/assistant-ui/extension.d.ts +18 -0
- package/dist/assistant-ui/extension.d.ts.map +1 -0
- package/dist/assistant-ui/extension.js +0 -0
- package/dist/assistant-ui/history.d.ts +15 -0
- package/dist/assistant-ui/history.d.ts.map +1 -0
- package/dist/assistant-ui/history.js +39 -0
- package/dist/assistant-ui/history.js.map +1 -0
- package/dist/assistant-ui/modelContext.d.ts +45 -0
- package/dist/assistant-ui/modelContext.d.ts.map +1 -0
- package/dist/assistant-ui/modelContext.js +88 -0
- package/dist/assistant-ui/modelContext.js.map +1 -0
- package/dist/assistant-ui/snapshotSaver.d.ts +11 -0
- package/dist/assistant-ui/snapshotSaver.d.ts.map +1 -0
- package/dist/assistant-ui/snapshotSaver.js +83 -0
- package/dist/assistant-ui/snapshotSaver.js.map +1 -0
- package/dist/assistant-ui/tool-calls.d.ts +21 -0
- package/dist/assistant-ui/tool-calls.d.ts.map +1 -0
- package/dist/assistant-ui/tool-calls.js +65 -0
- package/dist/assistant-ui/tool-calls.js.map +1 -0
- package/dist/assistant-ui/toolkit.d.ts +96 -0
- package/dist/assistant-ui/toolkit.d.ts.map +1 -0
- package/dist/assistant-ui/toolkit.js +456 -0
- package/dist/assistant-ui/toolkit.js.map +1 -0
- package/dist/assistant-ui/useSharedContext.d.ts +14 -0
- package/dist/assistant-ui/useSharedContext.d.ts.map +1 -0
- package/dist/assistant-ui/useSharedContext.js +27 -0
- package/dist/assistant-ui/useSharedContext.js.map +1 -0
- package/dist/assistant-ui.d.ts +3 -0
- package/dist/assistant-ui.d.ts.map +1 -0
- package/dist/assistant-ui.js +1 -0
- package/dist/bootstrap.d.ts +23 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +78 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/csp.d.ts +25 -0
- package/dist/csp.d.ts.map +1 -0
- package/dist/csp.js +78 -0
- package/dist/csp.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/json-schema.d.ts +70 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +163 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/preview.d.ts +30 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +60 -0
- package/dist/preview.js.map +1 -0
- package/dist/prompts/guidance.d.ts +41 -0
- package/dist/prompts/guidance.d.ts.map +1 -0
- package/dist/prompts/guidance.js +268 -0
- package/dist/prompts/guidance.js.map +1 -0
- package/dist/prompts.d.ts +2 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +1 -0
- package/dist/protocol.d.ts +114 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +49 -0
- package/dist/protocol.js.map +1 -0
- package/dist/repair/repair.d.ts +72 -0
- package/dist/repair/repair.d.ts.map +1 -0
- package/dist/repair/repair.js +103 -0
- package/dist/repair/repair.js.map +1 -0
- package/dist/repair.d.ts +2 -0
- package/dist/repair.d.ts.map +1 -0
- package/dist/repair.js +1 -0
- package/dist/rpc.d.ts +60 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +127 -0
- package/dist/rpc.js.map +1 -0
- package/dist/runtime/diagnostics.d.ts +17 -0
- package/dist/runtime/diagnostics.d.ts.map +1 -0
- package/dist/runtime/diagnostics.js +128 -0
- package/dist/runtime/diagnostics.js.map +1 -0
- package/dist/runtime/generated.d.ts +2 -0
- package/dist/runtime/generated.d.ts.map +1 -0
- package/dist/runtime/generated.js +5 -0
- package/dist/runtime/generated.js.map +1 -0
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +264 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/morph.d.ts +51 -0
- package/dist/runtime/morph.d.ts.map +1 -0
- package/dist/runtime/morph.js +251 -0
- package/dist/runtime/morph.js.map +1 -0
- package/dist/runtime/screenshot.d.ts +23 -0
- package/dist/runtime/screenshot.d.ts.map +1 -0
- package/dist/runtime/screenshot.js +188 -0
- package/dist/runtime/screenshot.js.map +1 -0
- package/dist/runtime/size.d.ts +10 -0
- package/dist/runtime/size.d.ts.map +1 -0
- package/dist/runtime/size.js +21 -0
- package/dist/runtime/size.js.map +1 -0
- package/dist/runtime/storage.d.ts +4 -0
- package/dist/runtime/storage.d.ts.map +1 -0
- package/dist/runtime/storage.js +38 -0
- package/dist/runtime/storage.js.map +1 -0
- package/dist/spec/actions.d.ts +40 -0
- package/dist/spec/actions.d.ts.map +1 -0
- package/dist/spec/actions.js +53 -0
- package/dist/spec/actions.js.map +1 -0
- package/dist/spec/assistant-ui/thread.d.ts +66 -0
- package/dist/spec/assistant-ui/thread.d.ts.map +1 -0
- package/dist/spec/assistant-ui/thread.js +252 -0
- package/dist/spec/assistant-ui/thread.js.map +1 -0
- package/dist/spec/assistant-ui/toolkit.d.ts +33 -0
- package/dist/spec/assistant-ui/toolkit.d.ts.map +1 -0
- package/dist/spec/assistant-ui/toolkit.js +142 -0
- package/dist/spec/assistant-ui/toolkit.js.map +1 -0
- package/dist/spec/assistant-ui/web.d.ts +6 -0
- package/dist/spec/assistant-ui/web.d.ts.map +1 -0
- package/dist/spec/assistant-ui/web.js +48 -0
- package/dist/spec/assistant-ui/web.js.map +1 -0
- package/dist/spec/assistant-ui.d.ts +3 -0
- package/dist/spec/assistant-ui.d.ts.map +1 -0
- package/dist/spec/assistant-ui.js +1 -0
- package/dist/spec/calc.d.ts +8 -0
- package/dist/spec/calc.d.ts.map +1 -0
- package/dist/spec/calc.js +498 -0
- package/dist/spec/calc.js.map +1 -0
- package/dist/spec/catalog.d.ts +52 -0
- package/dist/spec/catalog.d.ts.map +1 -0
- package/dist/spec/catalog.js +104 -0
- package/dist/spec/catalog.js.map +1 -0
- package/dist/spec/expressions.d.ts +45 -0
- package/dist/spec/expressions.d.ts.map +1 -0
- package/dist/spec/expressions.js +199 -0
- package/dist/spec/expressions.js.map +1 -0
- package/dist/spec/patch.d.ts +20 -0
- package/dist/spec/patch.d.ts.map +1 -0
- package/dist/spec/patch.js +77 -0
- package/dist/spec/patch.js.map +1 -0
- package/dist/spec/pending.d.ts +15 -0
- package/dist/spec/pending.d.ts.map +1 -0
- package/dist/spec/pending.js +33 -0
- package/dist/spec/pending.js.map +1 -0
- package/dist/spec/pointer.d.ts +17 -0
- package/dist/spec/pointer.d.ts.map +1 -0
- package/dist/spec/pointer.js +88 -0
- package/dist/spec/pointer.js.map +1 -0
- package/dist/spec/prompt.d.ts +29 -0
- package/dist/spec/prompt.d.ts.map +1 -0
- package/dist/spec/prompt.js +145 -0
- package/dist/spec/prompt.js.map +1 -0
- package/dist/spec/render-spec.d.ts +50 -0
- package/dist/spec/render-spec.d.ts.map +1 -0
- package/dist/spec/render-spec.js +104 -0
- package/dist/spec/render-spec.js.map +1 -0
- package/dist/spec/resolve.d.ts +39 -0
- package/dist/spec/resolve.d.ts.map +1 -0
- package/dist/spec/resolve.js +51 -0
- package/dist/spec/resolve.js.map +1 -0
- package/dist/spec/resolved.d.ts +3 -0
- package/dist/spec/resolved.d.ts.map +1 -0
- package/dist/spec/resolved.js +36 -0
- package/dist/spec/resolved.js.map +1 -0
- package/dist/spec/state.d.ts +34 -0
- package/dist/spec/state.d.ts.map +1 -0
- package/dist/spec/state.js +111 -0
- package/dist/spec/state.js.map +1 -0
- package/dist/spec/stream.d.ts +50 -0
- package/dist/spec/stream.d.ts.map +1 -0
- package/dist/spec/stream.js +168 -0
- package/dist/spec/stream.js.map +1 -0
- package/dist/spec/tools.d.ts +3 -0
- package/dist/spec/tools.d.ts.map +1 -0
- package/dist/spec/tools.js +3 -0
- package/dist/spec/tree.d.ts +21 -0
- package/dist/spec/tree.d.ts.map +1 -0
- package/dist/spec/tree.js +27 -0
- package/dist/spec/tree.js.map +1 -0
- package/dist/spec/types.d.ts +66 -0
- package/dist/spec/types.d.ts.map +1 -0
- package/dist/spec/types.js +9 -0
- package/dist/spec/types.js.map +1 -0
- package/dist/spec/validate.d.ts +32 -0
- package/dist/spec/validate.d.ts.map +1 -0
- package/dist/spec/validate.js +264 -0
- package/dist/spec/validate.js.map +1 -0
- package/dist/spec/vue/SpecRenderer.d.ts +43 -0
- package/dist/spec/vue/SpecRenderer.d.ts.map +1 -0
- package/dist/spec/vue/SpecRenderer.js +357 -0
- package/dist/spec/vue/SpecRenderer.js.map +1 -0
- package/dist/spec/vue/useSpecStream.d.ts +19 -0
- package/dist/spec/vue/useSpecStream.d.ts.map +1 -0
- package/dist/spec/vue/useSpecStream.js +115 -0
- package/dist/spec/vue/useSpecStream.js.map +1 -0
- package/dist/spec/vue.d.ts +3 -0
- package/dist/spec/vue.d.ts.map +1 -0
- package/dist/spec/vue.js +3 -0
- package/dist/spec.d.ts +12 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +8 -0
- package/dist/theme.d.ts +38 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +370 -0
- package/dist/theme.js.map +1 -0
- package/dist/tools/define.d.ts +43 -0
- package/dist/tools/define.d.ts.map +1 -0
- package/dist/tools/define.js +31 -0
- package/dist/tools/define.js.map +1 -0
- package/dist/tools/edits.d.ts +19 -0
- package/dist/tools/edits.d.ts.map +1 -0
- package/dist/tools/edits.js +55 -0
- package/dist/tools/edits.js.map +1 -0
- package/dist/tools/registry.d.ts +19 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +33 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/tools.d.ts +88 -0
- package/dist/tools/tools.d.ts.map +1 -0
- package/dist/tools/tools.js +235 -0
- package/dist/tools/tools.js.map +1 -0
- package/dist/tools.d.ts +5 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +5 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/vue/Widget.d.ts +16 -0
- package/dist/vue/Widget.d.ts.map +1 -0
- package/dist/vue/Widget.js +58 -0
- package/dist/vue/Widget.js.map +1 -0
- package/dist/vue/sync.d.ts +19 -0
- package/dist/vue/sync.d.ts.map +1 -0
- package/dist/vue/sync.js +31 -0
- package/dist/vue/sync.js.map +1 -0
- package/dist/vue/themeStore.d.ts +23 -0
- package/dist/vue/themeStore.d.ts.map +1 -0
- package/dist/vue/themeStore.js +115 -0
- package/dist/vue/themeStore.js.map +1 -0
- package/dist/vue/useThemeTokens.d.ts +6 -0
- package/dist/vue/useThemeTokens.d.ts.map +1 -0
- package/dist/vue/useThemeTokens.js +49 -0
- package/dist/vue/useThemeTokens.js.map +1 -0
- package/dist/vue/useWidget.d.ts +10 -0
- package/dist/vue/useWidget.d.ts.map +1 -0
- package/dist/vue/useWidget.js +81 -0
- package/dist/vue/useWidget.js.map +1 -0
- package/dist/vue.d.ts +5 -0
- package/dist/vue.d.ts.map +1 -0
- package/dist/vue.js +4 -0
- package/dist/widget.d.ts +129 -0
- package/dist/widget.d.ts.map +1 -0
- package/dist/widget.js +655 -0
- package/dist/widget.js.map +1 -0
- package/package.json +125 -3
- package/src/assistant-ui/entry.ts +124 -0
- package/src/assistant-ui/extension.ts +19 -0
- package/src/assistant-ui/history.ts +63 -0
- package/src/assistant-ui/modelContext.ts +162 -0
- package/src/assistant-ui/snapshotSaver.ts +116 -0
- package/src/assistant-ui/tool-calls.ts +115 -0
- package/src/assistant-ui/toolkit.tsx +747 -0
- package/src/assistant-ui/useSharedContext.ts +40 -0
- package/src/assistant-ui.ts +14 -0
- package/src/bootstrap.ts +112 -0
- package/src/csp.ts +96 -0
- package/src/index.ts +44 -0
- package/src/json-schema.ts +353 -0
- package/src/preview.ts +120 -0
- package/src/prompts/guidance.ts +369 -0
- package/src/prompts.ts +8 -0
- package/src/protocol.ts +141 -0
- package/src/repair/repair.ts +202 -0
- package/src/repair.ts +11 -0
- package/src/rpc.ts +228 -0
- package/src/runtime/diagnostics.ts +165 -0
- package/src/runtime/generated.ts +2 -0
- package/src/runtime/index.ts +343 -0
- package/src/runtime/morph.ts +352 -0
- package/src/runtime/screenshot.ts +288 -0
- package/src/runtime/size.ts +17 -0
- package/src/runtime/storage.ts +49 -0
- package/src/spec/actions.ts +111 -0
- package/src/spec/assistant-ui/thread.ts +381 -0
- package/src/spec/assistant-ui/toolkit.tsx +295 -0
- package/src/spec/assistant-ui/web.tsx +63 -0
- package/src/spec/assistant-ui.ts +2 -0
- package/src/spec/calc.ts +598 -0
- package/src/spec/catalog.ts +196 -0
- package/src/spec/expressions.ts +301 -0
- package/src/spec/patch.ts +112 -0
- package/src/spec/pending.ts +36 -0
- package/src/spec/pointer.ts +170 -0
- package/src/spec/prompt.ts +243 -0
- package/src/spec/render-spec.ts +144 -0
- package/src/spec/resolve.ts +123 -0
- package/src/spec/resolved.ts +53 -0
- package/src/spec/state.ts +193 -0
- package/src/spec/stream.ts +230 -0
- package/src/spec/tools.ts +17 -0
- package/src/spec/tree.ts +37 -0
- package/src/spec/types.ts +51 -0
- package/src/spec/validate.ts +429 -0
- package/src/spec/vue/SpecRenderer.tsx +544 -0
- package/src/spec/vue/__tests__/harness.ts +50 -0
- package/src/spec/vue/useSpecStream.ts +162 -0
- package/src/spec/vue.ts +13 -0
- package/src/spec.ts +55 -0
- package/src/theme.ts +423 -0
- package/src/tools/define.ts +65 -0
- package/src/tools/edits.ts +73 -0
- package/src/tools/registry.ts +44 -0
- package/src/tools/tools.ts +361 -0
- package/src/tools.ts +32 -0
- package/src/version.ts +4 -0
- package/src/vue/Widget.tsx +74 -0
- package/src/vue/sync.ts +36 -0
- package/src/vue/themeStore.ts +157 -0
- package/src/vue/useThemeTokens.ts +71 -0
- package/src/vue/useWidget.ts +117 -0
- package/src/vue.ts +8 -0
- package/src/widget.ts +1080 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
const SAVE_DELAY_MS = 500;
|
|
2
|
+
|
|
3
|
+
/** The snapshot as JSON only when it is plain JSON throughout, since `JSON.stringify` quietly turns `NaN`, `undefined`, and class instances into other values, which would compare equal to a different snapshot and restore something else. */
|
|
4
|
+
const serialize = (snapshot: unknown): string | undefined => {
|
|
5
|
+
try {
|
|
6
|
+
return JSON.stringify(
|
|
7
|
+
snapshot,
|
|
8
|
+
function (this: Record<string, unknown>, key: string, value: unknown) {
|
|
9
|
+
const raw = this[key];
|
|
10
|
+
if (
|
|
11
|
+
raw === null ||
|
|
12
|
+
typeof raw === "string" ||
|
|
13
|
+
typeof raw === "boolean" ||
|
|
14
|
+
(typeof raw === "number" && Number.isFinite(raw))
|
|
15
|
+
)
|
|
16
|
+
return value;
|
|
17
|
+
if (
|
|
18
|
+
typeof raw === "object" &&
|
|
19
|
+
typeof (raw as { toJSON?: unknown }).toJSON !== "function"
|
|
20
|
+
) {
|
|
21
|
+
const prototype = Object.getPrototypeOf(raw);
|
|
22
|
+
if (
|
|
23
|
+
Array.isArray(raw)
|
|
24
|
+
? prototype === Array.prototype
|
|
25
|
+
: prototype === Object.prototype || prototype === null
|
|
26
|
+
)
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
throw new TypeError("Not plain JSON");
|
|
30
|
+
},
|
|
31
|
+
);
|
|
32
|
+
} catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export type SnapshotSaver<T> = {
|
|
38
|
+
/** Saves `read()` once changes settle, if it differs from the newest entry recorded. */
|
|
39
|
+
schedule(read: () => T): void;
|
|
40
|
+
/** Saves a change that is still waiting now rather than after the delay. */
|
|
41
|
+
flush(): void;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Saves snapshots of a tool call's UI state through `record`, 500 ms after the last change and when flushed, whenever the snapshot differs from the newest entry recorded; `initial` is that entry when saving starts. One record is in flight at a time, so entries land in the order they are sent, and a change made meanwhile is saved once it settles. When the current snapshot cannot be recorded, `record(null)` marks it, so the call starts fresh on its next mount rather than from an older snapshot; a marker that fails is sent again only after a newer snapshot is tried.
|
|
46
|
+
*/
|
|
47
|
+
export function createSnapshotSaver<T>(
|
|
48
|
+
initial: T,
|
|
49
|
+
record: (snapshot: T | null) => unknown,
|
|
50
|
+
): SnapshotSaver<T> {
|
|
51
|
+
let recorded = JSON.stringify(initial);
|
|
52
|
+
let failed: string | undefined;
|
|
53
|
+
let markerFailed = false;
|
|
54
|
+
let busy = false;
|
|
55
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
56
|
+
let read: (() => T) | undefined;
|
|
57
|
+
|
|
58
|
+
const send = (snapshot: T | null, json: string, marker: boolean) => {
|
|
59
|
+
busy = true;
|
|
60
|
+
let result: Promise<unknown>;
|
|
61
|
+
try {
|
|
62
|
+
result = Promise.resolve(record(snapshot));
|
|
63
|
+
} catch (error) {
|
|
64
|
+
result = Promise.reject(error);
|
|
65
|
+
}
|
|
66
|
+
void result
|
|
67
|
+
.then(
|
|
68
|
+
() => {
|
|
69
|
+
recorded = json;
|
|
70
|
+
if (!marker) failed = undefined;
|
|
71
|
+
},
|
|
72
|
+
() => {
|
|
73
|
+
if (marker) markerFailed = true;
|
|
74
|
+
else failed = json;
|
|
75
|
+
},
|
|
76
|
+
)
|
|
77
|
+
.finally(() => {
|
|
78
|
+
busy = false;
|
|
79
|
+
if (timer === undefined) save();
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
const save = () => {
|
|
84
|
+
if (busy || !read) return;
|
|
85
|
+
let snapshot: T | undefined;
|
|
86
|
+
let json: string | undefined;
|
|
87
|
+
try {
|
|
88
|
+
snapshot = read();
|
|
89
|
+
json = serialize(snapshot);
|
|
90
|
+
} catch {}
|
|
91
|
+
if (json === recorded) return;
|
|
92
|
+
if (json !== undefined && json !== failed) {
|
|
93
|
+
markerFailed = false;
|
|
94
|
+
send(snapshot as T, json, false);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (recorded !== "null" && !markerFailed) send(null, "null", true);
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
schedule(next) {
|
|
102
|
+
read = next;
|
|
103
|
+
clearTimeout(timer);
|
|
104
|
+
timer = setTimeout(() => {
|
|
105
|
+
timer = undefined;
|
|
106
|
+
save();
|
|
107
|
+
}, SAVE_DELAY_MS);
|
|
108
|
+
},
|
|
109
|
+
flush() {
|
|
110
|
+
if (timer === undefined) return;
|
|
111
|
+
clearTimeout(timer);
|
|
112
|
+
timer = undefined;
|
|
113
|
+
save();
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
type ToolCallLike = {
|
|
2
|
+
type: string;
|
|
3
|
+
toolName?: string;
|
|
4
|
+
toolCallId?: string;
|
|
5
|
+
args?: unknown;
|
|
6
|
+
argsText?: unknown;
|
|
7
|
+
result?: unknown;
|
|
8
|
+
isPreliminary?: unknown;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/** The part of a thread message the history readers need. */
|
|
12
|
+
export type MessageLike = {
|
|
13
|
+
readonly content: string | readonly unknown[];
|
|
14
|
+
readonly status?: { readonly type: string };
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/** A tool call as the history readers see it. */
|
|
18
|
+
export type ToolCall = {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
args: Record<string, unknown>;
|
|
22
|
+
argsText: string | undefined;
|
|
23
|
+
result: unknown;
|
|
24
|
+
/** Whether the arguments can no longer change, read as core reads a tool call's status: it has a final result, or its message is no longer running. */
|
|
25
|
+
settled: boolean;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export function* toolCalls(
|
|
29
|
+
messages: readonly MessageLike[],
|
|
30
|
+
): Generator<ToolCall> {
|
|
31
|
+
for (const message of messages) {
|
|
32
|
+
if (typeof message.content === "string") continue;
|
|
33
|
+
const running = message.status?.type === "running";
|
|
34
|
+
for (const part of message.content) {
|
|
35
|
+
const call = part as ToolCallLike;
|
|
36
|
+
if (call?.type === "tool-call" && call.toolCallId && call.toolName) {
|
|
37
|
+
yield {
|
|
38
|
+
id: call.toolCallId,
|
|
39
|
+
name: call.toolName,
|
|
40
|
+
args: (call.args ?? {}) as Record<string, unknown>,
|
|
41
|
+
argsText:
|
|
42
|
+
typeof call.argsText === "string" ? call.argsText : undefined,
|
|
43
|
+
result: call.result,
|
|
44
|
+
settled:
|
|
45
|
+
(call.result !== undefined && call.isPreliminary !== true) ||
|
|
46
|
+
!running,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const STRING_TOKEN = /"(?:[^"\\]|\\.)*"/y;
|
|
54
|
+
|
|
55
|
+
const decode = (token: string): unknown => {
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(token);
|
|
58
|
+
} catch {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/** The top-level `title` of streamed arguments once its string has closed, whatever escaping it was written with. */
|
|
64
|
+
const streamedTitle = (argsText: string): unknown => {
|
|
65
|
+
let depth = 0;
|
|
66
|
+
let key: unknown;
|
|
67
|
+
let inValue = false;
|
|
68
|
+
for (let i = 0; i < argsText.length; i++) {
|
|
69
|
+
const char = argsText[i];
|
|
70
|
+
if (char === '"') {
|
|
71
|
+
STRING_TOKEN.lastIndex = i;
|
|
72
|
+
const token = STRING_TOKEN.exec(argsText)?.[0];
|
|
73
|
+
if (token === undefined) return undefined;
|
|
74
|
+
if (depth === 1) {
|
|
75
|
+
if (!inValue) key = decode(token);
|
|
76
|
+
else if (key === "title") return decode(token);
|
|
77
|
+
else inValue = false;
|
|
78
|
+
}
|
|
79
|
+
i += token.length - 1;
|
|
80
|
+
} else if (char === "{" || char === "[") depth++;
|
|
81
|
+
else if (char === "}" || char === "]") depth--;
|
|
82
|
+
else if (depth === 1 && char === ":") inValue = true;
|
|
83
|
+
else if (depth === 1 && char === ",") inValue = false;
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/** Whether streamed arguments hold this whole title, not a prefix of a longer one that is still arriving. */
|
|
89
|
+
const holdsTitle = (argsText: string | undefined, title: string) =>
|
|
90
|
+
argsText === undefined || streamedTitle(argsText) === title;
|
|
91
|
+
|
|
92
|
+
/** Whether a later call in the same message, with this call's whole title, takes over what this call shows, as `takesOver` decides. A call in a later message never does, since earlier messages are the conversation's history. */
|
|
93
|
+
export function hasLaterToolCallInMessage(
|
|
94
|
+
messages: readonly MessageLike[],
|
|
95
|
+
toolCallId: string,
|
|
96
|
+
title: string,
|
|
97
|
+
takesOver: (call: ToolCall) => boolean,
|
|
98
|
+
): boolean {
|
|
99
|
+
if (!title) return false;
|
|
100
|
+
for (const message of messages) {
|
|
101
|
+
let seen = false;
|
|
102
|
+
for (const call of toolCalls([message])) {
|
|
103
|
+
if (call.id === toolCallId) seen = true;
|
|
104
|
+
else if (
|
|
105
|
+
seen &&
|
|
106
|
+
call.args["title"] === title &&
|
|
107
|
+
holdsTitle(call.argsText, title) &&
|
|
108
|
+
takesOver(call)
|
|
109
|
+
)
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
if (seen) return false;
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|