@sanqianx/claude-ai-workbench 0.13.2 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +156 -156
  3. package/apps/agent-terminal/app.css +636 -613
  4. package/apps/agent-terminal/app.js +125 -65
  5. package/apps/agent-terminal/conversation-composer.js +44 -0
  6. package/apps/agent-terminal/index.html +171 -170
  7. package/apps/agent-terminal/panel-host-proof.html +152 -152
  8. package/apps/agent-terminal/panel-proof-content.html +41 -41
  9. package/apps/agent-terminal/right-workspace-dock.css +187 -159
  10. package/apps/agent-terminal/right-workspace-dock.js +623 -519
  11. package/apps/ai-profile-settings-host/index.html +25 -25
  12. package/apps/ai-profile-settings-host/page.css +1 -1
  13. package/apps/ai-profile-settings-host/page.js +113 -113
  14. package/apps/minimal-test-host/README.md +15 -15
  15. package/apps/minimal-test-host/host.css +2 -2
  16. package/apps/minimal-test-host/host.js +35 -35
  17. package/apps/minimal-test-host/index.html +58 -58
  18. package/apps/minimal-test-host/optional-mock/fault-injection.js +15 -15
  19. package/docs/sdk/FILE_LAYOUT.md +31 -31
  20. package/docs/sdk/INTEGRATION.md +126 -126
  21. package/docs/sdk/README.md +21 -21
  22. package/docs/sdk/SESSION_EVENTS.md +13 -13
  23. package/docs/sdk/openapi.yaml +8 -1
  24. package/package.json +1 -1
  25. package/packages/client/README.md +29 -29
  26. package/packages/client/index.d.ts +122 -122
  27. package/packages/client/index.js +260 -260
  28. package/packages/client/package.json +2 -2
  29. package/packages/contracts/README.md +9 -9
  30. package/packages/contracts/index.d.ts +519 -517
  31. package/packages/contracts/index.js +312 -312
  32. package/packages/contracts/package.json +1 -1
  33. package/packages/core/README.md +8 -8
  34. package/packages/core/index.d.ts +76 -76
  35. package/packages/core/index.js +222 -222
  36. package/packages/core/package.json +2 -2
  37. package/packages/server/README.md +17 -17
  38. package/packages/server/bin/agent-terminal-server.js +42 -42
  39. package/packages/server/bin/claude-workbench.js +225 -225
  40. package/packages/server/index.d.ts +171 -171
  41. package/packages/server/index.js +230 -230
  42. package/packages/server/lib/agent-discovery.js +133 -133
  43. package/packages/server/lib/agent-registry.js +143 -143
  44. package/packages/server/lib/agent-spawn-env.js +17 -17
  45. package/packages/server/lib/attachment-store.js +78 -78
  46. package/packages/server/lib/bridges/app-server-bridge.js +373 -373
  47. package/packages/server/lib/bridges/opencode-server-bridge.js +506 -506
  48. package/packages/server/lib/capture-settings-store.js +35 -35
  49. package/packages/server/lib/claude-history-recovery.js +87 -87
  50. package/packages/server/lib/cli-session-recovery.js +28 -28
  51. package/packages/server/lib/context-resolver.js +55 -55
  52. package/packages/server/lib/conversation-capture.js +51 -51
  53. package/packages/server/lib/delegation-phase-store.js +357 -357
  54. package/packages/server/lib/delegation-store.js +474 -468
  55. package/packages/server/lib/diagnostics.js +32 -32
  56. package/packages/server/lib/drivers/cli-json-runner.js +974 -974
  57. package/packages/server/lib/drivers/codex-driver.js +1442 -1442
  58. package/packages/server/lib/drivers/opencode-driver.js +1554 -1554
  59. package/packages/server/lib/drivers/zcode-driver.js +1250 -1250
  60. package/packages/server/lib/drivers/zcode-profile-runtime.js +71 -71
  61. package/packages/server/lib/event-stream.js +138 -138
  62. package/packages/server/lib/folder-picker.js +623 -623
  63. package/packages/server/lib/http-handler.js +339 -339
  64. package/packages/server/lib/json-file.js +26 -26
  65. package/packages/server/lib/knowledge-context.js +33 -33
  66. package/packages/server/lib/model-detection.js +295 -295
  67. package/packages/server/lib/parent-context.js +44 -0
  68. package/packages/server/lib/profile-store.js +283 -283
  69. package/packages/server/lib/project-store.js +102 -102
  70. package/packages/server/lib/runtime-loader.js +120 -120
  71. package/packages/server/lib/session-archive-store.js +53 -53
  72. package/packages/server/lib/session-history.js +612 -612
  73. package/packages/server/lib/system-doctor.js +125 -125
  74. package/packages/server/lib/ui-preferences-store.js +48 -48
  75. package/packages/server/lib/workbench-service.js +1696 -1675
  76. package/packages/server/package.json +2 -2
  77. package/packages/ui/README.md +30 -30
  78. package/packages/ui/ai-profile-settings.d.ts +45 -45
  79. package/packages/ui/ai-profile-settings.js +283 -283
  80. package/packages/ui/claude-terminal.d.ts +31 -31
  81. package/packages/ui/claude-terminal.js +343 -343
  82. package/packages/ui/index.d.ts +18 -18
  83. package/packages/ui/index.js +51 -51
  84. package/packages/ui/package.json +2 -2
  85. package/packages/ui/theme.css +13 -13
  86. package/src/assets/claude-prompts.json +21 -21
  87. package/src/backend/http/ai-profile-routes.js +61 -61
  88. package/src/backend/http/claude-routes.js +170 -170
  89. package/src/backend/http/node-helpers.js +45 -45
  90. package/src/backend/index.js +21 -21
  91. package/src/backend/lib/ai-adapter.js +144 -144
  92. package/src/backend/lib/ai-profile-store.js +259 -259
  93. package/src/backend/lib/ai-vendor-presets.js +83 -83
  94. package/src/backend/lib/ai-workspace.js +140 -140
  95. package/src/backend/lib/automation-config.js +253 -253
  96. package/src/backend/lib/claude-cli-runner.js +2392 -2392
  97. package/src/backend/lib/data-dir.js +169 -169
  98. package/src/backend/lib/llm-client.js +176 -176
  99. package/src/backend/lib/model-context-windows.js +82 -82
  100. package/src/backend/lib/native-task-control.js +217 -217
  101. package/src/backend/lib/native-task-history-index.js +475 -475
  102. package/src/backend/lib/native-task-history-reader.js +526 -526
  103. package/src/backend/lib/native-task-messages.js +457 -457
  104. package/src/backend/lib/native-task-registry.js +325 -325
  105. package/src/backend/lib/native-task-runtime.js +242 -242
  106. package/src/backend/lib/native-task-trace.js +440 -440
  107. package/src/backend/lib/native-task-transcript.js +393 -393
  108. package/src/backend/lib/prompt-registry.js +166 -166
  109. package/src/backend/lib/runtime-config.js +121 -121
  110. package/src/backend/lib/sdk-session-stream.js +143 -143
  111. package/src/backend/lib/sdk-turn-stream.js +16 -16
  112. package/src/backend/lib/store-scope.js +131 -131
  113. package/src/backend/lib/task-identity.js +104 -104
  114. package/src/backend/lib/task-state-projection.js +58 -58
  115. package/src/index.js +7 -7
  116. package/src/sdk-wave-a.ts +1 -1
  117. package/src/sdk-wave-b.ts +1 -1
  118. package/src/sdk-wave-c.ts +1 -1
  119. package/src/sdk-wave-d.ts +1 -1
  120. package/src/sdk-wave-e.ts +1 -1
