@zhin.js/adapter-github 0.1.64 → 1.0.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.
- package/README.md +7 -7
- package/lib/adapter.d.ts +10 -9
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +45 -44
- package/lib/adapter.js.map +1 -1
- package/lib/{bot.d.ts → endpoint.d.ts} +7 -7
- package/lib/endpoint.d.ts.map +1 -0
- package/lib/{bot.js → endpoint.js} +8 -8
- package/lib/endpoint.js.map +1 -0
- package/lib/gh-client.d.ts.map +1 -1
- package/lib/gh-client.js +10 -6
- package/lib/gh-client.js.map +1 -1
- package/lib/index.d.ts +2 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +44 -44
- package/lib/index.js.map +1 -1
- package/lib/types.d.ts +3 -3
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +1 -1
- package/lib/types.js.map +1 -1
- package/package.json +5 -4
- package/skills/github/SKILL.md +4 -4
- package/src/adapter.ts +53 -51
- package/src/{bot.ts → endpoint.ts} +10 -10
- package/src/gh-client.ts +16 -12
- package/src/index.ts +47 -47
- package/src/types.ts +4 -4
- package/lib/bot.d.ts.map +0 -1
- package/lib/bot.js.map +0 -1
package/src/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* GitHub 适配器入口:类型扩展、模型、导出、注册
|
|
3
3
|
*/
|
|
4
|
-
import { formatCompact, registerAgentPromptContributor, type Context, type
|
|
4
|
+
import { formatCompact, registerAgentPromptContributor, type Context, type Message, type Plugin, type Tool, type ToolFeature, unregisterAgentPromptContributor, usePlugin } from 'zhin.js';
|
|
5
5
|
import { createGithubAgentPromptContributor } from './agent-prompt.js';
|
|
6
6
|
import { GitHubAdapter } from './adapter.js';
|
|
7
7
|
import { GhClient } from './gh-client.js';
|
|
@@ -25,7 +25,7 @@ declare module 'zhin.js' {
|
|
|
25
25
|
target_id: string;
|
|
26
26
|
target_type: 'private' | 'group' | 'channel';
|
|
27
27
|
adapter: string;
|
|
28
|
-
|
|
28
|
+
endpoint: string;
|
|
29
29
|
};
|
|
30
30
|
github_events: {
|
|
31
31
|
id: number;
|
|
@@ -38,7 +38,7 @@ declare module 'zhin.js' {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
export * from './types.js';
|
|
41
|
-
export {
|
|
41
|
+
export { GitHubEndpoint, parseMarkdown, toMarkdown } from './endpoint.js';
|
|
42
42
|
export { GitHubAdapter } from './adapter.js';
|
|
43
43
|
export { GhClient } from './gh-client.js';
|
|
44
44
|
|
|
@@ -54,7 +54,7 @@ defineModel('github_subscriptions', {
|
|
|
54
54
|
target_id: { type: 'text', nullable: false },
|
|
55
55
|
target_type: { type: 'text', nullable: false },
|
|
56
56
|
adapter: { type: 'text', nullable: false },
|
|
57
|
-
|
|
57
|
+
endpoint: { type: 'text', nullable: false },
|
|
58
58
|
});
|
|
59
59
|
|
|
60
60
|
defineModel('github_events', {
|
|
@@ -118,7 +118,7 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
118
118
|
// --- Star ---
|
|
119
119
|
{
|
|
120
120
|
name: 'github_star',
|
|
121
|
-
description: 'Star 或取消 Star 一个 GitHub 仓库(使用你绑定的 GitHub 账号,未绑定则用
|
|
121
|
+
description: 'Star 或取消 Star 一个 GitHub 仓库(使用你绑定的 GitHub 账号,未绑定则用 Endpoint 默认账号)',
|
|
122
122
|
parameters: {
|
|
123
123
|
type: 'object' as const,
|
|
124
124
|
properties: {
|
|
@@ -128,8 +128,8 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
128
128
|
required: ['action', 'repo'],
|
|
129
129
|
},
|
|
130
130
|
tags: ['github'],
|
|
131
|
-
execute: async (args: Record<string, any>,
|
|
132
|
-
const gh = await adapter.getUserOrDefaultAPI(
|
|
131
|
+
execute: async (args: Record<string, any>, commMessage?: Message<any>) => {
|
|
132
|
+
const gh = await adapter.getUserOrDefaultAPI(commMessage?.$adapter, commMessage?.$sender.id);
|
|
133
133
|
if (!gh) return '❌ 没有可用的 GitHub bot';
|
|
134
134
|
const { action, repo } = args;
|
|
135
135
|
switch (action) {
|
|
@@ -158,19 +158,19 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
158
158
|
properties: {},
|
|
159
159
|
},
|
|
160
160
|
tags: ['github'],
|
|
161
|
-
execute: async (_args: Record<string, any>,
|
|
162
|
-
if (!
|
|
161
|
+
execute: async (_args: Record<string, any>, commMessage?: Message<any>) => {
|
|
162
|
+
if (!commMessage?.$adapter || !commMessage?.$sender?.id) {
|
|
163
163
|
return '❌ 无法获取当前用户信息';
|
|
164
164
|
}
|
|
165
165
|
const clientId = adapter.getClientId();
|
|
166
|
-
if (!clientId) return '❌
|
|
166
|
+
if (!clientId) return '❌ Endpoint 未配置 GitHub App 或 App 无 client_id,无法进行账号绑定';
|
|
167
167
|
|
|
168
168
|
const db = plugin.root?.inject('database') as any;
|
|
169
169
|
const model = db?.models?.get('github_oauth_users');
|
|
170
170
|
if (!model) return '❌ 数据库未就绪';
|
|
171
171
|
|
|
172
172
|
// 检查是否已绑定
|
|
173
|
-
const [existing] = await model.select().where({ platform:
|
|
173
|
+
const [existing] = await model.select().where({ platform: commMessage.$adapter, platform_uid: commMessage.$sender.id });
|
|
174
174
|
if (existing) {
|
|
175
175
|
return `⚠️ 你已绑定 GitHub 账号: ${existing.github_login}\n如需重新绑定,请先执行 github_unbind`;
|
|
176
176
|
}
|
|
@@ -197,7 +197,7 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
197
197
|
tokenPromise.then(async (tokenData) => {
|
|
198
198
|
if (!tokenData) {
|
|
199
199
|
// 授权超时或被拒绝 — 由于 execute 已经返回了,这里只能通过日志记录
|
|
200
|
-
logger.warn(formatCompact( { op: 'device_flow', ok: false, platform:
|
|
200
|
+
logger.warn(formatCompact( { op: 'device_flow', ok: false, platform: commMessage.$adapter, sender: commMessage.$sender.id }));
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
203
|
|
|
@@ -208,25 +208,25 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
208
208
|
|
|
209
209
|
await model.insert({
|
|
210
210
|
id: Date.now(),
|
|
211
|
-
platform:
|
|
212
|
-
platform_uid:
|
|
211
|
+
platform: commMessage.$adapter,
|
|
212
|
+
platform_uid: commMessage.$sender.id,
|
|
213
213
|
github_login: login,
|
|
214
214
|
access_token: tokenData.access_token,
|
|
215
215
|
created_at: Date.now(),
|
|
216
216
|
});
|
|
217
|
-
logger.info(formatCompact( { op: 'bind', platform:
|
|
217
|
+
logger.info(formatCompact( { op: 'bind', platform: commMessage.$adapter, sender: commMessage.$sender.id, login }));
|
|
218
218
|
|
|
219
219
|
// 尝试回复绑定成功消息
|
|
220
|
-
if (
|
|
221
|
-
await
|
|
220
|
+
if (commMessage?.$reply) {
|
|
221
|
+
await commMessage.$reply(`✅ GitHub 账号绑定成功!\n👤 ${login}`);
|
|
222
222
|
}
|
|
223
223
|
}).catch(err => {
|
|
224
224
|
logger.error('GitHub Device Flow 错误:', err);
|
|
225
225
|
});
|
|
226
226
|
|
|
227
227
|
return replyMsg;
|
|
228
|
-
} catch (e:
|
|
229
|
-
return `❌ Device Flow 启动失败: ${e.message}`;
|
|
228
|
+
} catch (e: unknown) {
|
|
229
|
+
return `❌ Device Flow 启动失败: ${e instanceof Error ? e.message : String(e)}`;
|
|
230
230
|
}
|
|
231
231
|
},
|
|
232
232
|
},
|
|
@@ -239,15 +239,15 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
239
239
|
properties: {},
|
|
240
240
|
},
|
|
241
241
|
tags: ['github'],
|
|
242
|
-
execute: async (_args: Record<string, any>,
|
|
243
|
-
if (!
|
|
242
|
+
execute: async (_args: Record<string, any>, commMessage?: Message<any>) => {
|
|
243
|
+
if (!commMessage?.$adapter || !commMessage?.$sender?.id) {
|
|
244
244
|
return '❌ 无法获取当前用户信息';
|
|
245
245
|
}
|
|
246
246
|
const db = plugin.root?.inject('database') as any;
|
|
247
247
|
const model = db?.models?.get('github_oauth_users');
|
|
248
248
|
if (!model) return '❌ 数据库未就绪';
|
|
249
249
|
|
|
250
|
-
const [existing] = await model.select().where({ platform:
|
|
250
|
+
const [existing] = await model.select().where({ platform: commMessage.$adapter, platform_uid: commMessage.$sender.id });
|
|
251
251
|
if (!existing) return '📭 你尚未绑定 GitHub 账号';
|
|
252
252
|
|
|
253
253
|
await model.delete().where({ id: existing.id });
|
|
@@ -263,15 +263,15 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
263
263
|
properties: {},
|
|
264
264
|
},
|
|
265
265
|
tags: ['github'],
|
|
266
|
-
execute: async (_args: Record<string, any>,
|
|
267
|
-
if (!
|
|
266
|
+
execute: async (_args: Record<string, any>, commMessage?: Message<any>) => {
|
|
267
|
+
if (!commMessage?.$adapter || !commMessage?.$sender?.id) {
|
|
268
268
|
return '❌ 无法获取当前用户信息';
|
|
269
269
|
}
|
|
270
270
|
const db = plugin.root?.inject('database') as any;
|
|
271
271
|
const model = db?.models?.get('github_oauth_users');
|
|
272
272
|
if (!model) return '❌ 数据库未就绪';
|
|
273
273
|
|
|
274
|
-
const [existing] = await model.select().where({ platform:
|
|
274
|
+
const [existing] = await model.select().where({ platform: commMessage.$adapter, platform_uid: commMessage.$sender.id });
|
|
275
275
|
if (!existing) return '📭 你尚未绑定 GitHub 账号\n🔗 使用 github_bind 绑定你的账号';
|
|
276
276
|
|
|
277
277
|
// 验证 token 是否仍然有效
|
|
@@ -286,7 +286,7 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
286
286
|
// --- Install App ---
|
|
287
287
|
{
|
|
288
288
|
name: 'github_install',
|
|
289
|
-
description: '获取安装 GitHub App 的链接 — 安装后
|
|
289
|
+
description: '获取安装 GitHub App 的链接 — 安装后 Endpoint 可以访问你的仓库,你也可以使用更多功能',
|
|
290
290
|
parameters: {
|
|
291
291
|
type: 'object' as const,
|
|
292
292
|
properties: {},
|
|
@@ -294,7 +294,7 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
294
294
|
tags: ['github'],
|
|
295
295
|
execute: async () => {
|
|
296
296
|
const slug = adapter.getAppSlug();
|
|
297
|
-
if (!slug) return '❌
|
|
297
|
+
if (!slug) return '❌ Endpoint 未配置 GitHub App';
|
|
298
298
|
const host = adapter.getHost() || 'github.com';
|
|
299
299
|
const installations = adapter.getInstallations();
|
|
300
300
|
let msg = `🔗 请点击以下链接安装 GitHub App 到你的仓库:\n https://${host}/apps/${slug}/installations/new`;
|
|
@@ -321,8 +321,8 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
321
321
|
},
|
|
322
322
|
platforms: ['github'],
|
|
323
323
|
tags: ['github'],
|
|
324
|
-
execute: async (args: Record<string, any>,
|
|
325
|
-
if (!
|
|
324
|
+
execute: async (args: Record<string, any>, commMessage?: Message<any>) => {
|
|
325
|
+
if (!commMessage?.$adapter || !commMessage?.$sender.id || !commMessage?.$channel?.id || !commMessage?.$endpoint) {
|
|
326
326
|
return '❌ 无法获取当前聊天通道信息';
|
|
327
327
|
}
|
|
328
328
|
const db = plugin.root?.inject('database') as any;
|
|
@@ -337,12 +337,12 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
337
337
|
|
|
338
338
|
const [existing] = await model.select().where({
|
|
339
339
|
repo: args.repo,
|
|
340
|
-
target_id:
|
|
341
|
-
adapter:
|
|
342
|
-
|
|
340
|
+
target_id: commMessage.$channel?.id,
|
|
341
|
+
adapter: commMessage.$adapter,
|
|
342
|
+
endpoint: commMessage.$endpoint,
|
|
343
343
|
});
|
|
344
344
|
if (existing) {
|
|
345
|
-
await model.update({ events, target_type:
|
|
345
|
+
await model.update({ events, target_type: commMessage.$channel?.type || 'private' }).where({ id: existing.id });
|
|
346
346
|
return `✅ 已更新订阅 ${args.repo}\n📡 事件: ${events.join(', ')}`;
|
|
347
347
|
}
|
|
348
348
|
|
|
@@ -350,10 +350,10 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
350
350
|
id: Date.now(),
|
|
351
351
|
repo: args.repo,
|
|
352
352
|
events,
|
|
353
|
-
target_id:
|
|
354
|
-
target_type:
|
|
355
|
-
adapter:
|
|
356
|
-
|
|
353
|
+
target_id: commMessage.$channel?.id,
|
|
354
|
+
target_type: commMessage.$channel?.type || 'private',
|
|
355
|
+
adapter: commMessage.$adapter,
|
|
356
|
+
endpoint: commMessage.$endpoint,
|
|
357
357
|
});
|
|
358
358
|
return `✅ 已订阅 ${args.repo}\n📡 事件: ${events.join(', ')}\n📌 通知将推送到当前通道`;
|
|
359
359
|
},
|
|
@@ -371,8 +371,8 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
371
371
|
},
|
|
372
372
|
platforms: ['github'],
|
|
373
373
|
tags: ['github'],
|
|
374
|
-
execute: async (args: Record<string, any>,
|
|
375
|
-
if (!
|
|
374
|
+
execute: async (args: Record<string, any>, commMessage?: Message<any>) => {
|
|
375
|
+
if (!commMessage?.$adapter || !commMessage?.$channel?.id || !commMessage?.$endpoint) {
|
|
376
376
|
return '❌ 无法获取当前聊天通道信息';
|
|
377
377
|
}
|
|
378
378
|
const db = plugin.root?.inject('database') as any;
|
|
@@ -381,9 +381,9 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
381
381
|
|
|
382
382
|
const [existing] = await model.select().where({
|
|
383
383
|
repo: args.repo,
|
|
384
|
-
target_id:
|
|
385
|
-
adapter:
|
|
386
|
-
|
|
384
|
+
target_id: commMessage.$channel?.id,
|
|
385
|
+
adapter: commMessage.$adapter,
|
|
386
|
+
endpoint: commMessage.$endpoint,
|
|
387
387
|
});
|
|
388
388
|
if (!existing) return `📭 当前通道未订阅 ${args.repo}`;
|
|
389
389
|
|
|
@@ -401,8 +401,8 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
401
401
|
},
|
|
402
402
|
platforms: ['github'],
|
|
403
403
|
tags: ['github'],
|
|
404
|
-
execute: async (_args: Record<string, any>,
|
|
405
|
-
if (!
|
|
404
|
+
execute: async (_args: Record<string, any>, commMessage?: Message<any>) => {
|
|
405
|
+
if (!commMessage?.$adapter || !commMessage?.$channel?.id || !commMessage?.$endpoint) {
|
|
406
406
|
return '❌ 无法获取当前聊天通道信息';
|
|
407
407
|
}
|
|
408
408
|
const db = plugin.root?.inject('database') as any;
|
|
@@ -410,9 +410,9 @@ useContext('tool', 'github', (toolService: ToolFeature, adapter: GitHubAdapter)
|
|
|
410
410
|
if (!model) return '❌ 数据库未就绪';
|
|
411
411
|
|
|
412
412
|
const subs = await model.select().where({
|
|
413
|
-
target_id:
|
|
414
|
-
adapter:
|
|
415
|
-
|
|
413
|
+
target_id: commMessage.$channel?.id,
|
|
414
|
+
adapter: commMessage.$adapter,
|
|
415
|
+
endpoint: commMessage.$endpoint,
|
|
416
416
|
});
|
|
417
417
|
if (!subs?.length) return '📭 当前通道没有任何 GitHub 订阅';
|
|
418
418
|
|
package/src/types.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// ──
|
|
1
|
+
// ── Endpoint 配置 ─────────────────────────────────────────────────────────
|
|
2
2
|
// 基于 gh CLI 认证:需要系统已安装并认证 gh CLI
|
|
3
3
|
// 认证方式:gh auth login
|
|
4
4
|
|
|
5
|
-
export interface
|
|
5
|
+
export interface GitHubEndpointConfig {
|
|
6
6
|
context: 'github';
|
|
7
|
-
/**
|
|
7
|
+
/** Endpoint 标识名称 */
|
|
8
8
|
name: string;
|
|
9
9
|
/** GitHub Enterprise 主机名(默认 github.com) */
|
|
10
10
|
host?: string;
|
|
@@ -135,7 +135,7 @@ export interface Subscription {
|
|
|
135
135
|
target_id: string;
|
|
136
136
|
target_type: 'private' | 'group' | 'channel';
|
|
137
137
|
adapter: string;
|
|
138
|
-
|
|
138
|
+
endpoint: string;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
// ── Tool Action Types ────────────────────────────────────────────────
|
package/lib/bot.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAiB,GAAG,EAAE,OAAO,EAAW,WAAW,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAC9G,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,EAAE,CAY1D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAYvD;AAED,qBAAa,SAAU,YAAW,GAAG,CAAC,eAAe,EAAE,mBAAmB,CAAC;IAUtD,OAAO,EAAE,aAAa;IAAS,OAAO,EAAE,eAAe;IAT1E,UAAU,UAAS;IACnB,EAAE,EAAE,QAAQ,CAAC;IAEb,IAAI,GAAG,WAAgC;IAEvC,IAAI,MAAM,6BAET;gBAEkB,OAAO,EAAE,aAAa,EAAS,OAAO,EAAE,eAAe;IAQpE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAOzB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA2B1E,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA2BvF,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IA8BnE,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhD"}
|
package/lib/bot.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"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"}
|