@roarpeng/graphflow 1.9.16 → 1.12.2

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 (90) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/README.md +9 -8
  3. package/README.zh.md +3 -2
  4. package/dist/config/resolve.d.ts +13 -1
  5. package/dist/config/resolve.d.ts.map +1 -1
  6. package/dist/config/resolve.js +29 -3
  7. package/dist/config/resolve.js.map +1 -1
  8. package/dist/config/workspace-root.d.ts +6 -0
  9. package/dist/config/workspace-root.d.ts.map +1 -1
  10. package/dist/config/workspace-root.js +3 -2
  11. package/dist/config/workspace-root.js.map +1 -1
  12. package/dist/graph/graphify-file-client.d.ts +49 -0
  13. package/dist/graph/graphify-file-client.d.ts.map +1 -1
  14. package/dist/graph/graphify-file-client.js +113 -15
  15. package/dist/graph/graphify-file-client.js.map +1 -1
  16. package/dist/graph/knowledge-extraction.d.ts +43 -0
  17. package/dist/graph/knowledge-extraction.d.ts.map +1 -0
  18. package/dist/graph/knowledge-extraction.js +274 -0
  19. package/dist/graph/knowledge-extraction.js.map +1 -0
  20. package/dist/graph/token-savings.d.ts +39 -0
  21. package/dist/graph/token-savings.d.ts.map +1 -1
  22. package/dist/graph/token-savings.js +138 -0
  23. package/dist/graph/token-savings.js.map +1 -1
  24. package/dist/learning/canary-gate.d.ts +5 -1
  25. package/dist/learning/canary-gate.d.ts.map +1 -1
  26. package/dist/learning/canary-gate.js +5 -2
  27. package/dist/learning/canary-gate.js.map +1 -1
  28. package/dist/learning/episodic-memory.d.ts.map +1 -1
  29. package/dist/learning/episodic-memory.js +19 -3
  30. package/dist/learning/episodic-memory.js.map +1 -1
  31. package/dist/learning/skill-admission.d.ts +55 -10
  32. package/dist/learning/skill-admission.d.ts.map +1 -1
  33. package/dist/learning/skill-admission.js +177 -35
  34. package/dist/learning/skill-admission.js.map +1 -1
  35. package/dist/learning/skill-flywheel.d.ts +24 -6
  36. package/dist/learning/skill-flywheel.d.ts.map +1 -1
  37. package/dist/learning/skill-flywheel.js +99 -19
  38. package/dist/learning/skill-flywheel.js.map +1 -1
  39. package/dist/learning/skill-markdown.d.ts +12 -0
  40. package/dist/learning/skill-markdown.d.ts.map +1 -0
  41. package/dist/learning/skill-markdown.js +226 -0
  42. package/dist/learning/skill-markdown.js.map +1 -0
  43. package/dist/learning/skill-store.d.ts.map +1 -1
  44. package/dist/learning/skill-store.js +23 -4
  45. package/dist/learning/skill-store.js.map +1 -1
  46. package/dist/learning/skill-types.d.ts +10 -0
  47. package/dist/learning/skill-types.d.ts.map +1 -1
  48. package/dist/learning/skill-types.js.map +1 -1
  49. package/dist/learning/workflow-skill.d.ts +2 -0
  50. package/dist/learning/workflow-skill.d.ts.map +1 -1
  51. package/dist/learning/workflow-skill.js +15 -0
  52. package/dist/learning/workflow-skill.js.map +1 -1
  53. package/dist/surfaces/cli/index.js +69 -0
  54. package/dist/surfaces/cli/index.js.map +1 -1
  55. package/dist/surfaces/cli/output.d.ts.map +1 -1
  56. package/dist/surfaces/cli/output.js +3 -0
  57. package/dist/surfaces/cli/output.js.map +1 -1
  58. package/dist/surfaces/cli/runtime/dialogue.js +3 -3
  59. package/dist/surfaces/cli/runtime/dialogue.js.map +1 -1
  60. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  61. package/dist/surfaces/cli/runtime/graph.js +14 -10
  62. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  63. package/dist/surfaces/cli/runtime/knowledge.d.ts +37 -0
  64. package/dist/surfaces/cli/runtime/knowledge.d.ts.map +1 -0
  65. package/dist/surfaces/cli/runtime/knowledge.js +162 -0
  66. package/dist/surfaces/cli/runtime/knowledge.js.map +1 -0
  67. package/dist/surfaces/cli/runtime/routing.js +3 -3
  68. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  69. package/dist/surfaces/cli/runtime/types.d.ts +6 -0
  70. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  71. package/dist/surfaces/cli/runtime.d.ts +1 -0
  72. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  73. package/dist/surfaces/cli/runtime.js +5 -1
  74. package/dist/surfaces/cli/runtime.js.map +1 -1
  75. package/dist/surfaces/mcp/server.d.ts +24 -0
  76. package/dist/surfaces/mcp/server.d.ts.map +1 -1
  77. package/dist/surfaces/mcp/server.js +265 -1
  78. package/dist/surfaces/mcp/server.js.map +1 -1
  79. package/dist/surfaces/mcp/tool-definitions.d.ts +1 -0
  80. package/dist/surfaces/mcp/tool-definitions.d.ts.map +1 -1
  81. package/dist/surfaces/mcp/tool-definitions.js +9 -1
  82. package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
  83. package/dist/surfaces/mcp/tool-handlers.d.ts +4 -1
  84. package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
  85. package/dist/surfaces/mcp/tool-handlers.js +69 -19
  86. package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
  87. package/dsh/client.js +431 -0
  88. package/dsh/plugin.mjs +766 -40
  89. package/package.json +12 -3
  90. package/plugin.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,7 +2,55 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
