@sanqianx/project-knowledge 5.0.23 → 5.0.25

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 (401) hide show
  1. package/.agents/plugins/marketplace.json +20 -20
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/CHANGELOG.md +1361 -1346
  4. package/LICENSE +201 -201
  5. package/NOTICE +5 -5
  6. package/README.md +349 -349
  7. package/_modules/knowledge-engine/package.json +1 -1
  8. package/_modules/knowledge-engine/src/coordinator.js +48 -3
  9. package/_modules/knowledge-engine/src/runtime/automation-config.js +140 -140
  10. package/_modules/knowledge-engine/src/runtime/commit-conversation-binder.js +238 -238
  11. package/_modules/knowledge-engine/src/runtime/commit-processing-ledger.js +26 -26
  12. package/_modules/knowledge-engine/src/runtime/commit-prompt.js +193 -193
  13. package/_modules/knowledge-engine/src/runtime/commit-reconciler.js +394 -394
  14. package/_modules/knowledge-engine/src/runtime/contracts.js +282 -282
  15. package/_modules/knowledge-engine/src/runtime/conversation-store.js +389 -389
  16. package/_modules/knowledge-engine/src/runtime/evidence-bundle.js +228 -228
  17. package/_modules/knowledge-engine/src/runtime/git-runner.js +62 -62
  18. package/_modules/knowledge-engine/src/runtime/knowledge-promotion.js +505 -505
  19. package/_modules/knowledge-engine/src/runtime/knowledge-retrieval-service.js +400 -400
  20. package/_modules/knowledge-engine/src/runtime/markdown-knowledge-indexer.js +171 -171
  21. package/_modules/knowledge-engine/src/runtime/scanner.js +298 -298
  22. package/_modules/knowledge-engine/ui/app.js +23 -2
  23. package/_site/README.md +30 -30
  24. package/_site/_test/agent-capture-mcp-ui-test.js +68 -68
  25. package/_site/_test/agent-capture-ui-test.js +101 -101
  26. package/_site/_test/ai-profile-resolver-test.js +137 -137
  27. package/_site/_test/ai-profile-test.js +75 -75
  28. package/_site/_test/ai-vendor-presets-test.js +91 -91
  29. package/_site/_test/automatic-context-test.js +70 -70
  30. package/_site/_test/automation-queue-test.js +14 -14
  31. package/_site/_test/automation-ui-test.js +40 -40
  32. package/_site/_test/background-task-registry-test.js +43 -43
  33. package/_site/_test/baseline-schema-test.js +91 -91
  34. package/_site/_test/bin-cli-test.js +230 -230
  35. package/_site/_test/bridge-adapter-test.js +95 -95
  36. package/_site/_test/bridge-consumer-service-test.js +310 -310
  37. package/_site/_test/candidate-bin-content-test.js +35 -35
  38. package/_site/_test/candidate-product-assets-test.js +13 -13
  39. package/_site/_test/candidate-release-contract-test.js +14 -14
  40. package/_site/_test/capture-hook-dedup-test.js +158 -158
  41. package/_site/_test/cdp-browser-failure-test.js +103 -103
  42. package/_site/_test/chat-claudecodeui-match-test.js +92 -92
  43. package/_site/_test/claude-executable-discovery-test.js +90 -90
  44. package/_site/_test/claude-session-lifecycle-sweep-test.js +252 -252
  45. package/_site/_test/claude-workbench-test.js +174 -174
  46. package/_site/_test/cli-instance-management-test.js +62 -62
  47. package/_site/_test/client-capture-restart-e2e-test.js +189 -189
  48. package/_site/_test/codex-conversation-projection-test.js +60 -60
  49. package/_site/_test/codex-marketplace-scoped-path-test.js +186 -186
  50. package/_site/_test/codex-notify-capture-e2e-test.js +101 -101
  51. package/_site/_test/codex-notify-fanout-test.js +141 -134
  52. package/_site/_test/codex-notify-upgrade-test.js +253 -253
  53. package/_site/_test/commit-boundary-freeze-test.js +147 -147
  54. package/_site/_test/commit-conversation-binding-test.js +99 -99
  55. package/_site/_test/commit-evidence-test.js +110 -110
  56. package/_site/_test/configuration-generation-test.js +22 -22
  57. package/_site/_test/context-pack-test.js +200 -200
  58. package/_site/_test/conversation-api-test.js +119 -119
  59. package/_site/_test/conversation-origin-test.js +15 -15
  60. package/_site/_test/conversation-store-test.js +138 -138
  61. package/_site/_test/cross-repo-isolation-e2e-test.js +187 -187
  62. package/_site/_test/desktop-browser-compat-test.js +28 -28
  63. package/_site/_test/desktop-hook-runtime-regression-test.js +204 -204
  64. package/_site/_test/embedding-config-test.js +32 -32
  65. package/_site/_test/explicit-commit-processor-test.js +37 -37
  66. package/_site/_test/fixtures/fake-browser-exit.js +10 -10
  67. package/_site/_test/fixtures/fake-browser-hang.js +10 -10
  68. package/_site/_test/fixtures/integration-busy-worker.cjs +6 -6
  69. package/_site/_test/fixtures/make-git-repos.js +92 -92
  70. package/_site/_test/fixtures/retrieval-gold-queries.json +32 -32
  71. package/_site/_test/folder-picker-output-test.js +19 -19
  72. package/_site/_test/fresh-hook-reimport-test.js +53 -53
  73. package/_site/_test/fresh-product-data-test.js +56 -56
  74. package/_site/_test/full-integration-e2e-test.js +167 -167
  75. package/_site/_test/git-path-compatibility-test.js +80 -80
  76. package/_site/_test/git-validation-test.js +81 -81
  77. package/_site/_test/glm-ui-refresh-review-test.js +313 -404
  78. package/_site/_test/harness-isolation-test.js +138 -0
  79. package/_site/_test/helpers/cdp-browser.js +383 -0
  80. package/_site/_test/helpers/cdp-network-capture.js +66 -0
  81. package/_site/_test/helpers/find-chrome.js +34 -0
  82. package/_site/_test/helpers/free-port.js +8 -0
  83. package/_site/_test/helpers/logging-ui-fixture.js +131 -0
  84. package/_site/_test/helpers/module-fixture.js +282 -0
  85. package/_site/_test/helpers/parallel-engine-advanced-engine-child.js +45 -0
  86. package/_site/_test/helpers/parallel-engine-advanced-fault-writer.js +171 -0
  87. package/_site/_test/helpers/parallel-engine-advanced-harness.js +245 -0
  88. package/_site/_test/helpers/parallel-engine-advanced-standin-analyzer.js +80 -0
  89. package/_site/_test/helpers/parallel-engine-advanced-ui-host.js +177 -0
  90. package/_site/_test/helpers/parallel-engine-final-harness.js +314 -0
  91. package/_site/_test/helpers/parallel-engine-final-standin-analyzer.js +159 -0
  92. package/_site/_test/helpers/parallel-knowledge-fixture.js +255 -0
  93. package/_site/_test/helpers/parallel-logging-acceptance-fixture.js +111 -0
  94. package/_site/_test/helpers/parallel-logging-acceptance-proxy.js +106 -0
  95. package/_site/_test/helpers/parallel-logging-fix-r2-proxy.js +205 -0
  96. package/_site/_test/helpers/parallel-logging-integration-5025-env.js +432 -0
  97. package/_site/_test/helpers/parallel-memory-analyzer.js +81 -0
  98. package/_site/_test/helpers/parallel-memory-event-bridge.js +128 -0
  99. package/_site/_test/helpers/parallel-memory-shell.js +470 -0
  100. package/_site/_test/helpers/parallel-nav-isolation-env.js +389 -0
  101. package/_site/_test/helpers/parallel-nav-module-ui.js +186 -0
  102. package/_site/_test/helpers/parallel-nav-proxy.js +148 -0
  103. package/_site/_test/helpers/parallel-nav-shell.js +361 -0
  104. package/_site/_test/helpers/parallel-qa-engine-endpoint-guard.js +206 -0
  105. package/_site/_test/helpers/parallel-qa-engine-endpoint-isolate.js +257 -0
  106. package/_site/_test/helpers/parallel-retrieval-followup-corpus.js +293 -0
  107. package/_site/_test/helpers/parallel-retrieval-followup-next-session.js +70 -0
  108. package/_site/_test/helpers/parallel-retrieval-followup-r2-shell.js +737 -0
  109. package/_site/_test/helpers/parallel-retrieval-followup-r2-wb-host.js +82 -0
  110. package/_site/_test/helpers/parallel-retrieval-followup-shell.js +279 -0
  111. package/_site/_test/helpers/parallel-workbench-fixture.js +371 -0
  112. package/_site/_test/helpers/parallel-workbench-host.js +80 -0
  113. package/_site/_test/helpers/parallel-workbench-integration-5025-fixture.js +408 -0
  114. package/_site/_test/helpers/parallel-workbench-integration-5025-harness.js +593 -0
  115. package/_site/_test/helpers/parallel-workbench-integration-5025-host.js +70 -0
  116. package/_site/_test/helpers/parallel-workbench-integration-5025-launcher.js +240 -0
  117. package/_site/_test/helpers/parallel-workbench-integration-5025-runtime-harness.js +630 -0
  118. package/_site/_test/helpers/parallel-workbench-source-map.js +196 -0
  119. package/_site/_test/helpers/spawn-server.js +106 -0
  120. package/_site/_test/helpers/version-visibility-fixture.js +251 -0
  121. package/_site/_test/hook-runtime-endpoint-test.js +88 -88
  122. package/_site/_test/hook-status-repair-api-test.js +152 -152
  123. package/_site/_test/hook-trigger-test.js +85 -85
  124. package/_site/_test/hook-worktree-test.js +42 -42
  125. package/_site/_test/import-preflight-api-test.js +234 -234
  126. package/_site/_test/index-builder-test.js +41 -41
  127. package/_site/_test/index-error-display-contract-test.js +10 -10
  128. package/_site/_test/index-writer-concurrency-test.js +135 -135
  129. package/_site/_test/integration-adapters-test.js +262 -262
  130. package/_site/_test/integration-auto-repair-test.js +113 -113
  131. package/_site/_test/integration-capture-setup-test.js +118 -118
  132. package/_site/_test/integration-intent-test.js +81 -81
  133. package/_site/_test/integration-runtime-binding-a2-test.js +566 -566
  134. package/_site/_test/integration-runtime-binding-a3-test.js +227 -227
  135. package/_site/_test/integration-runtime-binding-test.js +473 -473
  136. package/_site/_test/integration-status-scan-test.js +29 -29
  137. package/_site/_test/integration-surface-coverage-test.js +164 -164
  138. package/_site/_test/kb-framework-test.js +57 -57
  139. package/_site/_test/kbpath-follow-test.js +63 -63
  140. package/_site/_test/knowledge-db-test.js +144 -144
  141. package/_site/_test/knowledge-engine-client-test.js +120 -109
  142. package/_site/_test/knowledge-language-control-test.js +170 -170
  143. package/_site/_test/knowledge-maintenance-test.js +40 -40
  144. package/_site/_test/knowledge-promotion-recovery-test.js +260 -260
  145. package/_site/_test/knowledge-query-test.js +54 -54
  146. package/_site/_test/knowledge-retrieval-service-test.js +77 -77
  147. package/_site/_test/knowledge-scopes-test.js +37 -37
  148. package/_site/_test/knowledge-storage-location-test.js +28 -28
  149. package/_site/_test/knowledge-storage-startup-test.js +52 -52
  150. package/_site/_test/knowledge-store-logs-supervision-test.js +89 -89
  151. package/_site/_test/launcher-readiness-test.js +80 -80
  152. package/_site/_test/legacy-claude-session-alias-test.js +106 -106
  153. package/_site/_test/legacy-routes-removed-test.js +47 -47
  154. package/_site/_test/legacy-workbench-exclusion-test.js +92 -92
  155. package/_site/_test/live-gateway-test.js +48 -48
  156. package/_site/_test/local-marketplace-test.js +16 -16
  157. package/_site/_test/log-redaction-test.js +58 -58
  158. package/_site/_test/logging-api-test.js +89 -89
  159. package/_site/_test/logging-sse-no-gap-test.js +88 -88
  160. package/_site/_test/logging-ui-test.js +107 -107
  161. package/_site/_test/markdown-delta-overlay-test.js +85 -85
  162. package/_site/_test/markdown-maintenance-api-test.js +75 -75
  163. package/_site/_test/markdown-maintenance-test.js +11 -11
  164. package/_site/_test/mcp-server-test.js +149 -149
  165. package/_site/_test/model-context-windows-test.js +89 -89
  166. package/_site/_test/module-agent-start-proxy-test.js +65 -65
  167. package/_site/_test/module-artifact-integrity-test.js +27 -27
  168. package/_site/_test/module-boundary-test.js +30 -30
  169. package/_site/_test/module-bridge-eventbridge-test.js +202 -202
  170. package/_site/_test/module-dynamic-port-test.js +118 -118
  171. package/_site/_test/module-index-proxy-test.js +33 -33
  172. package/_site/_test/module-model-configuration-test.js +44 -44
  173. package/_site/_test/module-process-lifecycle-test.js +35 -35
  174. package/_site/_test/module-stream-proxy-test.js +34 -34
  175. package/_site/_test/module-terminal-restart-test.js +63 -63
  176. package/_site/_test/module-wiring-unbind-race-test.js +59 -59
  177. package/_site/_test/native-context-integrations-test.js +86 -86
  178. package/_site/_test/non-release-ci-test.js +34 -34
  179. package/_site/_test/offline-boundary-isolation-test.js +32 -32
  180. package/_site/_test/orphaned-claim-recovery-test.js +80 -80
  181. package/_site/_test/package-boundary-test.js +43 -43
  182. package/_site/_test/package-startup-test.js +56 -56
  183. package/_site/_test/packaged-ui-smoke-test.js +88 -88
  184. package/_site/_test/parallel-ci-r9-posix-socket-budget-test.js +156 -0
  185. package/_site/_test/parallel-engine-advanced-eng005-test.js +136 -0
  186. package/_site/_test/parallel-engine-advanced-eng006-test.js +171 -0
  187. package/_site/_test/parallel-engine-advanced-eng007-reconcile-test.js +231 -0
  188. package/_site/_test/parallel-engine-advanced-eng009-test.js +208 -0
  189. package/_site/_test/parallel-engine-advanced-eng010-test.js +213 -0
  190. package/_site/_test/parallel-engine-advanced-eng011-ui-probe.js +459 -0
  191. package/_site/_test/parallel-engine-final-eng002-test.js +255 -0
  192. package/_site/_test/parallel-engine-final-eng007-test.js +269 -0
  193. package/_site/_test/parallel-engine-final-eng011-test.js +197 -0
  194. package/_site/_test/parallel-engine-final-eng012-test.js +354 -0
  195. package/_site/_test/parallel-knowledge-client-error-code-test.js +184 -0
  196. package/_site/_test/parallel-knowledge-engine-test.js +353 -0
  197. package/_site/_test/parallel-knowledge-retrieval-test.js +292 -0
  198. package/_site/_test/parallel-knowledge-vector-test.js +168 -0
  199. package/_site/_test/parallel-linux-ci-r7-log007-day-test.js +110 -0
  200. package/_site/_test/parallel-logging-acceptance-log003-test.js +224 -0
  201. package/_site/_test/parallel-logging-acceptance-log004-test.js +231 -0
  202. package/_site/_test/parallel-logging-acceptance-log005-test.js +208 -0
  203. package/_site/_test/parallel-logging-acceptance-log006-test.js +214 -0
  204. package/_site/_test/parallel-logging-acceptance-log007-test.js +223 -0
  205. package/_site/_test/parallel-logging-acceptance-log008-test.js +180 -0
  206. package/_site/_test/parallel-logging-fix-r2-crash-probe.js +271 -0
  207. package/_site/_test/parallel-logging-fix-r2-gap-test.js +294 -0
  208. package/_site/_test/parallel-logging-fix-r2-normalhook-test.js +330 -0
  209. package/_site/_test/parallel-logging-integration-5025-portability-test.js +554 -0
  210. package/_site/_test/parallel-memory-candidate-test.js +301 -0
  211. package/_site/_test/parallel-memory-manual-test.js +197 -0
  212. package/_site/_test/parallel-memory-scope-test.js +228 -0
  213. package/_site/_test/parallel-memory-source-test.js +227 -0
  214. package/_site/_test/parallel-memory-sync-test.js +238 -0
  215. package/_site/_test/parallel-memory-view-r8-reload-gate-test.js +123 -0
  216. package/_site/_test/parallel-nav-failure-test.js +119 -0
  217. package/_site/_test/parallel-nav-isolation-test.js +308 -0
  218. package/_site/_test/parallel-nav-isolation-vector-path-test.js +90 -0
  219. package/_site/_test/parallel-nav-offline-test.js +272 -0
  220. package/_site/_test/parallel-nav-operability-test.js +257 -0
  221. package/_site/_test/parallel-nav-switch-test.js +247 -0
  222. package/_site/_test/parallel-nav-theme-test.js +130 -0
  223. package/_site/_test/parallel-nav-viewport-test.js +310 -0
  224. package/_site/_test/parallel-qa-engine-endpoint-guard-test.js +273 -0
  225. package/_site/_test/parallel-retrieval-followup-citation-test.js +219 -0
  226. package/_site/_test/parallel-retrieval-followup-corpus-test.js +287 -0
  227. package/_site/_test/parallel-workbench-independent-host.js +262 -0
  228. package/_site/_test/parallel-workbench-integration-5025-abort-probe.js +340 -0
  229. package/_site/_test/parallel-workbench-integration-5025-drafts-probe.js +588 -0
  230. package/_site/_test/parallel-workbench-integration-5025-env-check.js +317 -0
  231. package/_site/_test/parallel-workbench-integration-5025-model-probe.js +342 -0
  232. package/_site/_test/parallel-workbench-integration-5025-ordering-probe.js +326 -0
  233. package/_site/_test/parallel-workbench-model-probe.js +336 -0
  234. package/_site/_test/parallel-workbench-offline-test.js +169 -0
  235. package/_site/_test/parallel-workbench-provenance-trace.js +134 -0
  236. package/_site/_test/parallel-workbench-source-match.js +206 -0
  237. package/_site/_test/parallel-workbench-standalone-turn.js +349 -0
  238. package/_site/_test/path-consistency-test.js +151 -151
  239. package/_site/_test/pending-sweep-test.js +9 -9
  240. package/_site/_test/post-commit-automation-test.js +87 -87
  241. package/_site/_test/pr-consumer-contract-test.js +55 -55
  242. package/_site/_test/product-brand-contract-test.js +25 -25
  243. package/_site/_test/product-diagnostics-ui-test.js +93 -93
  244. package/_site/_test/product-empty-state-test.js +148 -0
  245. package/_site/_test/product-import-ui-test.js +219 -104
  246. package/_site/_test/product-navigation-test.js +152 -0
  247. package/_site/_test/product-progress-status-test.js +84 -84
  248. package/_site/_test/project-delete-recovery-test.js +64 -64
  249. package/_site/_test/project-domain-create-test.js +91 -0
  250. package/_site/_test/project-domain-scope-retrieval-test.js +214 -0
  251. package/_site/_test/project-git-init-confirm-test.js +115 -0
  252. package/_site/_test/project-goal-editor-test.js +144 -144
  253. package/_site/_test/project-import-duplicate-alias-test.js +134 -0
  254. package/_site/_test/project-import-unicode-restart-test.js +140 -0
  255. package/_site/_test/project-lifecycle-transaction-test.js +106 -106
  256. package/_site/_test/project-module-partial-recovery-test.js +222 -0
  257. package/_site/_test/project-remove-running-guard-test.js +79 -79
  258. package/_site/_test/project-store-test.js +90 -90
  259. package/_site/_test/project-unbind-late-read-ui-test.js +250 -0
  260. package/_site/_test/project-unbind-writer-guard-test.js +231 -0
  261. package/_site/_test/prompt-settings-test.js +115 -115
  262. package/_site/_test/protected-architecture-gate-test.js +122 -122
  263. package/_site/_test/refactor-characterization-test.js +36 -36
  264. package/_site/_test/registry-events-test.js +38 -38
  265. package/_site/_test/release-version-sync-test.js +115 -115
  266. package/_site/_test/requirement-binding-test.js +113 -113
  267. package/_site/_test/requirement-recorder-test.js +173 -173
  268. package/_site/_test/run-all-tests.js +173 -161
  269. package/_site/_test/runtime-endpoint-test.js +64 -64
  270. package/_site/_test/scanner-test.js +83 -83
  271. package/_site/_test/server-security-test.js +96 -96
  272. package/_site/_test/sessions-stream-test.js +93 -93
  273. package/_site/_test/shared-contracts-test.js +58 -58
  274. package/_site/_test/shared-scope-root-binding-test.js +74 -67
  275. package/_site/_test/simple-import-test.js +98 -98
  276. package/_site/_test/startup-analysis-disabled-test.js +16 -16
  277. package/_site/_test/storage-foundation-test.js +78 -78
  278. package/_site/_test/structured-logger-test.js +101 -101
  279. package/_site/_test/t07b-cln-005-coverage-test.js +212 -0
  280. package/_site/_test/team-knowledge-store-sparse-checkout-test.js +196 -196
  281. package/_site/_test/team-knowledge-store-test.js +132 -132
  282. package/_site/_test/test-server-cleanup-test.js +35 -35
  283. package/_site/_test/test-server-module-isolation-test.js +37 -37
  284. package/_site/_test/tracking-start-test.js +144 -144
  285. package/_site/_test/vector-storage-root-test.js +75 -75
  286. package/_site/_test/version-visibility-browser-probe.js +249 -0
  287. package/_site/_test/version-visibility-test.js +92 -0
  288. package/_site/_test/workbench-context-receipts-test.js +22 -22
  289. package/_site/_test/workbench-permission-test.js +117 -117
  290. package/_site/_test/zcode-capture-integration-test.js +112 -112
  291. package/_site/lib/ai-profile-resolver.js +78 -78
  292. package/_site/lib/ai-vendor-presets.js +83 -83
  293. package/_site/lib/ai-workspace.js +104 -104
  294. package/_site/lib/atomic-file.js +204 -204
  295. package/_site/lib/automation-config.js +140 -140
  296. package/_site/lib/bridge-adapter.js +260 -260
  297. package/_site/lib/bridge-consumer-service.js +402 -402
  298. package/_site/lib/capture-hook-config.js +108 -108
  299. package/_site/lib/claude-cli-runner.js +1599 -1599
  300. package/_site/lib/cli-instances.js +43 -43
  301. package/_site/lib/codex-context-status.js +17 -17
  302. package/_site/lib/codex-notify-config.js +193 -193
  303. package/_site/lib/commit-conversation-binder.js +247 -247
  304. package/_site/lib/commit-processing-ledger.js +27 -27
  305. package/_site/lib/commit-prompt.js +202 -202
  306. package/_site/lib/commit-reconciler.js +444 -444
  307. package/_site/lib/context-pack-builder.js +299 -299
  308. package/_site/lib/contracts.js +291 -291
  309. package/_site/lib/conversation-exclusions.js +204 -204
  310. package/_site/lib/conversation-query-service.js +161 -161
  311. package/_site/lib/conversation-store.js +387 -387
  312. package/_site/lib/data-dir.js +13 -13
  313. package/_site/lib/embedding-service.js +85 -85
  314. package/_site/lib/engine-connection.js +93 -93
  315. package/_site/lib/engine-knowledge-client.js +76 -72
  316. package/_site/lib/evidence-bundle.js +228 -228
  317. package/_site/lib/folder-picker-output.js +24 -24
  318. package/_site/lib/git-path.js +14 -14
  319. package/_site/lib/git-runner.js +62 -62
  320. package/_site/lib/github-team-store.js +1175 -1175
  321. package/_site/lib/hook-manager.js +203 -203
  322. package/_site/lib/index-builder.js +157 -157
  323. package/_site/lib/index-service.js +173 -173
  324. package/_site/lib/integration-auto-repair.js +77 -77
  325. package/_site/lib/integration-installer.js +1240 -1240
  326. package/_site/lib/integration-intent.js +88 -88
  327. package/_site/lib/integration-status-scan.js +99 -99
  328. package/_site/lib/integration-status-worker.js +14 -14
  329. package/_site/lib/kb-framework.js +191 -191
  330. package/_site/lib/kb-validator.js +124 -124
  331. package/_site/lib/knowledge-db.js +363 -363
  332. package/_site/lib/knowledge-promotion.js +435 -435
  333. package/_site/lib/knowledge-retrieval-service.js +401 -401
  334. package/_site/lib/knowledge-schema.js +121 -121
  335. package/_site/lib/knowledge-tool-runtime.js +366 -366
  336. package/_site/lib/live-gateway.js +78 -78
  337. package/_site/lib/llm-client.js +173 -173
  338. package/_site/lib/markdown-knowledge-indexer.js +230 -230
  339. package/_site/lib/model-context-windows.js +82 -82
  340. package/_site/lib/module-bridge.js +874 -874
  341. package/_site/lib/module-port-resolver.js +57 -57
  342. package/_site/lib/post-commit-automation.js +141 -141
  343. package/_site/lib/product-data.js +35 -35
  344. package/_site/lib/project-lifecycle-service.js +554 -554
  345. package/_site/lib/project-registry-store.js +129 -129
  346. package/_site/lib/project-store.js +268 -268
  347. package/_site/lib/prompt-registry.js +148 -148
  348. package/_site/lib/public-version-info.js +37 -0
  349. package/_site/lib/registry-events.js +16 -16
  350. package/_site/lib/requirement-adapters.js +10 -10
  351. package/_site/lib/requirement-binder.js +112 -112
  352. package/_site/lib/requirement-recorder.js +278 -278
  353. package/_site/lib/runtime-control.js +89 -89
  354. package/_site/lib/runtime-endpoint.js +160 -160
  355. package/_site/lib/scanner.js +298 -298
  356. package/_site/lib/server-app.js +1672 -1664
  357. package/_site/lib/settings-store.js +153 -153
  358. package/_site/lib/storage-layout.js +166 -166
  359. package/_site/lib/structured-logger.js +574 -574
  360. package/_site/lib/zcode-context-integration.js +60 -60
  361. package/_site/scripts/codex-notify-fanout.cjs +95 -95
  362. package/_site/scripts/folder-picker.ps1 +156 -156
  363. package/_site/scripts/hook-trigger.js +158 -158
  364. package/_site/scripts/install-module-candidates.js +69 -69
  365. package/_site/scripts/pack-module-candidates.js +89 -89
  366. package/_site/scripts/sync-product-content.js +28 -28
  367. package/_site/scripts/sync-release-version.js +164 -164
  368. package/_site/scripts/vendor-modules.js +49 -49
  369. package/_site/scripts/verify-module-runtime.js +50 -50
  370. package/_site/scripts/verify-product-runtime.js +36 -36
  371. package/_site/scripts/verify-retrieval-gold.js +83 -83
  372. package/_site/server.js +15 -15
  373. package/_site/start.bat +26 -26
  374. package/_site/stop.bat +11 -11
  375. package/bin/project-knowledge-integrations.js +254 -254
  376. package/bin/project-knowledge-kb.js +67 -67
  377. package/bin/project-knowledge-mcp.js +201 -201
  378. package/bin/project-knowledge.js +269 -170
  379. package/claude-prompts.json +21 -21
  380. package/docs/README.zh-CN.md +207 -205
  381. package/docs/assets/architecture.svg +181 -181
  382. package/docs/assets/logo.svg +49 -49
  383. package/docs/fresh-v5-start.md +44 -44
  384. package/docs/leader-glm-workbench-playbook.md +122 -122
  385. package/docs/project-registry-schema.md +33 -33
  386. package/docs/release-5.0.16-acceptance.md +176 -176
  387. package/docs/release-5.0.17-acceptance.md +117 -117
  388. package/docs/release-5.0.19-acceptance.md +39 -39
  389. package/docs/team-knowledge-mode-a-plan.md +73 -73
  390. package/docs/testing-strategy.md +33 -33
  391. package/module-runtime-manifest.json +70 -67
  392. package/package.json +113 -110
  393. package/plugins/project-knowledge/.claude-plugin/plugin.json +1 -1
  394. package/plugins/project-knowledge/.codex-plugin/plugin.json +1 -1
  395. package/plugins/project-knowledge/.mcp.json +1 -1
  396. package/templates/change.md +30 -30
  397. package/templates/project-readme.md +52 -52
  398. package/ui/index.html +3 -2
  399. package/ui/version-info.css +44 -0
  400. package/ui/version-info.js +24 -0
  401. package/vendor-manifest.json +55 -55
