@zhin.js/plugin-rss 4.0.2 → 4.0.3

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.
@@ -6,6 +6,7 @@ import { fetchFeed, resolveRssConfig } from "../../lib/feed.js";
6
6
  import { markItemsSeen } from "../../lib/poll.js";
7
7
  export default defineCommand({
8
8
  description: '订阅一个 RSS/Atom 源',
9
+ params: { url: { type: 'string' } },
9
10
  async execute({ params, config, input }) {
10
11
  const Subs = getRssSubs();
11
12
  if (!Subs)
@@ -6,6 +6,7 @@ import { markItemsSeen } from '../../src/poll.js';
6
6
 
7
7
  export default defineCommand<RssConfig>({
8
8
  description: '订阅一个 RSS/Atom 源',
9
+ params: { url: { type: 'string' } },
9
10
  async execute({ params, config, input }) {
10
11
  const Subs = getRssSubs();
11
12
  if (!Subs) return 'RSS 数据库尚未就绪,请稍后重试';
@@ -6,6 +6,7 @@ import { resolveRssConfig } from "../../lib/feed.js";
6
6
  import { checkSubscriptions } from "../../lib/poll.js";
7
7
  export default defineCommand({
8
8
  description: '手动触发检查 RSS 更新',
9
+ params: { url: { type: 'string', default: '' } },
9
10
  async execute({ params, config, input }) {
10
11
  const Subs = getRssSubs();
11
12
  if (!Subs)
@@ -6,6 +6,7 @@ import { checkSubscriptions } from '../../src/poll.js';
6
6
 
7
7
  export default defineCommand<RssConfig>({
8
8
  description: '手动触发检查 RSS 更新',
9
+ params: { url: { type: 'string', default: '' } },
9
10
  async execute({ params, config, input }) {
10
11
  const Subs = getRssSubs();
11
12
  if (!Subs) return 'RSS 数据库尚未就绪';
@@ -3,6 +3,7 @@ import { defineCommand } from '@zhin.js/command';
3
3
  import { fetchFeed, formatFeedPreview, resolveRssConfig } from "../../lib/feed.js";
4
4
  export default defineCommand({
5
5
  description: '预览一个 RSS 源的最新内容(不订阅)',
6
+ params: { url: { type: 'string' } },
6
7
  async execute({ params, config }) {
7
8
  const url = String(params.url ?? '').trim();
8
9
  if (!url)
@@ -3,6 +3,7 @@ import { fetchFeed, formatFeedPreview, resolveRssConfig, type RssConfig } from '
3
3
 
4
4
  export default defineCommand<RssConfig>({
5
5
  description: '预览一个 RSS 源的最新内容(不订阅)',
6
+ params: { url: { type: 'string' } },
6
7
  async execute({ params, config }) {
7
8
  const url = String(params.url ?? '').trim();
8
9
  if (!url) return '请提供 RSS 源地址';
@@ -4,6 +4,7 @@ import { extractChannelInfo } from "../../lib/channel.js";
4
4
  import { getRssSubs } from "../../lib/db-store.js";
5
5
  export default defineCommand({
6
6
  description: '取消一个 RSS 订阅',
7
+ params: { url: { type: 'string' } },
7
8
  async execute({ params, input }) {
8
9
  const Subs = getRssSubs();
9
10
  if (!Subs)
@@ -5,6 +5,7 @@ import type { RssConfig } from '../../src/feed.js';
5
5
 
6
6
  export default defineCommand<RssConfig>({
7
7
  description: '取消一个 RSS 订阅',
8
+ params: { url: { type: 'string' } },
8
9
  async execute({ params, input }) {
9
10
  const Subs = getRssSubs();
10
11
  if (!Subs) return 'RSS 数据库尚未就绪';
package/lib/channel.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Extract subscription channel keys from Runtime Message (`input`).
3
- * Gaps vs legacy: no `$channel` / `$group` — use `adapter` / `target` / `metadata`.
3
+ * Gaps vs legacy: no `$channel` / `$group` — use `conversation` / `metadata`.
4
4
  */
5
5
  export interface ChannelInfo {
6
6
  adapterName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAiC9D"}
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,2DAA2D;AAC3D,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CA4C9D"}
package/lib/channel.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Extract subscription channel keys from Runtime Message (`input`).
3
- * Gaps vs legacy: no `$channel` / `$group` — use `adapter` / `target` / `metadata`.
3
+ * Gaps vs legacy: no `$channel` / `$group` — use `conversation` / `metadata`.
4
4
  */
5
5
  /** Smoke / agent / execute()-without-dispatch fallback. */
6
6
  export const SMOKE_CHANNEL = {
@@ -16,9 +16,15 @@ export function extractChannelInfo(input) {
16
16
  return { ...SMOKE_CHANNEL };
17
17
  const msg = input;
18
18
  const meta = msg.metadata ?? {};
19
- const channelType = String(meta.channelType ?? meta.type ?? meta.channel_type ?? 'private');
20
- const channelId = String(meta.channelId ?? meta.channel_id ?? msg.target ?? SMOKE_CHANNEL.channelId);
21
- const adapterName = String(msg.adapter ?? meta.adapter ?? SMOKE_CHANNEL.adapterName);
19
+ const conversation = msg.conversation;
20
+ const channelType = String(meta.channelType ?? meta.type ?? meta.channel_type ?? conversation?.kind ?? 'private');
21
+ const channelId = String(meta.channelId ?? meta.channel_id ?? conversation?.id ?? SMOKE_CHANNEL.channelId);
22
+ const endpointCapabilityId = typeof conversation?.endpoint?.id === 'string'
23
+ ? conversation.endpoint.id
24
+ : undefined;
25
+ const adapterName = String((endpointCapabilityId?.split('\0').pop() ?? endpointCapabilityId)?.split('~')[0]
26
+ ?? meta.adapter
27
+ ?? SMOKE_CHANNEL.adapterName);
22
28
  const endpointId = String(meta.endpoint ?? meta.endpointId ?? meta.endpoint_id ?? adapterName);
23
29
  const senderId = String(msg.sender ?? meta.senderId ?? '');
24
30
  const senderName = String(meta.senderName ?? meta.name ?? '');
@@ -1 +1 @@
1
- {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,WAAW,EAAE,OAAO;IACpB,UAAU,EAAE,OAAO;IACnB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAErE,MAAM,GAAG,GAAG,KAKX,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,CACxB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,SAAS,CAChE,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CACtB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,IAAI,aAAa,CAAC,SAAS,CAC3E,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,MAAM,CACvB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,WAAW,CACpE,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAE9D,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAE3F,OAAO;QACL,WAAW;QACX,UAAU;QACV,WAAW;QACX,SAAS;QACT,QAAQ;QACR,UAAU;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAgB;IACxC,WAAW,EAAE,OAAO;IACpB,UAAU,EAAE,OAAO;IACnB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,QAAQ;IACnB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;IAErE,MAAM,GAAG,GAAG,KAQX,CAAC;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CACxB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,IAAI,YAAY,EAAE,IAAI,IAAI,SAAS,CACtF,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,CACtB,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,YAAY,EAAE,EAAE,IAAI,aAAa,CAAC,SAAS,CACjF,CAAC;IACF,MAAM,oBAAoB,GAAG,OAAO,YAAY,EAAE,QAAQ,EAAE,EAAE,KAAK,QAAQ;QACzE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;QAC1B,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,WAAW,GAAG,MAAM,CACxB,CAAC,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,IAAI,oBAAoB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;WAC7E,IAAI,CAAC,OAAO;WACZ,aAAa,CAAC,WAAW,CAC7B,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CACvB,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,WAAW,CACpE,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAE9D,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,GAAG,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAE3F,OAAO;QACL,WAAW;QACX,UAAU;QACV,WAAW;QACX,SAAS;QACT,QAAQ;QACR,UAAU;KACX,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/plugin-rss",
3
- "version": "4.0.2",
3
+ "version": "4.0.3",
4
4
  "description": "RSS/Atom feed subscription plugin for Zhin.js (Plugin Runtime)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -41,18 +41,18 @@
41
41
  "license": "MIT",
42
42
  "dependencies": {
43
43
  "rss-parser": "^3.13.0",
44
- "@zhin.js/command": "1.0.6",
45
- "@zhin.js/plugin-runtime": "1.1.2"
44
+ "@zhin.js/command": "1.0.7",
45
+ "@zhin.js/plugin-runtime": "1.1.3"
46
46
  },
47
47
  "devDependencies": {
48
48
  "typescript": "^6.0.3",
49
49
  "vitest": "^4.1.10",
50
50
  "zod": "^4.4.3",
51
- "@zhin.js/agent": "1.1.2"
51
+ "@zhin.js/agent": "1.1.3"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "zod": "^4.0.0",
55
- "@zhin.js/agent": "1.1.2"
55
+ "@zhin.js/agent": "1.1.3"
56
56
  },
57
57
  "peerDependenciesMeta": {
58
58
  "@zhin.js/agent": {
package/plugin.js CHANGED
@@ -52,8 +52,10 @@ export default definePlugin({
52
52
  await outbound.send({
53
53
  adapter: input.adapterName,
54
54
  endpointId: input.endpointId,
55
- channelType: input.channelType,
56
- channelId: input.channelId,
55
+ conversation: {
56
+ kind: input.channelType,
57
+ id: input.channelId,
58
+ },
57
59
  content: input.content,
58
60
  });
59
61
  });
package/src/channel.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Extract subscription channel keys from Runtime Message (`input`).
3
- * Gaps vs legacy: no `$channel` / `$group` — use `adapter` / `target` / `metadata`.
3
+ * Gaps vs legacy: no `$channel` / `$group` — use `conversation` / `metadata`.
4
4
  */
5
5
 
6
6
  export interface ChannelInfo {
@@ -26,19 +26,30 @@ export function extractChannelInfo(input: unknown): ChannelInfo {
26
26
  if (!input || typeof input !== 'object') return { ...SMOKE_CHANNEL };
27
27
 
28
28
  const msg = input as {
29
- adapter?: string;
30
- target?: string;
29
+ conversation?: {
30
+ endpoint?: { id?: string; adapter?: string };
31
+ kind?: string;
32
+ id?: string;
33
+ };
31
34
  sender?: string;
32
35
  metadata?: Record<string, unknown>;
33
36
  };
34
37
  const meta = msg.metadata ?? {};
38
+ const conversation = msg.conversation;
35
39
  const channelType = String(
36
- meta.channelType ?? meta.type ?? meta.channel_type ?? 'private',
40
+ meta.channelType ?? meta.type ?? meta.channel_type ?? conversation?.kind ?? 'private',
37
41
  );
38
42
  const channelId = String(
39
- meta.channelId ?? meta.channel_id ?? msg.target ?? SMOKE_CHANNEL.channelId,
43
+ meta.channelId ?? meta.channel_id ?? conversation?.id ?? SMOKE_CHANNEL.channelId,
44
+ );
45
+ const endpointCapabilityId = typeof conversation?.endpoint?.id === 'string'
46
+ ? conversation.endpoint.id
47
+ : undefined;
48
+ const adapterName = String(
49
+ (endpointCapabilityId?.split('\0').pop() ?? endpointCapabilityId)?.split('~')[0]
50
+ ?? meta.adapter
51
+ ?? SMOKE_CHANNEL.adapterName,
40
52
  );
41
- const adapterName = String(msg.adapter ?? meta.adapter ?? SMOKE_CHANNEL.adapterName);
42
53
  const endpointId = String(
43
54
  meta.endpoint ?? meta.endpointId ?? meta.endpoint_id ?? adapterName,
44
55
  );