@yuriai/web 0.1.5 → 0.1.6

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 (54) hide show
  1. package/README.md +2 -0
  2. package/dist/assets/{AssistantView-D3j8FlaF.js → AssistantView-CLk1T4Of.js} +3 -3
  3. package/dist/assets/{DiagramView-TX1QZ1-S.js → DiagramView-BXVAioBW.js} +1 -1
  4. package/dist/assets/{MarkdownRenderer-DGUI8EIG.js → MarkdownRenderer-BY7SOGeo.js} +2 -2
  5. package/dist/assets/{MarkdownRendererImpl-DndseLUT.js → MarkdownRendererImpl-KSaMBtRF.js} +1 -1
  6. package/dist/assets/{MarkstreamRendererImpl-Ehxwt6MS.js → MarkstreamRendererImpl-BvkGmuQ6.js} +1 -1
  7. package/dist/assets/{MobileDetailNavigation-D7uM40jU.js → MobileDetailNavigation-DACAHTpS.js} +1 -1
  8. package/dist/assets/{MobileShareBridge-BMQKnoEb.js → MobileShareBridge-DLPBToEM.js} +1 -1
  9. package/dist/assets/{MobileTabPageHeader-Cco8ToA6.js → MobileTabPageHeader-CvtrPaC2.js} +1 -1
  10. package/dist/assets/{MultiRunWindow-CVI6D2LM.js → MultiRunWindow-4G9PetNl.js} +1 -1
  11. package/dist/assets/{SettingsView-Bx-5WRtO.js → SettingsView-pRXWe1jD.js} +1 -1
  12. package/dist/assets/{SettingsWindow-Cj6sYyvK.js → SettingsWindow-DGK3Earv.js} +1 -1
  13. package/dist/assets/{TerminalView-DW4OxMaM.js → TerminalView-CagyLr39.js} +1 -1
  14. package/dist/assets/{ToolOutputDialog-DxKGYhQ6.js → ToolOutputDialog-DHukIjoH.js} +1 -1
  15. package/dist/assets/{appThemeRegistry-DlEr4DLc.js → appThemeRegistry-U9eZywBt.js} +1 -1
  16. package/dist/assets/{capgoAdapter-Onw1miMh.js → capgoAdapter-ChF9Cg3G.js} +1 -1
  17. package/dist/assets/{fileMentionTouchSelection-B26MejYr.js → fileMentionTouchSelection-Bip-B2J9.js} +1 -1
  18. package/dist/assets/{gitApi-BXhXdWkh.js → gitApi-BN0aozGg.js} +1 -1
  19. package/dist/assets/{insertionBoundaries-BxSGE3B7.js → insertionBoundaries-gfsrexDz.js} +1 -1
  20. package/dist/assets/{main-BdV8Awp-.js → main-C8xj4UeZ.js} +2 -2
  21. package/dist/assets/{main-CGpFMQTy.js → main-CjjADMt-.js} +4 -4
  22. package/dist/assets/{mcpQueries-uZJFBhGj.js → mcpQueries-DJCrzyc3.js} +1 -1
  23. package/dist/assets/{miniChat-B1aBBLiq.js → miniChat-D17acnB9.js} +2 -2
  24. package/dist/assets/{mobile-B8U8FARq.js → mobile-DiL1n1m5.js} +2 -2
  25. package/dist/assets/{mobileBackNavigation-D2yUxPpG.js → mobileBackNavigation-B1NT3K0K.js} +1 -1
  26. package/dist/assets/{multirun-DKsVtdZX.js → multirun-D2KlubbP.js} +1 -1
  27. package/dist/assets/{native-config-Bpk4DOW1.js → native-config-D9DfX51I.js} +1 -1
  28. package/dist/assets/{projectMeta-yox5XHhN.js → projectMeta-B5lVMdxF.js} +1 -1
  29. package/dist/assets/{renderElectronMiniChatApp-CdEZXhzq.js → renderElectronMiniChatApp-DQGRyvOy.js} +2 -2
  30. package/dist/assets/{renderMobileApp-BoV5wjPF.js → renderMobileApp-BlCyG-WF.js} +4 -4
  31. package/dist/assets/{runtimeConfig-B8s9sTX_.js → runtimeConfig-MKo97i27.js} +1 -1
  32. package/dist/assets/{runtimeEndpointReset-BswmG9Bb.js → runtimeEndpointReset-DrO__UOn.js} +1 -1
  33. package/dist/assets/{sessionChangeSummary-BGbmGpQw.js → sessionChangeSummary-DN7H-rqE.js} +1 -1
  34. package/dist/assets/{sessionLookup-CGJA6W7O.js → sessionLookup-DezY-ONT.js} +1 -1
  35. package/dist/assets/{speechSettingsQueries-CjTT-adl.js → speechSettingsQueries-DFAUd_Aw.js} +1 -1
  36. package/dist/assets/{types-Bu1xM0fS.js → types-DZcrt4Z0.js} +1 -1
  37. package/dist/assets/{useAppFontEffects-D6yauGdg.js → useAppFontEffects-DUPuwJH5.js} +5 -5
  38. package/dist/assets/{useDesktopWindowControlsLayout-SKHaFoVu.js → useDesktopWindowControlsLayout-Co_z6hbP.js} +1 -1
  39. package/dist/assets/{useEffectiveDirectory-D6GwXhDS.js → useEffectiveDirectory-DXPmcf8E.js} +1 -1
  40. package/dist/assets/{useMobileNavigationStore-ByrZJd5L.js → useMobileNavigationStore-DcG6Ukmu.js} +3 -3
  41. package/dist/assets/{useWorkerHighlightedLines-CwC34Jql.js → useWorkerHighlightedLines-BnmJy3ZO.js} +1 -1
  42. package/dist/index.html +5 -5
  43. package/dist/mini-chat.html +5 -5
  44. package/dist/mobile.html +5 -5
  45. package/package.json +1 -1
  46. package/server/lib/content-search/DOCUMENTATION.md +5 -1
  47. package/server/lib/opencode/DOCUMENTATION.md +8 -7
  48. package/server/lib/opencode/config-entity-routes.js +5 -1
  49. package/server/lib/opencode/config-entity-routes.test.js +23 -0
  50. package/server/lib/opencode/ensure-cli.js +48 -11
  51. package/server/lib/opencode/ensure-cli.test.js +53 -1
  52. package/server/lib/opencode/env-runtime.js +5 -5
  53. package/server/lib/opencode/terminal-path.js +67 -0
  54. package/server/lib/opencode/terminal-path.test.js +68 -0
