gentle-pi 2.2.0 → 2.3.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.
Files changed (130) hide show
  1. package/README.md +51 -80
  2. package/assets/agents/review-readability.md +0 -2
  3. package/assets/agents/review-reliability.md +0 -2
  4. package/assets/agents/review-resilience.md +0 -2
  5. package/assets/agents/review-risk.md +0 -2
  6. package/assets/agents/sdd-apply.md +5 -3
  7. package/assets/agents/sdd-proposal.md +2 -0
  8. package/assets/agents/sdd-research.md +54 -0
  9. package/assets/agents/sdd-status.md +4 -4
  10. package/assets/agents/sdd-tasks.md +2 -3
  11. package/assets/agents/sdd-verify.md +21 -1
  12. package/assets/chains/sdd-full.chain.md +1 -1
  13. package/assets/chains/sdd-verify.chain.md +1 -1
  14. package/assets/orchestrator-delegation.md +54 -248
  15. package/assets/orchestrator-memory.md +2 -0
  16. package/assets/orchestrator.md +22 -38
  17. package/assets/sdd-orchestrator-workflow.md +30 -37
  18. package/assets/support/sdd-status-contract.md +7 -7
  19. package/contracts/review-integration/v1/schemas/transition-execution.schema.json +42 -0
  20. package/contracts/review-integration/v2/schemas/last-event-closure.schema.json +66 -0
  21. package/contracts/review-integration/v2/schemas/opencode-provider-role.schema.json +14 -0
  22. package/docs/native-authority-architecture.md +9 -11
  23. package/docs/review-integration.md +27 -373
  24. package/extensions/ask-user-choice.ts +151 -0
  25. package/extensions/gentle-ai.ts +1778 -3673
  26. package/extensions/quiet-tools.ts +515 -32
  27. package/extensions/sdd-init.ts +4 -8
  28. package/lib/gentle-ai-renderer.ts +70 -0
  29. package/lib/model-routing-authority.ts +133 -0
  30. package/lib/native-review-cli.ts +372 -940
  31. package/lib/opaque-pi-reviewer-adapter.ts +284 -0
  32. package/lib/review-candidate-view.ts +341 -132
  33. package/lib/review-host-relay.ts +210 -68
  34. package/lib/review-integration-v2.ts +839 -307
  35. package/lib/review-last-event-controller.ts +35 -0
  36. package/lib/sdd-preflight.ts +177 -66
  37. package/lib/sdd-status.ts +66 -111
  38. package/lib/terminal-theme.ts +1 -1
  39. package/package.json +83 -82
  40. package/runtime/gentle-ai-binary.mjs +1 -1
  41. package/runtime/native-review-cli.mjs +322 -890
  42. package/runtime/review-integration-v2.mjs +789 -257
  43. package/runtime/review-relay-contract.mjs +1 -1
  44. package/scripts/{build-git-commit-transaction-runner.mjs → build-runtime-modules.mjs} +4 -5
  45. package/scripts/gentle-ai-installer.mjs +75 -22
  46. package/scripts/maintainer/provider-relay-matrix.mjs +195 -11
  47. package/scripts/test-packed-runner.mjs +4 -7
  48. package/scripts/verify-package-files.mjs +12 -13
  49. package/skills/_shared/review-ledger-contract.md +8 -14
  50. package/skills/chained-pr/SKILL.md +3 -0
  51. package/skills/cognitive-doc-design/SKILL.md +1 -1
  52. package/skills/comment-writer/SKILL.md +1 -1
  53. package/skills/gentle-ai/SKILL.md +7 -74
  54. package/skills/judgment-day/SKILL.md +5 -7
  55. package/skills/rdd-defect-workflow/SKILL.md +3 -3
  56. package/skills/release/SKILL.md +3 -3
  57. package/skills/skill-registry/SKILL.md +1 -1
  58. package/skills/work-unit-commits/SKILL.md +3 -1
  59. package/tests/artifact-language.test.ts +24 -11
  60. package/tests/ask-user-choice.test.ts +264 -0
  61. package/tests/codegraph-tools.test.ts +3 -3
  62. package/tests/crosslane/cross-lane.mjs +15 -1168
  63. package/tests/delegated-key-learnings-contract.test.ts +8 -6
  64. package/tests/devbinary/native-review-parity.devtest.ts +167 -250
  65. package/tests/devbinary/pi-host-relay.devtest.ts +867 -0
  66. package/tests/fixtures/devbinary/last-event-capture-correction-plan.captured.json +10 -0
  67. package/tests/fixtures/devbinary/last-event-capture-refuter-approved.captured.json +20 -0
  68. package/tests/fixtures/devbinary/last-event-capture-refuter-correction-required.captured.json +26 -0
  69. package/tests/fixtures/devbinary/last-event-capture-result-approved.captured.json +8 -0
  70. package/tests/fixtures/devbinary/last-event-capture-result-correction-required.captured.json +26 -0
  71. package/tests/fixtures/devbinary/last-event-capture-validation-approved.captured.json +8 -0
  72. package/tests/fixtures/devbinary/last-event-closure.provenance.md +13 -0
  73. package/tests/fixtures/devbinary/review-acknowledged-v1.captured.json +9 -0
  74. package/tests/fixtures/devbinary/review-acknowledged.provenance.md +31 -0
  75. package/tests/fixtures/devbinary/start-v3-zero-lens-closed.captured.json +21 -0
  76. package/tests/fixtures/native-review-cli/v2.5.0-rc.1/PROVENANCE.txt +15 -0
  77. package/tests/gentle-ai-binary.test.ts +83 -13
  78. package/tests/gentle-ai-dev-binary.test.ts +51 -228
  79. package/tests/gentle-ai-installer.test.ts +137 -47
  80. package/tests/gentle-ai.test.ts +820 -131
  81. package/tests/gentle-theme.test.ts +133 -0
  82. package/tests/maintainer/provider-relay.maintest.ts +340 -4
  83. package/tests/model-routing-authority.test.ts +257 -0
  84. package/tests/native-review-capability-contract.test.ts +28 -1
  85. package/tests/native-review-cli.test.ts +586 -962
  86. package/tests/native-review-consent.test.ts +150 -66
  87. package/tests/native-review-parity-runtime.test.ts +80 -359
  88. package/tests/native-review-parity.test.ts +674 -925
  89. package/tests/opaque-pi-reviewer-adapter.test.ts +266 -0
  90. package/tests/orchestrator-budget.test.ts +132 -88
  91. package/tests/orchestrator-rdd-ownership.test.ts +103 -0
  92. package/tests/package-manifest.test.ts +37 -35
  93. package/tests/provider-defect-handoff.test.ts +15 -118
  94. package/tests/quiet-tool-rendering.test.ts +1055 -28
  95. package/tests/review-authority-recovery-docs.test.ts +1 -2
  96. package/tests/review-candidate-view.test.ts +409 -3
  97. package/tests/review-compact-contract.test.ts +4 -30
  98. package/tests/review-controller-lock-status.test.ts +2 -2
  99. package/tests/review-controller-native-recovery.test.ts +363 -1450
  100. package/tests/review-controller-native-routing.test.ts +1251 -5642
  101. package/tests/review-controller-retired-ops.test.ts +1 -1
  102. package/tests/review-controller-workspace-root.test.ts +222 -71
  103. package/tests/review-controller.test.ts +26 -816
  104. package/tests/review-corrected-finalize-binding.test.ts +112 -153
  105. package/tests/review-dispatch-hydration-gap.test.ts +1 -53
  106. package/tests/review-gate.test.ts +0 -45
  107. package/tests/review-host-relay-restart-parity.test.ts +360 -0
  108. package/tests/review-host-relay-routing.test.ts +117 -82
  109. package/tests/review-host-relay.test.ts +242 -8
  110. package/tests/review-integration-v2-forward.test.ts +576 -553
  111. package/tests/review-integration-v2.test.ts +239 -165
  112. package/tests/review-last-event-closure.test.ts +408 -0
  113. package/tests/review-ledger-contract.test.ts +97 -35
  114. package/tests/review-recovered-lineage-routing.test.ts +0 -47
  115. package/tests/review-relay-transport-agent.test.ts +119 -46
  116. package/tests/review-snapshot.test.ts +3 -2
  117. package/tests/runtime-harness.mjs +361 -196
  118. package/tests/sdd-agent-tools.test.ts +36 -0
  119. package/tests/sdd-preflight.test.ts +81 -15
  120. package/tests/sdd-status.test.ts +109 -110
  121. package/tests/skill-collision-prefixes.test.ts +5 -8
  122. package/tests/writer-edit-surface-scope.test.ts +230 -0
  123. package/themes/Gentleman-Cute.json +94 -0
  124. package/themes/Gentleman-Sexy.json +92 -0
  125. package/lib/git-commit-transaction.ts +0 -861
  126. package/runtime/git-commit-transaction.mjs +0 -862
  127. package/scripts/run-git-commit-transaction.mjs +0 -35
  128. package/tests/fixtures/native-review-cli/v2.1.3/sdd-status-engram.json +0 -139
  129. package/tests/fixtures/native-review-cli/v2.1.3/sdd-status.json +0 -200
  130. package/tests/git-commit-transaction.test.ts +0 -530
