opencode-agora 0.3.0 → 0.4.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 (168) hide show
  1. package/README.md +217 -52
  2. package/dist/cli/app.d.ts +3 -0
  3. package/dist/cli/app.d.ts.map +1 -1
  4. package/dist/cli/app.js +1053 -183
  5. package/dist/cli/app.js.map +1 -1
  6. package/dist/cli/chat-renderer.d.ts +31 -0
  7. package/dist/cli/chat-renderer.d.ts.map +1 -0
  8. package/dist/cli/chat-renderer.js +275 -0
  9. package/dist/cli/chat-renderer.js.map +1 -0
  10. package/dist/cli/commands-meta.d.ts +21 -0
  11. package/dist/cli/commands-meta.d.ts.map +1 -0
  12. package/dist/cli/commands-meta.js +600 -0
  13. package/dist/cli/commands-meta.js.map +1 -0
  14. package/dist/cli/completions.d.ts +18 -0
  15. package/dist/cli/completions.d.ts.map +1 -0
  16. package/dist/cli/completions.js +190 -0
  17. package/dist/cli/completions.js.map +1 -0
  18. package/dist/cli/mcp-server.d.ts +4 -0
  19. package/dist/cli/mcp-server.d.ts.map +1 -0
  20. package/dist/cli/mcp-server.js +277 -0
  21. package/dist/cli/mcp-server.js.map +1 -0
  22. package/dist/cli/menu.d.ts +7 -0
  23. package/dist/cli/menu.d.ts.map +1 -0
  24. package/dist/cli/menu.js +164 -0
  25. package/dist/cli/menu.js.map +1 -0
  26. package/dist/cli/pages/community.d.ts +3 -0
  27. package/dist/cli/pages/community.d.ts.map +1 -0
  28. package/dist/cli/pages/community.js +276 -0
  29. package/dist/cli/pages/community.js.map +1 -0
  30. package/dist/cli/pages/helpers.d.ts +32 -0
  31. package/dist/cli/pages/helpers.d.ts.map +1 -0
  32. package/dist/cli/pages/helpers.js +67 -0
  33. package/dist/cli/pages/helpers.js.map +1 -0
  34. package/dist/cli/pages/home.d.ts +3 -0
  35. package/dist/cli/pages/home.d.ts.map +1 -0
  36. package/dist/cli/pages/home.js +148 -0
  37. package/dist/cli/pages/home.js.map +1 -0
  38. package/dist/cli/pages/marketplace.d.ts +3 -0
  39. package/dist/cli/pages/marketplace.d.ts.map +1 -0
  40. package/dist/cli/pages/marketplace.js +179 -0
  41. package/dist/cli/pages/marketplace.js.map +1 -0
  42. package/dist/cli/pages/news.d.ts +3 -0
  43. package/dist/cli/pages/news.d.ts.map +1 -0
  44. package/dist/cli/pages/news.js +561 -0
  45. package/dist/cli/pages/news.js.map +1 -0
  46. package/dist/cli/pages/settings.d.ts +3 -0
  47. package/dist/cli/pages/settings.d.ts.map +1 -0
  48. package/dist/cli/pages/settings.js +166 -0
  49. package/dist/cli/pages/settings.js.map +1 -0
  50. package/dist/cli/pages/types.d.ts +67 -0
  51. package/dist/cli/pages/types.d.ts.map +1 -0
  52. package/dist/cli/pages/types.js +2 -0
  53. package/dist/cli/pages/types.js.map +1 -0
  54. package/dist/cli/prompter.d.ts +135 -0
  55. package/dist/cli/prompter.d.ts.map +1 -0
  56. package/dist/cli/prompter.js +675 -0
  57. package/dist/cli/prompter.js.map +1 -0
  58. package/dist/cli/shell.d.ts +23 -0
  59. package/dist/cli/shell.d.ts.map +1 -0
  60. package/dist/cli/shell.js +819 -0
  61. package/dist/cli/shell.js.map +1 -0
  62. package/dist/cli/tui.d.ts +7 -0
  63. package/dist/cli/tui.d.ts.map +1 -0
  64. package/dist/cli/tui.js +373 -0
  65. package/dist/cli/tui.js.map +1 -0
  66. package/dist/cli.js +1 -1
  67. package/dist/cli.js.map +1 -1
  68. package/dist/commands.d.ts +14 -0
  69. package/dist/commands.d.ts.map +1 -0
  70. package/dist/commands.js +28 -0
  71. package/dist/commands.js.map +1 -0
  72. package/dist/community/client.d.ts +47 -0
  73. package/dist/community/client.d.ts.map +1 -0
  74. package/dist/community/client.js +245 -0
  75. package/dist/community/client.js.map +1 -0
  76. package/dist/community/types.d.ts +50 -0
  77. package/dist/community/types.d.ts.map +1 -0
  78. package/dist/community/types.js +11 -0
  79. package/dist/community/types.js.map +1 -0
  80. package/dist/config.d.ts +1 -3
  81. package/dist/config.d.ts.map +1 -1
  82. package/dist/config.js +0 -17
  83. package/dist/config.js.map +1 -1
  84. package/dist/data.d.ts +1 -1
  85. package/dist/data.d.ts.map +1 -1
  86. package/dist/data.js +667 -3
  87. package/dist/data.js.map +1 -1
  88. package/dist/format.d.ts +5 -39
  89. package/dist/format.d.ts.map +1 -1
  90. package/dist/format.js +5 -120
  91. package/dist/format.js.map +1 -1
  92. package/dist/history.d.ts +13 -0
  93. package/dist/history.d.ts.map +1 -0
  94. package/dist/history.js +37 -0
  95. package/dist/history.js.map +1 -0
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +114 -234
  98. package/dist/index.js.map +1 -1
  99. package/dist/init.d.ts.map +1 -1
  100. package/dist/init.js +4 -9
  101. package/dist/init.js.map +1 -1
  102. package/dist/live.d.ts +4 -0
  103. package/dist/live.d.ts.map +1 -1
  104. package/dist/live.js +11 -3
  105. package/dist/live.js.map +1 -1
  106. package/dist/marketplace.d.ts +9 -0
  107. package/dist/marketplace.d.ts.map +1 -1
  108. package/dist/marketplace.js +105 -15
  109. package/dist/marketplace.js.map +1 -1
  110. package/dist/news/cache.d.ts +13 -0
  111. package/dist/news/cache.d.ts.map +1 -0
  112. package/dist/news/cache.js +65 -0
  113. package/dist/news/cache.js.map +1 -0
  114. package/dist/news/score.d.ts +4 -0
  115. package/dist/news/score.d.ts.map +1 -0
  116. package/dist/news/score.js +43 -0
  117. package/dist/news/score.js.map +1 -0
  118. package/dist/news/sources/arxiv.d.ts +9 -0
  119. package/dist/news/sources/arxiv.d.ts.map +1 -0
  120. package/dist/news/sources/arxiv.js +103 -0
  121. package/dist/news/sources/arxiv.js.map +1 -0
  122. package/dist/news/sources/github-trending.d.ts +9 -0
  123. package/dist/news/sources/github-trending.d.ts.map +1 -0
  124. package/dist/news/sources/github-trending.js +93 -0
  125. package/dist/news/sources/github-trending.js.map +1 -0
  126. package/dist/news/sources/hn.d.ts +9 -0
  127. package/dist/news/sources/hn.d.ts.map +1 -0
  128. package/dist/news/sources/hn.js +53 -0
  129. package/dist/news/sources/hn.js.map +1 -0
  130. package/dist/news/sources/reddit.d.ts +9 -0
  131. package/dist/news/sources/reddit.d.ts.map +1 -0
  132. package/dist/news/sources/reddit.js +68 -0
  133. package/dist/news/sources/reddit.js.map +1 -0
  134. package/dist/news/sources/rss.d.ts +14 -0
  135. package/dist/news/sources/rss.d.ts.map +1 -0
  136. package/dist/news/sources/rss.js +102 -0
  137. package/dist/news/sources/rss.js.map +1 -0
  138. package/dist/news/types.d.ts +39 -0
  139. package/dist/news/types.d.ts.map +1 -0
  140. package/dist/news/types.js +47 -0
  141. package/dist/news/types.js.map +1 -0
  142. package/dist/preferences.d.ts +14 -0
  143. package/dist/preferences.d.ts.map +1 -0
  144. package/dist/preferences.js +31 -0
  145. package/dist/preferences.js.map +1 -0
  146. package/dist/settings.d.ts +26 -0
  147. package/dist/settings.d.ts.map +1 -0
  148. package/dist/settings.js +257 -0
  149. package/dist/settings.js.map +1 -0
  150. package/dist/transcript.d.ts +28 -0
  151. package/dist/transcript.d.ts.map +1 -0
  152. package/dist/transcript.js +79 -0
  153. package/dist/transcript.js.map +1 -0
  154. package/dist/types.d.ts +6 -1
  155. package/dist/types.d.ts.map +1 -1
  156. package/dist/ui.d.ts +157 -0
  157. package/dist/ui.d.ts.map +1 -0
  158. package/dist/ui.js +296 -0
  159. package/dist/ui.js.map +1 -0
  160. package/package.json +11 -9
  161. package/dist/api.d.ts +0 -72
  162. package/dist/api.d.ts.map +0 -1
  163. package/dist/api.js +0 -109
  164. package/dist/api.js.map +0 -1
  165. package/dist/logger.d.ts +0 -20
  166. package/dist/logger.d.ts.map +0 -1
  167. package/dist/logger.js +0 -59
  168. package/dist/logger.js.map +0 -1
