saeeol 1.0.6 → 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.
@@ -13,6 +13,7 @@ import { WebFetchTool } from "./webfetch"
13
13
  import { WriteTool } from "./write"
14
14
  import { InvalidTool } from "./invalid"
15
15
  import { SkillTool } from "./skill"
16
+ import { PackageTool } from "./package"
16
17
  import * as Tool from "./tool"
17
18
  import { Config } from "@/config/config"
18
19
  import { type ToolContext as PluginToolContext, type ToolDefinition } from "@saeeol/plugin"
@@ -116,6 +117,7 @@ export const layer: Layer.Layer<
116
117
  const greptool = yield* GrepTool
117
118
  const patchtool = yield* ApplyPatchTool
118
119
  const skilltool = yield* SkillTool
120
+ const packagetool = yield* PackageTool
119
121
  const agent = yield* Agent.Service
120
122
  const suggesttool = yield* SuggestTool
121
123
  const saeeolToolInfos = yield* SaeeolToolRegistry.infos()
@@ -211,6 +213,7 @@ export const layer: Layer.Layer<
211
213
  todo: Tool.init(todo),
212
214
  search: Tool.init(websearch),
213
215
  skill: Tool.init(skilltool),
216
+ package: Tool.init(packagetool),
214
217
  patch: Tool.init(patchtool),
215
218
  question: Tool.init(question),
216
219
  lsp: Tool.init(lsptool),
@@ -237,6 +240,7 @@ export const layer: Layer.Layer<
237
240
  tool.todo,
238
241
  tool.search,
239
242
  tool.skill,
243
+ tool.package,
240
244
  tool.patch,
241
245
  tool.plan,
242
246
  ...(["cli", "vscode"].includes(Flag.SAEEOL_CLIENT) ? [tool.suggest] : []),
@@ -11,21 +11,21 @@ description: Build AI agents on Cloudflare Workers using the Agents SDK. Load wh
11
11
 
12
12
  Fetch current docs from `https://github.com/cloudflare/agents/tree/main/docs` before implementing.
13
13
 
14
- | Topic | Doc | Use for |
15
- | ------------------- | ----------------------------- | ---------------------------------------------- |
16
- | Getting started | `docs/getting-started.md` | First agent, project setup |
17
- | State | `docs/state.md` | `setState`, `validateStateChange`, persistence |
18
- | Routing | `docs/routing.md` | URL patterns, `routeAgentRequest`, `basePath` |
19
- | Callable methods | `docs/callable-methods.md` | `@callable`, RPC, streaming, timeouts |
20
- | Scheduling | `docs/scheduling.md` | `schedule()`, `scheduleEvery()`, cron |
21
- | Workflows | `docs/workflows.md` | `AgentWorkflow`, durable multi-step tasks |
22
- | HTTP/WebSockets | `docs/http-websockets.md` | Lifecycle hooks, hibernation |
23
- | Email | `docs/email.md` | Email routing, secure reply resolver |
24
- | MCP client | `docs/mcp-client.md` | Connecting to MCP servers |
25
- | MCP server | `docs/mcp-servers.md` | Building MCP servers with `McpAgent` |
26
- | Client SDK | `docs/client-sdk.md` | `useAgent`, `useAgentChat`, React hooks |
27
- | Human-in-the-loop | `docs/human-in-the-loop.md` | Approval flows, pausing workflows |
28
- | Resumable streaming | `docs/resumable-streaming.md` | Stream recovery on disconnect |
14
+ | Topic | Doc | Use for |
15
+ |---|---|---|
16
+ | Getting started | `docs/getting-started.md` | First agent, project setup |
17
+ | State | `docs/state.md` | `setState`, `validateStateChange`, persistence |
18
+ | Routing | `docs/routing.md` | URL patterns, `routeAgentRequest`, `basePath` |
19
+ | Callable methods | `docs/callable-methods.md` | `@callable`, RPC, streaming, timeouts |
20
+ | Scheduling | `docs/scheduling.md` | `schedule()`, `scheduleEvery()`, cron |
21
+ | Workflows | `docs/workflows.md` | `AgentWorkflow`, durable multi-step tasks |
22
+ | HTTP/WebSockets | `docs/http-websockets.md` | Lifecycle hooks, hibernation |
23
+ | Email | `docs/email.md` | Email routing, secure reply resolver |
24
+ | MCP client | `docs/mcp-client.md` | Connecting to MCP servers |
25
+ | MCP server | `docs/mcp-servers.md` | Building MCP servers with `McpAgent` |
26
+ | Client SDK | `docs/client-sdk.md` | `useAgent`, `useAgentChat`, React hooks |
27
+ | Human-in-the-loop | `docs/human-in-the-loop.md` | Approval flows, pausing workflows |
28
+ | Resumable streaming | `docs/resumable-streaming.md` | Stream recovery on disconnect |
29
29
 
30
30
  Cloudflare docs: https://developers.cloudflare.com/agents/
31
31
 
@@ -101,26 +101,26 @@ export default {
101
101
 
102
102
  Requests route to `/agents/{agent-name}/{instance-name}`:
103
103
 
104
- | Class | URL |
105
- | ---------- | -------------------------- |
106
- | `Counter` | `/agents/counter/user-123` |
107
- | `ChatRoom` | `/agents/chat-room/lobby` |
104
+ | Class | URL |
105
+ |---|---|
106
+ | `Counter` | `/agents/counter/user-123` |
107
+ | `ChatRoom` | `/agents/chat-room/lobby` |
108
108
 
109
109
  Client: `useAgent({ agent: "Counter", name: "user-123" })`
110
110
 
111
111
  ## Core APIs
112
112
 
113
- | Task | API |
114
- | ------------------- | ------------------------------------------------------ |
115
- | Read state | `this.state.count` |
116
- | Write state | `this.setState({ count: 1 })` |
117
- | SQL query | `` this.sql`SELECT * FROM users WHERE id = ${id}` `` |
118
- | Schedule (delay) | `await this.schedule(60, "task", payload)` |
119
- | Schedule (cron) | `await this.schedule("0 * * * *", "task", payload)` |
120
- | Schedule (interval) | `await this.scheduleEvery(30, "poll")` |
121
- | RPC method | `@callable() myMethod() { ... }` |
122
- | Streaming RPC | `@callable({ streaming: true }) stream(res) { ... }` |
123
- | Start workflow | `await this.runWorkflow("ProcessingWorkflow", params)` |
113
+ | Task | API |
114
+ |---|---|
115
+ | Read state | `this.state.count` |
116
+ | Write state | `this.setState({ count: 1 })` |
117
+ | SQL query | `` this.sql`SELECT * FROM users WHERE id = ${id}` `` |
118
+ | Schedule (delay) | `await this.schedule(60, "task", payload)` |
119
+ | Schedule (cron) | `await this.schedule("0 * * * *", "task", payload)` |
120
+ | Schedule (interval) | `await this.scheduleEvery(30, "poll")` |
121
+ | RPC method | `@callable() myMethod() { ... }` |
122
+ | Streaming RPC | `@callable({ streaming: true }) stream(res) { ... }` |
123
+ | Start workflow | `await this.runWorkflow("ProcessingWorkflow", params)` |
124
124
 
125
125
  ## React Client
126
126
 
@@ -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
- }