pikiloom 0.4.26 → 0.4.27

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 (155) hide show
  1. package/dashboard/dist/assets/{AgentTab-BNJ73P0m.js → AgentTab-DIP-y4dl.js} +1 -1
  2. package/dashboard/dist/assets/ConnectionModal-BCfvhkiI.js +1 -0
  3. package/dashboard/dist/assets/{DirBrowser-D-GT-G-w.js → DirBrowser-Dot7ua9-.js} +1 -1
  4. package/dashboard/dist/assets/{ExtensionsTab-BrJMulJR.js → ExtensionsTab-GioMx4S6.js} +1 -1
  5. package/dashboard/dist/assets/{IMAccessTab-auPnx468.js → IMAccessTab-C9_r8jJP.js} +1 -1
  6. package/dashboard/dist/assets/{Modal-lYfO9m-I.js → Modal-M1AP1sgR.js} +1 -1
  7. package/dashboard/dist/assets/{Modals-PRdWOIY9.js → Modals-CCm3UUfJ.js} +1 -1
  8. package/dashboard/dist/assets/{Select-BhbU-rll.js → Select-YubDM16P.js} +1 -1
  9. package/dashboard/dist/assets/{SessionPanel-_0dLWvEb.js → SessionPanel-Cnv9o96n.js} +1 -1
  10. package/dashboard/dist/assets/SystemTab-VgNivIe3.js +1 -0
  11. package/dashboard/dist/assets/index-BY7l20bi.js +23 -0
  12. package/dashboard/dist/assets/index-BlqvzDUL.js +3 -0
  13. package/dashboard/dist/assets/index-CXIN3nTr.css +1 -0
  14. package/dashboard/dist/assets/{shared-C5uXvhZJ.js → shared-C0SAInnT.js} +1 -1
  15. package/dashboard/dist/index.html +2 -2
  16. package/dist/agent/acp-client.js +0 -59
  17. package/dist/agent/artifacts.js +1 -38
  18. package/dist/agent/auto-update.js +2 -78
  19. package/dist/agent/await-resume.js +0 -20
  20. package/dist/agent/cli/auth.js +3 -51
  21. package/dist/agent/cli/catalog.js +0 -3
  22. package/dist/agent/cli/detector.js +1 -19
  23. package/dist/agent/cli/index.js +0 -3
  24. package/dist/agent/cli/registry.js +0 -25
  25. package/dist/agent/driver.js +0 -14
  26. package/dist/agent/drivers/claude-tui.js +2 -769
  27. package/dist/agent/drivers/claude.js +12 -631
  28. package/dist/agent/drivers/codex.js +11 -162
  29. package/dist/agent/drivers/gemini.js +6 -114
  30. package/dist/agent/drivers/hermes.js +0 -128
  31. package/dist/agent/goal.js +0 -45
  32. package/dist/agent/handover.js +1 -46
  33. package/dist/agent/images.js +7 -133
  34. package/dist/agent/index.js +1 -29
  35. package/dist/agent/mcp/bridge.js +1 -197
  36. package/dist/agent/mcp/extensions.js +5 -84
  37. package/dist/agent/mcp/oauth.js +2 -69
  38. package/dist/agent/mcp/registry.js +2 -33
  39. package/dist/agent/mcp/session-server.js +2 -45
  40. package/dist/agent/mcp/tools/ask-user.js +0 -6
  41. package/dist/agent/mcp/tools/await-resume.js +0 -15
  42. package/dist/agent/mcp/tools/goal.js +0 -25
  43. package/dist/agent/mcp/tools/types.js +0 -5
  44. package/dist/agent/mcp/tools/workspace.js +0 -23
  45. package/dist/agent/npm.js +0 -14
  46. package/dist/agent/session.js +86 -196
  47. package/dist/agent/skill-installer.js +3 -70
  48. package/dist/agent/skills.js +0 -43
  49. package/dist/agent/stream.js +5 -148
  50. package/dist/agent/types.js +0 -12
  51. package/dist/agent/utils.js +2 -120
  52. package/dist/bot/bot.js +3 -468
  53. package/dist/bot/command-ui.js +0 -45
  54. package/dist/bot/commands.js +0 -51
  55. package/dist/bot/headless-bot.js +0 -21
  56. package/dist/bot/host.js +1 -5
  57. package/dist/bot/human-loop.js +0 -8
  58. package/dist/bot/menu.js +0 -3
  59. package/dist/bot/orchestration.js +0 -3
  60. package/dist/bot/render-shared.js +0 -63
  61. package/dist/bot/session-hub.js +14 -92
  62. package/dist/bot/session-status.js +1 -5
  63. package/dist/bot/streaming.js +0 -53
  64. package/dist/browser-profile.js +0 -51
  65. package/dist/browser-supervisor.js +0 -75
  66. package/dist/catalog/cli-tools.js +0 -53
  67. package/dist/catalog/index.js +0 -18
  68. package/dist/catalog/local-models.js +0 -18
  69. package/dist/catalog/mcp-servers.js +0 -35
  70. package/dist/catalog/skill-repos.js +0 -32
  71. package/dist/channels/base.js +0 -19
  72. package/dist/channels/dingtalk/bot.js +0 -3
  73. package/dist/channels/dingtalk/channel.js +0 -33
  74. package/dist/channels/discord/bot.js +0 -7
  75. package/dist/channels/discord/channel.js +0 -22
  76. package/dist/channels/feishu/bot.js +0 -71
  77. package/dist/channels/feishu/channel.js +0 -78
  78. package/dist/channels/feishu/markdown.js +0 -5
  79. package/dist/channels/feishu/render.js +0 -45
  80. package/dist/channels/health.js +0 -46
  81. package/dist/channels/slack/bot.js +0 -7
  82. package/dist/channels/slack/channel.js +1 -27
  83. package/dist/channels/states.js +0 -3
  84. package/dist/channels/telegram/bot.js +0 -60
  85. package/dist/channels/telegram/channel.js +2 -99
  86. package/dist/channels/telegram/directory.js +0 -3
  87. package/dist/channels/telegram/live-preview.js +0 -8
  88. package/dist/channels/telegram/render.js +0 -30
  89. package/dist/channels/wecom/bot.js +0 -3
  90. package/dist/channels/wecom/channel.js +0 -58
  91. package/dist/channels/weixin/api.js +0 -9
  92. package/dist/channels/weixin/bot.js +0 -88
  93. package/dist/channels/weixin/channel.js +0 -6
  94. package/dist/cli/autostart.js +1 -44
  95. package/dist/cli/channel-supervisor.js +1 -59
  96. package/dist/cli/channels.js +0 -6
  97. package/dist/cli/main.js +1 -145
  98. package/dist/cli/onboarding.js +0 -6
  99. package/dist/cli/run.js +0 -11
  100. package/dist/cli/setup-wizard.js +0 -3
  101. package/dist/core/config/runtime-config.js +0 -38
  102. package/dist/core/config/user-config.js +0 -63
  103. package/dist/core/config/validation.js +0 -9
  104. package/dist/core/constants.js +0 -268
  105. package/dist/core/git.js +0 -31
  106. package/dist/core/legacy-compat.js +1 -28
  107. package/dist/core/logging.js +0 -3
  108. package/dist/core/platform.js +0 -28
  109. package/dist/core/process-control.js +0 -8
  110. package/dist/core/secrets/index.js +0 -17
  111. package/dist/core/secrets/inline-seal.js +0 -7
  112. package/dist/core/secrets/ref.js +0 -19
  113. package/dist/core/secrets/resolver.js +0 -8
  114. package/dist/core/secrets/store.js +1 -12
  115. package/dist/core/utils.js +1 -37
  116. package/dist/core/version.js +0 -3
  117. package/dist/dashboard/platform.js +1 -35
  118. package/dist/dashboard/routes/agents.js +2 -71
  119. package/dist/dashboard/routes/cli.js +0 -27
  120. package/dist/dashboard/routes/config.js +0 -54
  121. package/dist/dashboard/routes/extensions.js +0 -132
  122. package/dist/dashboard/routes/local-models.js +0 -68
  123. package/dist/dashboard/routes/models.js +0 -46
  124. package/dist/dashboard/routes/sessions.js +0 -100
  125. package/dist/dashboard/runtime.js +1 -58
  126. package/dist/dashboard/server.js +0 -49
  127. package/dist/dashboard/session-control.js +2 -69
  128. package/dist/model/catalog.js +1 -17
  129. package/dist/model/index.js +0 -15
  130. package/dist/model/injector.js +1 -181
  131. package/dist/model/provider-models.js +1 -48
  132. package/dist/model/responses-bridge.js +3 -45
  133. package/dist/model/store.js +0 -17
  134. package/dist/model/types.js +0 -12
  135. package/dist/model/validation.js +1 -18
  136. package/dist/pikichannel/adapter-pikiloom.js +0 -31
  137. package/dist/pikichannel/code.js +0 -12
  138. package/dist/pikichannel/codec.js +0 -14
  139. package/dist/pikichannel/host.js +4 -33
  140. package/dist/pikichannel/protocol.js +0 -52
  141. package/dist/pikichannel/rendezvous-broker.js +5 -26
  142. package/dist/pikichannel/rendezvous-host.js +3 -16
  143. package/dist/pikichannel/server.js +6 -55
  144. package/dist/pikichannel/transport.js +0 -25
  145. package/dist/pikichannel/transports/webrtc-host.js +0 -18
  146. package/dist/pikichannel/transports/webrtc-shared.js +4 -34
  147. package/dist/pikichannel/transports/websocket-host.js +1 -14
  148. package/dist/pikichannel/turn.js +2 -69
  149. package/dist/pikichannel/web/sdk.js +14 -71
  150. package/package.json +1 -1
  151. package/dashboard/dist/assets/ConnectionModal-Dt05H2f9.js +0 -1
  152. package/dashboard/dist/assets/SystemTab-CN_QrRKt.js +0 -1
  153. package/dashboard/dist/assets/index-CP3LYJR2.js +0 -23
  154. package/dashboard/dist/assets/index-C_neLnaO.js +0 -3
  155. package/dashboard/dist/assets/index-CyCspgtc.css +0 -1
