@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.
- package/.agents/plugins/marketplace.json +20 -20
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +1361 -1346
- package/LICENSE +201 -201
- package/NOTICE +5 -5
- package/README.md +349 -349
- package/_modules/knowledge-engine/package.json +1 -1
- package/_modules/knowledge-engine/src/coordinator.js +48 -3
- package/_modules/knowledge-engine/src/runtime/automation-config.js +140 -140
- package/_modules/knowledge-engine/src/runtime/commit-conversation-binder.js +238 -238
- package/_modules/knowledge-engine/src/runtime/commit-processing-ledger.js +26 -26
- package/_modules/knowledge-engine/src/runtime/commit-prompt.js +193 -193
- package/_modules/knowledge-engine/src/runtime/commit-reconciler.js +394 -394
- package/_modules/knowledge-engine/src/runtime/contracts.js +282 -282
- package/_modules/knowledge-engine/src/runtime/conversation-store.js +389 -389
- package/_modules/knowledge-engine/src/runtime/evidence-bundle.js +228 -228
- package/_modules/knowledge-engine/src/runtime/git-runner.js +62 -62
- package/_modules/knowledge-engine/src/runtime/knowledge-promotion.js +505 -505
- package/_modules/knowledge-engine/src/runtime/knowledge-retrieval-service.js +400 -400
- package/_modules/knowledge-engine/src/runtime/markdown-knowledge-indexer.js +171 -171
- package/_modules/knowledge-engine/src/runtime/scanner.js +298 -298
- package/_modules/knowledge-engine/ui/app.js +23 -2
- package/_site/README.md +30 -30
- package/_site/_test/agent-capture-mcp-ui-test.js +68 -68
- package/_site/_test/agent-capture-ui-test.js +101 -101
- package/_site/_test/ai-profile-resolver-test.js +137 -137
- package/_site/_test/ai-profile-test.js +75 -75
- package/_site/_test/ai-vendor-presets-test.js +91 -91
- package/_site/_test/automatic-context-test.js +70 -70
- package/_site/_test/automation-queue-test.js +14 -14
- package/_site/_test/automation-ui-test.js +40 -40
- package/_site/_test/background-task-registry-test.js +43 -43
- package/_site/_test/baseline-schema-test.js +91 -91
- package/_site/_test/bin-cli-test.js +230 -230
- package/_site/_test/bridge-adapter-test.js +95 -95
- package/_site/_test/bridge-consumer-service-test.js +310 -310
- package/_site/_test/candidate-bin-content-test.js +35 -35
- package/_site/_test/candidate-product-assets-test.js +13 -13
- package/_site/_test/candidate-release-contract-test.js +14 -14
- package/_site/_test/capture-hook-dedup-test.js +158 -158
- package/_site/_test/cdp-browser-failure-test.js +103 -103
- package/_site/_test/chat-claudecodeui-match-test.js +92 -92
- package/_site/_test/claude-executable-discovery-test.js +90 -90
- package/_site/_test/claude-session-lifecycle-sweep-test.js +252 -252
- package/_site/_test/claude-workbench-test.js +174 -174
- package/_site/_test/cli-instance-management-test.js +62 -62
- package/_site/_test/client-capture-restart-e2e-test.js +189 -189
- package/_site/_test/codex-conversation-projection-test.js +60 -60
- package/_site/_test/codex-marketplace-scoped-path-test.js +186 -186
- package/_site/_test/codex-notify-capture-e2e-test.js +101 -101
- package/_site/_test/codex-notify-fanout-test.js +141 -134
- package/_site/_test/codex-notify-upgrade-test.js +253 -253
- package/_site/_test/commit-boundary-freeze-test.js +147 -147
- package/_site/_test/commit-conversation-binding-test.js +99 -99
- package/_site/_test/commit-evidence-test.js +110 -110
- package/_site/_test/configuration-generation-test.js +22 -22
- package/_site/_test/context-pack-test.js +200 -200
- package/_site/_test/conversation-api-test.js +119 -119
- package/_site/_test/conversation-origin-test.js +15 -15
- package/_site/_test/conversation-store-test.js +138 -138
- package/_site/_test/cross-repo-isolation-e2e-test.js +187 -187
- package/_site/_test/desktop-browser-compat-test.js +28 -28
- package/_site/_test/desktop-hook-runtime-regression-test.js +204 -204
- package/_site/_test/embedding-config-test.js +32 -32
- package/_site/_test/explicit-commit-processor-test.js +37 -37
- package/_site/_test/fixtures/fake-browser-exit.js +10 -10
- package/_site/_test/fixtures/fake-browser-hang.js +10 -10
- package/_site/_test/fixtures/integration-busy-worker.cjs +6 -6
- package/_site/_test/fixtures/make-git-repos.js +92 -92
- package/_site/_test/fixtures/retrieval-gold-queries.json +32 -32
- package/_site/_test/folder-picker-output-test.js +19 -19
- package/_site/_test/fresh-hook-reimport-test.js +53 -53
- package/_site/_test/fresh-product-data-test.js +56 -56
- package/_site/_test/full-integration-e2e-test.js +167 -167
- package/_site/_test/git-path-compatibility-test.js +80 -80
- package/_site/_test/git-validation-test.js +81 -81
- package/_site/_test/glm-ui-refresh-review-test.js +313 -404
- package/_site/_test/harness-isolation-test.js +138 -0
- package/_site/_test/helpers/cdp-browser.js +383 -0
- package/_site/_test/helpers/cdp-network-capture.js +66 -0
- package/_site/_test/helpers/find-chrome.js +34 -0
- package/_site/_test/helpers/free-port.js +8 -0
- package/_site/_test/helpers/logging-ui-fixture.js +131 -0
- package/_site/_test/helpers/module-fixture.js +282 -0
- package/_site/_test/helpers/parallel-engine-advanced-engine-child.js +45 -0
- package/_site/_test/helpers/parallel-engine-advanced-fault-writer.js +171 -0
- package/_site/_test/helpers/parallel-engine-advanced-harness.js +245 -0
- package/_site/_test/helpers/parallel-engine-advanced-standin-analyzer.js +80 -0
- package/_site/_test/helpers/parallel-engine-advanced-ui-host.js +177 -0
- package/_site/_test/helpers/parallel-engine-final-harness.js +314 -0
- package/_site/_test/helpers/parallel-engine-final-standin-analyzer.js +159 -0
- package/_site/_test/helpers/parallel-knowledge-fixture.js +255 -0
- package/_site/_test/helpers/parallel-logging-acceptance-fixture.js +111 -0
- package/_site/_test/helpers/parallel-logging-acceptance-proxy.js +106 -0
- package/_site/_test/helpers/parallel-logging-fix-r2-proxy.js +205 -0
- package/_site/_test/helpers/parallel-logging-integration-5025-env.js +432 -0
- package/_site/_test/helpers/parallel-memory-analyzer.js +81 -0
- package/_site/_test/helpers/parallel-memory-event-bridge.js +128 -0
- package/_site/_test/helpers/parallel-memory-shell.js +470 -0
- package/_site/_test/helpers/parallel-nav-isolation-env.js +389 -0
- package/_site/_test/helpers/parallel-nav-module-ui.js +186 -0
- package/_site/_test/helpers/parallel-nav-proxy.js +148 -0
- package/_site/_test/helpers/parallel-nav-shell.js +361 -0
- package/_site/_test/helpers/parallel-qa-engine-endpoint-guard.js +206 -0
- package/_site/_test/helpers/parallel-qa-engine-endpoint-isolate.js +257 -0
- package/_site/_test/helpers/parallel-retrieval-followup-corpus.js +293 -0
- package/_site/_test/helpers/parallel-retrieval-followup-next-session.js +70 -0
- package/_site/_test/helpers/parallel-retrieval-followup-r2-shell.js +737 -0
- package/_site/_test/helpers/parallel-retrieval-followup-r2-wb-host.js +82 -0
- package/_site/_test/helpers/parallel-retrieval-followup-shell.js +279 -0
- package/_site/_test/helpers/parallel-workbench-fixture.js +371 -0
- package/_site/_test/helpers/parallel-workbench-host.js +80 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-fixture.js +408 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-harness.js +593 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-host.js +70 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-launcher.js +240 -0
- package/_site/_test/helpers/parallel-workbench-integration-5025-runtime-harness.js +630 -0
- package/_site/_test/helpers/parallel-workbench-source-map.js +196 -0
- package/_site/_test/helpers/spawn-server.js +106 -0
- package/_site/_test/helpers/version-visibility-fixture.js +251 -0
- package/_site/_test/hook-runtime-endpoint-test.js +88 -88
- package/_site/_test/hook-status-repair-api-test.js +152 -152
- package/_site/_test/hook-trigger-test.js +85 -85
- package/_site/_test/hook-worktree-test.js +42 -42
- package/_site/_test/import-preflight-api-test.js +234 -234
- package/_site/_test/index-builder-test.js +41 -41
- package/_site/_test/index-error-display-contract-test.js +10 -10
- package/_site/_test/index-writer-concurrency-test.js +135 -135
- package/_site/_test/integration-adapters-test.js +262 -262
- package/_site/_test/integration-auto-repair-test.js +113 -113
- package/_site/_test/integration-capture-setup-test.js +118 -118
- package/_site/_test/integration-intent-test.js +81 -81
- package/_site/_test/integration-runtime-binding-a2-test.js +566 -566
- package/_site/_test/integration-runtime-binding-a3-test.js +227 -227
- package/_site/_test/integration-runtime-binding-test.js +473 -473
- package/_site/_test/integration-status-scan-test.js +29 -29
- package/_site/_test/integration-surface-coverage-test.js +164 -164
- package/_site/_test/kb-framework-test.js +57 -57
- package/_site/_test/kbpath-follow-test.js +63 -63
- package/_site/_test/knowledge-db-test.js +144 -144
- package/_site/_test/knowledge-engine-client-test.js +120 -109
- package/_site/_test/knowledge-language-control-test.js +170 -170
- package/_site/_test/knowledge-maintenance-test.js +40 -40
- package/_site/_test/knowledge-promotion-recovery-test.js +260 -260
- package/_site/_test/knowledge-query-test.js +54 -54
- package/_site/_test/knowledge-retrieval-service-test.js +77 -77
- package/_site/_test/knowledge-scopes-test.js +37 -37
- package/_site/_test/knowledge-storage-location-test.js +28 -28
- package/_site/_test/knowledge-storage-startup-test.js +52 -52
- package/_site/_test/knowledge-store-logs-supervision-test.js +89 -89
- package/_site/_test/launcher-readiness-test.js +80 -80
- package/_site/_test/legacy-claude-session-alias-test.js +106 -106
- package/_site/_test/legacy-routes-removed-test.js +47 -47
- package/_site/_test/legacy-workbench-exclusion-test.js +92 -92
- package/_site/_test/live-gateway-test.js +48 -48
- package/_site/_test/local-marketplace-test.js +16 -16
- package/_site/_test/log-redaction-test.js +58 -58
- package/_site/_test/logging-api-test.js +89 -89
- package/_site/_test/logging-sse-no-gap-test.js +88 -88
- package/_site/_test/logging-ui-test.js +107 -107
- package/_site/_test/markdown-delta-overlay-test.js +85 -85
- package/_site/_test/markdown-maintenance-api-test.js +75 -75
- package/_site/_test/markdown-maintenance-test.js +11 -11
- package/_site/_test/mcp-server-test.js +149 -149
- package/_site/_test/model-context-windows-test.js +89 -89
- package/_site/_test/module-agent-start-proxy-test.js +65 -65
- package/_site/_test/module-artifact-integrity-test.js +27 -27
- package/_site/_test/module-boundary-test.js +30 -30
- package/_site/_test/module-bridge-eventbridge-test.js +202 -202
- package/_site/_test/module-dynamic-port-test.js +118 -118
- package/_site/_test/module-index-proxy-test.js +33 -33
- package/_site/_test/module-model-configuration-test.js +44 -44
- package/_site/_test/module-process-lifecycle-test.js +35 -35
- package/_site/_test/module-stream-proxy-test.js +34 -34
- package/_site/_test/module-terminal-restart-test.js +63 -63
- package/_site/_test/module-wiring-unbind-race-test.js +59 -59
- package/_site/_test/native-context-integrations-test.js +86 -86
- package/_site/_test/non-release-ci-test.js +34 -34
- package/_site/_test/offline-boundary-isolation-test.js +32 -32
- package/_site/_test/orphaned-claim-recovery-test.js +80 -80
- package/_site/_test/package-boundary-test.js +43 -43
- package/_site/_test/package-startup-test.js +56 -56
- package/_site/_test/packaged-ui-smoke-test.js +88 -88
- package/_site/_test/parallel-ci-r9-posix-socket-budget-test.js +156 -0
- package/_site/_test/parallel-engine-advanced-eng005-test.js +136 -0
- package/_site/_test/parallel-engine-advanced-eng006-test.js +171 -0
- package/_site/_test/parallel-engine-advanced-eng007-reconcile-test.js +231 -0
- package/_site/_test/parallel-engine-advanced-eng009-test.js +208 -0
- package/_site/_test/parallel-engine-advanced-eng010-test.js +213 -0
- package/_site/_test/parallel-engine-advanced-eng011-ui-probe.js +459 -0
- package/_site/_test/parallel-engine-final-eng002-test.js +255 -0
- package/_site/_test/parallel-engine-final-eng007-test.js +269 -0
- package/_site/_test/parallel-engine-final-eng011-test.js +197 -0
- package/_site/_test/parallel-engine-final-eng012-test.js +354 -0
- package/_site/_test/parallel-knowledge-client-error-code-test.js +184 -0
- package/_site/_test/parallel-knowledge-engine-test.js +353 -0
- package/_site/_test/parallel-knowledge-retrieval-test.js +292 -0
- package/_site/_test/parallel-knowledge-vector-test.js +168 -0
- package/_site/_test/parallel-linux-ci-r7-log007-day-test.js +110 -0
- package/_site/_test/parallel-logging-acceptance-log003-test.js +224 -0
- package/_site/_test/parallel-logging-acceptance-log004-test.js +231 -0
- package/_site/_test/parallel-logging-acceptance-log005-test.js +208 -0
- package/_site/_test/parallel-logging-acceptance-log006-test.js +214 -0
- package/_site/_test/parallel-logging-acceptance-log007-test.js +223 -0
- package/_site/_test/parallel-logging-acceptance-log008-test.js +180 -0
- package/_site/_test/parallel-logging-fix-r2-crash-probe.js +271 -0
- package/_site/_test/parallel-logging-fix-r2-gap-test.js +294 -0
- package/_site/_test/parallel-logging-fix-r2-normalhook-test.js +330 -0
- package/_site/_test/parallel-logging-integration-5025-portability-test.js +554 -0
- package/_site/_test/parallel-memory-candidate-test.js +301 -0
- package/_site/_test/parallel-memory-manual-test.js +197 -0
- package/_site/_test/parallel-memory-scope-test.js +228 -0
- package/_site/_test/parallel-memory-source-test.js +227 -0
- package/_site/_test/parallel-memory-sync-test.js +238 -0
- package/_site/_test/parallel-memory-view-r8-reload-gate-test.js +123 -0
- package/_site/_test/parallel-nav-failure-test.js +119 -0
- package/_site/_test/parallel-nav-isolation-test.js +308 -0
- package/_site/_test/parallel-nav-isolation-vector-path-test.js +90 -0
- package/_site/_test/parallel-nav-offline-test.js +272 -0
- package/_site/_test/parallel-nav-operability-test.js +257 -0
- package/_site/_test/parallel-nav-switch-test.js +247 -0
- package/_site/_test/parallel-nav-theme-test.js +130 -0
- package/_site/_test/parallel-nav-viewport-test.js +310 -0
- package/_site/_test/parallel-qa-engine-endpoint-guard-test.js +273 -0
- package/_site/_test/parallel-retrieval-followup-citation-test.js +219 -0
- package/_site/_test/parallel-retrieval-followup-corpus-test.js +287 -0
- package/_site/_test/parallel-workbench-independent-host.js +262 -0
- package/_site/_test/parallel-workbench-integration-5025-abort-probe.js +340 -0
- package/_site/_test/parallel-workbench-integration-5025-drafts-probe.js +588 -0
- package/_site/_test/parallel-workbench-integration-5025-env-check.js +317 -0
- package/_site/_test/parallel-workbench-integration-5025-model-probe.js +342 -0
- package/_site/_test/parallel-workbench-integration-5025-ordering-probe.js +326 -0
- package/_site/_test/parallel-workbench-model-probe.js +336 -0
- package/_site/_test/parallel-workbench-offline-test.js +169 -0
- package/_site/_test/parallel-workbench-provenance-trace.js +134 -0
- package/_site/_test/parallel-workbench-source-match.js +206 -0
- package/_site/_test/parallel-workbench-standalone-turn.js +349 -0
- package/_site/_test/path-consistency-test.js +151 -151
- package/_site/_test/pending-sweep-test.js +9 -9
- package/_site/_test/post-commit-automation-test.js +87 -87
- package/_site/_test/pr-consumer-contract-test.js +55 -55
- package/_site/_test/product-brand-contract-test.js +25 -25
- package/_site/_test/product-diagnostics-ui-test.js +93 -93
- package/_site/_test/product-empty-state-test.js +148 -0
- package/_site/_test/product-import-ui-test.js +219 -104
- package/_site/_test/product-navigation-test.js +152 -0
- package/_site/_test/product-progress-status-test.js +84 -84
- package/_site/_test/project-delete-recovery-test.js +64 -64
- package/_site/_test/project-domain-create-test.js +91 -0
- package/_site/_test/project-domain-scope-retrieval-test.js +214 -0
- package/_site/_test/project-git-init-confirm-test.js +115 -0
- package/_site/_test/project-goal-editor-test.js +144 -144
- package/_site/_test/project-import-duplicate-alias-test.js +134 -0
- package/_site/_test/project-import-unicode-restart-test.js +140 -0
- package/_site/_test/project-lifecycle-transaction-test.js +106 -106
- package/_site/_test/project-module-partial-recovery-test.js +222 -0
- package/_site/_test/project-remove-running-guard-test.js +79 -79
- package/_site/_test/project-store-test.js +90 -90
- package/_site/_test/project-unbind-late-read-ui-test.js +250 -0
- package/_site/_test/project-unbind-writer-guard-test.js +231 -0
- package/_site/_test/prompt-settings-test.js +115 -115
- package/_site/_test/protected-architecture-gate-test.js +122 -122
- package/_site/_test/refactor-characterization-test.js +36 -36
- package/_site/_test/registry-events-test.js +38 -38
- package/_site/_test/release-version-sync-test.js +115 -115
- package/_site/_test/requirement-binding-test.js +113 -113
- package/_site/_test/requirement-recorder-test.js +173 -173
- package/_site/_test/run-all-tests.js +173 -161
- package/_site/_test/runtime-endpoint-test.js +64 -64
- package/_site/_test/scanner-test.js +83 -83
- package/_site/_test/server-security-test.js +96 -96
- package/_site/_test/sessions-stream-test.js +93 -93
- package/_site/_test/shared-contracts-test.js +58 -58
- package/_site/_test/shared-scope-root-binding-test.js +74 -67
- package/_site/_test/simple-import-test.js +98 -98
- package/_site/_test/startup-analysis-disabled-test.js +16 -16
- package/_site/_test/storage-foundation-test.js +78 -78
- package/_site/_test/structured-logger-test.js +101 -101
- package/_site/_test/t07b-cln-005-coverage-test.js +212 -0
- package/_site/_test/team-knowledge-store-sparse-checkout-test.js +196 -196
- package/_site/_test/team-knowledge-store-test.js +132 -132
- package/_site/_test/test-server-cleanup-test.js +35 -35
- package/_site/_test/test-server-module-isolation-test.js +37 -37
- package/_site/_test/tracking-start-test.js +144 -144
- package/_site/_test/vector-storage-root-test.js +75 -75
- package/_site/_test/version-visibility-browser-probe.js +249 -0
- package/_site/_test/version-visibility-test.js +92 -0
- package/_site/_test/workbench-context-receipts-test.js +22 -22
- package/_site/_test/workbench-permission-test.js +117 -117
- package/_site/_test/zcode-capture-integration-test.js +112 -112
- package/_site/lib/ai-profile-resolver.js +78 -78
- package/_site/lib/ai-vendor-presets.js +83 -83
- package/_site/lib/ai-workspace.js +104 -104
- package/_site/lib/atomic-file.js +204 -204
- package/_site/lib/automation-config.js +140 -140
- package/_site/lib/bridge-adapter.js +260 -260
- package/_site/lib/bridge-consumer-service.js +402 -402
- package/_site/lib/capture-hook-config.js +108 -108
- package/_site/lib/claude-cli-runner.js +1599 -1599
- package/_site/lib/cli-instances.js +43 -43
- package/_site/lib/codex-context-status.js +17 -17
- package/_site/lib/codex-notify-config.js +193 -193
- package/_site/lib/commit-conversation-binder.js +247 -247
- package/_site/lib/commit-processing-ledger.js +27 -27
- package/_site/lib/commit-prompt.js +202 -202
- package/_site/lib/commit-reconciler.js +444 -444
- package/_site/lib/context-pack-builder.js +299 -299
- package/_site/lib/contracts.js +291 -291
- package/_site/lib/conversation-exclusions.js +204 -204
- package/_site/lib/conversation-query-service.js +161 -161
- package/_site/lib/conversation-store.js +387 -387
- package/_site/lib/data-dir.js +13 -13
- package/_site/lib/embedding-service.js +85 -85
- package/_site/lib/engine-connection.js +93 -93
- package/_site/lib/engine-knowledge-client.js +76 -72
- package/_site/lib/evidence-bundle.js +228 -228
- package/_site/lib/folder-picker-output.js +24 -24
- package/_site/lib/git-path.js +14 -14
- package/_site/lib/git-runner.js +62 -62
- package/_site/lib/github-team-store.js +1175 -1175
- package/_site/lib/hook-manager.js +203 -203
- package/_site/lib/index-builder.js +157 -157
- package/_site/lib/index-service.js +173 -173
- package/_site/lib/integration-auto-repair.js +77 -77
- package/_site/lib/integration-installer.js +1240 -1240
- package/_site/lib/integration-intent.js +88 -88
- package/_site/lib/integration-status-scan.js +99 -99
- package/_site/lib/integration-status-worker.js +14 -14
- package/_site/lib/kb-framework.js +191 -191
- package/_site/lib/kb-validator.js +124 -124
- package/_site/lib/knowledge-db.js +363 -363
- package/_site/lib/knowledge-promotion.js +435 -435
- package/_site/lib/knowledge-retrieval-service.js +401 -401
- package/_site/lib/knowledge-schema.js +121 -121
- package/_site/lib/knowledge-tool-runtime.js +366 -366
- package/_site/lib/live-gateway.js +78 -78
- package/_site/lib/llm-client.js +173 -173
- package/_site/lib/markdown-knowledge-indexer.js +230 -230
- package/_site/lib/model-context-windows.js +82 -82
- package/_site/lib/module-bridge.js +874 -874
- package/_site/lib/module-port-resolver.js +57 -57
- package/_site/lib/post-commit-automation.js +141 -141
- package/_site/lib/product-data.js +35 -35
- package/_site/lib/project-lifecycle-service.js +554 -554
- package/_site/lib/project-registry-store.js +129 -129
- package/_site/lib/project-store.js +268 -268
- package/_site/lib/prompt-registry.js +148 -148
- package/_site/lib/public-version-info.js +37 -0
- package/_site/lib/registry-events.js +16 -16
- package/_site/lib/requirement-adapters.js +10 -10
- package/_site/lib/requirement-binder.js +112 -112
- package/_site/lib/requirement-recorder.js +278 -278
- package/_site/lib/runtime-control.js +89 -89
- package/_site/lib/runtime-endpoint.js +160 -160
- package/_site/lib/scanner.js +298 -298
- package/_site/lib/server-app.js +1672 -1664
- package/_site/lib/settings-store.js +153 -153
- package/_site/lib/storage-layout.js +166 -166
- package/_site/lib/structured-logger.js +574 -574
- package/_site/lib/zcode-context-integration.js +60 -60
- package/_site/scripts/codex-notify-fanout.cjs +95 -95
- package/_site/scripts/folder-picker.ps1 +156 -156
- package/_site/scripts/hook-trigger.js +158 -158
- package/_site/scripts/install-module-candidates.js +69 -69
- package/_site/scripts/pack-module-candidates.js +89 -89
- package/_site/scripts/sync-product-content.js +28 -28
- package/_site/scripts/sync-release-version.js +164 -164
- package/_site/scripts/vendor-modules.js +49 -49
- package/_site/scripts/verify-module-runtime.js +50 -50
- package/_site/scripts/verify-product-runtime.js +36 -36
- package/_site/scripts/verify-retrieval-gold.js +83 -83
- package/_site/server.js +15 -15
- package/_site/start.bat +26 -26
- package/_site/stop.bat +11 -11
- package/bin/project-knowledge-integrations.js +254 -254
- package/bin/project-knowledge-kb.js +67 -67
- package/bin/project-knowledge-mcp.js +201 -201
- package/bin/project-knowledge.js +269 -170
- package/claude-prompts.json +21 -21
- package/docs/README.zh-CN.md +207 -205
- package/docs/assets/architecture.svg +181 -181
- package/docs/assets/logo.svg +49 -49
- package/docs/fresh-v5-start.md +44 -44
- package/docs/leader-glm-workbench-playbook.md +122 -122
- package/docs/project-registry-schema.md +33 -33
- package/docs/release-5.0.16-acceptance.md +176 -176
- package/docs/release-5.0.17-acceptance.md +117 -117
- package/docs/release-5.0.19-acceptance.md +39 -39
- package/docs/team-knowledge-mode-a-plan.md +73 -73
- package/docs/testing-strategy.md +33 -33
- package/module-runtime-manifest.json +70 -67
- package/package.json +113 -110
- package/plugins/project-knowledge/.claude-plugin/plugin.json +1 -1
- package/plugins/project-knowledge/.codex-plugin/plugin.json +1 -1
- package/plugins/project-knowledge/.mcp.json +1 -1
- package/templates/change.md +30 -30
- package/templates/project-readme.md +52 -52
- package/ui/index.html +3 -2
- package/ui/version-info.css +44 -0
- package/ui/version-info.js +24 -0
- package/vendor-manifest.json +55 -55
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// Lane-owned child process that hosts the REAL claude-ai-workbench module
|
|
3
|
+
// (0.13.6, the copy the installed product ships) for the P-MEMORY-INJECTION-02
|
|
4
|
+
// lane. It speaks the module's real HTTP contract and is started by the lane
|
|
5
|
+
// probes.
|
|
6
|
+
//
|
|
7
|
+
// The shape of this child is a READ-ONLY SNAPSHOT of
|
|
8
|
+
// _site/_test/helpers/parallel-memory-injection-wb-host.js (P-MEMORY-INJECTION-02
|
|
9
|
+
// lane) which is itself a snapshot of _site/_test/helpers/parallel-workbench-host.js
|
|
10
|
+
// (Workbench provenance lane). No source file is modified or imported: this
|
|
11
|
+
// lane never depends on another lane's unfrozen file. The SHA-256 of every
|
|
12
|
+
// source is recorded in the lane report.
|
|
13
|
+
//
|
|
14
|
+
// Environment (all set by the parent):
|
|
15
|
+
// PK_WB_MODULE_ROOT the claude-ai-workbench package root to host
|
|
16
|
+
// PK_WB_HOST_PORT port to listen on (127.0.0.1)
|
|
17
|
+
// PK_WB_HOST_DATA_DIR isolated workbench data directory
|
|
18
|
+
// PK_WB_HOST_WORKSPACES JSON map of workspaceRef -> absolute directory
|
|
19
|
+
// PK_WB_ENGINE_URL the knowledge engine URL (a recording proxy)
|
|
20
|
+
// PK_WB_PROFILE_SOURCE none | real-readonly
|
|
21
|
+
// PK_WB_BRIDGE_URL optional event-bridge console URL (enables capture)
|
|
22
|
+
// PK_WB_BRIDGE_TOKEN optional event-bridge runtime token (memory only)
|
|
23
|
+
const path = require('node:path');
|
|
24
|
+
const fs = require('node:fs');
|
|
25
|
+
|
|
26
|
+
const moduleRoot = String(process.env.PK_WB_MODULE_ROOT || '').trim();
|
|
27
|
+
const port = Number(process.env.PK_WB_HOST_PORT || 0);
|
|
28
|
+
const dataDir = String(process.env.PK_WB_HOST_DATA_DIR || '').trim();
|
|
29
|
+
const workspaces = JSON.parse(String(process.env.PK_WB_HOST_WORKSPACES || '{}'));
|
|
30
|
+
const engineUrl = String(process.env.PK_WB_ENGINE_URL || '').trim();
|
|
31
|
+
const profileSource = String(process.env.PK_WB_PROFILE_SOURCE || 'none');
|
|
32
|
+
const bridgeUrl = String(process.env.PK_WB_BRIDGE_URL || '').trim();
|
|
33
|
+
const bridgeToken = String(process.env.PK_WB_BRIDGE_TOKEN || '').trim();
|
|
34
|
+
|
|
35
|
+
if (!moduleRoot || !port || !dataDir || !Object.keys(workspaces).length) {
|
|
36
|
+
console.error('parallel-retrieval-followup-r2-wb-host: PK_WB_MODULE_ROOT, PK_WB_HOST_PORT, PK_WB_HOST_DATA_DIR and PK_WB_HOST_WORKSPACES are required');
|
|
37
|
+
process.exit(2);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Same contract as the module's own bin: the runtime resolves its data
|
|
41
|
+
// directory from these.
|
|
42
|
+
process.env.CLAUDE_AI_WORKBENCH_DATA_DIR = dataDir;
|
|
43
|
+
process.env.KB_DATA_DIR = dataDir;
|
|
44
|
+
if (engineUrl) process.env.KB_KNOWLEDGE_ENGINE_URL = engineUrl;
|
|
45
|
+
|
|
46
|
+
const { createWorkbenchServer } = require(path.join(moduleRoot, 'packages', 'server'));
|
|
47
|
+
|
|
48
|
+
function buildOptions() {
|
|
49
|
+
const options = { dataDir, workspaces };
|
|
50
|
+
if (profileSource === 'real-readonly') {
|
|
51
|
+
const shell = require('./parallel-retrieval-followup-r2-shell');
|
|
52
|
+
options.profiles = shell.createReadOnlyProfileStore(moduleRoot, { dataDir });
|
|
53
|
+
}
|
|
54
|
+
if (bridgeUrl && bridgeToken) {
|
|
55
|
+
// The real Workbench capture: the module records the ORIGINAL user input
|
|
56
|
+
// (not the augmented prompt) and flushes it to the Bridge.
|
|
57
|
+
const { ConversationCapture } = require(path.join(moduleRoot, 'packages', 'server', 'lib', 'conversation-capture.js'));
|
|
58
|
+
options.conversationCapture = new ConversationCapture({
|
|
59
|
+
file: path.join(dataDir, 'capture-outbox.v1.json'),
|
|
60
|
+
bridgeUrl,
|
|
61
|
+
token: bridgeToken,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return options;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const app = createWorkbenchServer(buildOptions());
|
|
68
|
+
app.server.listen(port, '127.0.0.1', () => {
|
|
69
|
+
process.stdout.write(`WORKBENCH_HOST_READY http://127.0.0.1:${port} engine=${engineUrl || 'none'} capture=${bridgeUrl ? 'on' : 'off'}\n`);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
let stopping = false;
|
|
73
|
+
async function shutdown() {
|
|
74
|
+
if (stopping) return;
|
|
75
|
+
stopping = true;
|
|
76
|
+
setTimeout(() => process.exit(1), 10000).unref();
|
|
77
|
+
try { await app.service.destroy(); } catch { process.exitCode = 1; }
|
|
78
|
+
app.server.closeAllConnections?.();
|
|
79
|
+
app.server.close(() => process.exit(process.exitCode || 0));
|
|
80
|
+
}
|
|
81
|
+
process.on('SIGINT', shutdown);
|
|
82
|
+
process.on('SIGTERM', shutdown);
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
// Lane-owned helpers for the P-RETRIEVAL-FOLLOWUP-01 batch (RET-007/RET-008).
|
|
3
|
+
//
|
|
4
|
+
// Portability contract: no developer path is hard-coded. The operator's
|
|
5
|
+
// Workbench profile store defaults to the real user home captured BEFORE
|
|
6
|
+
// fixture.isolateProcess() replaces HOME/USERPROFILE, and can be overridden
|
|
7
|
+
// with PK_RETRIEVAL_WORKBENCH_HOME. Secrets (the glm subscription key) are
|
|
8
|
+
// read in memory only: they are never printed, logged or persisted, and no
|
|
9
|
+
// quota/usage endpoint is ever contacted by anything in this lane.
|
|
10
|
+
//
|
|
11
|
+
// Isolation contract: same as the sibling parallel-knowledge-fixture helper —
|
|
12
|
+
// ambient module URLs cleared, live 5757/5790/8787/8790 endpoints refused,
|
|
13
|
+
// every artefact under the external temp root. The shared fixture helper is
|
|
14
|
+
// required read-only; this file only adds lane-specific composition.
|
|
15
|
+
const fs = require('node:fs');
|
|
16
|
+
const os = require('node:os');
|
|
17
|
+
const path = require('node:path');
|
|
18
|
+
const http = require('node:http');
|
|
19
|
+
const { spawn, execFileSync } = require('node:child_process');
|
|
20
|
+
|
|
21
|
+
const fixture = require('./parallel-knowledge-fixture');
|
|
22
|
+
|
|
23
|
+
// Captured before isolateProcess() rewrites the environment.
|
|
24
|
+
const REAL_HOME = process.env.PK_RETRIEVAL_WORKBENCH_HOME
|
|
25
|
+
|| process.env.USERPROFILE
|
|
26
|
+
|| process.env.HOME
|
|
27
|
+
|| os.homedir();
|
|
28
|
+
|
|
29
|
+
const REPO_ROOT = fixture.REPO_ROOT;
|
|
30
|
+
const LANE_DIR = path.join(REPO_ROOT, 'qa-autopilot', 'artifacts', 'parallel-20261023', 'retrieval-followup');
|
|
31
|
+
const BRIDGE_BIN = path.join(REPO_ROOT, 'node_modules', '@sanqianx', 'ai-coding-event-bridge-console', 'src', 'bin.js');
|
|
32
|
+
const HUB_DIST = path.join(REPO_ROOT, 'node_modules', '@sanqianx', 'vector-hub', 'dist', 'cjs');
|
|
33
|
+
const MODEL_RELATIVE = path.join('Xenova', 'bge-small-zh-v1.5');
|
|
34
|
+
|
|
35
|
+
function workbenchProfileHome() { return path.join(REAL_HOME, '.agent-terminal'); }
|
|
36
|
+
|
|
37
|
+
// Resolve one of the operator's real subscription profiles, in memory only.
|
|
38
|
+
// Shape mirrors the Workbench ProfileStore runtime projection actually used
|
|
39
|
+
// for engine runtime-config: { apiKey, baseUrl, mainModel }.
|
|
40
|
+
//
|
|
41
|
+
// The model list is the operator's instruction order, not a filter: the
|
|
42
|
+
// provider is the authority on which id it accepts, so a model that the local
|
|
43
|
+
// catalog does not list is still attempted and the answer is recorded.
|
|
44
|
+
function loadRuntimeProfile(options = {}) {
|
|
45
|
+
const profileId = options.profileId || 'minimax';
|
|
46
|
+
const models = (options.models && options.models.length ? options.models : [options.model].filter(Boolean));
|
|
47
|
+
const home = workbenchProfileHome();
|
|
48
|
+
const profileFile = path.join(home, 'profiles.v2.json');
|
|
49
|
+
const credentialFile = path.join(home, 'credentials.v1.json');
|
|
50
|
+
const detail = { home, profileFile, credentialFile, profileId, models };
|
|
51
|
+
if (!models.length) return { ok: false, reason: 'no model requested', ...detail };
|
|
52
|
+
try {
|
|
53
|
+
const store = JSON.parse(fs.readFileSync(profileFile, 'utf8'));
|
|
54
|
+
const profiles = Array.isArray(store.profiles) ? store.profiles : [];
|
|
55
|
+
const profile = profiles.find(item => item.id === profileId);
|
|
56
|
+
if (!profile) return { ok: false, reason: `${profileId} profile not found`, ...detail };
|
|
57
|
+
if (profile.enabled === false) return { ok: false, reason: `${profileId} profile is disabled`, ...detail };
|
|
58
|
+
const credentials = JSON.parse(fs.readFileSync(credentialFile, 'utf8'));
|
|
59
|
+
const secret = credentials.credentials && credentials.credentials[profile.credentialRef];
|
|
60
|
+
if (typeof secret !== 'string' || !secret) return { ok: false, reason: `${profileId} credential is not configured`, ...detail };
|
|
61
|
+
if (!profile.baseUrl) return { ok: false, reason: `${profileId} profile has no baseUrl`, ...detail };
|
|
62
|
+
const listedModels = (profile.models && profile.models.list || []).map(entry => entry.id);
|
|
63
|
+
const mainModel = models[0];
|
|
64
|
+
// The secret never leaves memory; callers must not serialise this object.
|
|
65
|
+
return {
|
|
66
|
+
ok: true,
|
|
67
|
+
...detail,
|
|
68
|
+
listedModels,
|
|
69
|
+
profile: { apiKey: secret, baseUrl: profile.baseUrl, mainModel },
|
|
70
|
+
identity: {
|
|
71
|
+
profileId: profile.id,
|
|
72
|
+
baseUrl: profile.baseUrl,
|
|
73
|
+
protocol: profile.protocol || null,
|
|
74
|
+
mainModel,
|
|
75
|
+
modelListedInProfile: listedModels.includes(mainModel),
|
|
76
|
+
credentialConfigured: true,
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
} catch (error) {
|
|
80
|
+
return { ok: false, reason: `workbench profile store unreadable: ${error.message}`, ...detail };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// The lane's offline model cache. A missing cache is a real BLOCKED, never a
|
|
85
|
+
// download and never the shipped mock provider.
|
|
86
|
+
function verifyModelCache(cacheDir) {
|
|
87
|
+
const modelDir = path.join(cacheDir, MODEL_RELATIVE);
|
|
88
|
+
const required = ['onnx' + path.sep + 'model.onnx', 'tokenizer.json'];
|
|
89
|
+
const missing = required.filter(relative => !fs.existsSync(path.join(modelDir, ...relative.split(/[\\/]/))));
|
|
90
|
+
return { cacheDir, modelDir, ok: missing.length === 0, missing };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The product's own embedding service wrapped in the interface the real
|
|
94
|
+
// vector hub expects (same contract as the accepted parallel-knowledge-vector
|
|
95
|
+
// probe: batch = passage, single string = query).
|
|
96
|
+
function createProductEmbedder(service) {
|
|
97
|
+
const state = { calls: 0, dimensions: [], nonZeroVectors: 0 };
|
|
98
|
+
return {
|
|
99
|
+
kind: 'product-local-embedding-service',
|
|
100
|
+
model: service.modelId,
|
|
101
|
+
modelId: service.modelId,
|
|
102
|
+
maxTokens: 500,
|
|
103
|
+
state,
|
|
104
|
+
async createEmbeddings(inputs) {
|
|
105
|
+
const isBatch = Array.isArray(inputs);
|
|
106
|
+
const texts = isBatch ? inputs : [inputs];
|
|
107
|
+
const output = [];
|
|
108
|
+
for (const text of texts) {
|
|
109
|
+
const vector = isBatch ? await service.embedPassage(text) : await service.embedQuery(text);
|
|
110
|
+
state.calls += 1;
|
|
111
|
+
state.dimensions.push(vector.length);
|
|
112
|
+
if (vector.some(value => value !== 0)) state.nonZeroVectors += 1;
|
|
113
|
+
output.push(vector);
|
|
114
|
+
}
|
|
115
|
+
return { status: 'success', output };
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// A real vectra index on disk: the stored vectors must be real, of the
|
|
121
|
+
// expected dimension and not all zero.
|
|
122
|
+
function inspectStoredVectors(projectDir, expectedDimensions) {
|
|
123
|
+
const indexFile = path.join(projectDir, 'index.json');
|
|
124
|
+
if (!fs.existsSync(indexFile)) {
|
|
125
|
+
return { inspected: false, reason: 'no index.json in the project folder', files: fs.existsSync(projectDir) ? fs.readdirSync(projectDir) : [] };
|
|
126
|
+
}
|
|
127
|
+
const raw = fs.readFileSync(indexFile, 'utf8');
|
|
128
|
+
let parsed = null;
|
|
129
|
+
try { parsed = JSON.parse(raw); } catch { parsed = null; }
|
|
130
|
+
if (!parsed || !Array.isArray(parsed.items)) return { inspected: false, reason: 'index.json is not a readable JSON index', bytes: raw.length };
|
|
131
|
+
const vectors = parsed.items.map(item => item && item.vector).filter(Array.isArray);
|
|
132
|
+
const dimensions = [...new Set(vectors.map(vector => vector.length))];
|
|
133
|
+
return {
|
|
134
|
+
inspected: true,
|
|
135
|
+
bytes: raw.length,
|
|
136
|
+
itemCount: parsed.items.length,
|
|
137
|
+
vectorCount: vectors.length,
|
|
138
|
+
dimensions,
|
|
139
|
+
expectedDimensions,
|
|
140
|
+
dimensionsMatch: dimensions.length === 1 && dimensions[0] === expectedDimensions,
|
|
141
|
+
allVectorsNonZero: vectors.length > 0 && vectors.every(vector => vector.some(value => value !== 0)),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function httpJson(url, options = {}) {
|
|
146
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(options.timeoutMs || 8000), ...options });
|
|
147
|
+
const body = await response.json().catch(() => null);
|
|
148
|
+
return { status: response.status, ok: response.ok, body };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// The real event-bridge console as its own child process on an isolated port
|
|
152
|
+
// and home — the production topology (hooks, console service and consumers
|
|
153
|
+
// are separate processes over HTTP).
|
|
154
|
+
async function spawnBridgeConsole({ home, port }) {
|
|
155
|
+
fs.mkdirSync(home, { recursive: true });
|
|
156
|
+
const child = spawn(process.execPath, [BRIDGE_BIN, 'serve', '--port', String(port), '--host', '127.0.0.1', '--home', home], {
|
|
157
|
+
env: fixture.sanitizedEnv({ BRIDGE_CONSOLE_PICK_FOLDER: '0', AI_CODING_EVENT_BRIDGE_HOME: home }),
|
|
158
|
+
windowsHide: true,
|
|
159
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
160
|
+
});
|
|
161
|
+
const output = { stdout: '', stderr: '' };
|
|
162
|
+
child.stdout.on('data', chunk => { output.stdout += chunk; });
|
|
163
|
+
child.stderr.on('data', chunk => { output.stderr += chunk; });
|
|
164
|
+
const url = `http://127.0.0.1:${port}`;
|
|
165
|
+
const deadline = Date.now() + 20000;
|
|
166
|
+
let lastError = null;
|
|
167
|
+
while (Date.now() < deadline) {
|
|
168
|
+
try {
|
|
169
|
+
const health = await httpJson(`${url}/api/health`, { timeoutMs: 2000 });
|
|
170
|
+
if (health.ok) return { child, url, home, output, stop: kill(child) };
|
|
171
|
+
lastError = new Error(`health HTTP ${health.status}`);
|
|
172
|
+
} catch (error) { lastError = error; }
|
|
173
|
+
if (child.exitCode !== null) throw new Error(`bridge console exited early (${child.exitCode}): ${output.stderr.slice(0, 400)}`);
|
|
174
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
175
|
+
}
|
|
176
|
+
kill(child)();
|
|
177
|
+
throw new Error(`bridge console did not become healthy: ${lastError && lastError.message}`);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function kill(child) {
|
|
181
|
+
return () => new Promise(resolve => {
|
|
182
|
+
if (child.exitCode !== null) return resolve();
|
|
183
|
+
child.once('close', () => resolve());
|
|
184
|
+
child.kill();
|
|
185
|
+
setTimeout(() => { if (child.exitCode === null) child.kill('SIGKILL'); resolve(); }, 3000).unref();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// The real pinned vector-hub package served over its real HTTP layer. The
|
|
190
|
+
// product's LocalEmbeddingService is attached through the package's supported
|
|
191
|
+
// hub.setEmbeddings API (the accepted probe pattern); the shell-managed
|
|
192
|
+
// runtime-config credential path is not applicable to the offline local model
|
|
193
|
+
// and is documented as the lane's injection boundary.
|
|
194
|
+
async function startVectorHttpServer({ root, port, embedder, hubDist = HUB_DIST }) {
|
|
195
|
+
const { HubManager } = require(path.join(hubDist, 'server', 'manager.js'));
|
|
196
|
+
const { createServer } = require(path.join(hubDist, 'server', 'server.js'));
|
|
197
|
+
fs.mkdirSync(root, { recursive: true });
|
|
198
|
+
process.env.VECTOR_HUB_DISABLE_PICKER = '1';
|
|
199
|
+
const manager = await HubManager.load({ rootPath: root, configPath: path.join(root, 'vector-config.json'), managed: true });
|
|
200
|
+
manager.hub.setEmbeddings(embedder);
|
|
201
|
+
const server = http.createServer(createServer(manager));
|
|
202
|
+
await new Promise(resolve => server.listen(port, '127.0.0.1', resolve));
|
|
203
|
+
return {
|
|
204
|
+
manager,
|
|
205
|
+
server,
|
|
206
|
+
url: `http://127.0.0.1:${server.address().port}`,
|
|
207
|
+
root,
|
|
208
|
+
async stop() {
|
|
209
|
+
server.closeAllConnections();
|
|
210
|
+
await new Promise(resolve => server.close(resolve));
|
|
211
|
+
await manager.dispose?.();
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// An isolated sink for the hook trigger's best-effort site notification. The
|
|
217
|
+
// trigger falls back to KB_SITE_PORT (default 5757 — the developer's LIVE
|
|
218
|
+
// site) when no runtime endpoint file exists, so every Git child in this lane
|
|
219
|
+
// gets KB_SITE_PORT pointed here. Nothing may ever reach the real 5757.
|
|
220
|
+
async function startNotificationSink() {
|
|
221
|
+
const hits = [];
|
|
222
|
+
const server = http.createServer((req, res) => {
|
|
223
|
+
let body = '';
|
|
224
|
+
req.on('data', chunk => { body += chunk; });
|
|
225
|
+
req.on('end', () => {
|
|
226
|
+
let parsed = null;
|
|
227
|
+
try { parsed = JSON.parse(body); } catch { parsed = null; }
|
|
228
|
+
hits.push({ method: req.method, url: req.url, body: parsed });
|
|
229
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
230
|
+
res.end(JSON.stringify({ error: 'notification sink' }));
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
|
|
234
|
+
return { server, hits, port: server.address().port, stop: () => new Promise(resolve => { server.closeAllConnections(); server.close(resolve); }) };
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Git with an explicit environment (the hook inherits it: KB_SITE_PORT sinks
|
|
238
|
+
// the notification, isolated vars keep the trigger away from live surfaces).
|
|
239
|
+
function gitIn(repoPath, args, env = {}) {
|
|
240
|
+
return execFileSync('git', args, { cwd: repoPath, windowsHide: true, encoding: 'utf8', env: fixture.sanitizedEnv(env) }).trim();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
async function waitFor(predicate, timeoutMs, label, intervalMs = 500) {
|
|
244
|
+
const deadline = Date.now() + timeoutMs;
|
|
245
|
+
let last = null;
|
|
246
|
+
while (Date.now() < deadline) {
|
|
247
|
+
last = await predicate();
|
|
248
|
+
if (last) return last;
|
|
249
|
+
await new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
250
|
+
}
|
|
251
|
+
throw new Error(`Timed out after ${timeoutMs}ms waiting for ${label}`);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function writeEvidence(name, value) {
|
|
255
|
+
const file = path.join(LANE_DIR, 'evidence', name);
|
|
256
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
257
|
+
fs.writeFileSync(file, JSON.stringify(value, null, 2), 'utf8');
|
|
258
|
+
return { file, sha256: fixture.sha256File(file) };
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
module.exports = {
|
|
262
|
+
REAL_HOME,
|
|
263
|
+
REPO_ROOT,
|
|
264
|
+
LANE_DIR,
|
|
265
|
+
HUB_DIST,
|
|
266
|
+
workbenchProfileHome,
|
|
267
|
+
loadRuntimeProfile,
|
|
268
|
+
verifyModelCache,
|
|
269
|
+
createProductEmbedder,
|
|
270
|
+
inspectStoredVectors,
|
|
271
|
+
httpJson,
|
|
272
|
+
spawnBridgeConsole,
|
|
273
|
+
startVectorHttpServer,
|
|
274
|
+
startNotificationSink,
|
|
275
|
+
gitIn,
|
|
276
|
+
waitFor,
|
|
277
|
+
writeEvidence,
|
|
278
|
+
...fixture,
|
|
279
|
+
};
|