termdock 1.4.45 → 1.4.47

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 (71) hide show
  1. package/dist/client/assets/{abnfDiagram-VRR7QNED-Bt36T7gE.js → abnfDiagram-VRR7QNED-xXEmQsOW.js} +1 -1
  2. package/dist/client/assets/{arc-DhZtXG4q.js → arc-c3mZlWqm.js} +1 -1
  3. package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-C4BLot_l.js → architectureDiagram-ZJ3FMSHR-DMbRcwkn.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-677ZJIJ3-BG8NrPiD.js → blockDiagram-677ZJIJ3-B9lNQSTH.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-LMCZKHZV-m3lWYsQI.js → c4Diagram-LMCZKHZV-DgZW5rdv.js} +1 -1
  6. package/dist/client/assets/channel-WVRLx8X3.js +1 -0
  7. package/dist/client/assets/{chunk-2Q5K7J3B-BiBc5Uv0.js → chunk-2Q5K7J3B-Cb_tv5Wu.js} +1 -1
  8. package/dist/client/assets/{chunk-32BRIVSS-C1g4c11U.js → chunk-32BRIVSS-xoR592bq.js} +1 -1
  9. package/dist/client/assets/{chunk-5VM5RSS4-Ctw1x2FG.js → chunk-5VM5RSS4-oDHo1_f6.js} +1 -1
  10. package/dist/client/assets/{chunk-EX3LRPZG-BdI4v3f4.js → chunk-EX3LRPZG-CsA_QWZT.js} +1 -1
  11. package/dist/client/assets/{chunk-JWPE2WC7-K8nPht_5.js → chunk-JWPE2WC7-iMhYUaoV.js} +1 -1
  12. package/dist/client/assets/{chunk-MOJQB5TN-DWsVsFoK.js → chunk-MOJQB5TN-BIPIzHce.js} +1 -1
  13. package/dist/client/assets/{chunk-RYQCIY6F-0MHmqGNs.js → chunk-RYQCIY6F-COxDBj29.js} +1 -1
  14. package/dist/client/assets/{chunk-V7JOEXUC-BjQQBzKq.js → chunk-V7JOEXUC-jObcq0_w.js} +1 -1
  15. package/dist/client/assets/{chunk-VR4S4FIN-Bau1q0xN.js → chunk-VR4S4FIN-Cgq2CHJ_.js} +1 -1
  16. package/dist/client/assets/{chunk-XXDRQBXY-BIzI5y55.js → chunk-XXDRQBXY-C5rWtvue.js} +1 -1
  17. package/dist/client/assets/classDiagram-OUVF2IWQ-2HXz2vIZ.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-EOCWNBFH-2HXz2vIZ.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-JH36ORCC-C_6nPODG.js → cose-bilkent-JH36ORCC-D4W8Q8zp.js} +1 -1
  20. package/dist/client/assets/{cynefin-VYW2F7L2-DZfIXs6F.js → cynefin-VYW2F7L2-BqiVn0zY.js} +1 -1
  21. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-Cwtffn_E.js → cynefinDiagram-TSTJHNR4-eOjES7Uk.js} +1 -1
  22. package/dist/client/assets/{dagre-VKFMJZFB-n2L4piqF.js → dagre-VKFMJZFB-BT2lSgUu.js} +1 -1
  23. package/dist/client/assets/{diagram-FQU43EPY-DYc1Xsf9.js → diagram-FQU43EPY-BlEQB0Wa.js} +1 -1
  24. package/dist/client/assets/{diagram-G47NLZAW-Bty2-g6M.js → diagram-G47NLZAW-CfGX_cA7.js} +1 -1
  25. package/dist/client/assets/{diagram-NH7WQ7WH-B7NwHUrU.js → diagram-NH7WQ7WH-DTN5IC_4.js} +1 -1
  26. package/dist/client/assets/{diagram-OA4YK3LP-BB8nlvCx.js → diagram-OA4YK3LP-Cr_X18I_.js} +1 -1
  27. package/dist/client/assets/{diagram-WEI45ONY-2hoKf8a6.js → diagram-WEI45ONY-DkWVId1b.js} +1 -1
  28. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-BARVSv3m.js → ebnfDiagram-CCIWWBDH-YakS4L5W.js} +1 -1
  29. package/dist/client/assets/{erDiagram-Q63AITRT-5jgm5Ksi.js → erDiagram-Q63AITRT-DOrw-auJ.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-23GEKE2U-BqCA33p5.js → flowDiagram-23GEKE2U-DhpCjDDF.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-NO4QXBWP-BL1NGUYm.js → ganttDiagram-NO4QXBWP-BNKEBypV.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-D9Qw6ov4.js → gitGraphDiagram-IHSO6WYX-yMteZOxr.js} +1 -1
  33. package/dist/client/assets/{index-BYpFR_L5.js → index-75VE-HQx.js} +79 -79
  34. package/dist/client/assets/{infoDiagram-FWYZ7A6U-ZrovoSsZ.js → infoDiagram-FWYZ7A6U-C2i_QPyy.js} +1 -1
  35. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-uFSMTzKn.js → ishikawaDiagram-FXEZZL3T-BQlWO28k.js} +1 -1
  36. package/dist/client/assets/{journeyDiagram-5HDEW3XC-DNXNzmef.js → journeyDiagram-5HDEW3XC-B9uP3MoN.js} +1 -1
  37. package/dist/client/assets/{kanban-definition-HUTT4EX6-Db2NpkWT.js → kanban-definition-HUTT4EX6-rlfrqFLx.js} +1 -1
  38. package/dist/client/assets/{linear-DjF6fII5.js → linear-DfWrlpf9.js} +1 -1
  39. package/dist/client/assets/{mermaid.core-BXI9ENYY.js → mermaid.core-CVZF0dKx.js} +4 -4
  40. package/dist/client/assets/{mindmap-definition-LN4V7U3C-CjcF3QgK.js → mindmap-definition-LN4V7U3C-DG8LHYTz.js} +1 -1
  41. package/dist/client/assets/{pegDiagram-2B236MQR-BckzTuEj.js → pegDiagram-2B236MQR-C13qrniu.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-ENE6RG2P-Ch2Ty0Y2.js → pieDiagram-ENE6RG2P-BUz782ot.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-DvXeQj4a.js → quadrantDiagram-ABIIQ3AL-CGd-XJg3.js} +1 -1
  44. package/dist/client/assets/{railroadDiagram-RFXS5EU6-BUurE4S_.js → railroadDiagram-RFXS5EU6-DbfdIi8k.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-TGXJPOKE-CfnNu5HR.js → requirementDiagram-TGXJPOKE-CLssmPfP.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-BfpeK6jA.js → sankeyDiagram-HTMAVEWB-DHSBB69r.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-CmkcMlBD.js → sequenceDiagram-DBY2YBRQ-BrVCviNJ.js} +1 -1
  48. package/dist/client/assets/{sizeCapture-X5ZJPWSS-BvnnE9Ev.js → sizeCapture-X5ZJPWSS-KmVuoFrX.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-2N3HPSRC-D-gs0yW-.js → stateDiagram-2N3HPSRC-ChRW_w5J.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-Dnlauzzq.js +1 -0
  51. package/dist/client/assets/{swimlanes-5IMT3BWC-BW65nQch.js → swimlanes-5IMT3BWC-DOOxTOx2.js} +2 -2
  52. package/dist/client/assets/swimlanesDiagram-G3AALYLV-BVOOD7ia.js +8 -0
  53. package/dist/client/assets/{timeline-definition-FHXFAJF6-Mj3zCwTc.js → timeline-definition-FHXFAJF6-CgmYsE8y.js} +1 -1
  54. package/dist/client/assets/{vennDiagram-L72KCM5P-gXnoVb66.js → vennDiagram-L72KCM5P-CzlHRf82.js} +1 -1
  55. package/dist/client/assets/{wardleyDiagram-EHGQE667-Cgbh1_F7.js → wardleyDiagram-EHGQE667-DboWJKy5.js} +1 -1
  56. package/dist/client/assets/{xychartDiagram-FW5EYKEG-DQW7oknN.js → xychartDiagram-FW5EYKEG-D9hSM6kK.js} +1 -1
  57. package/dist/client/index.html +1 -1
  58. package/dist/client/sw.js +1 -1
  59. package/dist/server/entry.js +31 -12
  60. package/dist/server/utils/runtimeClient.js +41 -0
  61. package/package.json +5 -2
  62. package/runtime-manifest.json +12 -0
  63. package/scripts/classify-release.mjs +88 -0
  64. package/scripts/generate-runtime-manifest.mjs +77 -0
  65. package/scripts/prepare-desktop-runtime.mjs +27 -3
  66. package/.desktop-dist/main.js +0 -800
  67. package/dist/client/assets/channel-Ck9tD_4_.js +0 -1
  68. package/dist/client/assets/classDiagram-OUVF2IWQ-CtEpUyds.js +0 -1
  69. package/dist/client/assets/classDiagram-v2-EOCWNBFH-CtEpUyds.js +0 -1
  70. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-gXYMxyju.js +0 -1
  71. package/dist/client/assets/swimlanesDiagram-G3AALYLV-DmhG9XuP.js +0 -8
@@ -0,0 +1,88 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
7
+
8
+ function git(args) {
9
+ return execFileSync('git', args, { cwd: root, encoding: 'utf8' }).trim();
10
+ }
11
+
12
+ function stable(value) {
13
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return value;
14
+ return Object.fromEntries(Object.keys(value).sort().map((key) => [key, stable(value[key])]));
15
+ }
16
+
17
+ function latestDesktopTag() {
18
+ return git(['tag', '--merged', 'HEAD', '--list', 'v*', '--sort=-version:refname'])
19
+ .split('\n')
20
+ .find(Boolean);
21
+ }
22
+
23
+ const requestedBase = process.argv.slice(2).find((argument) => !argument.startsWith('--'));
24
+ const base = requestedBase || latestDesktopTag();
25
+ if (!base) {
26
+ throw new Error('No desktop release tag found. Fetch tags or pass a base ref explicitly.');
27
+ }
28
+
29
+ const changedFiles = git(['diff', '--name-only', base, '--'])
30
+ .split('\n')
31
+ .map((file) => file.trim())
32
+ .filter(Boolean);
33
+ const currentPackage = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
34
+ const basePackage = JSON.parse(git(['show', `${base}:package.json`]));
35
+ const dependencyChanged = JSON.stringify(stable({
36
+ dependencies: currentPackage.dependencies ?? {},
37
+ engines: currentPackage.engines ?? {},
38
+ })) !== JSON.stringify(stable({
39
+ dependencies: basePackage.dependencies ?? {},
40
+ engines: basePackage.engines ?? {},
41
+ }));
42
+
43
+ const desktopPatterns = [
44
+ /^desktop\//,
45
+ /^forge\.config\.cjs$/,
46
+ /^tsconfig\.desktop\.json$/,
47
+ /^scripts\/prepare-desktop-runtime\.mjs$/,
48
+ /^scripts\/prepare-desktop-tokens\.mjs$/,
49
+ /^\.github\/workflows\/release-macos\.yml$/,
50
+ ];
51
+ const runtimePatterns = [
52
+ /^src\//,
53
+ /^public\//,
54
+ /^index\.html$/,
55
+ /^vite\.config\.ts$/,
56
+ /^tailwind\.config\.js$/,
57
+ /^postcss\.config\.js$/,
58
+ /^package(?:-lock)?\.json$/,
59
+ /^scripts\/generate-runtime-manifest\.mjs$/,
60
+ ];
61
+ const testFile = /(?:^|\/)\w[^/]*\.test\.[cm]?[jt]sx?$/;
62
+ const noReleaseFile = /^(?:docs\/|README|LICENSE|AGENTS|\.gitignore$|scripts\/classify-release\.mjs$)/;
63
+ const desktopFiles = changedFiles.filter((file) =>
64
+ !testFile.test(file) && desktopPatterns.some((pattern) => pattern.test(file)));
65
+ const runtimeFiles = changedFiles.filter((file) =>
66
+ !testFile.test(file) && runtimePatterns.some((pattern) => pattern.test(file)));
67
+ const codeFiles = changedFiles.filter((file) => !noReleaseFile.test(file) && !testFile.test(file));
68
+ const classified = new Set([...desktopFiles, ...runtimeFiles]);
69
+ const unknownCodeFiles = codeFiles.filter((file) => !classified.has(file));
70
+ const requiresDesktop = dependencyChanged || desktopFiles.length > 0 || unknownCodeFiles.length > 0;
71
+ const requiresRuntime = runtimeFiles.length > 0 || requiresDesktop;
72
+ const result = {
73
+ base,
74
+ requiresRuntime,
75
+ requiresDesktop,
76
+ dependencyChanged,
77
+ desktopFiles,
78
+ runtimeFiles,
79
+ unknownCodeFiles,
80
+ };
81
+
82
+ console.log(JSON.stringify(result, null, 2));
83
+ if (process.argv.includes('--github-output') && process.env.GITHUB_OUTPUT) {
84
+ fs.appendFileSync(
85
+ process.env.GITHUB_OUTPUT,
86
+ `requires_runtime=${requiresRuntime}\nrequires_desktop=${requiresDesktop}\n`,
87
+ );
88
+ }
@@ -0,0 +1,77 @@
1
+ import crypto from 'node:crypto';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
7
+ const packageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
8
+ const packageLock = JSON.parse(fs.readFileSync(path.join(root, 'package-lock.json'), 'utf8'));
9
+ const compatibility = JSON.parse(
10
+ fs.readFileSync(path.join(root, 'desktop', 'runtime-compatibility.json'), 'utf8'),
11
+ );
12
+
13
+ function stableObject(value) {
14
+ if (Array.isArray(value)) return value.map(stableObject);
15
+ if (!value || typeof value !== 'object') return value;
16
+ return Object.fromEntries(
17
+ Object.keys(value).sort().map((key) => [key, stableObject(value[key])]),
18
+ );
19
+ }
20
+
21
+ function hashDirectory(directory) {
22
+ const hash = crypto.createHash('sha256');
23
+ const visit = (current, relative = '') => {
24
+ for (const entry of fs.readdirSync(current, { withFileTypes: true })
25
+ .sort((left, right) => left.name.localeCompare(right.name))) {
26
+ const entryPath = path.join(current, entry.name);
27
+ const relativePath = path.join(relative, entry.name).split(path.sep).join('/');
28
+ if (entry.isDirectory()) visit(entryPath, relativePath);
29
+ else if (entry.isFile()) {
30
+ hash.update(relativePath);
31
+ hash.update('\0');
32
+ hash.update(fs.readFileSync(entryPath));
33
+ hash.update('\0');
34
+ }
35
+ }
36
+ };
37
+ visit(directory);
38
+ return `sha256-${hash.digest('base64')}`;
39
+ }
40
+
41
+ const productionPackages = Object.fromEntries(
42
+ Object.entries(packageLock.packages ?? {})
43
+ .filter(([packagePath, entry]) => packagePath && entry?.dev !== true)
44
+ .sort(([left], [right]) => left.localeCompare(right))
45
+ .map(([packagePath, entry]) => [packagePath, {
46
+ version: entry.version ?? null,
47
+ integrity: entry.integrity ?? null,
48
+ optional: entry.optional === true,
49
+ }]),
50
+ );
51
+ const dependencyInput = stableObject({
52
+ dependencies: packageJson.dependencies ?? {},
53
+ packages: productionPackages,
54
+ });
55
+ const dependencyHash = `sha256-${crypto
56
+ .createHash('sha256')
57
+ .update(JSON.stringify(dependencyInput))
58
+ .digest('base64')}`;
59
+
60
+ const manifest = {
61
+ schemaVersion: compatibility.schemaVersion,
62
+ packageName: packageJson.name,
63
+ version: packageJson.version,
64
+ runtimeProtocolVersion: compatibility.runtimeProtocolVersion,
65
+ minimumDesktopVersion: compatibility.minimumDesktopVersion,
66
+ nodeMajor: compatibility.nodeMajor,
67
+ dependencyHash,
68
+ serverBundleHash: hashDirectory(path.join(root, 'dist', 'server')),
69
+ entrypoint: 'dist/server/cli.js',
70
+ clientEntrypoint: 'dist/client/index.html',
71
+ };
72
+
73
+ fs.writeFileSync(
74
+ path.join(root, 'runtime-manifest.json'),
75
+ `${JSON.stringify(manifest, null, 2)}\n`,
76
+ );
77
+ console.log(`[runtime-manifest] ${manifest.version} ${manifest.dependencyHash}`);
@@ -14,6 +14,9 @@ const toolchainDir = path.join(stage, 'toolchain');
14
14
  const toolchainBinDir = path.join(toolchainDir, 'bin');
15
15
  const toolchainLibDir = path.join(toolchainDir, 'lib');
16
16
  const nodeDownloadDir = path.join(stage, 'node-download');
17
+ const nodeArchiveCacheDir = process.env.TERMDOCK_NODE_ARCHIVE_CACHE
18
+ ? path.resolve(process.env.TERMDOCK_NODE_ARCHIVE_CACHE)
19
+ : path.join(os.homedir(), '.cache', 'termdock', 'node-archives');
17
20
  const desktopBuildNodeMajor = 22;
18
21
 
19
22
  const buildNodeMajor = Number.parseInt(process.versions.node.split('.')[0], 10);
@@ -126,7 +129,19 @@ const nodeArchiveName = `node-${process.version}-${nodePlatform}-${nodeArch}.${n
126
129
  const nodeArchiveUrl = `https://nodejs.org/dist/${process.version}/${nodeArchiveName}`;
127
130
  fs.mkdirSync(nodeDownloadDir, { recursive: true });
128
131
  const nodeArchivePath = path.join(nodeDownloadDir, nodeArchiveName);
129
- run('/usr/bin/curl', ['-fL', '--retry', '4', '--output', nodeArchivePath, nodeArchiveUrl]);
132
+ fs.mkdirSync(nodeArchiveCacheDir, { recursive: true });
133
+ const cachedNodeArchivePath = path.join(nodeArchiveCacheDir, nodeArchiveName);
134
+ if (!fs.existsSync(cachedNodeArchivePath)) {
135
+ const temporaryArchivePath = `${cachedNodeArchivePath}.${process.pid}.tmp`;
136
+ try {
137
+ run('/usr/bin/curl', ['-fL', '--retry', '4', '--output', temporaryArchivePath, nodeArchiveUrl]);
138
+ run('/usr/bin/tar', ['-tzf', temporaryArchivePath], { stdio: 'ignore' });
139
+ fs.renameSync(temporaryArchivePath, cachedNodeArchivePath);
140
+ } finally {
141
+ fs.rmSync(temporaryArchivePath, { force: true });
142
+ }
143
+ }
144
+ fs.copyFileSync(cachedNodeArchivePath, nodeArchivePath);
130
145
  if (nodeArchiveExt !== 'tar.gz') {
131
146
  throw new Error(`Desktop runtime preparation is not implemented for ${process.platform}`);
132
147
  }
@@ -140,18 +155,26 @@ const extractedNode = path.join(
140
155
  copyMacBinary(extractedNode, runtimeNode);
141
156
 
142
157
  const rootPackage = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
158
+ const runtimeManifest = JSON.parse(
159
+ fs.readFileSync(path.join(root, 'runtime-manifest.json'), 'utf8'),
160
+ );
143
161
  const runtimePackage = {
144
- name: 'termdock-desktop-runtime',
162
+ name: rootPackage.name,
145
163
  version: rootPackage.version,
146
164
  private: true,
147
165
  type: 'module',
148
166
  dependencies: rootPackage.dependencies,
149
167
  };
150
168
  fs.writeFileSync(path.join(serverDir, 'package.json'), `${JSON.stringify(runtimePackage, null, 2)}\n`);
169
+ fs.copyFileSync(path.join(root, 'package-lock.json'), path.join(serverDir, 'package-lock.json'));
170
+ fs.copyFileSync(
171
+ path.join(root, 'runtime-manifest.json'),
172
+ path.join(serverDir, 'runtime-manifest.json'),
173
+ );
151
174
  fs.cpSync(path.join(root, 'dist'), path.join(serverDir, 'dist'), { recursive: true });
152
175
 
153
176
  run(process.platform === 'win32' ? 'npm.cmd' : 'npm', [
154
- 'install',
177
+ 'ci',
155
178
  '--omit=dev',
156
179
  '--no-audit',
157
180
  '--no-fund',
@@ -195,6 +218,7 @@ const manifest = {
195
218
  nodeVersion: process.version,
196
219
  createdAt: new Date().toISOString(),
197
220
  tools: fs.readdirSync(toolchainBinDir).sort(),
221
+ runtimeCompatibility: runtimeManifest,
198
222
  };
199
223
  fs.writeFileSync(path.join(stage, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`);
200
224
  console.log(`[desktop-runtime] ready at ${stage}`);