@sanqianx/project-knowledge 4.7.0 → 5.0.0
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 +17 -17
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +836 -799
- package/README.md +58 -41
- package/_modules/knowledge-engine/README.md +91 -0
- package/_modules/knowledge-engine/package.json +38 -0
- package/_modules/knowledge-engine/src/analysis-contract.js +25 -0
- package/_modules/knowledge-engine/src/analysis-worker.js +54 -0
- package/_modules/knowledge-engine/src/bin.js +52 -0
- package/_modules/knowledge-engine/src/bridge-client.js +24 -0
- package/_modules/knowledge-engine/src/coordinator.js +263 -0
- package/_modules/knowledge-engine/src/headless-analyzer.js +75 -0
- package/_modules/knowledge-engine/src/memories.js +85 -0
- package/_modules/knowledge-engine/src/retrieval.js +116 -0
- package/_modules/knowledge-engine/src/runtime/README.md +7 -0
- package/_modules/knowledge-engine/src/runtime/atomic-file.js +204 -0
- package/_modules/knowledge-engine/src/runtime/automation-config.js +140 -0
- package/_modules/knowledge-engine/src/runtime/commit-conversation-binder.js +249 -0
- package/_modules/knowledge-engine/src/runtime/commit-processing-ledger.js +26 -0
- package/_modules/knowledge-engine/src/runtime/commit-prompt.js +202 -0
- package/_modules/knowledge-engine/src/runtime/commit-reconciler.js +432 -0
- package/_modules/knowledge-engine/src/runtime/content-hash.js +4 -0
- package/_modules/knowledge-engine/src/runtime/contracts.js +279 -0
- package/_modules/knowledge-engine/src/runtime/conversation-exclusions.js +204 -0
- package/_modules/knowledge-engine/src/runtime/conversation-store.js +387 -0
- package/_modules/knowledge-engine/src/runtime/evidence-bundle.js +228 -0
- package/_modules/knowledge-engine/src/runtime/git-runner.js +62 -0
- package/_modules/knowledge-engine/src/runtime/knowledge-promotion.js +444 -0
- package/_modules/knowledge-engine/src/runtime/knowledge-retrieval-service.js +402 -0
- package/_modules/knowledge-engine/src/runtime/layout.js +44 -0
- package/_modules/knowledge-engine/src/runtime/markdown-knowledge-indexer.js +230 -0
- package/_modules/knowledge-engine/src/runtime/scanner.js +298 -0
- package/_modules/knowledge-engine/src/server.js +154 -0
- package/_modules/knowledge-engine/src/store.js +236 -0
- package/_modules/knowledge-engine/ui/app.css +172 -0
- package/_modules/knowledge-engine/ui/app.js +297 -0
- package/_modules/knowledge-engine/ui/index.html +95 -0
- package/_site/README.md +30 -30
- package/_site/_test/ai-profile-resolver-test.js +137 -137
- 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/chat-claudecodeui-match-test.js +92 -92
- package/_site/_test/claude-executable-discovery-test.js +62 -62
- package/_site/_test/claude-workbench-test.js +170 -170
- package/_site/_test/codex-conversation-projection-test.js +2 -1
- package/_site/_test/commit-conversation-binding-test.js +95 -95
- package/_site/_test/commit-evidence-test.js +110 -110
- package/_site/_test/conversation-api-test.js +109 -109
- package/_site/_test/conversation-store-test.js +136 -136
- package/_site/_test/desktop-browser-compat-test.js +28 -28
- package/_site/_test/desktop-hook-runtime-regression-test.js +204 -204
- package/_site/_test/explicit-commit-processor-test.js +37 -37
- package/_site/_test/fixtures/make-git-repos.js +12 -1
- package/_site/_test/folder-picker-output-test.js +19 -19
- package/_site/_test/fresh-hook-reimport-test.js +53 -0
- package/_site/_test/fresh-product-data-test.js +42 -0
- package/_site/_test/full-integration-e2e-test.js +165 -165
- package/_site/_test/git-validation-test.js +2 -2
- 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/import-preflight-api-test.js +234 -233
- package/_site/_test/index-writer-concurrency-test.js +135 -135
- package/_site/_test/integration-adapters-test.js +171 -171
- package/_site/_test/integration-surface-coverage-test.js +164 -164
- package/_site/_test/knowledge-language-control-test.js +170 -170
- 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-storage-startup-test.js +52 -52
- package/_site/_test/knowledge-store-logs-supervision-test.js +89 -89
- 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 +106 -104
- package/_site/_test/markdown-delta-overlay-test.js +85 -85
- package/_site/_test/markdown-maintenance-api-test.js +75 -75
- package/_site/_test/mcp-server-test.js +149 -149
- package/_site/_test/module-artifact-integrity-test.js +27 -0
- package/_site/_test/module-boundary-test.js +30 -0
- package/_site/_test/module-bridge-eventbridge-test.js +7 -0
- package/_site/_test/module-model-configuration-test.js +44 -0
- package/_site/_test/module-process-lifecycle-test.js +24 -0
- package/_site/_test/module-stream-proxy-test.js +34 -0
- package/_site/_test/non-release-ci-test.js +34 -34
- package/_site/_test/offline-boundary-isolation-test.js +32 -32
- package/_site/_test/packaged-ui-smoke-test.js +11 -9
- 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/product-diagnostics-ui-test.js +75 -0
- package/_site/_test/product-import-ui-test.js +92 -0
- package/_site/_test/project-delete-recovery-test.js +64 -64
- package/_site/_test/project-goal-editor-test.js +144 -144
- package/_site/_test/project-lifecycle-transaction-test.js +106 -106
- 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/release-version-sync-test.js +1 -1
- package/_site/_test/requirement-recorder-test.js +173 -173
- package/_site/_test/run-all-tests.js +159 -156
- package/_site/_test/shared-contracts-test.js +58 -58
- package/_site/_test/startup-analysis-disabled-test.js +10 -10
- package/_site/_test/storage-foundation-test.js +78 -78
- package/_site/_test/structured-logger-test.js +101 -101
- package/_site/_test/tracking-start-test.js +109 -108
- package/_site/_test/workbench-permission-test.js +117 -117
- package/_site/_test/workspace-ui-contract-test.js +28 -43
- package/_site/lib/ai-profile-resolver.js +78 -78
- package/_site/lib/ai-workspace.js +101 -101
- package/_site/lib/automation-config.js +140 -140
- package/_site/lib/bridge-adapter.js +1 -0
- package/_site/lib/bridge-consumer-service.js +402 -402
- package/_site/lib/claude-cli-runner.js +1510 -1510
- package/_site/lib/commit-conversation-binder.js +234 -234
- package/_site/lib/commit-processing-ledger.js +27 -27
- package/_site/lib/commit-prompt.js +202 -202
- package/_site/lib/commit-reconciler.js +406 -406
- package/_site/lib/contracts.js +284 -279
- package/_site/lib/conversation-query-service.js +144 -144
- package/_site/lib/conversation-store.js +385 -385
- package/_site/lib/data-dir.js +6 -74
- package/_site/lib/engine-connection.js +67 -0
- package/_site/lib/evidence-bundle.js +228 -228
- package/_site/lib/folder-picker-output.js +21 -21
- package/_site/lib/git-runner.js +62 -62
- package/_site/lib/github-team-store.js +1172 -1172
- package/_site/lib/hook-manager.js +203 -202
- package/_site/lib/index-service.js +173 -173
- package/_site/lib/integration-installer.js +908 -907
- package/_site/lib/kb-framework.js +176 -176
- package/_site/lib/kb-validator.js +124 -124
- package/_site/lib/knowledge-promotion.js +435 -435
- package/_site/lib/knowledge-retrieval-service.js +401 -401
- package/_site/lib/knowledge-tool-runtime.js +359 -359
- package/_site/lib/llm-client.js +161 -161
- package/_site/lib/markdown-knowledge-indexer.js +230 -230
- package/_site/lib/module-bridge.js +191 -36
- package/_site/lib/post-commit-automation.js +87 -87
- package/_site/lib/product-data.js +24 -0
- package/_site/lib/project-lifecycle-service.js +535 -497
- package/_site/lib/project-store.js +268 -262
- package/_site/lib/requirement-recorder.js +278 -278
- package/_site/lib/runtime-endpoint.js +155 -155
- package/_site/lib/scanner.js +298 -298
- package/_site/lib/server-app.js +1579 -1520
- package/_site/lib/settings-store.js +133 -113
- package/_site/lib/storage-layout.js +162 -162
- package/_site/lib/structured-logger.js +574 -574
- package/_site/scripts/folder-picker.ps1 +156 -156
- package/_site/scripts/hook-trigger.js +157 -156
- package/_site/scripts/install-module-candidates.js +69 -0
- package/_site/scripts/pack-module-candidates.js +72 -0
- package/_site/scripts/sync-release-version.js +2 -2
- package/_site/scripts/vendor-modules.js +47 -0
- package/_site/scripts/verify-module-runtime.js +45 -0
- package/_site/scripts/verify-product-runtime.js +34 -0
- package/bin/project-knowledge-mcp.js +194 -194
- package/docs/README.zh-CN.md +42 -29
- package/docs/fresh-v5-start.md +28 -0
- package/docs/project-registry-schema.md +22 -22
- package/docs/testing-strategy.md +33 -33
- package/module-runtime-manifest.json +220 -0
- package/package.json +14 -9
- 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/plugins/project-knowledge/opencode/project-knowledge.md +3 -3
- package/plugins/project-knowledge/skills/project-knowledge/SKILL.md +28 -28
- package/templates/project-readme.md +34 -34
- package/ui/favicon.svg +38 -38
- package/ui/index.html +52 -149
- package/ui/product.css +9 -0
- package/ui/product.js +412 -0
- package/vendor-manifest.json +45 -0
- package/_site/_test/data-dir-migration-test.js +0 -77
- package/_site/_test/import-ui-flow-test.js +0 -171
- package/_site/_test/knowledge-migration-test.js +0 -75
- package/_site/_test/legacy-forward-compat-test.js +0 -257
- package/_site/_test/legacy-project-upgrade-e2e-test.js +0 -363
- package/_site/_test/p0-data-migration-characterization-test.js +0 -37
- package/_site/_test/p0-e2e-gate-test.js +0 -347
- package/_site/_test/project-control-panel-task14-test.js +0 -63
- package/_site/_test/project-layout-v2-migration-test.js +0 -127
- package/_site/_test/server-runtime-migration-safety-test.js +0 -27
- package/_site/_test/task15-20-ui-flow-test.js +0 -148
- package/_site/_test/ui-i18n-toggle-test.js +0 -114
- package/_site/_test/ui-smoke-test.js +0 -73
- package/_site/_test/v4122-upgrade-data-contract-test.js +0 -56
- package/_site/lib/data-state-classifier.js +0 -40
- package/_site/lib/legacy-data-manifest.js +0 -26
- package/_site/lib/migration-service.js +0 -442
- package/ui/app.css +0 -58
- package/ui/app.js +0 -607
- package/ui/i18n.js +0 -146
package/ui/favicon.svg
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="AI knowledge automation">
|
|
2
|
-
<defs>
|
|
3
|
-
<linearGradient id="bg" x1="8" y1="6" x2="56" y2="58" gradientUnits="userSpaceOnUse">
|
|
4
|
-
<stop offset="0" stop-color="#1f3148"/>
|
|
5
|
-
<stop offset=".54" stop-color="#111827"/>
|
|
6
|
-
<stop offset="1" stop-color="#06111f"/>
|
|
7
|
-
</linearGradient>
|
|
8
|
-
<linearGradient id="core" x1="21" y1="16" x2="45" y2="44" gradientUnits="userSpaceOnUse">
|
|
9
|
-
<stop offset="0" stop-color="#dff8ff"/>
|
|
10
|
-
<stop offset=".48" stop-color="#7dd3fc"/>
|
|
11
|
-
<stop offset="1" stop-color="#2f7d64"/>
|
|
12
|
-
</linearGradient>
|
|
13
|
-
<linearGradient id="book" x1="18" y1="35" x2="48" y2="54" gradientUnits="userSpaceOnUse">
|
|
14
|
-
<stop offset="0" stop-color="#f8fafc"/>
|
|
15
|
-
<stop offset="1" stop-color="#b8c6d8"/>
|
|
16
|
-
</linearGradient>
|
|
17
|
-
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
18
|
-
<feGaussianBlur stdDeviation="1.8" result="blur"/>
|
|
19
|
-
<feMerge>
|
|
20
|
-
<feMergeNode in="blur"/>
|
|
21
|
-
<feMergeNode in="SourceGraphic"/>
|
|
22
|
-
</feMerge>
|
|
23
|
-
</filter>
|
|
24
|
-
</defs>
|
|
25
|
-
<rect x="4" y="4" width="56" height="56" rx="15" fill="url(#bg)"/>
|
|
26
|
-
<path d="M16 42c-6-9-3-22 7-28 9-6 21-4 28 5" fill="none" stroke="#38bdf8" stroke-width="3.5" stroke-linecap="round" opacity=".82"/>
|
|
27
|
-
<path d="M48 18h-8l5 6" fill="none" stroke="#38bdf8" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" opacity=".82"/>
|
|
28
|
-
<path d="M50 25c4 10-1 23-12 27-9 4-20 1-25-8" fill="none" stroke="#75b798" stroke-width="3.5" stroke-linecap="round" opacity=".86"/>
|
|
29
|
-
<path d="M13 44h8l-5-6" fill="none" stroke="#75b798" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" opacity=".86"/>
|
|
30
|
-
<path d="M32 13 45 21v15l-13 8-13-8V21z" fill="url(#core)" filter="url(#glow)"/>
|
|
31
|
-
<path d="M32 18v21M23 24l9-6 9 6M23 33l9 6 9-6" fill="none" stroke="#0f1724" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" opacity=".9"/>
|
|
32
|
-
<circle cx="16" cy="20" r="4" fill="#c5a15d"/>
|
|
33
|
-
<circle cx="49" cy="43" r="4" fill="#38bdf8"/>
|
|
34
|
-
<path d="M20 42h25l5 5-6 6H19l-5-5z" fill="url(#book)"/>
|
|
35
|
-
<path d="M20 42 14 48l25 1 6-7" fill="#e2e8f0"/>
|
|
36
|
-
<path d="M19 53h25l6-6" fill="none" stroke="#64748b" stroke-width="2.7" stroke-linecap="round" stroke-linejoin="round"/>
|
|
37
|
-
<path d="M24 47h14" stroke="#4f6f8f" stroke-width="3" stroke-linecap="round"/>
|
|
38
|
-
</svg>
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="AI knowledge automation">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="8" y1="6" x2="56" y2="58" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0" stop-color="#1f3148"/>
|
|
5
|
+
<stop offset=".54" stop-color="#111827"/>
|
|
6
|
+
<stop offset="1" stop-color="#06111f"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
<linearGradient id="core" x1="21" y1="16" x2="45" y2="44" gradientUnits="userSpaceOnUse">
|
|
9
|
+
<stop offset="0" stop-color="#dff8ff"/>
|
|
10
|
+
<stop offset=".48" stop-color="#7dd3fc"/>
|
|
11
|
+
<stop offset="1" stop-color="#2f7d64"/>
|
|
12
|
+
</linearGradient>
|
|
13
|
+
<linearGradient id="book" x1="18" y1="35" x2="48" y2="54" gradientUnits="userSpaceOnUse">
|
|
14
|
+
<stop offset="0" stop-color="#f8fafc"/>
|
|
15
|
+
<stop offset="1" stop-color="#b8c6d8"/>
|
|
16
|
+
</linearGradient>
|
|
17
|
+
<filter id="glow" x="-40%" y="-40%" width="180%" height="180%">
|
|
18
|
+
<feGaussianBlur stdDeviation="1.8" result="blur"/>
|
|
19
|
+
<feMerge>
|
|
20
|
+
<feMergeNode in="blur"/>
|
|
21
|
+
<feMergeNode in="SourceGraphic"/>
|
|
22
|
+
</feMerge>
|
|
23
|
+
</filter>
|
|
24
|
+
</defs>
|
|
25
|
+
<rect x="4" y="4" width="56" height="56" rx="15" fill="url(#bg)"/>
|
|
26
|
+
<path d="M16 42c-6-9-3-22 7-28 9-6 21-4 28 5" fill="none" stroke="#38bdf8" stroke-width="3.5" stroke-linecap="round" opacity=".82"/>
|
|
27
|
+
<path d="M48 18h-8l5 6" fill="none" stroke="#38bdf8" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" opacity=".82"/>
|
|
28
|
+
<path d="M50 25c4 10-1 23-12 27-9 4-20 1-25-8" fill="none" stroke="#75b798" stroke-width="3.5" stroke-linecap="round" opacity=".86"/>
|
|
29
|
+
<path d="M13 44h8l-5-6" fill="none" stroke="#75b798" stroke-width="3.5" stroke-linecap="round" stroke-linejoin="round" opacity=".86"/>
|
|
30
|
+
<path d="M32 13 45 21v15l-13 8-13-8V21z" fill="url(#core)" filter="url(#glow)"/>
|
|
31
|
+
<path d="M32 18v21M23 24l9-6 9 6M23 33l9 6 9-6" fill="none" stroke="#0f1724" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" opacity=".9"/>
|
|
32
|
+
<circle cx="16" cy="20" r="4" fill="#c5a15d"/>
|
|
33
|
+
<circle cx="49" cy="43" r="4" fill="#38bdf8"/>
|
|
34
|
+
<path d="M20 42h25l5 5-6 6H19l-5-5z" fill="url(#book)"/>
|
|
35
|
+
<path d="M20 42 14 48l25 1 6-7" fill="#e2e8f0"/>
|
|
36
|
+
<path d="M19 53h25l6-6" fill="none" stroke="#64748b" stroke-width="2.7" stroke-linecap="round" stroke-linejoin="round"/>
|
|
37
|
+
<path d="M24 47h14" stroke="#4f6f8f" stroke-width="3" stroke-linecap="round"/>
|
|
38
|
+
</svg>
|
package/ui/index.html
CHANGED
|
@@ -1,162 +1,65 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
2
|
<html lang="zh-CN" data-theme="light">
|
|
3
3
|
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<
|
|
6
|
-
<meta name="color-scheme" content="light dark">
|
|
7
|
-
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
|
8
|
-
<link rel="stylesheet" href="/app.css">
|
|
9
|
-
<title>Project Knowledge</title>
|
|
4
|
+
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="light dark">
|
|
5
|
+
<title>Project Knowledge · 我的智脑</title><link rel="icon" href="/favicon.svg"><link rel="stylesheet" href="/product.css">
|
|
10
6
|
</head>
|
|
11
7
|
<body>
|
|
12
|
-
<div class="
|
|
8
|
+
<div class="app">
|
|
13
9
|
<aside class="sidebar">
|
|
14
|
-
<div class="brand">
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
<
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
<nav class="sidebar-nav">
|
|
24
|
-
<button class="nav-btn active" type="button" data-go="terminal"><span>🤖 Agent 终端</span><span class="nav-badge">终端</span><span class="nav-fold" data-fold="term" title="模块项目列表:已折叠,点击展开">▤</span></button>
|
|
25
|
-
<button class="nav-btn" type="button" data-go="search"><span>🔎 知识检索</span><span class="nav-badge">检索</span><span class="nav-fold" data-fold="vh" title="模块项目列表:已折叠,点击展开">▤</span></button>
|
|
26
|
-
<button class="nav-btn" type="button" data-go="bridge"><span>💬 会话浏览</span><span class="nav-badge">会话</span><span class="nav-fold" data-fold="eb" title="模块项目列表:已折叠,点击展开">▤</span></button>
|
|
10
|
+
<div class="brand"><span class="brand-mark">知</span><div><strong>Project Knowledge</strong><small>个人工程智脑</small></div></div>
|
|
11
|
+
<div id="brainLabel" class="brain-label">我的智脑</div>
|
|
12
|
+
<nav aria-label="主要导航">
|
|
13
|
+
<button data-view="home"><svg viewBox="0 0 24 24"><path d="m3 11 9-7 9 7M5 10v10h14V10"/></svg>智脑首页</button>
|
|
14
|
+
<button data-view="work"><svg viewBox="0 0 24 24"><path d="M5 4h14v16H5zM8 8h8M8 12h8M8 16h5"/></svg>开始工作</button>
|
|
15
|
+
<button data-view="search"><svg viewBox="0 0 24 24"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 5 5"/></svg>知识检索</button>
|
|
16
|
+
<button data-view="memory"><svg viewBox="0 0 24 24"><path d="M6 4h12v16H6zM9 8h6M9 12h6"/></svg>长期记忆<span class="count" id="memoryCount" hidden></span></button>
|
|
17
|
+
<button data-view="projects"><svg viewBox="0 0 24 24"><path d="M4 7h6l2 2h8v11H4z"/></svg>领域与项目</button>
|
|
18
|
+
<button data-view="activity"><svg viewBox="0 0 24 24"><path d="M4 7h16M4 12h16M4 17h10"/></svg>活动记录</button>
|
|
27
19
|
</nav>
|
|
20
|
+
<button id="openSystem" class="system-button"><span class="dot" id="systemDot"></span><span><b id="systemTitle">正在检查系统</b><small id="systemDetail">本机知识服务</small></span><svg viewBox="0 0 24 24"><path d="m9 6 6 6-6 6"/></svg></button>
|
|
28
21
|
</aside>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
<
|
|
32
|
-
<
|
|
33
|
-
<div class="header-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class="mobile-strip">
|
|
40
|
-
<select class="input" id="mobile-project" aria-label="选择项目"></select>
|
|
41
|
-
<button class="btn" type="button" data-go="import">导入项目</button>
|
|
42
|
-
<button class="btn" type="button" id="mobile-settings">设置</button>
|
|
22
|
+
<main>
|
|
23
|
+
<header class="topbar"><div><small id="breadcrumb">我的智脑</small><h1 id="pageTitle">智脑首页</h1></div><div class="spacer"></div><select id="projectSelect" aria-label="当前项目"><option value="">尚未导入项目</option></select><button id="themeToggle" class="icon-button" title="切换浅色或深色主题" aria-label="切换主题"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="4"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3"/></svg></button></header>
|
|
24
|
+
<div class="content">
|
|
25
|
+
<section class="view" id="view-home"><div class="welcome"><div><small>工作概览</small><h2 id="homeTitle">我的智脑</h2><p>保存项目事实,连接相关经验。你的长期偏好,只在确认后使用。</p></div><div class="actions"><button class="primary" data-go="work">开始工作</button><button data-action="import">导入项目</button></div></div><div id="homeContent"></div></section>
|
|
26
|
+
<section class="view module-view" id="view-work"><div id="workEmpty" class="empty" hidden>导入项目后,就可以在这里开始工作。<button data-action="import">导入项目</button></div><div class="work-layout" id="workLayout"><div class="frame-container"><iframe id="workFrame" title="Agent 工作台" referrerpolicy="same-origin"></iframe></div><aside class="knowledge-context"><header><h2>本次知识引用</h2><small id="contextScope">任务发送前自动检索</small></header><div id="contextContent" class="empty small-empty">发送任务后显示实际检索到的项目事实、领域经验和已确认记忆。</div></aside></div></section>
|
|
27
|
+
<section class="view module-view" id="view-search"><div class="module-toolbar"><span>查找知识</span><div class="segmented" id="searchScope"><button data-scope="project">当前项目</button><button data-scope="domain">所属领域</button><button data-scope="brain">整个智脑</button></div></div><div id="searchEmpty" class="empty" hidden>尚未导入项目。<button data-action="import">导入项目</button></div><div class="frame-container"><iframe id="vectorFrame" title="知识检索" referrerpolicy="same-origin"></iframe></div></section>
|
|
28
|
+
<section class="view" id="view-memory"><div class="section-heading"><div><h2>长期记忆</h2><p>候选不会自动成为你的偏好。每条记忆都保留来源。</p></div></div><div class="segmented" id="memoryTabs"><button data-memory-tab="confirmed">已确认</button><button data-memory-tab="candidate">候选箱 <span id="candidateCount"></span></button></div><div id="memoryContent"></div></section>
|
|
29
|
+
<section class="view" id="view-projects"><div class="section-heading"><div><h2>领域与项目</h2><p>统一管理归属,项目知识仍保存在原来的目录。</p></div><div class="actions"><button id="createDomain">创建领域</button><button class="primary" data-action="import">导入项目</button></div></div><div class="hierarchy"><div class="panel tree" id="projectTree"></div><div class="panel" id="projectDetail"></div></div></section>
|
|
30
|
+
<section class="view module-view" id="view-activity"><div class="module-toolbar"><div class="segmented" id="activityTabs"><button data-activity-tab="updates">知识更新</button><button data-activity-tab="sessions">开发会话与提交</button></div><span id="activityConnection" class="muted">正在连接更新</span></div><div class="activity-updates" id="activityUpdates"></div><div class="frame-container" id="activitySessions" hidden><iframe id="bridgeFrame" title="开发会话与提交" referrerpolicy="same-origin"></iframe></div></section>
|
|
43
31
|
</div>
|
|
44
|
-
|
|
45
|
-
<!-- Agent 终端:原版 claude-ai-workbench UI(嵌入模式) -->
|
|
46
|
-
<section class="view active" id="view-terminal">
|
|
47
|
-
<div class="embed-head">
|
|
48
|
-
<span class="embed-status" id="st-5760"><span class="st-dot"></span><span class="st-text">检测 127.0.0.1:5760 …</span></span>
|
|
49
|
-
<span class="chip" id="sync-5760">联动: —</span>
|
|
50
|
-
<a class="btn compact embed-open" id="open-5760" href="#" target="_blank" rel="noopener">独立打开 ↗</a>
|
|
51
|
-
</div>
|
|
52
|
-
<div class="embed"><iframe id="fr-5760" title="Agent Terminal"></iframe></div>
|
|
53
|
-
</section>
|
|
54
|
-
|
|
55
|
-
<!-- 知识检索:原版 vector-hub 控制台(嵌入模式) -->
|
|
56
|
-
<section class="view" id="view-search">
|
|
57
|
-
<div class="embed-head">
|
|
58
|
-
<span class="embed-status" id="st-8787"><span class="st-dot"></span><span class="st-text">检测 127.0.0.1:8787 …</span></span>
|
|
59
|
-
<span class="chip" id="sync-8787">联动: —</span>
|
|
60
|
-
<a class="btn compact embed-open" id="open-8787" href="#" target="_blank" rel="noopener">独立打开 ↗</a>
|
|
61
|
-
</div>
|
|
62
|
-
<div class="embed"><iframe id="fr-8787" title="vector-hub 控制台"></iframe></div>
|
|
63
|
-
</section>
|
|
64
|
-
|
|
65
|
-
<!-- 会话浏览:原版 ai-coding-event-bridge 会话浏览器(嵌入模式) -->
|
|
66
|
-
<section class="view" id="view-bridge">
|
|
67
|
-
<div class="embed-head">
|
|
68
|
-
<span class="embed-status" id="st-8790"><span class="st-dot"></span><span class="st-text">检测 127.0.0.1:8790 …</span></span>
|
|
69
|
-
<a class="btn compact embed-open" id="open-8790" href="#" target="_blank" rel="noopener">独立打开 ↗</a>
|
|
70
|
-
</div>
|
|
71
|
-
<div class="embed"><iframe id="fr-8790" title="ai-coding-event-bridge 会话浏览器"></iframe></div>
|
|
72
|
-
</section>
|
|
73
|
-
|
|
74
|
-
<section class="view" id="view-import">
|
|
75
|
-
<div class="split">
|
|
76
|
-
<section class="panel form-panel">
|
|
77
|
-
<div class="section-title">导入项目</div>
|
|
78
|
-
<div class="section-help">导入只建立项目登记、Git 跟踪基线和托管 Hook,不运行初始化分析。两个地址在导入时由人选定,项目与模块的一一对应在登记那一刻确定。</div>
|
|
79
|
-
<form id="import-form" class="form-grid">
|
|
80
|
-
<div class="field"><label for="import-path">① 开发项目地址 · 登记到 Agent 终端</label>
|
|
81
|
-
<div style="display:flex;gap:8px">
|
|
82
|
-
<input class="input code" id="import-path" required placeholder="也可手动输入路径" style="flex:1">
|
|
83
|
-
<button class="btn" type="button" id="import-pick-folder">选择目录…</button>
|
|
84
|
-
</div>
|
|
85
|
-
<span class="muted import-field-help">打开本地目录选择框(终端原生选择器);确认后登记为终端项目</span>
|
|
86
|
-
</div>
|
|
87
|
-
<div class="field"><label for="import-knowledge-path">② 知识库地址 · 登记到 vector-hub</label>
|
|
88
|
-
<div style="display:flex;gap:8px">
|
|
89
|
-
<input class="input code" id="import-knowledge-path" placeholder="也可手动输入路径" style="flex:1">
|
|
90
|
-
<button class="btn" type="button" id="import-pick-knowledge">选择目录…</button>
|
|
91
|
-
</div>
|
|
92
|
-
<span class="muted import-field-help">打开本地目录选择框(检索控制台原生选择器);确认后建索引并监控</span>
|
|
93
|
-
</div>
|
|
94
|
-
<div class="notice" id="import-preflight" hidden></div>
|
|
95
|
-
<div class="notice error" id="import-errors" hidden></div>
|
|
96
|
-
<div class="notice" id="import-auto-init" hidden><strong>该目录不是 Git 仓库</strong><div class="muted">导入事务会自动执行 <code>git init</code>,并将当前目录加入跟踪基线。</div></div>
|
|
97
|
-
<div style="display:flex;gap:8px"><button class="btn-primary" type="submit" id="import-submit" disabled>导入</button><button class="btn" type="reset" id="import-reset">重置</button></div>
|
|
98
|
-
</form>
|
|
99
|
-
</section>
|
|
100
|
-
<aside class="panel preview-panel">
|
|
101
|
-
<div class="section-title">导入目标</div>
|
|
102
|
-
<div class="section-help">两个地址在导入时由人选定,项目与模块的一一对应在登记那一刻确定。</div>
|
|
103
|
-
<div class="preview-list">
|
|
104
|
-
<div class="panel2 preview-item"><div class="preview-label">Git 状态</div><div class="preview-value" id="pv-git-status">等待 preflight</div></div>
|
|
105
|
-
<div class="panel2 preview-item"><div class="preview-label">知识库地址</div><div class="preview-value code" id="pv-knowledge-root">—</div></div>
|
|
106
|
-
<div class="panel2 preview-item"><div class="preview-label">模块登记</div><div class="preview-value" id="pv-modules">待登记</div></div>
|
|
107
|
-
</div>
|
|
108
|
-
</aside>
|
|
109
|
-
</div>
|
|
110
|
-
</section>
|
|
111
32
|
</main>
|
|
112
33
|
</div>
|
|
113
|
-
|
|
114
|
-
<div class="
|
|
115
|
-
<aside class="drawer" id="
|
|
116
|
-
<
|
|
117
|
-
<div class="
|
|
118
|
-
<
|
|
119
|
-
|
|
120
|
-
<section
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
<div><strong>运行记录</strong><p class="section-help">查看系统和项目的运行过程。正常记录保持安静,警告和错误会自动突出;点击记录可查看完整上下文。</p></div>
|
|
124
|
-
<button class="btn" type="button" id="logs-export">导出</button>
|
|
125
|
-
</div>
|
|
126
|
-
<div class="record-sync-warning" id="logs-connection">新记录同步暂时中断,正在自动恢复。</div>
|
|
127
|
-
<div class="record-toolbar">
|
|
128
|
-
<input class="input" id="logs-date" type="date" aria-label="记录日期">
|
|
129
|
-
<select class="input" id="logs-project" aria-label="项目筛选"><option value="">全部项目</option></select>
|
|
130
|
-
<select class="input" id="logs-scope" aria-label="记录范围"><option value="all">全部记录</option><option value="important">重要记录</option><option value="errors">仅异常</option></select>
|
|
131
|
-
<select class="input" id="logs-limit" aria-label="显示记录数量"><option value="500" selected>500 条</option><option value="1000">1000 条</option><option value="2000">2000 条</option><option value="5000">5000 条</option></select>
|
|
132
|
-
<input class="input record-search" id="logs-search" placeholder="搜索运行记录…">
|
|
133
|
-
</div>
|
|
134
|
-
<div class="record-shell">
|
|
135
|
-
<div class="record-list" id="record-list"></div>
|
|
136
|
-
<div class="record-empty" id="record-empty">这个筛选条件下没有运行记录。</div>
|
|
137
|
-
<button class="new-records" type="button" id="new-records" hidden>有新记录</button>
|
|
138
|
-
<div class="record-footer"><span id="logs-summary">正在读取运行记录…</span><span class="record-note">点击任意记录查看级别、阶段和操作详情</span></div>
|
|
139
|
-
</div>
|
|
140
|
-
</div>
|
|
141
|
-
</section>
|
|
34
|
+
<div id="drawerBackdrop" class="drawer-backdrop" hidden></div>
|
|
35
|
+
<dialog id="logsDialog" class="reference-dialog"><div class="dialog-heading"><h2>系统诊断记录</h2><button data-close="logsDialog" aria-label="关闭">×</button></div><div class="actions"><input id="logsSearch" placeholder="查找失败原因或提交 SHA" aria-label="筛选诊断记录"><button id="loadLogs">查询</button><button id="exportLogs">导出诊断记录</button></div><div id="logsStatus" class="muted"></div><div id="logsContent"></div></dialog>
|
|
36
|
+
<aside class="drawer" id="systemDrawer" hidden aria-label="系统状态">
|
|
37
|
+
<header><h2>系统状态</h2><button id="closeSystem" class="icon-button" aria-label="关闭系统状态">×</button></header>
|
|
38
|
+
<div class="drawer-content">
|
|
39
|
+
<section><h3>模块连接</h3><div id="moduleHealth"></div><button id="repairWiring">修复当前项目接线</button><p class="muted" id="wiringFeedback"></p><p class="muted" id="captureStatus"></p></section>
|
|
40
|
+
<section><h3>后台维护模型</h3><p class="muted">使用持久化默认模型,不跟随聊天中的临时切换。</p><select id="maintenanceModel" aria-label="后台维护默认模型"></select><div class="actions"><button id="saveMaintenance">保存默认模型</button><button id="configureProviders">管理模型供应商</button></div><p id="configurationStatus" class="muted"></p></section>
|
|
41
|
+
<section><h3>向量检索模型</h3><p id="embeddingStatus" class="muted">正在读取配置。</p><button id="openEmbedding">配置向量模型</button><p class="muted">凭据由工作台统一保存。未配置时仍可使用文本检索。</p></section>
|
|
42
|
+
<section><h3>智脑设置</h3><label>名称<input id="brainName" maxlength="100"></label><label>知识根目录<div class="input-with-action"><input id="knowledgeRoot"><button id="pickRoot">选择</button></div></label><p class="muted">修改根目录不会移动已有项目知识或共享知识。</p><button id="saveBrainSettings">保存设置</button></section>
|
|
43
|
+
<section><div class="actions"><button id="openEngine">知识引擎诊断</button><button id="openLogs">系统诊断记录</button></div><p class="muted">诊断不影响正在进行的会话与维护。</p></section>
|
|
142
44
|
</div>
|
|
143
45
|
</aside>
|
|
144
|
-
|
|
145
|
-
<div class="
|
|
146
|
-
|
|
147
|
-
<
|
|
148
|
-
<
|
|
149
|
-
<
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
<
|
|
160
|
-
<
|
|
161
|
-
|
|
162
|
-
|
|
46
|
+
<dialog id="embeddingDialog"><form id="embeddingForm">
|
|
47
|
+
<div class="dialog-heading"><h2>向量检索模型</h2><button type="button" data-close="embeddingDialog" aria-label="关闭">×</button></div>
|
|
48
|
+
<p class="muted">可复用模型供应商的凭据,也可在同一配置库保存独立凭据。模型变更会重建派生索引,不会改动知识文件。</p>
|
|
49
|
+
<label>凭据来源<select id="embeddingProfile"><option value="">独立凭据</option></select></label>
|
|
50
|
+
<label>接口协议<select id="embeddingProvider"><option value="minimax">MiniMax</option><option value="openai">OpenAI 兼容</option></select></label>
|
|
51
|
+
<label>向量模型<input id="embeddingModel" required maxlength="200" placeholder="embo-01"></label>
|
|
52
|
+
<label>接口地址<input id="embeddingEndpoint" placeholder="留空使用协议默认地址" autocomplete="off"></label>
|
|
53
|
+
<label id="embeddingSecretLabel">独立凭据<input id="embeddingSecret" type="password" placeholder="已配置时留空保持不变" autocomplete="new-password"></label>
|
|
54
|
+
<p id="embeddingFeedback" class="muted" role="status"></p>
|
|
55
|
+
<div class="dialog-actions"><button type="button" id="disableEmbedding">停用向量模型</button><button type="button" data-close="embeddingDialog">取消</button><button type="submit" class="primary">保存配置</button></div>
|
|
56
|
+
</form></dialog>
|
|
57
|
+
<dialog id="importDialog"><form id="importForm"><div class="dialog-heading"><h2>导入项目</h2><button type="button" data-close="importDialog" aria-label="关闭">×</button></div><p class="muted">绑定代码与新的空知识目录。只建立跟踪基线,不读取旧知识、不分析全部历史。</p><label>代码目录<div class="input-with-action"><input name="localPath" id="importCode" required placeholder="D:\SanQian.Xu\my-project"><button type="button" id="pickCode">选择</button></div></label><label>项目名称<input name="displayName" id="importName" required maxlength="200"></label><label>知识目录<div class="input-with-action"><input name="knowledgePath" id="importKnowledge" required placeholder="D:\SanQian.Xu\knowledge\my-project"><button type="button" id="pickKnowledge">选择</button></div></label><label>所属领域<select name="domainId" id="importDomain"></select></label><label id="gitInitChoice" class="checkbox" hidden><input type="checkbox" name="confirmGitInit">这个目录不是 Git 仓库,我确认初始化 Git。</label><label id="replaceHookChoice" class="checkbox" hidden><input type="checkbox" name="confirmReplaceHook">目录留有旧知识库的托管 Hook,我确认替换为新项目接线。不会覆盖第三方 Hook。</label><div id="preflightStatus" class="feedback" role="status">填写目录后检查导入条件。</div><button type="button" id="setupImportRoot" hidden>设置知识根目录</button><div class="dialog-actions"><button type="button" data-close="importDialog">取消</button><button type="submit" class="primary" id="confirmImport" disabled>导入项目</button></div></form></dialog>
|
|
58
|
+
<dialog id="domainDialog"><form id="domainForm"><div class="dialog-heading"><h2>创建领域</h2><button type="button" data-close="domainDialog" aria-label="关闭">×</button></div><label>领域名称<input name="name" required maxlength="100" placeholder="例如:开发工具"></label><p class="muted">领域用于共享相关项目的知识,不是新的代码项目。</p><div class="dialog-actions"><button type="button" data-close="domainDialog">取消</button><button class="primary" type="submit">创建领域</button></div></form></dialog>
|
|
59
|
+
<dialog id="memoryDialog"><form id="memoryForm"><div class="dialog-heading"><h2>编辑记忆</h2><button type="button" data-close="memoryDialog" aria-label="关闭">×</button></div><label>内容<textarea id="memoryText" maxlength="2000" required rows="5"></textarea></label><p id="memoryEvidence" class="muted"></p><div class="dialog-actions"><button type="button" data-close="memoryDialog">取消</button><button type="submit" class="primary">保存修改</button></div></form></dialog>
|
|
60
|
+
<dialog id="unbindDialog"><form id="unbindForm"><div class="dialog-heading"><h2>解绑项目</h2><button type="button" data-close="unbindDialog" aria-label="关闭">×</button></div><p id="unbindProjectName"></p><p class="muted">项目将从列表移除,取消尚未开始的维护任务。代码、知识文件、提交证据和会话历史仍保留。正在执行的知识写入结束前不会解绑。</p><p id="unbindFeedback" class="feedback" role="status"></p><div class="dialog-actions"><button type="button" data-close="unbindDialog">取消</button><button class="primary" type="submit" id="confirmUnbind">解绑并保留数据</button></div></form></dialog>
|
|
61
|
+
<dialog id="referenceDialog" class="reference-dialog"><div class="dialog-heading"><h2 id="referenceTitle">知识引用</h2><div class="actions"><button id="copyReference">复制引用</button><button data-close="referenceDialog" aria-label="关闭">×</button></div></div><p id="referenceMeta" class="muted"></p><pre id="referenceContent"></pre></dialog>
|
|
62
|
+
<dialog id="engineDialog" class="engine-dialog"><div class="dialog-heading"><h2>知识引擎诊断</h2><button data-close="engineDialog" aria-label="关闭">×</button></div><iframe id="engineFrame" title="知识引擎诊断" referrerpolicy="same-origin"></iframe></dialog>
|
|
63
|
+
<div id="toast" class="toast" role="status" aria-live="polite" hidden></div>
|
|
64
|
+
<script src="/product.js"></script>
|
|
65
|
+
</body></html>
|
package/ui/product.css
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
:root{--page:#f3f5f7;--surface:#fff;--surface2:#f8f9fb;--surface3:#edf1f4;--line:#dce2e8;--text:#202733;--muted:#687587;--faint:#8e99a7;--nav:#eef1f4;--accent:#516f89;--accent-soft:#e6edf3;--good:#397761;--bad:#a05252;--bad-soft:#fbeeee;color-scheme:light}
|
|
2
|
+
#logsDialog{display:flex;flex-direction:column;overflow:hidden}#logsDialog:not([open]){display:none}#logsContent{overflow:auto;min-height:0;flex:1;margin-top:16px}#logsContent .row{align-items:flex-start;cursor:pointer}#logsContent pre{flex:1;min-width:0;margin:0}#logsContent .log-entry{border-bottom:1px solid var(--line)}#logsContent .log-detail{padding:16px;background:var(--surface2);max-height:320px;overflow:auto}#logsContent [data-level=warn],#logsContent [data-level=error],#logsContent [data-level=fatal]{color:var(--bad)}#logsContent .row time,#logsContent .row pre{color:inherit}
|
|
3
|
+
@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;animation:none!important;transition:none!important}}
|
|
4
|
+
.knowledge-context{overflow-x:hidden}.reference{overflow-wrap:anywhere}.reference small{min-width:0;max-width:100%}
|
|
5
|
+
html[data-theme=dark]{--page:#171a1f;--surface:#20252d;--surface2:#252b34;--surface3:#2c333e;--line:#39424f;--text:#e6ebf0;--muted:#a0aaba;--faint:#788393;--nav:#1b2028;--accent:#8aa8cf;--accent-soft:#293748;--good:#81b29a;--bad:#d88b8b;--bad-soft:#39292d;color-scheme:dark}
|
|
6
|
+
*{box-sizing:border-box}[hidden]{display:none!important}html,body{height:100%}body{margin:0;overflow:hidden;background:var(--page);color:var(--text);font:13px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI","Microsoft YaHei",sans-serif}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:34px;padding:6px 12px;border:1px solid var(--line);border-radius:8px;background:var(--surface)}button:hover{background:var(--surface3)}button:disabled{opacity:.5;cursor:not-allowed}button.primary{background:var(--accent);color:#fff;border-color:var(--accent)}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--accent);outline-offset:3px}svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex:none}h1,h2,h3,p{margin:0}h1{font-size:18px;font-weight:650}h2{font-size:16px;font-weight:600}h3{font-size:13px;font-weight:600}small,.muted{color:var(--muted)}small{font-size:11px}p{color:var(--muted);margin-top:8px}input,select,textarea{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:8px 12px;min-width:0}label{display:block;font-size:12px;margin:16px 0;color:var(--muted)}label>input,label>select,label>textarea{display:block;width:100%;margin-top:8px;color:var(--text)}pre{font:12px/1.8 Consolas,"Microsoft YaHei",monospace;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text)}
|
|
7
|
+
.app{height:100%;display:grid;grid-template-columns:232px minmax(0,1fr)}.sidebar{display:flex;flex-direction:column;border-right:1px solid var(--line);background:var(--nav);min-height:0}.brand{display:flex;align-items:center;gap:8px;padding:24px 20px 16px}.brand-mark{width:28px;height:28px;display:grid;place-items:center;border:1px solid var(--line);border-radius:8px;background:var(--surface);color:var(--accent)}.brand strong{font-size:14px}.brand small{display:block}.brain-label{padding:0 20px 16px;color:var(--muted);overflow-wrap:anywhere}.sidebar nav{display:grid;gap:8px;padding:8px 12px}.sidebar nav button{justify-content:flex-start;min-height:40px;text-align:left;border-color:transparent;background:transparent;color:var(--muted)}.sidebar nav button.active{border-color:var(--line);background:var(--surface);color:var(--text)}.count{margin-left:auto;background:var(--surface3);padding:0 6px;border-radius:4px}.system-button{margin: auto 12px 16px;justify-content:flex-start;min-height:56px;background:transparent;border-color:transparent;padding:8px}.system-button>span:nth-child(2){flex:1;text-align:left}.system-button b,.system-button small{display:block;font-size:11px}.dot{width:7px;height:7px;border-radius:50%;background:var(--faint);flex:none}.dot.up{background:var(--good)}.dot.issue{background:var(--bad)}main{min-width:0;min-height:0;display:flex;flex-direction:column}.topbar{height:72px;flex:none;display:flex;align-items:center;gap:16px;padding:0 24px;background:var(--surface);border-bottom:1px solid var(--line)}.spacer{flex:1}.topbar select{width:240px}.icon-button{padding:8px;min-width:34px}.content{position:relative;flex:1;min-height:0}.view{display:none;height:100%;overflow:auto;padding:32px}.view.active{display:block}.view.module-view{padding:0;overflow:hidden}.module-view.active{display:flex;flex-direction:column}.frame-container{position:relative;flex:1;min-width:0;min-height:0;overflow:hidden;background:var(--surface)}iframe{display:block;width:100%;height:100%;border:0;background:var(--surface)}.work-layout{display:grid;grid-template-columns:minmax(0,1fr) 288px;height:100%;min-height:0}.knowledge-context{background:var(--surface2);border-left:1px solid var(--line);overflow:auto;padding:24px 16px}.knowledge-context header{margin-bottom:24px}.knowledge-context h2{font-size:13px}.module-toolbar{flex:none;min-height:56px;display:flex;justify-content:space-between;align-items:center;gap:16px;padding:8px 24px;border-bottom:1px solid var(--line);background:var(--surface)}.segmented{display:flex;gap:4px}.segmented button{background:transparent;border-color:transparent;color:var(--muted)}.segmented button.active{background:var(--surface);border-color:var(--line);color:var(--text)}
|
|
8
|
+
.welcome{display:flex;align-items:center;justify-content:space-between;gap:24px;margin-bottom:32px}.welcome h2{font-size:24px;margin-top:8px}.actions{display:flex;gap:8px;align-items:center}.grid2{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(320px,1fr);gap:24px}.stack{display:grid;gap:24px}.panel{border:1px solid var(--line);background:var(--surface);border-radius:8px;padding:24px;min-width:0}.panel h2{margin-bottom:16px}.section-heading{display:flex;align-items:center;justify-content:space-between;gap:24px;margin-bottom:24px}.section-heading p{font-size:12px}.row{display:flex;align-items:center;gap:16px;padding:16px 0;border-bottom:1px solid var(--line)}.row:last-child{border-bottom:0}.row>div{flex:1;min-width:0}.row b{font-weight:600}.row small{display:block;margin-top:4px;overflow-wrap:anywhere}.row time{color:var(--muted);font-size:11px;flex:none}.status{font-size:11px;border:1px solid var(--line);border-radius:4px;padding:2px 8px;white-space:nowrap;color:var(--muted)}.status.up{color:var(--good)}.status.issue{color:var(--bad);background:var(--bad-soft)}.empty{padding:64px 24px;text-align:center;color:var(--muted);background:var(--surface);border-radius:8px;line-height:1.9}.empty button{display:block;margin:16px auto 0}.small-empty{padding:16px 0;text-align:left;background:transparent;font-size:12px}.hierarchy{display:grid;grid-template-columns:296px minmax(0,1fr);gap:24px}.tree h3{margin:24px 0 8px;color:var(--muted);font-size:11px}.tree button{width:100%;justify-content:flex-start;text-align:left;background:transparent;border-color:transparent;margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree button.active{background:var(--accent-soft);color:var(--accent)}.detail-path{padding:12px 16px;background:var(--surface2);border:1px solid var(--line);border-radius:8px;margin:8px 0 24px;font:12px/1.8 Consolas,"Microsoft YaHei",monospace;overflow-wrap:anywhere}.detail-label{color:var(--muted);font-size:11px}.memory-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px;margin-top:24px}.memory-card{padding:24px;border:1px solid var(--line);border-radius:8px;background:var(--surface)}.memory-card p{color:var(--text);margin:0 0 16px;white-space:pre-wrap}.memory-card .actions{margin-top:16px}.reference{display:block;text-align:left;width:100%;background:transparent;border:0;border-bottom:1px solid var(--line);border-radius:0;padding:16px 0}.reference b,.reference small{display:block;text-align:left}.reference p{font-size:12px;text-align:left}.activity-updates{flex:1;overflow:auto;padding:24px 32px}.run{margin-bottom:16px;background:var(--surface);border:1px solid var(--line);border-radius:8px}.run summary{padding:16px 24px;cursor:pointer;display:flex;align-items:center;gap:16px}.run summary strong{flex:1}.run>div{padding:0 24px 24px}.run .error{color:var(--bad)}.operation{padding:8px 0;color:var(--muted)}
|
|
9
|
+
.drawer-backdrop{position:fixed;inset:0;background:rgba(10,18,25,.25);z-index:20}.drawer{position:fixed;right:0;top:0;height:100%;width:448px;background:var(--surface);border-left:1px solid var(--line);z-index:21;display:flex;flex-direction:column}.drawer>header{height:72px;display:flex;align-items:center;justify-content:space-between;padding:24px;border-bottom:1px solid var(--line)}.drawer-content{overflow:auto;flex:1;padding:24px}.drawer section{padding-bottom:24px;margin-bottom:24px;border-bottom:1px solid var(--line)}.drawer select{width:100%;margin:16px 0}.drawer .actions{flex-wrap:wrap}.drawer section:last-child{border-bottom:0}.input-with-action{display:flex;gap:8px;margin-top:8px}.input-with-action input{flex:1}.input-with-action button{flex:none}.checkbox{display:flex;align-items:center;gap:8px}.checkbox input{width:auto;margin:0}dialog{width:560px;max-width:90vw;max-height:90vh;overflow:auto;background:var(--surface);color:var(--text);border:1px solid var(--line);border-radius:12px;padding:24px}dialog::backdrop{background:rgba(10,18,25,.35)}.dialog-heading{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.dialog-heading>button{border:0;background:transparent;font-size:20px}.dialog-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:24px}.feedback{padding:12px 16px;background:var(--surface2);border:1px solid var(--line);border-radius:8px;color:var(--muted);white-space:pre-wrap}.feedback.issue{color:var(--bad)}.reference-dialog{width:880px}.reference-dialog pre{margin-top:24px;max-height:60vh;overflow:auto}.engine-dialog{width:calc(100vw - 96px);height:calc(100vh - 96px);padding:0;overflow:hidden}.engine-dialog .dialog-heading{height:64px;padding:16px 24px;border-bottom:1px solid var(--line);margin:0}.engine-dialog iframe{height:calc(100% - 64px)}.toast{position:fixed;bottom:24px;right:24px;z-index:50;background:var(--surface);padding:12px 16px;border:1px solid var(--line);border-radius:8px;max-width:480px;color:var(--text)}
|