@cicctencent/agent-core 0.1.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.
Files changed (134) hide show
  1. package/README.md +952 -0
  2. package/dist/agent/engine.d.ts +113 -0
  3. package/dist/agent/engine.d.ts.map +1 -0
  4. package/dist/agent/history-manager.d.ts +78 -0
  5. package/dist/agent/history-manager.d.ts.map +1 -0
  6. package/dist/agent/llm-caller.d.ts +58 -0
  7. package/dist/agent/llm-caller.d.ts.map +1 -0
  8. package/dist/agent/tool-executor.d.ts +95 -0
  9. package/dist/agent/tool-executor.d.ts.map +1 -0
  10. package/dist/agent/types.d.ts +128 -0
  11. package/dist/agent/types.d.ts.map +1 -0
  12. package/dist/agent/workflow.d.ts +74 -0
  13. package/dist/agent/workflow.d.ts.map +1 -0
  14. package/dist/context/collector.d.ts +12 -0
  15. package/dist/context/collector.d.ts.map +1 -0
  16. package/dist/context/manager.d.ts +16 -0
  17. package/dist/context/manager.d.ts.map +1 -0
  18. package/dist/context/types.d.ts +39 -0
  19. package/dist/context/types.d.ts.map +1 -0
  20. package/dist/hooks/types.d.ts +47 -0
  21. package/dist/hooks/types.d.ts.map +1 -0
  22. package/dist/index.d.ts +53 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/llm/anthropic-provider.d.ts +28 -0
  25. package/dist/llm/anthropic-provider.d.ts.map +1 -0
  26. package/dist/llm/factory.d.ts +19 -0
  27. package/dist/llm/factory.d.ts.map +1 -0
  28. package/dist/llm/ollama-provider.d.ts +13 -0
  29. package/dist/llm/ollama-provider.d.ts.map +1 -0
  30. package/dist/llm/openai-provider.d.ts +18 -0
  31. package/dist/llm/openai-provider.d.ts.map +1 -0
  32. package/dist/llm/provider.d.ts +7 -0
  33. package/dist/llm/provider.d.ts.map +1 -0
  34. package/dist/llm/types.d.ts +78 -0
  35. package/dist/llm/types.d.ts.map +1 -0
  36. package/dist/mcp/base-client.d.ts +50 -0
  37. package/dist/mcp/base-client.d.ts.map +1 -0
  38. package/dist/mcp/client.d.ts +27 -0
  39. package/dist/mcp/client.d.ts.map +1 -0
  40. package/dist/mcp/factory.d.ts +16 -0
  41. package/dist/mcp/factory.d.ts.map +1 -0
  42. package/dist/mcp/http-client.d.ts +24 -0
  43. package/dist/mcp/http-client.d.ts.map +1 -0
  44. package/dist/mcp/proxy-agent.d.ts +49 -0
  45. package/dist/mcp/proxy-agent.d.ts.map +1 -0
  46. package/dist/mcp/stdio-client.d.ts +16 -0
  47. package/dist/mcp/stdio-client.d.ts.map +1 -0
  48. package/dist/mcp/types.d.ts +60 -0
  49. package/dist/mcp/types.d.ts.map +1 -0
  50. package/dist/memory/checkpoint.d.ts +62 -0
  51. package/dist/memory/checkpoint.d.ts.map +1 -0
  52. package/dist/memory/extractor.d.ts +59 -0
  53. package/dist/memory/extractor.d.ts.map +1 -0
  54. package/dist/memory/persona.d.ts +38 -0
  55. package/dist/memory/persona.d.ts.map +1 -0
  56. package/dist/memory/pipeline.d.ts +50 -0
  57. package/dist/memory/pipeline.d.ts.map +1 -0
  58. package/dist/memory/prompts.d.ts +9 -0
  59. package/dist/memory/prompts.d.ts.map +1 -0
  60. package/dist/memory/recall.d.ts +66 -0
  61. package/dist/memory/recall.d.ts.map +1 -0
  62. package/dist/memory/scene.d.ts +49 -0
  63. package/dist/memory/scene.d.ts.map +1 -0
  64. package/dist/memory/types.d.ts +43 -0
  65. package/dist/memory/types.d.ts.map +1 -0
  66. package/dist/middleware/types.d.ts +52 -0
  67. package/dist/middleware/types.d.ts.map +1 -0
  68. package/dist/sandbox/types.d.ts +59 -0
  69. package/dist/sandbox/types.d.ts.map +1 -0
  70. package/dist/security/guard.d.ts +41 -0
  71. package/dist/security/guard.d.ts.map +1 -0
  72. package/dist/security/types.d.ts +36 -0
  73. package/dist/security/types.d.ts.map +1 -0
  74. package/dist/skill/manager.d.ts +95 -0
  75. package/dist/skill/manager.d.ts.map +1 -0
  76. package/dist/skill/router.d.ts +26 -0
  77. package/dist/skill/router.d.ts.map +1 -0
  78. package/dist/skill/types.d.ts +55 -0
  79. package/dist/skill/types.d.ts.map +1 -0
  80. package/dist/tool/delegate.d.ts +34 -0
  81. package/dist/tool/delegate.d.ts.map +1 -0
  82. package/dist/tool/registry.d.ts +24 -0
  83. package/dist/tool/registry.d.ts.map +1 -0
  84. package/dist/tool/types.d.ts +101 -0
  85. package/dist/tool/types.d.ts.map +1 -0
  86. package/dist/types.d.ts +150 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/utils/token-counter.d.ts +22 -0
  89. package/dist/utils/token-counter.d.ts.map +1 -0
  90. package/package.json +42 -0
  91. package/src/agent/engine.ts +875 -0
  92. package/src/agent/history-manager.ts +323 -0
  93. package/src/agent/llm-caller.ts +383 -0
  94. package/src/agent/tool-executor.ts +713 -0
  95. package/src/agent/types.ts +136 -0
  96. package/src/agent/workflow.ts +339 -0
  97. package/src/context/collector.ts +59 -0
  98. package/src/context/manager.ts +40 -0
  99. package/src/context/types.ts +51 -0
  100. package/src/hooks/types.ts +77 -0
  101. package/src/index.ts +178 -0
  102. package/src/llm/anthropic-provider.ts +412 -0
  103. package/src/llm/factory.ts +34 -0
  104. package/src/llm/ollama-provider.ts +39 -0
  105. package/src/llm/openai-provider.ts +200 -0
  106. package/src/llm/provider.ts +15 -0
  107. package/src/llm/types.ts +91 -0
  108. package/src/mcp/base-client.ts +159 -0
  109. package/src/mcp/client.ts +81 -0
  110. package/src/mcp/factory.ts +45 -0
  111. package/src/mcp/http-client.ts +149 -0
  112. package/src/mcp/proxy-agent.ts +227 -0
  113. package/src/mcp/stdio-client.ts +104 -0
  114. package/src/mcp/types.ts +65 -0
  115. package/src/memory/checkpoint.ts +146 -0
  116. package/src/memory/extractor.ts +164 -0
  117. package/src/memory/persona.ts +106 -0
  118. package/src/memory/pipeline.ts +192 -0
  119. package/src/memory/prompts.ts +73 -0
  120. package/src/memory/recall.ts +217 -0
  121. package/src/memory/scene.ts +137 -0
  122. package/src/memory/types.ts +54 -0
  123. package/src/middleware/types.ts +62 -0
  124. package/src/sandbox/types.ts +185 -0
  125. package/src/security/guard.ts +249 -0
  126. package/src/security/types.ts +46 -0
  127. package/src/skill/manager.ts +420 -0
  128. package/src/skill/router.ts +158 -0
  129. package/src/skill/types.ts +67 -0
  130. package/src/tool/delegate.ts +105 -0
  131. package/src/tool/registry.ts +64 -0
  132. package/src/tool/types.ts +124 -0
  133. package/src/types.ts +188 -0
  134. package/src/utils/token-counter.ts +108 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/mcp/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAI5D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,gBAAgB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAEvF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,YAAY,CAAC;IACxB,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,oBAAoB;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,qEAAqE;IACrE,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxF,eAAe;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,aAAa,CAAC,EAAE,OAAO,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE;;;;;OAKG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAID,MAAM,WAAW,SAAS;IACxB,gBAAgB;IAChB,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhD,eAAe;IACf,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAEvC,aAAa;IACb,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvE,qBAAqB;IACrB,aAAa,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAEtF,mBAAmB;IACnB,YAAY,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE5C,WAAW;IACX,UAAU,IAAI,IAAI,CAAC;IAEnB,WAAW;IACX,WAAW,IAAI,OAAO,CAAC;CACxB"}
