ethan-skill 1.14.0 → 1.15.0

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,54 @@
1
+ /**
2
+ * Ethan Extension System
3
+ * 提供事件钩子、Webhook、热加载和扩展 SDK
4
+ *
5
+ * 配置文件:.ethan/extensions.json
6
+ * 钩子文件:.ethan/hooks/*.ts|js
7
+ */
8
+ export interface EthanEvent {
9
+ type: EthanEventType;
10
+ skillId?: string;
11
+ pipelineId?: string;
12
+ agentId?: string;
13
+ payload?: Record<string, unknown>;
14
+ timestamp: string;
15
+ cwd: string;
16
+ }
17
+ export type EthanEventType = 'before:skill' | 'after:skill' | 'before:pipeline' | 'after:pipeline' | 'before:agent' | 'after:agent' | 'memory:save' | 'memory:search' | 'workflow:start' | 'workflow:done' | 'error';
18
+ export interface EthanHook {
19
+ event: EthanEventType | EthanEventType[];
20
+ handler: (event: EthanEvent) => void | Promise<void>;
21
+ name?: string;
22
+ }
23
+ export interface WebhookConfig {
24
+ url: string;
25
+ events: EthanEventType[];
26
+ headers?: Record<string, string>;
27
+ secret?: string;
28
+ enabled: boolean;
29
+ }
30
+ export interface ExtensionsConfig {
31
+ version: 1;
32
+ hooks: Array<{
33
+ file: string;
34
+ enabled: boolean;
35
+ }>;
36
+ webhooks: WebhookConfig[];
37
+ hotReload?: boolean;
38
+ }
39
+ export declare const EthanExtension: {
40
+ /** 注册事件钩子 */
41
+ on(event: EthanEventType | EthanEventType[], handler: EthanHook["handler"], name?: string): void;
42
+ /** 取消注册钩子 */
43
+ off(name: string): void;
44
+ /** 获取所有已注册钩子 */
45
+ listHooks(): EthanHook[];
46
+ };
47
+ export declare function emit(event: EthanEvent): Promise<void>;
48
+ /** 从 .ethan/hooks/ 目录加载 JS 钩子文件 */
49
+ export declare function loadHookFiles(cwd: string): Promise<void>;
50
+ export declare function readExtensionsConfig(cwd: string): ExtensionsConfig;
51
+ export declare function writeExtensionsConfig(config: ExtensionsConfig, cwd: string): void;
52
+ /** 生成示例钩子文件 */
53
+ export declare function generateHookTemplate(cwd: string, name: string): string;
54
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extension/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,aAAa,GACb,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,aAAa,GACb,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,OAAO,CAAC;AAEZ,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,cAAc,GAAG,cAAc,EAAE,CAAC;IACzC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACjD,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAKD,eAAO,MAAM,cAAc;IACzB,aAAa;cACH,cAAc,GAAG,cAAc,EAAE,WAAW,SAAS,CAAC,SAAS,CAAC,SAAS,MAAM;IAIzF,aAAa;cACH,MAAM;IAKhB,gBAAgB;iBACH,SAAS,EAAE;CAGzB,CAAC;AAGF,wBAAsB,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB3D;AAGD,mCAAmC;AACnC,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9D;AA0CD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAUlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAQjF;AAED,eAAe;AACf,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA0BtE"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ /**
3
+ * Ethan Extension System
4
+ * 提供事件钩子、Webhook、热加载和扩展 SDK
5
+ *
6
+ * 配置文件:.ethan/extensions.json
7
+ * 钩子文件:.ethan/hooks/*.ts|js
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.EthanExtension = void 0;
44
+ exports.emit = emit;
45
+ exports.loadHookFiles = loadHookFiles;
46
+ exports.readExtensionsConfig = readExtensionsConfig;
47
+ exports.writeExtensionsConfig = writeExtensionsConfig;
48
+ exports.generateHookTemplate = generateHookTemplate;
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ // ─── 全局钩子注册表 ───────────────────────────────────────────────────────────
52
+ const _hooks = [];
53
+ exports.EthanExtension = {
54
+ /** 注册事件钩子 */
55
+ on(event, handler, name) {
56
+ _hooks.push({ event, handler, name });
57
+ },
58
+ /** 取消注册钩子 */
59
+ off(name) {
60
+ const idx = _hooks.findIndex((h) => h.name === name);
61
+ if (idx > -1)
62
+ _hooks.splice(idx, 1);
63
+ },
64
+ /** 获取所有已注册钩子 */
65
+ listHooks() {
66
+ return [..._hooks];
67
+ },
68
+ };
69
+ // ─── 事件触发器 ───────────────────────────────────────────────────────────────
70
+ async function emit(event) {
71
+ // 1. 内存钩子
72
+ for (const hook of _hooks) {
73
+ const events = Array.isArray(hook.event) ? hook.event : [hook.event];
74
+ if (events.includes(event.type)) {
75
+ try {
76
+ await hook.handler(event);
77
+ }
78
+ catch (e) {
79
+ // 钩子错误不阻断主流程
80
+ console.error(`[ethan:hook] Error in hook "${hook.name ?? 'anonymous'}":`, e);
81
+ }
82
+ }
83
+ }
84
+ // 2. Webhook 推送(异步,不阻断)
85
+ const webhooks = loadWebhooks(event.cwd);
86
+ for (const wh of webhooks.filter((w) => w.enabled && w.events.includes(event.type))) {
87
+ sendWebhook(wh, event).catch(() => {
88
+ // Webhook 失败不影响主流程
89
+ });
90
+ }
91
+ }
92
+ // ─── 外部钩子文件加载 ─────────────────────────────────────────────────────────
93
+ /** 从 .ethan/hooks/ 目录加载 JS 钩子文件 */
94
+ async function loadHookFiles(cwd) {
95
+ const hooksDir = path.join(cwd, '.ethan', 'hooks');
96
+ if (!fs.existsSync(hooksDir))
97
+ return;
98
+ const files = fs.readdirSync(hooksDir).filter((f) => /\.(js|mjs|cjs)$/.test(f));
99
+ for (const file of files) {
100
+ try {
101
+ const mod = await Promise.resolve(`${path.join(hooksDir, file)}`).then(s => __importStar(require(s)));
102
+ if (typeof mod.default === 'function') {
103
+ mod.default(exports.EthanExtension);
104
+ }
105
+ else if (typeof mod.register === 'function') {
106
+ mod.register(exports.EthanExtension);
107
+ }
108
+ }
109
+ catch (e) {
110
+ console.error(`[ethan:hooks] Failed to load ${file}:`, e);
111
+ }
112
+ }
113
+ }
114
+ // ─── Webhook ─────────────────────────────────────────────────────────────────
115
+ function loadWebhooks(cwd) {
116
+ const configFile = path.join(cwd, '.ethan', 'extensions.json');
117
+ if (!fs.existsSync(configFile))
118
+ return [];
119
+ try {
120
+ const cfg = JSON.parse(fs.readFileSync(configFile, 'utf-8'));
121
+ return cfg.webhooks ?? [];
122
+ }
123
+ catch {
124
+ return [];
125
+ }
126
+ }
127
+ async function sendWebhook(wh, event) {
128
+ const body = JSON.stringify({ event });
129
+ const headers = {
130
+ 'Content-Type': 'application/json',
131
+ 'User-Agent': 'Ethan-Extension/1.0',
132
+ ...(wh.headers ?? {}),
133
+ };
134
+ // 签名(HMAC-SHA256,使用 secret 时)
135
+ if (wh.secret) {
136
+ const { createHmac } = await Promise.resolve().then(() => __importStar(require('crypto')));
137
+ const sig = createHmac('sha256', wh.secret).update(body).digest('hex');
138
+ headers['X-Ethan-Signature'] = `sha256=${sig}`;
139
+ }
140
+ // 使用 Node.js 内置 fetch(Node 18+)
141
+ const fetchFn = globalThis.fetch ?? (await Promise.resolve().then(() => __importStar(require('node:http'))).then(() => null));
142
+ if (!fetchFn)
143
+ return;
144
+ await globalThis.fetch(wh.url, {
145
+ method: 'POST',
146
+ headers,
147
+ body,
148
+ signal: AbortSignal.timeout(5000),
149
+ });
150
+ }
151
+ // ─── 扩展配置 CLI 辅助 ────────────────────────────────────────────────────────
152
+ function readExtensionsConfig(cwd) {
153
+ const file = path.join(cwd, '.ethan', 'extensions.json');
154
+ if (!fs.existsSync(file)) {
155
+ return { version: 1, hooks: [], webhooks: [] };
156
+ }
157
+ try {
158
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
159
+ }
160
+ catch {
161
+ return { version: 1, hooks: [], webhooks: [] };
162
+ }
163
+ }
164
+ function writeExtensionsConfig(config, cwd) {
165
+ const dir = path.join(cwd, '.ethan');
166
+ if (!fs.existsSync(dir))
167
+ fs.mkdirSync(dir, { recursive: true });
168
+ fs.writeFileSync(path.join(dir, 'extensions.json'), JSON.stringify(config, null, 2), 'utf-8');
169
+ }
170
+ /** 生成示例钩子文件 */
171
+ function generateHookTemplate(cwd, name) {
172
+ const hooksDir = path.join(cwd, '.ethan', 'hooks');
173
+ if (!fs.existsSync(hooksDir))
174
+ fs.mkdirSync(hooksDir, { recursive: true });
175
+ const file = path.join(hooksDir, `${name}.js`);
176
+ const template = `/**
177
+ * Ethan Extension Hook: ${name}
178
+ * 在此注册事件钩子,响应 Ethan 工作流事件
179
+ */
180
+
181
+ /** @param {import('smart-flow-skill/extension').EthanExtensionAPI} ethan */
182
+ export function register(ethan) {
183
+ // 在 Skill 执行后触发
184
+ ethan.on('after:skill', (event) => {
185
+ console.log('[hook:${name}] Skill 执行完成:', event.skillId);
186
+ // 可以在这里发送通知、记录日志、触发外部服务等
187
+ });
188
+
189
+ // 在工作流结束后触发
190
+ ethan.on('workflow:done', (event) => {
191
+ console.log('[hook:${name}] 工作流完成:', event.pipelineId);
192
+ });
193
+ }
194
+ `;
195
+ fs.writeFileSync(file, template, 'utf-8');
196
+ return file;
197
+ }
198
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extension/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Ethan Memory System — Core Module
3
+ * 提供持久化记忆存储、全文检索、标签索引和知识图谱能力
4
+ *
5
+ * 存储结构:
6
+ * ~/.ethan-memory/ 全局记忆库
7
+ * .ethan/memory/ 项目级记忆库
8
+ * .ethan/memory/index.json 快速检索索引(自动维护)
9
+ */
10
+ import type { MemoryEntry, MemoryIndex, SearchResult, MemoryStats } from './types';
11
+ export * from './types';
12
+ export declare const GLOBAL_MEMORY_DIR: string;
13
+ export declare function getMemoryDir(global: boolean, cwd?: string): string;
14
+ export declare function loadAllEntries(dir: string): MemoryEntry[];
15
+ export declare function saveEntry(entry: MemoryEntry, dir: string): void;
16
+ export declare function removeEntry(id: string, dir: string): boolean;
17
+ export declare function getEntry(id: string, dir: string): MemoryEntry | null;
18
+ export declare function loadIndex(dir: string): MemoryIndex | null;
19
+ /** 从当前目录所有记忆条目重建索引(增量维护代价高,直接全量重建) */
20
+ export declare function rebuildIndex(dir: string): MemoryIndex;
21
+ /**
22
+ * 全文检索:对 title、content、summary、tags 加权匹配
23
+ * 支持多词(所有词都命中得分最高)
24
+ */
25
+ export declare function searchMemory(query: string, dir: string, opts?: {
26
+ type?: MemoryEntry['type'];
27
+ tags?: string[];
28
+ project?: string;
29
+ limit?: number;
30
+ }): SearchResult[];
31
+ /** 生成短 ID(时间戳 + 随机) */
32
+ export declare function generateMemoryId(prefix?: string): string;
33
+ export declare function archiveWorkflowOutput(opts: {
34
+ skillId: string;
35
+ pipelineId: string;
36
+ summary: string;
37
+ content: string;
38
+ cwd: string;
39
+ rating?: number;
40
+ }): MemoryEntry;
41
+ export declare function getMemoryStats(dir: string): MemoryStats;
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEnF,cAAc,SAAS,CAAC;AAGxB,eAAO,MAAM,iBAAiB,QAA2C,CAAC;AAE1E,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAElE;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,EAAE,CAczD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAS/D;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQpE;AAKD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQzD;AAED,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAgDrD;AAGD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IACJ,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACX,GACL,YAAY,EAAE,CAwBhB;AAgED,uBAAuB;AACvB,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxD;AAGD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,WAAW,CAkBd;AAGD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAoBvD"}
@@ -0,0 +1,320 @@
1
+ "use strict";
2
+ /**
3
+ * Ethan Memory System — Core Module
4
+ * 提供持久化记忆存储、全文检索、标签索引和知识图谱能力
5
+ *
6
+ * 存储结构:
7
+ * ~/.ethan-memory/ 全局记忆库
8
+ * .ethan/memory/ 项目级记忆库
9
+ * .ethan/memory/index.json 快速检索索引(自动维护)
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
45
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.GLOBAL_MEMORY_DIR = void 0;
49
+ exports.getMemoryDir = getMemoryDir;
50
+ exports.loadAllEntries = loadAllEntries;
51
+ exports.saveEntry = saveEntry;
52
+ exports.removeEntry = removeEntry;
53
+ exports.getEntry = getEntry;
54
+ exports.loadIndex = loadIndex;
55
+ exports.rebuildIndex = rebuildIndex;
56
+ exports.searchMemory = searchMemory;
57
+ exports.generateMemoryId = generateMemoryId;
58
+ exports.archiveWorkflowOutput = archiveWorkflowOutput;
59
+ exports.getMemoryStats = getMemoryStats;
60
+ const fs = __importStar(require("fs"));
61
+ const path = __importStar(require("path"));
62
+ const os = __importStar(require("os"));
63
+ __exportStar(require("./types"), exports);
64
+ // ─── 存储路径 ─────────────────────────────────────────────────────────────────
65
+ exports.GLOBAL_MEMORY_DIR = path.join(os.homedir(), '.ethan-memory');
66
+ function getMemoryDir(global, cwd) {
67
+ return global ? exports.GLOBAL_MEMORY_DIR : path.join(cwd ?? process.cwd(), '.ethan', 'memory');
68
+ }
69
+ // ─── 文件 I/O ─────────────────────────────────────────────────────────────────
70
+ function loadAllEntries(dir) {
71
+ if (!fs.existsSync(dir))
72
+ return [];
73
+ return fs
74
+ .readdirSync(dir)
75
+ .filter((f) => f.endsWith('.json') && f !== 'index.json')
76
+ .map((f) => {
77
+ try {
78
+ return JSON.parse(fs.readFileSync(path.join(dir, f), 'utf-8'));
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ })
84
+ .filter((e) => e !== null)
85
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
86
+ }
87
+ function saveEntry(entry, dir) {
88
+ if (!fs.existsSync(dir))
89
+ fs.mkdirSync(dir, { recursive: true });
90
+ fs.writeFileSync(path.join(dir, `${entry.id}.json`), JSON.stringify(entry, null, 2), 'utf-8');
91
+ // 保存后自动重建索引
92
+ rebuildIndex(dir);
93
+ }
94
+ function removeEntry(id, dir) {
95
+ const file = path.join(dir, `${id}.json`);
96
+ if (!fs.existsSync(file))
97
+ return false;
98
+ fs.unlinkSync(file);
99
+ rebuildIndex(dir);
100
+ return true;
101
+ }
102
+ function getEntry(id, dir) {
103
+ const file = path.join(dir, `${id}.json`);
104
+ if (!fs.existsSync(file))
105
+ return null;
106
+ try {
107
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ // ─── 索引管理 ─────────────────────────────────────────────────────────────────
114
+ const INDEX_FILE = 'index.json';
115
+ function loadIndex(dir) {
116
+ const file = path.join(dir, INDEX_FILE);
117
+ if (!fs.existsSync(file))
118
+ return null;
119
+ try {
120
+ return JSON.parse(fs.readFileSync(file, 'utf-8'));
121
+ }
122
+ catch {
123
+ return null;
124
+ }
125
+ }
126
+ /** 从当前目录所有记忆条目重建索引(增量维护代价高,直接全量重建) */
127
+ function rebuildIndex(dir) {
128
+ var _a, _b, _c, _d, _e;
129
+ const entries = loadAllEntries(dir);
130
+ const index = {
131
+ version: 2,
132
+ updatedAt: new Date().toISOString(),
133
+ totalCount: entries.length,
134
+ invertedIndex: {},
135
+ tagIndex: {},
136
+ typeIndex: { workflow: [], skill: [], manual: [], decision: [], knowledge: [] },
137
+ projectIndex: {},
138
+ skillIndex: {},
139
+ };
140
+ for (const entry of entries) {
141
+ // 类型索引
142
+ if (index.typeIndex[entry.type]) {
143
+ index.typeIndex[entry.type].push(entry.id);
144
+ }
145
+ // 标签索引
146
+ for (const tag of entry.tags) {
147
+ ((_a = index.tagIndex)[tag] ?? (_a[tag] = [])).push(entry.id);
148
+ }
149
+ // 项目索引
150
+ if (entry.project) {
151
+ ((_b = index.projectIndex)[_c = entry.project] ?? (_b[_c] = [])).push(entry.id);
152
+ }
153
+ // Skill 索引
154
+ if (entry.skillId) {
155
+ ((_d = index.skillIndex)[_e = entry.skillId] ?? (_d[_e] = [])).push(entry.id);
156
+ }
157
+ // 倒排索引:对 title + summary + tags 分词
158
+ const text = `${entry.title} ${entry.summary ?? ''} ${entry.tags.join(' ')}`;
159
+ for (const token of tokenize(text)) {
160
+ if (!index.invertedIndex[token]) {
161
+ index.invertedIndex[token] = [entry.id];
162
+ }
163
+ else if (!index.invertedIndex[token].includes(entry.id)) {
164
+ index.invertedIndex[token].push(entry.id);
165
+ }
166
+ }
167
+ }
168
+ if (!fs.existsSync(dir))
169
+ fs.mkdirSync(dir, { recursive: true });
170
+ fs.writeFileSync(path.join(dir, INDEX_FILE), JSON.stringify(index, null, 2), 'utf-8');
171
+ return index;
172
+ }
173
+ // ─── 检索 ─────────────────────────────────────────────────────────────────────
174
+ /**
175
+ * 全文检索:对 title、content、summary、tags 加权匹配
176
+ * 支持多词(所有词都命中得分最高)
177
+ */
178
+ function searchMemory(query, dir, opts = {}) {
179
+ const entries = loadAllEntries(dir);
180
+ if (!entries.length)
181
+ return [];
182
+ const queryTokens = tokenize(query.toLowerCase());
183
+ const results = [];
184
+ for (const entry of entries) {
185
+ // 类型过滤
186
+ if (opts.type && entry.type !== opts.type)
187
+ continue;
188
+ // 标签过滤(AND 语义)
189
+ if (opts.tags?.length && !opts.tags.every((t) => entry.tags.includes(t)))
190
+ continue;
191
+ // 项目过滤
192
+ if (opts.project && entry.project !== opts.project)
193
+ continue;
194
+ const { score, matchedFields, snippet } = scoreEntry(entry, queryTokens, query);
195
+ if (score > 0) {
196
+ results.push({ entry, score, matchedFields, snippet });
197
+ }
198
+ }
199
+ // 按分数降序,再按时间降序
200
+ results.sort((a, b) => b.score - a.score || new Date(b.entry.createdAt).getTime() - new Date(a.entry.createdAt).getTime());
201
+ return results.slice(0, opts.limit ?? 20);
202
+ }
203
+ function scoreEntry(entry, queryTokens, rawQuery) {
204
+ let score = 0;
205
+ const matchedFields = [];
206
+ const titleLower = entry.title.toLowerCase();
207
+ const contentLower = entry.content.toLowerCase();
208
+ const summaryLower = (entry.summary ?? '').toLowerCase();
209
+ const tagsLower = entry.tags.map((t) => t.toLowerCase()).join(' ');
210
+ const rawLower = rawQuery.toLowerCase();
211
+ // 精确短语匹配(最高权重)
212
+ if (titleLower.includes(rawLower)) {
213
+ score += 100;
214
+ matchedFields.push('title');
215
+ }
216
+ if (summaryLower.includes(rawLower)) {
217
+ score += 60;
218
+ matchedFields.push('summary');
219
+ }
220
+ if (contentLower.includes(rawLower)) {
221
+ score += 30;
222
+ matchedFields.push('content');
223
+ }
224
+ if (tagsLower.includes(rawLower)) {
225
+ score += 50;
226
+ matchedFields.push('tags');
227
+ }
228
+ // 分词匹配
229
+ for (const token of queryTokens) {
230
+ if (titleLower.includes(token))
231
+ score += 20;
232
+ if (summaryLower.includes(token))
233
+ score += 10;
234
+ if (contentLower.includes(token))
235
+ score += 5;
236
+ if (tagsLower.includes(token))
237
+ score += 15;
238
+ }
239
+ // 重要度加权
240
+ if (entry.rating)
241
+ score += entry.rating * 5;
242
+ // 生成摘要片段(显示匹配上下文)
243
+ let snippet = entry.summary ?? entry.content.slice(0, 120);
244
+ const idx = contentLower.indexOf(rawLower);
245
+ if (idx > -1) {
246
+ const start = Math.max(0, idx - 40);
247
+ const end = Math.min(entry.content.length, idx + rawLower.length + 80);
248
+ snippet = (start > 0 ? '...' : '') + entry.content.slice(start, end) + (end < entry.content.length ? '...' : '');
249
+ }
250
+ return { score, matchedFields: [...new Set(matchedFields)], snippet };
251
+ }
252
+ // ─── 工具函数 ─────────────────────────────────────────────────────────────────
253
+ /** 简单中英文分词(空格 + CJK 字符级别) */
254
+ function tokenize(text) {
255
+ const tokens = new Set();
256
+ // 英文分词(按空格和标点)
257
+ for (const word of text.split(/[\s\-_.,!?,。!?\\/()()\[\]]+/)) {
258
+ if (word.length >= 2)
259
+ tokens.add(word.toLowerCase());
260
+ }
261
+ // CJK 字符:每个字单独作为 token,也提取 2-gram
262
+ const cjk = text.match(/[\u4e00-\u9fff\u3040-\u309f\u30a0-\u30ff]+/g) ?? [];
263
+ for (const seg of cjk) {
264
+ for (let i = 0; i < seg.length; i++) {
265
+ tokens.add(seg[i]);
266
+ if (i + 1 < seg.length)
267
+ tokens.add(seg.slice(i, i + 2));
268
+ }
269
+ }
270
+ return [...tokens].filter((t) => t.length >= 1);
271
+ }
272
+ /** 生成短 ID(时间戳 + 随机) */
273
+ function generateMemoryId(prefix) {
274
+ const ts = Date.now().toString(36);
275
+ const rand = Math.random().toString(36).slice(2, 6);
276
+ return prefix ? `${prefix}-${ts}-${rand}` : `${ts}-${rand}`;
277
+ }
278
+ // ─── 归档工作流产出 ───────────────────────────────────────────────────────────
279
+ function archiveWorkflowOutput(opts) {
280
+ const { skillId, pipelineId, summary, content, cwd, rating } = opts;
281
+ const entry = {
282
+ id: generateMemoryId(skillId),
283
+ type: 'workflow',
284
+ skillId,
285
+ pipelineId,
286
+ title: `[${pipelineId}] ${skillId} — ${summary.slice(0, 60)}`,
287
+ content,
288
+ summary: summary.slice(0, 200),
289
+ tags: [skillId, pipelineId, path.basename(cwd)],
290
+ project: path.basename(cwd),
291
+ createdAt: new Date().toISOString(),
292
+ source: 'workflow',
293
+ ...(rating !== undefined ? { rating } : {}),
294
+ };
295
+ saveEntry(entry, getMemoryDir(false, cwd));
296
+ return entry;
297
+ }
298
+ // ─── 统计 ─────────────────────────────────────────────────────────────────────
299
+ function getMemoryStats(dir) {
300
+ const entries = loadAllEntries(dir);
301
+ const byType = {};
302
+ const byProject = {};
303
+ const tagCount = {};
304
+ let recentActivity = '';
305
+ for (const e of entries) {
306
+ byType[e.type] = (byType[e.type] ?? 0) + 1;
307
+ if (e.project)
308
+ byProject[e.project] = (byProject[e.project] ?? 0) + 1;
309
+ for (const t of e.tags)
310
+ tagCount[t] = (tagCount[t] ?? 0) + 1;
311
+ if (!recentActivity || e.createdAt > recentActivity)
312
+ recentActivity = e.createdAt;
313
+ }
314
+ const topTags = Object.entries(tagCount)
315
+ .sort((a, b) => b[1] - a[1])
316
+ .slice(0, 10)
317
+ .map(([tag, count]) => ({ tag, count }));
318
+ return { totalEntries: entries.length, byType, byProject, topTags, recentActivity };
319
+ }
320
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"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"}