@@ -1,38 +1,4 @@
1
- /**
2
- * CLI tool catalog — single source of truth for what the Dashboard shows under
3
- * Extensions → CLI.
4
- *
5
- * ─── How this plugs into the rest of the stack ───────────────────────────────
6
- *
7
- * Dashboard → GET /api/extensions/cli/catalog
8
- * → dashboard/routes/cli.ts
9
- * → agent/cli/catalog.ts (merge + live detection)
10
- * → agent/cli/registry.ts (types + re-exports this array)
11
- * ← src/catalog/cli-tools.ts ← YOU ARE HERE
12
- *
13
- * The registry module defines the `RecommendedCli` type and other helpers; the
14
- * detector spawns `which <binary>` + the status command, and the auth runner
15
- * streams the login sub-process. This file owns only the *data*.
16
- *
17
- * ─── How to add a CLI ────────────────────────────────────────────────────────
18
- *
19
- * 1. Append an entry to `CLI_TOOLS`.
20
- * 2. Pick an `auth.type`:
21
- * - 'oauth-web' if the CLI has a first-party `<cli> ... login --web`
22
- * flavor (gh, wrangler, vercel, …). The runner spawns that command,
23
- * streams stdout/stderr to the UI, and polls `statusArgv` until it
24
- * reports authed.
25
- * - 'token' if the user pastes an API key. Implement the write-path in
26
- * `agent/cli/auth.ts` → `applyCliToken` for that id (keeps secret
27
- * handling explicit per CLI).
28
- * - 'none' for CLIs that don't need sign-in (docker, pnpm).
29
- * 3. Fill `install.{darwin,linux,win}` with canonical commands. The UI shows
30
- * the current OS's list and always renders a "Copy" button. We deliberately
31
- * do NOT auto-run installers — package managers often need sudo or
32
- * interactive confirmation and we'd rather keep the user in charge.
33
- */
34
1
  export const CLI_TOOLS = [
35
- // ── Dev: source control & platforms ────────────────────────────────────────
36
2
  {
37
3
  id: 'gh',
38
4
  binary: 'gh',
@@ -62,7 +28,6 @@ export const CLI_TOOLS = [
62
28
  loginHintZh: '将打开浏览器完成 GitHub OAuth 授权。',
63
29
  },
64
30
  },
65
- // ── Cloud platforms ────────────────────────────────────────────────────────
66
31
  {
67
32
  id: 'wrangler',
68
33
  binary: 'wrangler',
@@ -111,8 +76,6 @@ export const CLI_TOOLS = [
111
76
  statusArgv: ['vercel', 'whoami'],
112
77
  loginArgv: ['vercel', 'login'],
113
78
  logoutArgv: ['vercel', 'logout'],
114
- // `vercel login` opens an interactive picker (email / GitHub / GitLab /
115
- // Bitbucket / SAML) that needs a real TTY. Surface the official command.
116
79
  manualLoginCommands: [
117
80
  { label: 'Sign in to Vercel', cmd: 'vercel login' },
118
81
  ],
@@ -194,8 +157,6 @@ export const CLI_TOOLS = [
194
157
  statusArgv: ['heroku', 'whoami'],
195
158
  loginArgv: ['heroku', 'login'],
196
159
  logoutArgv: ['heroku', 'logout'],
197
- // `heroku login` prompts "Press any key to open up the browser to login
198
- // or q to exit" — a hard TTY dependency. Surface the official command.
199
160
  manualLoginCommands: [
200
161
  { label: 'Sign in to Heroku', cmd: 'heroku login' },
201
162
  ],
@@ -203,7 +164,6 @@ export const CLI_TOOLS = [
203
164
  loginHintZh: '请在自己的终端里运行 `heroku login` —— 该命令会提示「Press any key」,必须在交互式终端里完成。登录后回到这里点击「重新检测状态」。',
204
165
  },
205
166
  },
206
- // ── Commerce & payments ────────────────────────────────────────────────────
207
167
  {
208
168
  id: 'stripe',
209
169
  binary: 'stripe',
@@ -230,7 +190,6 @@ export const CLI_TOOLS = [
230
190
  loginHintZh: '打开浏览器完成授权,凭据写入 ~/.config/stripe/。',
231
191
  },
232
192
  },
233
- // ── Cloud giants (token-based profile flows) ───────────────────────────────
234
193
  {
235
194
  id: 'aws',
236
195
  binary: 'aws',
@@ -279,15 +238,10 @@ export const CLI_TOOLS = [
279
238
  },
280
239
  auth: {
281
240
  type: 'oauth-web',
282
- // `gcloud auth list ... --format=value(account)` exits 0 even when no
283
- // account is signed in (just prints an empty line). Require non-empty
284
- // output so an empty list isn't mistaken for ready.
285
241
  statusArgv: ['gcloud', 'auth', 'list', '--filter=status:ACTIVE', '--format=value(account)'],
286
242
  statusReadyPattern: '\\S',
287
243
  loginArgv: ['gcloud', 'auth', 'login'],
288
244
  logoutArgv: ['gcloud', 'auth', 'revoke'],
289
- // `gcloud auth login` orchestrates a local callback server + interactive
290
- // prompts — needs a real TTY. ADC for SDK code is a separate command.
291
245
  manualLoginCommands: [
292
246
  { label: 'Sign in (user credentials)', cmd: 'gcloud auth login' },
293
247
  { label: 'Optional: Application Default Credentials', cmd: 'gcloud auth application-default login' },
@@ -296,7 +250,6 @@ export const CLI_TOOLS = [
296
250
  loginHintZh: '请在自己的终端里运行 `gcloud auth login` —— 它依赖本地回调服务器与交互式提示,不能在此面板里完成。SDK 用的 Application Default 凭证是另一个命令。登录后回到这里点击「重新检测状态」。',
297
251
  },
298
252
  },
299
- // ── Social & messaging ─────────────────────────────────────────────────────
300
253
  {
301
254
  id: 'lark-cli',
302
255
  binary: 'lark-cli',
@@ -319,10 +272,6 @@ export const CLI_TOOLS = [
319
272
  statusArgv: ['lark-cli', 'auth', 'status'],
320
273
  loginArgv: ['lark-cli', 'auth', 'login', '--recommend'],
321
274
  logoutArgv: ['lark-cli', 'auth', 'logout'],
322
- // Lark CLI sign-in has two ordered steps and renders a terminal QR that
323
- // doesn't fit a streamed-output panel. Both commands run in the user's
324
- // own terminal; only after step 2 does `lark-cli auth status` exit 0,
325
- // so re-check naturally rejects "only step 1 completed".
326
275
  manualLoginCommands: [
327
276
  { label: 'Step 1 — Register a Feishu app (one-time setup)', cmd: 'lark-cli config init --new' },
328
277
  { label: 'Step 2 — Sign in via Device Flow OAuth', cmd: 'lark-cli auth login --recommend' },
@@ -331,7 +280,6 @@ export const CLI_TOOLS = [
331
280
  loginHintZh: '飞书 CLI 登录分两步,请在自己的终端里依序运行:先用第 1 步注册飞书应用,再用第 2 步完成 OAuth 授权 —— 两步全部完成后才算授权成功。`lark-cli` 登录时打印的二维码 / Device Flow URL 不适合在此面板内展示。完成第 2 步后回到这里点击「重新检测状态」。建议同步安装配套 Skills:`npx skills add larksuite/cli -y -g`。',
332
281
  },
333
282
  },
334
- // ── Content & creation ─────────────────────────────────────────────────────
335
283
  {
336
284
  id: 'mocli',
337
285
  binary: 'mocli',
@@ -360,7 +308,6 @@ export const CLI_TOOLS = [
360
308
  loginHintZh: '在墨问小程序里:右下角「我的」→「开发者」→「我的 API Key」,复制粘贴到这里。装完后建议再跑 `npx skills add mowenxd/cli -y -g` 安装配套 Skills。',
361
309
  },
362
310
  },
363
- // ── No-auth utilities (detect only) ────────────────────────────────────────
364
311
  {
365
312
  id: 'opencli',
366
313
  binary: 'opencli',
@@ -1,21 +1,3 @@
1
- /**
2
- * src/catalog — data-only manifests of everything the Extensions page offers.
3
- *
4
- * This directory is the *single* place you edit to add/remove items from the
5
- * Dashboard. Each file is a plain TypeScript array; no logic lives here.
6
- *
7
- * mcp-servers.ts — Extensions → MCP tab
8
- * cli-tools.ts — Extensions → CLI tab
9
- * skill-repos.ts — Extensions → Skills tab
10
- *
11
- * The loading / auth / install logic lives in:
12
- * - src/agent/mcp/{registry,extensions,oauth}.ts (MCP)
13
- * - src/agent/cli/{registry,detector,auth}.ts (CLI)
14
- * - src/agent/{skills,skill-installer}.ts (Skills)
15
- *
16
- * Those modules own the types and execute the runtime flows; this directory
17
- * exists purely so "what to show" stays editable in one spot.
18
- */
19
1
  export { MCP_SERVERS } from './mcp-servers.js';
20
2
  export { CLI_TOOLS } from './cli-tools.js';
21
3
  export { SKILL_REPOS } from './skill-repos.js';
@@ -1,20 +1,4 @@
1
- /**
2
- * Local model catalog — curated set of coding-friendly open models that
3
- * pikiloom recommends for self-hosted backends (Ollama / mlx-lm).
4
- *
5
- * Per-backend identifier rules:
6
- * - `ollamaTag` — entry exists in Ollama's library
7
- * - `mlxModel` — HuggingFace repo under `mlx-community/` (Apple Silicon)
8
- * Either field is optional; the dashboard filters by backend before display.
9
- *
10
- * Sizing rules of thumb (Q4 quants on disk):
11
- * weights_gb ≈ params_b × 0.6
12
- * min_ram_gb ≈ weights_gb × 1.5 + 4 // KV cache + OS headroom
13
- *
14
- * `minRamGb` is conservative on purpose.
15
- */
16
1
  export const LOCAL_MODELS = [
17
- // ── Tier A: 16 GB Macs ─────────────────────────────────────────────────────
18
2
  {
19
3
  id: 'qwen2.5-coder-7b',
20
4
  name: 'Qwen2.5-Coder 7B',
@@ -52,7 +36,6 @@ export const LOCAL_MODELS = [
52
36
  ollamaTag: 'gemma3:4b',
53
37
  homepage: 'https://ai.google.dev/gemma',
54
38
  },
55
- // ── Tier B: 24-32 GB sweet spot ────────────────────────────────────────────
56
39
  {
57
40
  id: 'deepseek-coder-v2-lite',
58
41
  name: 'DeepSeek-Coder V2 Lite',
@@ -77,7 +60,6 @@ export const LOCAL_MODELS = [
77
60
  ollamaTag: 'phi4:14b',
78
61
  homepage: 'https://huggingface.co/microsoft/phi-4',
79
62
  },
80
- // ── Tier S: 36+ GB unified memory ──────────────────────────────────────────
81
63
  {
82
64
  id: 'qwen2.5-coder-32b',
83
65
  name: 'Qwen2.5-Coder 32B',
@@ -1,34 +1,4 @@
1
- /**
2
- * MCP server catalog — single source of truth for what the Dashboard shows
3
- * under Extensions → MCP.
4
- *
5
- * ─── How this plugs into the rest of the stack ───────────────────────────────
6
- *
7
- * Dashboard → GET /api/extensions/mcp/catalog
8
- * → dashboard/routes/extensions.ts
9
- * → agent/mcp/extensions.ts (merge + state computation)
10
- * → agent/mcp/registry.ts (types + re-exports this array)
11
- * ← src/catalog/mcp-servers.ts ← YOU ARE HERE
12
- *
13
- * The registry module owns types and helper functions (install / OAuth / health).
14
- * This file owns only the *data*. To add a new MCP server, append an entry here
15
- * and the whole pipeline picks it up. To hide an entry, remove/comment it out —
16
- * users who already installed it keep their setup; we only stop recommending.
17
- *
18
- * ─── recommendedScope ────────────────────────────────────────────────────────
19
- *
20
- * 'global' — account-level SaaS (GitHub, Atlassian, …). Shown in the
21
- * Extensions tab; hidden from the Workspace modal.
22
- * 'workspace' — tools that depend on project context (Filesystem, SQLite,
23
- * Postgres). Shown in the Workspace modal; hidden globally.
24
- * 'both' — useful in either place (rarely needed; avoid unless obvious).
25
- *
26
- * Generic protocol-demo servers (time / fetch / memory from @modelcontextprotocol)
27
- * were intentionally removed — they don't carry a product identity and added
28
- * clutter rather than value.
29
- */
30
1
  export const MCP_SERVERS = [
31
- // ── Built-in (pikiloom-managed) ────────────────────────────────────────────
32
2
  {
33
3
  id: 'pikiloom-browser',
34
4
  name: 'Browser Automation',
@@ -56,7 +26,6 @@ export const MCP_SERVERS = [
56
26
  homepage: 'https://peekaboo.sh/',
57
27
  isBuiltin: true,
58
28
  },
59
- // ── Local filesystems / databases (workspace scope) ────────────────────────
60
29
  {
61
30
  id: 'filesystem',
62
31
  name: 'Filesystem',
@@ -99,7 +68,6 @@ export const MCP_SERVERS = [
99
68
  },
100
69
  iconSlug: 'postgres',
101
70
  },
102
- // ── Global-scope SaaS with MCP-OAuth ───────────────────────────────────────
103
71
  {
104
72
  id: 'github',
105
73
  name: 'GitHub',
@@ -160,7 +128,6 @@ export const MCP_SERVERS = [
160
128
  iconSlug: 'sentry',
161
129
  homepage: 'https://docs.sentry.io/product/sentry-mcp/',
162
130
  },
163
- // ── Cloudflare trio (control plane / observability / docs) ─────────────────
164
131
  {
165
132
  id: 'cloudflare-bindings',
166
133
  name: 'Cloudflare',
@@ -197,7 +164,6 @@ export const MCP_SERVERS = [
197
164
  iconSlug: 'cloudflare',
198
165
  homepage: 'https://developers.cloudflare.com/agents/model-context-protocol/',
199
166
  },
200
- // ── More SaaS integrations ─────────────────────────────────────────────────
201
167
  {
202
168
  id: 'gamma',
203
169
  name: 'Gamma',
@@ -246,7 +212,6 @@ export const MCP_SERVERS = [
246
212
  iconSlug: 'lark',
247
213
  homepage: 'https://open.feishu.cn/document/mcp',
248
214
  },
249
- // ── Remote + API key ───────────────────────────────────────────────────────
250
215
  {
251
216
  id: 'stripe',
252
217
  name: 'Stripe',
@@ -1,33 +1,4 @@
1
- /**
2
- * Skill repository catalog — single source of truth for what the Dashboard
3
- * shows under Extensions → Skills.
4
- *
5
- * ─── How this plugs into the rest of the stack ───────────────────────────────
6
- *
7
- * Dashboard → GET /api/extensions/skills/catalog
8
- * → dashboard/routes/extensions.ts
9
- * → agent/mcp/registry.ts (types + re-exports this array)
10
- * → agent/skills.ts (locally-installed discovery)
11
- * → agent/skill-installer.ts (`npx skills add …` runner)
12
- * ← src/catalog/skill-repos.ts ← YOU ARE HERE
13
- *
14
- * ─── Curation policy ─────────────────────────────────────────────────────────
15
- *
16
- * Every entry below is a real, public GitHub repo. Authority signal is GitHub
17
- * stars — the dashboard fetches `stars` / `pushedAt` at load time and sorts the
18
- * cards by star count, so "more popular = appears higher". Don't add fictional
19
- * placeholder entries; if a repo isn't real and starred, users hit a 404 the
20
- * moment they click Install.
21
- *
22
- * ─── How to add a skill pack ─────────────────────────────────────────────────
23
- *
24
- * Append a `RecommendedSkillRepo` entry with `source` set to an `owner/repo`
25
- * GitHub slug (or full URL). The install flow runs `npx skills add <source>`
26
- * and drops the skill into `~/.pikiloom/skills/` for global installs, or
27
- * `<workdir>/.pikiloom/skills/` for project installs.
28
- */
29
1
  export const SKILL_REPOS = [
30
- // ── Official / first-party ────────────────────────────────────────────────
31
2
  {
32
3
  id: 'pikiloom-skills',
33
4
  name: 'Pikiloom Skills',
@@ -37,7 +8,6 @@ export const SKILL_REPOS = [
37
8
  category: 'productivity',
38
9
  recommendedScope: 'both',
39
10
  homepage: 'https://github.com/xiaotonng/pikiloom-skills',
40
- // First-party pack: keep it at the top even before it accrues stars.
41
11
  pinned: true,
42
12
  },
43
13
  {
@@ -60,7 +30,6 @@ export const SKILL_REPOS = [
60
30
  recommendedScope: 'both',
61
31
  homepage: 'https://github.com/vercel-labs/agent-skills',
62
32
  },
63
- // ── High-signal community collections (awesome-lists / megapacks) ─────────
64
33
  {
65
34
  id: 'obra-superpowers',
66
35
  name: 'Obra Superpowers',
@@ -111,7 +80,6 @@ export const SKILL_REPOS = [
111
80
  recommendedScope: 'global',
112
81
  homepage: 'https://github.com/alirezarezvani/claude-skills',
113
82
  },
114
- // ── Domain-specific high-quality skills ───────────────────────────────────
115
83
  {
116
84
  id: 'planning-with-files',
117
85
  name: 'Planning with Files',
@@ -1,10 +1,3 @@
1
- /**
2
- * Channel base — minimal abstract for all IM platforms.
3
- *
4
- * Only defines: lifecycle + outgoing primitives.
5
- * Hooks (onCommand, onMessage, onCallback, ...) are platform-specific
6
- * and belong in each subclass — different IMs expose different interaction models.
7
- */
8
1
  export const DEFAULT_CHANNEL_CAPABILITIES = Object.freeze({
9
2
  editMessages: false,
10
3
  typingIndicators: false,
@@ -15,24 +8,12 @@ export const DEFAULT_CHANNEL_CAPABILITIES = Object.freeze({
15
8
  export class Channel {
16
9
  bot = null;
17
10
  capabilities = DEFAULT_CHANNEL_CAPABILITIES;
18
- /**
19
- * Send an image given in-memory bytes. Default implementation throws — only
20
- * channels whose `capabilities.sendImage` is true must override. The bot
21
- * uses `supportsChannelCapability(ch, 'sendImage')` to gate dispatch.
22
- *
23
- * `mime` is the explicit MIME type (e.g. `image/png`) so subclasses can pick
24
- * the right native upload primitive (Telegram sendPhoto vs sendDocument;
25
- * Feishu uploadImage `image_type=message`; WeChat image message vs file).
26
- */
27
11
  async sendImage(_chatId, _bytes, _opts) {
28
12
  throw new Error(`${this.constructor.name} does not implement sendImage`);
29
13
  }
30
14
  async setMenu(_commands) { }
31
15
  async clearMenu() { }
32
16
  }
33
- // ---------------------------------------------------------------------------
34
- // Shared helpers
35
- // ---------------------------------------------------------------------------
36
17
  export function supportsChannelCapability(channel, capability) {
37
18
  return channel?.capabilities?.[capability] ?? false;
38
19
  }
@@ -1,6 +1,3 @@
1
- /**
2
- * DingTalk bot orchestration.
3
- */
4
1
  import fs from 'node:fs';
5
2
  import os from 'node:os';
6
3
  import path from 'node:path';
@@ -1,18 +1,3 @@
1
- /**
2
- * DingTalk channel transport — Stream Mode (no public IP needed).
3
- *
4
- * Uses dingtalk-stream@2.x SDK. Auth: clientId (AppKey) + clientSecret
5
- * (AppSecret) of a self-built robot/app subscribed to the bot message topic.
6
- *
7
- * Receive: DWClient subscribes to TOPIC_ROBOT and yields RobotTextMessage
8
- * payloads via registerCallbackListener.
9
- *
10
- * Send: each inbound message carries a `sessionWebhook` URL valid for ~2 hours,
11
- * which we POST to for replies. We cache the latest sessionWebhook per chat
12
- * so a long-running task that produces a result message can still reach the
13
- * user even after the original webhook would have expired (mid-conversation
14
- * activity refreshes it). DingTalk plain-text messages cannot be edited.
15
- */
16
1
  import { DWClient, TOPIC_ROBOT, EventAck } from 'dingtalk-stream';
17
2
  import { Channel, DEFAULT_CHANNEL_CAPABILITIES, splitText, sleep, } from '../base.js';
18
3
  import { DINGTALK_LIMITS } from '../../core/constants.js';
@@ -29,8 +14,6 @@ function previewText(value, max = 200) {
29
14
  export class DingtalkChannel extends Channel {
30
15
  capabilities = {
31
16
  ...DEFAULT_CHANNEL_CAPABILITIES,
32
- // DingTalk Stream Mode plain-text messages cannot be edited; AI Cards
33
- // can be updated but are out of scope for this minimal channel.
34
17
  };
35
18
  knownChats = new Set();
36
19
  clientId;
@@ -42,7 +25,6 @@ export class DingtalkChannel extends Channel {
42
25
  chatMeta = new Map();
43
26
  messageHandlers = new Set();
44
27
  errorHandlers = new Set();
45
- /** Dedup: stream may redeliver after timeouts. */
46
28
  seenMsgIds = new Set();
47
29
  seenMsgIdQueue = [];
48
30
  static SEEN_CAP = 256;
@@ -54,9 +36,6 @@ export class DingtalkChannel extends Channel {
54
36
  }
55
37
  onMessage(handler) { this.messageHandlers.add(handler); return this; }
56
38
  onError(handler) { this.errorHandlers.add(handler); return this; }
57
- // ========================================================================
58
- // Lifecycle
59
- // ========================================================================
60
39
  async connect() {
61
40
  this.dwClient = new DWClient({
62
41
  clientId: this.clientId,
@@ -133,9 +112,6 @@ export class DingtalkChannel extends Channel {
133
112
  this.listenResolve?.();
134
113
  this.listenResolve = null;
135
114
  }
136
- // ========================================================================
137
- // Outgoing primitives
138
- // ========================================================================
139
115
  async send(chatId, text, _opts = {}) {
140
116
  const chat = String(chatId);
141
117
  const meta = this.chatMeta.get(chat);
@@ -169,26 +145,17 @@ export class DingtalkChannel extends Channel {
169
145
  catch (err) {
170
146
  if (err instanceof Error && err.message.startsWith('DingTalk reply errcode='))
171
147
  throw err;
172
- // Non-JSON body or no errcode is treated as success.
173
148
  }
174
149
  lastId = `dt:${Date.now().toString(36)}:${i}`;
175
150
  }
176
151
  return lastId;
177
152
  }
178
153
  async editMessage(_chatId, _msgId, _text, _opts) {
179
- // Plain-text messages on DingTalk are not editable. AI Cards have an
180
- // update API but require pre-registering a card template — out of scope
181
- // for this transport. Callers that fall back here just no-op.
182
154
  }
183
155
  async deleteMessage(_chatId, _msgId) {
184
- // No public delete API for bot-sent messages.
185
156
  }
186
157
  async sendTyping(_chatId, _opts) {
187
- // No typing indicator API.
188
158
  }
189
- // ========================================================================
190
- // Internal dispatch
191
- // ========================================================================
192
159
  async dispatchRobotMessage(msg) {
193
160
  try {
194
161
  this.dwClient?.socketCallBackResponse(msg.headers.messageId, { status: EventAck.SUCCESS });
@@ -1,10 +1,3 @@
1
- /**
2
- * Discord bot orchestration.
3
- *
4
- * Mirrors the Slack/Weixin command surface (/help, /status, /agent, /models, …)
5
- * over Discord channels. Bot replies as a regular message reply so the thread
6
- * UI keeps the conversation grouped under the trigger message.
7
- */
8
1
  import fs from 'node:fs';
9
2
  import os from 'node:os';
10
3
  import path from 'node:path';
@@ -1,16 +1,3 @@
1
- /**
2
- * Discord channel transport — Gateway WebSocket (no public IP needed).
3
- *
4
- * Uses discord.js v14 with the bare minimum gateway intents:
5
- * - Guilds, GuildMessages, MessageContent, DirectMessages
6
- *
7
- * IMPORTANT: For the bot to read message content in shared channels you must
8
- * enable the "Message Content Intent" toggle in the Discord developer portal
9
- * Bot page. Without it the gateway will silently emit empty `content`.
10
- *
11
- * Receives DMs and messages where the bot is mentioned. Self-authored
12
- * messages are filtered out before dispatch.
13
- */
14
1
  import { Client, Events, GatewayIntentBits, Partials, } from 'discord.js';
15
2
  import { Channel, DEFAULT_CHANNEL_CAPABILITIES, splitText, sleep, } from '../base.js';
16
3
  import { DISCORD_LIMITS } from '../../core/constants.js';
@@ -42,9 +29,6 @@ export class DiscordChannel extends Channel {
42
29
  }
43
30
  onMessage(handler) { this.messageHandlers.add(handler); return this; }
44
31
  onError(handler) { this.errorHandlers.add(handler); return this; }
45
- // ========================================================================
46
- // Lifecycle
47
- // ========================================================================
48
32
  async connect() {
49
33
  this.client = new Client({
50
34
  intents: [
@@ -122,9 +106,6 @@ export class DiscordChannel extends Channel {
122
106
  this.listenResolve?.();
123
107
  this.listenResolve = null;
124
108
  }
125
- // ========================================================================
126
- // Outgoing primitives
127
- // ========================================================================
128
109
  async send(chatId, text, opts = {}) {
129
110
  const channelId = String(chatId);
130
111
  const channel = await this.fetchTextChannel(channelId);
@@ -174,9 +155,6 @@ export class DiscordChannel extends Channel {
174
155
  }
175
156
  catch { }
176
157
  }
177
- // ========================================================================
178
- // Internal dispatch
179
- // ========================================================================
180
158
  async dispatchMessage(msg) {
181
159
  if (msg.author?.bot)
182
160
  return;