@sanqianx/project-knowledge 5.0.16 → 5.0.17-rc.1
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/.claude-plugin/marketplace.json +1 -1
- package/_modules/knowledge-engine/README.md +4 -0
- package/_modules/knowledge-engine/package.json +1 -1
- package/_modules/knowledge-engine/src/coordinator.js +9 -5
- package/_modules/knowledge-engine/src/runtime/knowledge-promotion.js +2 -2
- package/_modules/knowledge-engine/src/server.js +5 -4
- package/_modules/knowledge-engine/src/store.js +13 -1
- package/_site/_test/configuration-generation-test.js +22 -0
- package/_site/_test/glm-ui-refresh-review-test.js +385 -0
- package/_site/_test/live-gateway-test.js +48 -0
- package/_site/lib/engine-connection.js +31 -11
- package/_site/lib/live-gateway.js +76 -0
- package/_site/lib/module-bridge.js +51 -19
- package/_site/lib/server-app.js +12 -2
- package/_site/scripts/pack-module-candidates.js +1 -1
- package/_site/scripts/sync-product-content.js +5 -2
- package/_site/scripts/verify-product-runtime.js +1 -0
- package/docs/leader-glm-workbench-playbook.md +6 -0
- package/docs/release-5.0.16-acceptance.md +30 -1
- package/module-runtime-manifest.json +31 -27
- package/package.json +3 -2
- 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/ui/index.html +1 -0
- package/ui/live-client.js +46 -0
- package/ui/product.js +68 -15
- package/vendor-manifest.json +8 -8
|
@@ -1,29 +1,30 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "project-knowledge/module-content/v1",
|
|
3
3
|
"productFiles": {
|
|
4
|
-
"ui/index.html": "
|
|
5
|
-
"ui/product.js": "
|
|
4
|
+
"ui/index.html": "1ad9cd83d1727e98b90391c1ab5ab9b99b5812d1ab9e9262bf1e8f3b49e3331d",
|
|
5
|
+
"ui/product.js": "1a5cee1cdebaffe097cef4f908bc7e595b16734a08f7495ed0d52b9b81137f5e",
|
|
6
6
|
"ui/product.css": "0c31d4937780b3a277689b4619208ad0e5dc59a84d7e27fc16b5f1815d59b47c",
|
|
7
7
|
"ui/favicon.svg": "c48be946b224112ebb0238b44263f7a61bda31e531afa895c2e9801c0ff24f32",
|
|
8
8
|
"plugins/project-knowledge/hooks/claude.json": "d61510327e3e1facbb4c645228e9f50cad05a88b33d80c4c22e5ba9f8b9f5359",
|
|
9
9
|
"plugins/project-knowledge/hooks/codex.json": "216e03c07295606ef6ebb2c4f669ad0d790b5e7c4f3f34600488033db75e4239",
|
|
10
10
|
"plugins/project-knowledge/scripts/context-hook.cjs": "da666153ad5723592cce42d25337ae649f7d93e43fab76b3c6d1263933de063f",
|
|
11
11
|
"plugins/project-knowledge/scripts/mcp-launcher.cjs": "7c68830b5c73eb53ef030756a4de33987f7eab6b1a6cc15602835aac3f954893",
|
|
12
|
-
"plugins/project-knowledge/.claude-plugin/plugin.json": "
|
|
13
|
-
"plugins/project-knowledge/.codex-plugin/plugin.json": "
|
|
14
|
-
"plugins/project-knowledge/.mcp.json": "
|
|
12
|
+
"plugins/project-knowledge/.claude-plugin/plugin.json": "358d98e3f12f5770c5bce3951fcac06d51fbdcc568018ea189a5b165c9bbeb18",
|
|
13
|
+
"plugins/project-knowledge/.codex-plugin/plugin.json": "e3b3b9fc85e97d3e0d853b4be2791f73ef79aa0cb4b9838b77313a39ebff14b8",
|
|
14
|
+
"plugins/project-knowledge/.mcp.json": "4d8f1ce5221a3a8eaaca3334de6e87d48a5695bb641a6702bc253e0c806cdeec",
|
|
15
|
+
"ui/live-client.js": "0d81fa894c629bb839e1931fc3c5ebad4d831aae8232d6ce8c0f542e9e3559e8"
|
|
15
16
|
},
|
|
16
17
|
"modules": {
|
|
17
18
|
"terminal": {
|
|
18
19
|
"name": "@sanqianx/claude-ai-workbench",
|
|
19
20
|
"installName": "claude-ai-workbench",
|
|
20
|
-
"version": "0.13.2-rc.
|
|
21
|
+
"version": "0.13.2-rc.14",
|
|
21
22
|
"files": {
|
|
22
23
|
"LICENSE": "c1b9df1275e769f3dbab000d1e457a2d4b0f28eb5da6c77e48dc37eeba202ed7",
|
|
23
|
-
"README.md": "
|
|
24
|
-
"apps/agent-terminal/app.css": "
|
|
25
|
-
"apps/agent-terminal/app.js": "
|
|
26
|
-
"apps/agent-terminal/index.html": "
|
|
24
|
+
"README.md": "43938c8a64397d340dcf633edc40a7cea7dd8a95b5f82cf612b2c15b66c380b6",
|
|
25
|
+
"apps/agent-terminal/app.css": "b939cc7a287dcbb4f6810072a62528dda90106ffad52e20a59f708625e861cbd",
|
|
26
|
+
"apps/agent-terminal/app.js": "f40bc7699d1bc0f9a192f1e4b8d89d07219de95cc6a935dc602211000b654b38",
|
|
27
|
+
"apps/agent-terminal/index.html": "2d8fc4c9aebcc6b9ebb58afb7b4a88762873d2efc7bea902d201bce033c0ff6b",
|
|
27
28
|
"apps/ai-profile-settings-host/index.html": "bc158f68954506d2b8e43c690f28dbe931eff9a02b1524855ac17e74ea4df736",
|
|
28
29
|
"apps/ai-profile-settings-host/page.css": "8b75cbf7f1ea5aaa92f2889390720ece310a8fd4b9ca38c890fa447d4323a557",
|
|
29
30
|
"apps/ai-profile-settings-host/page.js": "f42755a3ed17bd7e00919cee56875b04035aa3c5526fce889f8ba52f4278a8b8",
|
|
@@ -34,33 +35,34 @@
|
|
|
34
35
|
"apps/minimal-test-host/README.md": "fa73136f4ee3865c2d91eb97b2e8c03679aa4688e44c1e1c8ec6e27d604b0de5",
|
|
35
36
|
"docs/sdk/FILE_LAYOUT.md": "17882f96505c8161bfb66876684b9d2d3f50021a111b8b844502d3cb4e97870a",
|
|
36
37
|
"docs/sdk/INTEGRATION.md": "d4c0c80d2d2fc610205102d703a429bfaa20f9f3a48f1718f5bab02ee90138df",
|
|
37
|
-
"docs/sdk/openapi.yaml": "
|
|
38
|
+
"docs/sdk/openapi.yaml": "579e332a07d8e7c46294c3a5a88298f92f20adc52104d376d4ab782abf407c40",
|
|
38
39
|
"docs/sdk/README.md": "7ab591d39c36a3b84cfdf487ff567040ec453975f3ef0fba86dc822094667b61",
|
|
39
|
-
"package.json": "
|
|
40
|
-
"packages/client/index.d.ts": "
|
|
41
|
-
"packages/client/index.js": "
|
|
42
|
-
"packages/client/package.json": "
|
|
40
|
+
"package.json": "efe1efebd876f89b2ae67568291bcd6e838530ba85259d7a1220267f57e8fb78",
|
|
41
|
+
"packages/client/index.d.ts": "587a66845052dc5cc03c4f41d678808140ea258fdf914be1c6dd2f6c07c1aff1",
|
|
42
|
+
"packages/client/index.js": "6c7abce75086b68c18b9fdab372eff8b70d4bb81da6e7e0f46e4af57de0c523d",
|
|
43
|
+
"packages/client/package.json": "8d0fc0f5c8df9e26607eb17a83a0a087d9b15f26e349cc8ecd671452b2b765de",
|
|
43
44
|
"packages/client/README.md": "342dff9b1dcbc85fccc9b980ed3e4e455aa71133af1d0805b8431ea2ac564ef8",
|
|
44
|
-
"packages/contracts/index.d.ts": "
|
|
45
|
+
"packages/contracts/index.d.ts": "109ed9559b23f92b3840c484b9dd7f293a46866a3937a52e631e52692bb41927",
|
|
45
46
|
"packages/contracts/index.js": "5eeb195d9c4cc54dab064510684ae1350d325fbaf47ff824dad4a04a5bb67d11",
|
|
46
|
-
"packages/contracts/package.json": "
|
|
47
|
+
"packages/contracts/package.json": "aa859245040c51ad2a7411ba8b22d3f8419cb9448c217932867661f699bc9773",
|
|
47
48
|
"packages/contracts/README.md": "44d83a3cc508cec6c5c20dfa1f2c08d5ea03e3afb2853639fdc0a9cc8eb5b9c8",
|
|
48
49
|
"packages/core/index.d.ts": "c95b24a13f8aeeb128497833cf298790563baca6036ea5d29a9d8daff53199d7",
|
|
49
50
|
"packages/core/index.js": "825640d0edc7dd130f22da1f580d2cda355566a40b0b36e42e5f38909605bbfa",
|
|
50
|
-
"packages/core/package.json": "
|
|
51
|
+
"packages/core/package.json": "2feb76a8ac59408edb2f5ee5bc98311f89bd4d4953f190dcaeeebbb0215c3487",
|
|
51
52
|
"packages/core/README.md": "e222c546104a168f1038d95c6c4efb8e5603edd6145ab2cab79cab977fb710e5",
|
|
52
53
|
"packages/server/bin/agent-terminal-server.js": "043dff4d76e3fd213b666a55e581ed1e72f9e5b8de6cb798fbf42bd39ed26861",
|
|
53
54
|
"packages/server/bin/claude-workbench-server.js": "b03c730b6d86faf6974afea26c74109d59b1bbc1ecc656c1d6270258708694ac",
|
|
54
55
|
"packages/server/bin/claude-workbench.js": "98dbd550d4d657056a75a190e7ee0dffd9f760fba58783f3ffb8d389ad7a32de",
|
|
55
|
-
"packages/server/index.d.ts": "
|
|
56
|
-
"packages/server/index.js": "
|
|
57
|
-
"packages/server/lib/agent-discovery.js": "
|
|
56
|
+
"packages/server/index.d.ts": "5083eae083b4a0784299a7be5f409bf581a4dddf515db6c2099f293958985bfa",
|
|
57
|
+
"packages/server/index.js": "cfe6492c01e1daa0c42995d41a5bf0aef99dc06e685f0e23b19bd462038278da",
|
|
58
|
+
"packages/server/lib/agent-discovery.js": "d4988ba3c051f1871540f21725b7952b01796d415e3e23ff82c758137a698150",
|
|
58
59
|
"packages/server/lib/agent-registry.js": "ef14c8ab8f5af56499a0cf1f7167a9495fc1745ef190e5d7b0298659a04a15ff",
|
|
59
60
|
"packages/server/lib/agent-spawn-env.js": "f34f672a6153c8454615c440f41b4c81582c4b7f74f6dace4e26c43df9dba6cf",
|
|
60
61
|
"packages/server/lib/attachment-store.js": "5c92c45c7ec5a8b0ee9c14edb42eeda5fce93d8e654718dcd75c12e3f0bfa6e7",
|
|
61
62
|
"packages/server/lib/bridges/app-server-bridge.js": "c860c6b9e0f63ead9f4f289dad1fe05fc93314e89b29cdf7722fba0472c9af11",
|
|
62
63
|
"packages/server/lib/bridges/opencode-server-bridge.js": "23b6065599bece60cc8d3d4779be90d62a6936ec437424287cc87325d250e02b",
|
|
63
64
|
"packages/server/lib/capture-settings-store.js": "eb18885d7bedd3e353287dd7d1cf81e815e5d65d5d82170aa8fe5506a03de8bd",
|
|
65
|
+
"packages/server/lib/claude-history-recovery.js": "a1c15ef2c863d85ab6447d6b70bda0d69ed1a65dd14e375cb2cad1252068a17e",
|
|
64
66
|
"packages/server/lib/cli-session-recovery.js": "e66dc0ad83af18841bf3a598bb27932af42a20cf9395c16dcbaf9b022a5201b5",
|
|
65
67
|
"packages/server/lib/context-resolver.js": "d3060bfe35fb184e521847fc0900cf6114f8ebf3120ce13ed39dfc224af54660",
|
|
66
68
|
"packages/server/lib/conversation-capture.js": "9f3ee29003eaea4778dc1e4b7e23e868f2ba0268bd43db07317acba62f48a094",
|
|
@@ -72,17 +74,18 @@
|
|
|
72
74
|
"packages/server/lib/drivers/zcode-profile-runtime.js": "77c5ac83551cc424375918863d4a31039984492c3a1c987a615a072ac7cb1f14",
|
|
73
75
|
"packages/server/lib/event-stream.js": "3e6cf39b4599a3b1c9897da31d73c28b288a3d57f7a177ed90618de91977d3c4",
|
|
74
76
|
"packages/server/lib/folder-picker.js": "70f55df999262b90433f2b4251aa69dd70a23b55a84756b5f1d24dbeacfbda31",
|
|
75
|
-
"packages/server/lib/http-handler.js": "
|
|
77
|
+
"packages/server/lib/http-handler.js": "d1a26da0e8ad87d7c6f0635bc43e2937c295f5039c2db2a0ce21bc1afbc34a80",
|
|
76
78
|
"packages/server/lib/json-file.js": "4252b57abcd0aafa45c584bac98fcbaf09174774addbb5a4798b381a7aeb35cc",
|
|
77
79
|
"packages/server/lib/knowledge-context.js": "c3d8a9545547c636e6cdf908be53bef4968e674d2aab235562e762e25c210c06",
|
|
78
80
|
"packages/server/lib/model-detection.js": "fa52213200c1f1a1f00e463ada57c415bf1bd4e2aedfebd04de50750509d06cf",
|
|
79
81
|
"packages/server/lib/profile-store.js": "70a9ff6aa31fe438ba8431f3e461f72e5d977f3510f2c42d39e9133e2f3491a8",
|
|
80
82
|
"packages/server/lib/project-store.js": "5225c78f3216340f01b99356496c8e2c2d9cfc6247954a3f00b273dd2cc5b692",
|
|
81
83
|
"packages/server/lib/session-archive-store.js": "d3335b832a6e9fb9792991056f6596a997a4959efa6e62b60fb60133fb724196",
|
|
82
|
-
"packages/server/lib/
|
|
84
|
+
"packages/server/lib/session-history.js": "7836167666d8032b9894a241ca42befa33fd034d7c9bd894a6399f57f31a2906",
|
|
85
|
+
"packages/server/lib/system-doctor.js": "d098a046f425e90ef25209be69d78beefdfd9c2af92f08068a9bfc52053a8f7d",
|
|
83
86
|
"packages/server/lib/ui-preferences-store.js": "e108cb22e7cc1f3438704913d5401e01de2c0e717eb2abd3bdc4727209393819",
|
|
84
|
-
"packages/server/lib/workbench-service.js": "
|
|
85
|
-
"packages/server/package.json": "
|
|
87
|
+
"packages/server/lib/workbench-service.js": "7453d8cbabbed23e2207fb059c64eb4210ee8f84050ce623766da66c87509407",
|
|
88
|
+
"packages/server/package.json": "c694e6e14303a970a15f16839f826a1f3000883e0220496871c790dcd67a690d",
|
|
86
89
|
"packages/server/README.md": "a34cfaa4f4e859008b44e2be8e1aafb56e97fe83e6129c968a8562945fa843f3",
|
|
87
90
|
"packages/ui/ai-profile-settings.d.ts": "0551b6c6eda6d18ea89a976daddf01b2161195f4874fe2d67a57cd9ecc6ce643",
|
|
88
91
|
"packages/ui/ai-profile-settings.js": "e92bbac67a1199d473e4e44b32d1cc76c5b6c79306d4fef9d9067a1bb6ec42ca",
|
|
@@ -90,7 +93,7 @@
|
|
|
90
93
|
"packages/ui/claude-terminal.js": "96bd217a4a7e4792ae3fbaaf46249ecee13b0f4e01fc6d25a1b8b22d8f8fe00c",
|
|
91
94
|
"packages/ui/index.d.ts": "e547ab39640fe7519fb367b78442dc8a2c51b2efd17b66f8b0a003b154b36ead",
|
|
92
95
|
"packages/ui/index.js": "f4394aabd395938f5c3fe587e430471d4033e83945a9b9c7e0149ad4040982c9",
|
|
93
|
-
"packages/ui/package.json": "
|
|
96
|
+
"packages/ui/package.json": "90f0f2242b6717f1b9c4003e0c82b6ecdb11da9783a45e50c74ee3921ad2c65e",
|
|
94
97
|
"packages/ui/README.md": "793c4a9c286fee23f39062a1976ca3afe9d2816dcdb55e156ba940e1ef514f89",
|
|
95
98
|
"packages/ui/theme.css": "8f03a081272a7db11b196f7a70d0fafb1f8d954778f329f1ba53d110d9d5fd98",
|
|
96
99
|
"src/assets/claude-prompts.json": "cb111f2e0a45afe8a31c251a504d1ab5375966ed61291660e61fd2efd77f6d9f",
|
|
@@ -103,12 +106,13 @@
|
|
|
103
106
|
"src/backend/lib/ai-vendor-presets.js": "02c6de9c2e89ad0286426e8eb4900c3c6a4960ef0e8f9d27ffb5836062abfbb2",
|
|
104
107
|
"src/backend/lib/ai-workspace.js": "969917f26cd0b0a272932714819d838a2bab2a5aac5c4e946647dfa3afa479bf",
|
|
105
108
|
"src/backend/lib/automation-config.js": "c23b868bbcfbcece4465c9c939faccaef582667e858f3f36fc7b6d19bcd545e6",
|
|
106
|
-
"src/backend/lib/claude-cli-runner.js": "
|
|
109
|
+
"src/backend/lib/claude-cli-runner.js": "ef8738d277a0f4300d7158d9f36b315016f69cd3a9b1b0dbecd6df53094273c4",
|
|
107
110
|
"src/backend/lib/data-dir.js": "a62d96d1ab538e37690ad31fe4f51e84120b55b6bc767661ed98ad9242f879db",
|
|
108
111
|
"src/backend/lib/llm-client.js": "76d1a73fbea445b5ac34c23d1a3b084e0884c5efed6f7d3b9ed76d406d2cd038",
|
|
109
112
|
"src/backend/lib/model-context-windows.js": "f64f7c995143407b7390105087e3ebcd56a5a3ba2fd3019478a86f9e3c6b7896",
|
|
110
113
|
"src/backend/lib/prompt-registry.js": "9af496af837c7ae98cea2c5f55e81485dcaedf6f27c94b1d6d0384de897f94b9",
|
|
111
114
|
"src/backend/lib/runtime-config.js": "8335525d2aff757f8022ab037dd00eb7bef7ff87a75ac946d599c2666b092323",
|
|
115
|
+
"src/backend/lib/sdk-turn-stream.js": "3177bbec81cc0d4b1b578305056e4547b26069dde4f0133766a8a16fa3d8f923",
|
|
112
116
|
"src/index.js": "12e436e628ccdaaed1975602507427b8b3fe3493d70beb54023e02a5d19c4fc9",
|
|
113
117
|
"src/sdk-wave-a.ts": "dc6c049b4e6f7a8c4a240b02498e6b247b679f34aefc7ff5b71322d96987de5f",
|
|
114
118
|
"src/sdk-wave-b.ts": "63c7a01b7f003f46439b23d584a01f9c362cc86b368381b96c6b6a83db1ba97a",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sanqianx/project-knowledge",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.17-rc.1",
|
|
4
4
|
"description": "Knowledge base manager with Git integration, AI-driven analysis, and bilingual (zh-CN/en-US) knowledge output",
|
|
5
5
|
"main": "_site/server.js",
|
|
6
6
|
"scripts": {
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"ui/index.html",
|
|
29
29
|
"ui/product.css",
|
|
30
30
|
"ui/product.js",
|
|
31
|
+
"ui/live-client.js",
|
|
31
32
|
"ui/favicon.svg",
|
|
32
33
|
"_site/lib/",
|
|
33
34
|
"_modules/knowledge-engine/",
|
|
@@ -86,7 +87,7 @@
|
|
|
86
87
|
"@sanqianx/vector-hub": "1.0.8-rc.8",
|
|
87
88
|
"buffer": "^6.0.3",
|
|
88
89
|
"cheerio": "^1.2.0",
|
|
89
|
-
"claude-ai-workbench": "npm:@sanqianx/claude-ai-workbench@0.13.2-rc.
|
|
90
|
+
"claude-ai-workbench": "npm:@sanqianx/claude-ai-workbench@0.13.2-rc.14",
|
|
90
91
|
"cross-spawn": "7.0.6",
|
|
91
92
|
"dotenv": "^17.4.2",
|
|
92
93
|
"gpt-tokenizer": "^3.4.0",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "project-knowledge",
|
|
4
4
|
"hooks": "./hooks/claude.json",
|
|
5
|
-
"version": "5.0.
|
|
5
|
+
"version": "5.0.17-rc.1",
|
|
6
6
|
"description": "Read durable project decisions and implementation history from Project Knowledge.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "SanQianX",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"const fs=require('fs'),path=require('path'),os=require('os');const PKG='@sanqianx/project-knowledge',SC='project-knowledge/integration-runtime/v1';let f='';const root=process.env.CLAUDE_PLUGIN_ROOT||process.env.PLUGIN_ROOT;if(root){f=path.join(root,'scripts','mcp-launcher.cjs');if(!fs.existsSync(f))f=''}if(!f){const dd=process.env.KB_DATA_DIR||path.join(os.homedir(),'.project-knowledge-v5');try{const bp=path.join(dd,'integration-runtime.json');const st=fs.statSync(bp);if(st.isFile()&&st.size<=32768){const b=JSON.parse(fs.readFileSync(bp,'utf8'));if(b&&b.schema===SC&&b.packageName===PKG&&typeof b.packageRoot==='string'&&path.isAbsolute(b.packageRoot)){const c=path.join(b.packageRoot,'plugins','project-knowledge','scripts','mcp-launcher.cjs');const rr=fs.realpathSync(b.packageRoot),cr=fs.realpathSync(c);const rel=path.relative(rr,cr);if(rel&&rel!=='..'&&!rel.startsWith('..'+path.sep)&&!path.isAbsolute(rel)&&fs.statSync(cr).isFile())f=cr}}}catch(e){}}if(!f){console.error('[project-knowledge-mcp] 未能通过受信任插件根或已验证的安装绑定定位启动器,已停止;不访问网络,也不加载工作目录源码。');process.exit(127)}require(f);"
|
|
9
9
|
],
|
|
10
10
|
"env": {
|
|
11
|
-
"KB_PLUGIN_VERSION": "5.0.
|
|
11
|
+
"KB_PLUGIN_VERSION": "5.0.17-rc.1"
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
}
|
package/ui/index.html
CHANGED
|
@@ -62,5 +62,6 @@
|
|
|
62
62
|
<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>
|
|
63
63
|
<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>
|
|
64
64
|
<div id="toast" class="toast" role="status" aria-live="polite" hidden></div>
|
|
65
|
+
<script src="/live-client.js"></script>
|
|
65
66
|
<script src="/product.js"></script>
|
|
66
67
|
</body></html>
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
'use strict';
|
|
3
|
+
const channels = new Map(); let socket, timer, sequence = 0, retries = 0;
|
|
4
|
+
function send(value) { if (socket?.readyState === 1) socket.send(JSON.stringify(value)); }
|
|
5
|
+
function subscribe(channel) { send({ type: 'subscribe', id: channel.id, route: channel.route, after: channel.lastEventId }); }
|
|
6
|
+
function connect() {
|
|
7
|
+
if (!channels.size || socket || !navigator.onLine) return;
|
|
8
|
+
clearTimeout(timer);
|
|
9
|
+
const ws = new WebSocket(`${location.protocol === 'https:' ? 'wss:' : 'ws:'}//${location.host}/api/live`); socket = ws;
|
|
10
|
+
ws.onopen = () => { retries = 0; for (const channel of channels.values()) subscribe(channel); };
|
|
11
|
+
ws.onmessage = event => {
|
|
12
|
+
let data; try { data = JSON.parse(event.data); } catch { return; }
|
|
13
|
+
const channel = channels.get(data.id); if (!channel) return;
|
|
14
|
+
if (data.type === 'open') { channel.readyState = 1; channel.emit('open', {}); }
|
|
15
|
+
else if (data.type === 'event') { if (data.cursor != null) channel.lastEventId = data.cursor; channel.emit(data.event, { data: data.data, lastEventId: channel.lastEventId }); }
|
|
16
|
+
else if (data.type === 'error') {
|
|
17
|
+
channel.readyState = 0; channel.emit('error', {}); clearTimeout(channel.retryTimer);
|
|
18
|
+
channel.retryTimer = setTimeout(() => { if (channels.has(channel.id)) subscribe(channel); }, 1500);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
ws.onclose = () => {
|
|
22
|
+
if (socket !== ws) return; socket = null;
|
|
23
|
+
for (const channel of channels.values()) { channel.readyState = 0; channel.emit('error', {}); }
|
|
24
|
+
if (channels.size) timer = setTimeout(connect, Math.min(1000 * 2 ** retries++, 15000));
|
|
25
|
+
};
|
|
26
|
+
ws.onerror = () => {};
|
|
27
|
+
}
|
|
28
|
+
class LiveEventSource {
|
|
29
|
+
static CONNECTING = 0; static OPEN = 1; static CLOSED = 2;
|
|
30
|
+
constructor(route) {
|
|
31
|
+
this.id = `c${++sequence}`; this.route = route; this.readyState = 0; this.lastEventId = ''; this.listeners = new Map(); channels.set(this.id, this);
|
|
32
|
+
connect(); if (socket?.readyState === 1) subscribe(this);
|
|
33
|
+
}
|
|
34
|
+
addEventListener(type, listener) { if (!this.listeners.has(type)) this.listeners.set(type, new Set()); this.listeners.get(type).add(listener); }
|
|
35
|
+
removeEventListener(type, listener) { this.listeners.get(type)?.delete(listener); }
|
|
36
|
+
emit(type, event) { for (const listener of this.listeners.get(type) || []) listener(event); this[`on${type}`]?.(event); }
|
|
37
|
+
close() {
|
|
38
|
+
if (this.readyState === 2) return; this.readyState = 2; clearTimeout(this.retryTimer); channels.delete(this.id); send({ type: 'unsubscribe', id: this.id });
|
|
39
|
+
if (!channels.size) { clearTimeout(timer); const ws = socket; socket = null; ws?.close(); }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
window.addEventListener('online', connect);
|
|
43
|
+
window.addEventListener('offline', () => { socket?.close(); });
|
|
44
|
+
window.addEventListener('beforeunload', () => { for (const channel of [...channels.values()]) channel.close(); });
|
|
45
|
+
window.KnowledgeLive = { EventSource: LiveEventSource, stats: () => ({ connections: socket ? 1 : 0, subscriptions: channels.size }) };
|
|
46
|
+
})();
|
package/ui/product.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
(() => {
|
|
2
2
|
'use strict';
|
|
3
3
|
const $ = id => document.getElementById(id);
|
|
4
|
+
const ProgressSource = window.KnowledgeLive?.EventSource || EventSource;
|
|
4
5
|
const all = selector => [...document.querySelectorAll(selector)];
|
|
5
6
|
const titles = { home: '智脑首页', work: '开始工作', search: '知识检索', memory: '长期记忆', projects: '领域与项目', activity: '活动记录' };
|
|
6
7
|
const modules = { terminal: 'Agent 工作台', vectorHub: '知识索引', eventBridge: '开发事件', engine: '知识引擎' };
|
|
7
8
|
const frames = {
|
|
8
|
-
terminal: { id: 'workFrame', url: '/modules/terminal/agent-terminal/?embed=1&apiBase=/api/terminal', view: 'work', ready: false },
|
|
9
|
+
terminal: { id: 'workFrame', url: '/modules/terminal/agent-terminal/?embed=1&apiBase=/api/terminal&transport=live', view: 'work', ready: false },
|
|
9
10
|
vectorHub: { id: 'vectorFrame', url: '/modules/vectorhub/?embed=1&apiBase=/api/vectorhub&engineBase=/api/engine', view: 'search', ready: false },
|
|
10
11
|
eventBridge: { id: 'bridgeFrame', url: '/modules/eventbridge/?embed=1&apiBase=/api/eventbridge', view: 'activity', ready: false },
|
|
11
12
|
engine: { id: 'engineFrame', url: '/modules/engine/?embed=1&apiBase=/api/engine', ready: false },
|
|
@@ -21,13 +22,18 @@
|
|
|
21
22
|
let toastTimer, refreshTimer, preflightTimer, editingMemoryId, logStream, logEpoch = 0, referenceEpoch = 0, snapshotEpoch = 0, registryEpoch = 0, registryPromise = null, resumeImport = false, unbindProjectId = '', unbinding = false;
|
|
22
23
|
let captureEpoch = 0, captureBusy = false;
|
|
23
24
|
async function api(url, options = {}) {
|
|
24
|
-
const { allowNotReady, ...init } = options;
|
|
25
|
+
const { allowNotReady, timeoutMs = (options.method || 'GET') === 'GET' && !url.includes('pick-folder') ? 3000 : 0, ...init } = options;
|
|
25
26
|
if (init.body && typeof init.body !== 'string') init.body = JSON.stringify(init.body);
|
|
26
27
|
if (init.body) init.headers = { 'Content-Type': 'application/json', ...init.headers };
|
|
27
|
-
const
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
const timer = timeoutMs ? setTimeout(() => controller.abort(), timeoutMs) : null;
|
|
30
|
+
try {
|
|
31
|
+
const response = await fetch(url, { ...init, signal: controller.signal });
|
|
28
32
|
const data = await response.json();
|
|
29
33
|
if (!response.ok || data.ok === false && !allowNotReady) throw Object.assign(new Error(data.error?.message || data.message || (typeof data.error === 'string' ? data.error : `请求失败 (${response.status})`)), { code: data.error?.code || data.error, operationId: data.error?.operationId || response.headers.get('X-Operation-Id') || '' });
|
|
30
34
|
return data;
|
|
35
|
+
} catch (error) { if (controller.signal.aborted) throw new Error('状态读取超时,保留上次内容,请稍后重试。'); throw error; }
|
|
36
|
+
finally { clearTimeout(timer); }
|
|
31
37
|
}
|
|
32
38
|
function toast(text) { $('toast').textContent = text; $('toast').hidden = false; clearTimeout(toastTimer); toastTimer = setTimeout(() => { $('toast').hidden = true; }, 4000); }
|
|
33
39
|
function on(id, event, callback) { $(id).addEventListener(event, e => Promise.resolve(callback(e)).catch(error => toast(error.message))); }
|
|
@@ -47,6 +53,7 @@
|
|
|
47
53
|
}
|
|
48
54
|
function setView(view) {
|
|
49
55
|
if (!titles[view]) view = 'home';
|
|
56
|
+
const changed = state.view !== view;
|
|
50
57
|
state.view = view;
|
|
51
58
|
history.replaceState(null, '', `#${view}`);
|
|
52
59
|
all('[data-view]').forEach(button => button.classList.toggle('active', button.dataset.view === view));
|
|
@@ -57,10 +64,14 @@
|
|
|
57
64
|
if (view === 'activity' && state.activityTab === 'sessions' && activeProject()) initializeFrame('eventBridge');
|
|
58
65
|
Object.keys(frames).forEach(key => post(key, { type: 'kb:visibility', visible: frameVisible(key) }));
|
|
59
66
|
render();
|
|
67
|
+
if (view === 'activity' && (changed || state.activityProject !== state.projectId)) void loadActivityPage();
|
|
60
68
|
}
|
|
61
69
|
function selectProject(id) {
|
|
62
70
|
if (id === state.projectId && activeProject()) return;
|
|
63
71
|
state.projectId = id; state.epoch++;
|
|
72
|
+
state.snapshot.runs = []; state.snapshot.nextCursor = null;
|
|
73
|
+
state.activityProject = null; state.activityBefore = null; state.runDetails = new Map();
|
|
74
|
+
void refreshSnapshot();
|
|
64
75
|
referenceEpoch++; $('referenceDialog').close();
|
|
65
76
|
if ($('logsDialog').open) loadLogs().catch(error => toast(error.message));
|
|
66
77
|
if (!$('systemDrawer').hidden) loadAgentCapture().catch(error => toast(error.message));
|
|
@@ -89,6 +100,7 @@
|
|
|
89
100
|
renderContext();
|
|
90
101
|
}
|
|
91
102
|
function renderHome(candidates) {
|
|
103
|
+
if (!state.projectsLoaded) { $('homeContent').innerHTML = state.projectsError ? '<div class="empty">项目登记读取失败,未把失败当作空知识库。<button data-action="refresh">重试读取</button></div>' : '<div class="empty">正在读取项目登记…</div>'; return; }
|
|
92
104
|
if (!state.projects.length) { $('homeContent').innerHTML = '<div class="empty"><h2>从第一个项目开始</h2><p>选择代码目录和知识目录,保留项目原有文件。</p><button class="primary" data-action="import">导入第一个项目</button></div>'; return; }
|
|
93
105
|
const runs = state.snapshot.runs.filter(r => !state.projectId || r.projectId === state.projectId);
|
|
94
106
|
const issues = runs.filter(r => ['failed', 'index-pending'].includes(r.state));
|
|
@@ -159,10 +171,37 @@
|
|
|
159
171
|
function renderActivity() {
|
|
160
172
|
all('[data-activity-tab]').forEach(button => button.classList.toggle('active', button.dataset.activityTab === state.activityTab));
|
|
161
173
|
$('activityUpdates').hidden = state.activityTab !== 'updates'; $('activitySessions').hidden = state.activityTab !== 'sessions';
|
|
162
|
-
const runs = state.snapshot.runs.filter(r => r.projectId === state.projectId);
|
|
174
|
+
const runs = (state.activityProject === state.projectId ? state.activityPage?.runs || [] : state.snapshot.runs).filter(r => r.projectId === state.projectId).map(r => ({ ...state.runDetails?.get(r.runId), ...r }));
|
|
163
175
|
const open = new Set(all('.run[open]').map(d => d.dataset.runId));
|
|
164
176
|
$('activityUpdates').innerHTML = state.engineAvailable ? runs.map(r => `<details class="run" data-run-id="${esc(r.runId)}" ${open.has(r.runId) ? 'open' : ''}><summary><time>${time(r.startedAt)}</time><strong>${esc(projectName(r.projectId))} · ${esc(r.commitSha.slice(0, 8))}</strong>${badge(label(r), ['failed', 'index-pending'].includes(r.state) ? 'issue' : r.state === 'succeeded' ? 'up' : '')}</summary><div><p>提交:${esc(r.commitSha)}<br>阶段:${esc(r.phase)} · 入口:${esc(r.trigger)}<br>知识晋升:${time(r.promotedAt)} · 索引:${esc(r.indexState)}</p>${r.memoryCapture?.rejected?.length ? `<p>记忆候选:${esc(r.memoryCapture.rejected.length)} 条依据无效,未纳入候选箱;有效知识已保留。可在诊断日志中查看原因。</p>` : ''}${r.error ? `<p class="error">${esc(r.error.message)} (${esc(r.error.code)})</p>${r.error.details ? `<p>失败原因:${esc(r.error.details.upstreamMessage)}<br>类别:${esc(r.error.details.failureKind)} · HTTP:${esc(r.error.details.httpStatus ?? '—')} · 上游代码:${esc(r.error.details.upstreamCode)}<br>请求标识:${esc(r.error.details.requestId || '—')} · 尝试:${esc(r.error.details.attempt)} · 耗时:${esc(r.error.details.durationMs ?? '—')} ms</p>` : ''}` : ''}${(r.staging?.operations || []).map(op => `<div class="operation">${esc(op.operation)} · ${esc(op.path)}<br>${esc(op.reason)}</div>`).join('')}${['failed', 'index-pending'].includes(r.state) ? `<button data-retry-run="${esc(r.runId)}">重试失败阶段</button>` : ''}</div></details>`).join('') || '<div class="empty">当前项目还没有知识维护记录。</div>' : '<div class="empty">知识引擎离线。记录仍保留在本机,连接恢复后自动读取。</div>';
|
|
165
177
|
}
|
|
178
|
+
function renderActivityNavigation() {
|
|
179
|
+
if (state.activityProject !== state.projectId || !state.engineAvailable) return;
|
|
180
|
+
const nav = document.createElement('div'); nav.className = 'actions';
|
|
181
|
+
nav.innerHTML = `${state.activityBefore ? '<button data-run-page="">回到最新记录</button>' : ''}${state.activityPage?.nextCursor ? `<button data-run-page="${esc(state.activityPage.nextCursor)}">更早的记录</button>` : ''}`;
|
|
182
|
+
$('activityUpdates').append(nav);
|
|
183
|
+
}
|
|
184
|
+
let activityEpoch = 0;
|
|
185
|
+
async function loadActivityPage(before = state.activityBefore) {
|
|
186
|
+
const epoch = ++activityEpoch, projectId = state.projectId;
|
|
187
|
+
if (!projectId) return;
|
|
188
|
+
try {
|
|
189
|
+
const result = await api(`/api/engine/runs?summary=1&limit=50&projectId=${encodeURIComponent(projectId)}${before ? `&before=${encodeURIComponent(before)}` : ''}`);
|
|
190
|
+
if (epoch !== activityEpoch || projectId !== state.projectId) return;
|
|
191
|
+
state.activityProject = projectId; state.activityPage = result; state.activityBefore = before;
|
|
192
|
+
if (state.view === 'activity') { renderActivity(); renderActivityNavigation(); }
|
|
193
|
+
} catch { if (epoch === activityEpoch) toast('运行列表刷新失败,保留已有记录。'); }
|
|
194
|
+
}
|
|
195
|
+
document.addEventListener('toggle', async event => {
|
|
196
|
+
const node = event.target;
|
|
197
|
+
if (!node.matches?.('.run[open]') || !node.dataset.runId || node.dataset.loading) return;
|
|
198
|
+
const id = node.dataset.runId, projectId = state.projectId;
|
|
199
|
+
state.runDetails ||= new Map(); if (state.runDetails.has(id)) return;
|
|
200
|
+
node.dataset.loading = '1';
|
|
201
|
+
try { const result = await api(`/api/engine/runs/${encodeURIComponent(id)}`); if (projectId !== state.projectId || result.run.projectId !== projectId) return; state.runDetails.set(id, result.run); renderActivity(); renderActivityNavigation(); }
|
|
202
|
+
catch { if (projectId === state.projectId) toast('运行详情读取失败,请重新展开重试。'); }
|
|
203
|
+
finally { delete node.dataset.loading; }
|
|
204
|
+
}, true);
|
|
166
205
|
function renderContext() {
|
|
167
206
|
const saved = state.contexts.get(state.projectId);
|
|
168
207
|
const context = saved?.status === 'not-retrieved' ? null : saved;
|
|
@@ -186,14 +225,16 @@
|
|
|
186
225
|
}
|
|
187
226
|
async function refreshSnapshot() {
|
|
188
227
|
const epoch = ++snapshotEpoch;
|
|
189
|
-
|
|
190
|
-
|
|
228
|
+
const projectId = state.projectId;
|
|
229
|
+
try { const snapshot = await api(`/api/engine/snapshot?summary=1&limit=50${projectId ? `&projectId=${encodeURIComponent(projectId)}` : ''}`); if (epoch !== snapshotEpoch || projectId !== state.projectId || !navigator.onLine) return; state.snapshot = snapshot; state.engineAvailable = true; state.snapshotStale = false; }
|
|
230
|
+
catch { if (epoch !== snapshotEpoch) return; state.snapshotStale = true; }
|
|
191
231
|
render();
|
|
232
|
+
if (state.view === 'activity') void loadActivityPage();
|
|
192
233
|
}
|
|
193
234
|
function scheduleRefresh() { if (!navigator.onLine) return; clearTimeout(refreshTimer); refreshTimer = setTimeout(() => { refreshSnapshot(); post('eventBridge', { type: 'kb:refresh' }); }, 160); }
|
|
194
235
|
function connectProgress() {
|
|
195
236
|
if (!navigator.onLine || !state.health.engine?.up || state.stream) return;
|
|
196
|
-
const stream = new
|
|
237
|
+
const stream = new ProgressSource('/api/engine/progress?summary=1'); state.stream = stream;
|
|
197
238
|
stream.addEventListener('snapshot', () => { if (state.stream !== stream) return; $('activityConnection').textContent = '已连接实时更新'; scheduleRefresh(); });
|
|
198
239
|
stream.addEventListener('progress', () => { if (state.stream === stream) scheduleRefresh(); });
|
|
199
240
|
stream.onerror = () => { if (state.stream === stream) $('activityConnection').textContent = '连接中断,正在恢复快照'; };
|
|
@@ -204,13 +245,21 @@
|
|
|
204
245
|
const epoch = ++registryEpoch;
|
|
205
246
|
const job = (async () => {
|
|
206
247
|
try {
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
248
|
+
const apply = () => { if (epoch !== registryEpoch) return; renderProjectOptions(); renderSystem(); updateMemoryFilter(); setView(state.view); };
|
|
249
|
+
const projects = api('/api/projects/projection').then(result => {
|
|
250
|
+
if (epoch !== registryEpoch) return;
|
|
251
|
+
state.projects = result.projects; state.projectsLoaded = true; state.projectsError = null;
|
|
252
|
+
if (!activeProject()) { state.projectId = state.projects[0]?.projectId || ''; state.epoch++; }
|
|
253
|
+
Object.keys(frames).forEach(frameContext); apply();
|
|
254
|
+
}).catch(error => { if (epoch === registryEpoch) { state.projectsError = error.message; render(); } throw error; });
|
|
255
|
+
const brain = api('/api/brain').then(brain => {
|
|
256
|
+
if (epoch !== registryEpoch) return;
|
|
257
|
+
state.brain = brain.brain; state.root = brain.knowledgeRoot;
|
|
258
|
+
state.indexStorage = { path: brain.indexStoragePath, ...brain.configuration?.indexStorage }; state.scopeStatus = brain.configuration?.scopeStatus; apply();
|
|
259
|
+
});
|
|
260
|
+
const health = api('/api/modules/health').then(health => { if (epoch !== registryEpoch) return; state.health = health.modules; state.ownership = health.ownership; apply(); connectProgress(); });
|
|
261
|
+
const results = await Promise.allSettled([projects, brain, health, refreshSnapshot()]);
|
|
262
|
+
if (epoch === registryEpoch && results.some(r => r.status === 'rejected')) toast('部分状态暂未刷新,已有内容已保留。');
|
|
214
263
|
} catch (error) { toast(error.message); }
|
|
215
264
|
finally { if (epoch === registryEpoch) { registryPromise = null; connectProgress(); } }
|
|
216
265
|
})();
|
|
@@ -225,6 +274,8 @@
|
|
|
225
274
|
$('systemDot').className = `dot ${down.length || pending ? 'issue' : 'up'}`;
|
|
226
275
|
$('systemTitle').textContent = pending ? '知识引擎连接待恢复' : down.length ? '部分服务需要处理' : '系统连接正常';
|
|
227
276
|
$('systemDetail').textContent = pending ? `${state.ownership.message || '服务恢复后自动重试。'}${state.ownership.error ? ` · ${state.ownership.error.step} (${state.ownership.error.code})` : ''}` : down.length ? down.map(k => modules[k]).join('、') : '本机知识服务已连接';
|
|
277
|
+
if (!pending && state.ownership?.pendingProjects?.length) { $('systemDot').className = 'dot issue'; $('systemTitle').textContent = '部分项目接线待恢复'; $('systemDetail').textContent = state.ownership.message; }
|
|
278
|
+
if (state.snapshotStale) { $('systemDot').className = 'dot issue'; $('systemTitle').textContent = '知识状态刷新未完成'; $('systemDetail').textContent = '保留上次有效内容,连接恢复后自动更新。'; }
|
|
228
279
|
if (storagePending && !pending && !down.length) { $('systemDot').className = 'dot issue'; $('systemTitle').textContent = '索引目录接线待恢复'; $('systemDetail').textContent = `目标目录:${state.indexStorage.expectedPath}。请在系统状态中修复接线。`; }
|
|
229
280
|
if (state.root && state.scopeStatus?.status === 'pending' && !pending && !down.length) { $('systemDot').className = 'dot issue'; $('systemTitle').textContent = '共享知识接线待恢复'; $('systemDetail').textContent = '已有知识与长期记忆保留,请在系统状态中修复接线。'; }
|
|
230
281
|
$('moduleHealth').innerHTML = Object.entries(modules).map(([key, name]) => `<div class="row"><div><b>${esc(name)}</b><small>${esc(state.health[key]?.url || '')}</small></div>${badge(state.health[key]?.up ? '在线' : '离线', state.health[key]?.up ? 'up' : 'issue')}</div>`).join('');
|
|
@@ -312,7 +363,7 @@
|
|
|
312
363
|
if (!$('logsSearch').value.trim()) {
|
|
313
364
|
const streamParams = new URLSearchParams({ streamCursor: result.streamCursor || '' });
|
|
314
365
|
if (projectOnly) streamParams.set('projectId', state.projectId);
|
|
315
|
-
logStream = new
|
|
366
|
+
logStream = new ProgressSource(`/api/logs/stream?${streamParams}`);
|
|
316
367
|
logStream.addEventListener('logs/appended', event => { if (epoch === logEpoch && $('logsDialog').open) appendLog(JSON.parse(event.data).record); });
|
|
317
368
|
}
|
|
318
369
|
}
|
|
@@ -419,12 +470,14 @@
|
|
|
419
470
|
if (button.dataset.memoryTab) { state.memoryTab = button.dataset.memoryTab; renderMemories(); }
|
|
420
471
|
if (button.dataset.activityTab) { state.activityTab = button.dataset.activityTab; setView('activity'); post('eventBridge', { type: 'kb:visibility', visible: state.activityTab === 'sessions' }); post('eventBridge', { type: 'kb:refresh' }); }
|
|
421
472
|
if (button.dataset.action === 'import') openImport();
|
|
473
|
+
if (button.dataset.action === 'refresh') await refreshRegistry(true);
|
|
422
474
|
if (button.dataset.action === 'repair') await repair();
|
|
423
475
|
if (button.dataset.action === 'system') await openSystem();
|
|
424
476
|
if (button.dataset.agentCapture) await changeAgentCapture(button.dataset.agentClient, button.dataset.agentCapture);
|
|
425
477
|
if (button.dataset.agentKnowledge) await repairAgentKnowledge(button.dataset.agentClient);
|
|
426
478
|
if (button.dataset.action === 'unbind') { const p = activeProject(); if (p && !unbinding) { unbindProjectId = p.projectId; $('unbindProjectName').textContent = `解绑「${p.name}」?`; $('unbindFeedback').textContent = ''; $('unbindDialog').showModal(); } }
|
|
427
479
|
if (button.dataset.retryRun) { await api(`/api/engine/runs/${encodeURIComponent(button.dataset.retryRun)}/retry`, { method: 'POST', body: {} }); await refreshSnapshot(); }
|
|
480
|
+
if (button.dataset.runPage !== undefined) await loadActivityPage(button.dataset.runPage || null);
|
|
428
481
|
if (button.dataset.contextIndex !== undefined) await openReference(state.contexts.get(state.projectId).references[Number(button.dataset.contextIndex)]);
|
|
429
482
|
if (button.dataset.memoryAction) {
|
|
430
483
|
const memory = state.snapshot.memories.find(m => m.id === button.dataset.memoryId); if (!memory) return;
|
package/vendor-manifest.json
CHANGED
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
"modules": {
|
|
4
4
|
"knowledge-engine": {
|
|
5
5
|
"name": "@sanqianx/ai-coding-knowledge-engine",
|
|
6
|
-
"version": "0.2.7-rc.
|
|
6
|
+
"version": "0.2.7-rc.10",
|
|
7
7
|
"root": "_modules/knowledge-engine",
|
|
8
8
|
"files": {
|
|
9
|
-
"README.md": "
|
|
10
|
-
"package.json": "
|
|
9
|
+
"README.md": "677a7aaf8f6ae06477423be871306297ccfe9c3a39fa71d87cbfdbb3b83f5b7e",
|
|
10
|
+
"package.json": "2e24f8fc1ac3269bdcbd9b7179edf3eff31758545e970c689ab5ae3cb1c49c41",
|
|
11
11
|
"src/analysis-contract.js": "913a63b63fb4a4a9df071f95bbeb8f8c40ef87e2f8445ab0742086ced70ffbf7",
|
|
12
12
|
"src/analysis-output.js": "95a3c19dcc9ab85d1dba7fee5b9aec80f9c000dfba89da3fd0be25a81e2fb680",
|
|
13
13
|
"src/analysis-worker.js": "a105cabe6e1573b2d986b1e7a5aaf615e2fb53524156fc8e4e2c0a71f2c97e55",
|
|
14
14
|
"src/bin.js": "22208907431d0f3a971a669c7e5eb44b3b7af9bbb36fd7ba17c3b90c4288bd70",
|
|
15
15
|
"src/bridge-client.js": "ae0dba21e4286694bcd9e064ca36564ec997969ae1eb1ce4f8a6665e447cbffe",
|
|
16
16
|
"src/context.js": "edd9d4942f6039dd4aaadec88533042ae130f1b80d935d87f61b071904a6688c",
|
|
17
|
-
"src/coordinator.js": "
|
|
17
|
+
"src/coordinator.js": "55cff6959c7ba068ea8f81dd26b57dd16ec72b7b91856a56b7fa07daea9a3c26",
|
|
18
18
|
"src/diagnostics.js": "f7b516ace61a1e9faaa6876930b9e2e258499a25857d1203f4e53d28bfd0fa1a",
|
|
19
19
|
"src/headless-analyzer.js": "e01f81b8f24a4423c19dd8893be8c702a85edbdbb644322e3acab96c3ebaac7d",
|
|
20
20
|
"src/index-request.js": "78f26b872299005499fff4f2d1f9e8f986784f2ff36a5cf2be2b1e7b7c7d9378",
|
|
@@ -36,18 +36,18 @@
|
|
|
36
36
|
"src/runtime/conversation-store.js": "644318f9c04376a3317ced240dd94afa99a79631f0ecc394c5aa298ae2bc0474",
|
|
37
37
|
"src/runtime/evidence-bundle.js": "33d4614849d5e1d69aba8b75c3a43c18b7b6f94e5c78654c82ef631331cc94cc",
|
|
38
38
|
"src/runtime/git-runner.js": "b74fe197bd4dcf3e70635ef7b1f2615edf965c1d9a3ffe5406aabd41b76d74a9",
|
|
39
|
-
"src/runtime/knowledge-promotion.js": "
|
|
39
|
+
"src/runtime/knowledge-promotion.js": "62fbd8282f83d666f0cae9c39c97a9a9b0175473356a0da0aa3805c757b0a9c1",
|
|
40
40
|
"src/runtime/knowledge-retrieval-service.js": "161917638f518d9436024c7a0960a5b38619e397af91099c01a0232bbd6b6a43",
|
|
41
41
|
"src/runtime/layout.js": "e47fe54c605218493ce46f6289798d9db2a3ecec95089d288ed03d3b75cf871a",
|
|
42
42
|
"src/runtime/markdown-knowledge-indexer.js": "f771afcc1a08bf0c6456d6756c8e04885fac15bc700a86ab0114853ac662727e",
|
|
43
43
|
"src/runtime/scanner.js": "d99fa8d74a6fbbaae75ca49f62127e14cf9e48b1404e4b4d597ef39df5441410",
|
|
44
|
-
"src/server.js": "
|
|
45
|
-
"src/store.js": "
|
|
44
|
+
"src/server.js": "07ecdf2bc8edc2535f185eaedd932ce3e1d18f1a1e54eed4ba36c9060874a902",
|
|
45
|
+
"src/store.js": "8fe9c415c845feefab3e2129b5850686747a880c827189026e3eb6295b158c0a",
|
|
46
46
|
"ui/app.css": "7ad370c269e60a7b5ec907d81a607b2d16bd07b2d7c22a81f102dab51eeb2889",
|
|
47
47
|
"ui/app.js": "33a2ba38f0dafbbb2e30a1eb3fc93476bfcaf528e124e1a9b2edd2fb69221e9e",
|
|
48
48
|
"ui/index.html": "ce3565cfefd4838b11d37a91a906ef26ca5a1834844fe3f7c897b56851a3c418"
|
|
49
49
|
},
|
|
50
|
-
"sourceCommit": "
|
|
50
|
+
"sourceCommit": "10c940a2425daaf27d24500c6f2ba21b79cb91d4"
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
}
|