@@ -0,0 +1,408 @@
1
+ 'use strict';
2
+ // P-WB-QA-INTEGRATION-5025 fixture — the canonical, clean-checkout isolation
3
+ // fixture for the Workbench QA suite, carried forward from the accepted R5
4
+ // isolation contract (helpers/parallel-workbench-drafts-r5-fixture.js, frozen)
5
+ // with the portability and identity-chain upgrades the integration dispatch
6
+ // requires. The frozen originals stay untouched.
7
+ //
8
+ // Canonical contract:
9
+ // * every directory is created below PK_TEST_TEMP_ROOT when set, otherwise
10
+ // the shared temp root next to the repository when it exists, otherwise
11
+ // TEMP/TMP/TMPDIR, otherwise the OS temp dir — never inside the repository
12
+ // and never a hardcoded drive or user directory;
13
+ // * the Workbench data directory, the knowledge data directory, the Bridge
14
+ // home, HOME/USERPROFILE, CLAUDE_CONFIG_DIR, CODEX_HOME, APPDATA,
15
+ // LOCALAPPDATA and TEMP are ALL isolated below the per-run layout root
16
+ // (the R4 boundary gaps stay closed); each run owns its own root;
17
+ // * an empty default-shaped Chrome "User Data" scaffold is pre-created under
18
+ // the isolated home so Chrome >= 136 accepts the separate, real
19
+ // browser-profile directory as non-default (bisect-proven R5 fix);
20
+ // * the live product ports are refused; ambient module addresses and every
21
+ // ambient Anthropic credential variable are dropped;
22
+ // * NO real-profile machinery: no read-only facade, no
23
+ // PK_WB_REAL_PROFILE_DIR, no digest of real credential files. Pure-UI
24
+ // tools (the drafts probe) must never carry a real profile source.
25
+ // realWorkbenchProfileDir() survives only as a pure path string for guards;
26
+ // * module identity is an INDEPENDENT chain: the expected version defaults
27
+ // to the root package's exact dependency constraint
28
+ // ("claude-ai-workbench": "npm:@sanqianx/claude-ai-workbench@<version>"),
29
+ // never to the module's own self-description; a candidate release can pass
30
+ // an explicit expectedVersion/expectedPin instead.
31
+ const fs = require('node:fs');
32
+ const os = require('node:os');
33
+ const path = require('node:path');
34
+ const net = require('node:net');
35
+ const crypto = require('node:crypto');
36
+ const sourceMap = require('./parallel-workbench-source-map');
37
+
38
+ const REPO_ROOT = path.resolve(__dirname, '..', '..', '..');
39
+
40
+ // The developer's live surfaces. A test may never bind or talk to them.
41
+ const FORBIDDEN_PORTS = new Set([5757, 5760, 5789, 5790, 8787, 8790]);
42
+
43
+ // Ambient module addresses that would point a test at a live instance.
44
+ const AMBIENT_MODULE_URLS = [
45
+ 'KB_KNOWLEDGE_ENGINE_URL',
46
+ 'KB_VECTORHUB_URL',
47
+ 'KB_TERMINAL_URL',
48
+ 'KB_EVENTBRIDGE_URL',
49
+ 'KB_EVENT_BRIDGE_URL',
50
+ 'KB_WORKBENCH_RUNTIME_TOKEN',
51
+ 'KB_MODULES_AUTOSTART',
52
+ ];
53
+
54
+ // Ambient Anthropic credentials: a test must only ever use the credential it
55
+ // injects itself, never one that happens to sit in the shell.
56
+ const AMBIENT_MODEL_ENV = [
57
+ 'ANTHROPIC_API_KEY',
58
+ 'ANTHROPIC_AUTH_TOKEN',
59
+ 'ANTHROPIC_BASE_URL',
60
+ 'ANTHROPIC_MODEL',
61
+ 'ANTHROPIC_DEFAULT_THINKING_MODEL',
62
+ 'ANTHROPIC_DEFAULT_HAIKU_MODEL',
63
+ 'ANTHROPIC_DEFAULT_SONNET_MODEL',
64
+ 'ANTHROPIC_DEFAULT_OPUS_MODEL',
65
+ 'API_TIMEOUT_MS',
66
+ 'CLAUDE_CODE_OAUTH_TOKEN',
67
+ 'CLAUDE_CODE_USE_BEDROCK',
68
+ 'CLAUDE_CODE_USE_VERTEX',
69
+ 'CLAUDE_CODE_USE_FOUNDRY',
70
+ ];
71
+
72
+ // Captured before any isolation changes HOME.
73
+ const REAL_HOME = os.homedir();
74
+ const REAL_USERPROFILE = process.env.USERPROFILE || REAL_HOME;
75
+
76
+ // Captured at MODULE LOAD — this fixture is required by every probe BEFORE
77
+ // its launcher boot applies isolation, so the load-time environment is still
78
+ // the real one (or the safe runner's captured overrides). An AppData install
79
+ // resolved HERE keeps its identity no matter what the environment says later;
80
+ // an isolated APPDATA can no longer mislabel it as a repository pin.
81
+ const INSTALLED_PRODUCT_PACKAGE_AT_LOAD = sourceMap.resolveInstalledProductPackage();
82
+
83
+ // The installed-product package root, safe to call at ANY time: the explicit
84
+ // capture carried through by the launcher boot wins, then the load-time
85
+ // capture, and only a process that never isolated falls back to a live read.
86
+ function installedProductPackage() {
87
+ const override = String(process.env.PK_WB_INSTALLED_PRODUCT_MODULE || '').trim();
88
+ if (override) return fs.existsSync(override) ? override : null;
89
+ return INSTALLED_PRODUCT_PACKAGE_AT_LOAD;
90
+ }
91
+
92
+ // The absolute-path members of the isolation whitelist. KB_MODULES_AUTOSTART
93
+ // is a flag ('0'), HOMEDRIVE/HOMEPATH are drive-relative companions; none of
94
+ // them is a directory of its own.
95
+ const ISOLATION_PATH_KEYS = [
96
+ 'HOME',
97
+ 'USERPROFILE',
98
+ 'CODEX_HOME',
99
+ 'CLAUDE_CONFIG_DIR',
100
+ 'APPDATA',
101
+ 'LOCALAPPDATA',
102
+ 'TEMP',
103
+ 'TMP',
104
+ 'TMPDIR',
105
+ 'PSModuleAnalysisCachePath',
106
+ 'KB_DATA_DIR',
107
+ 'KB_KNOWLEDGE_DATA_DIR',
108
+ 'AI_CODING_EVENT_BRIDGE_HOME',
109
+ 'AGENT_TERMINAL_DATA_DIR',
110
+ 'CLAUDE_AI_WORKBENCH_DATA_DIR',
111
+ ];
112
+
113
+ function isInside(candidate, parent) {
114
+ const relative = path.relative(parent, candidate);
115
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
116
+ }
117
+
118
+ function resolveTempRoot() {
119
+ const sharedRoot = path.join(path.dirname(REPO_ROOT), '.project-knowledge-test-temp');
120
+ const candidates = [
121
+ process.env.PK_TEST_TEMP_ROOT,
122
+ fs.existsSync(sharedRoot) ? sharedRoot : null,
123
+ process.env.TEMP,
124
+ process.env.TMP,
125
+ process.env.TMPDIR,
126
+ ];
127
+ const chosen = candidates.find(value => value && String(value).trim());
128
+ const root = path.resolve(chosen ? String(chosen).trim() : os.tmpdir());
129
+ if (isInside(root, REPO_ROOT)) throw new Error(`refusing to use a temp root inside the repository: ${root}`);
130
+ return root;
131
+ }
132
+
133
+ function ensureTempRoot() {
134
+ const root = resolveTempRoot();
135
+ fs.mkdirSync(root, { recursive: true });
136
+ return root;
137
+ }
138
+
139
+ function makeTempDir(prefix = 'parallel-workbench') {
140
+ const root = ensureTempRoot();
141
+ const dir = fs.mkdtempSync(path.join(root, `${prefix}-`));
142
+ if (isInside(dir, REPO_ROOT)) throw new Error(`refusing to create a fixture inside the repository: ${dir}`);
143
+ return dir;
144
+ }
145
+
146
+ function removeTree(dir) {
147
+ if (!dir) return;
148
+ fs.rmSync(dir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });
149
+ }
150
+
151
+ async function freePort() {
152
+ return new Promise((resolve, reject) => {
153
+ const server = net.createServer();
154
+ server.unref();
155
+ server.on('error', reject);
156
+ server.listen(0, '127.0.0.1', () => {
157
+ const { port } = server.address();
158
+ server.close(() => {
159
+ if (FORBIDDEN_PORTS.has(Number(port))) { reject(new Error(`refusing to use the live port ${port}`)); return; }
160
+ resolve(Number(port));
161
+ });
162
+ });
163
+ });
164
+ }
165
+
166
+ function assertAllowedEndpoint(url, what = 'endpoint') {
167
+ const parsed = new URL(String(url));
168
+ const port = parsed.port ? Number(parsed.port) : (parsed.protocol === 'https:' ? 443 : 80);
169
+ if (FORBIDDEN_PORTS.has(port)) throw new Error(`refusing to contact the live ${what} ${url}`);
170
+ return url;
171
+ }
172
+
173
+ async function waitForHttp(url, timeoutMs = 30000) {
174
+ assertAllowedEndpoint(url, 'service');
175
+ const until = Date.now() + timeoutMs;
176
+ let lastError = null;
177
+ while (Date.now() < until) {
178
+ try {
179
+ const response = await fetch(url, { signal: AbortSignal.timeout(2000) });
180
+ if (response.ok) return true;
181
+ lastError = new Error(`HTTP ${response.status}`);
182
+ } catch (error) { lastError = error; }
183
+ await new Promise(resolve => setTimeout(resolve, 100));
184
+ }
185
+ throw new Error(`Timed out waiting for ${url}: ${lastError && lastError.message}`);
186
+ }
187
+
188
+ // The explicit SYSTEM whitelist: the ONLY ambient variables a process of this
189
+ // suite may inherit. Matching is case-insensitive because Windows treats
190
+ // Path/PATH and SystemRoot/SYSTEMROOT as the same variable. Everything else —
191
+ // provider credentials (OPENAI/MINIMAX/GOOGLE/AWS/ANTHROPIC…), NODE_OPTIONS,
192
+ // proxy URLs, CODEX/Claude CLI injection vars — is dropped BY CONSTRUCTION:
193
+ // the child env is rebuilt from this list, never derived by blacklisting.
194
+ const SYSTEM_ENV_WHITELIST = [
195
+ 'SystemRoot', 'SystemDrive', 'windir', 'ComSpec', 'PATHEXT',
196
+ 'PROCESSOR_ARCHITECTURE', 'PROCESSOR_ARCHITECTURE_W6432', 'PROCESSOR_IDENTIFIER',
197
+ 'PROCESSOR_LEVEL', 'PROCESSOR_REVISION', 'NUMBER_OF_PROCESSORS',
198
+ 'PATH', 'TEMP', 'TMP', 'TMPDIR',
199
+ ];
200
+
201
+ function systemBaseEnv(source = process.env) {
202
+ const allow = new Set(SYSTEM_ENV_WHITELIST.map(name => name.toLowerCase()));
203
+ const base = {};
204
+ for (const [key, value] of Object.entries(source)) {
205
+ if (value !== undefined && allow.has(key.toLowerCase())) base[key] = value;
206
+ }
207
+ return base;
208
+ }
209
+
210
+ // Child base env: rebuild from the system whitelist, then layer the caller's
211
+ // explicit values (isolation map + lane endpoints/fake markers). Lane-specified
212
+ // keys win; ambient anything-else never enters. The old ambient delete lists
213
+ // stay exported for guard assertions only — scrubbing no longer depends on them.
214
+ function sanitizedEnv(extra = {}) {
215
+ return { ...systemBaseEnv(), ...extra };
216
+ }
217
+
218
+ function spawnNode(args, env = {}) {
219
+ const { spawn } = require('node:child_process');
220
+ const child = spawn(process.execPath, args, {
221
+ env: sanitizedEnv(env),
222
+ windowsHide: true,
223
+ stdio: ['ignore', 'pipe', 'pipe'],
224
+ });
225
+ const output = { stdout: '', stderr: '' };
226
+ child.stdout.on('data', chunk => { output.stdout += chunk; });
227
+ child.stderr.on('data', chunk => { output.stderr += chunk; });
228
+ const exited = new Promise(resolve => child.once('close', code => resolve({ code, ...output })));
229
+ return { child, exited, output };
230
+ }
231
+
232
+ // --- the isolation directories of one run -----------------------------------
233
+ function createIsolationLayout(prefix = 'parallel-workbench') {
234
+ const root = makeTempDir(prefix);
235
+ const layout = {
236
+ root,
237
+ dataDir: path.join(root, 'workbench-data'),
238
+ knowledgeDataDir: path.join(root, 'knowledge-data'),
239
+ bridgeHome: path.join(root, 'bridge-home'),
240
+ home: path.join(root, 'home'),
241
+ claudeConfigDir: path.join(root, 'claude-config'),
242
+ codexHome: path.join(root, 'codex-home'),
243
+ appData: path.join(root, 'appdata'),
244
+ localAppData: path.join(root, 'localappdata'),
245
+ workspace: path.join(root, 'workspace'),
246
+ temp: path.join(root, 'temp'),
247
+ };
248
+ for (const dir of Object.values(layout)) {
249
+ if (typeof dir === 'string') fs.mkdirSync(dir, { recursive: true });
250
+ }
251
+ fs.writeFileSync(path.join(layout.workspace, 'README.md'), '# Workbench fixture workspace\n', 'utf8');
252
+ // Chrome >= 136 refuses --remote-debugging-port unless it can resolve its
253
+ // DEFAULT user data dir and confirm the passed --user-data-dir differs.
254
+ // The default is derived from %USERPROFILE% (bisect evidence: overriding
255
+ // USERPROFILE alone trips the gate; APPDATA/LOCALAPPDATA/TEMP/HOME do not).
256
+ // An empty default-shaped scaffold under the isolated home lets the
257
+ // resolution succeed, so the real, separate browser-profile directory
258
+ // below this layout is accepted as non-default. The scaffold stays inside
259
+ // the isolated root — nothing of the real machine is touched.
260
+ fs.mkdirSync(path.join(layout.home, 'AppData', 'Local', 'Google', 'Chrome', 'User Data'), { recursive: true });
261
+ fs.mkdirSync(path.join(layout.home, 'AppData', 'Roaming'), { recursive: true });
262
+ return layout;
263
+ }
264
+
265
+ // The complete isolation whitelist: every value an own child (probe, host,
266
+ // browser, census powershell) may resolve through its environment points into
267
+ // this layout. Building the map MATERIALIZES the directories it names — the
268
+ // env-pointed TEMP dirs and the PSModuleAnalysisCachePath parent must actually
269
+ // exist on disk, not merely as strings (a powershell census child that resolves
270
+ // a missing cache dir would fall back to the real home).
271
+ function isolationEnvMap(layout) {
272
+ const parsed = path.parse(layout.home);
273
+ const psModuleCache = path.join(layout.root, 'ps-module-analysis-cache', 'AnalysisCache');
274
+ fs.mkdirSync(layout.temp, { recursive: true });
275
+ fs.mkdirSync(path.dirname(psModuleCache), { recursive: true });
276
+ if (!fs.statSync(layout.temp).isDirectory()) throw new Error(`isolation TEMP does not exist on disk: ${layout.temp}`);
277
+ if (!fs.statSync(path.dirname(psModuleCache)).isDirectory()) throw new Error(`PSModuleAnalysisCachePath parent does not exist on disk: ${psModuleCache}`);
278
+ return {
279
+ HOME: layout.home,
280
+ USERPROFILE: layout.home,
281
+ HOMEDRIVE: parsed.root,
282
+ HOMEPATH: parsed.root === path.sep ? layout.home.slice(1) : layout.home.slice(parsed.root.length),
283
+ CODEX_HOME: layout.codexHome,
284
+ CLAUDE_CONFIG_DIR: layout.claudeConfigDir,
285
+ APPDATA: layout.appData,
286
+ LOCALAPPDATA: layout.localAppData,
287
+ TEMP: layout.temp,
288
+ TMP: layout.temp,
289
+ TMPDIR: layout.temp,
290
+ PSModuleAnalysisCachePath: psModuleCache,
291
+ KB_DATA_DIR: layout.knowledgeDataDir,
292
+ KB_KNOWLEDGE_DATA_DIR: layout.knowledgeDataDir,
293
+ AI_CODING_EVENT_BRIDGE_HOME: layout.bridgeHome,
294
+ AGENT_TERMINAL_DATA_DIR: layout.dataDir,
295
+ CLAUDE_AI_WORKBENCH_DATA_DIR: layout.dataDir,
296
+ KB_MODULES_AUTOSTART: '0',
297
+ };
298
+ }
299
+
300
+ // The environment a host child may inherit. No real profile directory is
301
+ // passed: this canonical fixture has no real profile source at all.
302
+ function hostEnv(layout, extra = {}) {
303
+ return sanitizedEnv({ ...isolationEnvMap(layout), ...extra });
304
+ }
305
+
306
+ // --- the real profile location (path string ONLY) ----------------------------
307
+ // Where the product keeps its real profiles, resolved from the real home
308
+ // captured at module load. Guards use this string exclusively to prove that
309
+ // no isolated env value points there; this helper never touches the
310
+ // filesystem.
311
+ function realWorkbenchProfileDir() {
312
+ return path.join(REAL_HOME, '.project-knowledge-v5', 'workbench');
313
+ }
314
+
315
+ // The module that is hosted: the copy the installed product ships, unless
316
+ // the caller pins another one explicitly. Callers must resolve this BEFORE
317
+ // applying isolationEnvMap to their own process.env — the discovery reads
318
+ // the real APPDATA.
319
+ function resolveHostModuleRoot(options = {}) {
320
+ const override = String(options.moduleRoot || process.env.PK_WB_MODULE_ROOT || '').trim();
321
+ if (override) return path.resolve(override);
322
+ const appData = String(process.env.APPDATA || '').trim();
323
+ if (appData) {
324
+ const candidate = path.join(appData, 'npm', 'node_modules', '@sanqianx', 'project-knowledge', 'node_modules', 'claude-ai-workbench');
325
+ if (fs.existsSync(path.join(candidate, 'packages', 'server', 'package.json'))) return candidate;
326
+ }
327
+ const repoPin = path.join(REPO_ROOT, 'node_modules', 'claude-ai-workbench');
328
+ if (fs.existsSync(path.join(repoPin, 'packages', 'server', 'package.json'))) return repoPin;
329
+ return null;
330
+ }
331
+
332
+ // --- the independent module identity chain -----------------------------------
333
+ //
334
+ // The expected Workbench version is NOT read from the hosted module and
335
+ // compared with itself: it defaults to the root product package's exact
336
+ // dependency constraint, which is a separate, independently written pin. A
337
+ // candidate release overrides it with an explicit expectedVersion (and
338
+ // optionally an expectedPin of exact file digests).
339
+ function sha256File(file) {
340
+ try { return crypto.createHash('sha256').update(fs.readFileSync(file)).digest('hex'); } catch { return null; }
341
+ }
342
+
343
+ function rootWorkbenchDependency() {
344
+ const rootPackage = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8'));
345
+ const raw = String((rootPackage.dependencies || {})['claude-ai-workbench'] || '');
346
+ const version = raw.includes('@') ? raw.slice(raw.lastIndexOf('@') + 1) : raw;
347
+ return { raw, version };
348
+ }
349
+
350
+ function verifyModuleIdentity(options = {}) {
351
+ const moduleRoot = options.moduleRoot;
352
+ if (!moduleRoot) throw new Error('verifyModuleIdentity requires a moduleRoot');
353
+ const dependency = rootWorkbenchDependency();
354
+ const expectedVersion = options.expectedVersion || dependency.version;
355
+ const identity = sourceMap.packageIdentity(moduleRoot) || {};
356
+ const pin = options.expectedPin || null;
357
+ const pinFiles = {};
358
+ let pinOk = true;
359
+ for (const rel of Object.keys(pin || {})) {
360
+ const actual = sha256File(path.join(moduleRoot, rel));
361
+ pinFiles[rel] = { expected: pin[rel], actual, match: actual === pin[rel] };
362
+ if (actual !== pin[rel]) pinOk = false;
363
+ }
364
+ const versionMatches = identity.version === expectedVersion;
365
+ return {
366
+ moduleRoot,
367
+ expected: {
368
+ source: options.expectedVersion ? 'explicit (candidate release)' : 'root-package-dependency',
369
+ dependencyRaw: dependency.raw || null,
370
+ version: expectedVersion,
371
+ },
372
+ actual: { name: identity.name || null, version: identity.version || null },
373
+ versionMatches,
374
+ pin: pin ? { checked: Object.keys(pin), ok: pinOk, files: pinFiles } : null,
375
+ ok: versionMatches && pinOk,
376
+ };
377
+ }
378
+
379
+ module.exports = {
380
+ REPO_ROOT,
381
+ FORBIDDEN_PORTS,
382
+ AMBIENT_MODULE_URLS,
383
+ AMBIENT_MODEL_ENV,
384
+ REAL_HOME,
385
+ REAL_USERPROFILE,
386
+ INSTALLED_PRODUCT_PACKAGE_AT_LOAD,
387
+ installedProductPackage,
388
+ ISOLATION_PATH_KEYS,
389
+ SYSTEM_ENV_WHITELIST,
390
+ systemBaseEnv,
391
+ resolveTempRoot,
392
+ ensureTempRoot,
393
+ makeTempDir,
394
+ removeTree,
395
+ freePort,
396
+ assertAllowedEndpoint,
397
+ waitForHttp,
398
+ sanitizedEnv,
399
+ spawnNode,
400
+ createIsolationLayout,
401
+ isolationEnvMap,
402
+ hostEnv,
403
+ realWorkbenchProfileDir,
404
+ resolveHostModuleRoot,
405
+ sha256File,
406
+ rootWorkbenchDependency,
407
+ verifyModuleIdentity,
408
+ };