- ## [Unreleased]
5
+ ## [1.12.2] - 2026-08-22
6
+
7
+ ### Fixed
8
+
9
+ - **Windows release gate**:MCP structured-result 测试显式使用 file graph backend,避免 SQLite 连接仍在打开时清理临时目录导致 `EBUSY`。这是 v1.12.1 Windows validate 失败的直接根因;Linux/macOS 本地矩阵未暴露该平台锁差异。
10
+
11
+ ## [1.12.1] - 2026-08-22
12
+
13
+ ### Added
14
+
15
+ - **MCP Streamable HTTP transport**:新增 stateless JSON 与 stateful SSE 双模式;支持 MCP initialize、draft `server/discover`、ping、tools、resources 和 structured tool results。启动方式:`graphflow mcp serve --http` 或 `graphflow-mcp --http`
16
+ - **HTTP 生命周期与安全默认**:显式 DELETE 关闭 stateful session;默认仅绑定 loopback,Host 校验防止 rebinding,浏览器 Origin 默认拒绝并可用 allowlist 显式放行
17
+ - **端到端 transport 矩阵**:SDK Client 分别验证 HTTP JSON 与 stateful SSE;raw 请求验证 discovery、未知路径、非法 Origin、DELETE 后 stale session 和非 loopback 保护
18
+
19
+ ### Changed
20
+
21
+ - `@modelcontextprotocol/sdk` 固定到 1.30 runtime 面;stdio legacy handshake 继续兼容
22
+
23
+ ### Tests
24
+
25
+ - 新增 `tests/mcp-streamable-http.test.ts`;全量回归 141 文件 / 956 用例通过,扩展 bundled runtime 冒烟 7/7 通过
26
+
27
+ ## [1.12.0] - 2026-08-22
28
+
29
+ ### Added
30
+
31
+ - **dsh 知识节点面板静态化(R4 落地)**:新增预构建 CJS factory bundle `dsh/client.js`(`window.__ModuleLoader__.load({id:"@roarpeng/graphflow/dsh",factory})`,named 导出 apply+inject;注册 `conversation.session.header.utilities` 开关与 `shell.overlay` 面板两个 slot,PANEL_CSS 闭包内注入防重),随 bundle 层开机自动加载——**不再需要按会话手动激活动态插件**。数据通道走 Connection 通用 RPC:glue 注册 `/gf`(`ctx.connection.rpc.handle(…,{authority:"trusted-host"})`,自带 browser-trust fence),handler 返回 RpcResult 信封 `{ok,value:{workbench,dialogues}}`;浏览器端 `connection.rpc.call("/gf","nodes",{workspaceRoot})` 取数。package.json 叠加声明 `dsh.client{platform:"web"}` + `exports["./client"]`/`exports["./dsh/package.json"]`(后者让现有 glue 行原样成为 client 扫描条目,实测 Node 解析通过)
32
+ - **Context Fidelity 指标流(R1)**:新增 `graphflow-out/context-fidelity.json`、anchor recall@k、missing anchors 和基于归一化 LCS 的 body coverage;`FlywheelReport.fidelity` 增加 sample / recall / coverage 聚合。token savings 与信息保真度从此是两条可审计指标
33
+ - **SKILL.md 双向互操作(R2)**:新增 `skill markdown export|import`;导出只带 portable 元数据与 playbook,不带走 GraphFlow 本地信任决策;导入一律保守标记 `import/correctable`,不继承 proven 或 canary 证据
34
+ - **Engineering KG 抽取落地(R3)**:新增确定性中英文 Concept/Requirement 抽取器;CLI `knowledge extract [--all|--session] [--dry-run]` 与 MCP `graphflow_index({knowledgeExtract:true})` 可把对话结论写入图谱并保留 dialogue-turn `derived_from` 审计链
35
+ - **MCP structured results + stateless discovery**:全部工具结果继续保留 `content[0].text` 兼容层,同时返回 `structuredContent`;tool schema 声明 JSON Schema 2020-12;SDK 升级到 1.30,stdio 兼容握手之外支持 `server/discover`
36
+ - **O(1) 技能读路径 + 自适应遗忘**:`readSkillState` / `loadCompositeSkill` 优先 `getNodesByIds`;skill decay 改为陈旧度 × 失败压力 × 成功保持 × proven 保护的确定性曲线,只软衰减,不删除经验
37
+ - **学习飞轮真实证据链(R0)**:`proven` 准入从"原子出现次数 `uses>=2`"改为"成功 episode 绑定计数 `successCount>=阈值`"(默认 2,`GRAPHFLOW_SKILL_PROVEN_MIN_SUCCESS` 可覆盖;按 episodeId 去重,旧数据经 `linkedSuccess+provenance.episodeId` 自动迁移,已 proven 节点不降级);删除 `FALLBACK_GOLDEN_TOKENS` 硬编码闭集,golden 词集动态生成(检索 golden 数据集 `expectAny` + 运行时 pass episode/symbol 证据叠加 `registerGoldenEvidenceTokens`);golden-overlap/符号检查降为辅助条件,不再一票否决真实成功记录
38
+ - **dsh 对话 A 面真实回填**:修复 glue 监听器读错会话事件信封字段(assistant 消息在 `event.data.message`,旧代码读 `event.message` 恒为空)这一"回复永远待回复"的根因;重写为 `turn/end` 提交模型(`assistant/message` 按 step 只喂"本 turn 最后文本"缓冲;`turn/end` 按 (session, turn) 去重提交;interrupted/aborted 不填);回填管线 = 进程内 runtime(`captureAssistantReply`;命中 workbench topic 时追加 dialogue turn 填充,保证 A 面必闭)→ CLI 兜底(`context preview --reply` + `dialogue record --reply` 双幂等 tip 填);latest-wins 每 session 串行队列 + no-pending-turn 有界重试;`GRAPHFLOW_CAPTURE_REPLY=0` 一票关闭
39
+ - **对话节点噪声过滤扩展**:`SYSTEM_MESSAGE_SOURCE_KINDS` 黑名单新增 `subagent-settled`/`subagent-report`(子代理完成/汇报通知此前被记成用户提问的直接根因)及 `agent-instructions`/`session-reference`/`goal`/`skill-catalog`;`user` kind 白名单放行真人输入,未知来源维持 role 回退保守兜底
40
+ - **file 图存储进程内缓存(R1)**:`graphify-file-client` 按绝对路径缓存解析 store 与懒构建倒排索引(`queryByKeyword` 不再每次重建索引),mtime+size 校验失效、写路径 write-through(拷贝构建 + `readSnapshot` 浅拷贝防污染)、跨实例共享;导出测试钩子
41
+
42
+ ### Fixed
43
+
44
+ - **MCP unsafe-cwd 下工具级 rootDir 被吞(工具全灭)**:`resolveConfig()` 内部无条件先执行 `bindRuntimeWorkspaceRoot`(只认配置文件 `workspaceRoot`),MCP 服务端 cwd=家目录时在调用方 rootDir 应用前就抛 `Refusing to index unsafe workspace root`——而服务端启动日志承诺 "Pass rootDir on tools"。现在 `resolveConfig(configPath, { rootDir })` 把 rootDir 传入内部绑定(优先级 rootDir > projectWorkspaceRoot > cwd 发现不变,unsafe 安全检查不放宽);`src/surfaces/cli/runtime/{graph,dialogue,routing}.ts` 全部持有 rootDir 的调用点已接线;`resolveRuntimeWorkspaceRoot` 支持注入 `fromDir`(测试免 `process.chdir`)
45
+
46
+ ### Tests
47
+
48
+ - `tests/resolve-config-rootdir.test.ts`(新增 6 用例):unsafe cwd + rootDir 不抛错且绑定生效;不传 rootDir 保持抛错;显式 configPath 分支;`fromDir` 注入向上发现
49
+ - `tests/dsh-plugin-glue.test.ts`:reply 断言重写到 turn/end 提交模型(信封形状、按 turn 去重重放无副作用、aborted/interrupted 跳过、CLI 兜底双 spawn 参数与 cwd)
50
+ - `tests/graphify-file-client-cache.test.ts`(新增 9 用例)+ `auto-transport` / `auto-transport-fallback`(+5):缓存命中/外部变更失效/仅 mtime 失效/写透三方一致/交错读写、sqlite 不可用与初始化失败静默回退
51
+ - `tests/m-learning-success-evidence.test.ts`(新增 9 用例);更新 5 个编码旧 `uses>=2→proven` 规则的测试
52
+ - 全量回归:140 文件 / 953 用例全绿;`tsc --noEmit` 零错误
53
+ - v1.12 新增回归:context fidelity、SKILL.md round-trip、Engineering KG extraction、structuredContent/stateless discovery、O(1) skill read、adaptive decay
6
54
 