@@ -0,0 +1,62 @@
1
+ /** 检查点数据 */
2
+ export interface CheckpointData {
3
+ /** 上次 L2 聚合时的 L1 条目总数 */
4
+ lastL1Count: number;
5
+ /** 上次 L3 生成时的 L2 条目总数 */
6
+ lastL2Count: number;
7
+ /** 最后执行时间(ISO 字符串) */
8
+ lastRunAt: string;
9
+ /** 累计执行次数 */
10
+ runCount: number;
11
+ }
12
+ /**
13
+ * 记忆管道检查点
14
+ *
15
+ * 用于管道调度器判断是否需要触发 L2/L3:
16
+ * - 当 L1 增量(当前 - lastL1Count)达到阈值时触发 L2
17
+ * - 当 L2 增量(当前 - lastL2Count)达到阈值时触发 L3
18
+ */
19
+ export declare class MemoryCheckpoint {
20
+ private filePath;
21
+ private data;
22
+ /**
23
+ * @param filePath 检查点文件路径,默认为 {cwd}/data/memories/checkpoint.json
24
+ */
25
+ constructor(filePath?: string);
26
+ /** 获取当前检查点数据 */
27
+ get(): CheckpointData;
28
+ /**
29
+ * 判断是否应触发 L2 聚合
30
+ * @param currentL1Count 当前 L1 条目总数
31
+ * @param threshold L2 触发阈值
32
+ */
33
+ shouldTriggerL2(currentL1Count: number, threshold: number): boolean;
34
+ /**
35
+ * 判断是否应触发 L3 画像更新
36
+ * @param currentL2Count 当前 L2 条目总数
37
+ * @param threshold L3 触发阈值
38
+ */
39
+ shouldTriggerL3(currentL2Count: number, threshold: number): boolean;
40
+ /**
41
+ * 更新检查点(L2 聚合完成后调用)
42
+ */
43
+ updateL2(currentL1Count: number): void;
44
+ /**
45
+ * 更新检查点(L3 画像完成后调用)
46
+ */
47
+ updateL3(currentL2Count: number): void;
48
+ /**
49
+ * 重置检查点(用于手动触发全量重建)
50
+ */
51
+ reset(): void;
52
+ private load;
53
+ private persist;
54
+ }
55
+ /**
56
+ * 获取全局检查点实例
57
+ * @param filePath 可选,首次调用时指定自定义路径
58
+ */
59
+ export declare function getMemoryCheckpoint(filePath?: string): MemoryCheckpoint;
60
+ /** 重置全局实例(用于测试或路径变更场景) */
61
+ export declare function resetMemoryCheckpoint(): void;
62
+ //# sourceMappingURL=checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../../src/memory/checkpoint.ts"],"names":[],"mappings":"AAWA,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAYD;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAiB;IAE7B;;OAEG;gBACS,QAAQ,CAAC,EAAE,MAAM;IAK7B,gBAAgB;IAChB,GAAG,IAAI,cAAc;IAIrB;;;;OAIG;IACH,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAInE;;;;OAIG;IACH,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAInE;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAOtC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAMtC;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,OAAO;CAWhB;AAKD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAKvE;AAED,0BAA0B;AAC1B,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -0,0 +1,59 @@
1
+ import type { LLMProvider } from '../llm/types.ts';
2
+ import type { Message } from '../types.ts';
3
+ /** 从对话中提取的原子事实 */
4
+ export interface AtomFact {
5
+ /** 记忆键(snake_case,用于 upsert) */
6
+ key: string;
7
+ /** 事实内容 */
8
+ content: string;
9
+ /** 分类 */
10
+ category: 'user_preference' | 'project_knowledge' | 'learned_fact' | 'custom';
11
+ /** 重要程度 1-5 */
12
+ importance: number;
13
+ /** 来源会话 ID */
14
+ sourceSessionId: string;
15
+ }
16
+ /** 提取配置 */
17
+ export interface ExtractorOptions {
18
+ /** LLM Provider 实例 */
19
+ llmProvider: LLMProvider;
20
+ /** 单次提取最大原子事实数,默认 5 */
21
+ maxFactsPerSession?: number;
22
+ /** 触发提取的最小迭代次数,默认 3 */
23
+ minIterations?: number;
24
+ /** 提取超时(毫秒),默认 30000 */
25
+ timeoutMs?: number;
26
+ }
27
+ /**
28
+ * LLM 驱动的原子事实提取器
29
+ * 从对话历史中提取持久性、可复用的结构化事实(L1 Atom)
30
+ */
31
+ export declare class MemoryExtractor {
32
+ private llmProvider;
33
+ private maxFactsPerSession;
34
+ private minIterations;
35
+ private timeoutMs;
36
+ constructor(opts: ExtractorOptions);
37
+ /**
38
+ * 从对话消息中提取原子事实
39
+ * @param messages 对话消息列表
40
+ * @param sessionId 当前会话 ID
41
+ * @param existingKeys 已有的记忆键(用于去重)
42
+ * @returns 提取到的原子事实数组
43
+ */
44
+ extract(messages: Message[], sessionId: string, existingKeys: string[]): Promise<AtomFact[]>;
45
+ /**
46
+ * 调用 LLM 提取事实
47
+ */
48
+ private callLLM;
49
+ /**
50
+ * 解析 LLM 输出的 JSON 数组
51
+ */
52
+ private parseFacts;
53
+ private normalizeCategory;
54
+ /**
55
+ * 构建对话摘要(将消息列表压缩为文本,限制总字符数)
56
+ */
57
+ private buildMessagesSummary;
58
+ }
59
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../src/memory/extractor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAM3C,kBAAkB;AAClB,MAAM,WAAW,QAAQ;IACvB,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS;IACT,QAAQ,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,cAAc,GAAG,QAAQ,CAAC;IAC9E,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,WAAW;AACX,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,uBAAuB;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uBAAuB;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,gBAAgB;IAOlC;;;;;;OAMG;IACG,OAAO,CACX,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,QAAQ,EAAE,CAAC;IAetB;;OAEG;YACW,OAAO;IAqBrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAyBlB,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAuB7B"}
@@ -0,0 +1,38 @@
1
+ import type { LLMProvider } from '../llm/types.ts';
2
+ import type { SceneBlock } from './scene.ts';
3
+ /** 画像维度 */
4
+ export interface PersonaFacet {
5
+ /** 维度键(如 coding_style, tool_preference) */
6
+ key: string;
7
+ /** 维度内容(markdown) */
8
+ content: string;
9
+ }
10
+ /** 画像生成器配置 */
11
+ export interface PersonaGeneratorOptions {
12
+ llmProvider: LLMProvider;
13
+ /** 超时(毫秒),默认 30000 */
14
+ timeoutMs?: number;
15
+ }
16
+ /**
17
+ * L3 用户画像生成器
18
+ *
19
+ * 工作流程:
20
+ * 1. 接收 L2 场景块列表
21
+ * 2. 通过 LLM 从场景中提炼稳定用户特征
22
+ * 3. 增量更新画像(保留已有内容,仅修改受影响的部分)
23
+ */
24
+ export declare class PersonaGenerator {
25
+ private llmProvider;
26
+ private timeoutMs;
27
+ constructor(opts: PersonaGeneratorOptions);
28
+ /**
29
+ * 生成或更新用户画像
30
+ * @param scenes L2 场景块列表
31
+ * @param existingPersona 已有画像(markdown 文本,用于增量更新)
32
+ * @returns 更新后的画像 markdown
33
+ */
34
+ generate(scenes: SceneBlock[], existingPersona?: string): Promise<string>;
35
+ private buildUserPrompt;
36
+ private callLLM;
37
+ }
38
+ //# sourceMappingURL=persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../src/memory/persona.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAc;AACd,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,uBAAuB;IAKzC;;;;;OAKG;IACG,QAAQ,CACZ,MAAM,EAAE,UAAU,EAAE,EACpB,eAAe,GAAE,MAAW,GAC3B,OAAO,CAAC,MAAM,CAAC;IAalB,OAAO,CAAC,eAAe;YAoBT,OAAO;CAoBtB"}
@@ -0,0 +1,50 @@
1
+ import type { LLMProvider } from '../llm/types.ts';
2
+ import type { MemoryServiceLike } from './types.ts';
3
+ import { type SceneBlock } from './scene.ts';
4
+ import type { Message } from '../types.ts';
5
+ /** 管道配置 */
6
+ export interface PipelineOptions {
7
+ llmProvider: LLMProvider;
8
+ /** 触发 L2 聚合的 L1 增量阈值(新 L1 条目数),默认 5 */
9
+ l2Threshold?: number;
10
+ /** 触发 L3 画像更新的 L2 增量阈值,默认 3 */
11
+ l3Threshold?: number;
12
+ }
13
+ /** 管道执行结果 */
14
+ export interface PipelineResult {
15
+ /** 本次提取的 L1 原子事实数 */
16
+ l1Extracted: number;
17
+ /** 是否触发了 L2 聚合 */
18
+ l2Triggered: boolean;
19
+ /** 是否触发了 L3 画像更新 */
20
+ l3Triggered: boolean;
21
+ /** 新的场景块(如果触发了 L2) */
22
+ newScenes?: SceneBlock[];
23
+ /** 更新的画像(如果触发了 L3) */
24
+ newPersona?: string;
25
+ }
26
+ /**
27
+ * 记忆管道调度器
28
+ *
29
+ * 调度策略:
30
+ * 1. 每次对话结束:提取 L1 原子事实
31
+ * 2. L1 累积达到阈值:触发 L2 场景聚合
32
+ * 3. L2 累积达到阈值:触发 L3 画像生成
33
+ *
34
+ * 所有操作均为 fire-and-forget,不阻塞对话响应
35
+ */
36
+ export declare class MemoryPipeline {
37
+ private llmProvider;
38
+ private l2Threshold;
39
+ private l3Threshold;
40
+ constructor(opts: PipelineOptions);
41
+ /**
42
+ * 执行完整管道(L1 提取 → 条件触发 L2 → 条件触发 L3)
43
+ *
44
+ * @param messages 对话消息
45
+ * @param sessionId 会话 ID
46
+ * @param memoryService MemoryService 实例(延迟导入避免循环依赖)
47
+ */
48
+ run(messages: Message[], sessionId: string, memoryService: MemoryServiceLike): Promise<PipelineResult>;
49
+ }
50
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/memory/pipeline.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAA4B,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9E,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,WAAW;AACX,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;IACzB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,IAAI,EAAE,eAAe;IAMjC;;;;;;OAMG;IACG,GAAG,CACP,QAAQ,EAAE,OAAO,EAAE,EACnB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,iBAAiB,GAC/B,OAAO,CAAC,cAAc,CAAC;CAwH3B"}
@@ -0,0 +1,9 @@
1
+ /** 原子事实提取 Prompt(系统提示) */
2
+ export declare const EXTRACTION_SYSTEM_PROMPT = "You are a memory extraction engine. Analyze the conversation and extract persistent, reusable facts.\n\n**Rules:**\n- Only extract OBJECTIVE, PERSISTENT facts that will be useful in future conversations\n- Extract: user preferences, project knowledge, technical stack, learned patterns, important decisions\n- DO NOT extract: one-off task details (e.g. \"fix bug X\"), temporary state, debugging logs\n- Each fact must be atomic (one discrete piece of knowledge)\n- Use concise, declarative language\n- Prefer updating existing keys over creating duplicates\n\n**Categories:**\n- user_preference: User's working habits, tool preferences, coding style\n- project_knowledge: Project architecture, tech stack, conventions\n- learned_fact: New knowledge gained during the conversation\n\n**Output format (strict JSON array):**\n[\n { \"key\": \"snake_case_key\", \"content\": \"Brief factual statement\", \"category\": \"user_preference|project_knowledge|learned_fact\", \"importance\": 1-5 }\n]\n\nIf no extractable facts exist, output an empty array: []\nDo not add explanations or markdown outside the JSON.";
3
+ /** 构建提取用户提示 */
4
+ export declare function buildExtractionUserPrompt(messagesSummary: string, existingKeys: string[]): string;
5
+ /** 场景聚合 Prompt(Phase 4 L2) */
6
+ export declare const SCENE_AGGREGATION_SYSTEM_PROMPT = "You are a memory organizer. Group related atomic facts into thematic scenario blocks.\n\n**Rules:**\n- Each scenario should have a clear title and description\n- Group facts by topic/project/domain (e.g. \"\u8FDE\u63A5\u5668\u529F\u80FD\u5F00\u53D1\", \"\u9879\u76EE\u67B6\u6784\u51B3\u7B56\")\n- Max 15 scenarios total. Merge or archive old scenarios if needed.\n- A fact can belong to only one scenario\n\n**Output format (strict JSON array):**\n[\n {\n \"sceneId\": \"snake_case_id\",\n \"title\": \"\u573A\u666F\u6807\u9898\",\n \"description\": \"\u573A\u666F\u63CF\u8FF0\uFF081-2\u53E5\uFF09\",\n \"atomIds\": [\"atom_id_1\", \"atom_id_2\"]\n }\n]";
7
+ /** 画像生成 Prompt(Phase 4 L3) */
8
+ export declare const PERSONA_GENERATION_SYSTEM_PROMPT = "You are a user profiling engine. Based on the scenario blocks provided, generate or incrementally update a user persona.\n\n**Rules:**\n- Focus on stable, enduring traits: working style, technical preferences, communication patterns\n- Use clear section headers (## \u6280\u672F\u504F\u597D, ## \u5DE5\u4F5C\u98CE\u683C, ## \u9879\u76EE\u80CC\u666F, etc.)\n- Keep the persona concise (max 800 words)\n- When updating: preserve existing content, only modify sections affected by new scenarios\n\n**Output format: Markdown**\nWrite the persona directly as markdown text.";
9
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/memory/prompts.ts"],"names":[],"mappings":"AAIA,0BAA0B;AAC1B,eAAO,MAAM,wBAAwB,wlCAqBiB,CAAC;AAEvD,eAAe;AACf,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,CASR;AAED,8BAA8B;AAC9B,eAAO,MAAM,+BAA+B,gqBAgB1C,CAAC;AAEH,8BAA8B;AAC9B,eAAO,MAAM,gCAAgC,6jBASA,CAAC"}
@@ -0,0 +1,66 @@
1
+ import type { MemoryEntry, MemoryLayer } from './types.ts';
2
+ /** 召回结果 */
3
+ export interface RecallResult {
4
+ /** 召回的记忆条目(按相关度排序) */
5
+ entries: ScoredMemoryEntry[];
6
+ /** 是否超时 */
7
+ timedOut: boolean;
8
+ /** 召回策略描述 */
9
+ strategy: string;
10
+ }
11
+ /** 带分数的记忆条目 */
12
+ export interface ScoredMemoryEntry extends MemoryEntry {
13
+ /** 相关度分数 0-1 */
14
+ relevanceScore: number;
15
+ }
16
+ /** 召回配置 */
17
+ export interface RecallOptions {
18
+ /** 最大返回条数,默认 5 */
19
+ maxResults?: number;
20
+ /** 召回超时(毫秒),默认 3000 */
21
+ timeoutMs?: number;
22
+ /** 仅召回指定层级 */
23
+ layers?: MemoryLayer[];
24
+ }
25
+ /**
26
+ * 智能记忆召回引擎
27
+ *
28
+ * 召回策略(优先级排序):
29
+ * 1. 关键词匹配:userText 分词后与 key/content 做模糊匹配
30
+ * 2. 重要性加权:importance 高的记忆权重更大
31
+ * 3. 时效性衰减:近期更新的记忆优先(updatedAt 越新分数越高)
32
+ *
33
+ * 超时保护:超过 timeoutMs 立即返回空结果,不阻塞对话
34
+ */
35
+ export declare class MemoryRecallEngine {
36
+ /**
37
+ * 召回相关记忆(带超时保护)
38
+ */
39
+ recall(userText: string, allMemories: MemoryEntry[], options?: RecallOptions): Promise<RecallResult>;
40
+ private recallInner;
41
+ /**
42
+ * 提取查询词项(简单分词)
43
+ * 支持中英文混合:英文按空格,中文按字
44
+ */
45
+ private extractTerms;
46
+ /**
47
+ * 计算关键词匹配分数(TF-IDF 加权)
48
+ * 稀有词(出现在少量记忆中)获得更高权重,常见词权重降低
49
+ */
50
+ private computeKeywordScore;
51
+ /**
52
+ * 构建 IDF 映射表:term → IDF 分数
53
+ * IDF = log(N / df),N=总文档数,df=包含该 term 的文档数
54
+ */
55
+ private buildIDFMap;
56
+ /**
57
+ * 计算时效性分数(0-1)
58
+ * 24 小时内的记忆得 1.0,30 天前的记忆得 ~0.1
59
+ */
60
+ private computeRecencyScore;
61
+ }
62
+ /**
63
+ * 将召回结果格式化为可注入 system prompt 的文本
64
+ */
65
+ export declare function formatRecallForPrompt(result: RecallResult): string;
66
+ //# sourceMappingURL=recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3D,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,WAAW;IACX,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAe;AACf,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,gBAAgB;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,qBAAa,kBAAkB;IAE7B;;OAEG;IACG,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EAAE,EAC1B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC;YAWV,WAAW;IAgDzB;;;OAGG;IACH,OAAO,CAAC,YAAY;IA0BpB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;OAGG;IACH,OAAO,CAAC,WAAW;IAuBnB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAS5B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CASlE"}
@@ -0,0 +1,49 @@
1
+ import type { LLMProvider } from '../llm/types.ts';
2
+ /** 场景块(L2) */
3
+ export interface SceneBlock {
4
+ /** 场景 ID(snake_case) */
5
+ sceneId: string;
6
+ /** 场景标题 */
7
+ title: string;
8
+ /** 场景描述 */
9
+ description: string;
10
+ /** 归属的原子事实 ID 列表 */
11
+ atomIds: string[];
12
+ }
13
+ /** 聚合器配置 */
14
+ export interface SceneAggregatorOptions {
15
+ llmProvider: LLMProvider;
16
+ /** 最大场景数,默认 15 */
17
+ maxScenes?: number;
18
+ /** 超时(毫秒),默认 30000 */
19
+ timeoutMs?: number;
20
+ }
21
+ /**
22
+ * L2 场景聚合器
23
+ *
24
+ * 工作流程:
25
+ * 1. 收集所有 L1 原子事实
26
+ * 2. 通过 LLM 将相关事实分组为场景块
27
+ * 3. 输出 SceneBlock[],供 MemoryService 更新 L2 条目
28
+ */
29
+ export declare class SceneAggregator {
30
+ private llmProvider;
31
+ private maxScenes;
32
+ private timeoutMs;
33
+ constructor(opts: SceneAggregatorOptions);
34
+ /**
35
+ * 聚合原子事实为场景块
36
+ * @param atoms L1 原子事实列表(key + content + id)
37
+ * @param existingScenes 已有场景(用于增量更新)
38
+ */
39
+ aggregate(atoms: Array<{
40
+ id: string;
41
+ key: string;
42
+ content: string;
43
+ category: string;
44
+ }>, existingScenes?: SceneBlock[]): Promise<SceneBlock[]>;
45
+ private buildUserPrompt;
46
+ private callLLM;
47
+ private parseScenes;
48
+ }
49
+ //# sourceMappingURL=scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../src/memory/scene.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInD,cAAc;AACd,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,YAAY;AACZ,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,sBAAsB;IAMxC;;;;OAIG;IACG,SAAS,CACb,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EAC5E,cAAc,GAAE,UAAU,EAAO,GAChC,OAAO,CAAC,UAAU,EAAE,CAAC;IAcxB,OAAO,CAAC,eAAe;YAqBT,OAAO;IAqBrB,OAAO,CAAC,WAAW;CAsBpB"}
@@ -0,0 +1,43 @@
1
+ /** 记忆层级 */
2
+ export type MemoryLayer = 'L0' | 'L1' | 'L2' | 'L3';
3
+ /** 记忆条目(与上层 MemoryService 的 MemoryEntry 保持一致,上层负责转换) */
4
+ export interface MemoryEntry {
5
+ /** 唯一标识(基于 key 生成) */
6
+ id: string;
7
+ /** 记忆分类:user_preference / project_knowledge / learned_fact / custom / scene / persona */
8
+ category: string;
9
+ /** 记忆键(用于 upsert) */
10
+ key: string;
11
+ /** 记忆内容 */
12
+ content: string;
13
+ /** 重要程度 1-5,默认 3 */
14
+ importance: number;
15
+ /** 创建时间(ISO 字符串) */
16
+ createdAt: string;
17
+ /** 最后更新时间(ISO 字符串) */
18
+ updatedAt: string;
19
+ /** 记忆层级:L0=原始对话 L1=原子事实 L2=场景块 L3=用户画像,默认 L1 */
20
+ memoryLayer: MemoryLayer;
21
+ /** 来源会话 ID(自动提取时记录) */
22
+ sourceSessionId?: string;
23
+ /** 提取时间戳(ISO 字符串) */
24
+ sourceTimestamp?: string;
25
+ /** L2 场景 ID(归属场景块) */
26
+ sceneId?: string;
27
+ /** L3 画像维度(如 coding_style, tool_preference) */
28
+ personaFacet?: string;
29
+ /** 来源层级(该条目从哪一层提炼而来) */
30
+ sourceLayer?: MemoryLayer;
31
+ /** 来源条目 ID 列表(溯源链) */
32
+ sourceIds?: string[];
33
+ }
34
+ /**
35
+ * MemoryServiceLike — 管道调度器所需的 MemoryService 最小接口
36
+ * 上层(server 侧)的 MemoryService 实现此接口即可接入管道
37
+ */
38
+ export interface MemoryServiceLike {
39
+ getKeys(): string[];
40
+ getAllEntries(layer?: MemoryLayer): MemoryEntry[];
41
+ save(key: string, content: string, category: string, importance: number, extras?: Partial<Pick<MemoryEntry, 'memoryLayer' | 'sourceSessionId' | 'sourceTimestamp' | 'sceneId' | 'sourceLayer' | 'sourceIds'>>): MemoryEntry;
42
+ }
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAIA,WAAW;AACX,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpD,wDAAwD;AACxD,MAAM,WAAW,WAAW;IAC1B,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,WAAW,EAAE,WAAW,CAAC;IACzB,uBAAuB;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,IAAI,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,KAAK,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAAC;IAClD,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC,CAAC,GACnI,WAAW,CAAC;CAChB"}
@@ -0,0 +1,52 @@
1
+ import type { HookContext, HookResult } from '../hooks/types.ts';
2
+ /**
3
+ * 中间件 before/after 接收的上下文信息
4
+ * 包含当前迭代的关键状态快照,中间件可读取但不应直接修改
5
+ */
6
+ export interface MiddlewareContext {
7
+ /** 会话 ID */
8
+ sessionId: string;
9
+ /** 当前迭代轮次 */
10
+ iteration: number;
11
+ /** 当前消息列表(只读快照) */
12
+ messages: ReadonlyArray<{
13
+ role: string;
14
+ content: string | null;
15
+ }>;
16
+ /** 当前可用工具数量 */
17
+ toolCount: number;
18
+ }
19
+ /**
20
+ * 中间件接口 — Hook 系统的结构化增强层
21
+ *
22
+ * 与 Hook 共存,提供更清晰的 before/after 生命周期:
23
+ * - `before` / `after`:在每轮迭代的开始/结束执行
24
+ * - `onToolBefore` / `onToolAfter`:在工具执行前/后执行(与 before_tool/after_tool Hook 并行)
25
+ *
26
+ * 执行顺序:Middleware.before → Hook.on_iteration_start → ... → Hook.before_tool → Middleware.onToolBefore → 工具执行 → Hook.after_tool → Middleware.onToolAfter → ... → Middleware.after
27
+ */
28
+ export interface Middleware {
29
+ /** 中间件名称(用于日志和调试) */
30
+ name: string;
31
+ /**
32
+ * 每轮迭代开始前调用
33
+ * 适合:预检查、上下文注入、状态审计
34
+ */
35
+ before?(ctx: MiddlewareContext): Promise<void>;
36
+ /**
37
+ * 每轮迭代结束后调用
38
+ * 适合:后处理、指标收集、日志记录
39
+ */
40
+ after?(ctx: MiddlewareContext): Promise<void>;
41
+ /**
42
+ * 工具执行前调用(与 before_tool Hook 同层)
43
+ * 返回值与 Hook 的 before_tool 合并(block/modify 均生效)
44
+ */
45
+ onToolBefore?(ctx: HookContext): Promise<HookResult | void>;
46
+ /**
47
+ * 工具执行后调用(与 after_tool Hook 同层)
48
+ * 返回值与 Hook 的 after_tool 合并(inject 均生效)
49
+ */
50
+ onToolAfter?(ctx: HookContext): Promise<HookResult | void>;
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIjE;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,QAAQ,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAClE,eAAe;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,KAAK,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;OAGG;IACH,YAAY,CAAC,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAE5D;;;OAGG;IACH,WAAW,CAAC,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC5D"}
@@ -0,0 +1,59 @@
1
+ import type { SecurityRule } from '../security/types.ts';
2
+ import type { ShellExecutor, FileSystemExecutor } from '../tool/types.ts';
3
+ /** 沙箱配置 */
4
+ export interface SandboxConfig {
5
+ /** 沙箱根目录(默认 ~/.workagent/sandboxes/{id}) */
6
+ rootDir: string;
7
+ /** 允许的文件扩展名(脚本执行用),空 = 不限制 */
8
+ allowedExtensions?: string[];
9
+ /** 最大文件大小 (bytes),默认 10MB */
10
+ maxFileSize?: number;
11
+ /** 执行超时 (ms),默认 30000 */
12
+ execTimeout?: number;
13
+ /** 是否启用命令限制(默认 true) */
14
+ commandRestriction?: boolean;
15
+ }
16
+ /** 默认沙箱配置 */
17
+ export declare const DEFAULT_SANDBOX_CONFIG: Partial<SandboxConfig>;
18
+ /** 脚本语言类型 */
19
+ export type ScriptLanguage = 'python' | 'nodejs' | 'shell';
20
+ /** 沙箱实例接口 */
21
+ export interface Sandbox {
22
+ readonly id: string;
23
+ readonly rootDir: string;
24
+ /** 获取受限的 Shell 执行器 */
25
+ getShellExecutor(): ShellExecutor;
26
+ /** 获取受限的文件系统执行器 */
27
+ getFileSystemExecutor(): FileSystemExecutor;
28
+ /**
29
+ * 运行脚本(写入临时文件并执行)
30
+ * @param language 脚本语言:python / nodejs / shell
31
+ * @param code 脚本代码
32
+ * @param timeout 执行超时 (ms)
33
+ */
34
+ runScript(language: ScriptLanguage, code: string, timeout?: number): Promise<string>;
35
+ /** 销毁沙箱(清理临时文件) */
36
+ destroy(): Promise<void>;
37
+ }
38
+ /** 沙箱管理器接口 */
39
+ export interface SandboxManager {
40
+ /** 创建沙箱 */
41
+ create(id: string, config?: Partial<SandboxConfig>): Promise<Sandbox>;
42
+ /** 获取已创建的沙箱 */
43
+ get(id: string): Sandbox | undefined;
44
+ /** 销毁指定沙箱 */
45
+ destroy(id: string): Promise<void>;
46
+ /** 销毁所有沙箱 */
47
+ destroyAll(): Promise<void>;
48
+ }
49
+ /**
50
+ * 沙箱专用命令黑名单(在 SecurityGuard 基础上扩展)
51
+ * 这些规则阻止任何试图突破沙箱隔离的操作
52
+ */
53
+ export declare const SANDBOX_BLOCKED_COMMANDS: SecurityRule[];
54
+ /**
55
+ * 沙箱允许的环境变量白名单
56
+ * 只保留脚本运行所需的最小环境变量集合
57
+ */
58
+ export declare const SANDBOX_SAFE_ENV_KEYS: string[];
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sandbox/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAI1E,WAAW;AACX,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,aAAa;AACb,eAAO,MAAM,sBAAsB,EAAE,OAAO,CAAC,aAAa,CAIzD,CAAC;AAIF,aAAa;AACb,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE3D,aAAa;AACb,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sBAAsB;IACtB,gBAAgB,IAAI,aAAa,CAAC;IAClC,mBAAmB;IACnB,qBAAqB,IAAI,kBAAkB,CAAC;IAC5C;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrF,mBAAmB;IACnB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAID,cAAc;AACd,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,eAAe;IACf,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IACrC,aAAa;IACb,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,aAAa;IACb,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAID;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,YAAY,EAyFlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAezC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { SanitizeResult, SecurityRule, SecurityPolicy } from './types.ts';
2
+ export declare class SecurityGuard {
3
+ private policy;
4
+ /** 已编译的正则规则缓存(避免每次 sanitize 重复遍历数组) */
5
+ private compiledBlacklist;
6
+ private compiledCustomRewrite;
7
+ private compiledCustomWarn;
8
+ /** 删除保护规则(使用 policy.trashDir) */
9
+ private deleteProtectionRule;
10
+ constructor(policy?: Partial<SecurityPolicy>);
11
+ /** 编译规则缓存(policy 变更时调用) */
12
+ private invalidateCompiledRules;
13
+ private getCompiledBlacklist;
14
+ private getCompiledCustomRewrite;
15
+ private getCompiledCustomWarn;
16
+ /** 检查命令安全性 */
17
+ sanitize(command: string): SanitizeResult;
18
+ /** 添加自定义安全规则 */
19
+ addRule(rule: SecurityRule): void;
20
+ /** 移除规则 */
21
+ removeRule(name: string): void;
22
+ /** 更新安全策略 */
23
+ setPolicy(policy: Partial<SecurityPolicy>): void;
24
+ /** 获取当前策略 */
25
+ getPolicy(): SecurityPolicy;
26
+ /**
27
+ * 扫描并脱敏文本中的敏感信息
28
+ * 将检测到的 API Key、Token、密码等替换为 [REDACTED:xxx]
29
+ * @param text 输入文本(通常是工具结果)
30
+ * @returns 脱敏后的文本
31
+ */
32
+ sanitizeCredentials(text: string): string;
33
+ /**
34
+ * 检测文本是否包含敏感信息
35
+ * @param text 输入文本
36
+ * @returns 检测到的敏感信息类型列表
37
+ */
38
+ detectCredentials(text: string): string[];
39
+ private matchRule;
40
+ }
41
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../src/security/guard.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyE/E,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiB;IAE/B,uCAAuC;IACvC,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,qBAAqB,CAA+B;IAC5D,OAAO,CAAC,kBAAkB,CAA+B;IACzD,iCAAiC;IACjC,OAAO,CAAC,oBAAoB,CAAe;gBAE/B,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAM5C,2BAA2B;IAC3B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,wBAAwB;IAOhC,OAAO,CAAC,qBAAqB;IAO7B,cAAc;IACd,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAuDzC,gBAAgB;IAChB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAKjC,WAAW;IACX,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9B,aAAa;IACb,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAQhD,aAAa;IACb,SAAS,IAAI,cAAc;IAM3B;;;;;OAKG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYzC;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAczC,OAAO,CAAC,SAAS;CAMlB"}
@@ -0,0 +1,36 @@
1
+ export type Severity = 'safe' | 'warn' | 'danger' | 'blocked';
2
+ export interface SanitizeResult {
3
+ /** 是否允许执行 */
4
+ safe: boolean;
5
+ /** 改写后的命令(如 rm → mv 到回收站) */
6
+ rewritten?: string;
7
+ /** 拒绝/警告原因 */
8
+ reason?: string;
9
+ /** 严重程度 */
10
+ severity: Severity;
11
+ }
12
+ export interface SecurityRule {
13
+ /** 规则名称 */
14
+ name: string;
15
+ /** 匹配模式(正则或函数) */
16
+ pattern: RegExp | ((command: string) => boolean);
17
+ /** 命中后的严重程度 */
18
+ severity: Severity;
19
+ /** 命中后的处理:'block' 阻止 | 'rewrite' 改写 | 'warn' 放行但记录 */
20
+ action: 'block' | 'rewrite' | 'warn';
21
+ /** 改写函数(action='rewrite' 时使用) */
22
+ rewriter?: (command: string) => string;
23
+ /** 规则描述 */
24
+ description?: string;
25
+ }
26
+ export interface SecurityPolicy {
27
+ /** 是否启用删除保护(rm → mv 到回收站) */
28
+ deleteProtection: boolean;
29
+ /** 回收站路径 */
30
+ trashDir: string;
31
+ /** 是否启用黑名单 */
32
+ blacklistEnabled: boolean;
33
+ /** 自定义规则 */
34
+ rules: SecurityRule[];
35
+ }
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/security/types.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,IAAI,EAAE,OAAO,CAAC;IACd,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAID,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;IACjD,eAAe;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,sDAAsD;IACtD,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iCAAiC;IACjC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY;IACZ,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB"}