opencode-agora 0.4.0 → 0.4.2
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 +89 -415
- package/dist/atomic-write.d.ts +10 -0
- package/dist/atomic-write.d.ts.map +1 -0
- package/dist/atomic-write.js +23 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/auth/refresh.d.ts +17 -0
- package/dist/auth/refresh.d.ts.map +1 -0
- package/dist/auth/refresh.js +50 -0
- package/dist/auth/refresh.js.map +1 -0
- package/dist/cli/app.d.ts +11 -19
- package/dist/cli/app.d.ts.map +1 -1
- package/dist/cli/app.js +159 -2028
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/commands/browse.d.ts +4 -0
- package/dist/cli/commands/browse.d.ts.map +1 -0
- package/dist/cli/commands/browse.js +80 -0
- package/dist/cli/commands/browse.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +4 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +125 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/community.d.ts +12 -0
- package/dist/cli/commands/community.d.ts.map +1 -0
- package/dist/cli/commands/community.js +453 -0
- package/dist/cli/commands/community.js.map +1 -0
- package/dist/cli/commands/export.d.ts +3 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +108 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +299 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/learn.d.ts +4 -0
- package/dist/cli/commands/learn.d.ts.map +1 -0
- package/dist/cli/commands/learn.js +62 -0
- package/dist/cli/commands/learn.js.map +1 -0
- package/dist/cli/commands/marketplace.d.ts +9 -0
- package/dist/cli/commands/marketplace.d.ts.map +1 -0
- package/dist/cli/commands/marketplace.js +321 -0
- package/dist/cli/commands/marketplace.js.map +1 -0
- package/dist/cli/commands/notify.d.ts +3 -0
- package/dist/cli/commands/notify.d.ts.map +1 -0
- package/dist/cli/commands/notify.js +59 -0
- package/dist/cli/commands/notify.js.map +1 -0
- package/dist/cli/commands/operations.d.ts +16 -0
- package/dist/cli/commands/operations.d.ts.map +1 -0
- package/dist/cli/commands/operations.js +1041 -0
- package/dist/cli/commands/operations.js.map +1 -0
- package/dist/cli/commands/outdated.d.ts +3 -0
- package/dist/cli/commands/outdated.d.ts.map +1 -0
- package/dist/cli/commands/outdated.js +48 -0
- package/dist/cli/commands/outdated.js.map +1 -0
- package/dist/cli/commands/ping.d.ts +3 -0
- package/dist/cli/commands/ping.d.ts.map +1 -0
- package/dist/cli/commands/ping.js +56 -0
- package/dist/cli/commands/ping.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +3 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +35 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/today.d.ts +3 -0
- package/dist/cli/commands/today.d.ts.map +1 -0
- package/dist/cli/commands/today.js +142 -0
- package/dist/cli/commands/today.js.map +1 -0
- package/dist/cli/commands/types.d.ts +5 -0
- package/dist/cli/commands/types.d.ts.map +1 -0
- package/dist/cli/commands/types.js +2 -0
- package/dist/cli/commands/types.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +41 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/commands/welcome.d.ts +3 -0
- package/dist/cli/commands/welcome.d.ts.map +1 -0
- package/dist/cli/commands/welcome.js +97 -0
- package/dist/cli/commands/welcome.js.map +1 -0
- package/dist/cli/commands-meta.d.ts.map +1 -1
- package/dist/cli/commands-meta.js +286 -29
- package/dist/cli/commands-meta.js.map +1 -1
- package/dist/cli/completions-gen.d.ts +2 -0
- package/dist/cli/completions-gen.d.ts.map +1 -0
- package/dist/cli/completions-gen.js +195 -0
- package/dist/cli/completions-gen.js.map +1 -0
- package/dist/cli/completions.d.ts.map +1 -1
- package/dist/cli/completions.js +42 -5
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/flags.d.ts +19 -0
- package/dist/cli/flags.d.ts.map +1 -0
- package/dist/cli/flags.js +91 -0
- package/dist/cli/flags.js.map +1 -0
- package/dist/cli/format.d.ts +19 -0
- package/dist/cli/format.d.ts.map +1 -0
- package/dist/cli/format.js +249 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/helpers.d.ts +95 -0
- package/dist/cli/helpers.d.ts.map +1 -0
- package/dist/cli/helpers.js +301 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/mcp-server.d.ts +7 -1
- package/dist/cli/mcp-server.d.ts.map +1 -1
- package/dist/cli/mcp-server.js +70 -2
- package/dist/cli/mcp-server.js.map +1 -1
- package/dist/cli/menu.d.ts.map +1 -1
- package/dist/cli/menu.js +11 -3
- package/dist/cli/menu.js.map +1 -1
- package/dist/cli/pages/community.d.ts +6 -0
- package/dist/cli/pages/community.d.ts.map +1 -1
- package/dist/cli/pages/community.js +882 -64
- package/dist/cli/pages/community.js.map +1 -1
- package/dist/cli/pages/helpers.d.ts +14 -9
- package/dist/cli/pages/helpers.d.ts.map +1 -1
- package/dist/cli/pages/helpers.js +37 -6
- package/dist/cli/pages/helpers.js.map +1 -1
- package/dist/cli/pages/home.d.ts +1 -0
- package/dist/cli/pages/home.d.ts.map +1 -1
- package/dist/cli/pages/home.js +203 -120
- package/dist/cli/pages/home.js.map +1 -1
- package/dist/cli/pages/marketplace.d.ts +2 -0
- package/dist/cli/pages/marketplace.d.ts.map +1 -1
- package/dist/cli/pages/marketplace.js +524 -62
- package/dist/cli/pages/marketplace.js.map +1 -1
- package/dist/cli/pages/news.d.ts +28 -0
- package/dist/cli/pages/news.d.ts.map +1 -1
- package/dist/cli/pages/news.js +209 -82
- package/dist/cli/pages/news.js.map +1 -1
- package/dist/cli/pages/settings.d.ts.map +1 -1
- package/dist/cli/pages/settings.js +163 -33
- package/dist/cli/pages/settings.js.map +1 -1
- package/dist/cli/pages/types.d.ts +1 -1
- package/dist/cli/pages/types.d.ts.map +1 -1
- package/dist/cli/prompter.d.ts.map +1 -1
- package/dist/cli/prompter.js +43 -8
- package/dist/cli/prompter.js.map +1 -1
- package/dist/cli/shell.d.ts +2 -2
- package/dist/cli/shell.d.ts.map +1 -1
- package/dist/cli/shell.js +321 -18
- package/dist/cli/shell.js.map +1 -1
- package/dist/cli/tui.d.ts +1 -1
- package/dist/cli/tui.d.ts.map +1 -1
- package/dist/cli/tui.js +69 -23
- package/dist/cli/tui.js.map +1 -1
- package/dist/community/client.d.ts +45 -8
- package/dist/community/client.d.ts.map +1 -1
- package/dist/community/client.js +118 -23
- package/dist/community/client.js.map +1 -1
- package/dist/community/search.d.ts +25 -0
- package/dist/community/search.d.ts.map +1 -0
- package/dist/community/search.js +62 -0
- package/dist/community/search.js.map +1 -0
- package/dist/community/types.d.ts +21 -0
- package/dist/community/types.d.ts.map +1 -1
- package/dist/community/types.js +1 -1
- package/dist/config.d.ts +0 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -15
- package/dist/config.js.map +1 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +142 -68
- package/dist/data.js.map +1 -1
- package/dist/format.d.ts +0 -2
- package/dist/format.d.ts.map +1 -1
- package/dist/format.js +0 -2
- package/dist/format.js.map +1 -1
- package/dist/hubs/cache.d.ts +6 -0
- package/dist/hubs/cache.d.ts.map +1 -0
- package/dist/hubs/cache.js +46 -0
- package/dist/hubs/cache.js.map +1 -0
- package/dist/hubs/enrichment.d.ts +43 -0
- package/dist/hubs/enrichment.d.ts.map +1 -0
- package/dist/hubs/enrichment.js +239 -0
- package/dist/hubs/enrichment.js.map +1 -0
- package/dist/hubs/github.d.ts +12 -0
- package/dist/hubs/github.d.ts.map +1 -0
- package/dist/hubs/github.js +54 -0
- package/dist/hubs/github.js.map +1 -0
- package/dist/hubs/huggingface.d.ts +27 -0
- package/dist/hubs/huggingface.d.ts.map +1 -0
- package/dist/hubs/huggingface.js +88 -0
- package/dist/hubs/huggingface.js.map +1 -0
- package/dist/hubs/quality.d.ts +26 -0
- package/dist/hubs/quality.d.ts.map +1 -0
- package/dist/hubs/quality.js +57 -0
- package/dist/hubs/quality.js.map +1 -0
- package/dist/hubs/types.d.ts +30 -0
- package/dist/hubs/types.d.ts.map +1 -0
- package/dist/hubs/types.js +2 -0
- package/dist/hubs/types.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +2 -2
- package/dist/init.js.map +1 -1
- package/dist/live.d.ts +10 -0
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +31 -1
- package/dist/live.js.map +1 -1
- package/dist/marketplace.d.ts +16 -3
- package/dist/marketplace.d.ts.map +1 -1
- package/dist/marketplace.js +174 -7
- package/dist/marketplace.js.map +1 -1
- package/dist/news/cache.d.ts.map +1 -1
- package/dist/news/cache.js +4 -3
- package/dist/news/cache.js.map +1 -1
- package/dist/news/score.js +1 -1
- package/dist/news/sources/arxiv.d.ts.map +1 -1
- package/dist/news/sources/arxiv.js +10 -6
- package/dist/news/sources/arxiv.js.map +1 -1
- package/dist/news/sources/github-trending.d.ts.map +1 -1
- package/dist/news/sources/github-trending.js +9 -5
- package/dist/news/sources/github-trending.js.map +1 -1
- package/dist/news/sources/hn.d.ts.map +1 -1
- package/dist/news/sources/hn.js +8 -4
- package/dist/news/sources/hn.js.map +1 -1
- package/dist/news/sources/reddit.d.ts.map +1 -1
- package/dist/news/sources/reddit.js +5 -4
- package/dist/news/sources/reddit.js.map +1 -1
- package/dist/news/sources/rss.d.ts +10 -11
- package/dist/news/sources/rss.d.ts.map +1 -1
- package/dist/news/sources/rss.js +11 -99
- package/dist/news/sources/rss.js.map +1 -1
- package/dist/news/types.d.ts +3 -0
- package/dist/news/types.d.ts.map +1 -1
- package/dist/news/types.js +15 -6
- package/dist/news/types.js.map +1 -1
- package/dist/outdated.d.ts +24 -0
- package/dist/outdated.d.ts.map +1 -0
- package/dist/outdated.js +53 -0
- package/dist/outdated.js.map +1 -0
- package/dist/preferences.d.ts.map +1 -1
- package/dist/preferences.js +4 -4
- package/dist/preferences.js.map +1 -1
- package/dist/scan.d.ts +26 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +179 -0
- package/dist/scan.js.map +1 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +14 -20
- package/dist/settings.js.map +1 -1
- package/dist/state.d.ts +9 -2
- package/dist/state.d.ts.map +1 -1
- package/dist/state.js +41 -19
- package/dist/state.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +1 -1
- package/package.json +4 -2
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { formatNumber } from '../format.js';
|
|
2
|
+
import { getInstallKind, renderPermissionLines } from '../marketplace.js';
|
|
3
|
+
import { COMMANDS } from './commands-meta.js';
|
|
4
|
+
import { renderBanner, renderBox } from '../ui.js';
|
|
5
|
+
function pricingBadge(pricing, style) {
|
|
6
|
+
if (!pricing)
|
|
7
|
+
return '';
|
|
8
|
+
if (pricing.kind === 'free')
|
|
9
|
+
return ' ' + style.dim('FREE');
|
|
10
|
+
if (pricing.kind === 'paid')
|
|
11
|
+
return ' ' + style.accent('PAID');
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
export function truncate(value, max) {
|
|
15
|
+
if (value.length <= max)
|
|
16
|
+
return value;
|
|
17
|
+
return value.slice(0, max - 1) + '…';
|
|
18
|
+
}
|
|
19
|
+
export function formatDate(value) {
|
|
20
|
+
if (!value)
|
|
21
|
+
return '';
|
|
22
|
+
const d = new Date(value);
|
|
23
|
+
if (isNaN(d.getTime()))
|
|
24
|
+
return value;
|
|
25
|
+
return d.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' });
|
|
26
|
+
}
|
|
27
|
+
export function formatItemList(items, style) {
|
|
28
|
+
const idWidth = Math.max(...items.map((item) => item.id.length));
|
|
29
|
+
return items
|
|
30
|
+
.map((item) => {
|
|
31
|
+
const metrics = item.kind === 'package'
|
|
32
|
+
? `${formatNumber(item.installs)} installs · ${formatNumber(item.stars)} ★`
|
|
33
|
+
: `${formatNumber(item.stars)} ★`;
|
|
34
|
+
const badge = item.kind === 'package' ? pricingBadge(item.pricing, style) : '';
|
|
35
|
+
return [
|
|
36
|
+
`${style.accent(item.id.padEnd(idWidth))} ${style.dim(metrics)}`,
|
|
37
|
+
style.dim(item.name) + badge,
|
|
38
|
+
truncate(item.description, 88),
|
|
39
|
+
style.dim(`${item.category} · by ${item.author}`)
|
|
40
|
+
].join('\n');
|
|
41
|
+
})
|
|
42
|
+
.join('\n\n');
|
|
43
|
+
}
|
|
44
|
+
export function formatItemTable(items, style) {
|
|
45
|
+
const idW = Math.max(4, ...items.map((i) => i.id.length));
|
|
46
|
+
const nameW = Math.max(4, ...items.map((i) => i.name.length));
|
|
47
|
+
const starW = 6;
|
|
48
|
+
const installW = 9;
|
|
49
|
+
const totalW = idW + 3 + nameW + 3 + starW + 3 + installW + 4;
|
|
50
|
+
const top = '┌' + '─'.repeat(totalW - 2) + '┐';
|
|
51
|
+
const bot = '└' + '─'.repeat(totalW - 2) + '┘';
|
|
52
|
+
const sep = '│';
|
|
53
|
+
const hdr = sep +
|
|
54
|
+
' ' +
|
|
55
|
+
'id'.padEnd(idW) +
|
|
56
|
+
' │ ' +
|
|
57
|
+
'name'.padEnd(nameW) +
|
|
58
|
+
' │ ' +
|
|
59
|
+
'stars'.padStart(starW) +
|
|
60
|
+
' │ ' +
|
|
61
|
+
'installs'.padStart(installW) +
|
|
62
|
+
' │';
|
|
63
|
+
const rows = items.map((item) => sep +
|
|
64
|
+
' ' +
|
|
65
|
+
style.accent(item.id.padEnd(idW)) +
|
|
66
|
+
' │ ' +
|
|
67
|
+
style.dim(item.name.padEnd(nameW)) +
|
|
68
|
+
' │ ' +
|
|
69
|
+
style.dim(formatNumber(item.stars).padStart(starW)) +
|
|
70
|
+
' │ ' +
|
|
71
|
+
style.dim(formatNumber(item.installs).padStart(installW)) +
|
|
72
|
+
' │');
|
|
73
|
+
return [top, hdr, ...rows, bot].join('\n');
|
|
74
|
+
}
|
|
75
|
+
export function formatItemDetail(item, style) {
|
|
76
|
+
const badge = item.kind === 'package' ? pricingBadge(item.pricing, style) : '';
|
|
77
|
+
const lines = [
|
|
78
|
+
style.bold(item.name) + badge,
|
|
79
|
+
`${style.dim('id')} ${style.accent(item.id)}`,
|
|
80
|
+
`${style.dim('type')} ${item.kind}`,
|
|
81
|
+
`${style.dim('category')} ${item.category}`,
|
|
82
|
+
`${style.dim('author')} ${item.author}`,
|
|
83
|
+
`${style.dim('stars')} ${formatNumber(item.stars)}`,
|
|
84
|
+
`${style.dim('install')} ${getInstallKind(item)}`,
|
|
85
|
+
'',
|
|
86
|
+
item.description,
|
|
87
|
+
'',
|
|
88
|
+
`${style.dim('tags')} ${item.tags.join(', ')}`
|
|
89
|
+
];
|
|
90
|
+
if (item.kind === 'package') {
|
|
91
|
+
lines.splice(5, 0, `${style.dim('version')} ${item.version}`);
|
|
92
|
+
lines.push(`${style.dim('installs')} ${formatNumber(item.installs)}`);
|
|
93
|
+
if (item.repository)
|
|
94
|
+
lines.push(`${style.dim('repo')} ${item.repository}`);
|
|
95
|
+
if (item.npmPackage)
|
|
96
|
+
lines.push(`${style.dim('npm')} ${item.npmPackage}`);
|
|
97
|
+
if (item.permissions) {
|
|
98
|
+
const permRows = renderPermissionLines(item.permissions);
|
|
99
|
+
if (permRows.length > 1) {
|
|
100
|
+
lines.push('');
|
|
101
|
+
// First row is "Permissions" label; subsequent rows are the indented values.
|
|
102
|
+
lines.push(style.dim(permRows[0]));
|
|
103
|
+
for (const row of permRows.slice(1))
|
|
104
|
+
lines.push(row);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (item.kind === 'workflow') {
|
|
109
|
+
lines.push(`${style.dim('forks')} ${item.forks}`);
|
|
110
|
+
if (item.model)
|
|
111
|
+
lines.push(`${style.dim('model')} ${item.model}`);
|
|
112
|
+
lines.push('', style.dim('prompt'), item.prompt);
|
|
113
|
+
}
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
export function formatSavedList(items, style) {
|
|
117
|
+
return items
|
|
118
|
+
.map((entry, index) => {
|
|
119
|
+
if (!entry.item) {
|
|
120
|
+
return [
|
|
121
|
+
`${index + 1}. ${style.accent(entry.saved.id)} ${style.dim('[missing]')}`,
|
|
122
|
+
` ${style.dim('saved ' + formatDate(entry.saved.savedAt))}`
|
|
123
|
+
].join('\n');
|
|
124
|
+
}
|
|
125
|
+
return [
|
|
126
|
+
`${index + 1}. ${style.accent(entry.item.id)} ${style.dim('[' + entry.item.category + ']')}`,
|
|
127
|
+
` ${style.dim(entry.item.name)}`,
|
|
128
|
+
` ${truncate(entry.item.description, 88)}`,
|
|
129
|
+
` ${style.dim('saved ' + formatDate(entry.saved.savedAt))}`
|
|
130
|
+
].join('\n');
|
|
131
|
+
})
|
|
132
|
+
.join('\n\n');
|
|
133
|
+
}
|
|
134
|
+
export function formatReviewList(reviews, style) {
|
|
135
|
+
return reviews
|
|
136
|
+
.map((review, index) => {
|
|
137
|
+
return [
|
|
138
|
+
`${index + 1}. ${style.accent(review.itemId)} ${style.dim('[' + review.itemType + ']')}`,
|
|
139
|
+
` ${style.dim('rating ' + review.rating + '/5 by ' + review.author)}`,
|
|
140
|
+
` ${truncate(review.content, 88)}`
|
|
141
|
+
].join('\n');
|
|
142
|
+
})
|
|
143
|
+
.join('\n\n');
|
|
144
|
+
}
|
|
145
|
+
export function formatProfileDetail(profile, style) {
|
|
146
|
+
const lines = [
|
|
147
|
+
style.bold(profile.displayName),
|
|
148
|
+
`${style.dim('username')} ${style.accent(profile.username)}`,
|
|
149
|
+
`${style.dim('packages')} ${formatNumber(profile.packages)}`,
|
|
150
|
+
`${style.dim('workflows')} ${formatNumber(profile.workflows)}`,
|
|
151
|
+
`${style.dim('discussions')} ${formatNumber(profile.discussions)}`,
|
|
152
|
+
`${style.dim('reputation')} ${profile.reputation ?? 0}`
|
|
153
|
+
];
|
|
154
|
+
if (profile.bio)
|
|
155
|
+
lines.splice(2, 0, `${style.dim('bio')} ${profile.bio}`);
|
|
156
|
+
if (profile.avatarUrl)
|
|
157
|
+
lines.push(`${style.dim('avatar')} ${profile.avatarUrl}`);
|
|
158
|
+
if (profile.joinedAt)
|
|
159
|
+
lines.push(`${style.dim('joined')} ${formatDate(profile.joinedAt)}`);
|
|
160
|
+
return lines.join('\n');
|
|
161
|
+
}
|
|
162
|
+
export function formatTutorialList(tutorials, style) {
|
|
163
|
+
return tutorials
|
|
164
|
+
.map((tutorial, index) => {
|
|
165
|
+
return [
|
|
166
|
+
`${index + 1}. ${style.accent(tutorial.id)} ${style.dim('[' + tutorial.level + ']')}`,
|
|
167
|
+
` ${style.dim(tutorial.title)}`,
|
|
168
|
+
` ${truncate(tutorial.description, 88)}`,
|
|
169
|
+
` ${style.dim(tutorial.duration + ' | ' + tutorial.steps.length + ' steps')}`
|
|
170
|
+
].join('\n');
|
|
171
|
+
})
|
|
172
|
+
.join('\n\n');
|
|
173
|
+
}
|
|
174
|
+
export function formatTutorialStep(tutorial, stepNumber, style) {
|
|
175
|
+
const step = tutorial.steps[stepNumber - 1];
|
|
176
|
+
if (!step) {
|
|
177
|
+
return [
|
|
178
|
+
style.bold(tutorial.title),
|
|
179
|
+
style.dim(`Completed ${tutorial.steps.length}/${tutorial.steps.length} steps.`),
|
|
180
|
+
'Run agora tutorials for more tutorials.'
|
|
181
|
+
].join('\n');
|
|
182
|
+
}
|
|
183
|
+
const lines = [
|
|
184
|
+
style.bold(tutorial.title),
|
|
185
|
+
`${style.dim('id')} ${style.accent(tutorial.id)}`,
|
|
186
|
+
`${style.dim('level')} ${tutorial.level}`,
|
|
187
|
+
`${style.dim('duration')} ${tutorial.duration}`,
|
|
188
|
+
`${style.dim('step')} ${stepNumber}/${tutorial.steps.length}`,
|
|
189
|
+
'',
|
|
190
|
+
step.title || '',
|
|
191
|
+
step.content || ''
|
|
192
|
+
];
|
|
193
|
+
if (step.code) {
|
|
194
|
+
lines.push('', style.dim('code:'), step.code);
|
|
195
|
+
}
|
|
196
|
+
return lines.join('\n');
|
|
197
|
+
}
|
|
198
|
+
export function welcome(color, trueColor, style, version) {
|
|
199
|
+
if (!color) {
|
|
200
|
+
return [
|
|
201
|
+
'',
|
|
202
|
+
`agora · Developers' CLI marketplace and community hub · v${version}`,
|
|
203
|
+
'',
|
|
204
|
+
' Search agora search <query>',
|
|
205
|
+
' Browse agora trending · agora browse <id>',
|
|
206
|
+
' Learn agora tutorials · agora tutorial <id>',
|
|
207
|
+
' Install agora install <id> [--write]',
|
|
208
|
+
' Setup agora init [--mcp] · agora use <workflow>',
|
|
209
|
+
' Auth agora login [--api-url <url>]',
|
|
210
|
+
''
|
|
211
|
+
].join('\n');
|
|
212
|
+
}
|
|
213
|
+
const banner = renderBanner({ color, trueColor });
|
|
214
|
+
const box = renderBox('Welcome to Agora', [
|
|
215
|
+
"Developers' CLI marketplace and community hub - type a command, bash or chat:",
|
|
216
|
+
`v${version} · run \`agora help\` to get started`
|
|
217
|
+
], { color, trueColor });
|
|
218
|
+
const hint = [
|
|
219
|
+
`${style.dim('Search')} agora search <query>`,
|
|
220
|
+
`${style.dim('Browse')} agora trending · agora browse <id>`,
|
|
221
|
+
`${style.dim('Learn')} agora tutorials · agora tutorial <id>`,
|
|
222
|
+
`${style.dim('Install')} agora install <id> [--write]`,
|
|
223
|
+
`${style.dim('Setup')} agora init [--mcp] · agora use <workflow>`,
|
|
224
|
+
`${style.dim('Auth')} agora login [--api-url <url>]`
|
|
225
|
+
].join('\n');
|
|
226
|
+
return `\n${banner}\n\n${box}\n\n${hint}\n`;
|
|
227
|
+
}
|
|
228
|
+
export function header(title, meta, style) {
|
|
229
|
+
return [style.accent(title), ...meta.map((part) => style.dim(part))].join(style.dim(' · '));
|
|
230
|
+
}
|
|
231
|
+
export function usage(style, version) {
|
|
232
|
+
const nameWidth = Math.max(...COMMANDS.map((c) => c.name.length));
|
|
233
|
+
const groups = ['Marketplace', 'Setup', 'Library', 'Learn', 'Community'];
|
|
234
|
+
const lines = [
|
|
235
|
+
`${style.accent('agora')}${style.dim(` · Developers' CLI marketplace and community hub · v${version}`)}`,
|
|
236
|
+
''
|
|
237
|
+
];
|
|
238
|
+
for (const group of groups) {
|
|
239
|
+
const groupCmds = COMMANDS.filter((c) => c.group === group);
|
|
240
|
+
lines.push(style.dim(group));
|
|
241
|
+
for (const cmd of groupCmds) {
|
|
242
|
+
lines.push(` ${style.accent(cmd.name.padEnd(nameWidth))} ${style.dim(cmd.summary)}`);
|
|
243
|
+
}
|
|
244
|
+
lines.push('');
|
|
245
|
+
}
|
|
246
|
+
lines.push(style.dim('Run `agora help <command>` for details on any command.'));
|
|
247
|
+
return lines.join('\n');
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/cli/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { getAuthState, type ResolvedSavedItem } from '../state.js';
|
|
2
|
+
import type { Tutorial } from '../types.js';
|
|
3
|
+
import type { SourceOptions, SourceResult } from '../live.js';
|
|
4
|
+
import type { CliIo, ParsedArgs, OutputStream } from './flags.js';
|
|
5
|
+
export declare function writeLine(stream: OutputStream, value?: string): void;
|
|
6
|
+
export declare function writeJson(stream: OutputStream, value: unknown): void;
|
|
7
|
+
export declare function usageError(io: CliIo, message: string): number;
|
|
8
|
+
/**
|
|
9
|
+
* Returns true only when both stdout and stdin are real interactive TTYs AND the
|
|
10
|
+
* environment supports colour (i.e. not NO_COLOR or TERM=dumb). The gate keeps
|
|
11
|
+
* the interactive menu away from pipes, CI, and the test harness, all of which
|
|
12
|
+
* use non-TTY mock streams.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isInteractive(io: CliIo, env: Record<string, string | undefined>): boolean;
|
|
15
|
+
export declare function stringFlag(parsed: ParsedArgs, longName: string, shortName?: string): string | undefined;
|
|
16
|
+
export declare function requiredStringFlag(parsed: ParsedArgs, longName: string, shortName?: string): string | undefined;
|
|
17
|
+
export declare function numberFlag(parsed: ParsedArgs, longName: string, shortName?: string): number | undefined;
|
|
18
|
+
export declare function envString(io: CliIo, name: string): string | undefined;
|
|
19
|
+
export declare function authTokenInput(parsed: ParsedArgs, io: CliIo): string | undefined;
|
|
20
|
+
export declare function detectDataDir(parsed: ParsedArgs, io: CliIo): string;
|
|
21
|
+
export declare function sourceOptions(parsed: ParsedArgs, io: CliIo): Promise<SourceOptions>;
|
|
22
|
+
export declare function writeSourceOptions(parsed: ParsedArgs, io: CliIo): Promise<{
|
|
23
|
+
ok: true;
|
|
24
|
+
options: SourceOptions;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
error: string;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function readSourceOptions(parsed: ParsedArgs, io: CliIo): Promise<{
|
|
30
|
+
ok: true;
|
|
31
|
+
options: SourceOptions;
|
|
32
|
+
} | {
|
|
33
|
+
ok: false;
|
|
34
|
+
error: string;
|
|
35
|
+
}>;
|
|
36
|
+
export declare function sourceLabel(result: {
|
|
37
|
+
source: string;
|
|
38
|
+
}): string;
|
|
39
|
+
export declare function warnFallback<T>(result: SourceResult<T>, io: CliIo): void;
|
|
40
|
+
export declare function sourcePayload<T extends object, TValue>(result: SourceResult<TValue>, payload: T): T & {
|
|
41
|
+
source: string;
|
|
42
|
+
apiUrl?: string;
|
|
43
|
+
fallbackReason?: string;
|
|
44
|
+
};
|
|
45
|
+
export declare function maskToken(token: string): string;
|
|
46
|
+
export declare function formatRelativeExp(exp: number, nowSec: number): string;
|
|
47
|
+
export declare function authStatusPayload(dataDir: string, auth: ReturnType<typeof getAuthState>): {
|
|
48
|
+
dataDir: string;
|
|
49
|
+
statePath: string;
|
|
50
|
+
authenticated: boolean;
|
|
51
|
+
accessTokenPreview?: string;
|
|
52
|
+
accessExp?: number;
|
|
53
|
+
refreshTokenPreview?: string;
|
|
54
|
+
refreshExp?: number;
|
|
55
|
+
apiUrl?: string;
|
|
56
|
+
savedAt?: string;
|
|
57
|
+
};
|
|
58
|
+
export declare function matchesSavedQuery(entry: ResolvedSavedItem, query: string): boolean;
|
|
59
|
+
export declare function tutorialLevelFlag(parsed: ParsedArgs): {
|
|
60
|
+
ok: true;
|
|
61
|
+
value: string;
|
|
62
|
+
} | {
|
|
63
|
+
ok: false;
|
|
64
|
+
error: string;
|
|
65
|
+
};
|
|
66
|
+
export declare function tutorialStepNumber(parsed: ParsedArgs): {
|
|
67
|
+
ok: true;
|
|
68
|
+
value: number;
|
|
69
|
+
} | {
|
|
70
|
+
ok: false;
|
|
71
|
+
error: string;
|
|
72
|
+
};
|
|
73
|
+
export declare function tutorialStepPayload(tutorial: Tutorial, stepNumber: number): {
|
|
74
|
+
stepNumber: number;
|
|
75
|
+
totalSteps: number;
|
|
76
|
+
completed: boolean;
|
|
77
|
+
title?: string;
|
|
78
|
+
content?: string;
|
|
79
|
+
code?: string;
|
|
80
|
+
};
|
|
81
|
+
export declare function tagsFlag(parsed: ParsedArgs): string[];
|
|
82
|
+
export declare function promptInput(parsed: ParsedArgs, io: CliIo): string | undefined;
|
|
83
|
+
export declare function contentInput(parsed: ParsedArgs, io: CliIo): string | undefined;
|
|
84
|
+
export declare function itemTypeFlag(parsed: ParsedArgs, itemId: string): 'package' | 'workflow';
|
|
85
|
+
export declare function discussionCategoryFlag(parsed: ParsedArgs): {
|
|
86
|
+
ok: true;
|
|
87
|
+
value: string;
|
|
88
|
+
} | {
|
|
89
|
+
ok: false;
|
|
90
|
+
error: string;
|
|
91
|
+
};
|
|
92
|
+
export declare function extractSessionId(line: string): string | null;
|
|
93
|
+
export declare function persistChatSession(dataDir: string, sessionId: string): void;
|
|
94
|
+
export declare function loadLastChatSession(dataDir: string): string | undefined;
|
|
95
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/cli/helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import process from 'node:process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { detectAgoraDataDir, loadAgoraState, getAuthState, getAgoraStatePath, writeAgoraState } from '../state.js';
|
|
4
|
+
import { ensureFreshAccess } from '../auth/refresh.js';
|
|
5
|
+
import { dataRefreshedAt } from '../data.js';
|
|
6
|
+
// ── I/O helpers ──────────────────────────────────────────────────────────────
|
|
7
|
+
export function writeLine(stream, value = '') {
|
|
8
|
+
stream.write(value.endsWith('\n') ? value : `${value}\n`);
|
|
9
|
+
}
|
|
10
|
+
export function writeJson(stream, value) {
|
|
11
|
+
writeLine(stream, JSON.stringify(value, null, 2));
|
|
12
|
+
}
|
|
13
|
+
export function usageError(io, message) {
|
|
14
|
+
writeLine(io.stderr, message);
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns true only when both stdout and stdin are real interactive TTYs AND the
|
|
19
|
+
* environment supports colour (i.e. not NO_COLOR or TERM=dumb). The gate keeps
|
|
20
|
+
* the interactive menu away from pipes, CI, and the test harness, all of which
|
|
21
|
+
* use non-TTY mock streams.
|
|
22
|
+
*/
|
|
23
|
+
export function isInteractive(io, env) {
|
|
24
|
+
if (env.NO_COLOR != null)
|
|
25
|
+
return false;
|
|
26
|
+
if (env.TERM === 'dumb')
|
|
27
|
+
return false;
|
|
28
|
+
const stdoutTTY = Boolean(io.stdout.isTTY);
|
|
29
|
+
const stdinTTY = Boolean(process.stdin.isTTY);
|
|
30
|
+
return stdoutTTY && stdinTTY;
|
|
31
|
+
}
|
|
32
|
+
// ── Flag helpers ─────────────────────────────────────────────────────────────
|
|
33
|
+
export function stringFlag(parsed, longName, shortName) {
|
|
34
|
+
const value = parsed.flags[longName] ?? (shortName ? parsed.flags[shortName] : undefined);
|
|
35
|
+
return typeof value === 'string' ? value : undefined;
|
|
36
|
+
}
|
|
37
|
+
export function requiredStringFlag(parsed, longName, shortName) {
|
|
38
|
+
const value = stringFlag(parsed, longName, shortName);
|
|
39
|
+
return value?.trim() || undefined;
|
|
40
|
+
}
|
|
41
|
+
export function numberFlag(parsed, longName, shortName) {
|
|
42
|
+
const value = stringFlag(parsed, longName, shortName);
|
|
43
|
+
if (!value)
|
|
44
|
+
return undefined;
|
|
45
|
+
const parsedValue = Number(value);
|
|
46
|
+
return Number.isFinite(parsedValue) ? parsedValue : undefined;
|
|
47
|
+
}
|
|
48
|
+
export function envString(io, name) {
|
|
49
|
+
const value = io.env?.[name];
|
|
50
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
51
|
+
}
|
|
52
|
+
export function authTokenInput(parsed, io) {
|
|
53
|
+
return (requiredStringFlag(parsed, 'token') ||
|
|
54
|
+
envString(io, 'AGORA_TOKEN') ||
|
|
55
|
+
envString(io, 'AGORA_API_TOKEN'));
|
|
56
|
+
}
|
|
57
|
+
// ── Options helpers ──────────────────────────────────────────────────────────
|
|
58
|
+
export function detectDataDir(parsed, io) {
|
|
59
|
+
return detectAgoraDataDir({
|
|
60
|
+
explicitDir: stringFlag(parsed, 'dataDir'),
|
|
61
|
+
cwd: io.cwd,
|
|
62
|
+
env: io.env
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export async function sourceOptions(parsed, io) {
|
|
66
|
+
const explicitApiUrl = stringFlag(parsed, 'apiUrl');
|
|
67
|
+
const envApiUrl = envString(io, 'AGORA_API_URL');
|
|
68
|
+
const dataDir = detectDataDir(parsed, io);
|
|
69
|
+
let state = loadAgoraState(dataDir);
|
|
70
|
+
state = await ensureFreshAccess(state, { dataDir, fetcher: io.fetcher });
|
|
71
|
+
const storedAuth = getAuthState(state);
|
|
72
|
+
const storedApiUrl = storedAuth?.apiUrl;
|
|
73
|
+
const apiUrl = explicitApiUrl || envApiUrl || storedApiUrl || '';
|
|
74
|
+
const useApi = explicitApiUrl !== undefined ||
|
|
75
|
+
envApiUrl !== undefined ||
|
|
76
|
+
storedApiUrl !== undefined ||
|
|
77
|
+
Boolean(parsed.flags.api) ||
|
|
78
|
+
Boolean(parsed.flags.live);
|
|
79
|
+
return {
|
|
80
|
+
useApi,
|
|
81
|
+
apiUrl,
|
|
82
|
+
token: authTokenInput(parsed, io) || storedAuth?.accessToken,
|
|
83
|
+
fetcher: io.fetcher,
|
|
84
|
+
timeoutMs: numberFlag(parsed, 'apiTimeout')
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export async function writeSourceOptions(parsed, io) {
|
|
88
|
+
const options = await sourceOptions(parsed, io);
|
|
89
|
+
if (!options.apiUrl) {
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
error: 'This command requires --api-url, AGORA_API_URL, or an auth login API URL'
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (!options.token) {
|
|
96
|
+
return {
|
|
97
|
+
ok: false,
|
|
98
|
+
error: 'This command requires --token, AGORA_TOKEN, AGORA_API_TOKEN, or agora auth login'
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
return { ok: true, options: { ...options, useApi: true } };
|
|
102
|
+
}
|
|
103
|
+
export async function readSourceOptions(parsed, io) {
|
|
104
|
+
const options = await sourceOptions(parsed, io);
|
|
105
|
+
if (!options.apiUrl) {
|
|
106
|
+
return {
|
|
107
|
+
ok: false,
|
|
108
|
+
error: 'This command requires --api-url, AGORA_API_URL, or an auth login API URL'
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
return { ok: true, options: { ...options, useApi: true } };
|
|
112
|
+
}
|
|
113
|
+
// ── Source display helpers ──────────────────────────────────────────────────
|
|
114
|
+
export function sourceLabel(result) {
|
|
115
|
+
return result.source === 'offline'
|
|
116
|
+
? `source: offline · refreshed ${dataRefreshedAt}`
|
|
117
|
+
: `source: ${result.source}`;
|
|
118
|
+
}
|
|
119
|
+
export function warnFallback(result, io) {
|
|
120
|
+
if (result.fallbackReason) {
|
|
121
|
+
writeLine(io.stderr, `Warning: API unavailable — using offline data (cached ${dataRefreshedAt})`);
|
|
122
|
+
writeLine(io.stderr, ` Reason: ${result.fallbackReason}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function sourcePayload(result, payload) {
|
|
126
|
+
return {
|
|
127
|
+
source: result.source,
|
|
128
|
+
apiUrl: result.apiUrl,
|
|
129
|
+
fallbackReason: result.fallbackReason,
|
|
130
|
+
...payload
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// ── Auth display helpers ────────────────────────────────────────────────────
|
|
134
|
+
export function maskToken(token) {
|
|
135
|
+
const value = token.trim();
|
|
136
|
+
if (value.length <= 4)
|
|
137
|
+
return '****';
|
|
138
|
+
if (value.length <= 8)
|
|
139
|
+
return `${'*'.repeat(value.length - 4)}${value.slice(-4)}`;
|
|
140
|
+
return `${value.slice(0, 4)}...${value.slice(-4)}`;
|
|
141
|
+
}
|
|
142
|
+
export function formatRelativeExp(exp, nowSec) {
|
|
143
|
+
if (exp === 0)
|
|
144
|
+
return 'unknown';
|
|
145
|
+
const diff = exp - nowSec;
|
|
146
|
+
if (diff <= 0)
|
|
147
|
+
return 'expired';
|
|
148
|
+
if (diff < 3600)
|
|
149
|
+
return `${Math.round(diff / 60)}m`;
|
|
150
|
+
if (diff < 86400)
|
|
151
|
+
return `${Math.round(diff / 3600)}h`;
|
|
152
|
+
return `${Math.round(diff / 86400)}d`;
|
|
153
|
+
}
|
|
154
|
+
export function authStatusPayload(dataDir, auth) {
|
|
155
|
+
return {
|
|
156
|
+
dataDir,
|
|
157
|
+
statePath: getAgoraStatePath(dataDir),
|
|
158
|
+
authenticated: Boolean(auth),
|
|
159
|
+
accessTokenPreview: auth ? maskToken(auth.accessToken) : undefined,
|
|
160
|
+
accessExp: auth?.accessExp,
|
|
161
|
+
refreshTokenPreview: auth?.refreshToken ? maskToken(auth.refreshToken) : undefined,
|
|
162
|
+
refreshExp: auth?.refreshExp,
|
|
163
|
+
apiUrl: auth?.apiUrl,
|
|
164
|
+
savedAt: auth?.savedAt
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// ── Search helpers ──────────────────────────────────────────────────────────
|
|
168
|
+
export function matchesSavedQuery(entry, query) {
|
|
169
|
+
if (!query)
|
|
170
|
+
return true;
|
|
171
|
+
const searchable = entry.item
|
|
172
|
+
? [
|
|
173
|
+
entry.item.id,
|
|
174
|
+
entry.item.name,
|
|
175
|
+
entry.item.description,
|
|
176
|
+
entry.item.author,
|
|
177
|
+
entry.item.category,
|
|
178
|
+
...entry.item.tags
|
|
179
|
+
].join(' ')
|
|
180
|
+
: entry.saved.id;
|
|
181
|
+
return searchable.toLowerCase().includes(query);
|
|
182
|
+
}
|
|
183
|
+
// ── Tutorial helpers ────────────────────────────────────────────────────────
|
|
184
|
+
export function tutorialLevelFlag(parsed) {
|
|
185
|
+
const level = stringFlag(parsed, 'level') || 'all';
|
|
186
|
+
if (level === 'all' || level === 'beginner' || level === 'intermediate' || level === 'advanced') {
|
|
187
|
+
return { ok: true, value: level };
|
|
188
|
+
}
|
|
189
|
+
return { ok: false, error: 'tutorial level must be beginner, intermediate, advanced, or all' };
|
|
190
|
+
}
|
|
191
|
+
export function tutorialStepNumber(parsed) {
|
|
192
|
+
const rawStep = parsed.args[1] || stringFlag(parsed, 'step');
|
|
193
|
+
if (!rawStep)
|
|
194
|
+
return { ok: true, value: 1 };
|
|
195
|
+
const step = Number(rawStep);
|
|
196
|
+
if (!Number.isInteger(step) || step < 1) {
|
|
197
|
+
return { ok: false, error: 'tutorial step must be a positive integer' };
|
|
198
|
+
}
|
|
199
|
+
return { ok: true, value: step };
|
|
200
|
+
}
|
|
201
|
+
export function tutorialStepPayload(tutorial, stepNumber) {
|
|
202
|
+
const step = tutorial.steps[stepNumber - 1];
|
|
203
|
+
return {
|
|
204
|
+
stepNumber,
|
|
205
|
+
totalSteps: tutorial.steps.length,
|
|
206
|
+
completed: !step,
|
|
207
|
+
title: step?.title,
|
|
208
|
+
content: step?.content,
|
|
209
|
+
code: step?.code
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
// ── Input helpers ───────────────────────────────────────────────────────────
|
|
213
|
+
export function tagsFlag(parsed) {
|
|
214
|
+
const value = stringFlag(parsed, 'tags');
|
|
215
|
+
if (!value)
|
|
216
|
+
return [];
|
|
217
|
+
return value
|
|
218
|
+
.split(',')
|
|
219
|
+
.map((tag) => tag.trim())
|
|
220
|
+
.filter(Boolean);
|
|
221
|
+
}
|
|
222
|
+
export function promptInput(parsed, io) {
|
|
223
|
+
const prompt = stringFlag(parsed, 'prompt');
|
|
224
|
+
if (prompt)
|
|
225
|
+
return prompt;
|
|
226
|
+
const promptFile = stringFlag(parsed, 'promptFile');
|
|
227
|
+
if (!promptFile)
|
|
228
|
+
return undefined;
|
|
229
|
+
if (!existsSync(promptFile)) {
|
|
230
|
+
usageError(io, `prompt-file not found: ${promptFile}`);
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
return readFileSync(promptFile, 'utf8');
|
|
234
|
+
}
|
|
235
|
+
export function contentInput(parsed, io) {
|
|
236
|
+
const content = requiredStringFlag(parsed, 'content');
|
|
237
|
+
if (content)
|
|
238
|
+
return content;
|
|
239
|
+
const contentFile = stringFlag(parsed, 'contentFile');
|
|
240
|
+
if (!contentFile)
|
|
241
|
+
return undefined;
|
|
242
|
+
if (!existsSync(contentFile)) {
|
|
243
|
+
usageError(io, `content-file not found: ${contentFile}`);
|
|
244
|
+
return undefined;
|
|
245
|
+
}
|
|
246
|
+
return readFileSync(contentFile, 'utf8').trim();
|
|
247
|
+
}
|
|
248
|
+
export function itemTypeFlag(parsed, itemId) {
|
|
249
|
+
const type = stringFlag(parsed, 'type', 't');
|
|
250
|
+
if (type === 'workflow' || itemId.startsWith('wf-'))
|
|
251
|
+
return 'workflow';
|
|
252
|
+
return 'package';
|
|
253
|
+
}
|
|
254
|
+
export function discussionCategoryFlag(parsed) {
|
|
255
|
+
const category = stringFlag(parsed, 'category', 'c') || 'discussion';
|
|
256
|
+
if (category === 'question' ||
|
|
257
|
+
category === 'idea' ||
|
|
258
|
+
category === 'showcase' ||
|
|
259
|
+
category === 'discussion') {
|
|
260
|
+
return { ok: true, value: category };
|
|
261
|
+
}
|
|
262
|
+
return {
|
|
263
|
+
ok: false,
|
|
264
|
+
error: 'discussion category must be question, idea, showcase, or discussion'
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// ── Chat helpers ────────────────────────────────────────────────────────────
|
|
268
|
+
export function extractSessionId(line) {
|
|
269
|
+
try {
|
|
270
|
+
const ev = JSON.parse(line);
|
|
271
|
+
if (ev.sessionID && typeof ev.sessionID === 'string')
|
|
272
|
+
return ev.sessionID;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
/* not JSON, skip */
|
|
276
|
+
}
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
export function persistChatSession(dataDir, sessionId) {
|
|
280
|
+
try {
|
|
281
|
+
const state = loadAgoraState(dataDir);
|
|
282
|
+
const updated = {
|
|
283
|
+
...state,
|
|
284
|
+
_meta: { ...(state._meta || {}), lastChatSession: sessionId }
|
|
285
|
+
};
|
|
286
|
+
writeAgoraState(dataDir, updated);
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
// best-effort
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
export function loadLastChatSession(dataDir) {
|
|
293
|
+
try {
|
|
294
|
+
const state = loadAgoraState(dataDir);
|
|
295
|
+
return state._meta?.lastChatSession;
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=helpers.js.map
|