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.
- package/README.md +217 -52
- package/dist/cli/app.d.ts +3 -0
- package/dist/cli/app.d.ts.map +1 -1
- package/dist/cli/app.js +1053 -183
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/chat-renderer.d.ts +31 -0
- package/dist/cli/chat-renderer.d.ts.map +1 -0
- package/dist/cli/chat-renderer.js +275 -0
- package/dist/cli/chat-renderer.js.map +1 -0
- package/dist/cli/commands-meta.d.ts +21 -0
- package/dist/cli/commands-meta.d.ts.map +1 -0
- package/dist/cli/commands-meta.js +600 -0
- package/dist/cli/commands-meta.js.map +1 -0
- package/dist/cli/completions.d.ts +18 -0
- package/dist/cli/completions.d.ts.map +1 -0
- package/dist/cli/completions.js +190 -0
- package/dist/cli/completions.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +4 -0
- package/dist/cli/mcp-server.d.ts.map +1 -0
- package/dist/cli/mcp-server.js +277 -0
- package/dist/cli/mcp-server.js.map +1 -0
- package/dist/cli/menu.d.ts +7 -0
- package/dist/cli/menu.d.ts.map +1 -0
- package/dist/cli/menu.js +164 -0
- package/dist/cli/menu.js.map +1 -0
- package/dist/cli/pages/community.d.ts +3 -0
- package/dist/cli/pages/community.d.ts.map +1 -0
- package/dist/cli/pages/community.js +276 -0
- package/dist/cli/pages/community.js.map +1 -0
- package/dist/cli/pages/helpers.d.ts +32 -0
- package/dist/cli/pages/helpers.d.ts.map +1 -0
- package/dist/cli/pages/helpers.js +67 -0
- package/dist/cli/pages/helpers.js.map +1 -0
- package/dist/cli/pages/home.d.ts +3 -0
- package/dist/cli/pages/home.d.ts.map +1 -0
- package/dist/cli/pages/home.js +148 -0
- package/dist/cli/pages/home.js.map +1 -0
- package/dist/cli/pages/marketplace.d.ts +3 -0
- package/dist/cli/pages/marketplace.d.ts.map +1 -0
- package/dist/cli/pages/marketplace.js +179 -0
- package/dist/cli/pages/marketplace.js.map +1 -0
- package/dist/cli/pages/news.d.ts +3 -0
- package/dist/cli/pages/news.d.ts.map +1 -0
- package/dist/cli/pages/news.js +561 -0
- package/dist/cli/pages/news.js.map +1 -0
- package/dist/cli/pages/settings.d.ts +3 -0
- package/dist/cli/pages/settings.d.ts.map +1 -0
- package/dist/cli/pages/settings.js +166 -0
- package/dist/cli/pages/settings.js.map +1 -0
- package/dist/cli/pages/types.d.ts +67 -0
- package/dist/cli/pages/types.d.ts.map +1 -0
- package/dist/cli/pages/types.js +2 -0
- package/dist/cli/pages/types.js.map +1 -0
- package/dist/cli/prompter.d.ts +135 -0
- package/dist/cli/prompter.d.ts.map +1 -0
- package/dist/cli/prompter.js +675 -0
- package/dist/cli/prompter.js.map +1 -0
- package/dist/cli/shell.d.ts +23 -0
- package/dist/cli/shell.d.ts.map +1 -0
- package/dist/cli/shell.js +819 -0
- package/dist/cli/shell.js.map +1 -0
- package/dist/cli/tui.d.ts +7 -0
- package/dist/cli/tui.d.ts.map +1 -0
- package/dist/cli/tui.js +373 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +14 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +28 -0
- package/dist/commands.js.map +1 -0
- package/dist/community/client.d.ts +47 -0
- package/dist/community/client.d.ts.map +1 -0
- package/dist/community/client.js +245 -0
- package/dist/community/client.js.map +1 -0
- package/dist/community/types.d.ts +50 -0
- package/dist/community/types.d.ts.map +1 -0
- package/dist/community/types.js +11 -0
- package/dist/community/types.js.map +1 -0
- package/dist/config.d.ts +1 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -17
- package/dist/config.js.map +1 -1
- package/dist/data.d.ts +1 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +667 -3
- package/dist/data.js.map +1 -1
- package/dist/format.d.ts +5 -39
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +5 -120
- package/dist/format.js.map +1 -1
- package/dist/history.d.ts +13 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +37 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +114 -234
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +4 -9
- package/dist/init.js.map +1 -1
- package/dist/live.d.ts +4 -0
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +11 -3
- package/dist/live.js.map +1 -1
- package/dist/marketplace.d.ts +9 -0
- package/dist/marketplace.d.ts.map +1 -1
- package/dist/marketplace.js +105 -15
- package/dist/marketplace.js.map +1 -1
- package/dist/news/cache.d.ts +13 -0
- package/dist/news/cache.d.ts.map +1 -0
- package/dist/news/cache.js +65 -0
- package/dist/news/cache.js.map +1 -0
- package/dist/news/score.d.ts +4 -0
- package/dist/news/score.d.ts.map +1 -0
- package/dist/news/score.js +43 -0
- package/dist/news/score.js.map +1 -0
- package/dist/news/sources/arxiv.d.ts +9 -0
- package/dist/news/sources/arxiv.d.ts.map +1 -0
- package/dist/news/sources/arxiv.js +103 -0
- package/dist/news/sources/arxiv.js.map +1 -0
- package/dist/news/sources/github-trending.d.ts +9 -0
- package/dist/news/sources/github-trending.d.ts.map +1 -0
- package/dist/news/sources/github-trending.js +93 -0
- package/dist/news/sources/github-trending.js.map +1 -0
- package/dist/news/sources/hn.d.ts +9 -0
- package/dist/news/sources/hn.d.ts.map +1 -0
- package/dist/news/sources/hn.js +53 -0
- package/dist/news/sources/hn.js.map +1 -0
- package/dist/news/sources/reddit.d.ts +9 -0
- package/dist/news/sources/reddit.d.ts.map +1 -0
- package/dist/news/sources/reddit.js +68 -0
- package/dist/news/sources/reddit.js.map +1 -0
- package/dist/news/sources/rss.d.ts +14 -0
- package/dist/news/sources/rss.d.ts.map +1 -0
- package/dist/news/sources/rss.js +102 -0
- package/dist/news/sources/rss.js.map +1 -0
- package/dist/news/types.d.ts +39 -0
- package/dist/news/types.d.ts.map +1 -0
- package/dist/news/types.js +47 -0
- package/dist/news/types.js.map +1 -0
- package/dist/preferences.d.ts +14 -0
- package/dist/preferences.d.ts.map +1 -0
- package/dist/preferences.js +31 -0
- package/dist/preferences.js.map +1 -0
- package/dist/settings.d.ts +26 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +257 -0
- package/dist/settings.js.map +1 -0
- package/dist/transcript.d.ts +28 -0
- package/dist/transcript.d.ts.map +1 -0
- package/dist/transcript.js +79 -0
- package/dist/transcript.js.map +1 -0
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts +157 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +296 -0
- package/dist/ui.js.map +1 -0
- package/package.json +11 -9
- package/dist/api.d.ts +0 -72
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -109
- package/dist/api.js.map +0 -1
- package/dist/logger.d.ts +0 -20
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -59
- 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"}
|
package/dist/settings.js
ADDED
|
@@ -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
|
|
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;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;
|
|
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
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
|