@@ -0,0 +1,230 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import test, { after } from "node:test";
6
+ import type {
7
+ ExtensionAPI,
8
+ ExtensionContext,
9
+ } from "@earendil-works/pi-coding-agent";
10
+ import { createGentleAiExtension } from "../extensions/gentle-ai.ts";
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // Bounded writer edit-surface scope guard (issue #484).
14
+ //
15
+ // The guard reads the `## Allowed edit surfaces` section out of the delegated
16
+ // `subagent_run` prompt. A delegated task is a full prompt: the surfaces list
17
+ // is followed by deeper headings (`### Validation`, `#### Return`) and by
18
+ // ordinary prose. The section must end where the list ends, so that following
19
+ // content is never parsed as a surface entry and never turned into a false
20
+ // rejection. A `context` value carrying only the heading and its lines had
21
+ // nothing following it, which is why the same surfaces were accepted there and
22
+ // rejected in `task`.
23
+ //
24
+ // Every case below runs through the real `tool_call` hook with the exact
25
+ // `subagent_run` input shape, because that is the boundary that rejected.
26
+ // ---------------------------------------------------------------------------
27
+
28
+ const REJECTION =
29
+ "Writer tasks must include the exact Markdown heading `## Allowed edit surfaces` with narrow repository-relative paths or narrow globs, one per line. The parent must derive or map that canonical block from the delegated task and relaunch the writer; do not accept aliases, and do not ask the human to author paths or globs.";
30
+
31
+ type ToolCallHandler = (
32
+ event: { toolName: string; input: unknown },
33
+ ctx: ExtensionContext,
34
+ ) => Promise<{ block: true; reason: string } | undefined>;
35
+
36
+ const scratchRoots: string[] = [];
37
+
38
+ after(() => {
39
+ for (const dir of scratchRoots) rmSync(dir, { recursive: true, force: true });
40
+ });
41
+
42
+ function dispatchWriter(input: Record<string, unknown>) {
43
+ const handlers = new Map<string, ToolCallHandler>();
44
+ const pi = {
45
+ on(name: string, handler: ToolCallHandler) {
46
+ handlers.set(name, handler);
47
+ },
48
+ events: { emit() {} },
49
+ registerCommand() {},
50
+ registerTool() {},
51
+ } as unknown as ExtensionAPI;
52
+ createGentleAiExtension({ nativeReviewCli: null })(pi);
53
+ const toolCall = handlers.get("tool_call");
54
+ assert.equal(typeof toolCall, "function");
55
+ const cwd = mkdtempSync(join(tmpdir(), "gentle-pi-writer-surfaces-"));
56
+ scratchRoots.push(cwd);
57
+ return toolCall!({ toolName: "subagent_run", input }, {
58
+ cwd,
59
+ hasUI: false,
60
+ ui: { confirm: async () => true },
61
+ } as ExtensionContext);
62
+ }
63
+
64
+ async function assertAccepted(input: Record<string, unknown>, message: string) {
65
+ assert.equal(await dispatchWriter(input), undefined, message);
66
+ }
67
+
68
+ async function assertRejected(input: Record<string, unknown>, message: string) {
69
+ assert.deepEqual(await dispatchWriter(input), { block: true, reason: REJECTION }, message);
70
+ }
71
+
72
+ test("task-scoped surfaces are accepted ahead of a deeper heading", async () => {
73
+ await assertAccepted({
74
+ agent: "gentle-ai-worker",
75
+ mode: "task",
76
+ task: [
77
+ "Fix the decoder.",
78
+ "",
79
+ "## Allowed edit surfaces",
80
+ "- `lib/sdd-status.ts`",
81
+ "- `tests/sdd-status.test.ts`",
82
+ "",
83
+ "### Validation commands",
84
+ "- pnpm test",
85
+ "",
86
+ "#### Return",
87
+ "- one structured envelope",
88
+ ].join("\n"),
89
+ }, "a delegated task ends its surfaces list at the next heading of any level");
90
+ });
91
+
92
+ test("task-scoped surfaces are accepted ahead of trailing prose", async () => {
93
+ await assertAccepted({
94
+ agent: "gentle-ai-worker",
95
+ mode: "task",
96
+ task: [
97
+ "## Allowed edit surfaces",
98
+ "- `lib/sdd-status.ts`",
99
+ "",
100
+ "Then run the focused test file and report the outcome.",
101
+ ].join("\n"),
102
+ }, "prose after the list is not a surface entry");
103
+ });
104
+
105
+ test("the documented task shape from issue #484 is accepted", async () => {
106
+ await assertAccepted({
107
+ agent: "gentle-ai-worker",
108
+ mode: "task",
109
+ task: [
110
+ "## Allowed edit surfaces",
111
+ "- `lib/sdd-status.ts`",
112
+ "- `tests/sdd-status.test.ts`",
113
+ "",
114
+ "## Skills to load before work",
115
+ "- `skills/typescript/SKILL.md`",
116
+ ].join("\n"),
117
+ }, "the reported repro shape stays accepted");
118
+ });
119
+
120
+ test("bullet, backtick and plain-line surfaces reach the same decision", async () => {
121
+ const bulleted = ["## Allowed edit surfaces", "- `lib/sdd-status.ts`", "- `tests/sdd-status.test.ts`"].join("\n");
122
+ const plain = ["## Allowed edit surfaces", "lib/sdd-status.ts", "tests/sdd-status.test.ts"].join("\n");
123
+ await assertAccepted({ agent: "gentle-ai-worker", mode: "task", task: bulleted }, "bullets in task are accepted");
124
+ await assertAccepted({ agent: "gentle-ai-worker", mode: "task", task: plain }, "plain lines in task are accepted");
125
+ await assertAccepted(
126
+ { agent: "gentle-ai-worker", mode: "task", task: "Fix the decoder.", context: bulleted },
127
+ "bullets in context are accepted",
128
+ );
129
+ await assertAccepted(
130
+ { agent: "gentle-ai-worker", mode: "task", task: "Fix the decoder.", context: plain },
131
+ "plain lines in context are accepted",
132
+ );
133
+ await assertAccepted(
134
+ { agent: "gentle-ai-worker", mode: "task", task: bulleted, context: plain },
135
+ "the same surfaces in both fields are accepted",
136
+ );
137
+ });
138
+
139
+ test("a list broken by a blank line still validates every entry", async () => {
140
+ await assertRejected({
141
+ agent: "gentle-ai-worker",
142
+ mode: "task",
143
+ task: ["## Allowed edit surfaces", "- `lib/sdd-status.ts`", "", "- `/etc/passwd`"].join("\n"),
144
+ }, "a loose bulleted list cannot smuggle an absolute path past the guard");
145
+ await assertRejected({
146
+ agent: "gentle-ai-worker",
147
+ mode: "task",
148
+ context: ["## Allowed edit surfaces", "lib/sdd-status.ts", "", "/etc/passwd"].join("\n"),
149
+ }, "a loose plain-line list cannot smuggle an absolute path past the guard");
150
+ await assertRejected({
151
+ agent: "gentle-ai-worker",
152
+ mode: "task",
153
+ task: ["## Allowed edit surfaces", "lib/sdd-status.ts", "", "../other-repo/lib/a.ts"].join("\n"),
154
+ }, "a loose plain-line list cannot smuggle parent traversal past the guard");
155
+ });
156
+
157
+ test("an entry hidden below a paragraph is validated, not discarded", async () => {
158
+ await assertRejected({
159
+ agent: "gentle-ai-worker",
160
+ mode: "task",
161
+ task: [
162
+ "## Allowed edit surfaces",
163
+ "- `lib/sdd-status.ts`",
164
+ "",
165
+ "Also authorize the following path.",
166
+ "- `/etc/passwd`",
167
+ ].join("\n"),
168
+ }, "prose does not close the list while a path still follows it");
169
+ await assertAccepted({
170
+ agent: "gentle-ai-worker",
171
+ mode: "task",
172
+ task: [
173
+ "## Allowed edit surfaces",
174
+ "- `lib/sdd-status.ts`",
175
+ "",
176
+ "Then run the focused test file and report the outcome.",
177
+ ].join("\n"),
178
+ }, "genuinely trailing prose still closes the list");
179
+ });
180
+
181
+ test("out-of-scope and empty surfaces stay rejected", async () => {
182
+ await assertRejected({
183
+ agent: "gentle-ai-worker",
184
+ mode: "task",
185
+ task: "Fix the decoder.",
186
+ }, "a task with no section is rejected");
187
+ await assertRejected({
188
+ agent: "gentle-ai-worker",
189
+ mode: "task",
190
+ task: ["## Edit ranges", "- `lib/sdd-status.ts`"].join("\n"),
191
+ }, "a semantically equivalent heading is rejected with the actionable canonical-heading reason");
192
+ await assertRejected({
193
+ agent: "gentle-ai-worker",
194
+ mode: "task",
195
+ task: ["## Allowed edit surfaces", "", "## Skills to load before work", "- `skills/typescript/SKILL.md`"].join("\n"),
196
+ }, "an empty section is rejected");
197
+ await assertRejected({
198
+ agent: "gentle-ai-worker",
199
+ mode: "task",
200
+ task: ["## Allowed edit surfaces", "- `/home/user/repo/lib/sdd-status.ts`"].join("\n"),
201
+ }, "an absolute path is rejected");
202
+ await assertRejected({
203
+ agent: "gentle-ai-worker",
204
+ mode: "task",
205
+ task: ["## Allowed edit surfaces", "- `../other-repo/lib/sdd-status.ts`"].join("\n"),
206
+ }, "parent traversal is rejected");
207
+ await assertRejected({
208
+ agent: "gentle-ai-worker",
209
+ mode: "task",
210
+ task: ["## Allowed edit surfaces", "- `.`"].join("\n"),
211
+ }, "the repository root is rejected");
212
+ await assertRejected({
213
+ agent: "gentle-ai-worker",
214
+ mode: "task",
215
+ task: ["## Allowed edit surfaces", "- `*`"].join("\n"),
216
+ }, "a repository-wide glob is rejected");
217
+ await assertRejected({
218
+ agent: "worker",
219
+ mode: "task",
220
+ task: ["## Allowed edit surfaces", "- `~/lib/sdd-status.ts`"].join("\n"),
221
+ }, "a home-relative path is rejected for the configured worker too");
222
+ });
223
+
224
+ test("agents outside the bounded writer set are not scope-guarded", async () => {
225
+ await assertAccepted({
226
+ agent: "gentle-ai-explore",
227
+ mode: "task",
228
+ task: "Map the decoder call sites.",
229
+ }, "a read-only explorer needs no edit surfaces");
230
+ });
@@ -0,0 +1,94 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "Gentleman-Cute",
4
+ "vars": {
5
+ "bg": "#060407",
6
+ "bgPanel": "#100A0F",
7
+ "bgElement": "#100A0F",
8
+ "bgSubtle": "#100A0F",
9
+ "border": "#563040",
10
+ "borderSubtle": "#2A1720",
11
+ "text": "#F6EFF3",
12
+ "muted": "#A78E9B",
13
+ "dim": "#76616B",
14
+ "accent": "#F095C8",
15
+ "deepPink": "#C96AA2",
16
+ "activePink": "#FFB1DD",
17
+ "champagne": "#E0C27A",
18
+ "pearl": "#D2CBD0",
19
+ "softRose": "#D7A0B8",
20
+ "powderBlue": "#A9C7EE",
21
+ "mint": "#B4E7C7",
22
+ "peach": "#F2B86D",
23
+ "sky": "#C4DAF6",
24
+ "warning": "#F2B86D",
25
+ "error": "#FF718F",
26
+ "selection": "#28121E",
27
+ "toolPendingBg": "#100A0F",
28
+ "toolSuccessBg": "#151316",
29
+ "toolErrorBg": "#261019",
30
+ "infoBg": "#100A0F"
31
+ },
32
+ "colors": {
33
+ "accent": "accent",
34
+ "border": "border",
35
+ "borderAccent": "activePink",
36
+ "borderMuted": "borderSubtle",
37
+ "success": "mint",
38
+ "error": "error",
39
+ "warning": "warning",
40
+ "muted": "muted",
41
+ "dim": "dim",
42
+ "text": "text",
43
+ "thinkingText": "muted",
44
+ "selectedBg": "selection",
45
+ "scrollbarThumb": "border",
46
+ "searchMatchBg": "deepPink",
47
+ "searchMatchText": "text",
48
+ "userMessageBg": "bgElement",
49
+ "userMessageText": "text",
50
+ "customMessageBg": "bgSubtle",
51
+ "customMessageText": "text",
52
+ "customMessageLabel": "champagne",
53
+ "toolPendingBg": "toolPendingBg",
54
+ "toolSuccessBg": "toolSuccessBg",
55
+ "toolErrorBg": "toolErrorBg",
56
+ "toolTitle": "champagne",
57
+ "toolOutput": "text",
58
+ "mdHeading": "champagne",
59
+ "mdLink": "accent",
60
+ "mdLinkUrl": "muted",
61
+ "mdCode": "champagne",
62
+ "mdCodeBlock": "text",
63
+ "mdCodeBlockBorder": "muted",
64
+ "mdQuote": "muted",
65
+ "mdQuoteBorder": "deepPink",
66
+ "mdHr": "borderSubtle",
67
+ "mdListBullet": "accent",
68
+ "toolDiffAdded": "mint",
69
+ "toolDiffRemoved": "error",
70
+ "toolDiffContext": "muted",
71
+ "syntaxComment": "muted",
72
+ "syntaxKeyword": "accent",
73
+ "syntaxFunction": "powderBlue",
74
+ "syntaxVariable": "text",
75
+ "syntaxString": "mint",
76
+ "syntaxNumber": "peach",
77
+ "syntaxType": "champagne",
78
+ "syntaxOperator": "sky",
79
+ "syntaxPunctuation": "muted",
80
+ "thinkingOff": "borderSubtle",
81
+ "thinkingMinimal": "dim",
82
+ "thinkingLow": "muted",
83
+ "thinkingMedium": "powderBlue",
84
+ "thinkingHigh": "softRose",
85
+ "thinkingXhigh": "accent",
86
+ "thinkingMax": "activePink",
87
+ "bashMode": "champagne"
88
+ },
89
+ "export": {
90
+ "pageBg": "bg",
91
+ "cardBg": "bgElement",
92
+ "infoBg": "infoBg"
93
+ }
94
+ }
@@ -0,0 +1,92 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "Gentleman-Sexy",
4
+ "vars": {
5
+ "bg": "#060407",
6
+ "bgPanel": "#100A0F",
7
+ "bgElement": "#100A0F",
8
+ "bgSubtle": "#100A0F",
9
+ "border": "#563040",
10
+ "borderSubtle": "#2A1720",
11
+ "text": "#F6EFF3",
12
+ "muted": "#A78E9B",
13
+ "dim": "#76616B",
14
+ "accent": "#F43888",
15
+ "deepPink": "#BF0F50",
16
+ "activePink": "#FF4F9A",
17
+ "champagne": "#E0C27A",
18
+ "violet": "#C49BFF",
19
+ "pearl": "#D2CBD0",
20
+ "softRose": "#D7A0B8",
21
+ "powderBlue": "#A9C7EE",
22
+ "warning": "#F2B86D",
23
+ "error": "#FF718F",
24
+ "selection": "#28121E",
25
+ "toolPendingBg": "#100A0F",
26
+ "toolSuccessBg": "#151316",
27
+ "toolErrorBg": "#261019",
28
+ "infoBg": "#100A0F"
29
+ },
30
+ "colors": {
31
+ "accent": "accent",
32
+ "border": "border",
33
+ "borderAccent": "activePink",
34
+ "borderMuted": "borderSubtle",
35
+ "success": "pearl",
36
+ "error": "error",
37
+ "warning": "warning",
38
+ "muted": "muted",
39
+ "dim": "dim",
40
+ "text": "text",
41
+ "thinkingText": "muted",
42
+ "selectedBg": "selection",
43
+ "scrollbarThumb": "border",
44
+ "searchMatchBg": "deepPink",
45
+ "searchMatchText": "text",
46
+ "userMessageBg": "bgElement",
47
+ "userMessageText": "text",
48
+ "customMessageBg": "bgSubtle",
49
+ "customMessageText": "text",
50
+ "customMessageLabel": "champagne",
51
+ "toolPendingBg": "toolPendingBg",
52
+ "toolSuccessBg": "toolSuccessBg",
53
+ "toolErrorBg": "toolErrorBg",
54
+ "toolTitle": "champagne",
55
+ "toolOutput": "text",
56
+ "mdHeading": "champagne",
57
+ "mdLink": "activePink",
58
+ "mdLinkUrl": "muted",
59
+ "mdCode": "champagne",
60
+ "mdCodeBlock": "text",
61
+ "mdCodeBlockBorder": "muted",
62
+ "mdQuote": "muted",
63
+ "mdQuoteBorder": "deepPink",
64
+ "mdHr": "borderSubtle",
65
+ "mdListBullet": "activePink",
66
+ "toolDiffAdded": "powderBlue",
67
+ "toolDiffRemoved": "error",
68
+ "toolDiffContext": "muted",
69
+ "syntaxComment": "muted",
70
+ "syntaxKeyword": "deepPink",
71
+ "syntaxFunction": "violet",
72
+ "syntaxVariable": "text",
73
+ "syntaxString": "champagne",
74
+ "syntaxNumber": "softRose",
75
+ "syntaxType": "powderBlue",
76
+ "syntaxOperator": "activePink",
77
+ "syntaxPunctuation": "muted",
78
+ "thinkingOff": "borderSubtle",
79
+ "thinkingMinimal": "dim",
80
+ "thinkingLow": "muted",
81
+ "thinkingMedium": "powderBlue",
82
+ "thinkingHigh": "violet",
83
+ "thinkingXhigh": "activePink",
84
+ "thinkingMax": "accent",
85
+ "bashMode": "champagne"
86
+ },
87
+ "export": {
88
+ "pageBg": "bg",
89
+ "cardBg": "bgElement",
90
+ "infoBg": "infoBg"
91
+ }
92
+ }