saeeol 1.0.7 → 1.0.8

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.
@@ -102,110 +102,110 @@ Need IaC? → pulumi/ (Pulumi), terraform/ (Terraform), or api/ (REST API)
102
102
 
103
103
  ### Compute & Runtime
104
104
 
105
- | Product | Reference |
106
- | --------------------- | ----------------------------------- |
107
- | Workers | `references/workers/` |
108
- | Pages | `references/pages/` |
109
- | Pages Functions | `references/pages-functions/` |
110
- | Durable Objects | `references/durable-objects/` |
111
- | Workflows | `references/workflows/` |
112
- | Containers | `references/containers/` |
105
+ | Product | Reference |
106
+ |---|---|
107
+ | Workers | `references/workers/` |
108
+ | Pages | `references/pages/` |
109
+ | Pages Functions | `references/pages-functions/` |
110
+ | Durable Objects | `references/durable-objects/` |
111
+ | Workflows | `references/workflows/` |
112
+ | Containers | `references/containers/` |
113
113
  | Workers for Platforms | `references/workers-for-platforms/` |
114
- | Cron Triggers | `references/cron-triggers/` |
115
- | Tail Workers | `references/tail-workers/` |
116
- | Snippets | `references/snippets/` |
117
- | Smart Placement | `references/smart-placement/` |
114
+ | Cron Triggers | `references/cron-triggers/` |
115
+ | Tail Workers | `references/tail-workers/` |
116
+ | Snippets | `references/snippets/` |
117
+ | Smart Placement | `references/smart-placement/` |
118
118
 
119
119
  ### Storage & Data
120
120
 
121
- | Product | Reference |
122
- | --------------- | ----------------------------- |
123
- | KV | `references/kv/` |
124
- | D1 | `references/d1/` |
125
- | R2 | `references/r2/` |
126
- | Queues | `references/queues/` |
127
- | Hyperdrive | `references/hyperdrive/` |
128
- | DO Storage | `references/do-storage/` |
129
- | Secrets Store | `references/secrets-store/` |
130
- | Pipelines | `references/pipelines/` |
121
+ | Product | Reference |
122
+ |---|---|
123
+ | KV | `references/kv/` |
124
+ | D1 | `references/d1/` |
125
+ | R2 | `references/r2/` |
126
+ | Queues | `references/queues/` |
127
+ | Hyperdrive | `references/hyperdrive/` |
128
+ | DO Storage | `references/do-storage/` |
129
+ | Secrets Store | `references/secrets-store/` |
130
+ | Pipelines | `references/pipelines/` |
131
131
  | R2 Data Catalog | `references/r2-data-catalog/` |
132
- | R2 SQL | `references/r2-sql/` |
132
+ | R2 SQL | `references/r2-sql/` |
133
133
 
134
134
  ### AI & Machine Learning
135
135
 
136
- | Product | Reference |
137
- | ---------- | ------------------------ |
136
+ | Product | Reference |
137
+ |---|---|
138
138
  | Workers AI | `references/workers-ai/` |
139
- | Vectorize | `references/vectorize/` |
139
+ | Vectorize | `references/vectorize/` |
140
140
  | Agents SDK | `references/agents-sdk/` |
141
141
  | AI Gateway | `references/ai-gateway/` |
142
- | AI Search | `references/ai-search/` |
142
+ | AI Search | `references/ai-search/` |
143
143
 
144
144
  ### Networking & Connectivity
145
145
 
146
- | Product | Reference |
147
- | -------------------- | ---------------------------------- |
148
- | Tunnel | `references/tunnel/` |
149
- | Spectrum | `references/spectrum/` |
150
- | TURN | `references/turn/` |
146
+ | Product | Reference |
147
+ |---|---|
148
+ | Tunnel | `references/tunnel/` |
149
+ | Spectrum | `references/spectrum/` |
150
+ | TURN | `references/turn/` |
151
151
  | Network Interconnect | `references/network-interconnect/` |
152
- | Argo Smart Routing | `references/argo-smart-routing/` |
153
- | Workers VPC | `references/workers-vpc/` |
152
+ | Argo Smart Routing | `references/argo-smart-routing/` |
153
+ | Workers VPC | `references/workers-vpc/` |
154
154
 
