common-memory-core 0.2.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.
Files changed (284) hide show
  1. package/.env.sample +3 -0
  2. package/CHANGELOG.md +39 -0
  3. package/LICENSE +21 -0
  4. package/README.md +120 -0
  5. package/SECURITY.md +48 -0
  6. package/dist/cli/codex/transcript-0.153.4.d.ts +20 -0
  7. package/dist/cli/codex/transcript-0.153.4.d.ts.map +1 -0
  8. package/dist/cli/codex/transcript-0.153.4.js +78 -0
  9. package/dist/cli/codex/transcript-0.153.4.js.map +1 -0
  10. package/dist/cli/codex-config.d.ts +2 -0
  11. package/dist/cli/codex-config.d.ts.map +1 -0
  12. package/dist/cli/codex-config.js +5 -0
  13. package/dist/cli/codex-config.js.map +1 -0
  14. package/dist/cli/codex-hook.d.ts +18 -0
  15. package/dist/cli/codex-hook.d.ts.map +1 -0
  16. package/dist/cli/codex-hook.js +140 -0
  17. package/dist/cli/codex-hook.js.map +1 -0
  18. package/dist/cli/codex-session.d.ts +3 -0
  19. package/dist/cli/codex-session.d.ts.map +1 -0
  20. package/dist/cli/codex-session.js +3 -0
  21. package/dist/cli/codex-session.js.map +1 -0
  22. package/dist/cli/flush-command.d.ts +6 -0
  23. package/dist/cli/flush-command.d.ts.map +1 -0
  24. package/dist/cli/flush-command.js +30 -0
  25. package/dist/cli/flush-command.js.map +1 -0
  26. package/dist/cli/host-launch.d.ts +28 -0
  27. package/dist/cli/host-launch.d.ts.map +1 -0
  28. package/dist/cli/host-launch.js +16 -0
  29. package/dist/cli/host-launch.js.map +1 -0
  30. package/dist/cli/host-process.d.ts +3 -0
  31. package/dist/cli/host-process.d.ts.map +1 -0
  32. package/dist/cli/host-process.js +35 -0
  33. package/dist/cli/host-process.js.map +1 -0
  34. package/dist/cli/host-session.d.ts +22 -0
  35. package/dist/cli/host-session.d.ts.map +1 -0
  36. package/dist/cli/host-session.js +204 -0
  37. package/dist/cli/host-session.js.map +1 -0
  38. package/dist/cli/import-command.d.ts +20 -0
  39. package/dist/cli/import-command.d.ts.map +1 -0
  40. package/dist/cli/import-command.js +98 -0
  41. package/dist/cli/import-command.js.map +1 -0
  42. package/dist/cli/interactive-process.d.ts +3 -0
  43. package/dist/cli/interactive-process.d.ts.map +1 -0
  44. package/dist/cli/interactive-process.js +15 -0
  45. package/dist/cli/interactive-process.js.map +1 -0
  46. package/dist/cli/main.d.ts +3 -0
  47. package/dist/cli/main.d.ts.map +1 -0
  48. package/dist/cli/main.js +151 -0
  49. package/dist/cli/main.js.map +1 -0
  50. package/dist/cli/mcp-config.d.ts +16 -0
  51. package/dist/cli/mcp-config.d.ts.map +1 -0
  52. package/dist/cli/mcp-config.js +108 -0
  53. package/dist/cli/mcp-config.js.map +1 -0
  54. package/dist/cli/network-test.d.ts +4 -0
  55. package/dist/cli/network-test.d.ts.map +1 -0
  56. package/dist/cli/network-test.js +28 -0
  57. package/dist/cli/network-test.js.map +1 -0
  58. package/dist/cli/operations.d.ts +26 -0
  59. package/dist/cli/operations.d.ts.map +1 -0
  60. package/dist/cli/operations.js +55 -0
  61. package/dist/cli/operations.js.map +1 -0
  62. package/dist/cli/session-drain.d.ts +3 -0
  63. package/dist/cli/session-drain.d.ts.map +1 -0
  64. package/dist/cli/session-drain.js +34 -0
  65. package/dist/cli/session-drain.js.map +1 -0
  66. package/dist/cli/storage-paths.d.ts +4 -0
  67. package/dist/cli/storage-paths.d.ts.map +1 -0
  68. package/dist/cli/storage-paths.js +15 -0
  69. package/dist/cli/storage-paths.js.map +1 -0
  70. package/dist/cli/tui-integrations.d.ts +4 -0
  71. package/dist/cli/tui-integrations.d.ts.map +1 -0
  72. package/dist/cli/tui-integrations.js +143 -0
  73. package/dist/cli/tui-integrations.js.map +1 -0
  74. package/dist/cli/tui-prompts.d.ts +22 -0
  75. package/dist/cli/tui-prompts.d.ts.map +1 -0
  76. package/dist/cli/tui-prompts.js +64 -0
  77. package/dist/cli/tui-prompts.js.map +1 -0
  78. package/dist/cli/tui-settings.d.ts +21 -0
  79. package/dist/cli/tui-settings.d.ts.map +1 -0
  80. package/dist/cli/tui-settings.js +198 -0
  81. package/dist/cli/tui-settings.js.map +1 -0
  82. package/dist/cli/tui.d.ts +4 -0
  83. package/dist/cli/tui.d.ts.map +1 -0
  84. package/dist/cli/tui.js +292 -0
  85. package/dist/cli/tui.js.map +1 -0
  86. package/dist/cli/work-config.d.ts +24 -0
  87. package/dist/cli/work-config.d.ts.map +1 -0
  88. package/dist/cli/work-config.js +147 -0
  89. package/dist/cli/work-config.js.map +1 -0
  90. package/dist/config/config.d.ts +41 -0
  91. package/dist/config/config.d.ts.map +1 -0
  92. package/dist/config/config.js +193 -0
  93. package/dist/config/config.js.map +1 -0
  94. package/dist/config/private-env.d.ts +8 -0
  95. package/dist/config/private-env.d.ts.map +1 -0
  96. package/dist/config/private-env.js +38 -0
  97. package/dist/config/private-env.js.map +1 -0
  98. package/dist/config/runtime.d.ts +32 -0
  99. package/dist/config/runtime.d.ts.map +1 -0
  100. package/dist/config/runtime.js +85 -0
  101. package/dist/config/runtime.js.map +1 -0
  102. package/dist/core/contracts/errors.d.ts +10 -0
  103. package/dist/core/contracts/errors.d.ts.map +1 -0
  104. package/dist/core/contracts/errors.js +23 -0
  105. package/dist/core/contracts/errors.js.map +1 -0
  106. package/dist/core/safety/external-preflight.d.ts +7 -0
  107. package/dist/core/safety/external-preflight.d.ts.map +1 -0
  108. package/dist/core/safety/external-preflight.js +47 -0
  109. package/dist/core/safety/external-preflight.js.map +1 -0
  110. package/dist/core/safety/redaction.d.ts +2 -0
  111. package/dist/core/safety/redaction.d.ts.map +1 -0
  112. package/dist/core/safety/redaction.js +4 -0
  113. package/dist/core/safety/redaction.js.map +1 -0
  114. package/dist/core/safety/rules.d.ts +6 -0
  115. package/dist/core/safety/rules.d.ts.map +1 -0
  116. package/dist/core/safety/rules.js +14 -0
  117. package/dist/core/safety/rules.js.map +1 -0
  118. package/dist/core/safety/scanner.d.ts +11 -0
  119. package/dist/core/safety/scanner.d.ts.map +1 -0
  120. package/dist/core/safety/scanner.js +18 -0
  121. package/dist/core/safety/scanner.js.map +1 -0
  122. package/dist/core/transaction/fsync.d.ts +6 -0
  123. package/dist/core/transaction/fsync.d.ts.map +1 -0
  124. package/dist/core/transaction/fsync.js +41 -0
  125. package/dist/core/transaction/fsync.js.map +1 -0
  126. package/dist/index.d.ts +16 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +13 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/mcp/ingress.d.ts +61 -0
  131. package/dist/mcp/ingress.d.ts.map +1 -0
  132. package/dist/mcp/ingress.js +134 -0
  133. package/dist/mcp/ingress.js.map +1 -0
  134. package/dist/mcp/server.d.ts +4 -0
  135. package/dist/mcp/server.d.ts.map +1 -0
  136. package/dist/mcp/server.js +92 -0
  137. package/dist/mcp/server.js.map +1 -0
  138. package/dist/mcp/stdio.d.ts +5 -0
  139. package/dist/mcp/stdio.d.ts.map +1 -0
  140. package/dist/mcp/stdio.js +115 -0
  141. package/dist/mcp/stdio.js.map +1 -0
  142. package/dist/memory-manager/contracts/diagnostic.d.ts +14 -0
  143. package/dist/memory-manager/contracts/diagnostic.d.ts.map +1 -0
  144. package/dist/memory-manager/contracts/diagnostic.js +17 -0
  145. package/dist/memory-manager/contracts/diagnostic.js.map +1 -0
  146. package/dist/memory-manager/contracts/disclosure.d.ts +12 -0
  147. package/dist/memory-manager/contracts/disclosure.d.ts.map +1 -0
  148. package/dist/memory-manager/contracts/disclosure.js +8 -0
  149. package/dist/memory-manager/contracts/disclosure.js.map +1 -0
  150. package/dist/memory-manager/contracts/errors.d.ts +15 -0
  151. package/dist/memory-manager/contracts/errors.d.ts.map +1 -0
  152. package/dist/memory-manager/contracts/errors.js +25 -0
  153. package/dist/memory-manager/contracts/errors.js.map +1 -0
  154. package/dist/memory-manager/contracts/model-port.d.ts +38 -0
  155. package/dist/memory-manager/contracts/model-port.d.ts.map +1 -0
  156. package/dist/memory-manager/contracts/model-port.js +2 -0
  157. package/dist/memory-manager/contracts/model-port.js.map +1 -0
  158. package/dist/memory-manager/network/client.d.ts +13 -0
  159. package/dist/memory-manager/network/client.d.ts.map +1 -0
  160. package/dist/memory-manager/network/client.js +122 -0
  161. package/dist/memory-manager/network/client.js.map +1 -0
  162. package/dist/memory-manager/network/route.d.ts +31 -0
  163. package/dist/memory-manager/network/route.d.ts.map +1 -0
  164. package/dist/memory-manager/network/route.js +148 -0
  165. package/dist/memory-manager/network/route.js.map +1 -0
  166. package/dist/memory-manager/openai/abort.d.ts +4 -0
  167. package/dist/memory-manager/openai/abort.d.ts.map +1 -0
  168. package/dist/memory-manager/openai/abort.js +19 -0
  169. package/dist/memory-manager/openai/abort.js.map +1 -0
  170. package/dist/memory-manager/openai/bounded-body.d.ts +2 -0
  171. package/dist/memory-manager/openai/bounded-body.d.ts.map +1 -0
  172. package/dist/memory-manager/openai/bounded-body.js +49 -0
  173. package/dist/memory-manager/openai/bounded-body.js.map +1 -0
  174. package/dist/memory-manager/openai/openai-chat-adapter.d.ts +16 -0
  175. package/dist/memory-manager/openai/openai-chat-adapter.d.ts.map +1 -0
  176. package/dist/memory-manager/openai/openai-chat-adapter.js +51 -0
  177. package/dist/memory-manager/openai/openai-chat-adapter.js.map +1 -0
  178. package/dist/memory-manager/openai/openai-responses-adapter.d.ts +15 -0
  179. package/dist/memory-manager/openai/openai-responses-adapter.d.ts.map +1 -0
  180. package/dist/memory-manager/openai/openai-responses-adapter.js +14 -0
  181. package/dist/memory-manager/openai/openai-responses-adapter.js.map +1 -0
  182. package/dist/memory-manager/openai/options.d.ts +14 -0
  183. package/dist/memory-manager/openai/options.d.ts.map +1 -0
  184. package/dist/memory-manager/openai/options.js +29 -0
  185. package/dist/memory-manager/openai/options.js.map +1 -0
  186. package/dist/memory-manager/openai/remote-http.d.ts +33 -0
  187. package/dist/memory-manager/openai/remote-http.d.ts.map +1 -0
  188. package/dist/memory-manager/openai/remote-http.js +207 -0
  189. package/dist/memory-manager/openai/remote-http.js.map +1 -0
  190. package/dist/memory-manager/openai/response-decoder.d.ts +3 -0
  191. package/dist/memory-manager/openai/response-decoder.d.ts.map +1 -0
  192. package/dist/memory-manager/openai/response-decoder.js +57 -0
  193. package/dist/memory-manager/openai/response-decoder.js.map +1 -0
  194. package/dist/memory-manager/openai/retry.d.ts +8 -0
  195. package/dist/memory-manager/openai/retry.d.ts.map +1 -0
  196. package/dist/memory-manager/openai/retry.js +18 -0
  197. package/dist/memory-manager/openai/retry.js.map +1 -0
  198. package/dist/pi-extension/extraction-runtime.d.ts +51 -0
  199. package/dist/pi-extension/extraction-runtime.d.ts.map +1 -0
  200. package/dist/pi-extension/extraction-runtime.js +87 -0
  201. package/dist/pi-extension/extraction-runtime.js.map +1 -0
  202. package/dist/pi-extension/index.d.ts +19 -0
  203. package/dist/pi-extension/index.d.ts.map +1 -0
  204. package/dist/pi-extension/index.js +172 -0
  205. package/dist/pi-extension/index.js.map +1 -0
  206. package/dist/v2/canonical.d.ts +53 -0
  207. package/dist/v2/canonical.d.ts.map +1 -0
  208. package/dist/v2/canonical.js +321 -0
  209. package/dist/v2/canonical.js.map +1 -0
  210. package/dist/v2/contract.d.ts +34 -0
  211. package/dist/v2/contract.d.ts.map +1 -0
  212. package/dist/v2/contract.js +53 -0
  213. package/dist/v2/contract.js.map +1 -0
  214. package/dist/v2/document-import.d.ts +100 -0
  215. package/dist/v2/document-import.d.ts.map +1 -0
  216. package/dist/v2/document-import.js +259 -0
  217. package/dist/v2/document-import.js.map +1 -0
  218. package/dist/v2/errors.d.ts +6 -0
  219. package/dist/v2/errors.d.ts.map +1 -0
  220. package/dist/v2/errors.js +29 -0
  221. package/dist/v2/errors.js.map +1 -0
  222. package/dist/v2/import.d.ts +26 -0
  223. package/dist/v2/import.d.ts.map +1 -0
  224. package/dist/v2/import.js +48 -0
  225. package/dist/v2/import.js.map +1 -0
  226. package/dist/v2/lock.d.ts +3 -0
  227. package/dist/v2/lock.d.ts.map +1 -0
  228. package/dist/v2/lock.js +47 -0
  229. package/dist/v2/lock.js.map +1 -0
  230. package/dist/v2/memory-maintainer.md +38 -0
  231. package/dist/v2/read-guidance.d.ts +3 -0
  232. package/dist/v2/read-guidance.d.ts.map +1 -0
  233. package/dist/v2/read-guidance.js +3 -0
  234. package/dist/v2/read-guidance.js.map +1 -0
  235. package/dist/v2/reader.d.ts +25 -0
  236. package/dist/v2/reader.d.ts.map +1 -0
  237. package/dist/v2/reader.js +38 -0
  238. package/dist/v2/reader.js.map +1 -0
  239. package/dist/v2/registry.d.ts +14 -0
  240. package/dist/v2/registry.d.ts.map +1 -0
  241. package/dist/v2/registry.js +46 -0
  242. package/dist/v2/registry.js.map +1 -0
  243. package/dist/v2/runtime.d.ts +133 -0
  244. package/dist/v2/runtime.d.ts.map +1 -0
  245. package/dist/v2/runtime.js +326 -0
  246. package/dist/v2/runtime.js.map +1 -0
  247. package/dist/v2/session-drain.d.ts +14 -0
  248. package/dist/v2/session-drain.d.ts.map +1 -0
  249. package/dist/v2/session-drain.js +16 -0
  250. package/dist/v2/session-drain.js.map +1 -0
  251. package/dist/v2/session.d.ts +54 -0
  252. package/dist/v2/session.d.ts.map +1 -0
  253. package/dist/v2/session.js +158 -0
  254. package/dist/v2/session.js.map +1 -0
  255. package/dist/v2/writer.d.ts +40 -0
  256. package/dist/v2/writer.d.ts.map +1 -0
  257. package/dist/v2/writer.js +327 -0
  258. package/dist/v2/writer.js.map +1 -0
  259. package/docs/00-index.md +19 -0
  260. package/docs/03-target-architecture.md +49 -0
  261. package/docs/init-v0.1-closeout.md +152 -0
  262. package/docs/init-v0.1-design.md +237 -0
  263. package/docs/init-v0.1-verification.md +303 -0
  264. package/docs/outbound-network-design.md +100 -0
  265. package/docs/outbound-network-verification.json +300 -0
  266. package/docs/provider-verification.md +94 -0
  267. package/docs/releasing.md +138 -0
  268. package/docs/session-integration.md +134 -0
  269. package/docs/tui-workbench.md +173 -0
  270. package/docs/usage.md +815 -0
  271. package/docs/v2-ablation-results.json +12035 -0
  272. package/docs/v2-ablation.md +117 -0
  273. package/docs/v2-evaluation-repeat-results.json +7 -0
  274. package/docs/v2-evaluation-scripted-results.json +67 -0
  275. package/docs/v2-evaluation.md +35 -0
  276. package/docs/v2-optimization-plan.md +23 -0
  277. package/docs/v2-performance-baseline-runtime.js.txt +231 -0
  278. package/docs/v2-performance-baseline.json +338 -0
  279. package/docs/v2-performance-behavior-equivalence.json +17 -0
  280. package/docs/v2-performance-results.json +585 -0
  281. package/docs/v2-performance.md +88 -0
  282. package/docs/v2-replacement-test-map.md +14 -0
  283. package/docs/v2-verification.md +49 -0
  284. package/package.json +87 -0
