@geminilight/mindos 0.6.71 → 0.6.73

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 (227) hide show
  1. package/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +27 -27
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +4 -4
  10. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error.html +2 -2
  13. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  14. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/page.js +1 -1
  27. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/agents/copy-skill/route_client-reference-manifest.js +1 -1
  40. package/_standalone/.next/server/app/api/agents/custom/detect/route_client-reference-manifest.js +1 -1
  41. package/_standalone/.next/server/app/api/agents/custom/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  45. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  47. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/channels/verify/route_client-reference-manifest.js +1 -1
  49. package/_standalone/.next/server/app/api/connect/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/embedding/route_client-reference-manifest.js +1 -1
  51. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  54. package/_standalone/.next/server/app/api/file/raw/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  56. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  58. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  60. package/_standalone/.next/server/app/api/im/activity/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/im/config/route_client-reference-manifest.js +1 -1
  62. package/_standalone/.next/server/app/api/im/status/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/im/test/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/im/webhook/feishu/route_client-reference-manifest.js +1 -1
  65. package/_standalone/.next/server/app/api/im/webhook-status/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/inbox/clip/route_client-reference-manifest.js +1 -1
  67. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  69. package/_standalone/.next/server/app/api/lint/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  71. package/_standalone/.next/server/app/api/mcp/direct-tools/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  73. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  76. package/_standalone/.next/server/app/api/mcp/tools/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/mcp/uninstall/route_client-reference-manifest.js +1 -1
  78. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  80. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  83. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  87. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/space-overview/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  97. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/changelog/page.js +1 -1
  101. package/_standalone/.next/server/app/changelog/page.js.nft.json +1 -1
  102. package/_standalone/.next/server/app/changelog/page_client-reference-manifest.js +1 -1
  103. package/_standalone/.next/server/app/changes/page.js +1 -1
  104. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  105. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  106. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  107. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  108. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  109. package/_standalone/.next/server/app/echo/page.js +1 -1
  110. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  111. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  112. package/_standalone/.next/server/app/explore/page.js +1 -1
  113. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  114. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  115. package/_standalone/.next/server/app/help/page.js +1 -1
  116. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  117. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  118. package/_standalone/.next/server/app/inbox/history/page.js +1 -1
  119. package/_standalone/.next/server/app/inbox/history/page.js.nft.json +1 -1
  120. package/_standalone/.next/server/app/inbox/history/page_client-reference-manifest.js +1 -1
  121. package/_standalone/.next/server/app/login/page.js +1 -1
  122. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  123. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  124. package/_standalone/.next/server/app/page.js +1 -1
  125. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  126. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  127. package/_standalone/.next/server/app/setup/page.js +1 -1
  128. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  129. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  130. package/_standalone/.next/server/app/trash/page.js +2 -2
  131. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  132. package/_standalone/.next/server/app/view/[...path]/page.js +2 -2
  133. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  134. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  135. package/_standalone/.next/server/app-paths-manifest.json +27 -27
  136. package/_standalone/.next/server/chunks/{3311.js → 2449.js} +2 -2
  137. package/_standalone/.next/server/chunks/5299.js +1 -1
  138. package/_standalone/.next/server/chunks/6022.js +34 -34
  139. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  140. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  141. package/_standalone/.next/server/pages/500.html +2 -2
  142. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  143. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  144. package/_standalone/.next/static/chunks/{7143.879daa87569c5b02.js → 4094.09364c01df411380.js} +1 -1
  145. package/_standalone/.next/static/chunks/{5795.d9099a1afecd6047.js → 5331.c89084fd7f67887d.js} +2 -2
  146. package/_standalone/.next/static/chunks/app/{layout-a344709b8447be75.js → layout-fcbde5bee626d21a.js} +63 -63
  147. package/_standalone/.next/static/chunks/app/trash/page-e623ff0ab35de002.js +1 -0
  148. package/_standalone/.next/static/chunks/app/view/[...path]/page-49c4eff6ffdb5168.js +12 -0
  149. package/_standalone/.next/static/chunks/{webpack-2f2787d3469d3df1.js → webpack-dc486b68118d1328.js} +1 -1
  150. package/_standalone/.next/trace +72 -72
  151. package/_standalone/package-lock.json +2 -2
  152. package/_standalone/package.json +1 -1
  153. package/app/package.json +1 -1
  154. package/package.json +1 -1
  155. package/_standalone/.next/static/chunks/app/trash/page-0907fdd06a4467de.js +0 -1
  156. package/_standalone/.next/static/chunks/app/view/[...path]/page-f53ce199b4a4bbb5.js +0 -12
  157. package/browser-extension/README.md +0 -160
  158. package/browser-extension/build.mjs +0 -63
  159. package/browser-extension/extension/background/service-worker.js +0 -1
  160. package/browser-extension/extension/content/extractor.js +0 -2
  161. package/browser-extension/extension/icons/icon-128.png +0 -0
  162. package/browser-extension/extension/icons/icon-128.svg +0 -4
  163. package/browser-extension/extension/icons/icon-16.png +0 -0
  164. package/browser-extension/extension/icons/icon-16.svg +0 -4
  165. package/browser-extension/extension/icons/icon-32.png +0 -0
  166. package/browser-extension/extension/icons/icon-32.svg +0 -4
  167. package/browser-extension/extension/icons/icon-48.png +0 -0
  168. package/browser-extension/extension/icons/icon-48.svg +0 -4
  169. package/browser-extension/extension/manifest.json +0 -47
  170. package/browser-extension/extension/popup/popup.css +0 -510
  171. package/browser-extension/extension/popup/popup.html +0 -128
  172. package/browser-extension/extension/popup/popup.js +0 -73
  173. package/browser-extension/package-lock.json +0 -617
  174. package/browser-extension/package.json +0 -21
  175. package/browser-extension/scripts/gen-icons.sh +0 -38
  176. package/browser-extension/src/background/service-worker.ts +0 -27
  177. package/browser-extension/src/content/extractor.ts +0 -44
  178. package/browser-extension/src/icons/icon-128.png +0 -0
  179. package/browser-extension/src/icons/icon-128.svg +0 -4
  180. package/browser-extension/src/icons/icon-16.png +0 -0
  181. package/browser-extension/src/icons/icon-16.svg +0 -4
  182. package/browser-extension/src/icons/icon-32.png +0 -0
  183. package/browser-extension/src/icons/icon-32.svg +0 -4
  184. package/browser-extension/src/icons/icon-48.png +0 -0
  185. package/browser-extension/src/icons/icon-48.svg +0 -4
  186. package/browser-extension/src/lib/api.ts +0 -146
  187. package/browser-extension/src/lib/markdown.ts +0 -68
  188. package/browser-extension/src/lib/storage.ts +0 -37
  189. package/browser-extension/src/lib/types.ts +0 -42
  190. package/browser-extension/src/manifest.json +0 -47
  191. package/browser-extension/src/popup/popup.css +0 -510
  192. package/browser-extension/src/popup/popup.html +0 -128
  193. package/browser-extension/src/popup/popup.ts +0 -416
  194. package/browser-extension/tsconfig.json +0 -16
  195. package/tests/e2e/README.md +0 -25
  196. package/tests/e2e/navigation.spec.ts +0 -14
  197. package/tests/e2e/playwright.config.ts +0 -14
  198. package/tests/integration/README.md +0 -25
  199. package/tests/integration/mcp-contract.test.ts +0 -57
  200. package/tests/integration/mcp-transport.test.ts +0 -361
  201. package/tests/integration/package-lock.json +0 -1463
  202. package/tests/integration/package.json +0 -8
  203. package/tests/integration/vitest.config.ts +0 -11
  204. package/tests/security-hardening.test.ts +0 -456
  205. package/tests/unit/build-integrity.test.ts +0 -137
  206. package/tests/unit/cli-build.test.ts +0 -180
  207. package/tests/unit/cli-config.test.ts +0 -257
  208. package/tests/unit/cli-mcp-install-toml.test.ts +0 -586
  209. package/tests/unit/cli-mcp-install.test.ts +0 -123
  210. package/tests/unit/cli-mcp-stdio-default.test.ts +0 -180
  211. package/tests/unit/cli-modules-load.test.ts +0 -64
  212. package/tests/unit/cli-port.test.ts +0 -87
  213. package/tests/unit/cli-skill-auto-copy.test.ts +0 -260
  214. package/tests/unit/cli-smoke.test.ts +0 -88
  215. package/tests/unit/cli-uninstall.test.ts +0 -218
  216. package/tests/unit/cli-update-root.test.ts +0 -89
  217. package/tests/unit/cli-user-flow-sim.test.ts +0 -506
  218. package/tests/unit/cli-wait-hint.test.ts +0 -86
  219. package/tests/unit/custom-agents.test.ts +0 -478
  220. package/tests/unit/dep-safety.test.ts +0 -126
  221. package/tests/unit/detect-system-lang.test.ts +0 -122
  222. package/tests/unit/mcp-build.test.ts +0 -162
  223. package/tests/unit/setup-needs-restart.test.ts +0 -139
  224. package/tests/unit/stop-restart.test.ts +0 -393
  225. package/tests/unit/vitest.config.ts +0 -8
  226. /package/_standalone/.next/static/{w5bqzZbd2_vdoPRB0JQ_I → Dn8EHqUedSzanCfrM8WWS}/_buildManifest.js +0 -0
  227. /package/_standalone/.next/static/{w5bqzZbd2_vdoPRB0JQ_I → Dn8EHqUedSzanCfrM8WWS}/_ssgManifest.js +0 -0
