pikiloom 0.4.26 → 0.4.28
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/dashboard/dist/assets/{AgentTab-BNJ73P0m.js → AgentTab-DtjuI8NU.js} +1 -1
- package/dashboard/dist/assets/ConnectionModal-BIx6a5o1.js +1 -0
- package/dashboard/dist/assets/{DirBrowser-D-GT-G-w.js → DirBrowser-BINh_7NB.js} +1 -1
- package/dashboard/dist/assets/{ExtensionsTab-BrJMulJR.js → ExtensionsTab-CHpd147b.js} +1 -1
- package/dashboard/dist/assets/{IMAccessTab-auPnx468.js → IMAccessTab-C4DbGxbG.js} +1 -1
- package/dashboard/dist/assets/{Modal-lYfO9m-I.js → Modal-D_PUi-5O.js} +1 -1
- package/dashboard/dist/assets/{Modals-PRdWOIY9.js → Modals-BahDEMqf.js} +1 -1
- package/dashboard/dist/assets/{Select-BhbU-rll.js → Select-Cp5VXb_2.js} +1 -1
- package/dashboard/dist/assets/SessionPanel-DZVNXptx.js +1 -0
- package/dashboard/dist/assets/SystemTab-CLznS31f.js +1 -0
- package/dashboard/dist/assets/index-CLGovkkw.js +3 -0
- package/dashboard/dist/assets/index-CXIN3nTr.css +1 -0
- package/dashboard/dist/assets/index-DcYOI6rL.js +23 -0
- package/dashboard/dist/assets/{shared-C5uXvhZJ.js → shared-C8DCTJ44.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dist/agent/acp-client.js +0 -59
- package/dist/agent/artifacts.js +1 -38
- package/dist/agent/auto-update.js +2 -78
- package/dist/agent/await-resume.js +0 -20
- package/dist/agent/cli/auth.js +3 -51
- package/dist/agent/cli/catalog.js +0 -3
- package/dist/agent/cli/detector.js +1 -19
- package/dist/agent/cli/index.js +0 -3
- package/dist/agent/cli/registry.js +0 -25
- package/dist/agent/driver.js +0 -14
- package/dist/agent/drivers/claude-tui.js +2 -769
- package/dist/agent/drivers/claude.js +12 -631
- package/dist/agent/drivers/codex.js +11 -162
- package/dist/agent/drivers/gemini.js +6 -114
- package/dist/agent/drivers/hermes.js +0 -128
- package/dist/agent/goal.js +0 -45
- package/dist/agent/handover.js +1 -46
- package/dist/agent/images.js +7 -133
- package/dist/agent/index.js +1 -29
- package/dist/agent/mcp/bridge.js +1 -197
- package/dist/agent/mcp/extensions.js +5 -84
- package/dist/agent/mcp/oauth.js +2 -69
- package/dist/agent/mcp/registry.js +2 -33
- package/dist/agent/mcp/session-server.js +2 -45
- package/dist/agent/mcp/tools/ask-user.js +0 -6
- package/dist/agent/mcp/tools/await-resume.js +0 -15
- package/dist/agent/mcp/tools/goal.js +0 -25
- package/dist/agent/mcp/tools/types.js +0 -5
- package/dist/agent/mcp/tools/workspace.js +0 -23
- package/dist/agent/npm.js +0 -14
- package/dist/agent/session.js +86 -196
- package/dist/agent/skill-installer.js +3 -70
- package/dist/agent/skills.js +0 -43
- package/dist/agent/stream.js +5 -148
- package/dist/agent/types.js +0 -12
- package/dist/agent/utils.js +2 -120
- package/dist/bot/bot.js +3 -468
- package/dist/bot/command-ui.js +0 -45
- package/dist/bot/commands.js +0 -51
- package/dist/bot/headless-bot.js +0 -21
- package/dist/bot/host.js +1 -5
- package/dist/bot/human-loop.js +0 -8
- package/dist/bot/menu.js +0 -3
- package/dist/bot/orchestration.js +0 -3
- package/dist/bot/render-shared.js +0 -63
- package/dist/bot/session-hub.js +14 -92
- package/dist/bot/session-status.js +1 -5
- package/dist/bot/streaming.js +0 -53
- package/dist/browser-profile.js +0 -51
- package/dist/browser-supervisor.js +0 -75
- package/dist/catalog/cli-tools.js +0 -53
- package/dist/catalog/index.js +0 -18
- package/dist/catalog/local-models.js +0 -18
- package/dist/catalog/mcp-servers.js +0 -35
- package/dist/catalog/skill-repos.js +0 -32
- package/dist/channels/base.js +0 -19
- package/dist/channels/dingtalk/bot.js +0 -3
- package/dist/channels/dingtalk/channel.js +0 -33
- package/dist/channels/discord/bot.js +0 -7
- package/dist/channels/discord/channel.js +0 -22
- package/dist/channels/feishu/bot.js +0 -71
- package/dist/channels/feishu/channel.js +0 -78
- package/dist/channels/feishu/markdown.js +0 -5
- package/dist/channels/feishu/render.js +0 -45
- package/dist/channels/health.js +0 -46
- package/dist/channels/slack/bot.js +0 -7
- package/dist/channels/slack/channel.js +1 -27
- package/dist/channels/states.js +0 -3
- package/dist/channels/telegram/bot.js +0 -60
- package/dist/channels/telegram/channel.js +2 -99
- package/dist/channels/telegram/directory.js +0 -3
- package/dist/channels/telegram/live-preview.js +0 -8
- package/dist/channels/telegram/render.js +0 -30
- package/dist/channels/wecom/bot.js +0 -3
- package/dist/channels/wecom/channel.js +0 -58
- package/dist/channels/weixin/api.js +0 -9
- package/dist/channels/weixin/bot.js +0 -88
- package/dist/channels/weixin/channel.js +0 -6
- package/dist/cli/autostart.js +1 -44
- package/dist/cli/channel-supervisor.js +1 -59
- package/dist/cli/channels.js +0 -6
- package/dist/cli/main.js +1 -145
- package/dist/cli/onboarding.js +0 -6
- package/dist/cli/run.js +0 -11
- package/dist/cli/setup-wizard.js +0 -3
- package/dist/core/config/runtime-config.js +0 -38
- package/dist/core/config/user-config.js +0 -63
- package/dist/core/config/validation.js +0 -9
- package/dist/core/constants.js +0 -268
- package/dist/core/git.js +0 -31
- package/dist/core/legacy-compat.js +1 -28
- package/dist/core/logging.js +0 -3
- package/dist/core/platform.js +0 -28
- package/dist/core/process-control.js +0 -8
- package/dist/core/secrets/index.js +0 -17
- package/dist/core/secrets/inline-seal.js +0 -7
- package/dist/core/secrets/ref.js +0 -19
- package/dist/core/secrets/resolver.js +0 -8
- package/dist/core/secrets/store.js +1 -12
- package/dist/core/utils.js +1 -37
- package/dist/core/version.js +0 -3
- package/dist/dashboard/platform.js +1 -35
- package/dist/dashboard/routes/agents.js +2 -71
- package/dist/dashboard/routes/cli.js +0 -27
- package/dist/dashboard/routes/config.js +0 -54
- package/dist/dashboard/routes/extensions.js +0 -132
- package/dist/dashboard/routes/local-models.js +0 -68
- package/dist/dashboard/routes/models.js +0 -46
- package/dist/dashboard/routes/sessions.js +0 -100
- package/dist/dashboard/runtime.js +1 -58
- package/dist/dashboard/server.js +0 -49
- package/dist/dashboard/session-control.js +2 -69
- package/dist/model/catalog.js +1 -17
- package/dist/model/index.js +0 -15
- package/dist/model/injector.js +1 -181
- package/dist/model/provider-models.js +1 -48
- package/dist/model/responses-bridge.js +3 -45
- package/dist/model/store.js +0 -17
- package/dist/model/types.js +0 -12
- package/dist/model/validation.js +1 -18
- package/dist/pikichannel/adapter-pikiloom.js +0 -31
- package/dist/pikichannel/code.js +0 -12
- package/dist/pikichannel/codec.js +0 -14
- package/dist/pikichannel/host.js +4 -33
- package/dist/pikichannel/protocol.js +0 -52
- package/dist/pikichannel/rendezvous-broker.js +5 -26
- package/dist/pikichannel/rendezvous-host.js +3 -16
- package/dist/pikichannel/server.js +6 -55
- package/dist/pikichannel/transport.js +0 -25
- package/dist/pikichannel/transports/webrtc-host.js +0 -18
- package/dist/pikichannel/transports/webrtc-shared.js +4 -34
- package/dist/pikichannel/transports/websocket-host.js +1 -14
- package/dist/pikichannel/turn.js +2 -69
- package/dist/pikichannel/web/sdk.js +14 -71
- package/package.json +1 -1
- package/dashboard/dist/assets/ConnectionModal-Dt05H2f9.js +0 -1
- package/dashboard/dist/assets/SessionPanel-_0dLWvEb.js +0 -1
- package/dashboard/dist/assets/SystemTab-CN_QrRKt.js +0 -1
- package/dashboard/dist/assets/index-CP3LYJR2.js +0 -23
- package/dashboard/dist/assets/index-C_neLnaO.js +0 -3
- 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',
|
package/dist/catalog/index.js
CHANGED
|
@@ -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',
|
package/dist/channels/base.js
CHANGED
|
@@ -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,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;
|