@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/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * GitHub 适配器入口:类型扩展、模型、导出、注册
3
3
  */
4
- import { formatCompact, registerAgentPromptContributor, type Context, type Plugin, type Tool, type ToolContext, type ToolFeature, unregisterAgentPromptContributor, usePlugin } from 'zhin.js';
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
- bot: string;
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 { GitHubBot, parseMarkdown, toMarkdown } from './bot.js';
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
- bot: { type: 'text', nullable: false },
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 账号,未绑定则用 Bot 默认账号)',
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>, context?: ToolContext) => {
132
- const gh = await adapter.getUserOrDefaultAPI(context?.platform, context?.senderId);
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>, context?: ToolContext) => {
162
- if (!context?.platform || !context?.senderId) {
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 '❌ Bot 未配置 GitHub App 或 App 无 client_id,无法进行账号绑定';
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: context.platform, platform_uid: context.senderId });
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: context.platform, sender: context.senderId }));
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: context.platform,
212
- platform_uid: context.senderId,
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: context.platform, sender: context.senderId, login }));
217
+ logger.info(formatCompact( { op: 'bind', platform: commMessage.$adapter, sender: commMessage.$sender.id, login }));
218
218
 
219
219
  // 尝试回复绑定成功消息
220
- if (context.message?.$reply) {
221
- await context.message.$reply(`✅ GitHub 账号绑定成功!\n👤 ${login}`);
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: any) {
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>, context?: ToolContext) => {
243
- if (!context?.platform || !context?.senderId) {
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: context.platform, platform_uid: context.senderId });
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>, context?: ToolContext) => {
267
- if (!context?.platform || !context?.senderId) {
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: context.platform, platform_uid: context.senderId });
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 的链接 — 安装后 Bot 可以访问你的仓库,你也可以使用更多功能',
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 '❌ Bot 未配置 GitHub App';
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>, context?: ToolContext) => {
325
- if (!context?.platform || !context?.senderId || !context?.sceneId || !context?.botId) {
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: context.sceneId,
341
- adapter: context.platform,
342
- bot: context.botId,
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: context.scope || 'private' }).where({ id: existing.id });
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: context.sceneId,
354
- target_type: context.scope || 'private',
355
- adapter: context.platform,
356
- bot: context.botId,
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>, context?: ToolContext) => {
375
- if (!context?.platform || !context?.sceneId || !context?.botId) {
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: context.sceneId,
385
- adapter: context.platform,
386
- bot: context.botId,
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>, context?: ToolContext) => {
405
- if (!context?.platform || !context?.sceneId || !context?.botId) {
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: context.sceneId,
414
- adapter: context.platform,
415
- bot: context.botId,
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
- // ── Bot 配置 ─────────────────────────────────────────────────────────
1
+ // ── Endpoint 配置 ─────────────────────────────────────────────────────────
2
2
  // 基于 gh CLI 认证:需要系统已安装并认证 gh CLI
3
3
  // 认证方式:gh auth login
4
4
 
5
- export interface GitHubBotConfig {
5
+ export interface GitHubEndpointConfig {
6
6
  context: 'github';
7
- /** Bot 标识名称 */
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
- bot: string;
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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"}