@@ -1,180 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import fs from 'fs';
3
- import os from 'os';
4
- import path from 'path';
5
-
6
- /**
7
- * Tests for bin/lib/build.js — needsBuild, writeBuildStamp, cleanNextDir, ensureAppDeps.
8
- *
9
- * We mock constants.js to point ROOT/BUILD_STAMP/DEPS_STAMP at a temp directory,
10
- * and mock execSync to avoid real npm install.
11
- */
12
-
13
- let tempDir: string;
14
- let appDir: string;
15
- let nextDir: string;
16
- let buildStamp: string;
17
- let depsStamp: string;
18
-
19
- beforeEach(() => {
20
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mindos-build-test-'));
21
- appDir = path.join(tempDir, 'app');
22
- nextDir = path.join(appDir, '.next');
23
- buildStamp = path.join(nextDir, '.mindos-build-version');
24
- depsStamp = path.join(tempDir, 'deps-hash');
25
-
26
- // Create app dir with a package.json
27
- fs.mkdirSync(appDir, { recursive: true });
28
- fs.writeFileSync(path.join(appDir, 'package.json'), JSON.stringify({ name: 'test-app', version: '1.0.0' }));
29
-
30
- // Create root package.json
31
- fs.writeFileSync(path.join(tempDir, 'package.json'), JSON.stringify({ name: 'mindos', version: '0.5.12' }));
32
-
33
- vi.resetModules();
34
-
35
- vi.doMock('../../bin/lib/constants.js', () => ({
36
- ROOT: tempDir,
37
- BUILD_STAMP: buildStamp,
38
- DEPS_STAMP: depsStamp,
39
- CONFIG_PATH: path.join(tempDir, 'config.json'),
40
- MINDOS_DIR: tempDir,
41
- PID_PATH: path.join(tempDir, 'mindos.pid'),
42
- LOG_PATH: path.join(tempDir, 'mindos.log'),
43
- CLI_PATH: '',
44
- NODE_BIN: process.execPath,
45
- UPDATE_CHECK_PATH: path.join(tempDir, 'update-check.json'),
46
- STANDALONE_SERVER: path.join(tempDir, '_standalone', 'server.js'),
47
- STANDALONE_STAMP: path.join(tempDir, '_standalone', '.mindos-build-version'),
48
- }));
49
- });
50
-
51
- afterEach(() => {
52
- fs.rmSync(tempDir, { recursive: true, force: true });
53
- vi.restoreAllMocks();
54
- });
55
-
56
- async function importBuild() {
57
- return await import('../../bin/lib/build.js') as {
58
- needsBuild: () => boolean;
59
- writeBuildStamp: () => void;
60
- cleanNextDir: () => void;
61
- clearBuildLock: () => void;
62
- ensureAppDeps: () => void;
63
- };
64
- }
65
-
66
- // ── needsBuild ──────────────────────────────────────────────────────────────
67
-
68
- describe('needsBuild', () => {
69
- it('returns true when .next directory does not exist', async () => {
70
- const { needsBuild } = await importBuild();
71
- expect(needsBuild()).toBe(true);
72
- });
73
-
74
- it('returns true when .next exists but no build stamp', async () => {
75
- fs.mkdirSync(nextDir, { recursive: true });
76
- const { needsBuild } = await importBuild();
77
- expect(needsBuild()).toBe(true);
78
- });
79
-
80
- it('returns false when stamp version matches package.json', async () => {
81
- fs.mkdirSync(nextDir, { recursive: true });
82
- fs.writeFileSync(buildStamp, '0.5.12', 'utf-8');
83
- const { needsBuild } = await importBuild();
84
- expect(needsBuild()).toBe(false);
85
- });
86
-
87
- it('returns true when stamp version does not match', async () => {
88
- fs.mkdirSync(nextDir, { recursive: true });
89
- fs.writeFileSync(buildStamp, '0.4.0', 'utf-8');
90
- const { needsBuild } = await importBuild();
91
- expect(needsBuild()).toBe(true);
92
- });
93
- });
94
-
95
- // ── writeBuildStamp ─────────────────────────────────────────────────────────
96
-
97
- describe('writeBuildStamp', () => {
98
- it('writes current version so needsBuild returns false', async () => {
99
- fs.mkdirSync(nextDir, { recursive: true });
100
- const { writeBuildStamp, needsBuild } = await importBuild();
101
- writeBuildStamp();
102
- expect(needsBuild()).toBe(false);
103
- expect(fs.readFileSync(buildStamp, 'utf-8')).toBe('0.5.12');
104
- });
105
- });
106
-
107
- // ── cleanNextDir ────────────────────────────────────────────────────────────
108
-
109
- describe('cleanNextDir', () => {
110
- it('removes .next directory', async () => {
111
- fs.mkdirSync(nextDir, { recursive: true });
112
- fs.writeFileSync(path.join(nextDir, 'test.js'), 'x');
113
- const { cleanNextDir } = await importBuild();
114
- cleanNextDir();
115
- expect(fs.existsSync(nextDir)).toBe(false);
116
- });
117
-
118
- it('does not throw when .next does not exist', async () => {
119
- const { cleanNextDir } = await importBuild();
120
- expect(() => cleanNextDir()).not.toThrow();
121
- });
122
- });
123
-
124
- // ── clearBuildLock ──────────────────────────────────────────────────────────
125
-
126
- describe('clearBuildLock', () => {
127
- it('removes .next/lock file', async () => {
128
- fs.mkdirSync(nextDir, { recursive: true });
129
- const lockFile = path.join(nextDir, 'lock');
130
- fs.writeFileSync(lockFile, '');
131
- const { clearBuildLock } = await importBuild();
132
- clearBuildLock();
133
- expect(fs.existsSync(lockFile)).toBe(false);
134
- });
135
- });
136
-
137
- // ── ensureAppDeps ───────────────────────────────────────────────────────────
138
-
139
- describe('ensureAppDeps', () => {
140
- it('skips install when next is present and deps hash matches', async () => {
141
- // Create node_modules/next/package.json
142
- const nextPkg = path.join(appDir, 'node_modules', 'next');
143
- fs.mkdirSync(nextPkg, { recursive: true });
144
- fs.writeFileSync(path.join(nextPkg, 'package.json'), '{}');
145
-
146
- // Write matching deps hash
147
- const { createHash } = await import('crypto');
148
- const pkgContent = fs.readFileSync(path.join(appDir, 'package.json'));
149
- const hash = createHash('sha256').update(pkgContent).digest('hex').slice(0, 16);
150
- fs.writeFileSync(depsStamp, hash, 'utf-8');
151
-
152
- // Mock execSync — should NOT be called for npm install
153
- const mockExec = vi.fn();
154
- vi.doMock('node:child_process', () => ({
155
- execSync: mockExec,
156
- }));
157
- vi.resetModules();
158
-
159
- // Re-mock constants after resetModules
160
- vi.doMock('../../bin/lib/constants.js', () => ({
161
- ROOT: tempDir,
162
- BUILD_STAMP: buildStamp,
163
- DEPS_STAMP: depsStamp,
164
- CONFIG_PATH: path.join(tempDir, 'config.json'),
165
- MINDOS_DIR: tempDir,
166
- PID_PATH: path.join(tempDir, 'mindos.pid'),
167
- LOG_PATH: path.join(tempDir, 'mindos.log'),
168
- CLI_PATH: '',
169
- NODE_BIN: process.execPath,
170
- UPDATE_CHECK_PATH: path.join(tempDir, 'update-check.json'),
171
- STANDALONE_SERVER: path.join(tempDir, '_standalone', 'server.js'),
172
- STANDALONE_STAMP: path.join(tempDir, '_standalone', '.mindos-build-version'),
173
- }));
174
-
175
- const build = await importBuild();
176
- build.ensureAppDeps();
177
- // npm install should not have been called
178
- expect(mockExec).not.toHaveBeenCalled();
179
- });
180
- });
@@ -1,257 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
- import fs from 'fs';
3
- import os from 'os';
4
- import path from 'path';
5
-
6
- /**
7
- * Tests for bin/lib/config.js — loadConfig env mapping.
8
- *
9
- * loadConfig() has a module-level `let loaded = false` idempotency guard.
10
- * We must vi.resetModules() + dynamic import() for each test to get a fresh module.
11
- */
12
-
13
- let tempDir: string;
14
- let configPath: string;
15
-
16
- // All env vars that loadConfig may set
17
- const MANAGED_ENV_KEYS = [
18
- 'MIND_ROOT', 'MINDOS_WEB_PORT', 'MINDOS_MCP_PORT',
19
- 'AUTH_TOKEN', 'WEB_PASSWORD', 'AI_PROVIDER',
20
- 'ANTHROPIC_API_KEY', 'ANTHROPIC_MODEL',
21
- 'OPENAI_API_KEY', 'OPENAI_MODEL', 'OPENAI_BASE_URL',
22
- ];
23
-
24
- let savedEnv: Record<string, string | undefined>;
25
-
26
- beforeEach(() => {
27
- tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mindos-cfg-test-'));
28
- configPath = path.join(tempDir, 'config.json');
29
-
30
- // Save and clear managed env vars
31
- savedEnv = {};
32
- for (const key of MANAGED_ENV_KEYS) {
33
- savedEnv[key] = process.env[key];
34
- delete process.env[key];
35
- }
36
-
37
- // Reset module registry so loadConfig's `loaded` flag resets
38
- vi.resetModules();
39
-
40
- // Mock constants to point CONFIG_PATH to our temp file
41
- vi.doMock('../../bin/lib/constants.js', () => ({
42
- CONFIG_PATH: configPath,
43
- ROOT: path.resolve(__dirname, '..', '..'),
44
- MINDOS_DIR: tempDir,
45
- PID_PATH: path.join(tempDir, 'mindos.pid'),
46
- BUILD_STAMP: path.join(tempDir, '.mindos-build-version'),
47
- LOG_PATH: path.join(tempDir, 'mindos.log'),
48
- CLI_PATH: '',
49
- NODE_BIN: process.execPath,
50
- UPDATE_CHECK_PATH: path.join(tempDir, 'update-check.json'),
51
- DEPS_STAMP: path.join(tempDir, 'deps-hash'),
52
- }));
53
- });
54
-
55
- afterEach(() => {
56
- // Restore env
57
- for (const key of MANAGED_ENV_KEYS) {
58
- if (savedEnv[key] === undefined) delete process.env[key];
59
- else process.env[key] = savedEnv[key];
60
- }
61
- fs.rmSync(tempDir, { recursive: true, force: true });
62
- vi.restoreAllMocks();
63
- });
64
-
65
- function writeConfig(config: Record<string, unknown>) {
66
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
67
- }
68
-
69
- async function importConfig() {
70
- return await import('../../bin/lib/config.js') as {
71
- loadConfig: () => void;
72
- getStartMode: () => string;
73
- isDaemonMode: () => boolean;
74
- };
75
- }
76
-
77
- // ── loadConfig env mapping ──────────────────────────────────────────────────
78
-
79
- describe('loadConfig — new format (providers)', () => {
80
- it('maps anthropic provider fields', async () => {
81
- writeConfig({
82
- mindRoot: '/tmp/mind',
83
- ai: {
84
- provider: 'anthropic',
85
- providers: {
86
- anthropic: { apiKey: 'sk-ant-xxx', model: 'claude-sonnet-4-6' },
87
- },
88
- },
89
- });
90
- const { loadConfig } = await importConfig();
91
- loadConfig();
92
- expect(process.env.AI_PROVIDER).toBe('anthropic');
93
- expect(process.env.ANTHROPIC_API_KEY).toBe('sk-ant-xxx');
94
- expect(process.env.ANTHROPIC_MODEL).toBe('claude-sonnet-4-6');
95
- });
96
-
97
- it('maps openai provider fields (apiKey + model + baseUrl)', async () => {
98
- writeConfig({
99
- ai: {
100
- provider: 'openai',
101
- providers: {
102
- openai: { apiKey: 'sk-oai-xxx', model: 'gpt-5.4', baseUrl: 'https://custom.api.com/v1' },
103
- },
104
- },
105
- });
106
- const { loadConfig } = await importConfig();
107
- loadConfig();
108
- expect(process.env.AI_PROVIDER).toBe('openai');
109
- expect(process.env.OPENAI_API_KEY).toBe('sk-oai-xxx');
110
- expect(process.env.OPENAI_MODEL).toBe('gpt-5.4');
111
- expect(process.env.OPENAI_BASE_URL).toBe('https://custom.api.com/v1');
112
- });
113
- });
114
-
115
- describe('loadConfig — old format (flat keys)', () => {
116
- it('maps flat anthropic keys as fallback', async () => {
117
- writeConfig({
118
- ai: {
119
- provider: 'anthropic',
120
- anthropicApiKey: 'sk-ant-old',
121
- anthropicModel: 'claude-3-opus',
122
- },
123
- });
124
- const { loadConfig } = await importConfig();
125
- loadConfig();
126
- expect(process.env.ANTHROPIC_API_KEY).toBe('sk-ant-old');
127
- expect(process.env.ANTHROPIC_MODEL).toBe('claude-3-opus');
128
- });
129
-
130
- it('maps flat openai keys as fallback', async () => {
131
- writeConfig({
132
- ai: {
133
- provider: 'openai',
134
- openaiApiKey: 'sk-oai-old',
135
- openaiModel: 'gpt-4',
136
- openaiBaseUrl: 'https://old.api.com',
137
- },
138
- });
139
- const { loadConfig } = await importConfig();
140
- loadConfig();
141
- expect(process.env.OPENAI_API_KEY).toBe('sk-oai-old');
142
- expect(process.env.OPENAI_MODEL).toBe('gpt-4');
143
- expect(process.env.OPENAI_BASE_URL).toBe('https://old.api.com');
144
- });
145
- });
146
-
147
- describe('loadConfig — core fields', () => {
148
- it('maps port and mcpPort', async () => {
149
- writeConfig({ port: 3001, mcpPort: 8788 });
150
- const { loadConfig } = await importConfig();
151
- loadConfig();
152
- expect(process.env.MINDOS_WEB_PORT).toBe('3001');
153
- expect(process.env.MINDOS_MCP_PORT).toBe('8788');
154
- });
155
-
156
- it('maps mindRoot', async () => {
157
- writeConfig({ mindRoot: '/home/user/MindOS/mind' });
158
- const { loadConfig } = await importConfig();
159
- loadConfig();
160
- expect(process.env.MIND_ROOT).toBe('/home/user/MindOS/mind');
161
- });
162
-
163
- it('maps authToken', async () => {
164
- writeConfig({ authToken: 'tok-abc123' });
165
- const { loadConfig } = await importConfig();
166
- loadConfig();
167
- expect(process.env.AUTH_TOKEN).toBe('tok-abc123');
168
- });
169
-
170
- it('maps webPassword', async () => {
171
- writeConfig({ webPassword: 'pass123' });
172
- const { loadConfig } = await importConfig();
173
- loadConfig();
174
- expect(process.env.WEB_PASSWORD).toBe('pass123');
175
- });
176
- });
177
-
178
- describe('loadConfig — does not override existing env', () => {
179
- it('preserves existing AUTH_TOKEN', async () => {
180
- process.env.AUTH_TOKEN = 'already-set';
181
- writeConfig({ authToken: 'from-config' });
182
- const { loadConfig } = await importConfig();
183
- loadConfig();
184
- expect(process.env.AUTH_TOKEN).toBe('already-set');
185
- });
186
- });
187
-
188
- describe('loadConfig — error handling', () => {
189
- it('does not throw when config file does not exist', async () => {
190
- // configPath does not exist — should not throw
191
- const { loadConfig } = await importConfig();
192
- expect(() => loadConfig()).not.toThrow();
193
- });
194
-
195
- it('does not throw on corrupt JSON (outputs warning)', async () => {
196
- fs.writeFileSync(configPath, '{broken json!!!', 'utf-8');
197
- const spy = vi.spyOn(console, 'error').mockImplementation(() => {});
198
- const { loadConfig } = await importConfig();
199
- expect(() => loadConfig()).not.toThrow();
200
- expect(spy).toHaveBeenCalled();
201
- spy.mockRestore();
202
- });
203
- });
204
-
205
- describe('loadConfig — idempotency', () => {
206
- it('only loads once (second call is no-op)', async () => {
207
- writeConfig({ authToken: 'first' });
208
- const { loadConfig } = await importConfig();
209
- loadConfig();
210
- expect(process.env.AUTH_TOKEN).toBe('first');
211
-
212
- // Overwrite config file and call again — should NOT re-read
213
- writeConfig({ authToken: 'second' });
214
- loadConfig();
215
- expect(process.env.AUTH_TOKEN).toBe('first');
216
- });
217
- });
218
-
219
- // ── getStartMode / isDaemonMode ─────────────────────────────────────────────
220
-
221
- describe('getStartMode', () => {
222
- it('returns "start" when no config', async () => {
223
- const { getStartMode } = await importConfig();
224
- expect(getStartMode()).toBe('start');
225
- });
226
-
227
- it('returns "start" when startMode is "daemon" (CLI uses --daemon flag)', async () => {
228
- writeConfig({ startMode: 'daemon' });
229
- const { getStartMode } = await importConfig();
230
- expect(getStartMode()).toBe('start');
231
- });
232
-
233
- it('returns stored startMode for non-daemon values', async () => {
234
- writeConfig({ startMode: 'dev' });
235
- const { getStartMode } = await importConfig();
236
- expect(getStartMode()).toBe('dev');
237
- });
238
- });
239
-
240
- describe('isDaemonMode', () => {
241
- it('returns true when startMode is "daemon"', async () => {
242
- writeConfig({ startMode: 'daemon' });
243
- const { isDaemonMode } = await importConfig();
244
- expect(isDaemonMode()).toBe(true);
245
- });
246
-
247
- it('returns false when startMode is not "daemon"', async () => {
248
- writeConfig({ startMode: 'start' });
249
- const { isDaemonMode } = await importConfig();
250
- expect(isDaemonMode()).toBe(false);
251
- });
252
-
253
- it('returns false when no config', async () => {
254
- const { isDaemonMode } = await importConfig();
255
- expect(isDaemonMode()).toBe(false);
256
- });
257
- });