155
155
  ### Security
156
156
 
157
- | Product | Reference |
158
- | --------------- | ---------------------------- |
159
- | WAF | `references/waf/` |
160
- | DDoS Protection | `references/ddos/` |
161
- | Bot Management | `references/bot-management/` |
162
- | API Shield | `references/api-shield/` |
163
- | Turnstile | `references/turnstile/` |
157
+ | Product | Reference |
158
+ |---|---|
159
+ | WAF | `references/waf/` |
160
+ | DDoS Protection | `references/ddos/` |
161
+ | Bot Management | `references/bot-management/` |
162
+ | API Shield | `references/api-shield/` |
163
+ | Turnstile | `references/turnstile/` |
164
164
 
165
165
  ### Media & Content
166
166
 
167
- | Product | Reference |
168
- | ----------------- | ------------------------------- |
169
- | Images | `references/images/` |
170
- | Stream | `references/stream/` |
167
+ | Product | Reference |
168
+ |---|---|
169
+ | Images | `references/images/` |
170
+ | Stream | `references/stream/` |
171
171
  | Browser Rendering | `references/browser-rendering/` |
172
- | Zaraz | `references/zaraz/` |
172
+ | Zaraz | `references/zaraz/` |
173
173
 
174
174
  ### Real-Time Communication
175
175
 
176
- | Product | Reference |
177
- | ------------ | -------------------------- |
178
- | RealtimeKit | `references/realtimekit/` |
176
+ | Product | Reference |
177
+ |---|---|
178
+ | RealtimeKit | `references/realtimekit/` |
179
179
  | Realtime SFU | `references/realtime-sfu/` |
180
180
 
181
181
  ### Developer Tools
182
182
 
183
- | Product | Reference |
184
- | ------------------ | -------------------------------- |
185
- | Wrangler | `references/wrangler/` |
186
- | Miniflare | `references/miniflare/` |
187
- | C3 | `references/c3/` |
188
- | Observability | `references/observability/` |
189
- | Analytics Engine | `references/analytics-engine/` |
190
- | Web Analytics | `references/web-analytics/` |
191
- | Sandbox | `references/sandbox/` |
192
- | Workerd | `references/workerd/` |
183
+ | Product | Reference |
184
+ |---|---|
185
+ | Wrangler | `references/wrangler/` |
186
+ | Miniflare | `references/miniflare/` |
187
+ | C3 | `references/c3/` |
188
+ | Observability | `references/observability/` |
189
+ | Analytics Engine | `references/analytics-engine/` |
190
+ | Web Analytics | `references/web-analytics/` |
191
+ | Sandbox | `references/sandbox/` |
192
+ | Workerd | `references/workerd/` |
193
193
  | Workers Playground | `references/workers-playground/` |
194
194
 
195
195
  ### Infrastructure as Code
196
196
 
197
- | Product | Reference |
198
- | --------- | ----------------------- |
199
- | Pulumi | `references/pulumi/` |
197
+ | Product | Reference |
198
+ |---|---|
199
+ | Pulumi | `references/pulumi/` |
200
200
  | Terraform | `references/terraform/` |
201
- | API | `references/api/` |
201
+ | API | `references/api/` |
202
202
 
203
203
  ### Other Services
204
204
 
205
- | Product | Reference |
206
- | ------------- | --------------------------- |
205
+ | Product | Reference |
206
+ |---|---|
207
207
  | Email Routing | `references/email-routing/` |
208
208
  | Email Workers | `references/email-workers/` |
209
209
  | Static Assets | `references/static-assets/` |
210
- | Bindings | `references/bindings/` |
210
+ | Bindings | `references/bindings/` |
211
211
  | Cache Reserve | `references/cache-reserve/` |
