@fastpaca/cria 0.0.1 → 1.0.1
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/README.md +93 -106
- package/dist/ai-sdk/index.d.ts +43 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +303 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/ai-sdk/index.test.d.ts +2 -0
- package/dist/ai-sdk/index.test.d.ts.map +1 -0
- package/dist/ai-sdk/index.test.js +101 -0
- package/dist/ai-sdk/index.test.js.map +1 -0
- package/dist/anthropic/index.d.ts +74 -0
- package/dist/anthropic/index.d.ts.map +1 -0
- package/dist/anthropic/index.js +238 -0
- package/dist/anthropic/index.js.map +1 -0
- package/dist/anthropic/index.test.d.ts +2 -0
- package/dist/anthropic/index.test.d.ts.map +1 -0
- package/dist/anthropic/index.test.js +115 -0
- package/dist/anthropic/index.test.js.map +1 -0
- package/dist/components/additional.test.d.ts +2 -0
- package/dist/components/additional.test.d.ts.map +1 -0
- package/dist/components/additional.test.js +31 -0
- package/dist/components/additional.test.js.map +1 -0
- package/dist/components/index.d.ts +148 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +184 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/summary.d.ts +91 -0
- package/dist/components/summary.d.ts.map +1 -0
- package/dist/components/summary.js +118 -0
- package/dist/components/summary.js.map +1 -0
- package/dist/components/summary.test.d.ts +2 -0
- package/dist/components/summary.test.d.ts.map +1 -0
- package/dist/components/summary.test.js +101 -0
- package/dist/components/summary.test.js.map +1 -0
- package/dist/components/vector-search.d.ts +70 -0
- package/dist/components/vector-search.d.ts.map +1 -0
- package/dist/components/vector-search.js +110 -0
- package/dist/components/vector-search.js.map +1 -0
- package/dist/components/vector-search.test.d.ts +2 -0
- package/dist/components/vector-search.test.d.ts.map +1 -0
- package/dist/components/vector-search.test.js +113 -0
- package/dist/components/vector-search.test.js.map +1 -0
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/instrumentation/otel.d.ts +19 -0
- package/dist/instrumentation/otel.d.ts.map +1 -0
- package/dist/instrumentation/otel.js +102 -0
- package/dist/instrumentation/otel.js.map +1 -0
- package/dist/instrumentation/otel.test.d.ts +2 -0
- package/dist/instrumentation/otel.test.d.ts.map +1 -0
- package/dist/instrumentation/otel.test.js +116 -0
- package/dist/instrumentation/otel.test.js.map +1 -0
- package/dist/jsx-dev-runtime.d.ts +2 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +2 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +30 -8
- package/dist/jsx-runtime.d.ts.map +1 -1
- package/dist/jsx-runtime.js +13 -10
- package/dist/jsx-runtime.js.map +1 -1
- package/dist/memory/chroma/index.d.ts +59 -0
- package/dist/memory/chroma/index.d.ts.map +1 -0
- package/dist/memory/chroma/index.js +172 -0
- package/dist/memory/chroma/index.js.map +1 -0
- package/dist/memory/index.d.ts +4 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/key-value.d.ts +71 -0
- package/dist/memory/key-value.d.ts.map +1 -0
- package/dist/memory/key-value.js +34 -0
- package/dist/memory/key-value.js.map +1 -0
- package/dist/memory/postgres.d.ts +71 -0
- package/dist/memory/postgres.d.ts.map +1 -0
- package/dist/memory/postgres.js +109 -0
- package/dist/memory/postgres.js.map +1 -0
- package/dist/memory/qdrant/index.d.ts +64 -0
- package/dist/memory/qdrant/index.d.ts.map +1 -0
- package/dist/memory/qdrant/index.js +136 -0
- package/dist/memory/qdrant/index.js.map +1 -0
- package/dist/memory/redis.d.ts +70 -0
- package/dist/memory/redis.d.ts.map +1 -0
- package/dist/memory/redis.js +100 -0
- package/dist/memory/redis.js.map +1 -0
- package/dist/memory/vector.d.ts +53 -0
- package/dist/memory/vector.d.ts.map +1 -0
- package/dist/memory/vector.js +2 -0
- package/dist/memory/vector.js.map +1 -0
- package/dist/openai/index.d.ts +46 -0
- package/dist/openai/index.d.ts.map +1 -0
- package/dist/openai/index.js +260 -0
- package/dist/openai/index.js.map +1 -0
- package/dist/openai/index.test.d.ts +2 -0
- package/dist/openai/index.test.d.ts.map +1 -0
- package/dist/openai/index.test.js +204 -0
- package/dist/openai/index.test.js.map +1 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +2 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/types.d.ts +2 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/render.d.ts +44 -40
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +162 -148
- package/dist/render.js.map +1 -1
- package/dist/render.test.js +146 -28
- package/dist/render.test.js.map +1 -1
- package/dist/renderers/markdown.d.ts +3 -0
- package/dist/renderers/markdown.d.ts.map +1 -0
- package/dist/renderers/markdown.js +43 -0
- package/dist/renderers/markdown.js.map +1 -0
- package/dist/renderers/shared.d.ts +82 -0
- package/dist/renderers/shared.d.ts.map +1 -0
- package/dist/renderers/shared.js +156 -0
- package/dist/renderers/shared.js.map +1 -0
- package/dist/snapshot.d.ts +47 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +140 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/snapshot.test.d.ts +2 -0
- package/dist/snapshot.test.d.ts.map +1 -0
- package/dist/snapshot.test.js +68 -0
- package/dist/snapshot.test.js.map +1 -0
- package/dist/tokenizers.d.ts +14 -0
- package/dist/tokenizers.d.ts.map +1 -0
- package/dist/tokenizers.js +45 -0
- package/dist/tokenizers.js.map +1 -0
- package/dist/types.d.ts +212 -84
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +109 -0
- package/dist/types.js.map +1 -1
- package/package.json +88 -3
- package/dist/components.d.ts +0 -78
- package/dist/components.d.ts.map +0 -1
- package/dist/components.js +0 -98
- package/dist/components.js.map +0 -1
package/dist/render.test.js
CHANGED
|
@@ -1,49 +1,167 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "@fastpaca/cria/jsx-runtime";
|
|
2
|
-
import
|
|
3
|
-
import { test } from "node:test";
|
|
2
|
+
import { expect, test } from "vitest";
|
|
4
3
|
import { Omit, Region, render, Truncate } from "./index";
|
|
5
4
|
// Simple tokenizer: 1 token per 4 characters (approximates real tokenizers)
|
|
6
5
|
const tokenizer = (text) => Math.ceil(text.length / 4);
|
|
7
6
|
const FIT_ERROR_PATTERN = /Cannot fit prompt/;
|
|
8
|
-
test("render: basic text output", () => {
|
|
7
|
+
test("render: basic text output", async () => {
|
|
9
8
|
const element = _jsx(Region, { priority: 0, children: "Hello, world!" });
|
|
10
|
-
const result = render(element, { tokenizer, budget: 100 });
|
|
11
|
-
|
|
9
|
+
const result = await render(element, { tokenizer, budget: 100 });
|
|
10
|
+
expect(result).toBe("Hello, world!");
|
|
12
11
|
});
|
|
13
|
-
test("render: nested regions", () => {
|
|
12
|
+
test("render: nested regions", async () => {
|
|
14
13
|
const element = (_jsxs(Region, { priority: 0, children: ["Start ", _jsx(Region, { priority: 1, children: "Middle" }), " End"] }));
|
|
15
|
-
const result = render(element, { tokenizer, budget: 100 });
|
|
16
|
-
|
|
14
|
+
const result = await render(element, { tokenizer, budget: 100 });
|
|
15
|
+
expect(result).toBe("Start Middle End");
|
|
17
16
|
});
|
|
18
|
-
test("render: omit removes region when over budget", () => {
|
|
17
|
+
test("render: omit removes region when over budget", async () => {
|
|
19
18
|
const element = (_jsxs(Region, { priority: 0, children: ["Important", " ", _jsx(Omit, { priority: 1, children: "Less important content that should be removed" }), "Also important"] }));
|
|
20
|
-
const resultLarge = render(element, { tokenizer, budget: 100 });
|
|
21
|
-
|
|
22
|
-
const resultSmall = render(element, { tokenizer, budget: 10 });
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
const resultLarge = await render(element, { tokenizer, budget: 100 });
|
|
20
|
+
expect(resultLarge).toContain("Less important");
|
|
21
|
+
const resultSmall = await render(element, { tokenizer, budget: 10 });
|
|
22
|
+
expect(resultSmall).not.toContain("Less important");
|
|
23
|
+
expect(resultSmall).toContain("Important");
|
|
25
24
|
});
|
|
26
|
-
test("render: truncate reduces content", () => {
|
|
25
|
+
test("render: truncate reduces content", async () => {
|
|
27
26
|
const longContent = "A".repeat(100);
|
|
28
27
|
const element = (_jsxs(Region, { priority: 0, children: ["Header", " ", _jsx(Truncate, { budget: 5, priority: 1, children: longContent })] }));
|
|
29
|
-
const result = render(element, { tokenizer, budget: 10 });
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
const result = await render(element, { tokenizer, budget: 10 });
|
|
29
|
+
expect(result.length).toBeLessThan(100);
|
|
30
|
+
expect(result).toContain("Header");
|
|
32
31
|
});
|
|
33
|
-
test("render: priority ordering - lower priority removed first", () => {
|
|
32
|
+
test("render: priority ordering - lower priority removed first", async () => {
|
|
34
33
|
const element = (_jsxs(Region, { priority: 0, children: [_jsx(Region, { priority: 0, children: "Critical" }), _jsx(Omit, { priority: 1, children: "Medium importance" }), _jsx(Omit, { priority: 2, children: "Low importance" })] }));
|
|
35
|
-
const result = render(element, { tokenizer, budget: 5 });
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
const result = await render(element, { tokenizer, budget: 5 });
|
|
35
|
+
expect(result).toContain("Critical");
|
|
36
|
+
expect(result).not.toContain("Medium");
|
|
37
|
+
expect(result).not.toContain("Low");
|
|
39
38
|
});
|
|
40
|
-
test("render: throws FitError when cannot fit", () => {
|
|
39
|
+
test("render: throws FitError when cannot fit", async () => {
|
|
41
40
|
const element = (_jsx(Region, { priority: 0, children: "This content has no strategy and cannot be reduced" }));
|
|
42
|
-
|
|
41
|
+
await expect(render(element, { tokenizer, budget: 1 })).rejects.toThrow(FIT_ERROR_PATTERN);
|
|
43
42
|
});
|
|
44
|
-
test("render: multiple strategies at same priority applied together", () => {
|
|
43
|
+
test("render: multiple strategies at same priority applied together", async () => {
|
|
45
44
|
const element = (_jsxs(Region, { priority: 0, children: [_jsx(Omit, { id: "a", priority: 1, children: "AAA" }), _jsx(Omit, { id: "b", priority: 1, children: "BBB" })] }));
|
|
46
|
-
const result = render(element, { tokenizer, budget: 0 });
|
|
47
|
-
|
|
45
|
+
const result = await render(element, { tokenizer, budget: 0 });
|
|
46
|
+
expect(result).toBe("");
|
|
47
|
+
});
|
|
48
|
+
test("render: hooks fire in expected order", async () => {
|
|
49
|
+
const calls = [];
|
|
50
|
+
const element = (_jsxs(Region, { priority: 0, children: ["A", _jsx(Omit, { priority: 1, children: "BBBB" })] }));
|
|
51
|
+
const result = await render(element, {
|
|
52
|
+
tokenizer,
|
|
53
|
+
budget: 1,
|
|
54
|
+
hooks: {
|
|
55
|
+
onFitStart: () => {
|
|
56
|
+
calls.push("start");
|
|
57
|
+
},
|
|
58
|
+
onFitIteration: () => {
|
|
59
|
+
calls.push("iteration");
|
|
60
|
+
},
|
|
61
|
+
onStrategyApplied: () => {
|
|
62
|
+
calls.push("strategy");
|
|
63
|
+
},
|
|
64
|
+
onFitComplete: () => {
|
|
65
|
+
calls.push("complete");
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
expect(result).toBe("A");
|
|
70
|
+
expect(calls).toEqual(["start", "iteration", "strategy", "complete"]);
|
|
71
|
+
});
|
|
72
|
+
test("render: onFitError fires before FitError throws", async () => {
|
|
73
|
+
const element = _jsx(Region, { priority: 0, children: "Too long" });
|
|
74
|
+
let errorEvent = null;
|
|
75
|
+
await expect(render(element, {
|
|
76
|
+
tokenizer,
|
|
77
|
+
budget: 1,
|
|
78
|
+
hooks: {
|
|
79
|
+
onFitError: (event) => {
|
|
80
|
+
errorEvent = event;
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
})).rejects.toThrow(FIT_ERROR_PATTERN);
|
|
84
|
+
expect(errorEvent).not.toBeNull();
|
|
85
|
+
expect(errorEvent?.priority).toBe(-1);
|
|
86
|
+
});
|
|
87
|
+
test("render: hook errors bubble (sync error)", async () => {
|
|
88
|
+
const element = (_jsxs(Region, { priority: 0, children: ["A", _jsx(Omit, { priority: 1, children: "BBBB" })] }));
|
|
89
|
+
await expect(render(element, {
|
|
90
|
+
tokenizer,
|
|
91
|
+
budget: 1,
|
|
92
|
+
hooks: {
|
|
93
|
+
onFitStart: () => {
|
|
94
|
+
throw new Error("Hook error");
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
})).rejects.toThrow("Hook error");
|
|
98
|
+
});
|
|
99
|
+
test("render: hook errors bubble (async error)", async () => {
|
|
100
|
+
const element = (_jsxs(Region, { priority: 0, children: ["A", _jsx(Omit, { priority: 1, children: "BBBB" })] }));
|
|
101
|
+
await expect(render(element, {
|
|
102
|
+
tokenizer,
|
|
103
|
+
budget: 1,
|
|
104
|
+
hooks: {
|
|
105
|
+
onFitComplete: async () => {
|
|
106
|
+
await Promise.resolve();
|
|
107
|
+
throw new Error("Async hook error");
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
})).rejects.toThrow("Async hook error");
|
|
111
|
+
});
|
|
112
|
+
test("render: onFitError hook errors bubble", async () => {
|
|
113
|
+
const element = _jsx(Region, { priority: 0, children: "Too long" });
|
|
114
|
+
await expect(render(element, {
|
|
115
|
+
tokenizer,
|
|
116
|
+
budget: 1,
|
|
117
|
+
hooks: {
|
|
118
|
+
onFitError: () => {
|
|
119
|
+
throw new Error("Error hook failed");
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
})).rejects.toThrow("Error hook failed");
|
|
123
|
+
});
|
|
124
|
+
test("render: fit decisions are deterministic", async () => {
|
|
125
|
+
const buildTree = () => (_jsxs(Region, { priority: 0, children: ["Head ", _jsx(Omit, { priority: 3, children: "Drop" }), _jsx(Truncate, { budget: 4, priority: 2, children: "LongTail" }), _jsx(Region, { priority: 1, children: "End" })] }));
|
|
126
|
+
const runOnce = async () => {
|
|
127
|
+
const events = [];
|
|
128
|
+
const result = await render(buildTree(), {
|
|
129
|
+
tokenizer,
|
|
130
|
+
budget: 12,
|
|
131
|
+
hooks: {
|
|
132
|
+
onFitStart: (event) => {
|
|
133
|
+
events.push({ type: "start", totalTokens: event.totalTokens });
|
|
134
|
+
},
|
|
135
|
+
onFitIteration: (event) => {
|
|
136
|
+
events.push({
|
|
137
|
+
type: "iteration",
|
|
138
|
+
iteration: event.iteration,
|
|
139
|
+
priority: event.priority,
|
|
140
|
+
totalTokens: event.totalTokens,
|
|
141
|
+
});
|
|
142
|
+
},
|
|
143
|
+
onStrategyApplied: (event) => {
|
|
144
|
+
events.push({
|
|
145
|
+
type: "strategy",
|
|
146
|
+
iteration: event.iteration,
|
|
147
|
+
priority: event.priority,
|
|
148
|
+
resultType: event.result ? "node" : "null",
|
|
149
|
+
});
|
|
150
|
+
},
|
|
151
|
+
onFitComplete: (event) => {
|
|
152
|
+
events.push({
|
|
153
|
+
type: "complete",
|
|
154
|
+
iterations: event.iterations,
|
|
155
|
+
totalTokens: event.totalTokens,
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
return { result, events };
|
|
161
|
+
};
|
|
162
|
+
const first = await runOnce();
|
|
163
|
+
const second = await runOnce();
|
|
164
|
+
expect(first.result).toBe(second.result);
|
|
165
|
+
expect(first.events).toEqual(second.events);
|
|
48
166
|
});
|
|
49
167
|
//# sourceMappingURL=render.test.js.map
|
package/dist/render.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.test.js","sourceRoot":"","sources":["../src/render.test.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"render.test.js","sourceRoot":"","sources":["../src/render.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/renderers/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,cAAc,EAAE,MAAM,UAAU,CAAC;AAG9E,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAKnD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { safeStringify } from "./shared";
|
|
2
|
+
export const markdownRenderer = {
|
|
3
|
+
name: "markdown",
|
|
4
|
+
tokenString: (element) => renderToMarkdown(element),
|
|
5
|
+
render: (element) => renderToMarkdown(element),
|
|
6
|
+
empty: () => "",
|
|
7
|
+
};
|
|
8
|
+
const ROLE_LABELS = {
|
|
9
|
+
system: "System",
|
|
10
|
+
user: "User",
|
|
11
|
+
assistant: "Assistant",
|
|
12
|
+
};
|
|
13
|
+
function renderToMarkdown(element) {
|
|
14
|
+
switch (element.kind) {
|
|
15
|
+
case "message": {
|
|
16
|
+
const content = renderChildrenToMarkdown(element.children).trimEnd();
|
|
17
|
+
const label = ROLE_LABELS[element.role] ?? element.role;
|
|
18
|
+
return `${label}: ${content}\n\n`;
|
|
19
|
+
}
|
|
20
|
+
case "reasoning": {
|
|
21
|
+
return `<thinking>\n${element.text}\n</thinking>\n`;
|
|
22
|
+
}
|
|
23
|
+
case "tool-call": {
|
|
24
|
+
const inputText = safeStringify(element.input, true);
|
|
25
|
+
return `<tool_call name="${element.toolName}">\n${inputText}\n</tool_call>\n`;
|
|
26
|
+
}
|
|
27
|
+
case "tool-result": {
|
|
28
|
+
const outputText = safeStringify(element.output, true);
|
|
29
|
+
return `<tool_result name="${element.toolName}">\n${outputText}\n</tool_result>\n`;
|
|
30
|
+
}
|
|
31
|
+
default: {
|
|
32
|
+
return renderChildrenToMarkdown(element.children);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function renderChildrenToMarkdown(children) {
|
|
37
|
+
let result = "";
|
|
38
|
+
for (const child of children) {
|
|
39
|
+
result += typeof child === "string" ? child : renderToMarkdown(child);
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/renderers/markdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACnD,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAC9C,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE;CAChB,CAAC;AAEF,MAAM,WAAW,GAA2B;IAC1C,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,SAAS,gBAAgB,CAAC,OAAsB;IAC9C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,OAAO,GAAG,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;YACxD,OAAO,GAAG,KAAK,KAAK,OAAO,MAAM,CAAC;QACpC,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,eAAe,OAAO,CAAC,IAAI,iBAAiB,CAAC;QACtD,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrD,OAAO,oBAAoB,OAAO,CAAC,QAAQ,OAAO,SAAS,kBAAkB,CAAC;QAChF,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACvD,OAAO,sBAAsB,OAAO,CAAC,QAAQ,OAAO,UAAU,oBAAoB,CAAC;QACrF,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAwB;IACxD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { PromptChildren, PromptElement } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Semantic representation of prompt content parts.
|
|
4
|
+
* Used by renderers to convert prompt trees into provider-specific formats.
|
|
5
|
+
*/
|
|
6
|
+
export type SemanticPart = {
|
|
7
|
+
type: "text";
|
|
8
|
+
text: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: "reasoning";
|
|
11
|
+
text: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: "tool-call";
|
|
14
|
+
toolCallId: string;
|
|
15
|
+
toolName: string;
|
|
16
|
+
input: unknown;
|
|
17
|
+
} | {
|
|
18
|
+
type: "tool-result";
|
|
19
|
+
toolCallId: string;
|
|
20
|
+
toolName: string;
|
|
21
|
+
output: unknown;
|
|
22
|
+
};
|
|
23
|
+
export type ToolCallPart = Extract<SemanticPart, {
|
|
24
|
+
type: "tool-call";
|
|
25
|
+
}>;
|
|
26
|
+
export type ToolResultPart = Extract<SemanticPart, {
|
|
27
|
+
type: "tool-result";
|
|
28
|
+
}>;
|
|
29
|
+
export type TextPart = Extract<SemanticPart, {
|
|
30
|
+
type: "text";
|
|
31
|
+
}>;
|
|
32
|
+
export type ReasoningPart = Extract<SemanticPart, {
|
|
33
|
+
type: "reasoning";
|
|
34
|
+
}>;
|
|
35
|
+
export type MessageElement = Extract<PromptElement, {
|
|
36
|
+
kind: "message";
|
|
37
|
+
}>;
|
|
38
|
+
/**
|
|
39
|
+
* Collect all message nodes from the prompt tree.
|
|
40
|
+
*/
|
|
41
|
+
export declare function collectMessageNodes(element: PromptElement, acc?: MessageElement[]): MessageElement[];
|
|
42
|
+
/**
|
|
43
|
+
* Extract semantic parts from prompt children.
|
|
44
|
+
*/
|
|
45
|
+
export declare function collectSemanticParts(children: PromptChildren): SemanticPart[];
|
|
46
|
+
/**
|
|
47
|
+
* Extract semantic parts from a single prompt element.
|
|
48
|
+
*/
|
|
49
|
+
export declare function semanticPartsFromElement(element: PromptElement): SemanticPart[];
|
|
50
|
+
/**
|
|
51
|
+
* Coalesce adjacent text parts into single parts.
|
|
52
|
+
*/
|
|
53
|
+
export declare function coalesceTextParts(parts: readonly SemanticPart[]): SemanticPart[];
|
|
54
|
+
/**
|
|
55
|
+
* Safely stringify a value to JSON string.
|
|
56
|
+
* Returns string values directly, handles undefined, and catches JSON errors.
|
|
57
|
+
*
|
|
58
|
+
* @param value - The value to stringify
|
|
59
|
+
* @param pretty - If true, format with 2-space indentation (default: false)
|
|
60
|
+
*/
|
|
61
|
+
export declare function safeStringify(value: unknown, pretty?: boolean): string;
|
|
62
|
+
/**
|
|
63
|
+
* Categorized parts from a semantic parts list.
|
|
64
|
+
*/
|
|
65
|
+
export interface CategorizedParts {
|
|
66
|
+
textParts: TextPart[];
|
|
67
|
+
toolCallParts: ToolCallPart[];
|
|
68
|
+
toolResultParts: ToolResultPart[];
|
|
69
|
+
reasoningParts: ReasoningPart[];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Categorize semantic parts by type for easier processing.
|
|
73
|
+
*/
|
|
74
|
+
export declare function categorizeParts(parts: readonly SemanticPart[]): CategorizedParts;
|
|
75
|
+
/**
|
|
76
|
+
* Extract text content from semantic parts.
|
|
77
|
+
* Optionally wraps reasoning parts in thinking tags.
|
|
78
|
+
*/
|
|
79
|
+
export declare function partsToText(parts: readonly SemanticPart[], options?: {
|
|
80
|
+
wrapReasoning?: boolean;
|
|
81
|
+
}): string;
|
|
82
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/renderers/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC3E;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEN,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AACxE,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC,CAAC;AAC5E,MAAM,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC/D,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AAEzE,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAEzE;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,EACtB,GAAG,GAAE,cAAc,EAAO,GACzB,cAAc,EAAE,CAalB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,GAAG,YAAY,EAAE,CAe7E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,GACrB,YAAY,EAAE,CA8BhB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,YAAY,EAAE,GAC7B,YAAY,EAAE,CAuBhB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,UAAQ,GAAG,MAAM,CAgBpE;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,cAAc,EAAE,aAAa,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,YAAY,EAAE,GAC7B,gBAAgB,CA2BlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,MAAM,CAaR"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect all message nodes from the prompt tree.
|
|
3
|
+
*/
|
|
4
|
+
export function collectMessageNodes(element, acc = []) {
|
|
5
|
+
if (element.kind === "message") {
|
|
6
|
+
acc.push(element);
|
|
7
|
+
return acc;
|
|
8
|
+
}
|
|
9
|
+
for (const child of element.children) {
|
|
10
|
+
if (typeof child !== "string") {
|
|
11
|
+
collectMessageNodes(child, acc);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return acc;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Extract semantic parts from prompt children.
|
|
18
|
+
*/
|
|
19
|
+
export function collectSemanticParts(children) {
|
|
20
|
+
const parts = [];
|
|
21
|
+
for (const child of children) {
|
|
22
|
+
if (typeof child === "string") {
|
|
23
|
+
if (child.length > 0) {
|
|
24
|
+
parts.push({ type: "text", text: child });
|
|
25
|
+
}
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
parts.push(...semanticPartsFromElement(child));
|
|
29
|
+
}
|
|
30
|
+
return parts;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Extract semantic parts from a single prompt element.
|
|
34
|
+
*/
|
|
35
|
+
export function semanticPartsFromElement(element) {
|
|
36
|
+
switch (element.kind) {
|
|
37
|
+
case "tool-call":
|
|
38
|
+
return [
|
|
39
|
+
{
|
|
40
|
+
type: "tool-call",
|
|
41
|
+
toolCallId: element.toolCallId,
|
|
42
|
+
toolName: element.toolName,
|
|
43
|
+
input: element.input,
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
case "tool-result":
|
|
47
|
+
return [
|
|
48
|
+
{
|
|
49
|
+
type: "tool-result",
|
|
50
|
+
toolCallId: element.toolCallId,
|
|
51
|
+
toolName: element.toolName,
|
|
52
|
+
output: element.output,
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
case "reasoning":
|
|
56
|
+
return element.text.length === 0
|
|
57
|
+
? []
|
|
58
|
+
: [{ type: "reasoning", text: element.text }];
|
|
59
|
+
case "message":
|
|
60
|
+
// Nested messages are ambiguous - skip
|
|
61
|
+
return [];
|
|
62
|
+
default:
|
|
63
|
+
return collectSemanticParts(element.children);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Coalesce adjacent text parts into single parts.
|
|
68
|
+
*/
|
|
69
|
+
export function coalesceTextParts(parts) {
|
|
70
|
+
const result = [];
|
|
71
|
+
let buffer = "";
|
|
72
|
+
for (const part of parts) {
|
|
73
|
+
if (part.type === "text") {
|
|
74
|
+
buffer += part.text;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (buffer.length > 0) {
|
|
78
|
+
result.push({ type: "text", text: buffer });
|
|
79
|
+
buffer = "";
|
|
80
|
+
}
|
|
81
|
+
result.push(part);
|
|
82
|
+
}
|
|
83
|
+
if (buffer.length > 0) {
|
|
84
|
+
result.push({ type: "text", text: buffer });
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Safely stringify a value to JSON string.
|
|
90
|
+
* Returns string values directly, handles undefined, and catches JSON errors.
|
|
91
|
+
*
|
|
92
|
+
* @param value - The value to stringify
|
|
93
|
+
* @param pretty - If true, format with 2-space indentation (default: false)
|
|
94
|
+
*/
|
|
95
|
+
export function safeStringify(value, pretty = false) {
|
|
96
|
+
if (typeof value === "string") {
|
|
97
|
+
return value;
|
|
98
|
+
}
|
|
99
|
+
if (value === undefined) {
|
|
100
|
+
return "null";
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
return ((pretty ? JSON.stringify(value, null, 2) : JSON.stringify(value)) ??
|
|
104
|
+
"null");
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return String(value);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Categorize semantic parts by type for easier processing.
|
|
112
|
+
*/
|
|
113
|
+
export function categorizeParts(parts) {
|
|
114
|
+
const textParts = [];
|
|
115
|
+
const toolCallParts = [];
|
|
116
|
+
const toolResultParts = [];
|
|
117
|
+
const reasoningParts = [];
|
|
118
|
+
for (const part of parts) {
|
|
119
|
+
switch (part.type) {
|
|
120
|
+
case "text":
|
|
121
|
+
textParts.push(part);
|
|
122
|
+
break;
|
|
123
|
+
case "tool-call":
|
|
124
|
+
toolCallParts.push(part);
|
|
125
|
+
break;
|
|
126
|
+
case "tool-result":
|
|
127
|
+
toolResultParts.push(part);
|
|
128
|
+
break;
|
|
129
|
+
case "reasoning":
|
|
130
|
+
reasoningParts.push(part);
|
|
131
|
+
break;
|
|
132
|
+
default:
|
|
133
|
+
// Exhaustive check - TypeScript will error if a case is missing
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return { textParts, toolCallParts, toolResultParts, reasoningParts };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Extract text content from semantic parts.
|
|
141
|
+
* Optionally wraps reasoning parts in thinking tags.
|
|
142
|
+
*/
|
|
143
|
+
export function partsToText(parts, options = {}) {
|
|
144
|
+
const { wrapReasoning = false } = options;
|
|
145
|
+
let result = "";
|
|
146
|
+
for (const part of parts) {
|
|
147
|
+
if (part.type === "text") {
|
|
148
|
+
result += part.text;
|
|
149
|
+
}
|
|
150
|
+
else if (part.type === "reasoning" && wrapReasoning) {
|
|
151
|
+
result += `<thinking>\n${part.text}\n</thinking>\n`;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/renderers/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { RenderHooks } from "./render";
|
|
2
|
+
import type { MaybePromise, PromptElement, PromptRenderer, Tokenizer } from "./types";
|
|
3
|
+
export type SnapshotChild = string | SnapshotElement;
|
|
4
|
+
export interface SnapshotElement extends Omit<PromptElement, "children" | "strategy" | "context"> {
|
|
5
|
+
children: SnapshotChild[];
|
|
6
|
+
tokens: number;
|
|
7
|
+
hash: string;
|
|
8
|
+
}
|
|
9
|
+
export interface Snapshot {
|
|
10
|
+
root: SnapshotElement;
|
|
11
|
+
totalTokens: number;
|
|
12
|
+
hash: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SnapshotOptions {
|
|
15
|
+
tokenizer: Tokenizer;
|
|
16
|
+
renderer?: PromptRenderer<unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface SnapshotHooksOptions {
|
|
19
|
+
tokenizer: Tokenizer;
|
|
20
|
+
renderer?: PromptRenderer<unknown>;
|
|
21
|
+
onSnapshot: (snapshot: Snapshot) => MaybePromise<void>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a deterministic snapshot of a fitted prompt tree.
|
|
25
|
+
*
|
|
26
|
+
* - Keeps the tree structure (no flattening) and mirrors PromptElement shape.
|
|
27
|
+
* - Adds per-node token counts (using renderer.tokenString) and stable hashes.
|
|
28
|
+
* - Excludes strategy/context from the snapshot; this is for observability only.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSnapshot(element: PromptElement, { tokenizer, renderer }: SnapshotOptions): Snapshot;
|
|
31
|
+
export declare function createSnapshotHooks({ tokenizer, renderer, onSnapshot, }: SnapshotHooksOptions): RenderHooks;
|
|
32
|
+
export interface DiffEntry {
|
|
33
|
+
path: readonly number[];
|
|
34
|
+
node: SnapshotChild;
|
|
35
|
+
}
|
|
36
|
+
export interface DiffChange {
|
|
37
|
+
path: readonly number[];
|
|
38
|
+
before: SnapshotChild;
|
|
39
|
+
after: SnapshotChild;
|
|
40
|
+
}
|
|
41
|
+
export interface SnapshotDiff {
|
|
42
|
+
added: DiffEntry[];
|
|
43
|
+
removed: DiffEntry[];
|
|
44
|
+
changed: DiffChange[];
|
|
45
|
+
}
|
|
46
|
+
export declare function diffSnapshots(before: Snapshot, after: Snapshot): SnapshotDiff;
|
|
47
|
+
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EAEd,SAAS,EACV,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,eAAe,CAAC;AAErD,MAAM,WAAW,eACf,SAAQ,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAChE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,eAAe,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CACxD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,aAAa,EACtB,EAAE,SAAS,EAAE,QAA2B,EAAE,EAAE,eAAe,GAC1D,QAAQ,CAOV;AAED,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,QAAQ,EACR,UAAU,GACX,EAAE,oBAAoB,GAAG,WAAW,CAapC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,YAAY,CAQ7E"}
|