@wjarka/cezarion 0.14.8 → 0.14.9-dev.842

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 (207) hide show
  1. package/README.md +76 -2
  2. package/dist/application-update/bin-recovery.d.ts +5 -0
  3. package/dist/application-update/bin-recovery.js +96 -0
  4. package/dist/application-update/bin-recovery.js.map +1 -0
  5. package/dist/application-update/discovery.d.ts +22 -0
  6. package/dist/application-update/discovery.js +91 -0
  7. package/dist/application-update/discovery.js.map +1 -0
  8. package/dist/application-update/helper.d.ts +57 -0
  9. package/dist/application-update/helper.js +374 -0
  10. package/dist/application-update/helper.js.map +1 -0
  11. package/dist/application-update/launcher.d.ts +8 -0
  12. package/dist/application-update/launcher.js +53 -0
  13. package/dist/application-update/launcher.js.map +1 -0
  14. package/dist/application-update/lock.d.ts +4 -0
  15. package/dist/application-update/lock.js +70 -0
  16. package/dist/application-update/lock.js.map +1 -0
  17. package/dist/application-update/npm-process.d.ts +17 -0
  18. package/dist/application-update/npm-process.js +133 -0
  19. package/dist/application-update/npm-process.js.map +1 -0
  20. package/dist/application-update/service.d.ts +69 -0
  21. package/dist/application-update/service.js +456 -0
  22. package/dist/application-update/service.js.map +1 -0
  23. package/dist/artifacts/cli.d.ts +1 -0
  24. package/dist/artifacts/cli.js +32 -0
  25. package/dist/artifacts/cli.js.map +1 -0
  26. package/dist/artifacts/lifecycle.d.ts +4 -0
  27. package/dist/artifacts/lifecycle.js +42 -0
  28. package/dist/artifacts/lifecycle.js.map +1 -0
  29. package/dist/artifacts/resolve.d.ts +18 -0
  30. package/dist/artifacts/resolve.js +102 -0
  31. package/dist/artifacts/resolve.js.map +1 -0
  32. package/dist/artifacts/store.d.ts +8 -0
  33. package/dist/artifacts/store.js +323 -0
  34. package/dist/artifacts/store.js.map +1 -0
  35. package/dist/ci-wait/mcp.d.ts +3 -0
  36. package/dist/ci-wait/mcp.js +14 -3
  37. package/dist/ci-wait/mcp.js.map +1 -1
  38. package/dist/contract/application-update.d.ts +32 -0
  39. package/dist/contract/artifacts.d.ts +83 -0
  40. package/dist/contract/ask-schema.d.ts +32 -0
  41. package/dist/contract/ask.d.ts +2 -32
  42. package/dist/contract/conversations.d.ts +165 -0
  43. package/dist/contract/delegation.d.ts +39 -0
  44. package/dist/contract/events.d.ts +49 -0
  45. package/dist/contract/health.d.ts +12 -0
  46. package/dist/contract/index.d.ts +2 -0
  47. package/dist/contract/index.js +1374 -1247
  48. package/dist/contract/runs.d.ts +143 -0
  49. package/dist/contract/skills.d.ts +28 -0
  50. package/dist/core/agent-runner.d.ts +33 -4
  51. package/dist/core/agent-runner.js +5 -0
  52. package/dist/core/agent-runner.js.map +1 -1
  53. package/dist/core/claude-cli-runner.d.ts +6 -12
  54. package/dist/core/claude-cli-runner.js +89 -19
  55. package/dist/core/claude-cli-runner.js.map +1 -1
  56. package/dist/core/codex-app-server-runner.d.ts +2 -1
  57. package/dist/core/codex-app-server-runner.js +327 -92
  58. package/dist/core/codex-app-server-runner.js.map +1 -1
  59. package/dist/core/codex-app-server-transport.d.ts +13 -1
  60. package/dist/core/codex-app-server-transport.js +58 -17
  61. package/dist/core/codex-app-server-transport.js.map +1 -1
  62. package/dist/core/cursor-acp-runner.d.ts +4 -1
  63. package/dist/core/cursor-acp-runner.js +3 -0
  64. package/dist/core/cursor-acp-runner.js.map +1 -1
  65. package/dist/core/cursor-provider-error.js +6 -1
  66. package/dist/core/cursor-provider-error.js.map +1 -1
  67. package/dist/core/input-submissions.d.ts +14 -0
  68. package/dist/core/input-submissions.js +26 -0
  69. package/dist/core/input-submissions.js.map +1 -0
  70. package/dist/core/opencode-server-runner.d.ts +4 -1
  71. package/dist/core/opencode-server-runner.js +144 -21
  72. package/dist/core/opencode-server-runner.js.map +1 -1
  73. package/dist/core/pi-runner.d.ts +2 -1
  74. package/dist/core/pi-runner.js +72 -7
  75. package/dist/core/pi-runner.js.map +1 -1
  76. package/dist/delegation/cli.js +102 -6
  77. package/dist/delegation/cli.js.map +1 -1
  78. package/dist/delegation/conversations.js +13 -5
  79. package/dist/delegation/conversations.js.map +1 -1
  80. package/dist/delegation/input.d.ts +2 -1
  81. package/dist/delegation/input.js +6 -1
  82. package/dist/delegation/input.js.map +1 -1
  83. package/dist/delegation/provision.js +5 -3
  84. package/dist/delegation/provision.js.map +1 -1
  85. package/dist/delegation/questions.d.ts +19 -0
  86. package/dist/delegation/questions.js +45 -0
  87. package/dist/delegation/questions.js.map +1 -0
  88. package/dist/delegation/results.d.ts +1 -1
  89. package/dist/delegation/results.js +23 -13
  90. package/dist/delegation/results.js.map +1 -1
  91. package/dist/delegation/routes.d.ts +142 -15
  92. package/dist/delegation/routes.js +4 -1
  93. package/dist/delegation/routes.js.map +1 -1
  94. package/dist/delegation/service.d.ts +9 -5
  95. package/dist/delegation/service.js +106 -7
  96. package/dist/delegation/service.js.map +1 -1
  97. package/dist/delegation/transport.d.ts +188 -61
  98. package/dist/index.js +72 -26
  99. package/dist/index.js.map +1 -1
  100. package/dist/open-url.d.ts +2 -0
  101. package/dist/open-url.js +20 -0
  102. package/dist/open-url.js.map +1 -0
  103. package/dist/release/snapshot.d.ts +3 -3
  104. package/dist/release/snapshot.js +6 -6
  105. package/dist/release/snapshot.js.map +1 -1
  106. package/dist/runs/client-request.d.ts +11 -0
  107. package/dist/runs/client-request.js +26 -0
  108. package/dist/runs/client-request.js.map +1 -0
  109. package/dist/runs/delegation-state.d.ts +17 -0
  110. package/dist/runs/event-history.js +6 -0
  111. package/dist/runs/event-history.js.map +1 -1
  112. package/dist/runs/store.d.ts +78 -6
  113. package/dist/runs/store.js +163 -1
  114. package/dist/runs/store.js.map +1 -1
  115. package/dist/server/server.d.ts +3761 -1648
  116. package/dist/server/server.js +170 -4
  117. package/dist/server/server.js.map +1 -1
  118. package/dist/task-cli/cli.d.ts +38 -0
  119. package/dist/task-cli/cli.js +463 -0
  120. package/dist/task-cli/cli.js.map +1 -0
  121. package/dist/task-cli/discovery.d.ts +22 -0
  122. package/dist/task-cli/discovery.js +95 -0
  123. package/dist/task-cli/discovery.js.map +1 -0
  124. package/dist/task-cli/http.d.ts +43 -0
  125. package/dist/task-cli/http.js +101 -0
  126. package/dist/task-cli/http.js.map +1 -0
  127. package/dist/task-cli/projections.d.ts +40 -0
  128. package/dist/task-cli/projections.js +45 -0
  129. package/dist/task-cli/projections.js.map +1 -0
  130. package/dist/task-cli/watch.d.ts +78 -0
  131. package/dist/task-cli/watch.js +336 -0
  132. package/dist/task-cli/watch.js.map +1 -0
  133. package/dist/workflows/run.d.ts +93 -0
  134. package/dist/workflows/run.js +816 -81
  135. package/dist/workflows/run.js.map +1 -1
  136. package/dist/workspace/projects-cli.js +1 -1
  137. package/package.json +3 -3
  138. package/scripts/mock-claude.mjs +38 -2
  139. package/scripts/mock-codex-app-server.mjs +98 -1
  140. package/scripts/mock-cursor-acp.mjs +8 -0
  141. package/scripts/mock-opencode-serve.mjs +69 -2
  142. package/scripts/mock-pi-rpc.mjs +63 -2
  143. package/web/dist/assets/agent-accounts-JPfZPgKn.js +1 -0
  144. package/web/dist/assets/centered-state-HwCqQkH3.js +43 -0
  145. package/web/dist/assets/collapsible-CTymFdL7.js +1 -0
  146. package/web/dist/assets/commit-list-BZpYGQl2.js +1 -0
  147. package/web/dist/assets/compare-variants-9VkybaQ7.js +1 -0
  148. package/web/dist/assets/{diff-tRE59UNb2.js → diff-CZcD4D1r2.js} +2 -2
  149. package/web/dist/assets/diff-controls-CpcHG3Mm.js +1 -0
  150. package/web/dist/assets/{diff-stat-Cgnl_hYF.js → diff-stat-Cn7rzy1H.js} +1 -1
  151. package/web/dist/assets/{diff-view-DN1ort7Q.js → diff-view-C46nHiP2.js} +2 -2
  152. package/web/dist/assets/dropdown-menu-_YAzCaoQ.js +1 -0
  153. package/web/dist/assets/git-toolbar-BvKDz6uS.js +1 -0
  154. package/web/dist/assets/github-CgjJCGrD.js +1 -0
  155. package/web/dist/assets/{image-preview-C2JGcBlC.js → image-preview-B618kDBH.js} +1 -1
  156. package/web/dist/assets/index-BJtve0Pm.js +7 -0
  157. package/web/dist/assets/index-D0WAgmTQ.css +1 -0
  158. package/web/dist/assets/markdown-CFWZnvMh.js +2 -0
  159. package/web/dist/assets/pill-QfwkuR50.js +1 -0
  160. package/web/dist/assets/project-router-CkAA39N5.js +1 -0
  161. package/web/dist/assets/prompt-templates-Cfna_S0T.js +15 -0
  162. package/web/dist/assets/repo-git-DgzgJ0cP.js +1 -0
  163. package/web/dist/assets/{run-diff-CyG0Nciv.js → run-diff-YbCEQn5I.js} +2 -2
  164. package/web/dist/assets/run-header-DMgIbr1d.js +1 -0
  165. package/web/dist/assets/skills-BW79kUTd.js +1 -0
  166. package/web/dist/assets/{tab-link-BWNp3mLY.js → tab-link-MIHvczEm.js} +1 -1
  167. package/web/dist/assets/task-changes-C96ekt94.js +1 -0
  168. package/web/dist/assets/task-commits-DBfcMZyG.js +1 -0
  169. package/web/dist/assets/task-files-BKpH8dKQ.js +2 -0
  170. package/web/dist/assets/task-thread-Bw_nQuTx.css +1 -0
  171. package/web/dist/assets/task-thread-Dnq7Ek6W.js +9 -0
  172. package/web/dist/assets/textarea-D2vAVgYW.js +1 -0
  173. package/web/dist/assets/thread-loading-NW8Mthco.js +1 -0
  174. package/web/dist/assets/token-metrics-D188e6_0.js +1 -0
  175. package/web/dist/assets/utils-DKheTxGD.js +64 -0
  176. package/web/dist/assets/workflows-BFY1hgp3.js +11 -0
  177. package/web/dist/assets/{zoomable-image-Z3JDnm0b.js → zoomable-image-YW3Qdrr_.js} +1 -1
  178. package/web/dist/index.html +14 -14
  179. package/web/dist/assets/agent-accounts-BZm_2WAv.js +0 -1
  180. package/web/dist/assets/alert-dialog-B422RI-k.js +0 -43
  181. package/web/dist/assets/collapsible-Cy_Fmkrd.js +0 -1
  182. package/web/dist/assets/commit-list-Dcnk7TnI.js +0 -1
  183. package/web/dist/assets/compare-variants-Ciqwvd_f.js +0 -1
  184. package/web/dist/assets/diff-controls-BGrXGi7O.js +0 -1
  185. package/web/dist/assets/dropdown-menu-dwDGT8MM.js +0 -1
  186. package/web/dist/assets/git-toolbar-UiHnGvE0.js +0 -1
  187. package/web/dist/assets/github-D-MrkbJ7.js +0 -1
  188. package/web/dist/assets/ibm-plex-mono-regular-BF3vfe7_.ttf +0 -0
  189. package/web/dist/assets/index-BszfYvBq.js +0 -7
  190. package/web/dist/assets/index-CWh4pKP3.css +0 -1
  191. package/web/dist/assets/markdown-C_IcKVQd.js +0 -2
  192. package/web/dist/assets/pill-BsbO6G7y.js +0 -1
  193. package/web/dist/assets/project-router-DbLkll25.js +0 -1
  194. package/web/dist/assets/prompt-templates-BlTGJB5W.js +0 -15
  195. package/web/dist/assets/repo-git-Bm3s6Why.js +0 -1
  196. package/web/dist/assets/run-header-IFyIGCey.js +0 -1
  197. package/web/dist/assets/skills-C-C4DVFY.js +0 -1
  198. package/web/dist/assets/task-changes-D2PHtWUW.js +0 -1
  199. package/web/dist/assets/task-commits-N5u9U0_R.js +0 -1
  200. package/web/dist/assets/task-files-BS7c7CFm.js +0 -2
  201. package/web/dist/assets/task-thread-BQFdz1dJ.css +0 -1
  202. package/web/dist/assets/task-thread-DGM2dZV-.js +0 -9
  203. package/web/dist/assets/textarea-FjaU370i.js +0 -1
  204. package/web/dist/assets/thread-loading-77sJ8Yu_.js +0 -1
  205. package/web/dist/assets/token-metrics-Clxh03bE.js +0 -1
  206. package/web/dist/assets/utils-PYYcpCFZ.js +0 -64
  207. package/web/dist/assets/workflows-Czl0ZfXH.js +0 -11