@@ -0,0 +1,143 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { existsSync, writeFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { configDirectory, loadConfig } from '../config/config.js';
6
+ import { listProjects } from './operations.js';
7
+ import { prepareHostBundle, writeHostBundle } from './work-config.js';
8
+ import { renderMcpConfig } from './mcp-config.js';
9
+ import { shellQuote } from './host-launch.js';
10
+ import { runInteractiveProcess } from './interactive-process.js';
11
+ import { checkConfigUnchanged, hasApiKey } from './tui-settings.js';
12
+ import { attempt, confirm, expandPath, menu, note, terminalText, text, unwrap, viewText } from './tui-prompts.js';
13
+ const packageRoot = fileURLToPath(new URL('../../', import.meta.url));
14
+ export function integrationReadiness(config) {
15
+ return [
16
+ `Runtime: Node ${process.versions.node}; home: ${configDirectory()}`,
17
+ `Store: ${config.dataRoot}`,
18
+ `Read: no API key needed; scopes: ${config.disclosure.allowedScopes.join(', ')}`,
19
+ `Capture: user_explicit ${config.disclosure.allowedProvenance.includes('user_explicit') ? 'authorized' : 'not authorized'}`,
20
+ `Init: agent_observation ${config.disclosure.allowedProvenance.includes('agent_observation') ? 'authorized' : 'not authorized'}`,
21
+ `Writer credential: ${hasApiKey(config) ? 'configured (not tested)' : 'missing'}`,
22
+ `Writable scopes: ${config.writableScopes.join(', ') || '(none)'}`,
23
+ 'Host installation / enabled tools / hook trust: NOT VERIFIED by these local checks.',
24
+ 'Generated does not mean installed, trusted, connected, or successfully committed.',
25
+ ].join('\n');
26
+ }
27
+ async function chooseWorkspaces(config) {
28
+ const projects = listProjects(config);
29
+ if (!projects.length)
30
+ return [];
31
+ return unwrap(await clack.multiselect({ message: 'Optional registered project reads (global is included separately)', required: false,
32
+ options: projects.map(p => ({ value: p.root, label: terminalText(p.name), hint: terminalText(`${p.root} · ${config.disclosure.allowedScopes.includes(`project:${p.id}`) ? 'disclosure allowed' : 'NOT authorized'}`) })), initialValues: [] }));
33
+ }
34
+ async function launchMode() {
35
+ // A WSL terminal does not establish the agent's operating environment.
36
+ const mode = await menu('Where does the agent process run?', [
37
+ { value: 'posix', label: 'Same POSIX environment as Common Memory', hint: 'macOS or agent inside this WSL/Linux runtime' },
38
+ { value: 'wsl', label: 'Native Windows agent → this WSL runtime', hint: 'Explicit distribution and Linux user; no Windows-native Core' },
39
+ ]);
40
+ if (mode === 'posix')
41
+ return { wsl: false, workspaces: [] };
42
+ return { wsl: true, distro: await text('WSL distribution', process.env.WSL_DISTRO_NAME ?? ''), user: await text('Linux user in that distribution'), workspaces: [] };
43
+ }
44
+ async function generateHost(config, client) {
45
+ const options = await launchMode();
46
+ options.workspaces = await chooseWorkspaces(config);
47
+ const output = expandPath(await text('New bundle directory (must not already exist)'));
48
+ const args = ['--mode', options.wsl ? 'windows-wsl' : 'posix', '--output', output, ...options.workspaces.flatMap(w => ['--workspace', w])];
49
+ if (options.wsl) {
50
+ args.push('--distro', options.distro, '--user', options.user);
51
+ const bridge = await text('Absolute Windows destination of common-memory-bridge.ps1 (blank: translate output with wslpath)', '', true);
52
+ if (bridge)
53
+ args.push('--bridge-path', bridge);
54
+ }
55
+ const prepared = prepareHostBundle(config, args, client);
56
+ await viewText(`${client} configuration preview`, prepared.bundle.config);
57
+ await viewText('Explicit refresh skill preview', prepared.bundle.skill + '\n' + prepared.bundle.policy);
58
+ if (prepared.bundle.bridge)
59
+ await viewText('Windows bridge preview', prepared.bundle.bridge);
60
+ if (!await confirm(`Write this reviewed bundle to ${output}? Host config and trust will NOT be changed.`))
61
+ return;
62
+ checkConfigUnchanged(config);
63
+ if (existsSync(output))
64
+ throw new Error('Choose a new bundle directory. Existing destinations are not changed by this wizard.');
65
+ writeHostBundle(prepared.output, prepared.bundle);
66
+ note([
67
+ `Generated: ${output}`,
68
+ '1. Inspect common-memory.config.toml and merge/install it in the ACTUAL agent configuration directory; keep Work and Codex profiles separate.',
69
+ client === 'codex' ? '2. For Codex, use the common-memory profile: codex --profile common-memory.' : '2. Select the corresponding profile in the Work local agent environment (ordinary Chat is not covered).',
70
+ '3. Install skills/memory-refresh in that agent’s skills directory. For Windows, place the bridge at the exact previewed Windows path.',
71
+ '4. Review and trust commands through the host /hooks interface. No trust bypass was installed.',
72
+ '5. Start a fresh host process. Review memory here and check Maintenance for actual session processing.',
73
+ 'Refresh stays inside the live host: /memory-refresh. The TUI cannot select an activation by cwd.',
74
+ 'Disable/remove: use host /hooks and its MCP settings, then remove only the config/skill entries you installed; canonical memory remains intact.',
75
+ 'Regenerate into a NEW directory after changing Node, installation path, home or workspace selection.',
76
+ ].join('\n'), 'Generated — host activation still required');
77
+ }
78
+ async function generateMcp(config) {
79
+ const options = await launchMode();
80
+ options.workspaces = await chooseWorkspaces(config);
81
+ const body = renderMcpConfig(config, options);
82
+ await viewText('MCP configuration preview (separate init/read processes)', body);
83
+ if (await confirm('Export this configuration to a new file?')) {
84
+ const output = expandPath(await text('New TOML file (parent directory must exist)'));
85
+ checkConfigUnchanged(config);
86
+ writeFileSync(output, body, { flag: 'wx', mode: 0o600 });
87
+ clack.log.success(`Exported to ${terminalText(output)}; not installed in the host.`);
88
+ }
89
+ note('Merge only the desired blocks into the actual MCP host configuration. Read and Init stay separate; Codex should disable the Init server. Restart the host and inspect its tool list. Disable/remove through host MCP settings; do not delete the store. Relay remains an explicit trusted-host opt-in via the automation CLI, never enabled by these templates.', 'MCP activation / removal');
90
+ }
91
+ async function piIntegration() {
92
+ note(`Package: ${packageRoot}\nPi 0.84.4 extension; run Pi in the same POSIX/WSL environment.\nUse the same COMMON_MEMORY_HOME. Installation does not grant memory scopes.\nNative /memory-refresh and /memory-flush remain in the active Pi session.\nPi settings and trust remain owned by Pi; no Common Memory host-settings editor is added.`, 'Pi management');
93
+ const action = await menu('Pi · official package manager', [
94
+ { value: 'list', label: 'Inspect installed packages (pi list)' },
95
+ { value: 'install', label: 'Register this local package for the current user' },
96
+ { value: 'config', label: 'Enable / disable resources in Pi’s own UI' },
97
+ { value: 'remove', label: 'Remove this package registration', hint: 'Does not remove Common Memory data' },
98
+ { value: 'back', label: 'Back' },
99
+ ]);
100
+ if (action === 'back')
101
+ return;
102
+ if (action === 'install' && !existsSync(join(packageRoot, 'dist/pi-extension/index.js')))
103
+ throw new Error('Build the package before registering the Pi extension.');
104
+ const args = ['install', 'remove'].includes(action) ? [action, packageRoot] : [action];
105
+ note(`pi ${args.map(shellQuote).join(' ')}\nCOMMON_MEMORY_HOME=${configDirectory()}\nUses the pi executable on PATH. Install/remove use user settings; Pi may request its own project trust.`, 'Native host handoff');
106
+ if (!await confirm('Run this Pi command?'))
107
+ return;
108
+ const code = await runInteractiveProcess('pi', args, { ...process.env, COMMON_MEMORY_HOME: configDirectory() });
109
+ if (code !== 0)
110
+ throw new Error(`Pi command failed or was cancelled (exit ${code}); host state was not verified.`);
111
+ clack.log.success('Pi command finished. Restart Pi after changes; this does not prove a live capture or memory read.');
112
+ }
113
+ export async function integrationsScreen() {
114
+ for (;;) {
115
+ const config = loadConfig();
116
+ if (!config)
117
+ throw new Error('Configure Common Memory first');
118
+ const action = await menu('Common Memory / Integrations', [
119
+ { value: 'readiness', label: 'Local readiness and authority' },
120
+ { value: 'pi', label: 'Pi · manage extension via Pi' },
121
+ { value: 'codex', label: 'Codex · generate session-hook + read bundle' },
122
+ { value: 'work', label: 'ChatGPT Work · generate session + read/init bundle' },
123
+ { value: 'mcp', label: 'MCP-only · preview/export stdio configurations' },
124
+ { value: 'back', label: 'Back' },
125
+ ]);
126
+ if (action === 'back')
127
+ return;
128
+ await attempt(async () => {
129
+ if (action === 'readiness')
130
+ note(integrationReadiness(config), 'Local readiness — not host detection');
131
+ else if (action === 'pi')
132
+ await piIntegration();
133
+ else {
134
+ note(integrationReadiness(config), 'Integration prerequisites');
135
+ if (action === 'mcp')
136
+ await generateMcp(config);
137
+ else
138
+ await generateHost(config, action === 'codex' ? 'codex' : 'chatgpt-work');
139
+ }
140
+ });
141
+ }
142
+ }
143
+ //# sourceMappingURL=tui-integrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-integrations.js","sourceRoot":"","sources":["../../src/cli/tui-integrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare class UserCancelled extends Error {
2
+ constructor();
3
+ }
4
+ export declare function unwrap<T>(value: T | symbol): T;
5
+ export declare function requireInteractive(): void;
6
+ export declare function expandPath(value: string): string;
7
+ /** Terminal controls in memory, file names or diagnostic text are data, not display commands. */
8
+ export declare function terminalText(value: string): string;
9
+ export declare const note: (body: string, title: string) => void;
10
+ export declare const log: (body: string) => void;
11
+ export declare function confirm(message: string): Promise<boolean>;
12
+ export declare function text(message: string, initialValue?: string, optional?: boolean): Promise<string>;
13
+ export declare function menu(message: string, options: {
14
+ value: string;
15
+ label: string;
16
+ hint?: string;
17
+ }[]): Promise<string>;
18
+ /** Local pagination only, not retrieval. Every line of the selected document remains available. */
19
+ export declare function viewText(title: string, body: string): Promise<void>;
20
+ /** Cancel/error stays inside the current area; a cancelled home menu exits the application. */
21
+ export declare function attempt(action: () => Promise<unknown>): Promise<void>;
22
+ //# sourceMappingURL=tui-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-prompts.d.ts","sourceRoot":"","sources":["../../src/cli/tui-prompts.ts"],"names":[],"mappings":"AAIA,qBAAa,aAAc,SAAQ,KAAK;;CAEvC;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,CAG9C;AACD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AACD,iGAAiG;AACjG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AACD,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,KAAG,IAA2D,CAAC;AAC/G,eAAO,MAAM,GAAG,GAAI,MAAM,MAAM,KAAG,IAA0C,CAAC;AAC9E,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/D;AACD,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,SAAK,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhG;AACD,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvH;AAED,mGAAmG;AACnG,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED,+FAA+F;AAC/F,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E"}
@@ -0,0 +1,64 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { homedir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ export class UserCancelled extends Error {
5
+ constructor() { super('Cancelled'); this.name = 'UserCancelled'; }
6
+ }
7
+ export function unwrap(value) {
8
+ if (clack.isCancel(value))
9
+ throw new UserCancelled();
10
+ return value;
11
+ }
12
+ export function requireInteractive() {
13
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
14
+ throw new Error('Interactive terminal required. Use common-memory --help for non-interactive commands; configuration can be supplied in config.json.');
15
+ }
16
+ export function expandPath(value) {
17
+ return resolve(value === '~' ? homedir() : value.startsWith('~/') ? join(homedir(), value.slice(2)) : value);
18
+ }
19
+ /** Terminal controls in memory, file names or diagnostic text are data, not display commands. */
20
+ export function terminalText(value) {
21
+ return value.replace(/[\x00-\x08\x0b-\x1f\x7f-\x9f\u202a-\u202e\u2066-\u2069]/gu, c => `\\u${c.charCodeAt(0).toString(16).padStart(4, '0')}`);
22
+ }
23
+ export const note = (body, title) => clack.note(terminalText(body), terminalText(title));
24
+ export const log = (body) => clack.log.info(terminalText(body));
25
+ export async function confirm(message) {
26
+ return unwrap(await clack.confirm({ message: terminalText(message), initialValue: false }));
27
+ }
28
+ export async function text(message, initialValue = '', optional = false) {
29
+ return unwrap(await clack.text({ message, initialValue, ...(optional ? { defaultValue: '' } : {}), validate: value => optional || value?.trim() ? undefined : 'A value is required' })).trim();
30
+ }
31
+ export async function menu(message, options) {
32
+ return unwrap(await clack.select({ message, options: options.map(o => ({ ...o, label: terminalText(o.label), ...(o.hint ? { hint: terminalText(o.hint) } : {}) })), maxItems: 10 }));
33
+ }
34
+ /** Local pagination only, not retrieval. Every line of the selected document remains available. */
35
+ export async function viewText(title, body) {
36
+ const lines = terminalText(body).split('\n');
37
+ let start = 0;
38
+ for (;;) {
39
+ const size = Math.max(5, Math.min(30, (process.stdout.rows || 24) - 12));
40
+ const end = Math.min(lines.length, start + size);
41
+ note(lines.slice(start, end).join('\n') || '(empty)', `${title} · lines ${start + 1}–${end}/${lines.length}`);
42
+ const action = await menu('Viewer', [
43
+ ...(end < lines.length ? [{ value: 'next', label: 'Next page' }] : []),
44
+ ...(start ? [{ value: 'previous', label: 'Previous page' }] : []),
45
+ { value: 'back', label: 'Back' },
46
+ ]);
47
+ if (action === 'back')
48
+ return;
49
+ start = action === 'next' ? end : Math.max(0, start - size);
50
+ }
51
+ }
52
+ /** Cancel/error stays inside the current area; a cancelled home menu exits the application. */
53
+ export async function attempt(action) {
54
+ try {
55
+ await action();
56
+ }
57
+ catch (error) {
58
+ if (error instanceof UserCancelled)
59
+ clack.log.info('Cancelled; no further action.');
60
+ else
61
+ clack.log.error(terminalText(error instanceof Error ? error.message : 'Operation failed'));
62
+ }
63
+ }
64
+ //# sourceMappingURL=tui-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-prompts.js","sourceRoot":"","sources":["../../src/cli/tui-prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type CommonMemoryConfig } from '../config/config.js';
2
+ type Provenance = CommonMemoryConfig['disclosure']['allowedProvenance'][number];
3
+ export declare const PROVENANCE_OPTIONS: {
4
+ value: Provenance;
5
+ label: string;
6
+ hint: string;
7
+ }[];
8
+ /** Detect edits made while a form was open rather than silently overwriting them. */
9
+ export declare function checkConfigUnchanged(previous: CommonMemoryConfig | null): void;
10
+ export declare function saveSettings(next: CommonMemoryConfig, previous: CommonMemoryConfig): void;
11
+ export declare function runSetupWizard(existing?: CommonMemoryConfig | null): Promise<CommonMemoryConfig>;
12
+ export declare function hasApiKey(config: CommonMemoryConfig): boolean;
13
+ export declare function statusLines(config: CommonMemoryConfig): string[];
14
+ export declare function showStatus(config: CommonMemoryConfig): void;
15
+ export declare function printStatus(): void;
16
+ export declare function runPermissionsWizard(current: CommonMemoryConfig): Promise<void>;
17
+ export declare function runNetworkWizard(existing?: CommonMemoryConfig | null): Promise<CommonMemoryConfig>;
18
+ /** Less common knobs share the existing validator, not a second configuration schema. */
19
+ export declare function runAdvancedWizard(current: CommonMemoryConfig): Promise<void>;
20
+ export {};
21
+ //# sourceMappingURL=tui-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-settings.d.ts","sourceRoot":"","sources":["../../src/cli/tui-settings.ts"],"names":[],"mappings":"AAKA,OAAO,EAA8H,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAM1L,KAAK,UAAU,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAChF,eAAO,MAAM,kBAAkB,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAKlF,CAAC;AAEF,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAE9E;AACD,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAIzF;AAED,wBAAsB,cAAc,CAAC,QAAQ,GAAE,kBAAkB,GAAG,IAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkCpH;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAE7D;AAKD,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAGhE;AACD,wBAAgB,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAkE;AAC9H,wBAAgB,WAAW,IAAI,IAAI,CAGlC;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CASrF;AAED,wBAAsB,gBAAgB,CAAC,QAAQ,GAAE,kBAAkB,GAAG,IAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgCtH;AAED,yFAAyF;AACzF,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkClF"}
@@ -0,0 +1,198 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { MemoryModelError } from '../memory-manager/contracts/errors.js';
3
+ import { describeConfiguredNetwork } from '../config/runtime.js';
4
+ import { localApiKey, readPrivateEnv } from '../config/private-env.js';
5
+ import { PRIVATE_PROXY_KEY, PRIVATE_CA_KEY, resolveRoute } from '../memory-manager/network/route.js';
6
+ import { configFilePath, defaultConfig, envFilePath, loadConfig, saveNetworkSecret, saveApiKeyToEnvFile, saveConfig, validateConfig } from '../config/config.js';
7
+ import { normalizeOpenAICompatibleBaseUrl } from '../memory-manager/openai/openai-responses-adapter.js';
8
+ import { storagePathLines } from './storage-paths.js';
9
+ import { listProjects } from './operations.js';
10
+ import { confirm, expandPath, menu, note, requireInteractive, text, unwrap, UserCancelled } from './tui-prompts.js';
11
+ export const PROVENANCE_OPTIONS = [
12
+ { value: 'user_explicit', label: 'Delivered user expressions', hint: 'Includes corrections and forget requests' },
13
+ { value: 'agent_observation', label: 'Agent-reported understanding', hint: 'Init only; attributed material, not user statements' },
14
+ { value: 'conversation_context', label: 'Conversation context', hint: 'Assistant/tool and prior context; never evidence' },
15
+ { value: 'document_import', label: 'Imported Markdown documents', hint: 'Attributed material, never user statements' },
16
+ ];
17
+ /** Detect edits made while a form was open rather than silently overwriting them. */
18
+ export function checkConfigUnchanged(previous) {
19
+ if (JSON.stringify(loadConfig()) !== JSON.stringify(previous))
20
+ throw new Error('Configuration changed while this form was open. Reopen the form to use the current configuration.');
21
+ }
22
+ export function saveSettings(next, previous) {
23
+ checkConfigUnchanged(previous);
24
+ saveConfig(next);
25
+ clack.log.success('Settings saved. Restart active Pi/MCP/Codex/Work clients to apply; existing sessions are not hot-revoked.');
26
+ }
27
+ export async function runSetupWizard(existing = loadConfig()) {
28
+ requireInteractive();
29
+ const current = existing ?? defaultConfig();
30
+ const baseUrl = unwrap(await clack.text({ message: 'OpenAI-compatible Base URL', initialValue: current.remote.baseUrl,
31
+ validate: value => { try {
32
+ normalizeOpenAICompatibleBaseUrl(value ?? '');
33
+ }
34
+ catch (error) {
35
+ return error instanceof Error ? error.message : 'Invalid URL';
36
+ } } }));
37
+ const model = await text('Model name', current.remote.model);
38
+ const api = unwrap(await clack.select({ message: 'Request API (explicit; no automatic fallback)', initialValue: current.remote.api ?? 'responses', options: [
39
+ { value: 'responses', label: 'Responses — strict Structured Outputs' },
40
+ { value: 'chat_completions', label: 'Chat Completions — JSON object mode' },
41
+ ] }));
42
+ const apiKeyEnv = unwrap(await clack.text({ message: 'API key environment variable', initialValue: current.remote.apiKeyEnv,
43
+ validate: value => /^[A-Za-z_][A-Za-z0-9_]*$/u.test(value?.trim() ?? '') ? undefined : 'Use a valid environment variable name' }));
44
+ const changeKey = await confirm('Store or replace the API key in the private .env? No keeps existing/external credentials (also permits read-only use).');
45
+ const apiKey = changeKey ? unwrap(await clack.password({ message: `API key (stored only in ${envFilePath()})`, validate: value => value?.trim() && !/[\r\n\0]/u.test(value) ? undefined : 'A non-empty single line is required' })) : undefined;
46
+ const dataRoot = existing ? current.dataRoot : expandPath(await text('Local memory data directory', current.dataRoot));
47
+ // Preserve every unrelated setting, including optional sessionCache and legacy proxy absence.
48
+ const { reasoningEffort, thinking, enableThinking, ...remote } = current.remote;
49
+ const sameApi = api === (current.remote.api ?? 'responses');
50
+ const next = { ...current, dataRoot, remote: {
51
+ ...remote, baseUrl: normalizeOpenAICompatibleBaseUrl(baseUrl), model, apiKeyEnv: apiKeyEnv.trim(),
52
+ ...(sameApi && current.remote.api === undefined ? {} : { api }),
53
+ ...(sameApi && reasoningEffort !== undefined ? { reasoningEffort } : {}),
54
+ ...(sameApi && thinking !== undefined ? { thinking } : {}),
55
+ ...(sameApi && enableThinking !== undefined ? { enableThinking } : {}),
56
+ } };
57
+ note([`Model: ${model} (${api})`, `Data: ${dataRoot}`, `Disclosure: ${next.disclosure.allowedScopes.join(', ')}`, `Writable: ${next.writableScopes.join(', ') || '(none)'}`, `Provenance: ${next.disclosure.allowedProvenance.join(', ')}`, !sameApi ? 'API changed: incompatible thinking options will be cleared.' : 'Other settings are preserved.', 'No model request is sent by saving.'].join('\n'), 'Review configuration');
58
+ if (!await confirm('Save this configuration?'))
59
+ throw new UserCancelled();
60
+ validateConfig(next);
61
+ checkConfigUnchanged(existing);
62
+ // Validate everything before the first write. Secret and config are separate private files.
63
+ if (apiKey !== undefined)
64
+ saveApiKeyToEnvFile(next.remote.apiKeyEnv, apiKey);
65
+ saveConfig(next);
66
+ clack.log.success(`Configuration saved to ${configFilePath()}. Restart active clients to apply.`);
67
+ return loadConfig();
68
+ }
69
+ export function hasApiKey(config) {
70
+ try {
71
+ return Boolean(localApiKey(config.remote.apiKeyEnv, process.env, readPrivateEnv(envFilePath())));
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ function networkStatus(config) {
78
+ try {
79
+ const route = describeConfiguredNetwork(config);
80
+ return `Network: ${route.mode} → ${route.route} (${route.reason}${route.protocol ? `, ${route.protocol}` : ''}); connection not tested`;
81
+ }
82
+ catch (error) {
83
+ return `Network: ${error instanceof MemoryModelError ? error.message : 'invalid local configuration'}; connection not tested`;
84
+ }
85
+ }
86
+ export function statusLines(config) {
87
+ return [`Base URL: ${config.remote.baseUrl}`, `Model: ${config.remote.model}`, `API key: ${hasApiKey(config) ? 'configured' : `missing (${config.remote.apiKeyEnv}); reading still available`}`, `API: ${config.remote.api ?? 'responses'}`, ...storagePathLines(config), networkStatus(config),
88
+ `Disclosure scopes: ${config.disclosure.allowedScopes.join(', ')}`, `Writable scopes: ${config.writableScopes.join(', ') || '(none)'}`, `Provenance: ${config.disclosure.allowedProvenance.join(', ')}`];
89
+ }
90
+ export function showStatus(config) { note(statusLines(config).join('\n'), 'Common Memory status'); }
91
+ export function printStatus() {
92
+ const config = loadConfig();
93
+ console.log(config ? statusLines(config).join('\n') : 'Common Memory is not configured. Run: common-memory');
94
+ }
95
+ export async function runPermissionsWizard(current) {
96
+ const known = ['global', ...listProjects(current).map(p => `project:${p.id}`), ...current.disclosure.allowedScopes, ...current.writableScopes];
97
+ const options = [...new Set(known)].map(value => ({ value, label: value }));
98
+ note('Registration, disclosure/read access and write permission are separate. Import provenance never becomes user evidence. Changes do not revoke already running clients.', 'Authorization');
99
+ const allowedScopes = unwrap(await clack.multiselect({ message: 'Scopes allowed for disclosure and consumer reads', options, initialValues: [...current.disclosure.allowedScopes], required: true }));
100
+ const writableScopes = unwrap(await clack.multiselect({ message: 'Scopes writable by Core (independent of disclosure)', options, initialValues: current.writableScopes, required: false }));
101
+ const allowedProvenance = unwrap(await clack.multiselect({ message: 'Material allowed to be sent to the model', options: PROVENANCE_OPTIONS, initialValues: [...current.disclosure.allowedProvenance], required: true }));
102
+ note(`Disclosure: ${allowedScopes.join(', ')}\nWritable: ${writableScopes.join(', ') || '(none)'}\nProvenance: ${allowedProvenance.join(', ')}`, 'Review permissions');
103
+ if (await confirm('Save these authorizations?'))
104
+ saveSettings({ ...current, writableScopes, disclosure: { ...current.disclosure, allowedScopes, allowedProvenance } }, current);
105
+ }
106
+ export async function runNetworkWizard(existing = loadConfig()) {
107
+ requireInteractive();
108
+ if (!existing)
109
+ throw new Error('Configure the remote API first');
110
+ const mode = unwrap(await clack.select({ message: 'Model network route', initialValue: existing.remote.proxy?.mode ?? 'env', options: [
111
+ { value: 'env', label: 'Environment proxy', hint: 'HTTPS_PROXY / HTTP_PROXY / ALL_PROXY and NO_PROXY' },
112
+ { value: 'direct', label: 'Direct', hint: 'Independent connections; OS VPN/TUN still applies' },
113
+ { value: 'custom', label: 'Custom proxy', hint: 'HTTP/HTTPS; SOCKS5 experimental' },
114
+ ] }));
115
+ let proxy = { mode: mode === 'custom' ? 'env' : mode };
116
+ let secret;
117
+ if (mode === 'custom') {
118
+ secret = unwrap(await clack.password({ message: 'Proxy URL (stored privately; not in generated integrations)', validate: value => {
119
+ try {
120
+ resolveRoute(existing.remote.baseUrl, { mode: 'custom', urlEnv: PRIVATE_PROXY_KEY }, { [PRIVATE_PROXY_KEY]: value });
121
+ }
122
+ catch {
123
+ return 'Use a valid HTTP, HTTPS or SOCKS5 proxy URL';
124
+ }
125
+ } }));
126
+ const noProxy = unwrap(await clack.text({ message: 'Custom bypass hosts (optional)', defaultValue: '', initialValue: existing.remote.proxy?.mode === 'custom' ? existing.remote.proxy.noProxy ?? '' : '', validate: value => {
127
+ try {
128
+ resolveRoute(existing.remote.baseUrl, { mode: 'custom', urlEnv: PRIVATE_PROXY_KEY, noProxy: value ?? '' }, { [PRIVATE_PROXY_KEY]: secret });
129
+ }
130
+ catch {
131
+ return 'Invalid bypass list';
132
+ }
133
+ } }));
134
+ proxy = { mode: 'custom', urlEnv: PRIVATE_PROXY_KEY, ...(noProxy.trim() ? { noProxy: noProxy.trim() } : {}) };
135
+ }
136
+ const caAction = await menu('Additional CA certificate', [{ value: 'keep', label: 'Keep current setting' }, { value: 'set', label: 'Set PEM file path' }, { value: 'remove', label: 'Use only Node default trust' }]);
137
+ const ca = caAction === 'set' ? expandPath(await text('Additional CA PEM file')) : undefined;
138
+ const { caFileEnv, ...remote } = existing.remote;
139
+ const next = { ...existing, remote: { ...remote, proxy, ...(ca ? { caFileEnv: PRIVATE_CA_KEY } : caAction === 'keep' && caFileEnv ? { caFileEnv } : {}) } };
140
+ note(`Route: ${mode}\nCA: ${caAction}\nNo probe is sent. No process-wide network settings are changed.`, 'Review network');
141
+ if (!await confirm('Save network settings?'))
142
+ throw new UserCancelled();
143
+ validateConfig(next);
144
+ checkConfigUnchanged(existing);
145
+ if (secret !== undefined)
146
+ saveNetworkSecret(PRIVATE_PROXY_KEY, secret);
147
+ if (ca)
148
+ saveNetworkSecret(PRIVATE_CA_KEY, ca);
149
+ saveConfig(next);
150
+ clack.log.success('Network settings saved. Restart active clients to apply.');
151
+ return loadConfig();
152
+ }
153
+ /** Less common knobs share the existing validator, not a second configuration schema. */
154
+ export async function runAdvancedWizard(current) {
155
+ const kind = await menu('Advanced settings', [
156
+ { value: 'tuning', label: 'Model output / thinking options' },
157
+ { value: 'limits', label: 'Scheduler / session cache / disclosure byte limits' },
158
+ { value: 'storage', label: 'Change data directory', hint: 'Select another store; does not migrate data' },
159
+ { value: 'back', label: 'Back' },
160
+ ]);
161
+ if (kind === 'back')
162
+ return;
163
+ let next;
164
+ if (kind === 'storage') {
165
+ note('Stop all clients before switching stores. Existing Markdown and SQLite remain intact. This does not copy, merge or migrate anything. Integrations need regeneration after switching.', 'Storage authority');
166
+ next = { ...current, dataRoot: expandPath(await text('Data directory', current.dataRoot)) };
167
+ }
168
+ else {
169
+ const { maxOutputTokens, reasoningEffort, thinking, enableThinking } = current.remote;
170
+ const { maxExcerptBytes, maxCandidateBytes, maxTotalBytes } = current.disclosure;
171
+ const initial = kind === 'tuning' ? { maxOutputTokens, reasoningEffort, thinking, enableThinking } : { scheduler: current.scheduler, sessionCache: current.sessionCache, maxExcerptBytes, maxCandidateBytes, maxTotalBytes };
172
+ note(kind === 'tuning' ? 'JSON fields: maxOutputTokens (1–16384), reasoningEffort (Responses only), thinking or enableThinking (Chat only, mutually exclusive). {} clears tuning; API/model must support chosen fields.' : 'Edit the shown JSON limits. Session batching remains exactly ten settled interactions; scheduler settings cannot override it. Omitted sessionCache uses defaults.', 'Advanced configuration');
173
+ const merge = (raw) => {
174
+ const value = JSON.parse(raw);
175
+ const keys = kind === 'tuning' ? ['maxOutputTokens', 'reasoningEffort', 'thinking', 'enableThinking'] : ['scheduler', 'sessionCache', 'maxExcerptBytes', 'maxCandidateBytes', 'maxTotalBytes'];
176
+ if (!value || Array.isArray(value) || typeof value !== 'object' || Object.keys(value).some(k => !keys.includes(k)))
177
+ throw new Error('Only the listed fields are allowed');
178
+ if (kind === 'tuning') {
179
+ const { maxOutputTokens: _a, reasoningEffort: _b, thinking: _c, enableThinking: _d, ...remote } = current.remote;
180
+ return validateConfig({ ...current, remote: { ...remote, ...value } });
181
+ }
182
+ const { scheduler, sessionCache, ...limits } = value;
183
+ const { sessionCache: _cache, ...base } = current;
184
+ return validateConfig({ ...base, scheduler, ...(sessionCache === undefined ? {} : { sessionCache }), disclosure: { ...current.disclosure, ...limits } });
185
+ };
186
+ const raw = unwrap(await clack.text({ message: 'Settings JSON', initialValue: JSON.stringify(initial), validate: value => { try {
187
+ merge(value ?? '');
188
+ }
189
+ catch (error) {
190
+ return error instanceof Error ? error.message : 'Invalid settings';
191
+ } } }));
192
+ next = merge(raw);
193
+ }
194
+ note(JSON.stringify(kind === 'storage' ? { dataRoot: next.dataRoot } : kind === 'tuning' ? next.remote : { scheduler: next.scheduler, sessionCache: next.sessionCache, disclosure: next.disclosure }, null, 2), 'Review settings (no API key)');
195
+ if (await confirm('Save these settings?'))
196
+ saveSettings(next, current);
197
+ }
198
+ //# sourceMappingURL=tui-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-settings.js","sourceRoot":"","sources":["../../src/cli/tui-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { printStatus, showStatus, runNetworkWizard, runSetupWizard } from './tui-settings.js';
2
+ export { UserCancelled } from './tui-prompts.js';
3
+ export declare function runTui(): Promise<void>;
4
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/cli/tui.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAqMjD,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA+B5C"}