@@ -0,0 +1,68 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { afterEach, expect, test, vi } from 'vitest';
6
+ import { ensurePinnedOpenCode2Cli, installPinnedOpenCode2Cli } from './ensure-cli.js';
7
+ import { configureOpenCodeTerminalPath } from './terminal-path.js';
8
+
9
+ const roots = [];
10
+ afterEach(() => { for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true }); });
11
+
12
+ test.each(['/bin/bash', '/bin/zsh'].filter((shell) => fs.existsSync(shell)))('fresh installation is available in %s, preserves rc content and is idempotent', async (shell) => {
13
+ const home = fs.mkdtempSync(path.join(os.tmpdir(), "yuri cli's "));
14
+ roots.push(home);
15
+ const dataDir = path.join(home, '.config', 'yuri');
16
+ const binary = path.join(dataDir, 'opencode-cli', '2.9.1', 'opencode');
17
+ const zdotdir = path.join(home, 'zsh');
18
+ fs.mkdirSync(zdotdir);
19
+ const rc = shell.endsWith('zsh') ? path.join(zdotdir, '.zshrc') : path.join(home, '.bashrc');
20
+ fs.writeFileSync(rc, '# user configuration\n');
21
+ const options = { pin: '2.9.1', dataDir, homedir: () => home,
22
+ env: { HOME: home, ZDOTDIR: zdotdir, SHELL: shell, PATH: '/usr/bin:/bin' },
23
+ install: vi.fn(async () => {
24
+ fs.mkdirSync(path.dirname(binary), { recursive: true });
25
+ fs.writeFileSync(binary, '#!/bin/sh\nprintf "2.9.1\\n"\n', { mode: 0o755 });
26
+ return binary;
27
+ }),
28
+ };
29
+ await ensurePinnedOpenCode2Cli(options);
30
+ const first = fs.readFileSync(rc, 'utf8');
31
+ expect(first).toContain('# user configuration\n');
32
+ const result = spawnSync(shell, ['-ic', 'opencode --version'], {
33
+ env: options.env, encoding: 'utf8', timeout: 5000,
34
+ });
35
+ expect(result.status, result.stderr).toBe(0);
36
+ expect(result.stdout.trim()).toBe('2.9.1');
37
+ await ensurePinnedOpenCode2Cli(options);
38
+ expect(fs.readFileSync(rc, 'utf8')).toBe(first);
39
+ expect(options.install).toHaveBeenCalledTimes(1);
40
+
41
+ await installPinnedOpenCode2Cli({ ...options, version: '2.10.0',
42
+ fetch: async (url) => String(url).endsWith('/2.10.0')
43
+ ? Response.json({ dist: { tarball: 'https://example.com/cli.tgz' } }) : new Response('fixture'),
44
+ extract: async (_archive, target) => {
45
+ fs.mkdirSync(target, { recursive: true });
46
+ fs.writeFileSync(path.join(target, 'opencode'), '#!/bin/sh\nprintf "2.10.0\\n"\n');
47
+ },
48
+ });
49
+ const upgraded = spawnSync(shell, ['-ic', 'opencode --version'], { env: options.env, encoding: 'utf8', timeout: 5000 });
50
+ expect(upgraded.status, upgraded.stderr).toBe(0);
51
+ expect(upgraded.stdout.trim()).toBe('2.10.0');
52
+ expect(fs.readFileSync(rc, 'utf8')).toBe(first);
53
+ });
54
+
55
+ test('Windows updates only user PATH using a hidden first-level process and reports failure', () => {
56
+ const spawn = vi.fn(() => ({ status: 0 }));
57
+ const dataDir = fs.mkdtempSync(path.join(os.tmpdir(), 'yuri-win-path-'));
58
+ roots.push(dataDir);
59
+ const binary = path.join(dataDir, 'opencode-cli', '2.9.1', 'opencode.exe');
60
+ const options = { platform: 'win32', dataDir, homedir: dataDir, spawnSync: spawn, env: {} };
61
+ configureOpenCodeTerminalPath(binary, options);
62
+ expect(spawn).toHaveBeenCalledWith('powershell.exe', expect.arrayContaining(['-NoProfile', '-NonInteractive']), expect.objectContaining({
63
+ windowsHide: true, env: expect.objectContaining({ YURI_CLI_BIN_DIR: path.dirname(binary) }),
64
+ }));
65
+ expect(spawn.mock.calls[0][1].at(-1)).toContain("GetEnvironmentVariable('Path', 'User')");
66
+ spawn.mockReturnValue({ status: 1 });
67
+ expect(() => configureOpenCodeTerminalPath(binary, options)).toThrow('Windows user PATH');
68
+ });