@@ -0,0 +1,31 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ const DEFAULTS = {
4
+ theme: 'dark',
5
+ verbosity: 'medium',
6
+ defaultNewsSource: 'all',
7
+ defaultNewsCategory: 'all',
8
+ username: '',
9
+ email: '',
10
+ bio: '',
11
+ lastTab: 0,
12
+ };
13
+ export function prefsPath(dataDir) {
14
+ return join(dataDir, 'preferences.json');
15
+ }
16
+ export function loadPreferences(dataDir) {
17
+ const path = prefsPath(dataDir);
18
+ if (!existsSync(path))
19
+ return { ...DEFAULTS };
20
+ try {
21
+ return { ...DEFAULTS, ...JSON.parse(readFileSync(path, 'utf8')) };
22
+ }
23
+ catch {
24
+ return { ...DEFAULTS };
25
+ }
26
+ }
27
+ export function writePreferences(dataDir, prefs) {
28
+ mkdirSync(dataDir, { recursive: true });
29
+ writeFileSync(prefsPath(dataDir), JSON.stringify(prefs, null, 2), 'utf8');
30
+ }
31
+ //# sourceMappingURL=preferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preferences.js","sourceRoot":"","sources":["../src/preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAajC,MAAM,QAAQ,GAAqB;IACjC,KAAK,EAAE,MAAM;IACb,SAAS,EAAE,QAAQ;IACnB,iBAAiB,EAAE,KAAK;IACxB,mBAAmB,EAAE,KAAK;IAC1B,QAAQ,EAAE,EAAE;IACZ,KAAK,EAAE,EAAE;IACT,GAAG,EAAE,EAAE;IACP,OAAO,EAAE,CAAC;CACX,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,KAAuB;IACvE,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface AgoraSettings {
2
+ account: {
3
+ username: string;
4
+ backend: string;
5
+ declared_llm: string;
6
+ };
7
+ display: {
8
+ color: 'auto' | 'truecolor' | 'none';
9
+ banner: boolean;
10
+ };
11
+ news: {
12
+ sources: Record<string, {
13
+ enabled: boolean;
14
+ ttl_minutes: number;
15
+ }>;
16
+ feeds?: string[];
17
+ };
18
+ community: {
19
+ default_board: string;
20
+ collapse_flag_threshold: number;
21
+ };
22
+ }
23
+ export declare const DEFAULT_SETTINGS: AgoraSettings;
24
+ export declare function loadSettings(dataDir: string): AgoraSettings;
25
+ export declare function writeSettings(dataDir: string, settings: AgoraSettings): void;
26
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IACnE,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,OAAO,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACnE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,SAAS,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,uBAAuB,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAED,eAAO,MAAM,gBAAgB,EAAE,aAc9B,CAAC;AAIF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAU3D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAY5E"}
@@ -0,0 +1,257 @@
1
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, renameSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const DEFAULT_SETTINGS = {
4
+ account: { username: '', backend: '', declared_llm: '' },
5
+ display: { color: 'auto', banner: true },
6
+ news: {
7
+ sources: {
8
+ hn: { enabled: true, ttl_minutes: 10 },
9
+ reddit: { enabled: true, ttl_minutes: 15 },
10
+ 'github-trending': { enabled: true, ttl_minutes: 30 },
11
+ arxiv: { enabled: false, ttl_minutes: 60 },
12
+ rss: { enabled: false, ttl_minutes: 60 },
13
+ },
14
+ feeds: [],
15
+ },
16
+ community: { default_board: 'mcp', collapse_flag_threshold: 3 },
17
+ };
18
+ const SETTINGS_FILE = 'settings.toml';
19
+ export function loadSettings(dataDir) {
20
+ const path = join(dataDir, SETTINGS_FILE);
21
+ if (!existsSync(path))
22
+ return cloneSettings(DEFAULT_SETTINGS);
23
+ try {
24
+ const raw = readFileSync(path, 'utf8');
25
+ const parsed = parseToml(raw);
26
+ return mergeSettings(cloneSettings(DEFAULT_SETTINGS), parsed);
27
+ }
28
+ catch {
29
+ return cloneSettings(DEFAULT_SETTINGS);
30
+ }
31
+ }
32
+ export function writeSettings(dataDir, settings) {
33
+ mkdirSync(dataDir, { recursive: true });
34
+ const path = join(dataDir, SETTINGS_FILE);
35
+ const tmp = `${path}.tmp`;
36
+ const body = serializeToml(settings);
37
+ writeFileSync(tmp, body, { mode: 0o600 });
38
+ renameSync(tmp, path);
39
+ try {
40
+ chmodSync(path, 0o600);
41
+ }
42
+ catch {
43
+ /* ignore */
44
+ }
45
+ }
46
+ // ── Minimal TOML subset parser ──────────────────────────────────────────────
47
+ // Handles: sections, key = value (strings, booleans, integers, inline tables),
48
+ // comments (#), string arrays. No nested tables, no datetime, no dotted keys.
49
+ function parseToml(raw) {
50
+ const result = {};
51
+ let currentSection = null;
52
+ for (const line of raw.split('\n')) {
53
+ const trimmed = line.trim();
54
+ if (!trimmed || trimmed.startsWith('#'))
55
+ continue;
56
+ const sectionMatch = trimmed.match(/^\[([^\]]+)\]$/);
57
+ if (sectionMatch) {
58
+ currentSection = sectionMatch[1].trim();
59
+ if (!result[currentSection])
60
+ result[currentSection] = {};
61
+ continue;
62
+ }
63
+ const kvMatch = trimmed.match(/^([a-zA-Z_][a-zA-Z0-9_-]*)\s*=\s*(.*)$/);
64
+ if (!kvMatch)
65
+ continue;
66
+ const key = kvMatch[1];
67
+ const value = parseTomlValue(kvMatch[2]);
68
+ if (currentSection) {
69
+ result[currentSection][key] = value;
70
+ }
71
+ else {
72
+ result[key] = value;
73
+ }
74
+ }
75
+ return result;
76
+ }
77
+ function parseTomlValue(raw) {
78
+ const trimmed = raw.trim();
79
+ if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
80
+ return trimmed.slice(1, -1).replace(/\\"/g, '"').replace(/\\n/g, '\n');
81
+ }
82
+ if (trimmed === 'true')
83
+ return true;
84
+ if (trimmed === 'false')
85
+ return false;
86
+ const intMatch = trimmed.match(/^[-+]?\d+$/);
87
+ if (intMatch)
88
+ return parseInt(trimmed, 10);
89
+ if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
90
+ return parseInlineTable(trimmed.slice(1, -1));
91
+ }
92
+ if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
93
+ return parseTomlArray(trimmed.slice(1, -1));
94
+ }
95
+ return trimmed;
96
+ }
97
+ function parseInlineTable(raw) {
98
+ const obj = {};
99
+ let depth = 0;
100
+ let current = '';
101
+ let currentKey = null;
102
+ let mode = 'key';
103
+ for (const ch of raw) {
104
+ if (ch === '{') {
105
+ depth++;
106
+ current += ch;
107
+ continue;
108
+ }
109
+ if (ch === '}') {
110
+ depth--;
111
+ current += ch;
112
+ continue;
113
+ }
114
+ if (depth > 0) {
115
+ current += ch;
116
+ continue;
117
+ }
118
+ if (mode === 'key') {
119
+ if (ch === '=') {
120
+ currentKey = current.trim();
121
+ current = '';
122
+ mode = 'value';
123
+ }
124
+ else if (ch !== ' ' && ch !== ',') {
125
+ current += ch;
126
+ }
127
+ }
128
+ else {
129
+ if (ch === ',' || ch === '}') {
130
+ if (currentKey)
131
+ obj[currentKey] = parseTomlValue(current.trim());
132
+ currentKey = null;
133
+ current = '';
134
+ mode = 'key';
135
+ }
136
+ else if (ch !== ' ' || current.length > 0) {
137
+ current += ch;
138
+ }
139
+ }
140
+ }
141
+ if (currentKey && mode === 'value') {
142
+ obj[currentKey] = parseTomlValue(current.trim());
143
+ }
144
+ return obj;
145
+ }
146
+ function parseTomlArray(raw) {
147
+ const arr = [];
148
+ let depth = 0;
149
+ let current = '';
150
+ for (const ch of raw) {
151
+ if (ch === '[' || ch === '{') {
152
+ depth++;
153
+ current += ch;
154
+ continue;
155
+ }
156
+ if (ch === ']' || ch === '}') {
157
+ depth--;
158
+ current += ch;
159
+ continue;
160
+ }
161
+ if (depth > 0) {
162
+ current += ch;
163
+ continue;
164
+ }
165
+ if (ch === ',') {
166
+ const v = current.trim();
167
+ if (v)
168
+ arr.push(parseTomlValue(v));
169
+ current = '';
170
+ }
171
+ else {
172
+ current += ch;
173
+ }
174
+ }
175
+ const v = current.trim();
176
+ if (v)
177
+ arr.push(parseTomlValue(v));
178
+ return arr;
179
+ }
180
+ // ── Minimal TOML serializer ──────────────────────────────────────────────────
181
+ function serializeToml(settings) {
182
+ const lines = ['# Agora settings', `# Generated ${new Date().toISOString().slice(0, 10)}`, ''];
183
+ lines.push('[account]');
184
+ lines.push(`username = ${JSON.stringify(settings.account.username)}`);
185
+ lines.push(`backend = ${JSON.stringify(settings.account.backend)}`);
186
+ lines.push(`declared_llm = ${JSON.stringify(settings.account.declared_llm)}`);
187
+ lines.push('');
188
+ lines.push('[display]');
189
+ lines.push(`color = ${JSON.stringify(settings.display.color)}`);
190
+ lines.push(`banner = ${String(settings.display.banner)}`);
191
+ lines.push('');
192
+ lines.push('[news]');
193
+ lines.push(`feeds = ${JSON.stringify(settings.news.feeds ?? [])}`);
194
+ lines.push('');
195
+ for (const [key, src] of Object.entries(settings.news.sources)) {
196
+ const cleanKey = key.replace(/[^a-zA-Z0-9_-]/g, '_');
197
+ lines.push(`[news.sources.${cleanKey}]`);
198
+ lines.push(`enabled = ${String(src.enabled)}`);
199
+ lines.push(`ttl_minutes = ${src.ttl_minutes}`);
200
+ lines.push('');
201
+ }
202
+ lines.push('[community]');
203
+ lines.push(`default_board = ${JSON.stringify(settings.community.default_board)}`);
204
+ lines.push(`collapse_flag_threshold = ${settings.community.collapse_flag_threshold}`);
205
+ lines.push('');
206
+ return lines.join('\n');
207
+ }
208
+ function mergeSettings(defaults, parsed) {
209
+ if (parsed.account) {
210
+ if (typeof parsed.account.username === 'string')
211
+ defaults.account.username = parsed.account.username;
212
+ if (typeof parsed.account.backend === 'string')
213
+ defaults.account.backend = parsed.account.backend;
214
+ if (typeof parsed.account.declared_llm === 'string')
215
+ defaults.account.declared_llm = parsed.account.declared_llm;
216
+ }
217
+ if (parsed.display) {
218
+ if (['auto', 'truecolor', 'none'].includes(parsed.display.color))
219
+ defaults.display.color = parsed.display.color;
220
+ if (typeof parsed.display.banner === 'boolean')
221
+ defaults.display.banner = parsed.display.banner;
222
+ }
223
+ if (parsed.news) {
224
+ if (Array.isArray(parsed.news.feeds))
225
+ defaults.news.feeds = parsed.news.feeds;
226
+ if (parsed.news.sources && typeof parsed.news.sources === 'object') {
227
+ for (const [key, val] of Object.entries(parsed.news.sources)) {
228
+ const src = val;
229
+ if (src && typeof src === 'object') {
230
+ defaults.news.sources[key] = {
231
+ enabled: typeof src.enabled === 'boolean' ? src.enabled : true,
232
+ ttl_minutes: typeof src.ttl_minutes === 'number' ? src.ttl_minutes : 60,
233
+ };
234
+ }
235
+ }
236
+ }
237
+ }
238
+ if (parsed.community) {
239
+ if (typeof parsed.community.default_board === 'string')
240
+ defaults.community.default_board = parsed.community.default_board;
241
+ if (typeof parsed.community.collapse_flag_threshold === 'number')
242
+ defaults.community.collapse_flag_threshold = parsed.community.collapse_flag_threshold;
243
+ }
244
+ return defaults;
245
+ }
246
+ function cloneSettings(s) {
247
+ return {
248
+ account: { ...s.account },
249
+ display: { ...s.display },
250
+ news: {
251
+ sources: Object.fromEntries(Object.entries(s.news.sources).map(([k, v]) => [k, { ...v }])),
252
+ feeds: [...(s.news.feeds ?? [])],
253
+ },
254
+ community: { ...s.community },
255
+ };
256
+ }
257
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface TranscriptEntry {
2
+ ts: string;
3
+ kind: 'bash' | 'chat-user' | 'chat-assistant' | 'meta';
4
+ input?: string;
5
+ output?: string;
6
+ exitCode?: number;
7
+ }
8
+ export interface SessionMeta {
9
+ sessionId: string | null;
10
+ cwd: string;
11
+ createdAt: string;
12
+ lastUsedAt: string;
13
+ turnCount: number;
14
+ }
15
+ export declare function cwdHash(cwd: string): string;
16
+ export declare function getTranscriptPath(dataDir: string, cwd: string): string;
17
+ export declare function getSessionMetaPath(dataDir: string, cwd: string): string;
18
+ export declare function appendTranscript(dataDir: string, cwd: string, entry: TranscriptEntry): void;
19
+ export declare function readTranscript(dataDir: string, cwd: string, opts?: {
20
+ tail?: number;
21
+ }): TranscriptEntry[];
22
+ export declare function loadSessionMeta(dataDir: string, cwd: string): SessionMeta | undefined;
23
+ export declare function writeSessionMeta(dataDir: string, cwd: string, meta: SessionMeta): void;
24
+ export declare function recentBashContext(dataDir: string, cwd: string, opts: {
25
+ commands: number;
26
+ lines: number;
27
+ }): string;
28
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,gBAAgB,GAAG,MAAM,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAQD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvE;AAQD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,IAAI,CAK3F;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,eAAe,EAAE,CAoBnB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAQrF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAGtF;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACxC,MAAM,CAaR"}
@@ -0,0 +1,79 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ export function cwdHash(cwd) {
5
+ return createHash('sha256').update(cwd).digest('hex').slice(0, 16);
6
+ }
7
+ function transcriptDir(dataDir) {
8
+ const dir = join(dataDir, 'transcripts');
9
+ mkdirSync(dir, { recursive: true });
10
+ return dir;
11
+ }
12
+ export function getTranscriptPath(dataDir, cwd) {
13
+ return join(transcriptDir(dataDir), `${cwdHash(cwd)}.jsonl`);
14
+ }
15
+ export function getSessionMetaPath(dataDir, cwd) {
16
+ return join(transcriptDir(dataDir), `${cwdHash(cwd)}.session.json`);
17
+ }
18
+ function atomicWrite(path, content) {
19
+ const tmp = `${path}.tmp`;
20
+ writeFileSync(tmp, content, 'utf8');
21
+ renameSync(tmp, path);
22
+ }
23
+ export function appendTranscript(dataDir, cwd, entry) {
24
+ const path = getTranscriptPath(dataDir, cwd);
25
+ const line = JSON.stringify(entry) + '\n';
26
+ // append-write: not atomic for append, but safe enough for JSONL
27
+ writeFileSync(path, line, { flag: 'a', encoding: 'utf8' });
28
+ }
29
+ export function readTranscript(dataDir, cwd, opts = {}) {
30
+ const path = getTranscriptPath(dataDir, cwd);
31
+ if (!existsSync(path))
32
+ return [];
33
+ const raw = readFileSync(path, 'utf8');
34
+ const entries = [];
35
+ for (const line of raw.split('\n')) {
36
+ const trimmed = line.trim();
37
+ if (!trimmed)
38
+ continue;
39
+ try {
40
+ entries.push(JSON.parse(trimmed));
41
+ }
42
+ catch {
43
+ // skip malformed lines
44
+ }
45
+ }
46
+ if (opts.tail !== undefined && entries.length > opts.tail) {
47
+ return entries.slice(entries.length - opts.tail);
48
+ }
49
+ return entries;
50
+ }
51
+ export function loadSessionMeta(dataDir, cwd) {
52
+ const path = getSessionMetaPath(dataDir, cwd);
53
+ if (!existsSync(path))
54
+ return undefined;
55
+ try {
56
+ return JSON.parse(readFileSync(path, 'utf8'));
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ }
62
+ export function writeSessionMeta(dataDir, cwd, meta) {
63
+ const path = getSessionMetaPath(dataDir, cwd);
64
+ atomicWrite(path, JSON.stringify(meta, null, 2) + '\n');
65
+ }
66
+ export function recentBashContext(dataDir, cwd, opts) {
67
+ const entries = readTranscript(dataDir, cwd);
68
+ const bashEntries = entries.filter((e) => e.kind === 'bash').slice(-opts.commands);
69
+ if (bashEntries.length === 0)
70
+ return '';
71
+ const sections = bashEntries.map((entry) => {
72
+ const cmd = entry.input ?? '';
73
+ const output = entry.output ?? '';
74
+ const lastLines = output.split('\n').slice(-opts.lines).join('\n');
75
+ return `─── $ ${cmd} ───\n${lastLines}`;
76
+ });
77
+ return `Recent shell output in this session:\n${sections.join('\n')}`;
78
+ }
79
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,4 +1,7 @@
1
- export interface AgoraPlugin {
1
+ export interface Permissions {
2
+ fs?: string[];
3
+ net?: string[];
4
+ exec?: string[];
2
5
  }
3
6
  export interface Package {
4
7
  id: string;
@@ -13,6 +16,8 @@ export interface Package {
13
16
  repository?: string;
14
17
  npmPackage?: string;
15
18
  createdAt: string;
19
+ permissions?: Permissions;
20
+ flagCount?: number;
16
21
  }
17
22
  export interface Workflow {
18
23
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;CAAG;AAE/B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAClD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAClD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,UAAU,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Terminal styling for the agora CLI — a flat, minimal look: one accent colour
3
+ * for identifiers, dim for everything secondary, plain foreground for body text,
4
+ * plus a gradient wordmark banner and a rounded header frame for the standalone
5
+ * hub experience.
6
+ *
7
+ * Colour is opt-in. It is emitted only to an interactive TTY, and never under
8
+ * `NO_COLOR`, `TERM=dumb`, or `--json`. Non-TTY callers (pipes, the test
9
+ * harness) get plain strings, so output stays assertable.
10
+ *
11
+ * The wordmark art, gradient, and accent colour below come from the Claude
12
+ * Design handoff (docs/claude-design-brief.md → `agora-wordmark.ts`). Palette:
13
+ * "agora at golden hour" — Aegean blue → marble warm → terracotta.
14
+ */
15
+ export type RGB = [number, number, number];
16
+ export interface Styler {
17
+ accent(value: string): string;
18
+ dim(value: string): string;
19
+ bold(value: string): string;
20
+ orange(value: string): string;
21
+ }
22
+ /**
23
+ * ACCENT — used for package identifiers in list output. A desaturated amber:
24
+ * high contrast on both light and dark terminals, and distinct from the
25
+ * gradient stops so ids never blend into the banner.
26
+ */
27
+ export declare const ACCENT: {
28
+ readonly hex: "#D4A85A";
29
+ readonly rgb: RGB;
30
+ readonly ansi256: 179;
31
+ readonly ansiBasic: 33;
32
+ };
33
+ export declare const ORANGE: {
34
+ readonly hex: "#FF8C00";
35
+ readonly rgb: RGB;
36
+ readonly ansi256: 208;
37
+ readonly ansiBasic: 33;
38
+ };
39
+ /**
40
+ * Builds a styler. The accent colour is emitted as 24-bit when the terminal
41
+ * advertises truecolor, otherwise as the nearest xterm-256 cube colour.
42
+ */
43
+ export declare function createStyler(useColor: boolean, trueColor?: boolean): Styler;
44
+ export declare function shouldUseColor(stream: {
45
+ isTTY?: boolean;
46
+ }, env: Record<string, string | undefined>, json: boolean): boolean;
47
+ /** 24-bit colour is only safe to emit when the terminal advertises it. */
48
+ export declare function supportsTrueColor(env: Record<string, string | undefined>): boolean;
49
+ /**
50
+ * Carved-relief letterforms (7 rows × 52 cols). Built from a SOLID skeleton +
51
+ * an algorithmic shading pass: cells whose neighbour above is empty get `▓`
52
+ * (top highlight), cells whose neighbour below is empty get `▒` (bottom
53
+ * shadow), plus a few weather specks on stroke interiors. The pass only ever
54
+ * rewrites existing `█` cells, so it cannot bleed into the O / R counters.
55
+ * Reads as top-lit carved stone; survives `NO_COLOR` because the texture is
56
+ * in the *characters*, not the colours.
57
+ */
58
+ export declare const AGORA_WORDMARK_RELIEF: string[];
59
+ /**
60
+ * BANNER_GRADIENT — 3 stops sampled across the wordmark's columns.
61
+ * "Marble & terracotta": warm cream → terracotta → deep brick. A purely
62
+ * warm Mediterranean sweep; neither endpoint touches pure black or white,
63
+ * so it holds contrast on either terminal background.
64
+ */
65
+ export declare const BANNER_GRADIENT: RGB[];
66
+ export declare function colorize(char: string, rgb: RGB, trueColor: boolean): string;
67
+ export declare function sampleGradient(stops: RGB[], t: number): RGB;
68
+ /** Colorizes each character of `text` across BANNER_GRADIENT stops. */
69
+ export declare function gradientText(text: string, opts: {
70
+ trueColor: boolean;
71
+ }): string;
72
+ export interface BannerOptions {
73
+ color: boolean;
74
+ trueColor: boolean;
75
+ /** Dim line printed under the wordmark. */
76
+ subtitle?: string;
77
+ }
78
+ /**
79
+ * Renders the AGORA wordmark with a left-to-right gradient applied per column
80
+ * (so the gradient stays aligned across all rows), followed by an optional
81
+ * dim subtitle. Degrades to plain block letters when colour is off.
82
+ */
83
+ export declare function renderBanner(opts: BannerOptions): string;
84
+ export interface BoxOptions {
85
+ color: boolean;
86
+ trueColor: boolean;
87
+ }
88
+ /**
89
+ * A calm rounded-corner frame for the welcome header — rounded corners, single
90
+ * sides, a half-block "pillar" prefix on each content line (the pillar reads as
91
+ * a small column — fitting for the agora). The first line is the bold accent
92
+ * title; the rest are dim body text. Border and pillar are accent-tinted; body
93
+ * text is left uncoloured per the design spec.
94
+ */
95
+ export declare function renderBox(title: string, body: string[], opts: BoxOptions): string;
96
+ /**
97
+ * One tint per chat-movement kind so a transcript reads at a glance:
98
+ * thinking = cool grey-tan (low energy), tool = terracotta (mid), response =
99
+ * accent amber (full). All three sit inside the BANNER_GRADIENT palette.
100
+ */
101
+ export declare const MOVEMENT_COLOR: {
102
+ readonly thinking: {
103
+ readonly hex: "#8A7866";
104
+ readonly rgb: RGB;
105
+ };
106
+ readonly tool: {
107
+ readonly hex: "#C66A4A";
108
+ readonly rgb: RGB;
109
+ };
110
+ readonly response: {
111
+ readonly hex: "#D4A85A";
112
+ readonly rgb: RGB;
113
+ };
114
+ };
115
+ export type MovementKind = keyof typeof MOVEMENT_COLOR;
116
+ /** Colorize `▍` with the tint for a given movement kind. */
117
+ export declare function movementBar(kind: MovementKind, opts: {
118
+ trueColor: boolean;
119
+ }): string;
120
+ /**
121
+ * 52-cell middle row of zigzag teeth — alternating upper-half / lower-half
122
+ * blocks. In a 3-row frieze the teeth attach to the top bar (`▀▀`) and the
123
+ * bottom bar (`▄▄`) alternately, creating voids that zigzag between top and
124
+ * bottom — the classic Greek-key reading.
125
+ */
126
+ export declare const MEANDER: string;
127
+ export interface MeanderOptions {
128
+ trueColor: boolean;
129
+ /** Render mode: `idle` (default), `wave`, or `progress`. */
130
+ mode?: 'idle' | 'wave' | 'progress';
131
+ /** For `wave`: elapsed time in ms. The head moves at ~18 cells/sec. */
132
+ tMs?: number;
133
+ /** For `progress`: 0–100. */
134
+ pct?: number;
135
+ }
136
+ /**
137
+ * Render the meander. `idle` and `wave` return a 3-row Greek-key ribbon
138
+ * (solid bar + square teeth + solid bar). `progress` returns a single inline
139
+ * row of square teeth so it can be redrawn in place with `\r`.
140
+ */
141
+ export declare function renderMeander(opts: MeanderOptions): string;
142
+ /**
143
+ * 5-char dancing figure built from the top of an Ionic column: the corner
144
+ * brackets `╭ ╮ ╰ ╯` form the *abacus* (flat slab), the two `⊙` characters
145
+ * are the *volutes* (spiral scrolls), and the `─` between them is the
146
+ * *echinus*. Only the abacus corners swap between frames — the volutes and
147
+ * echinus are fixed — so the eye reads it as one figure swaying, not four
148
+ * different glyphs flickering.
149
+ *
150
+ * Lifecycle: paint while a `thinking` movement is in flight; clear the line
151
+ * on the first response token so the user's eye lands on the answer, not the
152
+ * dance. Survives `NO_COLOR` because the silhouette is in the characters.
153
+ */
154
+ export declare const MASCOT_FRAMES: readonly string[];
155
+ /** Pick the current mascot frame given elapsed thinking time in ms. */
156
+ export declare function mascotFrame(tMs: number): string;
157
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}