@@ -0,0 +1,100 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import { Config } from "@/config/config"
3
+ import type { Provider } from "@/provider/provider"
4
+ import { batchSplit, BATCH_TOKEN_TARGET, BATCH_TOKEN_MAX } from "@/saeeol/session/compaction-chunks-utils"
5
+ import type { MessageV2 } from "@/session/message-v2"
6
+ import { MessageID, PartID, SessionID } from "@/session/schema"
7
+
8
+ function cfg(compaction?: Config.Info["compaction"]) {
9
+ return Config.Info.zod.parse({ compaction })
10
+ }
11
+
12
+ function msg(text: string, role: "user" | "assistant" = "user"): MessageV2.WithParts {
13
+ const sid = SessionID.make("test")
14
+ const mid = MessageID.ascending()
15
+ return {
16
+ info: {
17
+ id: mid,
18
+ role,
19
+ sessionID: sid,
20
+ time: { created: Date.now() },
21
+ parentID: role === "assistant" ? MessageID.ascending() : undefined,
22
+ } as MessageV2.Info,
23
+ parts: [
24
+ {
25
+ id: PartID.ascending(),
26
+ messageID: mid,
27
+ sessionID: sid,
28
+ type: "text",
29
+ text,
30
+ } as MessageV2.TextPart,
31
+ ],
32
+ }
33
+ }
34
+
35
+ describe("compaction select budget", () => {
36
+ test("preserveRecentBudget scales with model context size", () => {
37
+ expect(BATCH_TOKEN_TARGET).toBeGreaterThan(0)
38
+ expect(BATCH_TOKEN_MAX).toBeGreaterThan(BATCH_TOKEN_TARGET)
39
+ })
40
+ })
41
+
42
+ describe("batchSplit token-aware splitting", () => {
43
+ test("produces batches with head/tail/middle structure", () => {
44
+ const messages = Array.from({ length: 20 }, (_, i) => msg(`message ${i}`))
45
+ const batches = batchSplit(messages, cfg())
46
+ expect(batches.length).toBeGreaterThan(0)
47
+ for (const batch of batches) {
48
+ expect(batch).toHaveProperty("first")
49
+ expect(batch).toHaveProperty("middle")
50
+ expect(batch).toHaveProperty("last")
51
+ expect(batch).toHaveProperty("index")
52
+ }
53
+ })
54
+
55
+ test("handles empty messages", () => {
56
+ const batches = batchSplit([], cfg())
57
+ expect(batches).toEqual([])
58
+ })
59
+
60
+ test("handles fewer messages than batch size", () => {
61
+ const messages = [msg("a"), msg("b"), msg("c")]
62
+ const batches = batchSplit(messages, cfg())
63
+ expect(batches.length).toBe(1)
64
+ expect(batches[0].first.length + batches[0].middle.length + batches[0].last.length).toBe(3)
65
+ })
66
+
67
+ test("respects custom batch_size config", () => {
68
+ const longText = "x".repeat(2_000)
69
+ const messages = Array.from({ length: 30 }, (_, i) => msg(`${longText} ${i}`))
70
+ const batches = batchSplit(messages, cfg({ batch_size: 5 }))
71
+ const total = batches.reduce((s, b) => s + b.first.length + b.middle.length + b.last.length, 0)
72
+ expect(total).toBe(30)
73
+ expect(batches.length).toBeGreaterThanOrEqual(2)
74
+ })
75
+
76
+ test("every message appears in exactly one batch", () => {
77
+ const messages = Array.from({ length: 25 }, (_, i) => msg(`message ${i}`))
78
+ const batches = batchSplit(messages, cfg())
79
+ const total = batches.reduce((sum, b) => sum + b.first.length + b.middle.length + b.last.length, 0)
80
+ expect(total).toBe(25)
81
+ })
82
+
83
+ test("expands batch when messages are short (under token target)", () => {
84
+ const messages = Array.from({ length: 30 }, () => msg("hi"))
85
+ const batches = batchSplit(messages, cfg({ batch_size: 5 }))
86
+ expect(batches.length).toBeGreaterThan(0)
87
+ const firstBatch = batches[0]
88
+ const firstBatchTotal = firstBatch.first.length + firstBatch.middle.length + firstBatch.last.length
89
+ expect(firstBatchTotal).toBeGreaterThan(5)
90
+ })
91
+
92
+ test("shrinks batch when messages are large (over token max)", () => {
93
+ const longText = "x".repeat(40_000)
94
+ const messages = Array.from({ length: 15 }, () => msg(longText))
95
+ const batches = batchSplit(messages, cfg({ batch_size: 10 }))
96
+ const firstBatch = batches[0]
97
+ const firstBatchTotal = firstBatch.first.length + firstBatch.middle.length + firstBatch.last.length
98
+ expect(firstBatchTotal).toBeLessThanOrEqual(10)
99
+ })
100
+ })
@@ -1,245 +0,0 @@
1
- {
2
- "$schema": "https://saeeol.ai/theme.json",
3
- "defs": {
4
- "darkStep1": "#0a0a0a",
5
- "darkStep2": "#141414",
6
- "darkStep3": "#1e1e1e",
7
- "darkStep4": "#282828",
8
- "darkStep5": "#323232",
9
- "darkStep6": "#3c3c3c",
10
- "darkStep7": "#484848",
11
- "darkStep8": "#606060",
12
- "darkStep9": "#fab283",
13
- "darkStep10": "#ffc09f",
14
- "darkStep11": "#808080",
15
- "darkStep12": "#eeeeee",
16
- "darkSecondary": "#5c9cf5",
17
- "darkAccent": "#9d7cd8",
18
- "darkRed": "#e06c75",
19
- "darkOrange": "#f5a742",
20
- "darkGreen": "#7fd88f",
21
- "darkCyan": "#56b6c2",
22
- "darkYellow": "#e5c07b",
23
- "lightStep1": "#ffffff",
24
- "lightStep2": "#fafafa",
25
- "lightStep3": "#f5f5f5",
26
- "lightStep4": "#ebebeb",
27
- "lightStep5": "#e1e1e1",
28
- "lightStep6": "#d4d4d4",
29
- "lightStep7": "#b8b8b8",
30
- "lightStep8": "#a0a0a0",
31
- "lightStep9": "#3b7dd8",
32
- "lightStep10": "#2968c3",
33
- "lightStep11": "#8a8a8a",
34
- "lightStep12": "#1a1a1a",
35
- "lightSecondary": "#7b5bb6",
36
- "lightAccent": "#d68c27",
37
- "lightRed": "#d1383d",
38
- "lightOrange": "#d68c27",
39
- "lightGreen": "#3d9a57",
40
- "lightCyan": "#318795",
41
- "lightYellow": "#b0851f"
42
- },
43
- "theme": {
44
- "primary": {
45
- "dark": "darkStep9",
46
- "light": "lightStep9"
47
- },
48
- "secondary": {
49
- "dark": "darkSecondary",
50
- "light": "lightSecondary"
51
- },
52
- "accent": {
53
- "dark": "darkAccent",
54
- "light": "lightAccent"
55
- },
56
- "error": {
57
- "dark": "darkRed",
58
- "light": "lightRed"
59
- },
60
- "warning": {
61
- "dark": "darkOrange",
62
- "light": "lightOrange"
63
- },
64
- "success": {
65
- "dark": "darkGreen",
66
- "light": "lightGreen"
67
- },
68
- "info": {
69
- "dark": "darkCyan",
70
- "light": "lightCyan"
71
- },
72
- "text": {
73
- "dark": "darkStep12",
74
- "light": "lightStep12"
75
- },
76
- "textMuted": {
77
- "dark": "darkStep11",
78
- "light": "lightStep11"
79
- },
80
- "background": {
81
- "dark": "darkStep1",
82
- "light": "lightStep1"
83
- },
84
- "backgroundPanel": {
85
- "dark": "darkStep2",
86
- "light": "lightStep2"
87
- },
88
- "backgroundElement": {
89
- "dark": "darkStep3",
90
- "light": "lightStep3"
91
- },
92
- "border": {
93
- "dark": "darkStep7",
94
- "light": "lightStep7"
95
- },
96
- "borderActive": {
97
- "dark": "darkStep8",
98
- "light": "lightStep8"
99
- },
100
- "borderSubtle": {
101
- "dark": "darkStep6",
102
- "light": "lightStep6"
103
- },
104
- "diffAdded": {
105
- "dark": "#4fd6be",
106
- "light": "#1e725c"
107
- },
108
- "diffRemoved": {
109
- "dark": "#c53b53",
110
- "light": "#c53b53"
111
- },
112
- "diffContext": {
113
- "dark": "#828bb8",
114
- "light": "#7086b5"
115
- },
116
- "diffHunkHeader": {
117
- "dark": "#828bb8",
118
- "light": "#7086b5"
119
- },
120
- "diffHighlightAdded": {
121
- "dark": "#b8db87",
122
- "light": "#4db380"
123
- },
124
- "diffHighlightRemoved": {
125
- "dark": "#e26a75",
126
- "light": "#f52a65"
127
- },
128
- "diffAddedBg": {
129
- "dark": "#20303b",
130
- "light": "#d5e5d5"
131
- },
132
- "diffRemovedBg": {
133
- "dark": "#37222c",
134
- "light": "#f7d8db"
135
- },
136
- "diffContextBg": {
137
- "dark": "darkStep2",
138
- "light": "lightStep2"
139
- },
140
- "diffLineNumber": {
141
- "dark": "#8f8f8f",
142
- "light": "#595959"
143
- },
144
- "diffAddedLineNumberBg": {
145
- "dark": "#1b2b34",
146
- "light": "#c5d5c5"
147
- },
148
- "diffRemovedLineNumberBg": {
149
- "dark": "#2d1f26",
150
- "light": "#e7c8cb"
151
- },
152
- "markdownText": {
153
- "dark": "darkStep12",
154
- "light": "lightStep12"
155
- },
156
- "markdownHeading": {
157
- "dark": "darkAccent",
158
- "light": "lightAccent"
159
- },
160
- "markdownLink": {
161
- "dark": "darkStep9",
162
- "light": "lightStep9"
163
- },
164
- "markdownLinkText": {
165
- "dark": "darkCyan",
166
- "light": "lightCyan"
167
- },
168
- "markdownCode": {
169
- "dark": "darkGreen",
170
- "light": "lightGreen"
171
- },
172
- "markdownBlockQuote": {
173
- "dark": "darkYellow",
174
- "light": "lightYellow"
175
- },
176
- "markdownEmph": {
177
- "dark": "darkYellow",
178
- "light": "lightYellow"
179
- },
180
- "markdownStrong": {
181
- "dark": "darkOrange",
182
- "light": "lightOrange"
183
- },
184
- "markdownHorizontalRule": {
185
- "dark": "darkStep11",
186
- "light": "lightStep11"
187
- },
188
- "markdownListItem": {
189
- "dark": "darkStep9",
190
- "light": "lightStep9"
191
- },
192
- "markdownListEnumeration": {
193
- "dark": "darkCyan",
194
- "light": "lightCyan"
195
- },
196
- "markdownImage": {
197
- "dark": "darkStep9",
198
- "light": "lightStep9"
199
- },
200
- "markdownImageText": {
201
- "dark": "darkCyan",
202
- "light": "lightCyan"
203
- },
204
- "markdownCodeBlock": {
205
- "dark": "darkStep12",
206
- "light": "lightStep12"
207
- },
208
- "syntaxComment": {
209
- "dark": "darkStep11",
210
- "light": "lightStep11"
211
- },
212
- "syntaxKeyword": {
213
- "dark": "darkAccent",
214
- "light": "lightAccent"
215
- },
216
- "syntaxFunction": {
217
- "dark": "darkStep9",
218
- "light": "lightStep9"
219
- },
220
- "syntaxVariable": {
221
- "dark": "darkRed",
222
- "light": "lightRed"
223
- },
224
- "syntaxString": {
225
- "dark": "darkGreen",
226
- "light": "lightGreen"
227
- },
228
- "syntaxNumber": {
229
- "dark": "darkOrange",
230
- "light": "lightOrange"
231
- },
232
- "syntaxType": {
233
- "dark": "darkYellow",
234
- "light": "lightYellow"
235
- },
236
- "syntaxOperator": {
237
- "dark": "darkCyan",
238
- "light": "lightCyan"
239
- },
240
- "syntaxPunctuation": {
241
- "dark": "darkStep12",
242
- "light": "lightStep12"
243
- }
244
- }
245
- }