opencode-agora 0.3.0 → 0.4.1

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 (280) hide show
  1. package/README.md +86 -255
  2. package/dist/atomic-write.d.ts +10 -0
  3. package/dist/atomic-write.d.ts.map +1 -0
  4. package/dist/atomic-write.js +23 -0
  5. package/dist/atomic-write.js.map +1 -0
  6. package/dist/auth/refresh.d.ts +17 -0
  7. package/dist/auth/refresh.d.ts.map +1 -0
  8. package/dist/auth/refresh.js +50 -0
  9. package/dist/auth/refresh.js.map +1 -0
  10. package/dist/cli/app.d.ts +13 -18
  11. package/dist/cli/app.d.ts.map +1 -1
  12. package/dist/cli/app.js +184 -1187
  13. package/dist/cli/app.js.map +1 -1
  14. package/dist/cli/chat-renderer.d.ts +31 -0
  15. package/dist/cli/chat-renderer.d.ts.map +1 -0
  16. package/dist/cli/chat-renderer.js +275 -0
  17. package/dist/cli/chat-renderer.js.map +1 -0
  18. package/dist/cli/commands/browse.d.ts +4 -0
  19. package/dist/cli/commands/browse.d.ts.map +1 -0
  20. package/dist/cli/commands/browse.js +80 -0
  21. package/dist/cli/commands/browse.js.map +1 -0
  22. package/dist/cli/commands/chat.d.ts +4 -0
  23. package/dist/cli/commands/chat.d.ts.map +1 -0
  24. package/dist/cli/commands/chat.js +125 -0
  25. package/dist/cli/commands/chat.js.map +1 -0
  26. package/dist/cli/commands/community.d.ts +12 -0
  27. package/dist/cli/commands/community.d.ts.map +1 -0
  28. package/dist/cli/commands/community.js +453 -0
  29. package/dist/cli/commands/community.js.map +1 -0
  30. package/dist/cli/commands/export.d.ts +3 -0
  31. package/dist/cli/commands/export.d.ts.map +1 -0
  32. package/dist/cli/commands/export.js +108 -0
  33. package/dist/cli/commands/export.js.map +1 -0
  34. package/dist/cli/commands/init.d.ts +4 -0
  35. package/dist/cli/commands/init.d.ts.map +1 -0
  36. package/dist/cli/commands/init.js +299 -0
  37. package/dist/cli/commands/init.js.map +1 -0
  38. package/dist/cli/commands/learn.d.ts +4 -0
  39. package/dist/cli/commands/learn.d.ts.map +1 -0
  40. package/dist/cli/commands/learn.js +62 -0
  41. package/dist/cli/commands/learn.js.map +1 -0
  42. package/dist/cli/commands/marketplace.d.ts +9 -0
  43. package/dist/cli/commands/marketplace.d.ts.map +1 -0
  44. package/dist/cli/commands/marketplace.js +321 -0
  45. package/dist/cli/commands/marketplace.js.map +1 -0
  46. package/dist/cli/commands/notify.d.ts +3 -0
  47. package/dist/cli/commands/notify.d.ts.map +1 -0
  48. package/dist/cli/commands/notify.js +59 -0
  49. package/dist/cli/commands/notify.js.map +1 -0
  50. package/dist/cli/commands/operations.d.ts +16 -0
  51. package/dist/cli/commands/operations.d.ts.map +1 -0
  52. package/dist/cli/commands/operations.js +1006 -0
  53. package/dist/cli/commands/operations.js.map +1 -0
  54. package/dist/cli/commands/ping.d.ts +3 -0
  55. package/dist/cli/commands/ping.d.ts.map +1 -0
  56. package/dist/cli/commands/ping.js +56 -0
  57. package/dist/cli/commands/ping.js.map +1 -0
  58. package/dist/cli/commands/today.d.ts +3 -0
  59. package/dist/cli/commands/today.d.ts.map +1 -0
  60. package/dist/cli/commands/today.js +142 -0
  61. package/dist/cli/commands/today.js.map +1 -0
  62. package/dist/cli/commands/types.d.ts +5 -0
  63. package/dist/cli/commands/types.d.ts.map +1 -0
  64. package/dist/cli/commands/types.js +2 -0
  65. package/dist/cli/commands/types.js.map +1 -0
  66. package/dist/cli/commands/watch.d.ts +3 -0
  67. package/dist/cli/commands/watch.d.ts.map +1 -0
  68. package/dist/cli/commands/watch.js +41 -0
  69. package/dist/cli/commands/watch.js.map +1 -0
  70. package/dist/cli/commands/welcome.d.ts +3 -0
  71. package/dist/cli/commands/welcome.d.ts.map +1 -0
  72. package/dist/cli/commands/welcome.js +97 -0
  73. package/dist/cli/commands/welcome.js.map +1 -0
  74. package/dist/cli/commands-meta.d.ts +21 -0
  75. package/dist/cli/commands-meta.d.ts.map +1 -0
  76. package/dist/cli/commands-meta.js +828 -0
  77. package/dist/cli/commands-meta.js.map +1 -0
  78. package/dist/cli/completions-gen.d.ts +2 -0
  79. package/dist/cli/completions-gen.d.ts.map +1 -0
  80. package/dist/cli/completions-gen.js +195 -0
  81. package/dist/cli/completions-gen.js.map +1 -0
  82. package/dist/cli/completions.d.ts +18 -0
  83. package/dist/cli/completions.d.ts.map +1 -0
  84. package/dist/cli/completions.js +227 -0
  85. package/dist/cli/completions.js.map +1 -0
  86. package/dist/cli/flags.d.ts +19 -0
  87. package/dist/cli/flags.d.ts.map +1 -0
  88. package/dist/cli/flags.js +91 -0
  89. package/dist/cli/flags.js.map +1 -0
  90. package/dist/cli/format.d.ts +19 -0
  91. package/dist/cli/format.d.ts.map +1 -0
  92. package/dist/cli/format.js +249 -0
  93. package/dist/cli/format.js.map +1 -0
  94. package/dist/cli/helpers.d.ts +95 -0
  95. package/dist/cli/helpers.d.ts.map +1 -0
  96. package/dist/cli/helpers.js +301 -0
  97. package/dist/cli/helpers.js.map +1 -0
  98. package/dist/cli/mcp-server.d.ts +4 -0
  99. package/dist/cli/mcp-server.d.ts.map +1 -0
  100. package/dist/cli/mcp-server.js +277 -0
  101. package/dist/cli/mcp-server.js.map +1 -0
  102. package/dist/cli/menu.d.ts +7 -0
  103. package/dist/cli/menu.d.ts.map +1 -0
  104. package/dist/cli/menu.js +172 -0
  105. package/dist/cli/menu.js.map +1 -0
  106. package/dist/cli/pages/community.d.ts +9 -0
  107. package/dist/cli/pages/community.d.ts.map +1 -0
  108. package/dist/cli/pages/community.js +1094 -0
  109. package/dist/cli/pages/community.js.map +1 -0
  110. package/dist/cli/pages/helpers.d.ts +37 -0
  111. package/dist/cli/pages/helpers.d.ts.map +1 -0
  112. package/dist/cli/pages/helpers.js +98 -0
  113. package/dist/cli/pages/helpers.js.map +1 -0
  114. package/dist/cli/pages/home.d.ts +4 -0
  115. package/dist/cli/pages/home.d.ts.map +1 -0
  116. package/dist/cli/pages/home.js +231 -0
  117. package/dist/cli/pages/home.js.map +1 -0
  118. package/dist/cli/pages/marketplace.d.ts +5 -0
  119. package/dist/cli/pages/marketplace.d.ts.map +1 -0
  120. package/dist/cli/pages/marketplace.js +583 -0
  121. package/dist/cli/pages/marketplace.js.map +1 -0
  122. package/dist/cli/pages/news.d.ts +31 -0
  123. package/dist/cli/pages/news.d.ts.map +1 -0
  124. package/dist/cli/pages/news.js +688 -0
  125. package/dist/cli/pages/news.js.map +1 -0
  126. package/dist/cli/pages/settings.d.ts +3 -0
  127. package/dist/cli/pages/settings.d.ts.map +1 -0
  128. package/dist/cli/pages/settings.js +296 -0
  129. package/dist/cli/pages/settings.js.map +1 -0
  130. package/dist/cli/pages/types.d.ts +67 -0
  131. package/dist/cli/pages/types.d.ts.map +1 -0
  132. package/dist/cli/pages/types.js +2 -0
  133. package/dist/cli/pages/types.js.map +1 -0
  134. package/dist/cli/prompter.d.ts +135 -0
  135. package/dist/cli/prompter.d.ts.map +1 -0
  136. package/dist/cli/prompter.js +710 -0
  137. package/dist/cli/prompter.js.map +1 -0
  138. package/dist/cli/shell.d.ts +23 -0
  139. package/dist/cli/shell.d.ts.map +1 -0
  140. package/dist/cli/shell.js +1106 -0
  141. package/dist/cli/shell.js.map +1 -0
  142. package/dist/cli/tui.d.ts +7 -0
  143. package/dist/cli/tui.d.ts.map +1 -0
  144. package/dist/cli/tui.js +419 -0
  145. package/dist/cli/tui.js.map +1 -0
  146. package/dist/cli.js +1 -1
  147. package/dist/cli.js.map +1 -1
  148. package/dist/commands.d.ts +14 -0
  149. package/dist/commands.d.ts.map +1 -0
  150. package/dist/commands.js +28 -0
  151. package/dist/commands.js.map +1 -0
  152. package/dist/community/client.d.ts +84 -0
  153. package/dist/community/client.d.ts.map +1 -0
  154. package/dist/community/client.js +340 -0
  155. package/dist/community/client.js.map +1 -0
  156. package/dist/community/search.d.ts +25 -0
  157. package/dist/community/search.d.ts.map +1 -0
  158. package/dist/community/search.js +62 -0
  159. package/dist/community/search.js.map +1 -0
  160. package/dist/community/types.d.ts +71 -0
  161. package/dist/community/types.d.ts.map +1 -0
  162. package/dist/community/types.js +11 -0
  163. package/dist/community/types.js.map +1 -0
  164. package/dist/config.d.ts +1 -7
  165. package/dist/config.d.ts.map +1 -1
  166. package/dist/config.js +0 -32
  167. package/dist/config.js.map +1 -1
  168. package/dist/data.d.ts +1 -1
  169. package/dist/data.d.ts.map +1 -1
  170. package/dist/data.js +778 -40
  171. package/dist/data.js.map +1 -1
  172. package/dist/format.d.ts +5 -39
  173. package/dist/format.d.ts.map +1 -1
  174. package/dist/format.js +5 -120
  175. package/dist/format.js.map +1 -1
  176. package/dist/history.d.ts +13 -0
  177. package/dist/history.d.ts.map +1 -0
  178. package/dist/history.js +37 -0
  179. package/dist/history.js.map +1 -0
  180. package/dist/hubs/cache.d.ts +6 -0
  181. package/dist/hubs/cache.d.ts.map +1 -0
  182. package/dist/hubs/cache.js +46 -0
  183. package/dist/hubs/cache.js.map +1 -0
  184. package/dist/hubs/enrichment.d.ts +43 -0
  185. package/dist/hubs/enrichment.d.ts.map +1 -0
  186. package/dist/hubs/enrichment.js +239 -0
  187. package/dist/hubs/enrichment.js.map +1 -0
  188. package/dist/hubs/github.d.ts +12 -0
  189. package/dist/hubs/github.d.ts.map +1 -0
  190. package/dist/hubs/github.js +54 -0
  191. package/dist/hubs/github.js.map +1 -0
  192. package/dist/hubs/huggingface.d.ts +27 -0
  193. package/dist/hubs/huggingface.d.ts.map +1 -0
  194. package/dist/hubs/huggingface.js +88 -0
  195. package/dist/hubs/huggingface.js.map +1 -0
  196. package/dist/hubs/quality.d.ts +26 -0
  197. package/dist/hubs/quality.d.ts.map +1 -0
  198. package/dist/hubs/quality.js +57 -0
  199. package/dist/hubs/quality.js.map +1 -0
  200. package/dist/hubs/types.d.ts +30 -0
  201. package/dist/hubs/types.d.ts.map +1 -0
  202. package/dist/hubs/types.js +2 -0
  203. package/dist/hubs/types.js.map +1 -0
  204. package/dist/index.d.ts.map +1 -1
  205. package/dist/index.js +188 -224
  206. package/dist/index.js.map +1 -1
  207. package/dist/init.d.ts.map +1 -1
  208. package/dist/init.js +6 -11
  209. package/dist/init.js.map +1 -1
  210. package/dist/live.d.ts +14 -0
  211. package/dist/live.d.ts.map +1 -1
  212. package/dist/live.js +35 -3
  213. package/dist/live.js.map +1 -1
  214. package/dist/marketplace.d.ts +25 -3
  215. package/dist/marketplace.d.ts.map +1 -1
  216. package/dist/marketplace.js +279 -22
  217. package/dist/marketplace.js.map +1 -1
  218. package/dist/news/cache.d.ts +13 -0
  219. package/dist/news/cache.d.ts.map +1 -0
  220. package/dist/news/cache.js +66 -0
  221. package/dist/news/cache.js.map +1 -0
  222. package/dist/news/score.d.ts +4 -0
  223. package/dist/news/score.d.ts.map +1 -0
  224. package/dist/news/score.js +43 -0
  225. package/dist/news/score.js.map +1 -0
  226. package/dist/news/sources/arxiv.d.ts +9 -0
  227. package/dist/news/sources/arxiv.d.ts.map +1 -0
  228. package/dist/news/sources/arxiv.js +107 -0
  229. package/dist/news/sources/arxiv.js.map +1 -0
  230. package/dist/news/sources/github-trending.d.ts +9 -0
  231. package/dist/news/sources/github-trending.d.ts.map +1 -0
  232. package/dist/news/sources/github-trending.js +97 -0
  233. package/dist/news/sources/github-trending.js.map +1 -0
  234. package/dist/news/sources/hn.d.ts +9 -0
  235. package/dist/news/sources/hn.d.ts.map +1 -0
  236. package/dist/news/sources/hn.js +57 -0
  237. package/dist/news/sources/hn.js.map +1 -0
  238. package/dist/news/sources/reddit.d.ts +9 -0
  239. package/dist/news/sources/reddit.d.ts.map +1 -0
  240. package/dist/news/sources/reddit.js +69 -0
  241. package/dist/news/sources/reddit.js.map +1 -0
  242. package/dist/news/sources/rss.d.ts +13 -0
  243. package/dist/news/sources/rss.d.ts.map +1 -0
  244. package/dist/news/sources/rss.js +14 -0
  245. package/dist/news/sources/rss.js.map +1 -0
  246. package/dist/news/types.d.ts +42 -0
  247. package/dist/news/types.d.ts.map +1 -0
  248. package/dist/news/types.js +56 -0
  249. package/dist/news/types.js.map +1 -0
  250. package/dist/preferences.d.ts +14 -0
  251. package/dist/preferences.d.ts.map +1 -0
  252. package/dist/preferences.js +31 -0
  253. package/dist/preferences.js.map +1 -0
  254. package/dist/settings.d.ts +26 -0
  255. package/dist/settings.d.ts.map +1 -0
  256. package/dist/settings.js +251 -0
  257. package/dist/settings.js.map +1 -0
  258. package/dist/state.d.ts +9 -2
  259. package/dist/state.d.ts.map +1 -1
  260. package/dist/state.js +41 -19
  261. package/dist/state.js.map +1 -1
  262. package/dist/transcript.d.ts +28 -0
  263. package/dist/transcript.d.ts.map +1 -0
  264. package/dist/transcript.js +79 -0
  265. package/dist/transcript.js.map +1 -0
  266. package/dist/types.d.ts +19 -1
  267. package/dist/types.d.ts.map +1 -1
  268. package/dist/ui.d.ts +157 -0
  269. package/dist/ui.d.ts.map +1 -0
  270. package/dist/ui.js +296 -0
  271. package/dist/ui.js.map +1 -0
  272. package/package.json +11 -9
  273. package/dist/api.d.ts +0 -72
  274. package/dist/api.d.ts.map +0 -1
  275. package/dist/api.js +0 -109
  276. package/dist/api.js.map +0 -1
  277. package/dist/logger.d.ts +0 -20
  278. package/dist/logger.d.ts.map +0 -1
  279. package/dist/logger.js +0 -59
  280. package/dist/logger.js.map +0 -1