7
55
  ## [1.9.16] - 2026-08-21
8
56
 
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  English | [中文](README.zh.md)
4
4
 
5
- [![npm version](https://img.shields.io/badge/npm-1.9.16-blue)](https://www.npmjs.com/package/@roarpeng/graphflow)
5
+ [![npm version](https://img.shields.io/badge/npm-1.12.2-blue)](https://www.npmjs.com/package/@roarpeng/graphflow)
6
6
 
7
7
  > **The memory & context harness for coding agents.** Local-first code knowledge graph · bounded context compression (~98% token savings) · cross-session learning flywheel.
8
8
 
@@ -84,7 +84,7 @@ Single-purpose tools each do one thing well; GraphFlow combines graph + compress
84
84
 
85
85
  > The differentiator is the **learning flywheel**: graph indexing and token compression are replicable; project-private experience (skills, lessons, decisions) accumulated across sessions is not — it compounds with use. Serena is a complement, not a competitor — see [GraphFlow + Serena: better together](docs/comparison.md#graphflow--serena-better-together联合方案).
86
86
 
87
- ## Core capabilities (v1.7.15+)
87
+ ## Core capabilities (v1.12+)
88
88
 
89
89
  | Module | Capability |
90
90
  | --- | --- |
@@ -92,16 +92,16 @@ Single-purpose tools each do one thing well; GraphFlow combines graph + compress
92
92
  | **Goal alignment** | Goal anchor nodes (intent five-tuple as first-class citizen, original requirement auto-injected); low-confidence clarification gate (no plan below 0.6); runtime alignment-check; deviation classification (misread-requirement / scope-creep / tech-drift); goal version chain + diffs |
93
93
  | **Knowledge graph** | 12-language AST indexing; File / Module / Symbol + **Concept / Requirement**; cross-layer edges `documents` / `implements` / `derived_from`; Office/PDF → Markdown via optional **`@firecrawl/anydoc`** (MIT). **CLI/npm**: optionalDependency. **VSIX**: not bundled; on activate the extension **auto-downloads the current-OS binary** into `~/.graphflow/optional-deps` when `graphflow.downloadAnydoc` is true (default). Disable the setting to skip network; source indexing still works. |
94
94
  | **Context compression** | L1/L2/L3 layered anchors; graph compression (edge weights + PageRank, LRU cache); stem-matching recall (orchestrate ↔ orchestration); vector recall + RRF; RepoMap overview; adaptive budget |
95
- | **Retrieval quality** | Golden-set regression gate (132 queries, Hit@5=100%, MRR=0.836, NDCG@5=0.601) |
95
+ | **Retrieval & fidelity** | Golden-set regression gate (132 queries, Hit@5=100%, MRR=0.836, NDCG@5=0.601); separate anchor-recall and normalized body-coverage metrics persisted beside token savings |
96
96
  | **Vector index** | In-process memoization + disk persistence (fingerprint-checked, seconds to restore after MCP restart) |
97
97
  | **Storage backends** | `file` / `memory` / `sqlite` (FTS5, tokenizer-enhanced `searchtext`, camelCase searchable) / **`auto` (sqlite-first with fallback)** / `mcp-http` |
98
- | **Learning flywheel** | Episodic memory, reflection, skill nodes (score ±1, bounded [-20,20]), nightly training, skill decay/pruning, **auto-capture + Claude Code hooks (on by default)**, **SkillOpt-lite** bounded guidance edits, four-class lifecycle + **canary gate for synced skills**, `npm run backfill:episodes`, contribution reports (`skill report` / `graphflow_diagnose` / `route diagnose`) |
98
+ | **Learning flywheel** | Episodic memory, reflection, skill nodes (score ±1, bounded [-20,20]), nightly training, adaptive evidence-aware forgetting, **auto-capture + Claude Code hooks (on by default)**, **SkillOpt-lite** bounded guidance edits, four-class lifecycle + **canary gate for synced skills**, portable SKILL.md import/export, `npm run backfill:episodes`, contribution reports (`skill report` / `graphflow_diagnose` / `route diagnose`) |
99
99
  | **Team sharing** | `skill sync`: export/import skill packs to a committable `.graphflow/skills/team-skills.json`; imports are a **bidirectional MERGE** (per-skill-id union, newer `updatedAt` wins, ties keep local, local-only skills preserved; `--force` to overwrite); golden retrieval queries round-trip via `.graphflow/team-golden.json`; [security model](docs/team-memory-security.md) |
100
100
  | **Benchmarks** | [Comprehensive 92.9%](benchmarks/COMPREHENSIVE-RESULTS.md) · [Independent-style 96.2%](benchmarks/INDEPENDENT-RESULTS.md) · [context-readiness eval](benchmarks/SWE-BENCH-RESULTS.md) · [98.2% token savings](benchmarks/RESULTS.md) |
101
101
  | **Model routing** | Smart / Economy tiers; multi-provider health probes and fallback (DeepSeek, OpenAI, Anthropic, Bailian, Doubao) |
102
102
  | **Workbench** | Plan DAG seeds function-topic containers; collapsed outline; click `topicId` to resume; drift forks a side branch; original Q/A stored via `assistantReply` |
103
103
  | **Observability** | `graphflow_diagnose` / `route diagnose`: provider health + graph stats + token savings + **flywheel health** (auto-capture, episodes, skills by class, session journal) + workbench outline |
104
- | **Agent surfaces** | CLI `--json`; MCP stdio (10 tools); auto-install into 15+ agents (incl. **Codex Windows NODE/NPX_CLI short-path MCP**) |
104
+ | **Agent surfaces** | CLI `--json`; MCP stdio and Streamable HTTP (stateless JSON or stateful SSE, 10 tools); auto-install into 15+ agents (incl. **Codex Windows NODE/NPX_CLI short-path MCP**) |
105
105
  | **Engineering quality** | TypeScript strict; vitest suite; `npm run ci` includes extension packaging and smoke tests |
106
106
 
107
107
  ### Positioning
@@ -117,7 +117,7 @@ Single-purpose tools each do one thing well; GraphFlow combines graph + compress
117
117
  | `graphflow_run` | Orchestration + bridge execution descriptor |
118
118
  | `graphflow_report_outcome` | Outcome backfill (incl. deviation classification), closes the learning flywheel |
119
119
  | `graphflow_insight` | ATP insight submit / merge (agent bridge protocol) |
120
- | `graphflow_index` | Incremental / full indexing |
120
+ | `graphflow_index` | Incremental / full indexing; optional `knowledgeExtract: true` distills dialogue turns into Concept / Requirement nodes with provenance edges |
121
121
  | `graphflow_skill_insights` | Skill insights |
122
122
  | `graphflow_diagnose` | Diagnostics (provider + graph + token savings + flywheel + `graph.workbenchOutline`) |
123
123
  | `graphflow_artifact` | Graph artifact import / export |
@@ -149,6 +149,7 @@ graphflow workbench tree --json # on-demand function DAG + side branc
149
149
  graphflow run "update readme" # orchestrate (bridge)
150
150
  graphflow skill insights # skill insights
151
151
  graphflow skill report # flywheel contribution report
152
+ graphflow mcp serve --http # stateless MCP Streamable HTTP (add --stateful for SSE sessions)
152
153
  graphflow skill sync export # export team skill pack + golden queries (share via git)
153
154
  graphflow skill sync import # import team skill pack (MERGE; --force to overwrite) + golden merge into .graphflow/team-golden.json
154
155
  graphflow route diagnose # routing diagnostics
@@ -299,7 +300,7 @@ npm install
299
300
  npm run ci # lint + build + tests + extension packaging + smoke
300
301
  ```
301
302
 
302
- Requires Node.js ≥ 20, npm ≥ 10. Expected: lint clean, build succeeds, 692 tests pass.
303
+ Requires Node.js ≥ 20, npm ≥ 10. Expected: lint clean, build succeeds, 956 tests pass.
303
304
 
304
305
  ## Project structure
305
306
 
@@ -319,7 +320,7 @@ GraphFlow/
319
320
  │ └── surfaces/
320
321
  │ ├── cli/ # CLI + runtime
321
322
  │ └── mcp/ # MCP server (10 tools)
322
- ├── tests/ # 99 files / 692 tests (incl. retrieval golden set, bridge+DAG)
323
+ ├── tests/ # 141 files / 956 tests (incl. fidelity, SKILL.md, Engineering KG, MCP HTTP/stdio matrix)
323
324
  ├── benchmarks/ # comprehensive + independent + SWE-bench + token savings + skill A/B (reproducible)
324
325
  ├── docs/ # ATP spec + context contract + experience memory + comparisons
325
326
  ├── vscode-extension/ # VS Code panel and commands
package/README.zh.md CHANGED
@@ -2,17 +2,18 @@
2
2
 
3
3
  [English](README.md) | 中文
4
4
 
5
- [![npm version](https://img.shields.io/badge/npm-1.9.16-blue)](https://www.npmjs.com/package/@roarpeng/graphflow)
5
+ [![npm version](https://img.shields.io/badge/npm-1.12.2-blue)](https://www.npmjs.com/package/@roarpeng/graphflow)
6
6
 
7
7
  > **给编程 Agent 用的记忆与上下文 harness。** 本地优先的代码知识图谱 · 有界上下文压缩(约 98% token 节省) · 跨会话学习飞轮。
8
8
 
9
- GraphFlow 把 **记忆 + hooks + skills** 做成可移植的 MCP 表面(Cursor、Claude Code、DeepSeek Harness、15+ Agent),让无状态模型变成可长期工作的编码助手。纯 TypeScript/Node,CLI + MCP + VS Code 扩展,完全离线,无需 API Key。
9
+ GraphFlow 把 **记忆 + hooks + skills** 做成可移植的 MCP 表面(Cursor、Claude Code、DeepSeek Harness、15+ Agent),让无状态模型变成可长期工作的编码助手。v1.12 增加 fidelity 指标、SKILL.md 互操作和 Concept / Requirement 工程知识层。纯 TypeScript/Node,CLI + MCP + VS Code 扩展,完全离线,无需 API Key。
10
10
 
11
11
  ## 快速开始
12
12
 
13
13
  ```bash
14
14
  npx @roarpeng/graphflow graph index .
15
15
  npx @roarpeng/graphflow context preview "orchestrator" --json
16
+ graphflow mcp serve --http # MCP Streamable HTTP(默认 stateless;--stateful 开启 SSE session)
16
17
  npx @roarpeng/graphflow install # 自动接入已检测到的 Agent(含 dsh)
17
18
  ```
18
19
 
@@ -3,5 +3,17 @@ import type { GraphFlowConfig } from "./schema";
3
3
  export declare function resolveConfigPath(path?: string): string;
4
4
  /** Path used when persisting settings; defaults to global unless a project root config already exists. */
5
5
  export declare function resolveWritableConfigPath(path?: string): string;
6
- export declare function resolveConfig(path?: string): GraphFlowConfig;
6
+ /**
7
+ * Resolve the effective GraphFlow config for the current process.
8
+ *
9
+ * @param path Explicit config path; default resolves project/global/overlay layers.
10
+ * @param bind Optional workspace-root override, forwarded into the internal
11
+ * `bindRuntimeWorkspaceRoot` so a caller-provided `rootDir` (e.g. an MCP tool
12
+ * argument) takes priority over `projectWorkspaceRoot` and over discovery
13
+ * from an unsafe `process.cwd()` (home dir / AppData), instead of throwing
14
+ * "Refusing to index unsafe workspace root" before the override is applied.
15
+ */
16
+ export declare function resolveConfig(path?: string, bind?: {
17
+ rootDir?: string;
18
+ }): GraphFlowConfig;
7
19
  //# sourceMappingURL=resolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAchD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,SAA0B,GAAG,MAAM,CAqBxE;AAED,0GAA0G;AAC1G,wBAAgB,yBAAyB,CAAC,IAAI,SAA0B,GAAG,MAAM,CAWhF;AAOD,wBAAgB,aAAa,CAAC,IAAI,SAA0B,GAAG,eAAe,CAgD7E"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAchD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,IAAI,SAA0B,GAAG,MAAM,CAqBxE;AAED,0GAA0G;AAC1G,wBAAgB,yBAAyB,CAAC,IAAI,SAA0B,GAAG,MAAM,CAWhF;AAOD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,IAAI,SAA0B,EAC9B,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,eAAe,CAgDjB"}
@@ -50,14 +50,24 @@ function finalizeConfig(config) {
50
50
  (0, provider_env_1.applyProviderEnvFromConfig)(config);
51
51
  return config;
52
52
  }
53
- function resolveConfig(path = "graphflow.config.json") {
53
+ /**
54
+ * Resolve the effective GraphFlow config for the current process.
55
+ *
56
+ * @param path Explicit config path; default resolves project/global/overlay layers.
57
+ * @param bind Optional workspace-root override, forwarded into the internal
58
+ * `bindRuntimeWorkspaceRoot` so a caller-provided `rootDir` (e.g. an MCP tool
59
+ * argument) takes priority over `projectWorkspaceRoot` and over discovery
60
+ * from an unsafe `process.cwd()` (home dir / AppData), instead of throwing
61
+ * "Refusing to index unsafe workspace root" before the override is applied.
62
+ */
63
+ function resolveConfig(path = "graphflow.config.json", bind) {
54
64
  if (!isDefaultProjectConfigPath(path)) {
55
65
  const result = (0, loader_1.loadConfigSafe)(path);
56
66
  if (result.usedFallback && result.error) {
57
67
  logger_1.logger.warn({ path: result.configPath, error: result.error }, "Using default config for explicit path");
58
68
  }
59
69
  const projectRoot = result.config.graphPolicy.workspaceRoot;
60
- return finalizeConfig((0, workspace_root_1.bindRuntimeWorkspaceRoot)(result.config, projectRoot ? { projectWorkspaceRoot: projectRoot } : undefined));
70
+ return finalizeConfig((0, workspace_root_1.bindRuntimeWorkspaceRoot)(result.config, mergeRuntimeWorkspaceBind(bind, projectRoot)));
61
71
  }
62
72
  const globalPath = (0, scaffold_1.resolveGlobalConfigPath)();
63
73
  const base = (0, node_fs_1.existsSync)(globalPath) ? loadLayer(globalPath) : (0, defaults_1.getDefaultConfig)();
@@ -85,7 +95,23 @@ function resolveConfig(path = "graphflow.config.json") {
85
95
  else {
86
96
  merged = base;
87
97
  }
88
- return finalizeConfig((0, workspace_root_1.bindRuntimeWorkspaceRoot)(merged, projectWorkspaceRoot ? { projectWorkspaceRoot } : undefined));
98
+ return finalizeConfig((0, workspace_root_1.bindRuntimeWorkspaceRoot)(merged, mergeRuntimeWorkspaceBind(bind, projectWorkspaceRoot)));
99
+ }
100
+ /**
101
+ * Merge the caller-provided `rootDir` override with the project-level
102
+ * `workspaceRoot` for the internal bind. `rootDir` is listed first so
103
+ * `resolveRuntimeWorkspaceRoot`'s existing priority applies: explicit rootDir
104
+ * wins over projectWorkspaceRoot. Returns undefined when neither is present
105
+ * (equivalent to the historical no-options call).
106
+ */
107
+ function mergeRuntimeWorkspaceBind(bind, projectWorkspaceRoot) {
108
+ const merged = {
109
+ ...(bind?.rootDir ? { rootDir: bind.rootDir } : {}),
110
+ ...(projectWorkspaceRoot ? { projectWorkspaceRoot } : {}),
111
+ };
112
+ return merged.rootDir !== undefined || merged.projectWorkspaceRoot !== undefined
113
+ ? merged
114
+ : undefined;
89
115
  }
90
116
  function loadLayer(path) {
91
117
  const result = (0, loader_1.loadConfigSafe)(path);
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/config/resolve.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,12 @@ import type { GraphFlowConfig } from "./schema";
2
2
  export declare function resolveRuntimeWorkspaceRoot(options?: {
3
3
  rootDir?: string;
4
4
  projectWorkspaceRoot?: string;
5
+ /**
6
+ * Injectable working directory used for upward discovery and the final cwd
7
+ * fallback. Defaults to process.cwd(). Lets tests exercise unsafe-cwd paths
8
+ * without process.chdir() (which races under parallel test workers).
9
+ */
10
+ fromDir?: string;
5
11
  }): string;
6
12
  export declare function bindRuntimeWorkspaceRoot(config: GraphFlowConfig, options?: {
7
13
  rootDir?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-root.d.ts","sourceRoot":"","sources":["../../src/config/workspace-root.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAiChD,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,MAAM,CAkDT;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,GACA,eAAe,CASjB;AAED,wEAAwE;AACxE,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAM3F"}
1
+ {"version":3,"file":"workspace-root.d.ts","sourceRoot":"","sources":["../../src/config/workspace-root.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAiChD,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAoDT;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,eAAe,EACvB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,GACA,eAAe,CASjB;AAED,wEAAwE;AACxE,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAM3F"}
@@ -46,14 +46,15 @@ function resolveRuntimeWorkspaceRoot(options) {
46
46
  if (options?.projectWorkspaceRoot?.trim()) {
47
47
  return assertSafeWorkspaceRoot(options.projectWorkspaceRoot.trim(), "projectWorkspaceRoot");
48
48
  }
49
- const discovered = (0, discover_workspace_1.discoverWorkspaceRoot)(process.cwd());
49
+ const baseDir = options?.fromDir?.trim() ? (0, node_path_1.resolve)(options.fromDir.trim()) : process.cwd();
50
+ const discovered = (0, discover_workspace_1.discoverWorkspaceRoot)(baseDir);
50
51
  if (discovered) {
51
52
  // Defense in depth: discovery must never surface home/AppData. Skip if it does.
52
53
  if (!(0, discover_workspace_1.isUnsafeWorkspaceFallback)(discovered)) {
53
54
  return (0, node_path_1.resolve)(discovered);
54
55
  }
55
56
  }
56
- const cwd = (0, node_path_1.resolve)(process.cwd());
57
+ const cwd = (0, node_path_1.resolve)(baseDir);
57
58
  if ((0, discover_workspace_1.isUsableWorkspaceFallback)(cwd)) {
58
59
  return cwd;
59
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-root.js","sourceRoot":"","sources":["../../src/config/workspace-root.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-root.js","sourceRoot":"","sources":["../../src/config/workspace-root.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,44 @@ interface GraphStore {
3
3
  nodes: GraphNode[];
4
4
  edges: GraphEdge[];
5
5
  }
6
+ /** Recorded file identity used to validate a cache entry (mtime + size). */
7
+ interface FileStat {
8
+ mtimeMs: number;
9
+ size: number;
10
+ }
11
+ /**
12
+ * One cache entry per absolute store path.
13
+ *
14
+ * - `store` is the parsed graph object. Internal write paths never mutate it
15
+ * (they build a fresh object and pass it to writeStore), and readSnapshot
16
+ * returns a shallow copy, so the shared entry cannot be corrupted by callers.
17
+ * - `index` is the inverted index over `store.nodes`' searchable text; it is
18
+ * built lazily on the first keyword query and reset to null on every write.
19
+ * - `stat` is the {mtimeMs, size} of the file when the entry was recorded
20
+ * (null when the file did not exist at that moment).
21
+ */
22
+ interface StoreCacheEntry {
23
+ store: GraphStore;
24
+ index: Map<string, Set<string>> | null;
25
+ stat: FileStat | null;
26
+ }
27
+ /**
28
+ * Process-wide store cache keyed by the absolute store path, so every
29
+ * GraphifyFileClient instance pointing at the same file (the context-slicer
30
+ * reads snapshots several times per request) shares one parsed store + index
31
+ * instead of re-reading + re-parsing the whole graph JSON each time.
32
+ *
33
+ * Entries are validated with a cheap statSync (mtime + size) on every read, so
34
+ * external writes are picked up; our own writes update the entry write-through.
35
+ *
36
+ * Exported for tests (introspection / reset); production code should treat it
37
+ * as an internal detail.
38
+ */
39
+ export declare const graphifyFileStoreCache: Map<string, StoreCacheEntry>;
40
+ /** Test-only: number of times a store file was actually read from disk. */
41
+ export declare function getGraphifyFileStoreParseCount(): number;
42
+ /** Test-only: drop every cached entry and reset the parse counter. */
43
+ export declare function resetGraphifyFileStoreCacheForTests(): void;
6
44
  export declare class GraphifyFileClient {
7
45
  private readonly storePath;
8
46
  constructor(storePath: string);
@@ -17,7 +55,18 @@ export declare class GraphifyFileClient {
17
55
  }[]>;
18
56
  private buildIndex;
19
57
  private readStore;
58
+ /**
59
+ * Return the validated cache entry for this store path: a cheap statSync
60
+ * against the recorded mtime+size decides between a cache hit and a full
61
+ * read + JSON.parse. All cache operations are synchronous, and every public
62
+ * method runs its whole body without yielding, so no async gap can observe
63
+ * a half-updated entry (single-threaded safety).
64
+ */
65
+ private readStoreEntry;
66
+ private parseStoreFile;
20
67
  private writeStore;
68
+ /** Record the freshly written store (and its on-disk stat) in the cache. */
69
+ private updateCacheAfterWrite;
21
70
  private edgeKey;
22
71
  deleteNode(id: string): Promise<void>;
23
72
  deleteNodes(ids: string[]): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"graphify-file-client.d.ts","sourceRoot":"","sources":["../../src/graph/graphify-file-client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1D,UAAU,UAAU;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAExC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAepD,YAAY,IAAI,UAAU;IAIpB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAkBnD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMlD,YAAY,CAChB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,EACnC,SAAS,GAAE,KAAK,GAAG,IAAI,GAAG,MAAe,GACxC,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;KAAE,EAAE,CAAC;IAiC7D,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,SAAS;IA4BjB,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,OAAO;IAIT,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAO3F"}
1
+ {"version":3,"file":"graphify-file-client.d.ts","sourceRoot":"","sources":["../../src/graph/graphify-file-client.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAI1D,UAAU,UAAU;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,4EAA4E;AAC5E,UAAU,QAAQ;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;GAUG;AACH,UAAU,eAAe;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IACvC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,8BAAqC,CAAC;AAIzE,2EAA2E;AAC3E,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD;AAED,sEAAsE;AACtE,wBAAgB,mCAAmC,IAAI,IAAI,CAG1D;AAsBD,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAExC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpD,YAAY,IAAI,UAAU;IAMpB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0BnD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAMlD,YAAY,CAChB,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,EACnC,SAAS,GAAE,KAAK,GAAG,IAAI,GAAG,MAAe,GACxC,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;KAAE,EAAE,CAAC;IAiC7D,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,SAAS;IAIjB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,cAAc;IA6BtB,OAAO,CAAC,UAAU;IAgClB,4EAA4E;IAC5E,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,OAAO;IAIT,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAS3F"}
@@ -1,11 +1,56 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GraphifyFileClient = void 0;
3
+ exports.GraphifyFileClient = exports.graphifyFileStoreCache = void 0;
4
+ exports.getGraphifyFileStoreParseCount = getGraphifyFileStoreParseCount;
5
+ exports.resetGraphifyFileStoreCacheForTests = resetGraphifyFileStoreCacheForTests;
4
6
  const node_crypto_1 = require("node:crypto");
5
7
  const node_fs_1 = require("node:fs");
6
8
  const node_path_1 = require("node:path");
7
9
  const logger_1 = require("../utils/logger");
8
10
  const graph_utils_1 = require("./graph-utils");
11
+ /**
12
+ * Process-wide store cache keyed by the absolute store path, so every
13
+ * GraphifyFileClient instance pointing at the same file (the context-slicer
14
+ * reads snapshots several times per request) shares one parsed store + index
15
+ * instead of re-reading + re-parsing the whole graph JSON each time.
16
+ *
17
+ * Entries are validated with a cheap statSync (mtime + size) on every read, so
18
+ * external writes are picked up; our own writes update the entry write-through.
19
+ *
20
+ * Exported for tests (introspection / reset); production code should treat it
21
+ * as an internal detail.
22
+ */
23
+ exports.graphifyFileStoreCache = new Map();
24
+ let graphifyFileStoreParseCount = 0;
25
+ /** Test-only: number of times a store file was actually read from disk. */
26
+ function getGraphifyFileStoreParseCount() {
27
+ return graphifyFileStoreParseCount;
28
+ }
29
+ /** Test-only: drop every cached entry and reset the parse counter. */
30
+ function resetGraphifyFileStoreCacheForTests() {
31
+ exports.graphifyFileStoreCache.clear();
32
+ graphifyFileStoreParseCount = 0;
33
+ }
34
+ function statIfExists(absPath) {
35
+ try {
36
+ const st = (0, node_fs_1.statSync)(absPath);
37
+ return { mtimeMs: st.mtimeMs, size: st.size };
38
+ }
39
+ catch (error) {
40
+ const code = error.code;
41
+ // Missing file (or a path component that is not a directory) => "no store yet".
42
+ if (code === "ENOENT" || code === "ENOTDIR") {
43
+ return null;
44
+ }
45
+ // Permission errors etc. must surface exactly like readFileSync would.
46
+ throw error;
47
+ }
48
+ }
49
+ function sameStat(a, b) {
50
+ if (a === null || b === null)
51
+ return a === b;
52
+ return a.mtimeMs === b.mtimeMs && a.size === b.size;
53
+ }
9
54
  class GraphifyFileClient {
10
55
  storePath;
11
56
  constructor(storePath) {
@@ -19,32 +64,41 @@ class GraphifyFileClient {
19
64
  }
20
65
  this.writeStore({
21
66
  nodes: Array.from(map.values()),
22
- edges: store.edges,
67
+ edges: [...store.edges],
23
68
  });
24
69
  }
25
70
  async upsertEdges(edges) {
26
71
  const store = this.readStore();
27
- const edgeKeys = new Set(store.edges.map((edge) => this.edgeKey(edge)));
72
+ const next = { nodes: [...store.nodes], edges: [...store.edges] };
73
+ const edgeKeys = new Set(next.edges.map((edge) => this.edgeKey(edge)));
28
74
  for (const edge of edges) {
29
75
  const key = this.edgeKey(edge);
30
76
  if (!edgeKeys.has(key)) {
31
77
  edgeKeys.add(key);
32
- store.edges.push(edge);
78
+ next.edges.push(edge);
33
79
  }
34
80
  }
35
- this.writeStore(store);
81
+ this.writeStore(next);
36
82
  }
37
83
  readSnapshot() {
38
- return this.readStore();
84
+ const { store } = this.readStoreEntry();
85
+ // Shallow copy so callers can never corrupt the shared cache entry.
86
+ return { nodes: [...store.nodes], edges: [...store.edges] };
39
87
  }
40
88
  async queryByKeyword(query) {
41
- const store = this.readStore();
89
+ const entry = this.readStoreEntry();
90
+ const store = entry.store;
42
91
  const tokens = (0, graph_utils_1.tokenizeForIndex)(query);
43
92
  if (tokens.length === 0) {
44
93
  const normalized = query.toLowerCase();
45
94
  return store.nodes.filter((node) => (0, graph_utils_1.nodeSearchableText)(node).toLowerCase().includes(normalized));
46
95
  }
47
- const index = this.buildIndex(store.nodes);
96
+ // The inverted index is stored on the cache entry, so repeated keyword
97
+ // queries over an unchanged store do not re-tokenize every node.
98
+ if (!entry.index) {
99
+ entry.index = this.buildIndex(store.nodes);
100
+ }
101
+ const index = entry.index;
48
102
  const matched = new Set();
49
103
  for (const tok of tokens) {
50
104
  const ids = index.get(tok);
@@ -106,10 +160,33 @@ class GraphifyFileClient {
106
160
  return index;
107
161
  }
108
162
  readStore() {
109
- if (!(0, node_fs_1.existsSync)(this.storePath)) {
163
+ return this.readStoreEntry().store;
164
+ }
165
+ /**
166
+ * Return the validated cache entry for this store path: a cheap statSync
167
+ * against the recorded mtime+size decides between a cache hit and a full
168
+ * read + JSON.parse. All cache operations are synchronous, and every public
169
+ * method runs its whole body without yielding, so no async gap can observe
170
+ * a half-updated entry (single-threaded safety).
171
+ */
172
+ readStoreEntry() {
173
+ const absPath = (0, node_path_1.resolve)(this.storePath);
174
+ const current = statIfExists(absPath);
175
+ const cached = exports.graphifyFileStoreCache.get(absPath);
176
+ if (cached && sameStat(cached.stat, current)) {
177
+ return cached;
178
+ }
179
+ const store = current === null ? { nodes: [], edges: [] } : this.parseStoreFile(absPath);
180
+ const entry = { store, index: null, stat: current };
181
+ exports.graphifyFileStoreCache.set(absPath, entry);
182
+ return entry;
183
+ }
184
+ parseStoreFile(absPath) {
185
+ if (!(0, node_fs_1.existsSync)(absPath)) {
110
186
  return { nodes: [], edges: [] };
111
187
  }
112
- const raw = (0, node_fs_1.readFileSync)(this.storePath, "utf8");
188
+ const raw = (0, node_fs_1.readFileSync)(absPath, "utf8");
189
+ graphifyFileStoreParseCount += 1;
113
190
  if (!raw.trim()) {
114
191
  return { nodes: [], edges: [] };
115
192
  }
@@ -140,6 +217,10 @@ class GraphifyFileClient {
140
217
  for (let i = 0; i < maxRetries; i++) {
141
218
  try {
142
219
  (0, node_fs_1.renameSync)(tempPath, this.storePath);
220
+ // Write-through: only after the rename succeeded does the cache move to
221
+ // the new store. On failure the previous entry (matching the untouched
222
+ // file on disk) stays valid.
223
+ this.updateCacheAfterWrite(store);
143
224
  return;
144
225
  }
145
226
  catch (error) {
@@ -153,6 +234,20 @@ class GraphifyFileClient {
153
234
  }
154
235
  }
155
236
  }
237
+ /** Record the freshly written store (and its on-disk stat) in the cache. */
238
+ updateCacheAfterWrite(store) {
239
+ const absPath = (0, node_path_1.resolve)(this.storePath);
240
+ let stat = null;
241
+ try {
242
+ const st = (0, node_fs_1.statSync)(absPath);
243
+ stat = { mtimeMs: st.mtimeMs, size: st.size };
244
+ }
245
+ catch {
246
+ // Extremely unlikely immediately after rename; leave stat null so the
247
+ // next read re-validates from disk.
248
+ }
249
+ exports.graphifyFileStoreCache.set(absPath, { store, index: null, stat });
250
+ }
156
251
  edgeKey(edge) {
157
252
  return `${edge.from}::${edge.relation}::${edge.to}`;
158
253
  }
@@ -164,14 +259,17 @@ class GraphifyFileClient {
164
259
  return;
165
260
  const idSet = new Set(ids);
166
261
  const store = this.readStore();
167
- store.nodes = store.nodes.filter((n) => !idSet.has(n.id));
168
- store.edges = store.edges.filter((e) => !(idSet.has(e.from) || idSet.has(e.to)));
169
- this.writeStore(store);
262
+ this.writeStore({
263
+ nodes: store.nodes.filter((n) => !idSet.has(n.id)),
264
+ edges: store.edges.filter((e) => !(idSet.has(e.from) || idSet.has(e.to))),
265
+ });
170
266
  }
171
267
  async deleteEdge(from, to, relation) {
172
268
  const store = this.readStore();
173
- store.edges = store.edges.filter((e) => !(e.from === from && e.to === to && e.relation === relation));
174
- this.writeStore(store);
269
+ this.writeStore({
270
+ nodes: [...store.nodes],
271
+ edges: store.edges.filter((e) => !(e.from === from && e.to === to && e.relation === relation)),
272
+ });
175
273
  }
176
274
  }
177
275
  exports.GraphifyFileClient = GraphifyFileClient;
@@ -1 +1 @@
1
- {"version":3,"file":"graphify-file-client.js","sourceRoot":"","sources":["../../src/graph/graphify-file-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graphify-file-client.js","sourceRoot":"","sources":["../../src/graph/graphify-file-client.ts"],"names":[],"mappings":"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"}