@luoyi-dsh/instagram-scroll 0.0.0-stage → 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.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * src/lib/hostdeps.ts —— 宿主依賴載入器
3
+ */
4
+ export declare function loadSchemastery(): Promise<any>;
5
+ //# sourceMappingURL=hostdeps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostdeps.d.ts","sourceRoot":"","sources":["../../src/lib/hostdeps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAsB,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,CAsBpD"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * src/lib/hostdeps.ts —— 宿主依賴載入器
3
+ */
4
+ export async function loadSchemastery() {
5
+ try {
6
+ // @ts-ignore
7
+ const mod = await import('schemastery');
8
+ return mod.default || mod;
9
+ }
10
+ catch { }
11
+ try {
12
+ // @ts-ignore
13
+ const mod = await import('@deepseek-ai/schemastery');
14
+ return mod.default || mod;
15
+ }
16
+ catch { }
17
+ const fallback = (schema) => ({
18
+ description: () => fallback(schema),
19
+ default: () => fallback(schema),
20
+ });
21
+ fallback.object = () => fallback({});
22
+ fallback.string = () => fallback({});
23
+ fallback.number = () => fallback({});
24
+ fallback.boolean = () => fallback({});
25
+ fallback.array = () => fallback({});
26
+ return fallback;
27
+ }
28
+ //# sourceMappingURL=hostdeps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostdeps.js","sourceRoot":"","sources":["../../src/lib/hostdeps.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,aAAa;QACb,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;QACvC,OAAO,GAAG,CAAC,OAAO,IAAI,GAAG,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,IAAI,CAAC;QACH,aAAa;QACb,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;QACpD,OAAO,GAAG,CAAC,OAAO,IAAI,GAAG,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,QAAQ,GAAQ,CAAC,MAAW,EAAE,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;KAChC,CAAC,CAAA;IACF,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpC,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpC,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpC,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACrC,QAAQ,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACnC,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * src/lib/ledger.ts —— 滾動紀錄、推坑去重與日報帳本
3
+ * ============================================================================
4
+ * 職責:
5
+ * 1. 記錄已滾動瀏覽過的貼文 (seenPosts),避免重複審閱與重複推坑。
6
+ * 2. 記錄今日替主人推薦的次數,嚴格遵循每日上限,防止 IG 頻率過高。
7
+ * 3. 輸出 Markdown 日報至 data/reports/YYYY-MM-DD.md。
8
+ * ============================================================================
9
+ */
10
+ export interface RecommendedItem {
11
+ postPk: string;
12
+ code: string;
13
+ author: string;
14
+ url: string;
15
+ score: number;
16
+ reason: string;
17
+ commentText: string;
18
+ timestamp: string;
19
+ }
20
+ export interface ScrollLedgerState {
21
+ version: number;
22
+ date: string;
23
+ seenPosts: Record<string, {
24
+ timestamp: string;
25
+ worthy?: boolean;
26
+ }>;
27
+ recommendedToday: RecommendedItem[];
28
+ dailyStats: {
29
+ scrolledCount: number;
30
+ recommendedCount: number;
31
+ };
32
+ }
33
+ export declare class ScrollLedgerManager {
34
+ private filePath;
35
+ private reportsDir;
36
+ private state;
37
+ constructor(filePath: string, reportsDir: string);
38
+ private getTodayStr;
39
+ private load;
40
+ save(): void;
41
+ private checkRollover;
42
+ hasSeen(postPk: string): boolean;
43
+ markSeen(postPk: string, worthy?: boolean): void;
44
+ canRecommend(cap: number): boolean;
45
+ recordRecommendation(item: RecommendedItem): void;
46
+ getDailyStats(): {
47
+ recommendedItems: RecommendedItem[];
48
+ scrolledCount: number;
49
+ recommendedCount: number;
50
+ date: string;
51
+ };
52
+ private appendReport;
53
+ getTodayReport(): string;
54
+ }
55
+ //# sourceMappingURL=ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/lib/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAClE,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,gBAAgB,EAAE,MAAM,CAAA;KACzB,CAAA;CACF;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,KAAK,CAAmB;gBAEpB,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAehD,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,IAAI;IAyBL,IAAI,IAAI,IAAI;IAQnB,OAAO,CAAC,aAAa;IAUd,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,IAAI;IAUvD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAMlC,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IASjD,aAAa;;uBArGH,MAAM;0BACH,MAAM;;;IA6G1B,OAAO,CAAC,YAAY;IAqBb,cAAc,IAAI,MAAM;CAShC"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * src/lib/ledger.ts —— 滾動紀錄、推坑去重與日報帳本
3
+ * ============================================================================
4
+ * 職責:
5
+ * 1. 記錄已滾動瀏覽過的貼文 (seenPosts),避免重複審閱與重複推坑。
6
+ * 2. 記錄今日替主人推薦的次數,嚴格遵循每日上限,防止 IG 頻率過高。
7
+ * 3. 輸出 Markdown 日報至 data/reports/YYYY-MM-DD.md。
8
+ * ============================================================================
9
+ */
10
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
11
+ import { dirname, join } from 'node:path';
12
+ export class ScrollLedgerManager {
13
+ filePath;
14
+ reportsDir;
15
+ state;
16
+ constructor(filePath, reportsDir) {
17
+ this.filePath = filePath;
18
+ this.reportsDir = reportsDir;
19
+ if (!existsSync(dirname(filePath))) {
20
+ mkdirSync(dirname(filePath), { recursive: true });
21
+ }
22
+ if (!existsSync(reportsDir)) {
23
+ mkdirSync(reportsDir, { recursive: true });
24
+ }
25
+ this.state = this.load();
26
+ if (!existsSync(this.filePath)) {
27
+ this.save();
28
+ }
29
+ }
30
+ getTodayStr() {
31
+ return new Date().toISOString().slice(0, 10);
32
+ }
33
+ load() {
34
+ const today = this.getTodayStr();
35
+ try {
36
+ if (existsSync(this.filePath)) {
37
+ const raw = readFileSync(this.filePath, 'utf-8');
38
+ const data = JSON.parse(raw);
39
+ if (data.date !== today) {
40
+ // 隔日重設每日統計
41
+ data.date = today;
42
+ data.recommendedToday = [];
43
+ data.dailyStats = { scrolledCount: 0, recommendedCount: 0 };
44
+ }
45
+ return data;
46
+ }
47
+ }
48
+ catch { }
49
+ return {
50
+ version: 1,
51
+ date: today,
52
+ seenPosts: {},
53
+ recommendedToday: [],
54
+ dailyStats: { scrolledCount: 0, recommendedCount: 0 },
55
+ };
56
+ }
57
+ save() {
58
+ try {
59
+ writeFileSync(this.filePath, JSON.stringify(this.state, null, 2), 'utf-8');
60
+ }
61
+ catch (e) {
62
+ console.error(`[ScrollLedger] 保存失敗: ${e.message}`);
63
+ }
64
+ }
65
+ checkRollover() {
66
+ const today = this.getTodayStr();
67
+ if (this.state.date !== today) {
68
+ this.state.date = today;
69
+ this.state.recommendedToday = [];
70
+ this.state.dailyStats = { scrolledCount: 0, recommendedCount: 0 };
71
+ this.save();
72
+ }
73
+ }
74
+ hasSeen(postPk) {
75
+ return Boolean(this.state.seenPosts[postPk]);
76
+ }
77
+ markSeen(postPk, worthy = false) {
78
+ this.checkRollover();
79
+ this.state.seenPosts[postPk] = {
80
+ timestamp: new Date().toISOString(),
81
+ worthy,
82
+ };
83
+ this.state.dailyStats.scrolledCount = (this.state.dailyStats.scrolledCount || 0) + 1;
84
+ this.save();
85
+ }
86
+ canRecommend(cap) {
87
+ this.checkRollover();
88
+ if (cap <= 0)
89
+ return true;
90
+ return (this.state.dailyStats.recommendedCount || 0) < cap;
91
+ }
92
+ recordRecommendation(item) {
93
+ this.checkRollover();
94
+ this.state.recommendedToday.unshift(item);
95
+ this.state.dailyStats.recommendedCount = (this.state.dailyStats.recommendedCount || 0) + 1;
96
+ this.markSeen(item.postPk, true);
97
+ this.save();
98
+ this.appendReport(item);
99
+ }
100
+ getDailyStats() {
101
+ this.checkRollover();
102
+ return {
103
+ date: this.state.date,
104
+ ...this.state.dailyStats,
105
+ recommendedItems: this.state.recommendedToday,
106
+ };
107
+ }
108
+ appendReport(item) {
109
+ const reportPath = join(this.reportsDir, `${this.state.date}.md`);
110
+ const line = `### [${item.author}](${item.url}) (評分: ${item.score}/100)
111
+ - **推薦原因**:${item.reason}
112
+ - **@主人留言**:\`${item.commentText}\`
113
+ - **時間**:${item.timestamp}
114
+
115
+ ---
116
+ `;
117
+ try {
118
+ let content = '';
119
+ if (!existsSync(reportPath)) {
120
+ content = `# Instagram 探索日報 | ${this.state.date}\n> 這是今天替主人在 Instagram 挑選出的值得關注貼文與影片。\n\n`;
121
+ }
122
+ content += line;
123
+ writeFileSync(reportPath, content, { flag: 'a', encoding: 'utf-8' });
124
+ }
125
+ catch (e) {
126
+ console.error(`[ScrollLedger] 寫入日報失敗: ${e.message}`);
127
+ }
128
+ }
129
+ getTodayReport() {
130
+ const reportPath = join(this.reportsDir, `${this.getTodayStr()}.md`);
131
+ try {
132
+ if (existsSync(reportPath)) {
133
+ return readFileSync(reportPath, 'utf-8');
134
+ }
135
+ }
136
+ catch { }
137
+ return `今日 (${this.getTodayStr()}) 尚未產生推坑貼文。`;
138
+ }
139
+ }
140
+ //# sourceMappingURL=ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/lib/ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * src/tools/scrollTools.ts —— 註冊給 DSH 主模型的 Instagram 滾動瀏覽專用工具
3
+ */
4
+ import type { InstagramMcpClient } from '@luoyi-dsh/instagram-mcp';
5
+ import { InstagramScrollConfig } from '../config.js';
6
+ export declare function registerScrollTools(ctx: any, config: InstagramScrollConfig, getMcpClient: () => InstagramMcpClient | null, log: (msg: string) => void): void;
7
+ //# sourceMappingURL=scrollTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollTools.d.ts","sourceRoot":"","sources":["../../src/tools/scrollTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,qBAAqB,EAC7B,YAAY,EAAE,MAAM,kBAAkB,GAAG,IAAI,EAC7C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,QAiF3B"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * src/tools/scrollTools.ts —— 註冊給 DSH 主模型的 Instagram 滾動瀏覽專用工具
3
+ */
4
+ export function registerScrollTools(ctx, config, getMcpClient, log) {
5
+ const tools = (typeof ctx.get === 'function' ? ctx.get('tools') : undefined) || ctx.tools;
6
+ const register = (toolDef) => {
7
+ try {
8
+ if (typeof tools?.register === 'function') {
9
+ tools.register(toolDef);
10
+ }
11
+ else if (typeof ctx?.tool === 'function') {
12
+ ctx.tool(toolDef);
13
+ }
14
+ }
15
+ catch (e) {
16
+ log(`註冊滾動工具 ${toolDef.name} 失敗: ${e.message}`);
17
+ }
18
+ };
19
+ // 1. 滾動獲取動態牆 (Timeline Feed)
20
+ register({
21
+ name: 'ig_scroll_feed',
22
+ description: '滾動讀取 Instagram 時間軸最新動態貼文,包含作者、讚數、短碼、內文摘要等。',
23
+ parameters: {
24
+ type: 'object',
25
+ properties: {
26
+ limit: {
27
+ type: 'number',
28
+ description: '抓取貼文數量上限 (預設 15,最大 50)',
29
+ },
30
+ },
31
+ },
32
+ execute: async (args) => {
33
+ const client = getMcpClient();
34
+ if (!client || !client.ready) {
35
+ return { ok: false, error: 'Instagram FastMCP 尚未就緒,請檢查連線狀態。' };
36
+ }
37
+ const count = Math.min(50, Math.max(1, args.limit || config.batchSize || 15));
38
+ return await client.igGetTimelineFeed(count);
39
+ },
40
+ });
41
+ // 2. 滾動特定主題或探索貼文
42
+ register({
43
+ name: 'ig_explore_topics',
44
+ description: '依照指定主題或探索標籤滾動閱讀熱門貼文,探索新主題。',
45
+ parameters: {
46
+ type: 'object',
47
+ properties: {
48
+ tag: { type: 'string', description: '主題標籤名稱 (如 ai, tech, art)' },
49
+ limit: { type: 'number', description: '獲取數量上限 (預設 15)' },
50
+ },
51
+ required: ['tag'],
52
+ },
53
+ execute: async (args) => {
54
+ const client = getMcpClient();
55
+ if (!client || !client.ready) {
56
+ return { ok: false, error: 'Instagram FastMCP 尚未就緒' };
57
+ }
58
+ return await client.igSearchHashtag(args.tag, args.limit || 15);
59
+ },
60
+ });
61
+ // 3. 滾動時即時點讚
62
+ register({
63
+ name: 'ig_like_feed_post',
64
+ description: '在滾動瀏覽過程中對感興趣的 Instagram 貼文按讚。',
65
+ parameters: {
66
+ type: 'object',
67
+ properties: {
68
+ media_pk: { type: 'string', description: '貼文唯一識別碼 (Media PK)' },
69
+ },
70
+ required: ['media_pk'],
71
+ },
72
+ execute: async (args) => {
73
+ const client = getMcpClient();
74
+ if (!client || !client.ready) {
75
+ return { ok: false, error: 'Instagram FastMCP 尚未就緒' };
76
+ }
77
+ return await client.igLikeMedia(args.media_pk);
78
+ },
79
+ });
80
+ log('✅ 已註冊 Instagram 滾動瀏覽 (Scroll) 工具套件至 DSH Tools!');
81
+ }
82
+ //# sourceMappingURL=scrollTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollTools.js","sourceRoot":"","sources":["../../src/tools/scrollTools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,66 @@
1
- {
2
- "name": "@luoyi-dsh/instagram-scroll",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
1
+ {
2
+ "name": "@luoyi-dsh/instagram-scroll",
3
+ "version": "1.0.1",
4
+ "description": "DeepSeek Harness (DSH) Instagram 動態滾動瀏覽與探索插件:提供動態牆無限滾動、探索摘要與即時互動能力",
5
+ "keywords": [
6
+ "dsh",
7
+ "dsh-plugin",
8
+ "deepseek-harness",
9
+ "instagram",
10
+ "scroll",
11
+ "feed"
12
+ ],
13
+ "license": "MIT",
14
+ "type": "module",
15
+ "main": "dist/index.js",
16
+ "dsh": {
17
+ "bundle": {
18
+ "patch": "./cordis.patch.yml"
19
+ },
20
+ "client": {
21
+ "platform": "web",
22
+ "immediately": true,
23
+ "inject": [
24
+ "@deepseek-ai/dsh-client-ui-settings",
25
+ "@deepseek-ai/dsh-client-ui-settings-plugins"
26
+ ]
27
+ }
28
+ },
29
+ "exports": {
30
+ ".": "./dist/index.js",
31
+ "./client": "./client.js",
32
+ "./package.json": "./package.json"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "client.js",
37
+ "cordis.patch.yml",
38
+ "!**/data/**"
39
+ ],
40
+ "scripts": {
41
+ "build": "node ../dsh-instagram-plugin/node_modules/typescript/bin/tsc",
42
+ "watch": "node ../dsh-instagram-plugin/node_modules/typescript/bin/tsc -w"
43
+ },
44
+ "dependencies": {
45
+ "@deepseek-ai/schemastery": "^3.18.5",
46
+ "dotenv": "^16.4.7",
47
+ "@luoyi-dsh/instagram-mcp": "^1.0.0"
48
+ },
49
+ "peerDependencies": {
50
+ "@deepseek-ai/dsh-tools": "*",
51
+ "cordis": "*"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "^22.10.2",
55
+ "typescript": "^5.7.2"
56
+ },
57
+ "author": {
58
+ "name": "Raxytw",
59
+ "url": "https://github.com/Raxytw"
60
+ },
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "git+https://github.com/Raxytw/dsh-instagram-scroll.git"
64
+ },
65
+ "private": false
6
66
  }