@letrquan/book 0.2.0 → 0.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.
- package/CHANGELOG.md +2747 -40
- package/README.md +132 -1311
- package/dist/additional-roots-H7UNAEHS.js +31 -0
- package/dist/{app-MOXXWEOY.js → app-GE4OHJOC.js} +5740 -4045
- package/dist/app-GE4OHJOC.js.map +1 -0
- package/dist/{chunk-5GDZ22YP.js → chunk-224FJZLH.js} +99 -108
- package/dist/chunk-224FJZLH.js.map +1 -0
- package/dist/chunk-2AAOF5B5.js +28 -0
- package/dist/chunk-2AAOF5B5.js.map +1 -0
- package/dist/{chunk-CAGOB2N4.js → chunk-4AS7LKKQ.js} +6 -4
- package/dist/chunk-4AS7LKKQ.js.map +1 -0
- package/dist/chunk-525CAZPY.js +120 -0
- package/dist/chunk-525CAZPY.js.map +1 -0
- package/dist/{chunk-URLQAXTR.js → chunk-56SIEMDX.js} +2 -2
- package/dist/chunk-56SIEMDX.js.map +1 -0
- package/dist/{chunk-XIFFTATU.js → chunk-5YHTKWJN.js} +5420 -4031
- package/dist/chunk-5YHTKWJN.js.map +1 -0
- package/dist/chunk-62QL5QUP.js +283 -0
- package/dist/chunk-62QL5QUP.js.map +1 -0
- package/dist/{chunk-KWHQ2XXL.js → chunk-67UZEWWF.js} +3 -3
- package/dist/chunk-67UZEWWF.js.map +1 -0
- package/dist/chunk-6OQQOMZR.js +785 -0
- package/dist/chunk-6OQQOMZR.js.map +1 -0
- package/dist/{chunk-GTVB4HEM.js → chunk-AQEQX4FF.js} +344 -315
- package/dist/chunk-AQEQX4FF.js.map +1 -0
- package/dist/chunk-C7ADUNPR.js +273 -0
- package/dist/chunk-C7ADUNPR.js.map +1 -0
- package/dist/{chunk-E75IPST5.js → chunk-EFJ2NH6E.js} +12 -58
- package/dist/chunk-EFJ2NH6E.js.map +1 -0
- package/dist/{chunk-5KLVH3PY.js → chunk-HQI7NYGX.js} +5 -3
- package/dist/chunk-HQI7NYGX.js.map +1 -0
- package/dist/chunk-IME7R2UI.js +6541 -0
- package/dist/chunk-IME7R2UI.js.map +1 -0
- package/dist/chunk-J4F2QLM2.js +273 -0
- package/dist/chunk-J4F2QLM2.js.map +1 -0
- package/dist/{chunk-MAQXCUR4.js → chunk-J62VZYOB.js} +444 -112
- package/dist/chunk-J62VZYOB.js.map +1 -0
- package/dist/chunk-JTPOI3KU.js +826 -0
- package/dist/chunk-JTPOI3KU.js.map +1 -0
- package/dist/{chunk-WKBO5R4O.js → chunk-KBQS35OV.js} +2 -2
- package/dist/chunk-KBQS35OV.js.map +1 -0
- package/dist/chunk-KXAYUIKP.js +90 -0
- package/dist/chunk-KXAYUIKP.js.map +1 -0
- package/dist/{chunk-VZQXX3WW.js → chunk-QYBD22H5.js} +1 -1
- package/dist/chunk-QYBD22H5.js.map +1 -0
- package/dist/{chunk-V4BOYR52.js → chunk-RFJ6Q6LE.js} +763 -198
- package/dist/chunk-RFJ6Q6LE.js.map +1 -0
- package/dist/{chunk-7N4J557C.js → chunk-RT5SATF7.js} +1 -1
- package/dist/chunk-RT5SATF7.js.map +1 -0
- package/dist/{chunk-C7D4NJ2D.js → chunk-S4JMID4G.js} +68 -26
- package/dist/chunk-S4JMID4G.js.map +1 -0
- package/dist/{chunk-ANSJPYGI.js → chunk-SOW4WRQP.js} +3 -3
- package/dist/chunk-SOW4WRQP.js.map +1 -0
- package/dist/{chunk-J7MIZ5CA.js → chunk-TLX3H2CL.js} +518 -79
- package/dist/chunk-TLX3H2CL.js.map +1 -0
- package/dist/{chunk-DGMQEI6Y.js → chunk-VPNLCMVR.js} +22 -9
- package/dist/chunk-VPNLCMVR.js.map +1 -0
- package/dist/{chunk-BTZZUCLI.js → chunk-W3XFHEF4.js} +173 -29
- package/dist/chunk-W3XFHEF4.js.map +1 -0
- package/dist/{chunk-574C6MQR.js → chunk-X4NJT436.js} +130 -60
- package/dist/chunk-X4NJT436.js.map +1 -0
- package/dist/chunk-X66I2NQO.js +137 -0
- package/dist/chunk-X66I2NQO.js.map +1 -0
- package/dist/chunk-XHAO3K7I.js +18 -0
- package/dist/chunk-XHAO3K7I.js.map +1 -0
- package/dist/{chunk-3U5IBM24.js → chunk-Y2VHN7TC.js} +2 -2
- package/dist/chunk-Y2VHN7TC.js.map +1 -0
- package/dist/chunk-YC6W4EJH.js +947 -0
- package/dist/chunk-YC6W4EJH.js.map +1 -0
- package/dist/{chunk-24AXE6SP.js → chunk-ZPSZZUWF.js} +1 -1
- package/dist/chunk-ZPSZZUWF.js.map +1 -0
- package/dist/{command-approvals-6Y57VCWZ.js → command-approvals-VBIU6BLM.js} +6 -5
- package/dist/context-CBOBDY5Q.js +38 -0
- package/dist/{hook-approvals-CTUFKEJT.js → hook-approvals-ZVT4V7IM.js} +5 -5
- package/dist/index.js +996 -155
- package/dist/index.js.map +1 -1
- package/dist/{interactive-assets-CCAAWVKH.js → interactive-assets-T4I4SEHU.js} +13 -9
- package/dist/interactive-assets-T4I4SEHU.js.map +1 -0
- package/dist/job-runner.js +159 -111
- package/dist/job-runner.js.map +1 -1
- package/dist/job-supervisor.d.ts +2 -0
- package/dist/job-supervisor.js +112 -0
- package/dist/job-supervisor.js.map +1 -0
- package/dist/loader-S77OVTHH.js +18 -0
- package/dist/{mcp-approvals-WNPH65BK.js → mcp-approvals-HJ2VDYMC.js} +5 -5
- package/dist/{mcp-config-YIJIES2C.js → mcp-config-RNB5LEVE.js} +3 -3
- package/dist/memory-store-DZUT5HUH.js +75 -0
- package/dist/{model-window-store-YFVNXCIP.js → model-window-store-MTSQ5JDJ.js} +8 -4
- package/dist/openai-compatible-2OB54YST.js +14 -0
- package/dist/{permission-approvals-76PVREFD.js → permission-approvals-YLV6UC5W.js} +5 -5
- package/dist/permissions-DHOKF3W2.js +45 -0
- package/dist/sandbox-WRYTZH3D.js +41 -0
- package/dist/{scrollback-LUKLIBVI.js → scrollback-35ME2GFX.js} +32 -22
- package/dist/scrollback-35ME2GFX.js.map +1 -0
- package/dist/sdk.d.ts +2219 -2361
- package/dist/sdk.js +53 -38
- package/dist/sdk.js.map +1 -1
- package/dist/settings-loader-JUNPGAAM.js +35 -0
- package/dist/settings-loader-JUNPGAAM.js.map +1 -0
- package/dist/{shell-selection-V6QAYXPX.js → shell-selection-CDHGJ4GC.js} +2 -2
- package/dist/shell-selection-CDHGJ4GC.js.map +1 -0
- package/package.json +23 -22
- package/dist/app-MOXXWEOY.js.map +0 -1
- package/dist/chunk-24AXE6SP.js.map +0 -1
- package/dist/chunk-3U5IBM24.js.map +0 -1
- package/dist/chunk-574C6MQR.js.map +0 -1
- package/dist/chunk-5GDZ22YP.js.map +0 -1
- package/dist/chunk-5KLVH3PY.js.map +0 -1
- package/dist/chunk-7N4J557C.js.map +0 -1
- package/dist/chunk-A7JLBK2Y.js +0 -3506
- package/dist/chunk-A7JLBK2Y.js.map +0 -1
- package/dist/chunk-ANSJPYGI.js.map +0 -1
- package/dist/chunk-BTZZUCLI.js.map +0 -1
- package/dist/chunk-C7D4NJ2D.js.map +0 -1
- package/dist/chunk-CAGOB2N4.js.map +0 -1
- package/dist/chunk-DGMQEI6Y.js.map +0 -1
- package/dist/chunk-E75IPST5.js.map +0 -1
- package/dist/chunk-EYGD6X2T.js +0 -180
- package/dist/chunk-EYGD6X2T.js.map +0 -1
- package/dist/chunk-GTVB4HEM.js.map +0 -1
- package/dist/chunk-J7MIZ5CA.js.map +0 -1
- package/dist/chunk-KWHQ2XXL.js.map +0 -1
- package/dist/chunk-L6LK2QIQ.js +0 -657
- package/dist/chunk-L6LK2QIQ.js.map +0 -1
- package/dist/chunk-MAQXCUR4.js.map +0 -1
- package/dist/chunk-S4XL7HOM.js +0 -402
- package/dist/chunk-S4XL7HOM.js.map +0 -1
- package/dist/chunk-URLQAXTR.js.map +0 -1
- package/dist/chunk-V4BOYR52.js.map +0 -1
- package/dist/chunk-VZQXX3WW.js.map +0 -1
- package/dist/chunk-WKBO5R4O.js.map +0 -1
- package/dist/chunk-XIFFTATU.js.map +0 -1
- package/dist/context-ZC5IFEAX.js +0 -25
- package/dist/interactive-assets-CCAAWVKH.js.map +0 -1
- package/dist/loader-4IDS2RIE.js +0 -15
- package/dist/openai-compatible-RHZUBHV6.js +0 -10
- package/dist/permissions-CHCKTFQQ.js +0 -28
- package/dist/sandbox-CNVAQDA7.js +0 -23
- package/dist/scrollback-LUKLIBVI.js.map +0 -1
- package/dist/settings-loader-M2QP5TX2.js +0 -21
- package/patches/ink+6.8.0.patch +0 -13
- package/scripts/apply-ink-patch.mjs +0 -29
- package/scripts/ink-patch.mjs +0 -59
- package/scripts/verify-ink-patch.mjs +0 -11
- /package/dist/{command-approvals-6Y57VCWZ.js.map → additional-roots-H7UNAEHS.js.map} +0 -0
- /package/dist/{context-ZC5IFEAX.js.map → command-approvals-VBIU6BLM.js.map} +0 -0
- /package/dist/{hook-approvals-CTUFKEJT.js.map → context-CBOBDY5Q.js.map} +0 -0
- /package/dist/{loader-4IDS2RIE.js.map → hook-approvals-ZVT4V7IM.js.map} +0 -0
- /package/dist/{mcp-approvals-WNPH65BK.js.map → loader-S77OVTHH.js.map} +0 -0
- /package/dist/{mcp-config-YIJIES2C.js.map → mcp-approvals-HJ2VDYMC.js.map} +0 -0
- /package/dist/{model-window-store-YFVNXCIP.js.map → mcp-config-RNB5LEVE.js.map} +0 -0
- /package/dist/{openai-compatible-RHZUBHV6.js.map → memory-store-DZUT5HUH.js.map} +0 -0
- /package/dist/{permission-approvals-76PVREFD.js.map → model-window-store-MTSQ5JDJ.js.map} +0 -0
- /package/dist/{permissions-CHCKTFQQ.js.map → openai-compatible-2OB54YST.js.map} +0 -0
- /package/dist/{sandbox-CNVAQDA7.js.map → permission-approvals-YLV6UC5W.js.map} +0 -0
- /package/dist/{settings-loader-M2QP5TX2.js.map → permissions-DHOKF3W2.js.map} +0 -0
- /package/dist/{shell-selection-V6QAYXPX.js.map → sandbox-WRYTZH3D.js.map} +0 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// src/types/theme.ts
|
|
2
|
+
var DEFAULT_THEME = {
|
|
3
|
+
brand: "#5E5CE6",
|
|
4
|
+
brandShimmer: "#8E8CFF",
|
|
5
|
+
text: "#F5F5F7",
|
|
6
|
+
inverseText: "#111113",
|
|
7
|
+
inactive: "#6E6E73",
|
|
8
|
+
subtle: "#98989D",
|
|
9
|
+
suggestion: "#8E8E93",
|
|
10
|
+
permission: "#FF9F0A",
|
|
11
|
+
remember: "#BF5AF2",
|
|
12
|
+
surface: "#1C1C1E",
|
|
13
|
+
surfaceActive: "#2C2C2E",
|
|
14
|
+
border: "#3A3A3C",
|
|
15
|
+
selectionText: "#FFFFFF",
|
|
16
|
+
userAccent: "#0A84FF",
|
|
17
|
+
assistantAccent: "#64D2FF",
|
|
18
|
+
toolRail: "#636366",
|
|
19
|
+
success: "#30D158",
|
|
20
|
+
error: "#FF453A",
|
|
21
|
+
warning: "#FF9F0A",
|
|
22
|
+
merged: "#66D4CF",
|
|
23
|
+
promptBorder: "#0A84FF",
|
|
24
|
+
planMode: "#BF5AF2",
|
|
25
|
+
autoAccept: "#30D158",
|
|
26
|
+
bashBorder: "#FF9F0A",
|
|
27
|
+
// `default` is the quiet mode: neutral grey, so an ordinary session carries
|
|
28
|
+
// no permission-mode signal at all.
|
|
29
|
+
modeDefault: "#98989D",
|
|
30
|
+
modePlan: "#BF5AF2",
|
|
31
|
+
modeAcceptEdits: "#30D158",
|
|
32
|
+
modeAuto: "#66D4CF",
|
|
33
|
+
modeDontAsk: "#FF453A",
|
|
34
|
+
modeBypass: "#FF9F0A",
|
|
35
|
+
diffAdded: "#173A28",
|
|
36
|
+
diffRemoved: "#3A1E22",
|
|
37
|
+
diffAddedWord: "#24633D",
|
|
38
|
+
diffRemovedWord: "#6B2932",
|
|
39
|
+
diffAddedDimmed: "#122B1E",
|
|
40
|
+
diffRemovedDimmed: "#2B181C",
|
|
41
|
+
usageMeter: "#66D4CF",
|
|
42
|
+
usageMeterHigh: "#FF9F0A",
|
|
43
|
+
usageMeterCritical: "#FF453A",
|
|
44
|
+
// The spinner is the agent speaking, so it keeps the cyan identity.
|
|
45
|
+
shimmerPair: ["#64D2FF", "#A5E3FF"],
|
|
46
|
+
subagentColors: [
|
|
47
|
+
"#FF453A",
|
|
48
|
+
"#FF9F0A",
|
|
49
|
+
"#FFD60A",
|
|
50
|
+
"#30D158",
|
|
51
|
+
"#64D2FF",
|
|
52
|
+
"#0A84FF",
|
|
53
|
+
"#BF5AF2",
|
|
54
|
+
"#5E5CE6"
|
|
55
|
+
],
|
|
56
|
+
mdCodeBackground: "#161618",
|
|
57
|
+
mdCodeBorder: "#3A3A3C",
|
|
58
|
+
mdCodeText: "#F5F5F7",
|
|
59
|
+
mdCodeKeyword: "#BF5AF2",
|
|
60
|
+
mdCodeString: "#30D158",
|
|
61
|
+
mdCodeComment: "#6E6E73",
|
|
62
|
+
mdCodeNumber: "#FF9F0A",
|
|
63
|
+
mdCodeFunction: "#64D2FF",
|
|
64
|
+
mdCodeLineNumber: "#636366",
|
|
65
|
+
mdInlineCodeBg: "#2C2C2E",
|
|
66
|
+
mdInlineCodeText: "#66D4CF",
|
|
67
|
+
// A three-step brightness ramp, all bold. Depth is legible only if these
|
|
68
|
+
// differ from each other *and* from `text` — otherwise a heading is
|
|
69
|
+
// indistinguishable from a bold run in body copy.
|
|
70
|
+
mdHeadingH1: "#FFFFFF",
|
|
71
|
+
mdHeadingH2: "#E5E5EA",
|
|
72
|
+
mdHeading: "#AEAEB2",
|
|
73
|
+
mdBlockquoteBorder: "#636366",
|
|
74
|
+
mdBlockquoteText: "#98989D",
|
|
75
|
+
mdLink: "#66D4CF",
|
|
76
|
+
mdListMarker: "#0A84FF",
|
|
77
|
+
mdHr: "#3A3C36",
|
|
78
|
+
mdTableBorder: "#3A3C36",
|
|
79
|
+
mdThinkBg: "#161618",
|
|
80
|
+
mdThinkBorder: "#3A3C36",
|
|
81
|
+
mdThinkText: "#8E8E93",
|
|
82
|
+
mdTurnSeparator: "#3A3A3C",
|
|
83
|
+
mdCheckboxChecked: "#30D158",
|
|
84
|
+
mdCheckboxUnchecked: "#6E6E73",
|
|
85
|
+
userBg: "#202022",
|
|
86
|
+
userText: "#FFFFFF"
|
|
87
|
+
};
|
|
88
|
+
var FOLIO_THEME = {
|
|
89
|
+
brand: "#D9B36C",
|
|
90
|
+
brandShimmer: "#F2D9A0",
|
|
91
|
+
text: "#E8E3D9",
|
|
92
|
+
inverseText: "#15140F",
|
|
93
|
+
inactive: "#6F6A61",
|
|
94
|
+
subtle: "#A09A8F",
|
|
95
|
+
suggestion: "#8F897E",
|
|
96
|
+
permission: "#E5894F",
|
|
97
|
+
remember: "#B8A1D9",
|
|
98
|
+
surface: "#1D1C1A",
|
|
99
|
+
surfaceActive: "#2B2926",
|
|
100
|
+
border: "#3B3834",
|
|
101
|
+
selectionText: "#F6F1E7",
|
|
102
|
+
userAccent: "#D9B36C",
|
|
103
|
+
assistantAccent: "#D9B36C",
|
|
104
|
+
toolRail: "#4D4943",
|
|
105
|
+
success: "#93B97F",
|
|
106
|
+
error: "#E0675C",
|
|
107
|
+
warning: "#E5894F",
|
|
108
|
+
merged: "#8EBBB5",
|
|
109
|
+
// The composer border is a hairline, not a signal. Its accent lives on the
|
|
110
|
+
// prompt glyph (`userAccent`).
|
|
111
|
+
promptBorder: "#4D4943",
|
|
112
|
+
planMode: "#B8A1D9",
|
|
113
|
+
autoAccept: "#93B97F",
|
|
114
|
+
bashBorder: "#E5894F",
|
|
115
|
+
modeDefault: "#A09A8F",
|
|
116
|
+
modePlan: "#B8A1D9",
|
|
117
|
+
modeAcceptEdits: "#93B97F",
|
|
118
|
+
modeAuto: "#8EBBB5",
|
|
119
|
+
modeDontAsk: "#E0675C",
|
|
120
|
+
modeBypass: "#E5894F",
|
|
121
|
+
diffAdded: "#1F2E20",
|
|
122
|
+
diffRemoved: "#3A2220",
|
|
123
|
+
diffAddedWord: "#2F4D2F",
|
|
124
|
+
diffRemovedWord: "#5E302B",
|
|
125
|
+
diffAddedDimmed: "#18231A",
|
|
126
|
+
diffRemovedDimmed: "#2A1A18",
|
|
127
|
+
usageMeter: "#8EBBB5",
|
|
128
|
+
usageMeterHigh: "#E5894F",
|
|
129
|
+
usageMeterCritical: "#E0675C",
|
|
130
|
+
shimmerPair: ["#D9B36C", "#F2D9A0"],
|
|
131
|
+
subagentColors: [
|
|
132
|
+
"#E0675C",
|
|
133
|
+
"#E5894F",
|
|
134
|
+
"#D9B36C",
|
|
135
|
+
"#93B97F",
|
|
136
|
+
"#8EBBB5",
|
|
137
|
+
"#8FAFD6",
|
|
138
|
+
"#B8A1D9",
|
|
139
|
+
"#D59AB4"
|
|
140
|
+
],
|
|
141
|
+
mdCodeBackground: "#191816",
|
|
142
|
+
mdCodeBorder: "#3B3834",
|
|
143
|
+
mdCodeText: "#E8E3D9",
|
|
144
|
+
mdCodeKeyword: "#C4A3D6",
|
|
145
|
+
mdCodeString: "#A7C48B",
|
|
146
|
+
mdCodeComment: "#6F6A61",
|
|
147
|
+
mdCodeNumber: "#E3A774",
|
|
148
|
+
mdCodeFunction: "#8FB4D9",
|
|
149
|
+
mdCodeLineNumber: "#55514A",
|
|
150
|
+
mdInlineCodeBg: "#2B2926",
|
|
151
|
+
mdInlineCodeText: "#9FC3BE",
|
|
152
|
+
// Gilt for the two headings an answer actually uses, ivory-grey below them.
|
|
153
|
+
mdHeadingH1: "#F2D9A0",
|
|
154
|
+
mdHeadingH2: "#D9B36C",
|
|
155
|
+
mdHeading: "#BDB6AA",
|
|
156
|
+
mdBlockquoteBorder: "#5A554D",
|
|
157
|
+
mdBlockquoteText: "#A09A8F",
|
|
158
|
+
mdLink: "#9FC3BE",
|
|
159
|
+
mdListMarker: "#D9B36C",
|
|
160
|
+
mdHr: "#3B3834",
|
|
161
|
+
mdTableBorder: "#5A554D",
|
|
162
|
+
mdThinkBg: "#191816",
|
|
163
|
+
mdThinkBorder: "#3B3834",
|
|
164
|
+
mdThinkText: "#8F897E",
|
|
165
|
+
mdTurnSeparator: "#3B3834",
|
|
166
|
+
mdCheckboxChecked: "#93B97F",
|
|
167
|
+
mdCheckboxUnchecked: "#6F6A61",
|
|
168
|
+
userBg: "#24221E",
|
|
169
|
+
userText: "#F6F1E7"
|
|
170
|
+
};
|
|
171
|
+
var RUBRIC_THEME = {
|
|
172
|
+
...FOLIO_THEME,
|
|
173
|
+
brand: "#E4573D",
|
|
174
|
+
brandShimmer: "#F28A6E",
|
|
175
|
+
userAccent: "#E4573D",
|
|
176
|
+
// The agent's own voice is ink, not rubric.
|
|
177
|
+
assistantAccent: "#F0EBE1",
|
|
178
|
+
shimmerPair: ["#F0EBE1", "#A09A8F"],
|
|
179
|
+
error: "#EF6F95",
|
|
180
|
+
warning: "#E3A84E",
|
|
181
|
+
permission: "#E3A84E",
|
|
182
|
+
bashBorder: "#E3A84E",
|
|
183
|
+
modeBypass: "#E3A84E",
|
|
184
|
+
modeDontAsk: "#EF6F95",
|
|
185
|
+
usageMeterHigh: "#E3A84E",
|
|
186
|
+
usageMeterCritical: "#EF6F95",
|
|
187
|
+
// The ink ramp, re-tuned for a long read. Folio's body is a warm ivory at
|
|
188
|
+
// roughly 15:1 on a near-black terminal, which glares; Rubric's body comes
|
|
189
|
+
// down one step to about 12:1, so the headings above it — and your own
|
|
190
|
+
// prompt — have somewhere to stand. Inline code and links take a warm tone
|
|
191
|
+
// rather than Folio's cool one, which sat beside the cinnabar as a third hue
|
|
192
|
+
// in a two-colour palette, and `inactive` clears 4.5:1 so a dimmed row is
|
|
193
|
+
// still readable rather than merely present.
|
|
194
|
+
text: "#CFC9BE",
|
|
195
|
+
mdCodeText: "#CFC9BE",
|
|
196
|
+
mdHeadingH1: "#F4EFE6",
|
|
197
|
+
mdHeadingH2: "#EFE9DE",
|
|
198
|
+
mdHeading: "#E2DCD0",
|
|
199
|
+
mdInlineCodeText: "#CDB791",
|
|
200
|
+
mdLink: "#CDB791",
|
|
201
|
+
inactive: "#857F74",
|
|
202
|
+
userText: "#F4EFE6",
|
|
203
|
+
mdListMarker: "#E4573D",
|
|
204
|
+
subagentColors: [
|
|
205
|
+
"#E4573D",
|
|
206
|
+
"#E3A84E",
|
|
207
|
+
"#D9B36C",
|
|
208
|
+
"#93B97F",
|
|
209
|
+
"#8EBBB5",
|
|
210
|
+
"#8FAFD6",
|
|
211
|
+
"#B8A1D9",
|
|
212
|
+
"#EF6F95"
|
|
213
|
+
]
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// src/tui/theme.ts
|
|
217
|
+
import { createContext, useContext } from "react";
|
|
218
|
+
import { readFileSync, existsSync, readdirSync } from "fs";
|
|
219
|
+
import { join } from "path";
|
|
220
|
+
var APPLE_THEME = { ...DEFAULT_THEME };
|
|
221
|
+
var DEFAULT_THEME_NAME = "rubric";
|
|
222
|
+
var CUSTOM_THEME_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
|
|
223
|
+
var ThemeContext = createContext(DEFAULT_THEME);
|
|
224
|
+
function useTheme() {
|
|
225
|
+
return useContext(ThemeContext);
|
|
226
|
+
}
|
|
227
|
+
function listCustomThemes(workspace) {
|
|
228
|
+
const themesDir = join(workspace, ".book", "themes");
|
|
229
|
+
try {
|
|
230
|
+
return readdirSync(themesDir, { withFileTypes: true }).filter((entry) => entry.isFile() && entry.name.endsWith(".json")).map((entry) => entry.name.slice(0, -".json".length)).filter((name) => CUSTOM_THEME_NAME.test(name)).sort((a, b) => a.localeCompare(b));
|
|
231
|
+
} catch {
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function loadCustomTheme(workspace, name) {
|
|
236
|
+
if (!CUSTOM_THEME_NAME.test(name)) return null;
|
|
237
|
+
const themePath = join(workspace, ".book", "themes", `${name}.json`);
|
|
238
|
+
if (!existsSync(themePath)) return null;
|
|
239
|
+
try {
|
|
240
|
+
const raw = readFileSync(themePath, "utf-8");
|
|
241
|
+
const parsed = JSON.parse(raw);
|
|
242
|
+
const userText = parsed.userText ?? parsed.text ?? RUBRIC_THEME.userText;
|
|
243
|
+
return { ...RUBRIC_THEME, ...parsed, userText };
|
|
244
|
+
} catch {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function resolveTheme(workspace, preference) {
|
|
249
|
+
const requested = preference.trim();
|
|
250
|
+
const builtin = requested.toLowerCase();
|
|
251
|
+
if (builtin === "apple" || builtin === "apple-dark") {
|
|
252
|
+
return { preference: "apple", resolvedName: "apple", tokens: APPLE_THEME };
|
|
253
|
+
}
|
|
254
|
+
if (builtin === "folio") {
|
|
255
|
+
return { preference: "folio", resolvedName: "folio", tokens: FOLIO_THEME };
|
|
256
|
+
}
|
|
257
|
+
if (builtin === "rubric") {
|
|
258
|
+
return { preference: "rubric", resolvedName: "rubric", tokens: RUBRIC_THEME };
|
|
259
|
+
}
|
|
260
|
+
if (!requested) return null;
|
|
261
|
+
const custom = loadCustomTheme(workspace, requested);
|
|
262
|
+
return custom ? { preference: requested, resolvedName: requested, tokens: custom } : null;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
export {
|
|
266
|
+
RUBRIC_THEME,
|
|
267
|
+
DEFAULT_THEME_NAME,
|
|
268
|
+
ThemeContext,
|
|
269
|
+
useTheme,
|
|
270
|
+
listCustomThemes,
|
|
271
|
+
resolveTheme
|
|
272
|
+
};
|
|
273
|
+
//# sourceMappingURL=chunk-J4F2QLM2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/theme.ts","../src/tui/theme.ts"],"sourcesContent":["/**\n * Theme token system matching Claude Code's color token architecture.\n * All values are Ink-compatible color strings (named colors, hex, rgb, ansi256, ansi:<name>).\n */\nexport interface ThemeTokens {\n /** Identity */\n brand: string;\n brandShimmer: string;\n\n /** Text */\n text: string;\n inverseText: string;\n inactive: string;\n subtle: string;\n suggestion: string;\n permission: string;\n remember: string;\n\n /** Shared TUI chrome */\n /**\n * Panel fill.\n *\n * Built-in components fill only *verbatim* content — a code block keeps\n * `mdCodeBackground`. Secondary content (expanded tool output, reasoning)\n * gets a left rail and nothing else, so no built-in currently renders this\n * token or `mdThinkBg`. Both stay in the contract for custom themes in\n * `.book/themes/*.json`.\n */\n surface: string;\n surfaceActive: string;\n border: string;\n selectionText: string;\n userAccent: string;\n assistantAccent: string;\n toolRail: string;\n\n /** Status */\n success: string;\n error: string;\n warning: string;\n merged: string;\n\n /** Mode borders */\n promptBorder: string;\n planMode: string;\n autoAccept: string;\n bashBorder: string;\n\n /** Permission mode colors (one per mode) */\n modeDefault: string;\n modePlan: string;\n modeAcceptEdits: string;\n modeAuto: string;\n modeDontAsk: string;\n modeBypass: string;\n\n /** Diff rendering */\n diffAdded: string;\n diffRemoved: string;\n diffAddedWord: string;\n diffRemovedWord: string;\n diffAddedDimmed: string;\n diffRemovedDimmed: string;\n\n /** Usage meter */\n usageMeter: string;\n usageMeterHigh: string;\n usageMeterCritical: string;\n\n /** Shimmer pairs for animated gradients */\n shimmerPair: [string, string];\n\n /** Subagent colors (8 named colors) */\n subagentColors: string[];\n\n /** Markdown rendering */\n mdCodeBackground: string;\n mdCodeBorder: string;\n mdCodeText: string;\n mdCodeKeyword: string;\n mdCodeString: string;\n mdCodeComment: string;\n mdCodeNumber: string;\n mdCodeFunction: string;\n mdCodeLineNumber: string;\n /**\n * Retained for custom theme files that still set it; inline code renders\n * with `mdInlineCodeText` alone and never paints a background.\n */\n mdInlineCodeBg: string;\n mdInlineCodeText: string;\n mdHeading: string;\n mdHeadingH1: string;\n mdHeadingH2: string;\n mdBlockquoteBorder: string;\n mdBlockquoteText: string;\n mdLink: string;\n mdListMarker: string;\n mdHr: string;\n mdTableBorder: string;\n mdThinkBg: string;\n mdThinkBorder: string;\n mdThinkText: string;\n mdTurnSeparator: string;\n mdCheckboxChecked: string;\n mdCheckboxUnchecked: string;\n\n /** User message background */\n userBg: string;\n /** Your own prompt in the transcript: the brightest ink, so each turn is a landmark. */\n userText: string;\n}\n\n/**\n * Apple-inspired default palette: near-black neutral surfaces, bright grey\n * text, and one blue action accent. Every other hue is a system colour that\n * appears only when a state needs attention, so ordinary chrome never competes\n * with the work.\n *\n * Roles stay distinct: blue is the user and the composer (the things you act\n * on), cyan is the agent speaking, indigo is product chrome, teal carries\n * references, and the orange/red/green trio is status.\n */\nexport const DEFAULT_THEME: ThemeTokens = {\n brand: '#5E5CE6',\n brandShimmer: '#8E8CFF',\n\n text: '#F5F5F7',\n inverseText: '#111113',\n inactive: '#6E6E73',\n subtle: '#98989D',\n suggestion: '#8E8E93',\n permission: '#FF9F0A',\n remember: '#BF5AF2',\n\n surface: '#1C1C1E',\n surfaceActive: '#2C2C2E',\n border: '#3A3A3C',\n selectionText: '#FFFFFF',\n userAccent: '#0A84FF',\n assistantAccent: '#64D2FF',\n toolRail: '#636366',\n\n success: '#30D158',\n error: '#FF453A',\n warning: '#FF9F0A',\n merged: '#66D4CF',\n\n promptBorder: '#0A84FF',\n planMode: '#BF5AF2',\n autoAccept: '#30D158',\n bashBorder: '#FF9F0A',\n\n // `default` is the quiet mode: neutral grey, so an ordinary session carries\n // no permission-mode signal at all.\n modeDefault: '#98989D',\n modePlan: '#BF5AF2',\n modeAcceptEdits: '#30D158',\n modeAuto: '#66D4CF',\n modeDontAsk: '#FF453A',\n modeBypass: '#FF9F0A',\n\n diffAdded: '#173A28',\n diffRemoved: '#3A1E22',\n diffAddedWord: '#24633D',\n diffRemovedWord: '#6B2932',\n diffAddedDimmed: '#122B1E',\n diffRemovedDimmed: '#2B181C',\n\n usageMeter: '#66D4CF',\n usageMeterHigh: '#FF9F0A',\n usageMeterCritical: '#FF453A',\n\n // The spinner is the agent speaking, so it keeps the cyan identity.\n shimmerPair: ['#64D2FF', '#A5E3FF'],\n\n subagentColors: [\n '#FF453A',\n '#FF9F0A',\n '#FFD60A',\n '#30D158',\n '#64D2FF',\n '#0A84FF',\n '#BF5AF2',\n '#5E5CE6',\n ],\n\n mdCodeBackground: '#161618',\n mdCodeBorder: '#3A3A3C',\n mdCodeText: '#F5F5F7',\n mdCodeKeyword: '#BF5AF2',\n mdCodeString: '#30D158',\n mdCodeComment: '#6E6E73',\n mdCodeNumber: '#FF9F0A',\n mdCodeFunction: '#64D2FF',\n mdCodeLineNumber: '#636366',\n mdInlineCodeBg: '#2C2C2E',\n mdInlineCodeText: '#66D4CF',\n // A three-step brightness ramp, all bold. Depth is legible only if these\n // differ from each other *and* from `text` — otherwise a heading is\n // indistinguishable from a bold run in body copy.\n mdHeadingH1: '#FFFFFF',\n mdHeadingH2: '#E5E5EA',\n mdHeading: '#AEAEB2',\n mdBlockquoteBorder: '#636366',\n mdBlockquoteText: '#98989D',\n mdLink: '#66D4CF',\n mdListMarker: '#0A84FF',\n mdHr: '#3A3C36',\n mdTableBorder: '#3A3C36',\n mdThinkBg: '#161618',\n mdThinkBorder: '#3A3C36',\n mdThinkText: '#8E8E93',\n mdTurnSeparator: '#3A3A3C',\n mdCheckboxChecked: '#30D158',\n mdCheckboxUnchecked: '#6E6E73',\n\n userBg: '#202022',\n userText: '#FFFFFF',\n};\n\n/**\n * Folio: ink on dark paper, with one gilt accent.\n *\n * Where the Apple palette gives every role its own system hue, Folio leans on\n * value and weight. Text is a warm ivory, secondary text steps down through\n * warm greys, and a single gold, like the gilt title on a spine, marks the few\n * places you act or look first: the prompt glyph, your own turns, headings,\n * list markers and the spinner. Status colours are muted versions of the usual\n * trio (sage, brick, burnt orange). They still read at a glance, but they no\n * longer shout over the prose around them.\n */\nexport const FOLIO_THEME: ThemeTokens = {\n brand: '#D9B36C',\n brandShimmer: '#F2D9A0',\n\n text: '#E8E3D9',\n inverseText: '#15140F',\n inactive: '#6F6A61',\n subtle: '#A09A8F',\n suggestion: '#8F897E',\n permission: '#E5894F',\n remember: '#B8A1D9',\n\n surface: '#1D1C1A',\n surfaceActive: '#2B2926',\n border: '#3B3834',\n selectionText: '#F6F1E7',\n userAccent: '#D9B36C',\n assistantAccent: '#D9B36C',\n toolRail: '#4D4943',\n\n success: '#93B97F',\n error: '#E0675C',\n warning: '#E5894F',\n merged: '#8EBBB5',\n\n // The composer border is a hairline, not a signal. Its accent lives on the\n // prompt glyph (`userAccent`).\n promptBorder: '#4D4943',\n planMode: '#B8A1D9',\n autoAccept: '#93B97F',\n bashBorder: '#E5894F',\n\n modeDefault: '#A09A8F',\n modePlan: '#B8A1D9',\n modeAcceptEdits: '#93B97F',\n modeAuto: '#8EBBB5',\n modeDontAsk: '#E0675C',\n modeBypass: '#E5894F',\n\n diffAdded: '#1F2E20',\n diffRemoved: '#3A2220',\n diffAddedWord: '#2F4D2F',\n diffRemovedWord: '#5E302B',\n diffAddedDimmed: '#18231A',\n diffRemovedDimmed: '#2A1A18',\n\n usageMeter: '#8EBBB5',\n usageMeterHigh: '#E5894F',\n usageMeterCritical: '#E0675C',\n\n shimmerPair: ['#D9B36C', '#F2D9A0'],\n\n subagentColors: [\n '#E0675C',\n '#E5894F',\n '#D9B36C',\n '#93B97F',\n '#8EBBB5',\n '#8FAFD6',\n '#B8A1D9',\n '#D59AB4',\n ],\n\n mdCodeBackground: '#191816',\n mdCodeBorder: '#3B3834',\n mdCodeText: '#E8E3D9',\n mdCodeKeyword: '#C4A3D6',\n mdCodeString: '#A7C48B',\n mdCodeComment: '#6F6A61',\n mdCodeNumber: '#E3A774',\n mdCodeFunction: '#8FB4D9',\n mdCodeLineNumber: '#55514A',\n mdInlineCodeBg: '#2B2926',\n mdInlineCodeText: '#9FC3BE',\n // Gilt for the two headings an answer actually uses, ivory-grey below them.\n mdHeadingH1: '#F2D9A0',\n mdHeadingH2: '#D9B36C',\n mdHeading: '#BDB6AA',\n mdBlockquoteBorder: '#5A554D',\n mdBlockquoteText: '#A09A8F',\n mdLink: '#9FC3BE',\n mdListMarker: '#D9B36C',\n mdHr: '#3B3834',\n mdTableBorder: '#5A554D',\n mdThinkBg: '#191816',\n mdThinkBorder: '#3B3834',\n mdThinkText: '#8F897E',\n mdTurnSeparator: '#3B3834',\n mdCheckboxChecked: '#93B97F',\n mdCheckboxUnchecked: '#6F6A61',\n\n userBg: '#24221E',\n userText: '#F6F1E7',\n};\n\n/**\n * Rubric: two-colour printing, the way manuscripts were rubricated.\n *\n * The body is set in ink (Folio's warm ivory and greys). One cinnabar red is\n * reserved for the marks a reader navigates by: the pilcrow that opens each of\n * your turns and the composer, the section sign before a heading, list\n * markers, and the drop cap on an empty page. The agent speaks in ink, spinner\n * included, so red never reads as an alarm. Because red is the accent, errors\n * move to a rose that stays distinct from it, and warnings to amber.\n */\nexport const RUBRIC_THEME: ThemeTokens = {\n ...FOLIO_THEME,\n brand: '#E4573D',\n brandShimmer: '#F28A6E',\n userAccent: '#E4573D',\n // The agent's own voice is ink, not rubric.\n assistantAccent: '#F0EBE1',\n shimmerPair: ['#F0EBE1', '#A09A8F'],\n\n error: '#EF6F95',\n warning: '#E3A84E',\n permission: '#E3A84E',\n bashBorder: '#E3A84E',\n modeBypass: '#E3A84E',\n modeDontAsk: '#EF6F95',\n usageMeterHigh: '#E3A84E',\n usageMeterCritical: '#EF6F95',\n\n // The ink ramp, re-tuned for a long read. Folio's body is a warm ivory at\n // roughly 15:1 on a near-black terminal, which glares; Rubric's body comes\n // down one step to about 12:1, so the headings above it — and your own\n // prompt — have somewhere to stand. Inline code and links take a warm tone\n // rather than Folio's cool one, which sat beside the cinnabar as a third hue\n // in a two-colour palette, and `inactive` clears 4.5:1 so a dimmed row is\n // still readable rather than merely present.\n text: '#CFC9BE',\n mdCodeText: '#CFC9BE',\n mdHeadingH1: '#F4EFE6',\n mdHeadingH2: '#EFE9DE',\n mdHeading: '#E2DCD0',\n mdInlineCodeText: '#CDB791',\n mdLink: '#CDB791',\n inactive: '#857F74',\n userText: '#F4EFE6',\n\n mdListMarker: '#E4573D',\n\n subagentColors: [\n '#E4573D',\n '#E3A84E',\n '#D9B36C',\n '#93B97F',\n '#8EBBB5',\n '#8FAFD6',\n '#B8A1D9',\n '#EF6F95',\n ],\n};\n","import { createContext, useContext } from 'react';\nimport type { ThemeTokens } from '../types/theme.js';\nimport { DEFAULT_THEME, FOLIO_THEME, RUBRIC_THEME } from '../types/theme.js';\nimport { readFileSync, existsSync, readdirSync } from 'fs';\nimport { join } from 'path';\n\n/**\n * Apple-inspired default palette: near-black neutral surfaces, bright grey\n * text, and one blue action accent. Every other hue is a system colour that\n * appears only when a state needs attention, so ordinary chrome never competes\n * with the work.\n */\nexport const APPLE_THEME: ThemeTokens = { ...DEFAULT_THEME };\n\n/** Warm ink on dark paper with one gilt accent. See {@link FOLIO_THEME}. */\nexport { FOLIO_THEME };\n\n/** Ink with cinnabar marks, like a rubricated manuscript. See {@link RUBRIC_THEME}. */\nexport { RUBRIC_THEME };\n\n/** The theme a session gets when settings name none. */\nexport const DEFAULT_THEME_NAME = 'rubric';\n\nexport interface ResolvedTheme {\n preference: string;\n resolvedName: string;\n tokens: ThemeTokens;\n}\n\nconst CUSTOM_THEME_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\n\n/**\n * React context for theme tokens.\n * Components that render colors read from this instead of hardcoded strings,\n * so custom themes can override the palette globally.\n */\nexport const ThemeContext = createContext<ThemeTokens>(DEFAULT_THEME);\n\n/**\n * Hook to access the current theme tokens.\n */\nexport function useTheme(): ThemeTokens {\n return useContext(ThemeContext);\n}\n\n/** List safe custom theme names from .book/themes. */\nexport function listCustomThemes(workspace: string): string[] {\n const themesDir = join(workspace, '.book', 'themes');\n try {\n return readdirSync(themesDir, { withFileTypes: true })\n .filter((entry) => entry.isFile() && entry.name.endsWith('.json'))\n .map((entry) => entry.name.slice(0, -'.json'.length))\n .filter((name) => CUSTOM_THEME_NAME.test(name))\n .sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n}\n\n/**\n * Try to load a custom theme from .book/themes/<name>.json.\n * Returns the loaded theme tokens, or null if not found.\n */\nexport function loadCustomTheme(workspace: string, name: string): ThemeTokens | null {\n if (!CUSTOM_THEME_NAME.test(name)) return null;\n const themePath = join(workspace, '.book', 'themes', `${name}.json`);\n if (!existsSync(themePath)) return null;\n try {\n const raw = readFileSync(themePath, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<ThemeTokens>;\n // A custom theme overrides the default look, so it starts from Rubric.\n // A theme written before `userText` existed set its ink through `text`; the\n // prompt keeps following that ink rather than Rubric's near-white.\n const userText = parsed.userText ?? parsed.text ?? RUBRIC_THEME.userText;\n return { ...RUBRIC_THEME, ...parsed, userText };\n } catch {\n return null;\n }\n}\n\n/** Resolve a theme preference into tokens. */\nexport function resolveTheme(workspace: string, preference: string): ResolvedTheme | null {\n const requested = preference.trim();\n const builtin = requested.toLowerCase();\n if (builtin === 'apple' || builtin === 'apple-dark') {\n return { preference: 'apple', resolvedName: 'apple', tokens: APPLE_THEME };\n }\n if (builtin === 'folio') {\n return { preference: 'folio', resolvedName: 'folio', tokens: FOLIO_THEME };\n }\n if (builtin === 'rubric') {\n return { preference: 'rubric', resolvedName: 'rubric', tokens: RUBRIC_THEME };\n }\n if (!requested) return null;\n const custom = loadCustomTheme(workspace, requested);\n return custom ? { preference: requested, resolvedName: requested, tokens: custom } : null;\n}\n\nexport { DEFAULT_THEME };\nexport type { ThemeTokens };\n"],"mappings":"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","names":[]}
|