@@ -0,0 +1,456 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { randomUUID } from 'node:crypto';
3
+ import { access, cp, mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
4
+ import { constants as fsConstants, existsSync, readFileSync, writeFileSync } from 'node:fs';
5
+ import { join, dirname, resolve } from 'node:path';
6
+ import { applicationUpdateStateSchema } from '../contract/index.js';
7
+ import { z } from 'zod';
8
+ import { assertCezarHomeWriteIsSandboxed } from '../paths.js';
9
+ import { isNewerVersion } from '../update-check.js';
10
+ import { discoverInstallation } from './discovery.js';
11
+ import { LockBusyError, withDirectoryLock } from './lock.js';
12
+ import { runOwnedNpm } from './npm-process.js';
13
+ import { snapshotGlobalBins, windowsGlobalLayout } from './bin-recovery.js';
14
+ import { globalBinDir } from '../install-as-command.js';
15
+ const PACKAGE = '@wjarka/cezarion';
16
+ const VERSION_RE = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
17
+ const SAFE_MESSAGES = new Set([
18
+ 'Update this installation manually.', 'Update was interrupted. Retry Update.',
19
+ 'Prepared update is missing. Retry Update.', 'Preparation failed. Retry Update or update manually.',
20
+ 'Update failed; previous release was restored. Retry Update.',
21
+ 'Update and recovery failed. Reinstall cezarion manually.', 'Update state needs retry.',
22
+ ]);
23
+ export class ApplicationUpdateConflictError extends Error {
24
+ }
25
+ export class ApplicationUpdateFailureError extends Error {
26
+ status;
27
+ constructor(message, status = 503) {
28
+ super(message);
29
+ this.status = status;
30
+ }
31
+ }
32
+ const recordSchema = z.object({
33
+ state: applicationUpdateStateSchema,
34
+ stage: z.string().optional(), recovery: z.string().optional(), binLinks: z.string().optional(),
35
+ recoveryPackage: z.string().max(4096).optional(),
36
+ ownerPid: z.number().int().positive().optional(), claimId: z.uuid().optional(),
37
+ startedAt: z.number().int().nonnegative().optional(),
38
+ repairCommand: z.string().max(2048).optional(),
39
+ }).strict();
40
+ function pidAlive(pid) {
41
+ try {
42
+ process.kill(pid, 0);
43
+ return true;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ function packageVersion(path) {
50
+ const manifest = JSON.parse(readFileSync(join(path, 'package.json'), 'utf8'));
51
+ if (manifest.name !== PACKAGE || typeof manifest.version !== 'string')
52
+ throw new Error('package identity mismatch');
53
+ return manifest.version;
54
+ }
55
+ /** Validate the npm result, not merely its exit code. */
56
+ export function validateInstalledPackage(path, expectedVersion, installRoot = path) {
57
+ const manifest = JSON.parse(readFileSync(join(path, 'package.json'), 'utf8'));
58
+ if (manifest.name !== PACKAGE || manifest.version !== expectedVersion)
59
+ throw new Error('staged package version mismatch');
60
+ if (!manifest.bin || !Object.values(manifest.bin).some((entry) => entry === 'dist/index.js'))
61
+ throw new Error('staged CLI entry missing');
62
+ if (!existsSync(join(path, 'dist/index.js')) || !existsSync(join(path, 'web/dist/index.html')))
63
+ throw new Error('staged package assets incomplete');
64
+ const html = readFileSync(join(path, 'web/dist/index.html'), 'utf8');
65
+ for (const [, asset] of html.matchAll(/(?:src|href)=["']\/assets\/([A-Za-z0-9._/-]+)["']/g)) {
66
+ if (!asset || asset.includes('..') || !existsSync(join(path, 'web/dist/assets', asset))) {
67
+ throw new Error('staged web assets incomplete');
68
+ }
69
+ }
70
+ if (!manifest.dependencies || typeof manifest.dependencies !== 'object')
71
+ throw new Error('staged dependencies missing');
72
+ if (manifest.engines?.node && !/^>=?\s*\d+/.test(manifest.engines.node))
73
+ throw new Error('unsupported engine declaration');
74
+ // npm's engine-strict flag verifies engine compatibility and installs the declared runtime tree.
75
+ for (const name of Object.keys(manifest.dependencies)) {
76
+ let cursor = path;
77
+ let present = false;
78
+ while (cursor.startsWith(installRoot)) {
79
+ if (existsSync(join(cursor, 'node_modules', name))) {
80
+ present = true;
81
+ break;
82
+ }
83
+ if (cursor === installRoot)
84
+ break;
85
+ const parent = dirname(cursor);
86
+ if (parent === cursor)
87
+ break;
88
+ cursor = parent;
89
+ }
90
+ if (!present) {
91
+ throw new Error('staged runtime dependencies incomplete');
92
+ }
93
+ }
94
+ }
95
+ function stageScopedPath(stage, outer) {
96
+ const nested = join(stage, 'node_modules/cezarion/node_modules/@wjarka/cezarion');
97
+ return outer === 'cezarion' && existsSync(nested) ? nested : join(stage, 'node_modules/@wjarka/cezarion');
98
+ }
99
+ export class ApplicationUpdateService {
100
+ options;
101
+ installation;
102
+ recordPath;
103
+ dir;
104
+ recoveryPackage;
105
+ record;
106
+ applying;
107
+ handoffArmed = false;
108
+ armingRestart = false;
109
+ listener;
110
+ lockLost = false;
111
+ constructor(options) {
112
+ this.options = options;
113
+ this.installation = discoverInstallation({ prefix: options.npmPrefix, cache: options.npmCache, packageRoot: options.packageRoot, launchEntry: options.launchEntry });
114
+ const identity = this.installation.kind === 'unsupported' ? resolve(options.packageRoot)
115
+ : `${this.installation.kind}\0${this.installation.installRoot}\0${this.installation.outerPackage}`;
116
+ this.dir = join(options.home, 'application-updates', createHash('sha256').update(identity).digest('hex'));
117
+ this.recordPath = join(this.dir, 'state.json');
118
+ this.recoveryPackage = this.installation.kind === 'global' && this.installation.outerPackage === 'cezarion'
119
+ && this.installation.packageRoot === join(dirname(this.installation.outerRoot), PACKAGE)
120
+ ? join(this.dir, 'recovery-package') : undefined;
121
+ this.record = { state: this.installation.kind === 'unsupported' && !options.dryRun
122
+ ? { status: 'idle', supported: false, message: 'Update this installation manually.' }
123
+ : { status: 'idle', supported: true } };
124
+ this.refreshRecord();
125
+ }
126
+ refreshRecord() {
127
+ if (this.installation.kind === 'unsupported' && !this.options.dryRun)
128
+ return;
129
+ let unknownRecord;
130
+ try {
131
+ unknownRecord = JSON.parse(readFileSync(this.recordPath, 'utf8'));
132
+ }
133
+ catch {
134
+ if (existsSync(this.recordPath))
135
+ this.record = { state: { status: 'error', supported: true, message: 'Update state needs retry.' } };
136
+ else if (!this.applying)
137
+ this.record = { state: { status: 'idle', supported: true } };
138
+ return;
139
+ }
140
+ const parsed = recordSchema.safeParse(unknownRecord);
141
+ if (!parsed.success) {
142
+ this.record = { state: { status: 'error', supported: true, message: 'Update state needs retry.' } };
143
+ return;
144
+ }
145
+ const loaded = parsed.data;
146
+ const stage = join(this.dir, 'stage');
147
+ const recovery = join(this.dir, 'recovery');
148
+ const bad = loaded.state.supported !== true
149
+ || (loaded.state.message !== undefined && !SAFE_MESSAGES.has(loaded.state.message))
150
+ || (loaded.state.targetVersion !== undefined && !VERSION_RE.test(loaded.state.targetVersion))
151
+ || (loaded.stage !== undefined && loaded.stage !== stage)
152
+ || (loaded.recovery !== undefined && loaded.recovery !== recovery)
153
+ || (loaded.recoveryPackage !== undefined && loaded.recoveryPackage !== join(this.dir, 'recovery-package'))
154
+ || (loaded.binLinks !== undefined && loaded.binLinks !== join(this.dir, 'bin-links.json'))
155
+ || (loaded.state.status === 'restarting' && !loaded.claimId && !this.options.dryRun)
156
+ || (!this.options.dryRun && ['preparing', 'restarting'].includes(loaded.state.status)
157
+ && (!loaded.startedAt || Date.now() - loaded.startedAt > (loaded.state.status === 'preparing' ? 180_000 : 360_000)));
158
+ if (bad) {
159
+ this.record = { state: { status: 'error', supported: true, message: 'Update state needs retry.' } };
160
+ return;
161
+ }
162
+ this.record = loaded;
163
+ if (!this.options.dryRun && (loaded.state.status === 'preparing' || loaded.state.status === 'restarting')
164
+ && (!loaded.ownerPid || !pidAlive(loaded.ownerPid))) {
165
+ this.record.state = { status: 'error', supported: true, message: 'Update was interrupted. Retry Update.' };
166
+ }
167
+ if (!this.options.dryRun && loaded.state.status === 'ready') {
168
+ try {
169
+ if (!loaded.stage || !loaded.recovery || !loaded.state.targetVersion || !existsSync(stage) || !existsSync(recovery)) {
170
+ throw new Error('prepared files missing');
171
+ }
172
+ // Older hoisted records backed up only the alias; a changed layout also
173
+ // needs preparation again. Completed/in-flight claims may retain their
174
+ // original snapshot metadata after npm changes the dependency layout.
175
+ if (loaded.recoveryPackage !== this.recoveryPackage)
176
+ throw new Error('hoisted recovery mismatch');
177
+ if (this.recoveryPackage && this.installation.kind === 'global') {
178
+ validateInstalledPackage(this.recoveryPackage, packageVersion(this.installation.packageRoot));
179
+ }
180
+ const stagedScoped = stageScopedPath(stage, this.installation.kind === 'unsupported' ? PACKAGE : this.installation.outerPackage);
181
+ validateInstalledPackage(stagedScoped, loaded.state.targetVersion, stage);
182
+ if (this.installation.kind !== 'unsupported' && this.installation.outerPackage === 'cezarion') {
183
+ const alias = JSON.parse(readFileSync(join(stage, 'node_modules/cezarion/package.json'), 'utf8'));
184
+ if (alias.version !== loaded.state.targetVersion)
185
+ throw new Error('alias version mismatch');
186
+ }
187
+ }
188
+ catch {
189
+ this.record.state = { status: 'error', supported: true, message: 'Prepared update is missing. Retry Update.' };
190
+ }
191
+ }
192
+ }
193
+ snapshot() {
194
+ this.refreshRecord();
195
+ if (this.lockLost && ['preparing', 'restarting'].includes(this.record.state.status)) {
196
+ return { status: 'error', supported: true, message: 'Update was interrupted. Retry Update.' };
197
+ }
198
+ if (this.record.state.status !== 'preparing' && this.record.state.status !== 'restarting')
199
+ this.lockLost = false;
200
+ return this.record.state;
201
+ }
202
+ async persist(state, extra = {}, assertOwned) {
203
+ assertCezarHomeWriteIsSandboxed(this.recordPath);
204
+ await mkdir(this.dir, { recursive: true, mode: 0o700 });
205
+ this.record = { ...this.record, ...extra, state };
206
+ const temp = `${this.recordPath}.${process.pid}.tmp`;
207
+ await writeFile(temp, JSON.stringify(this.record), { mode: 0o600 });
208
+ await assertOwned?.();
209
+ await rename(temp, this.recordPath);
210
+ this.options.onChange?.();
211
+ this.listener?.();
212
+ }
213
+ onStateChange(listener) { this.listener = listener; }
214
+ apply() {
215
+ if (this.applying)
216
+ return this.applying;
217
+ this.refreshRecord();
218
+ this.applying = this.prepare().finally(() => { this.applying = undefined; });
219
+ return this.applying;
220
+ }
221
+ async prepare() {
222
+ if (this.options.dryRun) {
223
+ const target = this.options.targetVersion();
224
+ const old = packageVersion(this.options.packageRoot);
225
+ if (!target || !VERSION_RE.test(target) || !isNewerVersion(target, old))
226
+ throw new ApplicationUpdateConflictError('No newer release is available.');
227
+ await this.persist({ status: 'preparing', supported: true, targetVersion: target });
228
+ await this.persist({ status: 'ready', supported: true, targetVersion: target });
229
+ return this.record.state;
230
+ }
231
+ const installation = this.installation;
232
+ if (installation.kind === 'unsupported')
233
+ throw new ApplicationUpdateConflictError('Update this installation manually.');
234
+ const target = this.options.targetVersion();
235
+ const oldVersion = packageVersion(installation.packageRoot);
236
+ if (!target || !VERSION_RE.test(target) || !isNewerVersion(target, oldVersion))
237
+ throw new ApplicationUpdateConflictError('No newer release is available.');
238
+ this.refreshRecord();
239
+ if (this.record.state.targetVersion === target && ['ready', 'restarting'].includes(this.record.state.status))
240
+ return this.record.state;
241
+ const stage = join(this.dir, 'stage');
242
+ const recovery = join(this.dir, 'recovery');
243
+ const binLinks = join(this.dir, 'bin-links.json');
244
+ let enteredLock = false;
245
+ try {
246
+ const originalPath = installation.kind === 'npx' ? installation.installRoot : installation.outerRoot;
247
+ for (const path of this.recoveryPackage ? [originalPath, installation.packageRoot] : [originalPath]) {
248
+ const writable = await stat(path);
249
+ if ((writable.mode & 0o222) === 0)
250
+ throw new ApplicationUpdateFailureError('Original installation is not writable. Update manually.', 409);
251
+ try {
252
+ await access(path, fsConstants.W_OK);
253
+ }
254
+ catch {
255
+ throw new ApplicationUpdateFailureError('Original installation is not writable. Update manually.', 409);
256
+ }
257
+ }
258
+ assertCezarHomeWriteIsSandboxed(this.dir);
259
+ await mkdir(this.dir, { recursive: true, mode: 0o700 });
260
+ return await withDirectoryLock(join(this.dir, 'operation.lock'), async (assertOwned, signal) => {
261
+ enteredLock = true;
262
+ try {
263
+ this.refreshRecord();
264
+ if (this.record.state.targetVersion === target && ['ready', 'restarting'].includes(this.record.state.status))
265
+ return this.record.state;
266
+ if (this.record.state.status === 'restarting')
267
+ throw new ApplicationUpdateConflictError('Restart is already in progress.');
268
+ await this.persist({ status: 'preparing', supported: true, targetVersion: target }, { ownerPid: process.pid, startedAt: Date.now() }, assertOwned);
269
+ await assertOwned();
270
+ await rm(stage, { recursive: true, force: true });
271
+ await rm(recovery, { recursive: true, force: true });
272
+ if (this.recoveryPackage) {
273
+ await assertOwned();
274
+ await rm(this.recoveryPackage, { recursive: true, force: true });
275
+ }
276
+ await mkdir(stage, { recursive: true });
277
+ const spec = `${installation.outerPackage}@${target}`;
278
+ if (!this.options.dryRun) {
279
+ const args = ['install', '--prefix', stage, '--engine-strict', '--no-audit', '--no-fund', '--ignore-scripts', '--prefer-online', '--fetch-retries=1', spec];
280
+ await (this.options.runNpm ?? ((argv, abortSignal) => this.runNpm(argv, abortSignal)))(args, signal);
281
+ }
282
+ else {
283
+ await cp(installation.installRoot, stage, { recursive: true });
284
+ }
285
+ await assertOwned();
286
+ const stagedScoped = stageScopedPath(stage, installation.outerPackage);
287
+ validateInstalledPackage(stagedScoped, target, stage);
288
+ if (installation.outerPackage === 'cezarion') {
289
+ const alias = JSON.parse(await readFile(join(stage, 'node_modules/cezarion/package.json'), 'utf8'));
290
+ if (alias.version !== target)
291
+ throw new Error('alias release has not been published yet');
292
+ }
293
+ // The affected npm installation and command links survive until the new boot is proven.
294
+ await cp(installation.kind === 'npx' ? installation.installRoot : installation.outerRoot, recovery, { recursive: true, dereference: false,
295
+ filter: async () => { await assertOwned(); return true; } });
296
+ // A global alias can resolve a sibling runtime that npm also replaces.
297
+ // Nested aliases and npx already include it in their whole-root copy.
298
+ if (this.recoveryPackage) {
299
+ await assertOwned();
300
+ await cp(installation.packageRoot, this.recoveryPackage, { recursive: true, dereference: false,
301
+ filter: async () => { await assertOwned(); return true; } });
302
+ validateInstalledPackage(this.recoveryPackage, oldVersion);
303
+ }
304
+ if (installation.kind === 'global') {
305
+ const outer = JSON.parse(await readFile(join(installation.outerRoot, 'package.json'), 'utf8'));
306
+ const windows = windowsGlobalLayout(installation.prefix, installation.outerRoot, installation.outerPackage);
307
+ await snapshotGlobalBins(globalBinDir(installation.prefix, windows ? 'win32' : 'linux'), Object.keys(outer.bin ?? {}), windows, binLinks, assertOwned);
308
+ }
309
+ await assertOwned();
310
+ await this.persist({ status: 'ready', supported: true, targetVersion: target }, { stage, recovery,
311
+ recoveryPackage: this.recoveryPackage,
312
+ binLinks: installation.kind === 'global' ? binLinks : undefined, ownerPid: undefined,
313
+ claimId: undefined, startedAt: undefined }, assertOwned);
314
+ return this.record.state;
315
+ }
316
+ catch (cause) {
317
+ if (cause instanceof ApplicationUpdateConflictError)
318
+ throw cause;
319
+ await assertOwned();
320
+ try {
321
+ await this.persist({ status: 'error', supported: true, targetVersion: target,
322
+ message: 'Preparation failed. Retry Update or update manually.' }, {}, assertOwned);
323
+ }
324
+ catch (failure) {
325
+ if (failure instanceof Error && failure.message === 'update lock ownership changed')
326
+ throw failure;
327
+ throw new ApplicationUpdateFailureError('Update storage is not writable. Update manually.');
328
+ }
329
+ throw cause;
330
+ }
331
+ }, this.options.lockWaitMs);
332
+ }
333
+ catch (cause) {
334
+ if (cause instanceof LockBusyError) {
335
+ this.refreshRecord();
336
+ throw new ApplicationUpdateConflictError('Another update is running. Retry shortly.');
337
+ }
338
+ if (cause instanceof Error && (cause.message === 'update lock ownership changed' || cause.name === 'AbortError')) {
339
+ this.lockLost = true;
340
+ this.listener?.();
341
+ throw new ApplicationUpdateConflictError('Another update owns this installation. Retry shortly.');
342
+ }
343
+ if (cause instanceof ApplicationUpdateConflictError)
344
+ throw cause;
345
+ if (!enteredLock) {
346
+ try {
347
+ assertCezarHomeWriteIsSandboxed(this.dir);
348
+ await mkdir(this.dir, { recursive: true, mode: 0o700 });
349
+ await withDirectoryLock(join(this.dir, 'operation.lock'), async (assertOwned) => {
350
+ this.refreshRecord();
351
+ if (this.record.state.status === 'ready' || this.record.state.status === 'restarting'
352
+ || this.record.state.status === 'preparing')
353
+ return;
354
+ await this.persist({ status: 'error', supported: true, targetVersion: target,
355
+ message: 'Preparation failed. Retry Update or update manually.' }, {}, assertOwned);
356
+ }, this.options.lockWaitMs);
357
+ }
358
+ catch (failure) {
359
+ if (failure instanceof LockBusyError)
360
+ throw new ApplicationUpdateConflictError('Another update is running. Retry shortly.');
361
+ if (failure instanceof Error && failure.message === 'update lock ownership changed') {
362
+ this.lockLost = true;
363
+ throw new ApplicationUpdateConflictError('Another update owns this installation. Retry shortly.');
364
+ }
365
+ throw new ApplicationUpdateFailureError('Update storage is not writable. Update manually.');
366
+ }
367
+ }
368
+ if (cause instanceof ApplicationUpdateFailureError)
369
+ throw cause;
370
+ throw new Error('Application update preparation failed. Retry Update.', { cause });
371
+ }
372
+ }
373
+ async restart() {
374
+ if (this.armingRestart)
375
+ throw new ApplicationUpdateConflictError('Restart is already being armed.');
376
+ if (this.options.dryRun) {
377
+ if (this.record.state.status !== 'ready')
378
+ throw new ApplicationUpdateConflictError('Prepare an update before restarting.');
379
+ await this.persist({ ...this.record.state, status: 'restarting' });
380
+ this.handoffArmed = true;
381
+ return this.record.state;
382
+ }
383
+ if (this.installation.kind === 'unsupported')
384
+ throw new ApplicationUpdateConflictError('Update this installation manually.');
385
+ const installation = this.installation;
386
+ this.refreshRecord();
387
+ if (this.record.state.status !== 'ready')
388
+ throw new ApplicationUpdateConflictError('Prepare an update before restarting.');
389
+ this.armingRestart = true;
390
+ try {
391
+ const plan = await withDirectoryLock(join(this.dir, 'operation.lock'), async (assertOwned) => {
392
+ this.refreshRecord();
393
+ if (this.record.state.status !== 'ready' || !this.record.stage || !this.record.recovery || !existsSync(this.record.stage)) {
394
+ throw new ApplicationUpdateConflictError('Prepare an update before restarting.');
395
+ }
396
+ const target = this.record.state.targetVersion;
397
+ const claimId = randomUUID();
398
+ const plan = { installation,
399
+ targetVersion: target, oldVersion: packageVersion(installation.packageRoot), stage: this.record.stage,
400
+ recovery: this.record.recovery, recoveryPackage: this.record.recoveryPackage,
401
+ binLinks: this.record.binLinks, recordPath: this.recordPath, claimId };
402
+ await this.persist({ status: 'restarting', supported: true, targetVersion: target }, { ownerPid: process.pid, claimId, startedAt: Date.now() });
403
+ await assertOwned();
404
+ return plan;
405
+ });
406
+ try {
407
+ if (!this.options.armRestart)
408
+ throw new ApplicationUpdateFailureError('Restart helper is unavailable. Retry Restart.');
409
+ await this.options.armRestart(plan);
410
+ const acknowledged = this.snapshot();
411
+ if (this.record.claimId !== plan.claimId || acknowledged.status !== 'restarting') {
412
+ throw new ApplicationUpdateConflictError('Restart claim changed before acknowledgement.');
413
+ }
414
+ this.handoffArmed = true;
415
+ return this.record.state;
416
+ }
417
+ catch (error) {
418
+ await withDirectoryLock(join(this.dir, 'operation.lock'), async (assertOwned) => {
419
+ this.refreshRecord();
420
+ if (this.record.claimId === plan.claimId && this.record.state.status === 'restarting') {
421
+ await assertOwned();
422
+ await this.persist({ status: 'ready', supported: true, targetVersion: plan.targetVersion }, { ownerPid: undefined, claimId: undefined, startedAt: undefined });
423
+ }
424
+ });
425
+ throw error;
426
+ }
427
+ }
428
+ catch (error) {
429
+ if (error instanceof LockBusyError)
430
+ throw new ApplicationUpdateConflictError('Another update is running. Retry shortly.');
431
+ throw error;
432
+ }
433
+ finally {
434
+ this.armingRestart = false;
435
+ }
436
+ }
437
+ afterResponse() {
438
+ if (!this.handoffArmed)
439
+ return;
440
+ this.handoffArmed = false;
441
+ if (this.options.dryRun) {
442
+ this.record.state = { status: 'idle', supported: true };
443
+ assertCezarHomeWriteIsSandboxed(this.recordPath);
444
+ writeFileSync(this.recordPath, JSON.stringify(this.record), { mode: 0o600 });
445
+ this.options.onChange?.();
446
+ this.listener?.();
447
+ return;
448
+ }
449
+ this.options.handoff?.();
450
+ }
451
+ async runNpm(args, signal) {
452
+ const env = { ...process.env, npm_config_cache: this.installation.kind === 'unsupported' ? '' : this.installation.cache };
453
+ await runOwnedNpm(this.options.npmBin ?? 'npm', args, env, signal);
454
+ }
455
+ }
456
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/application-update/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runArtifactCommand(argv: string[], env: NodeJS.ProcessEnv): Promise<number>;
@@ -0,0 +1,32 @@
1
+ import { publishArtifact } from './store.js';
2
+ const HELP = `Usage: cez artifact publish <path>
3
+ Publish an immutable local file snapshot from an active task. Returns JSON
4
+ with metadata, a task-relative preview link, and escaped Markdown.
5
+
6
+ Limits: 10 MiB per file; 64 publications and 64 MiB per task. No old
7
+ snapshots are evicted. Requires CEZ_ARTIFACTS_DIR and CEZ_TASK_ID supplied
8
+ by the task runner. Never publish credentials or unrelated private files.
9
+
10
+ -h, --help Show this help without task context.`;
11
+ export async function runArtifactCommand(argv, env) {
12
+ if (argv.includes('--help') || argv.includes('-h')) {
13
+ console.log(HELP);
14
+ return 0;
15
+ }
16
+ try {
17
+ if (!env.CEZ_ARTIFACTS_DIR || !env.CEZ_TASK_ID)
18
+ throw new Error('Artifact task context is missing. Run this command inside an active Cezar task with CEZ_ARTIFACTS_DIR and CEZ_TASK_ID.');
19
+ if (argv.length !== 2 || argv[0] !== 'publish')
20
+ throw new Error(HELP);
21
+ const metadata = await publishArtifact(env.CEZ_ARTIFACTS_DIR, env.CEZ_TASK_ID, argv[1]);
22
+ const link = `/tasks/${metadata.runId}/files?artifact=${metadata.id}`;
23
+ const label = metadata.name.replace(/[\r\n\u0000-\u001f\u007f]/g, ' ').replace(/[\\`*_{}\[\]()#+.!|<>~\-]/g, '\\$&');
24
+ console.log(JSON.stringify({ ...metadata, link, markdown: `[${label}](${link})` }));
25
+ return 0;
26
+ }
27
+ catch (error) {
28
+ console.error(JSON.stringify({ error: error instanceof Error ? error.message : 'Artifact publication failed' }));
29
+ return 1;
30
+ }
31
+ }
32
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/artifacts/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,IAAI,GAAG;;;;;;;;kDAQqC,CAAC;AACnD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAc,EAAE,GAAsB;IAC7E,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACpF,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,GAAG,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,wHAAwH,CAAC,CAAC;QAC1L,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,CAAC;QACzF,MAAM,IAAI,GAAG,UAAU,QAAQ,CAAC,KAAK,mBAAmB,QAAQ,CAAC,EAAE,EAAE,CAAC;QACtE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACrH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC;QACjH,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Generated run-owned location; never let inherited parent session paths leak into a child. */
2
+ export declare function provisionArtifactDirectory(dataDir: string, runId: string): string;
3
+ export declare function removeArtifacts(dataDir: string, runId: string): void;
4
+ export declare function artifactInstructions(directory: string | undefined): string;
@@ -0,0 +1,42 @@
1
+ import { mkdirSync, realpathSync, rmSync, statSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { artifactDirectory } from './store.js';
4
+ import { fileURLToPath } from 'node:url';
5
+ /** Generated run-owned location; never let inherited parent session paths leak into a child. */
6
+ export function provisionArtifactDirectory(dataDir, runId) {
7
+ try {
8
+ const directory = artifactDirectory(dataDir, runId);
9
+ const parent = dirname(directory);
10
+ if (realpathSync(parent) !== parent)
11
+ return '';
12
+ try {
13
+ mkdirSync(directory, { mode: 0o700 });
14
+ }
15
+ catch (error) {
16
+ if (error.code !== 'EEXIST')
17
+ return '';
18
+ }
19
+ return realpathSync(directory) === directory && statSync(directory).isDirectory() ? directory : '';
20
+ }
21
+ catch {
22
+ return '';
23
+ }
24
+ }
25
+ export function removeArtifacts(dataDir, runId) {
26
+ const directory = artifactDirectory(dataDir, runId);
27
+ const parent = dirname(directory);
28
+ if (realpathSync(parent) !== parent)
29
+ throw Error('Artifact storage redirected');
30
+ // rm removes a final symlink itself, never the directory it points at.
31
+ rmSync(directory, { recursive: true, force: true });
32
+ }
33
+ const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
34
+ export function artifactInstructions(directory) {
35
+ if (!directory)
36
+ return '## Task artifacts\nArtifact storage is unavailable for this task. Do not claim that host files can be downloaded from the cockpit.';
37
+ const source = import.meta.url.endsWith('.ts');
38
+ const entry = fileURLToPath(new URL(source ? '../index.ts' : '../index.js', import.meta.url));
39
+ const command = [process.execPath, ...(source ? ['--import', import.meta.resolve('tsx')] : []), entry].map(quote).join(' ') + ' artifact publish';
40
+ return `## Task artifacts\nTo let the user review a file outside the project, explicitly publish a snapshot with ${command} '<path>'. The command uses CEZ_ARTIFACTS_DIR and CEZ_TASK_ID from this session and returns JSON with a Markdown link. Include that returned link in your response. Project files can be linked by path and open inside the cockpit. Publish only intended deliverables, never credentials or unrelated private files. Limits: 10 MiB per file, 64 publications and 64 MiB per task. Snapshots survive worktree cleanup until task history is deleted. Publication is explicit, not automatic; files are not shared just because you mention their path.`;
41
+ }
42
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/artifacts/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,gGAAgG;AAChG,MAAM,UAAU,0BAA0B,CAAC,OAAe,EAAE,KAAa;IACvE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,MAAM;YAAE,OAAO,EAAE,CAAC;QAC/C,IAAI,CAAC;YAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAC5D,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,YAAY,CAAC,SAAS,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAa;IAC5D,MAAM,SAAS,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,MAAM;QAAE,MAAM,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChF,uEAAuE;IACvE,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AACvE,MAAM,UAAU,oBAAoB,CAAC,SAA6B;IAChE,IAAI,CAAC,SAAS;QAAE,OAAO,oIAAoI,CAAC;IAC5J,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC;IAClJ,OAAO,4GAA4G,OAAO,0hBAA0hB,CAAC;AACvpB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { FileLinkResult, FilePreviewData, PublishedArtifact } from '../contract/index.js';
2
+ export declare function rasterMime(path: string): string | null;
3
+ export declare function artifactPreview(artifact: PublishedArtifact, bytes: Buffer): FilePreviewData;
4
+ type Context = {
5
+ dataDir: string;
6
+ runId: string;
7
+ workingDirectory?: string;
8
+ projectRoot: string;
9
+ path: string;
10
+ };
11
+ type Loaded = {
12
+ preview: FileLinkResult;
13
+ imageBytes?: Buffer;
14
+ };
15
+ /** No outside source is opened or even stat'ed: it can only match a published snapshot. */
16
+ export declare function loadFileLink(ctx: Context): Promise<Loaded>;
17
+ export declare function resolveFileLink(ctx: Context): Promise<FileLinkResult>;
18
+ export {};