@@ -1,169 +1,169 @@
1
- // _site/lib/data-dir.js
2
- //
3
- // Resolves a stable, version-independent data directory for project-knowledge
4
- // runtime state. Runtime data lives OUTSIDE the npm install directory so that
5
- // `npm install -g project-knowledge` upgrades do not destroy user config
6
- // (project registry, AI profiles with API keys, generated knowledge bases,
7
- // logs, AI workspaces).
8
- //
9
- // Resolution order (highest priority first):
10
- // 1. KB_DATA_DIR env var — used by tests and power users who want a custom
11
- // location. Set to "." to use the current working directory.
12
- // 2. <os.homedir()>/.project-knowledge — the default user-specific location.
13
- //
14
- // On first run after upgrade from a 1.x install, the legacy runtime files
15
- // (which lived inside the npm package directory) are silently migrated into
16
- // the new data dir. After that, all updates keep the data dir untouched and
17
- // data survives every future `npm install -g project-knowledge`.
18
-
19
- const fs = require('fs');
20
- const path = require('path');
21
- const { resolveDataDir } = require('./runtime-config');
22
-
23
- let _resolved = null;
24
-
25
- function getDataDir() {
26
- const dataDir = resolveDataDir();
27
- if (_resolved === dataDir) return _resolved;
28
- try {
29
- fs.mkdirSync(dataDir, { recursive: true });
30
- } catch (err) {
31
- // Best-effort. Callers will surface a write error when they actually
32
- // try to write inside the dir; we don't want to crash here just because
33
- // the user's homedir is read-only or the path is bogus.
34
- }
35
- _resolved = dataDir;
36
- return dataDir;
37
- }
38
-
39
- // Reset the cached resolution. Tests use this to switch KB_DATA_DIR between
40
- // cases without re-requiring the module.
41
- function _resetCache() {
42
- _resolved = null;
43
- }
44
-
45
- function hasMigrated() {
46
- return fs.existsSync(path.join(getDataDir(), 'projects.json'));
47
- }
48
-
49
- // Legacy 1.x locations — these lived inside the npm package root. The
50
- // package root for an installed package is the directory that contains
51
- // _site/server.js, _site/lib/, package.json, etc.
52
- const LEGACY_FILE_PATHS = [
53
- 'projects.json',
54
- 'ai-profiles.json',
55
- 'knowledge-store.json',
56
- 'logging.json',
57
- '.jobs-log.json',
58
- 'claude-prompts.json',
59
- '.hook-trigger-errors.log',
60
- ];
61
-
62
- const LEGACY_DIR_PATHS = [
63
- 'projects', // generated KB trees
64
- 'logs', // structured logs
65
- ];
66
-
67
- const LEGACY_AI_DIR = path.join('_site', '_ai'); // per-project AI workspaces lived under _site/_ai/
68
-
69
- function copyDir(src, dest) {
70
- fs.mkdirSync(dest, { recursive: true });
71
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
72
- const from = path.join(src, entry.name);
73
- const to = path.join(dest, entry.name);
74
- if (entry.isDirectory()) copyDir(from, to);
75
- else if (entry.isFile()) fs.copyFileSync(from, to);
76
- }
77
- }
78
-
79
- function migrateFromLegacy({ legacyRoot, logger } = {}) {
80
- // Test escape hatch. Set KB_SKIP_MIGRATION=1 to run against a clean data
81
- // dir without pulling the user's real registry in from the package root.
82
- if (process.env.KB_SKIP_MIGRATION === '1') {
83
- return { ok: true, migrated: false, reason: 'skipped via KB_SKIP_MIGRATION=1' };
84
- }
85
- if (!legacyRoot) {
86
- return { ok: true, migrated: false, reason: 'no legacy root provided' };
87
- }
88
- if (!fs.existsSync(legacyRoot)) {
89
- return { ok: true, migrated: false, reason: 'legacy root does not exist' };
90
- }
91
- const dataDir = getDataDir();
92
- // Safety check: if the legacy root equals the data dir, there's nothing
93
- // to migrate (we'd be copying onto ourselves).
94
- if (path.resolve(legacyRoot) === path.resolve(dataDir)) {
95
- return { ok: true, migrated: false, reason: 'legacy root equals data dir' };
96
- }
97
- if (hasMigrated()) {
98
- return { ok: true, migrated: false, reason: 'already migrated' };
99
- }
100
-
101
- const result = {
102
- ok: true,
103
- migrated: false,
104
- files: 0,
105
- dirs: 0,
106
- source: legacyRoot,
107
- target: dataDir,
108
- };
109
-
110
- for (const rel of LEGACY_FILE_PATHS) {
111
- const from = path.join(legacyRoot, rel);
112
- const to = path.join(dataDir, rel);
113
- if (fs.existsSync(from) && !fs.existsSync(to)) {
114
- try {
115
- fs.mkdirSync(path.dirname(to), { recursive: true });
116
- fs.copyFileSync(from, to);
117
- result.files++;
118
- } catch (err) {
119
- result.ok = false;
120
- result.error = `failed to migrate ${rel}: ${err.message}`;
121
- return result;
122
- }
123
- }
124
- }
125
- for (const rel of LEGACY_DIR_PATHS) {
126
- const from = path.join(legacyRoot, rel);
127
- const to = path.join(dataDir, rel);
128
- if (fs.existsSync(from) && !fs.existsSync(to)) {
129
- try {
130
- copyDir(from, to);
131
- result.dirs++;
132
- } catch (err) {
133
- result.ok = false;
134
- result.error = `failed to migrate ${rel}/: ${err.message}`;
135
- return result;
136
- }
137
- }
138
- }
139
- const aiFrom = path.join(legacyRoot, LEGACY_AI_DIR);
140
- const aiTo = path.join(dataDir, '_ai');
141
- if (fs.existsSync(aiFrom) && !fs.existsSync(aiTo)) {
142
- try {
143
- copyDir(aiFrom, aiTo);
144
- result.dirs++;
145
- } catch (err) {
146
- result.ok = false;
147
- result.error = `failed to migrate _site/_ai/: ${err.message}`;
148
- return result;
149
- }
150
- }
151
-
152
- if (result.files > 0 || result.dirs > 0) {
153
- result.migrated = true;
154
- if (logger) {
155
- logger(`migrated runtime data to ${dataDir} (${result.files} files, ${result.dirs} dirs from ${legacyRoot})`);
156
- }
157
- }
158
- return result;
159
- }
160
-
161
- module.exports = {
162
- getDataDir,
163
- hasMigrated,
164
- migrateFromLegacy,
165
- LEGACY_FILE_PATHS,
166
- LEGACY_DIR_PATHS,
167
- LEGACY_AI_DIR,
168
- _resetCache,
169
- };
1
+ // _site/lib/data-dir.js
2
+ //
3
+ // Resolves a stable, version-independent data directory for project-knowledge
4
+ // runtime state. Runtime data lives OUTSIDE the npm install directory so that
5
+ // `npm install -g project-knowledge` upgrades do not destroy user config
6
+ // (project registry, AI profiles with API keys, generated knowledge bases,
7
+ // logs, AI workspaces).
8
+ //
9
+ // Resolution order (highest priority first):
10
+ // 1. KB_DATA_DIR env var — used by tests and power users who want a custom
11
+ // location. Set to "." to use the current working directory.
12
+ // 2. <os.homedir()>/.project-knowledge — the default user-specific location.
13
+ //
14
+ // On first run after upgrade from a 1.x install, the legacy runtime files
15
+ // (which lived inside the npm package directory) are silently migrated into
16
+ // the new data dir. After that, all updates keep the data dir untouched and
17
+ // data survives every future `npm install -g project-knowledge`.
18
+
19
+ const fs = require('fs');
20
+ const path = require('path');
21
+ const { resolveDataDir } = require('./runtime-config');
22
+
23
+ let _resolved = null;
24
+
25
+ function getDataDir() {
26
+ const dataDir = resolveDataDir();
27
+ if (_resolved === dataDir) return _resolved;
28
+ try {
29
+ fs.mkdirSync(dataDir, { recursive: true });
30
+ } catch (err) {
31
+ // Best-effort. Callers will surface a write error when they actually
32
+ // try to write inside the dir; we don't want to crash here just because
33
+ // the user's homedir is read-only or the path is bogus.
34
+ }
35
+ _resolved = dataDir;
36
+ return dataDir;
37
+ }
38
+
39
+ // Reset the cached resolution. Tests use this to switch KB_DATA_DIR between
40
+ // cases without re-requiring the module.
41
+ function _resetCache() {
42
+ _resolved = null;
43
+ }
44
+
45
+ function hasMigrated() {
46
+ return fs.existsSync(path.join(getDataDir(), 'projects.json'));
47
+ }
48
+
49
+ // Legacy 1.x locations — these lived inside the npm package root. The
50
+ // package root for an installed package is the directory that contains
51
+ // _site/server.js, _site/lib/, package.json, etc.
52
+ const LEGACY_FILE_PATHS = [
53
+ 'projects.json',
54
+ 'ai-profiles.json',
55
+ 'knowledge-store.json',
56
+ 'logging.json',
57
+ '.jobs-log.json',
58
+ 'claude-prompts.json',
59
+ '.hook-trigger-errors.log',
60
+ ];
61
+
62
+ const LEGACY_DIR_PATHS = [
63
+ 'projects', // generated KB trees
64
+ 'logs', // structured logs
65
+ ];
66
+
67
+ const LEGACY_AI_DIR = path.join('_site', '_ai'); // per-project AI workspaces lived under _site/_ai/
68
+
69
+ function copyDir(src, dest) {
70
+ fs.mkdirSync(dest, { recursive: true });
71
+ for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
72
+ const from = path.join(src, entry.name);
73
+ const to = path.join(dest, entry.name);
74
+ if (entry.isDirectory()) copyDir(from, to);
75
+ else if (entry.isFile()) fs.copyFileSync(from, to);
76
+ }
77
+ }
78
+
79
+ function migrateFromLegacy({ legacyRoot, logger } = {}) {
80
+ // Test escape hatch. Set KB_SKIP_MIGRATION=1 to run against a clean data
81
+ // dir without pulling the user's real registry in from the package root.
82
+ if (process.env.KB_SKIP_MIGRATION === '1') {
83
+ return { ok: true, migrated: false, reason: 'skipped via KB_SKIP_MIGRATION=1' };
84
+ }
85
+ if (!legacyRoot) {
86
+ return { ok: true, migrated: false, reason: 'no legacy root provided' };
87
+ }
88
+ if (!fs.existsSync(legacyRoot)) {
89
+ return { ok: true, migrated: false, reason: 'legacy root does not exist' };
90
+ }
91
+ const dataDir = getDataDir();
92
+ // Safety check: if the legacy root equals the data dir, there's nothing
93
+ // to migrate (we'd be copying onto ourselves).
94
+ if (path.resolve(legacyRoot) === path.resolve(dataDir)) {
95
+ return { ok: true, migrated: false, reason: 'legacy root equals data dir' };
96
+ }
97
+ if (hasMigrated()) {
98
+ return { ok: true, migrated: false, reason: 'already migrated' };
99
+ }
100
+
101
+ const result = {
102
+ ok: true,
103
+ migrated: false,
104
+ files: 0,
105
+ dirs: 0,
106
+ source: legacyRoot,
107
+ target: dataDir,
108
+ };
109
+
110
+ for (const rel of LEGACY_FILE_PATHS) {
111
+ const from = path.join(legacyRoot, rel);
112
+ const to = path.join(dataDir, rel);
113
+ if (fs.existsSync(from) && !fs.existsSync(to)) {
114
+ try {
115
+ fs.mkdirSync(path.dirname(to), { recursive: true });
116
+ fs.copyFileSync(from, to);
117
+ result.files++;
118
+ } catch (err) {
119
+ result.ok = false;
120
+ result.error = `failed to migrate ${rel}: ${err.message}`;
121
+ return result;
122
+ }
123
+ }
124
+ }
125
+ for (const rel of LEGACY_DIR_PATHS) {
126
+ const from = path.join(legacyRoot, rel);
127
+ const to = path.join(dataDir, rel);
128
+ if (fs.existsSync(from) && !fs.existsSync(to)) {
129
+ try {
130
+ copyDir(from, to);
131
+ result.dirs++;
132
+ } catch (err) {
133
+ result.ok = false;
134
+ result.error = `failed to migrate ${rel}/: ${err.message}`;
135
+ return result;
136
+ }
137
+ }
138
+ }
139
+ const aiFrom = path.join(legacyRoot, LEGACY_AI_DIR);
140
+ const aiTo = path.join(dataDir, '_ai');
141
+ if (fs.existsSync(aiFrom) && !fs.existsSync(aiTo)) {
142
+ try {
143
+ copyDir(aiFrom, aiTo);
144
+ result.dirs++;
145
+ } catch (err) {
146
+ result.ok = false;
147
+ result.error = `failed to migrate _site/_ai/: ${err.message}`;
148
+ return result;
149
+ }
150
+ }
151
+
152
+ if (result.files > 0 || result.dirs > 0) {
153
+ result.migrated = true;
154
+ if (logger) {
155
+ logger(`migrated runtime data to ${dataDir} (${result.files} files, ${result.dirs} dirs from ${legacyRoot})`);
156
+ }
157
+ }
158
+ return result;
159
+ }
160
+
161
+ module.exports = {
162
+ getDataDir,
163
+ hasMigrated,
164
+ migrateFromLegacy,
165
+ LEGACY_FILE_PATHS,
166
+ LEGACY_DIR_PATHS,
167
+ LEGACY_AI_DIR,
168
+ _resetCache,
169
+ };