@roarpeng/graphflow 0.6.15 → 1.0.4
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/AGENTS.md +1 -1
- package/CHANGELOG.md +54 -1
- package/README.md +149 -44
- package/dist/agents/insight.d.ts +83 -0
- package/dist/agents/insight.d.ts.map +1 -0
- package/dist/agents/insight.js +381 -0
- package/dist/agents/insight.js.map +1 -0
- package/dist/agents/validator.d.ts.map +1 -1
- package/dist/agents/validator.js +19 -8
- package/dist/agents/validator.js.map +1 -1
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +3 -2
- package/dist/agents/worker.js.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/discover-workspace.d.ts +16 -0
- package/dist/config/discover-workspace.d.ts.map +1 -0
- package/dist/config/discover-workspace.js +112 -0
- package/dist/config/discover-workspace.js.map +1 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +22 -8
- package/dist/config/resolve.js.map +1 -1
- package/dist/config/scaffold.d.ts.map +1 -1
- package/dist/config/scaffold.js +2 -1
- package/dist/config/scaffold.js.map +1 -1
- package/dist/config/schema.d.ts +31 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/workspace-root.d.ts +24 -0
- package/dist/config/workspace-root.d.ts.map +1 -0
- package/dist/config/workspace-root.js +59 -0
- package/dist/config/workspace-root.js.map +1 -0
- package/dist/core/orchestrator.d.ts +7 -0
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +54 -3
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/state-machine.d.ts +1 -0
- package/dist/core/state-machine.d.ts.map +1 -1
- package/dist/core/state-machine.js +20 -0
- package/dist/core/state-machine.js.map +1 -1
- package/dist/core/types.d.ts +9 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/graph/adaptive-budget.d.ts +18 -0
- package/dist/graph/adaptive-budget.d.ts.map +1 -0
- package/dist/graph/adaptive-budget.js +50 -0
- package/dist/graph/adaptive-budget.js.map +1 -0
- package/dist/graph/artifact-manager.d.ts +72 -0
- package/dist/graph/artifact-manager.d.ts.map +1 -0
- package/dist/graph/artifact-manager.js +215 -0
- package/dist/graph/artifact-manager.js.map +1 -0
- package/dist/graph/compression-model.d.ts +52 -0
- package/dist/graph/compression-model.d.ts.map +1 -0
- package/dist/graph/compression-model.js +125 -0
- package/dist/graph/compression-model.js.map +1 -0
- package/dist/graph/context-slicer.d.ts +32 -0
- package/dist/graph/context-slicer.d.ts.map +1 -1
- package/dist/graph/context-slicer.js +159 -1
- package/dist/graph/context-slicer.js.map +1 -1
- package/dist/graph/file-indexer.d.ts +31 -0
- package/dist/graph/file-indexer.d.ts.map +1 -1
- package/dist/graph/file-indexer.js +332 -3
- package/dist/graph/file-indexer.js.map +1 -1
- package/dist/graph/graph-compression.d.ts +44 -0
- package/dist/graph/graph-compression.d.ts.map +1 -0
- package/dist/graph/graph-compression.js +155 -0
- package/dist/graph/graph-compression.js.map +1 -0
- package/dist/graph/graph-utils.d.ts +4 -1
- package/dist/graph/graph-utils.d.ts.map +1 -1
- package/dist/graph/graph-utils.js +62 -0
- package/dist/graph/graph-utils.js.map +1 -1
- package/dist/graph/graphify-file-client.d.ts.map +1 -1
- package/dist/graph/graphify-file-client.js +30 -8
- package/dist/graph/graphify-file-client.js.map +1 -1
- package/dist/graph/language-indexers/c-cpp.d.ts +9 -1
- package/dist/graph/language-indexers/c-cpp.d.ts.map +1 -1
- package/dist/graph/language-indexers/c-cpp.js +328 -103
- package/dist/graph/language-indexers/c-cpp.js.map +1 -1
- package/dist/graph/language-indexers/index.d.ts +20 -0
- package/dist/graph/language-indexers/index.d.ts.map +1 -1
- package/dist/graph/language-indexers/index.js +4 -0
- package/dist/graph/language-indexers/index.js.map +1 -1
- package/dist/graph/language-indexers/java.d.ts +12 -0
- package/dist/graph/language-indexers/java.d.ts.map +1 -0
- package/dist/graph/language-indexers/java.js +273 -0
- package/dist/graph/language-indexers/java.js.map +1 -0
- package/dist/graph/language-indexers/python.d.ts.map +1 -1
- package/dist/graph/language-indexers/python.js +47 -4
- package/dist/graph/language-indexers/python.js.map +1 -1
- package/dist/graph/language-indexers/ruby.d.ts +14 -0
- package/dist/graph/language-indexers/ruby.d.ts.map +1 -0
- package/dist/graph/language-indexers/ruby.js +245 -0
- package/dist/graph/language-indexers/ruby.js.map +1 -0
- package/dist/graph/language-indexers/rust.d.ts +10 -1
- package/dist/graph/language-indexers/rust.d.ts.map +1 -1
- package/dist/graph/language-indexers/rust.js +254 -80
- package/dist/graph/language-indexers/rust.js.map +1 -1
- package/dist/graph/language-indexers/tree-sitter-loader.d.ts +8 -1
- package/dist/graph/language-indexers/tree-sitter-loader.d.ts.map +1 -1
- package/dist/graph/language-indexers/tree-sitter-loader.js +64 -13
- package/dist/graph/language-indexers/tree-sitter-loader.js.map +1 -1
- package/dist/graph/language-indexers/typescript.d.ts.map +1 -1
- package/dist/graph/language-indexers/typescript.js +72 -8
- package/dist/graph/language-indexers/typescript.js.map +1 -1
- package/dist/graph/metrics.d.ts +33 -0
- package/dist/graph/metrics.d.ts.map +1 -0
- package/dist/graph/metrics.js +117 -0
- package/dist/graph/metrics.js.map +1 -0
- package/dist/graph/repo-map.d.ts +25 -0
- package/dist/graph/repo-map.d.ts.map +1 -0
- package/dist/graph/repo-map.js +80 -0
- package/dist/graph/repo-map.js.map +1 -0
- package/dist/graph/semantic-compression.d.ts +65 -0
- package/dist/graph/semantic-compression.d.ts.map +1 -0
- package/dist/graph/semantic-compression.js +173 -0
- package/dist/graph/semantic-compression.js.map +1 -0
- package/dist/graph/token-savings.d.ts +52 -0
- package/dist/graph/token-savings.d.ts.map +1 -0
- package/dist/graph/token-savings.js +113 -0
- package/dist/graph/token-savings.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/agent-mcp-installer.d.ts +13 -0
- package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
- package/dist/integrations/agent-mcp-installer.js +287 -29
- package/dist/integrations/agent-mcp-installer.js.map +1 -1
- package/dist/learning/episodic-memory.d.ts +8 -1
- package/dist/learning/episodic-memory.d.ts.map +1 -1
- package/dist/learning/episodic-memory.js +33 -0
- package/dist/learning/episodic-memory.js.map +1 -1
- package/dist/learning/hnsw-index.d.ts +46 -0
- package/dist/learning/hnsw-index.d.ts.map +1 -0
- package/dist/learning/hnsw-index.js +138 -0
- package/dist/learning/hnsw-index.js.map +1 -0
- package/dist/routing/model-router.d.ts +7 -0
- package/dist/routing/model-router.d.ts.map +1 -1
- package/dist/routing/model-router.js +36 -0
- package/dist/routing/model-router.js.map +1 -1
- package/dist/skills/index.d.ts +157 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +157 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/surfaces/cli/index.js +119 -0
- package/dist/surfaces/cli/index.js.map +1 -1
- package/dist/surfaces/cli/output.d.ts.map +1 -1
- package/dist/surfaces/cli/output.js +7 -0
- package/dist/surfaces/cli/output.js.map +1 -1
- package/dist/surfaces/cli/runtime/graph.d.ts +77 -3
- package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/graph.js +170 -10
- package/dist/surfaces/cli/runtime/graph.js.map +1 -1
- package/dist/surfaces/cli/runtime/panel.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/panel.js +2 -0
- package/dist/surfaces/cli/runtime/panel.js.map +1 -1
- package/dist/surfaces/cli/runtime/routing.d.ts +24 -1
- package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/routing.js +72 -0
- package/dist/surfaces/cli/runtime/routing.js.map +1 -1
- package/dist/surfaces/cli/runtime/settings.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/settings.js +4 -1
- package/dist/surfaces/cli/runtime/settings.js.map +1 -1
- package/dist/surfaces/cli/runtime/types.d.ts +36 -0
- package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.d.ts +2 -2
- package/dist/surfaces/cli/runtime.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.js +11 -1
- package/dist/surfaces/cli/runtime.js.map +1 -1
- package/dist/surfaces/mcp/server.d.ts.map +1 -1
- package/dist/surfaces/mcp/server.js +145 -4
- package/dist/surfaces/mcp/server.js.map +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/package.json +6 -2
- package/scripts/safe-postinstall.cjs +167 -12
- package/src/surfaces/trae-skill/graphflow/SKILL.md +535 -0
- package/wasm/tree-sitter-c.wasm +0 -0
- package/wasm/tree-sitter-go.wasm +0 -0
- package/wasm/tree-sitter-java.wasm +0 -0
- package/wasm/tree-sitter-python.wasm +0 -0
- package/wasm/tree-sitter-ruby.wasm +0 -0
- package/wasm/tree-sitter-rust.wasm +0 -0
package/AGENTS.md
CHANGED
|
@@ -40,7 +40,7 @@ From this repository:
|
|
|
40
40
|
|
|
41
41
|
- Use `graphflow_plan` before multi-step edits.
|
|
42
42
|
- Use `graphflow_preview_context` before large refactors or codebase-wide questions.
|
|
43
|
-
- Use `graphflow_run` when you want GraphFlow to execute
|
|
43
|
+
- Use `graphflow_run` when you want GraphFlow to plan and package a task with compressed context, returning a structured execution descriptor (executionDescriptor) for you to execute. GraphFlow delegates execution to external coding agents by default (bridge mode).
|
|
44
44
|
- Use `graphflow_index` after workspace changes if graph freshness matters.
|
|
45
45
|
- Use `graphflow_inspect_graph` and `graphflow_skill_insights` for observability.
|
|
46
46
|
- Use `graphflow_diagnose` when model/provider routing looks wrong.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,7 +4,60 @@ All notable changes to this project are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
-
## [0.
|
|
7
|
+
## [1.0.3] - 2026-06-24
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **CI**:`m17` 测试不再硬编码 `/usr/bin/node`,兼容 GitHub Actions hosted Node 路径。
|
|
12
|
+
- **图谱存储**:`graphify-file-client` 原子写入(temp + rename);损坏 JSON 时优雅降级为空 store 并提示 rebuild。
|
|
13
|
+
- **上下文检索**:`rankNodesForContextQuery` 降低 `.cursor/mcp.json`、`docs/integrations` 等配置噪声,优先 `src/` 与 Symbol 节点。
|
|
14
|
+
- **MCP metrics**:`graphflow_metrics` 支持 `rootDir` 并绑定工作区。
|
|
15
|
+
|
|
16
|
+
## [1.0.2] - 2026-06-24
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **MCP ENOENT(fnm 临时路径)**:安装 MCP 时不再写入 fnm multishell 临时 `node` 绝对路径;优先使用 IDE 自带 Electron(`ELECTRON_RUN_AS_NODE`),否则回退稳定 `node`。
|
|
21
|
+
- **Trae CN 支持**:安装器识别 `~/.trae-cn` 并写入 `~/.config/Trae CN/User/mcp.json`。
|
|
22
|
+
|
|
23
|
+
## [1.0.1] - 2026-06-24
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
|
|
27
|
+
- **多项目工作区隔离**:MCP / 扩展 / npm 包不再把图谱绑定到 vendor 目录或全局配置里的陈旧 `workspaceRoot`。
|
|
28
|
+
- **自动发现工作区**:新增 `discover-workspace`,从 cwd 向上查找项目根;仅在 runtime 目录(vendor、extensions)时回退到 IDE 环境变量。
|
|
29
|
+
- **MCP launcher**:子进程 `cwd` 与 `GRAPHFLOW_WORKSPACE_ROOT` 指向用户打开的项目,不再固定在扩展 vendor。
|
|
30
|
+
- **MCP 安装器**:默认写入 `GRAPHFLOW_WORKSPACE_ROOT: "${workspaceFolder}"`,merge 已有 env,扩展有工作区时同时写用户级与项目级配置。
|
|
31
|
+
- **MCP 工具**:`preview_context`、`inspect_graph`、`skill_insights`、`stats` 支持可选 `rootDir` 覆盖。
|
|
32
|
+
|
|
33
|
+
## [1.0.0] - 2026-06-19
|
|
34
|
+
|
|
35
|
+
首个正式版本。在 0.6.x 基础上完成「诚实执行语义」收敛与「上下文压缩」体系,所有新增能力均端到端接线到 CLI / MCP / orchestrator。
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- **混合压缩模型策略(compressor role)**:新增 `compressor` 角色,默认复用 economy tier(`backend: "inherit"`)——配置了外部 provider(OpenAI/Anthropic/百炼)就用其 economy 模型,纯离线则回退内嵌 minicpm。零额外配置。
|
|
40
|
+
- **内嵌模型首次自动下载**:无外部 LLM 时,`resolveCompressionModel` 复用既有断点续传下载器,首次按需拉取 minicpm GGUF 到 `~/.graphflow/models/`(类似 Playwright 浏览器下载)。
|
|
41
|
+
- **图结构压缩(零成本,默认开启)**:`graph-compression.ts` 提供边权重加权连通子图(`extractConnectedSubgraph`)、加权 PageRank 中心性(`computePageRank`)、检索序与中心性融合重排(`blendWithCentrality`)。preview / orchestrator 默认启用。
|
|
42
|
+
- **语义压缩(opt-in)**:`semantic-compression.ts` 通过 minicpm/economy LLM 对相似节点聚类合并(`clusterSimilarNodes` + `summarizeCluster`)、长节点改写(`densifyNodeContent`),由 `graphPolicy.compression.enabled` 开启。
|
|
43
|
+
- **RepoMap 概览模式(opt-in)**:`repo-map.ts` 在 token 预算紧张时返回模块级地图(每模块一行 exports 摘要),由 `compression.enableRepoMapFallback` 开启。
|
|
44
|
+
- **自适应 Token 预算(opt-in)**:`adaptive-budget.ts` 的 `estimateContextBudget` 按任务复杂度(refactor/多文件/架构/局部修复/加测试)动态调整预算,由 `compression.enableAdaptiveBudget` 开启。
|
|
45
|
+
- **HNSW 向量索引(可选依赖)**:`hnsw-index.ts` 在候选集 ≥200 节点时使用 hnswlib-node ANN 加速(10~100x),未安装时优雅降级线性扫描。`hnswlib-node` 列为 optionalDependency。
|
|
46
|
+
- **`buildEnhancedContextPackage`**:统一六步压缩 pipeline(RepoMap fallback → 关键词+向量召回 → 图压缩 → 语义压缩 → 分层配额 → 边扩展),preview 与 orchestrator 共用。
|
|
47
|
+
- **压缩诊断**:`route diagnose` 输出新增 `compression=<backend>:<provider>/<model>` 行,可查当前压缩模型来源。
|
|
48
|
+
- 测试 m43(bridge 模式)、m44(增强压缩)、m45(真机 benchmark)。
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- **执行语义诚实化(bridge 模式)**:`graphflow_run` 默认进入 bridge 模式——规划 + 压缩上下文后输出 `executionDescriptor` 移交外部 coding agent 执行,状态为 `HUMAN_REVIEW_REQUIRED` 并标注 `[DELEGATED]`,不再伪造 `COMPLETED`。
|
|
53
|
+
- **校验启发式标注**:规则校验结果统一标注 `[heuristic]` 与 `heuristic_validation` riskTag;检测并拒绝 provider 占位符回显(`[openai:model] ...`)。
|
|
54
|
+
- `graphPolicy.compression` 配置项扩展:`enableGraphCompression` / `enableRepoMapFallback` / `enableAdaptiveBudget` / `enableHnsw`。
|
|
55
|
+
|
|
56
|
+
### Fixed
|
|
57
|
+
|
|
58
|
+
- worker 兜底分支不再返回 `"Simulated change..."` 伪造输出,无可用执行模式时抛出明确错误。
|
|
59
|
+
- README 版本号、测试数与失效文档引用同步至 1.0。
|
|
60
|
+
|
|
8
61
|
|
|
9
62
|
### Added
|
|
10
63
|
|
package/README.md
CHANGED
|
@@ -4,54 +4,70 @@ A Context-Aware Multi-Agent Orchestration Engine.
|
|
|
4
4
|
|
|
5
5
|
GraphFlow 是一个基于 TypeScript/Node.js 的多智能体编排引擎,将 **Graphify 式知识图谱** 与 **Superpowers 式任务编排** 整合为可本地运行的上下文层:自动建图、压缩检索、规划执行、经验沉淀,并通过 CLI、MCP 与 VS Code 扩展对外暴露。
|
|
6
6
|
|
|
7
|
-
## 当前能力总览(
|
|
7
|
+
## 当前能力总览(v1.0.0+)
|
|
8
8
|
|
|
9
9
|
| 能力域 | 说明 |
|
|
10
10
|
| --- | --- |
|
|
11
|
-
|
|
|
11
|
+
| **任务规划与移交** | 按任务复杂度分流 simple / complex;DAG 规划;`graphflow_plan_insight` 六顶思考帽 + 5-Why 深度分析;默认 **bridge 模式**输出结构化任务描述符交给外部 coding agent 执行 |
|
|
12
12
|
| **模型路由** | Smart / Economy 双 tier;多 provider 健康探测与 fallback(OpenAI、Anthropic、百炼、豆包、OpenBMB) |
|
|
13
|
-
| **知识图谱** | 工作区 AST 索引(TS/JS/Python/Rust/Go/C/C
|
|
14
|
-
| **上下文压缩** | L1/L2/L3
|
|
15
|
-
| **持续建图** | 默认 `autoIndexOnSave`;preview / run 前按需增量索引(`hasPendingGraphIndexWork
|
|
13
|
+
| **知识图谱** | 工作区 AST 索引(TS/JS/Python/Rust/Go/C/C++/Java/Ruby);File / Module / Symbol 节点 + 依赖/引用/定义边;图谱 artifact 导入/导出 |
|
|
14
|
+
| **上下文压缩** | L1/L2/L3 分层锚点;近无损打包;图结构压缩(边权重+PageRank,零成本默认开启);可选语义压缩(minicpm/economy LLM 聚类合并);向量召回 + RRF + HNSW;RepoMap 概览;自适应预算 |
|
|
15
|
+
| **持续建图** | 默认 `autoIndexOnSave`;preview / run 前按需增量索引(`hasPendingGraphIndexWork`);MCP `graphflow_index_file` 单文件增量 |
|
|
16
16
|
| **语义增强** | 可选 post-index LLM 语义 enrich;OpenBMB 本地 embedded 模式 |
|
|
17
17
|
| **学习飞轮** | Episodic Memory、Reflection、Skill 节点、nightly 学习、技能提示注入规划 |
|
|
18
|
-
|
|
|
19
|
-
| **
|
|
18
|
+
| **可观测性** | `graphflow_stats` 累计 token 节省;`graphflow_metrics` Prometheus 指标;VS Code 知识图谱 Snapshot |
|
|
19
|
+
| **Agent 接入** | CLI `--json`;MCP stdio(**16 工具**);Cursor / Claude Code 规则与示例配置 |
|
|
20
|
+
| **VS Code 扩展** | Settings、建图、路由测试、Context Preview、**知识图谱可视化**、Skill Insights、Chat Agent、一键安装 MCP |
|
|
20
21
|
| **存储后端** | `file`(JSON)/ `memory` / `sqlite`(FTS5)/ `mcp-http`(Graphify) |
|
|
21
|
-
|
|
|
22
|
+
| **多项目隔离** | 全局配置共享 LLM/路由;**图谱路径按当前工作区解析**,不再串读其它项目的 `graphflow-out` |
|
|
23
|
+
| **工程质量** | TypeScript strict;**49 测试文件 / 200+ tests**;`npm run ci` 含扩展 esbuild 打包与 bundled runtime smoke |
|
|
22
24
|
|
|
23
25
|
### 一句话总结
|
|
24
26
|
|
|
25
|
-
> 从 task 描述出发,自动规划 → 路由模型 → 压缩图谱上下文(含向量召回)→
|
|
27
|
+
> 从 task 描述出发,自动规划 → 路由模型 → 压缩图谱上下文(含向量召回)→ **输出结构化执行描述符交给外部 coding agent**,并把经验沉淀回知识图谱;定位为 **上下文与规划服务(context service)**,而非独立执行器。
|
|
26
28
|
|
|
27
|
-
###
|
|
29
|
+
### v1.0.0 核心(2026-06)
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
- 双击节点或「打开源文件」跳转源码行
|
|
33
|
-
- 布局归一化修复大图谱「只剩角落小点」问题
|
|
31
|
+
- **诚实执行语义(bridge 模式)**:`graphflow_run` 规划 + 压缩上下文后输出 `executionDescriptor`,交给 Cursor / Claude Code 等外部 agent 执行,不再伪造 `COMPLETED`。
|
|
32
|
+
- **三层渐进压缩**:图结构压缩(默认零成本)→ 向量召回 + HNSW → 可选语义压缩(economy / minicpm)。
|
|
33
|
+
- **混合压缩模型**:`compressor` 角色默认继承 economy tier;纯离线时首次按需下载 minicpm GGUF。
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
- `autoIndexOnSave` 默认开启;保存文件后 debounce 增量索引
|
|
37
|
-
- 旧配置 `maxContextTokens: 400` 自动升级到 1500
|
|
35
|
+
### 最新更新(v1.0.x / main)
|
|
38
36
|
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
37
|
+
1. **多项目图谱隔离**
|
|
38
|
+
- 全局配置(`~/.graphflow.config.json`)只保存 LLM、路由等**机器级**设置,**不再持久化 `workspaceRoot`**
|
|
39
|
+
- 运行时按 `process.cwd()` 或 `GRAPHFLOW_WORKSPACE_ROOT` 解析 `graphflow-out/graphflow-graph.json`
|
|
40
|
+
- 修复:切换项目后 Snapshot / MCP 仍显示旧项目图谱的问题
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
42
|
+
2. **索引与语言扩展**
|
|
43
|
+
- 新增 **Java**(`.java`)、**Ruby**(`.rb`)tree-sitter 索引器
|
|
44
|
+
- C/C++、Rust 索引器增强;WASM 语法包可随 npm 包离线分发(`npm run wasm:download`)
|
|
45
|
+
- MCP 新增 `graphflow_index_file` 单文件增量索引
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
3. **MCP 工具扩展(9 → 16)**
|
|
48
|
+
- `graphflow_plan_insight`:六顶思考帽 + 5-Why 深度规划
|
|
49
|
+
- `graphflow_export_artifact` / `graphflow_import_artifact`:图谱压缩包导入导出
|
|
50
|
+
- `graphflow_stats`:累计 token 节省统计
|
|
51
|
+
- `graphflow_metrics`:Prometheus 格式可观测性指标
|
|
52
|
+
|
|
53
|
+
4. **知识图谱可视化(延续 v0.6.12+)**
|
|
54
|
+
- 可读标签、代码层/学习层 Tab、目录聚类、缩放平移、跳转源码
|
|
55
|
+
- Snapshot 为**采样视图**(默认约 120 节点 / 200 边),顶栏显示全库真实规模
|
|
56
|
+
|
|
57
|
+
5. **配置与工程**
|
|
58
|
+
- 全局配置优先;损坏 JSON 容错;CI 全链路 validate + VSIX 打包
|
|
49
59
|
- Settings「建立图谱(无需 LLM)」或 `graph index` 即可生成结构图谱
|
|
50
|
-
|
|
60
|
+
|
|
61
|
+
### 历史演进(v0.6.7 – v0.6.13 摘要)
|
|
62
|
+
|
|
63
|
+
- v0.6.12–0.6.13:知识图谱面板、布局归一化、Snapshot 可读标签
|
|
64
|
+
- v0.6.11:`autoIndexOnSave` 默认开启;`maxContextTokens` 400 → 1500 自动升级
|
|
65
|
+
- v0.6.10:runtime 模块化、VS Code esbuild bundle
|
|
66
|
+
- v0.6.7–0.6.9:全局配置脚手架、无工作区也可打开 Settings
|
|
51
67
|
|
|
52
68
|
### 发布信息
|
|
53
69
|
|
|
54
|
-
- 最新版本:**
|
|
70
|
+
- 最新版本:**v1.0.4**(root + vscode-extension);npm:`@roarpeng/graphflow@1.0.4`
|
|
55
71
|
- **GitHub Release**:push 到 `main` 且 CI 通过后自动发布 VSIX(见 [Actions](https://github.com/Roarpeng/GraphFlow/actions))
|
|
56
72
|
- 变更日志:`CHANGELOG.md`
|
|
57
73
|
|
|
@@ -68,7 +84,7 @@ npm install
|
|
|
68
84
|
npm run ci
|
|
69
85
|
```
|
|
70
86
|
|
|
71
|
-
预期:`lint` 无错误、`build` 成功、**
|
|
87
|
+
预期:`lint` 无错误、`build` 成功、**200+ tests** 通过、扩展 bundle 与 runtime smoke 通过。
|
|
72
88
|
|
|
73
89
|
## Agent 工具接入
|
|
74
90
|
|
|
@@ -83,19 +99,32 @@ GraphFlow 支持两种对外接入方式:
|
|
|
83
99
|
npm run start:mcp
|
|
84
100
|
```
|
|
85
101
|
|
|
86
|
-
### MCP
|
|
102
|
+
### MCP 工具一览(16 个)
|
|
87
103
|
|
|
88
104
|
| 工具 | 用途 |
|
|
89
105
|
| --- | --- |
|
|
90
|
-
| `graphflow_preview_context` |
|
|
91
|
-
| `graphflow_plan` |
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
106
|
+
| `graphflow_preview_context` | 压缩任务相关上下文(**优先调用**) |
|
|
107
|
+
| `graphflow_plan` | 多步任务分解与 DAG 规划 |
|
|
108
|
+
| `graphflow_plan_insight` | 六顶思考帽 + 5-Why 深度分析后规划(复杂任务) |
|
|
109
|
+
| `graphflow_run` | 规划 + 压缩上下文,输出 bridge 执行描述符 |
|
|
110
|
+
| `graphflow_index` | 全工作区增量建图 |
|
|
111
|
+
| `graphflow_index_file` | 单文件增量建图(适合 onSave / watcher) |
|
|
112
|
+
| `graphflow_rebuild` | 清空缓存后全量重建 |
|
|
113
|
+
| `graphflow_inspect_graph` | 图谱快照统计与样本节点 |
|
|
114
|
+
| `graphflow_enrich_graph` | 符号节点语义增强 |
|
|
96
115
|
| `graphflow_skill_insights` | 技能学习洞察 |
|
|
97
|
-
| `graphflow_diagnose` |
|
|
98
|
-
| `graphflow_model_download` | OpenBMB 模型下载 |
|
|
116
|
+
| `graphflow_diagnose` | 路由与压缩模型健康诊断 |
|
|
117
|
+
| `graphflow_model_download` | OpenBMB / minicpm 模型下载 |
|
|
118
|
+
| `graphflow_export_artifact` | 导出压缩图谱 artifact |
|
|
119
|
+
| `graphflow_import_artifact` | 导入图谱 artifact |
|
|
120
|
+
| `graphflow_stats` | 累计 token 节省 ROI 统计 |
|
|
121
|
+
| `graphflow_metrics` | Prometheus 格式运行指标 |
|
|
122
|
+
|
|
123
|
+
**MCP 建图提示**:用户级 MCP 进程的 `cwd` 不一定是当前项目。请任选其一:
|
|
124
|
+
|
|
125
|
+
- 调用 `graphflow_index` 时传入 `rootDir`(项目绝对路径)
|
|
126
|
+
- 在 MCP 配置中设置 `GRAPHFLOW_WORKSPACE_ROOT` 环境变量
|
|
127
|
+
- 使用 VS Code 扩展「建立图谱」或项目级 `.cursor/mcp.json`
|
|
99
128
|
|
|
100
129
|
CLI 示例:
|
|
101
130
|
|
|
@@ -143,6 +172,54 @@ npm run start -- skill insights
|
|
|
143
172
|
|
|
144
173
|
## 进阶能力
|
|
145
174
|
|
|
175
|
+
### 上下文压缩(v1.0 核心)
|
|
176
|
+
|
|
177
|
+
GraphFlow 的压缩采用「三层渐进」策略,先用零成本图结构压缩砍掉冗余节点,再按需用 LLM 做语义合并:
|
|
178
|
+
|
|
179
|
+
| 层 | 机制 | 成本 | 默认 |
|
|
180
|
+
| --- | --- | --- | --- |
|
|
181
|
+
| 图结构压缩 | 边权重连通子图 + PageRank 中心性重排 | 零 LLM | **开启** |
|
|
182
|
+
| 向量召回 | embedding + RRF 融合;候选 ≥200 自动用 HNSW ANN | 零 LLM | 配 embedding 时开启 |
|
|
183
|
+
| 语义压缩 | minicpm/economy LLM 聚类合并相似节点 + 长节点改写 | LLM | opt-in |
|
|
184
|
+
| RepoMap 概览 | 预算紧张时返回模块级地图 | 零 LLM | opt-in |
|
|
185
|
+
| 自适应预算 | 按任务复杂度动态调整 token 预算 | 零 LLM | opt-in |
|
|
186
|
+
|
|
187
|
+
**压缩模型策略(零额外配置)**:压缩复用 economy tier——
|
|
188
|
+
|
|
189
|
+
- 配了外部 provider(OpenAI/Anthropic/百炼)→ 自动用其 economy 模型(如 `gpt-4.1-mini`)
|
|
190
|
+
- 纯离线无外部 LLM → 自动回退内嵌 minicpm,**首次使用按需下载** GGUF 到 `~/.graphflow/models/`(约 650MB,仅一次)
|
|
191
|
+
|
|
192
|
+
配置示例:
|
|
193
|
+
|
|
194
|
+
```json
|
|
195
|
+
{
|
|
196
|
+
"graphPolicy": {
|
|
197
|
+
"compression": {
|
|
198
|
+
"enabled": true,
|
|
199
|
+
"backend": "inherit",
|
|
200
|
+
"enableGraphCompression": true,
|
|
201
|
+
"enableHnsw": true,
|
|
202
|
+
"enableRepoMapFallback": false,
|
|
203
|
+
"enableAdaptiveBudget": false,
|
|
204
|
+
"autoDownloadEmbedded": true
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
查看当前压缩模型来源:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
npm run start -- route diagnose
|
|
214
|
+
# 输出含:compression=inherit:openai/gpt-4.1-mini
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**HNSW 加速(可选依赖)**:大仓库(候选 ≥200 节点)向量召回自动使用 HNSW ANN(10~100x 提速)。需安装可选依赖:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
npm install hnswlib-node # 未安装时自动降级线性扫描,不影响功能
|
|
221
|
+
```
|
|
222
|
+
|
|
146
223
|
### SQLite / FTS5 后端
|
|
147
224
|
|
|
148
225
|
```json
|
|
@@ -189,8 +266,10 @@ const run = await orchestrate(
|
|
|
189
266
|
| Rust | `.rs` |
|
|
190
267
|
| Go | `.go` |
|
|
191
268
|
| C / C++ | `.c .h .cc .cpp .cxx .hpp .hxx` |
|
|
269
|
+
| Java | `.java` |
|
|
270
|
+
| Ruby | `.rb` |
|
|
192
271
|
|
|
193
|
-
通过 `graphPolicy.includeExtensions` 限制扫描范围。
|
|
272
|
+
通过 `graphPolicy.includeExtensions` 限制扫描范围。tree-sitter WASM 语法包随 npm 包分发;开发/发布前可执行 `npm run wasm:download` 预下载到 `wasm/`。
|
|
194
273
|
|
|
195
274
|
## 配置文件
|
|
196
275
|
|
|
@@ -200,12 +279,26 @@ const run = await orchestrate(
|
|
|
200
279
|
cp graphflow.config.example.json graphflow.config.json
|
|
201
280
|
```
|
|
202
281
|
|
|
282
|
+
### 全局 vs 项目配置
|
|
283
|
+
|
|
284
|
+
| 层级 | 路径 | 适合存放 |
|
|
285
|
+
| --- | --- | --- |
|
|
286
|
+
| 全局 | `~/.graphflow.config.json` | Provider、API Key、Smart/Economy 模型、路由策略 |
|
|
287
|
+
| 项目根 | `graphflow.config.json` | 项目专属覆盖(可选) |
|
|
288
|
+
| 项目覆盖 | `.graphflow/config.json` | 工作区局部覆盖(`graphflow init` 生成) |
|
|
289
|
+
|
|
290
|
+
**多项目重要约定**:
|
|
291
|
+
|
|
292
|
+
- 图谱文件默认写在**当前工作区**下的 `graphflow-out/graphflow-graph.json`
|
|
293
|
+
- 全局配置**不应**包含固定的 `workspaceRoot`(旧版本若已写入,请删除该字段)
|
|
294
|
+
- MCP / 脚本可通过环境变量指定工作区:`GRAPHFLOW_WORKSPACE_ROOT=/path/to/project`
|
|
295
|
+
|
|
203
296
|
关键项:
|
|
204
297
|
|
|
205
298
|
| 配置 | 说明 |
|
|
206
299
|
| --- | --- |
|
|
207
300
|
| `graphPolicy.transport` | `file` / `memory` / `sqlite` / `mcp-http` |
|
|
208
|
-
| `graphPolicy.graphStorePath` | JSON 或 `.sqlite` 路径 |
|
|
301
|
+
| `graphPolicy.graphStorePath` | 相对当前工作区的 JSON 或 `.sqlite` 路径 |
|
|
209
302
|
| `graphPolicy.maxContextTokens` | 压缩上下文预算(默认 **1500**) |
|
|
210
303
|
| `graphPolicy.autoIndexOnSave` | 保存后增量索引(默认 **true**) |
|
|
211
304
|
| `graphPolicy.autoIndexOnPreview` / `autoIndexOnRun` | preview / run 前自动索引 |
|
|
@@ -265,11 +358,22 @@ code --install-extension artifacts/graphflow-vscode-*.vsix
|
|
|
265
358
|
3. `context preview` → `summary > 0` 且 `anchors > 0`
|
|
266
359
|
4. VS Code **Show Graph** → 画布正常显示节点聚类(非角落小点)
|
|
267
360
|
5. `plan` / `run` 返回正常输出
|
|
268
|
-
|
|
269
|
-
正式测试文档:`docs/testing/2026-05-28-formal-usage-test-plan.md`
|
|
361
|
+
6. `route diagnose` → 显示 `compression=<backend>:<provider>/<model>`
|
|
270
362
|
|
|
271
363
|
## 常见问题
|
|
272
364
|
|
|
365
|
+
**切换项目后 Snapshot 显示别的仓库的图谱**
|
|
366
|
+
|
|
367
|
+
- 检查 `~/.graphflow.config.json` 是否含有旧的 `workspaceRoot`,**删除该字段**后重载窗口
|
|
368
|
+
- 在当前项目重新「建立图谱」,确认顶栏 `store` 路径指向本项目的 `graphflow-out/`
|
|
369
|
+
- 使用 v1.0.x 最新版(已修复全局 `workspaceRoot` 串项目问题)
|
|
370
|
+
|
|
371
|
+
**MCP 建图失败或索引到错误目录**
|
|
372
|
+
|
|
373
|
+
- `graphflow_index` 传入 `rootDir: "/你的项目绝对路径"`
|
|
374
|
+
- 或在 MCP 配置中加 `"env": { "GRAPHFLOW_WORKSPACE_ROOT": "/你的项目绝对路径" }`
|
|
375
|
+
- 离线环境首次索引多语言项目时,确保 `wasm/` 语法包存在或网络可访问 unpkg
|
|
376
|
+
|
|
273
377
|
**`context preview` 返回 0 anchors**
|
|
274
378
|
|
|
275
379
|
- 先执行 `graph index` 或 Settings 建图
|
|
@@ -277,8 +381,9 @@ code --install-extension artifacts/graphflow-vscode-*.vsix
|
|
|
277
381
|
|
|
278
382
|
**知识图谱面板空白或只有小点**
|
|
279
383
|
|
|
280
|
-
- 升级到 **
|
|
384
|
+
- 升级到 **v1.0.0+** 并重载窗口
|
|
281
385
|
- 点击画布工具栏 **「适应」**
|
|
386
|
+
- 注意:画布展示的是**采样子图**(约 120 节点),全库规模请看顶栏统计
|
|
282
387
|
|
|
283
388
|
**API Key 未配置**
|
|
284
389
|
|
|
@@ -300,7 +405,7 @@ GraphFlow/
|
|
|
300
405
|
│ └── surfaces/
|
|
301
406
|
│ ├── cli/ # CLI + runtime 子模块
|
|
302
407
|
│ └── mcp/ # MCP server
|
|
303
|
-
├── tests/ #
|
|
408
|
+
├── tests/ # 49 文件 / 200+ tests
|
|
304
409
|
├── vscode-extension/ # VS Code 面板与命令
|
|
305
410
|
├── docs/
|
|
306
411
|
└── CHANGELOG.md
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Six Thinking Hats + Five Whys Insight Engine.
|
|
3
|
+
*
|
|
4
|
+
* Borrowed from Edward de Bono's "Six Thinking Hats" framework —
|
|
5
|
+
* before planning a task, analyze it through 6 distinct perspectives,
|
|
6
|
+
* and auto-apply 5-level Why chains to key observations that fall
|
|
7
|
+
* below a confidence threshold.
|
|
8
|
+
*
|
|
9
|
+
* The 5 Why triggers are automatic: whenever a hat produces an
|
|
10
|
+
* observation with low certainty (< 0.6), the chain is applied to
|
|
11
|
+
* drill toward root cause.
|
|
12
|
+
*/
|
|
13
|
+
import type { TaskNode } from "../core/types";
|
|
14
|
+
import type { ModelSelection } from "../routing/model-router";
|
|
15
|
+
import { type PromptContext } from "../routing/provider-executor";
|
|
16
|
+
/** === Hat Definitions === */
|
|
17
|
+
export interface HatDefinition {
|
|
18
|
+
name: string;
|
|
19
|
+
color: "white" | "red" | "black" | "yellow" | "green" | "blue";
|
|
20
|
+
role: string;
|
|
21
|
+
focus: string;
|
|
22
|
+
question: string;
|
|
23
|
+
whyFocus: string;
|
|
24
|
+
whyRootFocus: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const SIX_HATS: HatDefinition[];
|
|
27
|
+
/** === Five Whys Chain === */
|
|
28
|
+
export interface WhyStep {
|
|
29
|
+
level: 1 | 2 | 3 | 4 | 5;
|
|
30
|
+
question: string;
|
|
31
|
+
answer: string;
|
|
32
|
+
certainty: number;
|
|
33
|
+
}
|
|
34
|
+
export interface FiveWhyResult {
|
|
35
|
+
initialObservation: string;
|
|
36
|
+
certainty: number;
|
|
37
|
+
steps: WhyStep[];
|
|
38
|
+
rootCause: string;
|
|
39
|
+
}
|
|
40
|
+
export interface WhyChainSection {
|
|
41
|
+
hat: HatDefinition;
|
|
42
|
+
/** Key observation produced by this hat */
|
|
43
|
+
observation: string;
|
|
44
|
+
certainty: number;
|
|
45
|
+
/** 5-level why chain (only non-trivial ones are expanded) */
|
|
46
|
+
whyChain: FiveWhyResult | null;
|
|
47
|
+
/** Critical findings that should influence the plan */
|
|
48
|
+
criticalInsight: string;
|
|
49
|
+
}
|
|
50
|
+
/** === Six Hats Analysis Result === */
|
|
51
|
+
export interface SixHatsInsight {
|
|
52
|
+
task: string;
|
|
53
|
+
hats: WhyChainSection[];
|
|
54
|
+
blueHatSynthesis: string;
|
|
55
|
+
rootCauses: string[];
|
|
56
|
+
criticalRisks: string[];
|
|
57
|
+
coreValue: string;
|
|
58
|
+
refinedTaskStatement: string;
|
|
59
|
+
}
|
|
60
|
+
/** === Main Entry Points === */
|
|
61
|
+
export interface PlanInsightOptions {
|
|
62
|
+
selection: ModelSelection;
|
|
63
|
+
context?: PromptContext;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Run the full Six Thinking Hats + Five Whys analysis on a task,
|
|
67
|
+
* then generate a DAG-style plan that incorporates the insights.
|
|
68
|
+
*
|
|
69
|
+
* @param task The task to analyze
|
|
70
|
+
* @param options Model selection and context options
|
|
71
|
+
*/
|
|
72
|
+
export declare function planInsight(task: string, options: PlanInsightOptions): Promise<{
|
|
73
|
+
insight: SixHatsInsight;
|
|
74
|
+
plan: TaskNode[];
|
|
75
|
+
}>;
|
|
76
|
+
/**
|
|
77
|
+
* Run the Six Thinking Hats analysis with automatic 5 Why triggers.
|
|
78
|
+
*
|
|
79
|
+
* Each hat produces an observation. If the observation's certainty
|
|
80
|
+
* is below THRESHOLD (0.6), a 5 Why chain is automatically applied.
|
|
81
|
+
*/
|
|
82
|
+
export declare function analyzeWithSixHats(task: string, options: PlanInsightOptions): Promise<SixHatsInsight>;
|
|
83
|
+
//# sourceMappingURL=insight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insight.d.ts","sourceRoot":"","sources":["../../src/agents/insight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGrF,8BAA8B;AAE9B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,EAAE,aAAa,EAuDnC,CAAC;AAEF,8BAA8B;AAE9B,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,aAAa,CAAC;IACnB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC/B,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,uCAAuC;AAEvC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,eAAe,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,gCAAgC;AAEhC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC;IACT,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC,CAID;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,CAkCzB"}
|