@@ -0,0 +1,84 @@
1
+ import type { BoardId, BoardSummary, Thread, Reply, Flag, SearchResult } from './types.js';
2
+ import type { SourceOptions, SourceResult } from '../live.js';
3
+ export interface CommunityBoardsResult {
4
+ boards: BoardSummary[];
5
+ }
6
+ export interface CommunityThreadsResult {
7
+ threads: Thread[];
8
+ total?: number;
9
+ page?: number;
10
+ hasMore?: boolean;
11
+ }
12
+ export interface CommunityThreadResult {
13
+ thread: Thread | null;
14
+ replies: Reply[];
15
+ }
16
+ export interface CreateThreadInput {
17
+ board: BoardId;
18
+ title: string;
19
+ content: string;
20
+ }
21
+ export interface CreateReplyInput {
22
+ content: string;
23
+ parentId?: string;
24
+ }
25
+ export interface VoteInput {
26
+ value: -1 | 0 | 1;
27
+ targetType: 'discussion' | 'reply';
28
+ }
29
+ export interface FlagInput {
30
+ reason: Flag['reason'];
31
+ notes?: string;
32
+ targetType: 'discussion' | 'reply';
33
+ }
34
+ export declare function communityBoardsSource(opts: SourceOptions): Promise<SourceResult<CommunityBoardsResult>>;
35
+ export declare function communityThreadsSource(opts: SourceOptions, board: BoardId, sort?: 'top' | 'new' | 'active', page?: number): Promise<SourceResult<CommunityThreadsResult>>;
36
+ export declare function communityThreadSource(opts: SourceOptions, threadId: string): Promise<SourceResult<CommunityThreadResult>>;
37
+ export declare function createThreadSource(opts: SourceOptions, input: CreateThreadInput): Promise<SourceResult<{
38
+ thread: Thread | null;
39
+ }>>;
40
+ export declare function createReplySource(opts: SourceOptions, parentId: string, input: CreateReplyInput): Promise<SourceResult<{
41
+ reply: Reply | null;
42
+ }>>;
43
+ export interface CommunitySearchResult extends SearchResult {
44
+ }
45
+ export declare function communitySearchSource(opts: SourceOptions, query: string, board?: BoardId, limit?: number): Promise<SourceResult<CommunitySearchResult>>;
46
+ export interface VoteResult {
47
+ score: number;
48
+ userVote: -1 | 0 | 1;
49
+ }
50
+ export declare function voteSource(opts: SourceOptions, targetId: string, input: VoteInput): Promise<SourceResult<VoteResult>>;
51
+ export interface AdminHideInput {
52
+ targetType: 'discussion' | 'reply';
53
+ reason: string;
54
+ }
55
+ export interface AdminHideResult {
56
+ success: boolean;
57
+ id: string;
58
+ alreadyHidden: boolean;
59
+ }
60
+ export interface AdminLogEntry {
61
+ id: string;
62
+ targetId: string;
63
+ targetType: string;
64
+ reason: string;
65
+ operatorId: string;
66
+ operatorUsername: string;
67
+ actedAt: string;
68
+ }
69
+ export interface AdminLogResult {
70
+ entries: AdminLogEntry[];
71
+ }
72
+ export declare function adminHideSource(opts: SourceOptions, targetId: string, input: AdminHideInput): Promise<SourceResult<AdminHideResult>>;
73
+ export interface AdminRecomputeResult {
74
+ recomputed: number;
75
+ durationMs: number;
76
+ }
77
+ export declare function adminRecomputeSource(opts: SourceOptions): Promise<SourceResult<AdminRecomputeResult>>;
78
+ export declare function adminLogSource(opts: SourceOptions, { limit }: {
79
+ limit?: number;
80
+ }): Promise<SourceResult<AdminLogResult>>;
81
+ export declare function flagSource(opts: SourceOptions, targetId: string, input: FlagInput): Promise<SourceResult<{
82
+ success: boolean;
83
+ }>>;
84
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/community/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,340 @@
1
+ import { BOARD_IDS } from './types.js';
2
+ const FIXTURE_BOARDS = BOARD_IDS.map((id) => ({
3
+ id,
4
+ threadCount: id === 'mcp' ? 236 : id === 'agents' ? 112 : id === 'ask' ? 201 : 64,
5
+ newToday: id === 'mcp' ? 14 : id === 'agents' ? 8 : id === 'ask' ? 6 : 2
6
+ }));
7
+ const FIXTURE_THREADS = {
8
+ mcp: [
9
+ {
10
+ id: 't-mcp-1',
11
+ board: 'mcp',
12
+ title: 'How are you composing servers?',
13
+ author: 'ada',
14
+ content: 'I am stacking mcp-postgres, mcp-filesystem and a thin orchestrator. Anyone using a different pattern?',
15
+ score: 12,
16
+ replyCount: 7,
17
+ flagCount: 0,
18
+ createdAt: new Date(Date.now() - 6 * 3600000).toISOString(),
19
+ updatedAt: new Date(Date.now() - 2 * 3600000).toISOString()
20
+ },
21
+ {
22
+ id: 't-mcp-2',
23
+ board: 'mcp',
24
+ title: 'Lifecycle hooks: keep them or drop them?',
25
+ author: 'lin',
26
+ content: 'The spec is ambiguous about init/shutdown ordering when multiple servers share transports.',
27
+ score: 8,
28
+ replyCount: 4,
29
+ flagCount: 0,
30
+ createdAt: new Date(Date.now() - 14 * 3600000).toISOString(),
31
+ updatedAt: new Date(Date.now() - 10 * 3600000).toISOString()
32
+ }
33
+ ],
34
+ agents: [
35
+ {
36
+ id: 't-agents-1',
37
+ board: 'agents',
38
+ title: 'Best local model for tool use today?',
39
+ author: 'bob',
40
+ content: 'Testing Qwen2.5 7B vs Llama 3.1 8B for MCP tool calling. Results inside.',
41
+ score: 24,
42
+ replyCount: 12,
43
+ flagCount: 1,
44
+ createdAt: new Date(Date.now() - 4 * 3600000).toISOString(),
45
+ updatedAt: new Date(Date.now() - 1 * 3600000).toISOString()
46
+ }
47
+ ]
48
+ };
49
+ const FIXTURE_REPLIES = {
50
+ 't-mcp-1': [
51
+ {
52
+ id: 'r-mcp-1-1',
53
+ threadId: 't-mcp-1',
54
+ author: 'lin',
55
+ content: 'We compose at the orchestrator and keep servers single-purpose.',
56
+ score: 4,
57
+ flagCount: 0,
58
+ createdAt: new Date(Date.now() - 5 * 3600000).toISOString()
59
+ },
60
+ {
61
+ id: 'r-mcp-1-2',
62
+ threadId: 't-mcp-1',
63
+ parentId: 'r-mcp-1-1',
64
+ author: 'ada',
65
+ content: 'Useful, thanks. Do you use a shared schema package?',
66
+ score: 2,
67
+ flagCount: 0,
68
+ createdAt: new Date(Date.now() - 4 * 3600000).toISOString()
69
+ }
70
+ ]
71
+ };
72
+ export async function communityBoardsSource(opts) {
73
+ if (opts.useApi && opts.apiUrl) {
74
+ try {
75
+ const res = await fetcher(opts, `${opts.apiUrl}/api/community/boards`);
76
+ if (res.ok) {
77
+ const data = (await res.json());
78
+ return { source: 'api', apiUrl: opts.apiUrl, data };
79
+ }
80
+ }
81
+ catch {
82
+ /* fall through */
83
+ }
84
+ }
85
+ return {
86
+ source: 'offline',
87
+ data: { boards: FIXTURE_BOARDS },
88
+ fallbackReason: 'using fixture data'
89
+ };
90
+ }
91
+ export async function communityThreadsSource(opts, board, sort = 'active', page = 1) {
92
+ if (opts.useApi && opts.apiUrl) {
93
+ try {
94
+ const url = `${opts.apiUrl}/api/community/threads?board=${board}&sort=${sort}&page=${page}`;
95
+ const res = await fetcher(opts, url);
96
+ if (res.ok) {
97
+ const data = (await res.json());
98
+ return { source: 'api', apiUrl: opts.apiUrl, data };
99
+ }
100
+ }
101
+ catch {
102
+ /* fall through */
103
+ }
104
+ }
105
+ const threads = sortThreads(FIXTURE_THREADS[board] ?? [], sort);
106
+ return {
107
+ source: 'offline',
108
+ data: { threads, total: threads.length },
109
+ fallbackReason: 'using fixture data'
110
+ };
111
+ }
112
+ export async function communityThreadSource(opts, threadId) {
113
+ if (opts.useApi && opts.apiUrl) {
114
+ try {
115
+ const res = await fetcher(opts, `${opts.apiUrl}/api/community/thread/${threadId}`);
116
+ if (res.ok) {
117
+ const data = (await res.json());
118
+ return { source: 'api', apiUrl: opts.apiUrl, data };
119
+ }
120
+ }
121
+ catch {
122
+ /* fall through */
123
+ }
124
+ }
125
+ const thread = Object.values(FIXTURE_THREADS)
126
+ .flat()
127
+ .find((t) => t.id === threadId);
128
+ const replies = FIXTURE_REPLIES[threadId] ?? [];
129
+ if (!thread) {
130
+ return {
131
+ source: 'offline',
132
+ data: { thread: null, replies: [] },
133
+ fallbackReason: 'thread not found'
134
+ };
135
+ }
136
+ return {
137
+ source: 'offline',
138
+ data: { thread, replies: buildReplyTree(replies) }
139
+ };
140
+ }
141
+ export async function createThreadSource(opts, input) {
142
+ if (!opts.useApi || !opts.apiUrl || !opts.token) {
143
+ return {
144
+ source: 'offline',
145
+ data: { thread: null },
146
+ fallbackReason: 'API required for create'
147
+ };
148
+ }
149
+ const res = await fetcher(opts, `${opts.apiUrl}/api/community/threads`, {
150
+ method: 'POST',
151
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${opts.token}` },
152
+ body: JSON.stringify(input)
153
+ });
154
+ if (!res.ok) {
155
+ const err = await res.json().catch(() => ({ error: 'request failed' }));
156
+ throw new Error(err.error || `Failed to create thread: ${res.status}`);
157
+ }
158
+ const data = (await res.json());
159
+ return { source: 'api', apiUrl: opts.apiUrl, data };
160
+ }
161
+ export async function createReplySource(opts, parentId, input) {
162
+ if (!opts.useApi || !opts.apiUrl || !opts.token) {
163
+ return {
164
+ source: 'offline',
165
+ data: { reply: null },
166
+ fallbackReason: 'API required for reply'
167
+ };
168
+ }
169
+ const res = await fetcher(opts, `${opts.apiUrl}/api/community/reply/${parentId}`, {
170
+ method: 'POST',
171
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${opts.token}` },
172
+ body: JSON.stringify(input)
173
+ });
174
+ if (!res.ok) {
175
+ const err = await res.json().catch(() => ({ error: 'request failed' }));
176
+ throw new Error(err.error || `Failed to create reply: ${res.status}`);
177
+ }
178
+ const data = (await res.json());
179
+ return { source: 'api', apiUrl: opts.apiUrl, data };
180
+ }
181
+ export async function communitySearchSource(opts, query, board, limit) {
182
+ if (opts.useApi && opts.apiUrl) {
183
+ try {
184
+ const params = new URLSearchParams({ q: query });
185
+ if (board)
186
+ params.set('board', board);
187
+ if (limit != null)
188
+ params.set('limit', String(limit));
189
+ const url = `${opts.apiUrl}/api/community/search?${params.toString()}`;
190
+ const res = await fetcher(opts, url);
191
+ if (res.ok) {
192
+ const data = (await res.json());
193
+ return { source: 'api', apiUrl: opts.apiUrl, data };
194
+ }
195
+ }
196
+ catch {
197
+ /* fall through to fixture */
198
+ }
199
+ }
200
+ return {
201
+ source: 'offline',
202
+ data: { query, results: { threads: [], replies: [] }, truncated: false },
203
+ fallbackReason: 'using fixture data'
204
+ };
205
+ }
206
+ export async function voteSource(opts, targetId, input) {
207
+ if (!opts.useApi || !opts.apiUrl || !opts.token) {
208
+ return {
209
+ source: 'offline',
210
+ data: { score: 0, userVote: 0 },
211
+ fallbackReason: 'API required for vote'
212
+ };
213
+ }
214
+ const res = await fetcher(opts, `${opts.apiUrl}/api/community/vote/${targetId}`, {
215
+ method: 'POST',
216
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${opts.token}` },
217
+ body: JSON.stringify(input)
218
+ });
219
+ if (!res.ok)
220
+ throw new Error(`Failed to vote: ${res.status}`);
221
+ const data = (await res.json());
222
+ return { source: 'api', apiUrl: opts.apiUrl, data };
223
+ }
224
+ export async function adminHideSource(opts, targetId, input) {
225
+ if (!opts.useApi || !opts.apiUrl || !opts.token) {
226
+ return {
227
+ source: 'offline',
228
+ data: { success: false, id: '', alreadyHidden: false },
229
+ fallbackReason: 'API required for admin hide'
230
+ };
231
+ }
232
+ const res = await fetcher(opts, `${opts.apiUrl}/api/admin/hide`, {
233
+ method: 'POST',
234
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${opts.token}` },
235
+ body: JSON.stringify({ targetId, targetType: input.targetType, reason: input.reason })
236
+ });
237
+ if (res.status === 403)
238
+ throw new Error('Admin access required');
239
+ if (!res.ok) {
240
+ const err = (await res.json().catch(() => ({ error: 'request failed' })));
241
+ throw new Error(err.error || `Failed to hide: ${res.status}`);
242
+ }
243
+ const data = (await res.json());
244
+ return { source: 'api', apiUrl: opts.apiUrl, data };
245
+ }
246
+ export async function adminRecomputeSource(opts) {
247
+ if (!opts.useApi || !opts.apiUrl || !opts.token) {
248
+ return {
249
+ source: 'offline',
250
+ data: { recomputed: 0, durationMs: 0 },
251
+ fallbackReason: 'API required for admin recompute'
252
+ };
253
+ }
254
+ const res = await fetcher(opts, `${opts.apiUrl}/api/admin/reputation/recompute`, {
255
+ method: 'POST',
256
+ headers: { Authorization: `Bearer ${opts.token}` }
257
+ });
258
+ if (res.status === 403)
259
+ throw new Error('Admin access required');
260
+ if (!res.ok)
261
+ throw new Error(`Failed to recompute: ${res.status}`);
262
+ const data = (await res.json());
263
+ return { source: 'api', apiUrl: opts.apiUrl, data };
264
+ }
265
+ export async function adminLogSource(opts, { limit = 50 }) {
266
+ if (!opts.useApi || !opts.apiUrl || !opts.token) {
267
+ return {
268
+ source: 'offline',
269
+ data: { entries: [] },
270
+ fallbackReason: 'API required for admin log'
271
+ };
272
+ }
273
+ const res = await fetcher(opts, `${opts.apiUrl}/api/admin/log?limit=${limit}`, { headers: { Authorization: `Bearer ${opts.token}` } });
274
+ if (res.status === 403)
275
+ throw new Error('Admin access required');
276
+ if (!res.ok)
277
+ throw new Error(`Failed to fetch log: ${res.status}`);
278
+ const data = (await res.json());
279
+ return { source: 'api', apiUrl: opts.apiUrl, data };
280
+ }
281
+ export async function flagSource(opts, targetId, input) {
282
+ if (!opts.useApi || !opts.apiUrl || !opts.token) {
283
+ return { source: 'offline', data: { success: false }, fallbackReason: 'API required for flag' };
284
+ }
285
+ const res = await fetcher(opts, `${opts.apiUrl}/api/community/flag/${targetId}`, {
286
+ method: 'POST',
287
+ headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${opts.token}` },
288
+ body: JSON.stringify(input)
289
+ });
290
+ if (!res.ok)
291
+ throw new Error(`Failed to flag: ${res.status}`);
292
+ return { source: 'api', apiUrl: opts.apiUrl, data: { success: true } };
293
+ }
294
+ function sortThreads(threads, sort) {
295
+ const sorted = [...threads];
296
+ if (sort === 'new') {
297
+ sorted.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
298
+ }
299
+ else if (sort === 'top') {
300
+ sorted.sort((a, b) => b.score - a.score);
301
+ }
302
+ else {
303
+ sorted.sort((a, b) => {
304
+ const scoreA = a.score / Math.pow((Date.now() - new Date(a.createdAt).getTime()) / 3600000 + 2, 1.8);
305
+ const scoreB = b.score / Math.pow((Date.now() - new Date(b.createdAt).getTime()) / 3600000 + 2, 1.8);
306
+ return scoreB - scoreA;
307
+ });
308
+ }
309
+ return sorted;
310
+ }
311
+ function buildReplyTree(replies) {
312
+ const map = new Map();
313
+ const roots = [];
314
+ for (const r of replies) {
315
+ map.set(r.id, { ...r, children: [] });
316
+ }
317
+ for (const r of replies) {
318
+ const node = map.get(r.id);
319
+ if (r.parentId && map.has(r.parentId)) {
320
+ map.get(r.parentId).children.push(node);
321
+ }
322
+ else {
323
+ roots.push(node);
324
+ }
325
+ }
326
+ return roots;
327
+ }
328
+ async function fetcher(opts, url, init) {
329
+ const f = opts.fetcher ?? globalThis.fetch;
330
+ const controller = new AbortController();
331
+ const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? 10000);
332
+ try {
333
+ const res = await f(url, { ...init, signal: controller.signal });
334
+ return res;
335
+ }
336
+ finally {
337
+ clearTimeout(timeout);
338
+ }
339
+ }
340
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/community/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Pure search helpers — extracted so they can be unit-tested without any I/O.
3
+ */
4
+ /**
5
+ * Extract a ~120-char snippet from `content` centred on the first
6
+ * case-insensitive occurrence of `query`.
7
+ *
8
+ * - If a match is found, the matched substring is wrapped with `[` and `]`.
9
+ * - A leading `…` is prepended when the window doesn't start at position 0.
10
+ * - A trailing `…` is appended when the window doesn't reach the end.
11
+ * - If no match is found, returns the first SNIPPET_MAX chars of content
12
+ * (no markers).
13
+ */
14
+ export declare function extractSnippet(content: string, query: string): string;
15
+ /**
16
+ * Wrap the user query as a quoted FTS5 phrase so special characters
17
+ * (`"`, `*`, `:`, `-`, parens) are treated as literals.
18
+ */
19
+ export declare function sanitizeFtsQuery(q: string): string;
20
+ /**
21
+ * Validate search query parameters.
22
+ * Returns null on success, or an error string on failure.
23
+ */
24
+ export declare function validateSearchQuery(q: unknown, board: unknown, validBoards: readonly string[]): string | null;
25
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/community/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAyBrE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,OAAO,EACV,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,MAAM,GAAG,IAAI,CAWf"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Pure search helpers — extracted so they can be unit-tested without any I/O.
3
+ */
4
+ const SNIPPET_HALF = 60;
5
+ const SNIPPET_MAX = 120;
6
+ /**
7
+ * Extract a ~120-char snippet from `content` centred on the first
8
+ * case-insensitive occurrence of `query`.
9
+ *
10
+ * - If a match is found, the matched substring is wrapped with `[` and `]`.
11
+ * - A leading `…` is prepended when the window doesn't start at position 0.
12
+ * - A trailing `…` is appended when the window doesn't reach the end.
13
+ * - If no match is found, returns the first SNIPPET_MAX chars of content
14
+ * (no markers).
15
+ */
16
+ export function extractSnippet(content, query) {
17
+ if (!content)
18
+ return '';
19
+ const lower = content.toLowerCase();
20
+ const lowerQ = query.toLowerCase();
21
+ const idx = lower.indexOf(lowerQ);
22
+ if (idx === -1) {
23
+ // No match in content — return first SNIPPET_MAX chars plain
24
+ const plain = content.slice(0, SNIPPET_MAX);
25
+ return plain.length < content.length ? plain + '…' : plain;
26
+ }
27
+ const start = Math.max(0, idx - SNIPPET_HALF);
28
+ const end = Math.min(content.length, idx + query.length + SNIPPET_HALF);
29
+ const before = content.slice(start, idx);
30
+ const matched = content.slice(idx, idx + query.length);
31
+ const after = content.slice(idx + query.length, end);
32
+ let snippet = before + '[' + matched + ']' + after;
33
+ if (start > 0)
34
+ snippet = '…' + snippet;
35
+ if (end < content.length)
36
+ snippet = snippet + '…';
37
+ return snippet;
38
+ }
39
+ /**
40
+ * Wrap the user query as a quoted FTS5 phrase so special characters
41
+ * (`"`, `*`, `:`, `-`, parens) are treated as literals.
42
+ */
43
+ export function sanitizeFtsQuery(q) {
44
+ return '"' + q.replace(/"/g, '""') + '"';
45
+ }
46
+ /**
47
+ * Validate search query parameters.
48
+ * Returns null on success, or an error string on failure.
49
+ */
50
+ export function validateSearchQuery(q, board, validBoards) {
51
+ if (typeof q !== 'string' || q.length < 2) {
52
+ return 'q must be at least 2 characters';
53
+ }
54
+ if (q.length > 200) {
55
+ return 'q must be at most 200 characters';
56
+ }
57
+ if (board !== undefined && board !== '' && !validBoards.includes(board)) {
58
+ return 'board must be one of: ' + validBoards.join(', ');
59
+ }
60
+ return null;
61
+ }
62
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/community/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,KAAa;IAC3D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,6DAA6D;QAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7D,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,YAAY,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IAExE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErD,IAAI,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC;IACnD,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;IACvC,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC;IAElD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAS;IACxC,OAAO,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,CAAU,EACV,KAAc,EACd,WAA8B;IAE9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,iCAAiC,CAAC;IAC3C,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACnB,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAe,CAAC,EAAE,CAAC;QAClF,OAAO,wBAAwB,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,71 @@
1
+ export type BoardId = 'mcp' | 'agents' | 'tools' | 'workflows' | 'show' | 'ask' | 'meta';
2
+ export declare const BOARD_IDS: BoardId[];
3
+ export declare const BOARD_LABELS: Record<BoardId, string>;
4
+ export interface Thread {
5
+ id: string;
6
+ board: BoardId;
7
+ title: string;
8
+ author: string;
9
+ content: string;
10
+ score: number;
11
+ replyCount: number;
12
+ flagCount: number;
13
+ createdAt: string;
14
+ updatedAt: string;
15
+ authorIsLLM?: boolean;
16
+ authorModel?: string;
17
+ }
18
+ export interface Reply {
19
+ id: string;
20
+ threadId: string;
21
+ parentId?: string;
22
+ author: string;
23
+ content: string;
24
+ score: number;
25
+ flagCount: number;
26
+ createdAt: string;
27
+ authorIsLLM?: boolean;
28
+ authorModel?: string;
29
+ children?: Reply[];
30
+ }
31
+ export interface Vote {
32
+ userId: string;
33
+ targetId: string;
34
+ targetType: 'discussion' | 'reply';
35
+ value: -1 | 1;
36
+ }
37
+ export interface Flag {
38
+ id: string;
39
+ targetId: string;
40
+ targetType: 'discussion' | 'reply';
41
+ reporterId: string;
42
+ reason: 'spam' | 'harassment' | 'undisclosed-llm' | 'malicious' | 'other';
43
+ notes?: string;
44
+ }
45
+ export interface BoardSummary {
46
+ id: BoardId;
47
+ threadCount: number;
48
+ newToday: number;
49
+ }
50
+ export interface SearchHit {
51
+ kind: 'thread' | 'reply';
52
+ id: string;
53
+ threadId: string;
54
+ board: BoardId;
55
+ title: string;
56
+ snippet: string;
57
+ score: number;
58
+ flagCount: number;
59
+ createdAt: string;
60
+ author: string;
61
+ authorIsLLM: boolean;
62
+ }
63
+ export interface SearchResult {
64
+ query: string;
65
+ results: {
66
+ threads: SearchHit[];
67
+ replies: SearchHit[];
68
+ };
69
+ truncated: boolean;
70
+ }
71
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/community/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzF,eAAO,MAAM,SAAS,EAAE,OAAO,EAAmE,CAAC;AAEnG,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAQhD,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;CACf;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,YAAY,GAAG,OAAO,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,iBAAiB,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE;QACP,OAAO,EAAE,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,SAAS,EAAE,CAAC;KACtB,CAAC;IACF,SAAS,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,11 @@
1
+ export const BOARD_IDS = ['mcp', 'agents', 'tools', 'workflows', 'show', 'ask', 'meta'];
2
+ export const BOARD_LABELS = {
3
+ mcp: 'MCP Servers & Protocols',
4
+ agents: 'Agent Development',
5
+ tools: 'Tools & Frameworks',
6
+ workflows: 'Workflow Templates',
7
+ show: 'Show & Tell',
8
+ ask: 'Questions & Help',
9
+ meta: 'Meta / About Agora'
10
+ };
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/community/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAEnG,MAAM,CAAC,MAAM,YAAY,GAA4B;IACnD,GAAG,EAAE,yBAAyB;IAC9B,MAAM,EAAE,mBAAmB;IAC3B,KAAK,EAAE,oBAAoB;IAC3B,SAAS,EAAE,oBAAoB;IAC/B,IAAI,EAAE,aAAa;IACnB,GAAG,EAAE,kBAAkB;IACvB,IAAI,EAAE,oBAAoB;CAC3B,CAAC"}