@timurproko/a1 0.2.7-dev.820 → 0.2.7-dev.828
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.
- package/README.md +7 -1
- package/bin/automatic-update.js +7 -0
- package/bin/tab-launch-context.d.ts +1 -0
- package/bin/tab-launch-context.js +3 -3
- package/bin/ui.js +96 -66
- package/dist/app/session-shell/session-shell-root.d.ts +13 -6
- package/dist/app/session-shell/session-shell-root.js +9 -5
- package/dist/app/session-shell/session-shell.js +68 -18
- package/dist/app/session-shell/shell-host.js +6 -3
- package/dist/app/session-shell/transcript-document.js +1 -1
- package/dist/cli/tabs.d.ts +1 -1
- package/dist/cli/tabs.js +10 -14
- package/dist/composition/owned-settings.d.ts +12 -0
- package/dist/composition/owned-settings.js +36 -0
- package/dist/composition/owned-ui.d.ts +5 -14
- package/dist/composition/owned-ui.js +93 -63
- package/dist/composition/resident-tab-bridge.d.ts +10 -1
- package/dist/composition/resident-tab-bridge.js +21 -0
- package/dist/composition/settings-route-host.d.ts +12 -2
- package/dist/composition/settings-route-host.js +27 -9
- package/dist/composition/settings-search-input.d.ts +9 -0
- package/dist/composition/settings-search-input.js +58 -0
- package/dist/composition/utility-tab.d.ts +28 -0
- package/dist/composition/utility-tab.js +242 -0
- package/dist/contracts/owned-ui/session-backend.d.ts +2 -0
- package/dist/contracts/owned-ui/session-workflows.d.ts +7 -3
- package/dist/contracts/presentation/index.d.ts +11 -0
- package/dist/contracts/presentation/index.js +12 -0
- package/dist/features/launch/development-launch.js +6 -0
- package/dist/features/launch/profile-paths.js +4 -0
- package/dist/features/owned-ui/plus-menu-dialog.d.ts +22 -0
- package/dist/features/owned-ui/plus-menu-dialog.js +76 -0
- package/dist/features/owned-ui/project-trust-dialog.d.ts +1 -1
- package/dist/features/owned-ui/project-trust-dialog.js +6 -8
- package/dist/features/owned-ui/project-trust-prompt.d.ts +1 -0
- package/dist/features/owned-ui/project-trust-prompt.js +7 -3
- package/dist/features/owned-ui/reference-screen-app.d.ts +2 -0
- package/dist/features/owned-ui/reference-screen-app.js +12 -2
- package/dist/features/owned-ui/settings-app.d.ts +10 -3
- package/dist/features/owned-ui/settings-app.js +98 -45
- package/dist/features/owned-ui/settings-search-input.d.ts +29 -0
- package/dist/features/owned-ui/settings-search-input.js +1 -0
- package/dist/features/prompt-history/index.d.ts +1 -1
- package/dist/features/prompt-history/paths.d.ts +2 -1
- package/dist/features/prompt-history/paths.js +10 -2
- package/dist/features/prompt-history/service.d.ts +5 -0
- package/dist/features/prompt-history/service.js +1 -1
- package/dist/features/resident-tab/shortcut-declarations.d.ts +1 -1
- package/dist/features/resident-tab/shortcut-declarations.js +2 -0
- package/dist/foundation/launch-context/index.d.ts +2 -0
- package/dist/foundation/launch-context/index.js +1 -0
- package/dist/foundation/lifecycle/session-repository-context.js +16 -2
- package/dist/foundation/release/automatic-update.d.ts +37 -0
- package/dist/foundation/release/automatic-update.js +265 -0
- package/dist/foundation/release/bootstrap.d.ts +1 -9
- package/dist/foundation/release/bootstrap.js +7 -3
- package/dist/foundation/release/early-accent.d.ts +12 -0
- package/dist/foundation/release/early-accent.js +59 -0
- package/dist/foundation/release/index.d.ts +1 -1
- package/dist/foundation/release/index.js +1 -1
- package/dist/foundation/release/latest-release.d.ts +3 -2
- package/dist/foundation/release/latest-release.js +1 -1
- package/dist/foundation/release/progress-palette.generated.d.ts +137 -3
- package/dist/foundation/release/progress-palette.generated.js +137 -3
- package/dist/foundation/release/release-gc.js +19 -4
- package/dist/foundation/release/update-execution-lease.d.ts +36 -0
- package/dist/foundation/release/update-execution-lease.js +145 -0
- package/dist/foundation/release/update.d.ts +9 -7
- package/dist/foundation/release/update.js +244 -175
- package/dist/foundation/resident-tabs/bridge-client.d.ts +9 -2
- package/dist/foundation/resident-tabs/bridge-client.js +19 -7
- package/dist/foundation/resident-tabs/maintenance.d.ts +2 -6
- package/dist/foundation/resident-tabs/maintenance.js +5 -23
- package/dist/foundation/resident-tabs/progress-observation-schema.d.ts +34 -0
- package/dist/foundation/resident-tabs/progress-observation-schema.js +1 -0
- package/dist/foundation/resident-tabs/progress-observation.d.ts +3 -6
- package/dist/foundation/resident-tabs/progress-observation.js +43 -12
- package/dist/foundation/resident-tabs/release-holds.js +3 -14
- package/dist/foundation/resident-tabs/routes.d.ts +5 -0
- package/dist/foundation/resident-tabs/routes.js +5 -0
- package/dist/integrations/pi/components/editor-interaction.d.ts +2 -0
- package/dist/integrations/pi/components/modal-frame.d.ts +17 -1
- package/dist/integrations/pi/components/modal-frame.js +48 -9
- package/dist/integrations/pi/components/models-dialog.js +4 -52
- package/dist/integrations/pi/components/owned-editor-ux.d.ts +3 -0
- package/dist/integrations/pi/components/owned-editor-ux.js +75 -4
- package/dist/integrations/pi/components/shell-editor-autocomplete.js +57 -37
- package/dist/integrations/pi/components/shell-footer-status.js +19 -3
- package/dist/integrations/pi/components/shell-presenters-transcript.js +4 -1
- package/dist/integrations/pi/components/shell-selectors-dialogs.js +4 -1
- package/dist/integrations/pi/components/shell-shared-facade.d.ts +9 -2
- package/dist/integrations/pi/components/skills-dialog.js +2 -2
- package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +7 -5
- package/dist/integrations/pi/components/upstream/components/owned-editor.js +15 -8
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +3 -3
- package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +2 -2
- package/dist/integrations/pi/components/upstream/components/session-footer.js +26 -23
- package/dist/integrations/pi/components/upstream/components/session-selector.js +7 -6
- package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +7 -6
- package/dist/integrations/pi/components/upstream/components/thinking-selector.js +9 -8
- package/dist/integrations/pi/components/upstream/components/tool-execution.js +6 -4
- package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +8 -8
- package/dist/integrations/pi/components/upstream/components/tree-selector.js +10 -10
- package/dist/integrations/pi/components/upstream/history/editor-core.js +2 -0
- package/dist/integrations/pi/components/upstream/theme/theme.d.ts +2 -0
- package/dist/integrations/pi/components/upstream/theme/theme.js +5 -1
- package/dist/integrations/pi/engine/adapter.js +7 -2
- package/dist/integrations/pi/engine/offline-settings-port.d.ts +23 -0
- package/dist/integrations/pi/engine/offline-settings-port.js +53 -0
- package/dist/integrations/pi/engine/ports.d.ts +1 -1
- package/dist/integrations/pi/engine/ports.js +4 -0
- package/dist/integrations/pi/engine/settings-bridge.d.ts +5 -0
- package/dist/integrations/pi/engine/settings-bridge.js +13 -0
- package/dist/integrations/pi/engine/settings-port.js +1 -14
- package/dist/integrations/pi/engine/workflow-runner.js +9 -2
- package/dist/native/darwin-arm64/manifest.json +1 -1
- package/dist/native/darwin-arm64/terminal-host.manifest.json +3 -3
- package/dist/native/darwin-arm64/terminal-host.node +0 -0
- package/dist/native/darwin-x64/manifest.json +1 -1
- package/dist/native/darwin-x64/terminal-host.manifest.json +3 -3
- package/dist/native/darwin-x64/terminal-host.node +0 -0
- package/dist/native/linux-x64/manifest.json +1 -1
- package/dist/native/linux-x64/terminal-host.manifest.json +3 -3
- package/dist/native/linux-x64/terminal-host.node +0 -0
- package/dist/native/win32-x64/manifest.json +2 -2
- package/dist/native/win32-x64/process-guardian.node +0 -0
- package/dist/native/win32-x64/terminal-host.manifest.json +3 -3
- package/dist/native/win32-x64/terminal-host.node +0 -0
- package/dist/product-identity.d.ts +1 -1
- package/dist/product-identity.js +2 -2
- package/dist/product-identity.json +2 -0
- package/dist/ui/apps/host.d.ts +2 -0
- package/dist/ui/apps/host.js +7 -1
- package/dist/ui/components/dialog-panel.js +35 -30
- package/dist/ui/components/line-input.d.ts +3 -0
- package/dist/ui/components/line-input.js +3 -1
- package/dist/ui/components/prompt-input.d.ts +3 -2
- package/dist/ui/components/prompt-input.js +6 -4
- package/dist/ui/components/spans.js +2 -2
- package/dist/ui/components/surface.js +4 -2
- package/dist/ui/components/text.d.ts +3 -6
- package/dist/ui/components/text.js +6 -8
- package/dist/ui/settings/declarations.d.ts +56 -10
- package/dist/ui/settings/declarations.js +38 -9
- package/dist/ui/settings/early-accent.d.ts +81 -0
- package/dist/ui/settings/early-accent.js +50 -0
- package/dist/ui/settings/manager.js +7 -3
- package/dist/ui/settings/migrations.js +15 -0
- package/dist/ui/settings/progress-palette.generated.d.ts +139 -0
- package/dist/ui/settings/progress-palette.generated.js +139 -0
- package/dist/ui/settings/sections.d.ts +4 -0
- package/dist/ui/settings/sections.js +9 -3
- package/docs/architecture/resident-tabs.md +48 -17
- package/docs/architecture/tool-image-presentation.md +2 -1
- package/docs/features/prompt-history.md +41 -20
- package/docs/validation.md +25 -5
- package/package.json +1 -1
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { mkdir, open, readFile, rename, rm } from "node:fs/promises";
|
|
4
|
+
import { dirname, resolve } from "node:path";
|
|
5
|
+
import { valid as validSemver } from "semver";
|
|
6
|
+
import { readLaunchContext } from "../launch-context/index.js";
|
|
7
|
+
import { resolveProductPaths } from "../lifecycle/index.js";
|
|
8
|
+
import { CohortStateStore } from "./cohort-state.js";
|
|
9
|
+
import { processIsAlive } from "./process-cleanup.js";
|
|
10
|
+
import { isNewerRelease, releaseChannelOf } from "./latest-release.js";
|
|
11
|
+
import { readCertifiedReleaseManifest, resolveReleaseEntryPoint } from "./release-store.js";
|
|
12
|
+
import { readUpdateExecutionOwner } from "./update-execution-lease.js";
|
|
13
|
+
import { runSelfUpdate, UPDATE_ALREADY_RUNNING_EXIT_CODE } from "./update.js";
|
|
14
|
+
export const AUTOMATIC_UPDATE_STATE_SCHEMA = 1;
|
|
15
|
+
export const AUTOMATIC_UPDATE_RETRY_MS = 24 * 60 * 60_000;
|
|
16
|
+
const AUTOMATIC_UPDATE_STATE_FILENAME = "automatic-update.json";
|
|
17
|
+
const MAX_STATE_BYTES = 16_384;
|
|
18
|
+
const OBSERVER_POLL_MS = 250;
|
|
19
|
+
const WORKER_START_GRACE_MS = 5_000;
|
|
20
|
+
export class AutomaticUpdateStateStore {
|
|
21
|
+
path;
|
|
22
|
+
constructor(dataDir) { this.path = resolve(dataDir, AUTOMATIC_UPDATE_STATE_FILENAME); }
|
|
23
|
+
async read() {
|
|
24
|
+
let source;
|
|
25
|
+
try {
|
|
26
|
+
source = await readFile(this.path, "utf8");
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (hasCode(error, "ENOENT"))
|
|
30
|
+
return null;
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
if (Buffer.byteLength(source, "utf8") > MAX_STATE_BYTES)
|
|
34
|
+
throw new Error("automatic update state is oversized");
|
|
35
|
+
const value = JSON.parse(source);
|
|
36
|
+
validateState(value);
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
async write(value) {
|
|
40
|
+
validateState(value);
|
|
41
|
+
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
42
|
+
const temporary = `${this.path}.${process.pid}.${randomUUID()}.tmp`;
|
|
43
|
+
const file = await open(temporary, "wx", 0o600);
|
|
44
|
+
try {
|
|
45
|
+
await file.writeFile(`${JSON.stringify(value)}\n`);
|
|
46
|
+
await file.sync();
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await file.close();
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await rename(temporary, this.path);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
await rm(temporary, { force: true });
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Start or observe one silent update and resolve with the active newer version once restart is useful. */
|
|
61
|
+
export async function requestAutomaticUpdate(options) {
|
|
62
|
+
if (options.signal?.aborted)
|
|
63
|
+
return null;
|
|
64
|
+
const environment = options.environment ?? process.env;
|
|
65
|
+
const paths = resolveProductPaths(environment);
|
|
66
|
+
const now = options.now ?? Date.now;
|
|
67
|
+
const store = new AutomaticUpdateStateStore(paths.dataDir);
|
|
68
|
+
let existing;
|
|
69
|
+
try {
|
|
70
|
+
existing = await store.read();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const readActiveVersion = options.activeVersion ?? (async () => await activeNewerVersion(paths.dataDir, options.runningVersion));
|
|
76
|
+
const active = await readActiveVersion();
|
|
77
|
+
if (active !== null)
|
|
78
|
+
return active;
|
|
79
|
+
if (existing?.status === "failed" && existing.channel === options.release.channel && now() - existing.attemptedAt >= 0
|
|
80
|
+
&& now() - existing.attemptedAt < AUTOMATIC_UPDATE_RETRY_MS
|
|
81
|
+
&& !isNewerRelease(options.release.version, existing.targetVersion))
|
|
82
|
+
return null;
|
|
83
|
+
let worker = options.worker;
|
|
84
|
+
if (worker === undefined) {
|
|
85
|
+
const launch = readLaunchContext(environment, "release");
|
|
86
|
+
const cohort = await new CohortStateStore(paths.dataDir).read();
|
|
87
|
+
const record = launch.releaseId === undefined ? undefined : cohort.releases[launch.releaseId];
|
|
88
|
+
if (!record || record.approval !== "approved" || record.releaseRoot !== launch.releaseRoot
|
|
89
|
+
|| record.contentDigest !== launch.releaseDigest)
|
|
90
|
+
return null;
|
|
91
|
+
const selected = await readCertifiedReleaseManifest(record, resolve(paths.dataDir, "releases"));
|
|
92
|
+
worker = {
|
|
93
|
+
entry: await resolveReleaseEntryPoint(selected, "bin/automatic-update.js"),
|
|
94
|
+
packageRoot: selected.packageRoot,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const arguments_ = [
|
|
98
|
+
"--package-root", worker.packageRoot,
|
|
99
|
+
"--channel", options.release.channel,
|
|
100
|
+
"--target-version", options.release.version,
|
|
101
|
+
"--data-dir", paths.dataDir,
|
|
102
|
+
];
|
|
103
|
+
let owner;
|
|
104
|
+
try {
|
|
105
|
+
owner = await readUpdateExecutionOwner(paths.dataDir);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if (owner === null || !processIsAlive(owner.pid)) {
|
|
111
|
+
await (options.spawnWorker ?? spawnAutomaticUpdateWorker)(worker.entry, arguments_, environment).catch(() => undefined);
|
|
112
|
+
}
|
|
113
|
+
const startedAt = now();
|
|
114
|
+
const sleep = options.sleep ?? (async (durationMs) => await new Promise(resolvePromise => {
|
|
115
|
+
const timer = setTimeout(resolvePromise, durationMs);
|
|
116
|
+
timer.unref?.();
|
|
117
|
+
}));
|
|
118
|
+
while (!options.signal?.aborted) {
|
|
119
|
+
const installed = await readActiveVersion();
|
|
120
|
+
if (installed !== null)
|
|
121
|
+
return installed;
|
|
122
|
+
const state = await store.read().catch(() => null);
|
|
123
|
+
if (state?.targetVersion === options.release.version && state.status === "failed" && state.attemptedAt >= startedAt)
|
|
124
|
+
return null;
|
|
125
|
+
const owner = await readUpdateExecutionOwner(paths.dataDir).catch(() => null);
|
|
126
|
+
if ((owner === null || !processIsAlive(owner.pid)) && now() - startedAt >= WORKER_START_GRACE_MS)
|
|
127
|
+
return null;
|
|
128
|
+
await sleep(OBSERVER_POLL_MS);
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
export async function runAutomaticUpdateWorker(argv, environment = process.env) {
|
|
133
|
+
const parsed = parseWorkerArguments(argv);
|
|
134
|
+
const paths = resolveProductPaths(environment);
|
|
135
|
+
if (!samePath(parsed.dataDir, paths.dataDir))
|
|
136
|
+
return 1;
|
|
137
|
+
const launch = readLaunchContext(environment, "release");
|
|
138
|
+
const cohort = await new CohortStateStore(paths.dataDir).read();
|
|
139
|
+
const record = launch.releaseId === undefined ? undefined : cohort.releases[launch.releaseId];
|
|
140
|
+
if (!record || record.approval !== "approved" || !samePath(record.releaseRoot, launch.releaseRoot ?? "")
|
|
141
|
+
|| record.contentDigest !== launch.releaseDigest)
|
|
142
|
+
return 1;
|
|
143
|
+
const selected = await readCertifiedReleaseManifest(record, resolve(paths.dataDir, "releases"));
|
|
144
|
+
if (!samePath(selected.packageRoot, parsed.packageRoot))
|
|
145
|
+
return 1;
|
|
146
|
+
const store = new AutomaticUpdateStateStore(paths.dataDir);
|
|
147
|
+
const attemptedAt = Date.now();
|
|
148
|
+
const output = { stdout() { }, stderr() { } };
|
|
149
|
+
let acquired = false;
|
|
150
|
+
let runningWrite = Promise.resolve();
|
|
151
|
+
try {
|
|
152
|
+
const code = await runSelfUpdate({
|
|
153
|
+
packageRoot: parsed.packageRoot,
|
|
154
|
+
channel: parsed.channel === "stable" ? "stable" : "next",
|
|
155
|
+
resolvedTarget: parsed.targetVersion,
|
|
156
|
+
mode: "automatic",
|
|
157
|
+
environment,
|
|
158
|
+
output,
|
|
159
|
+
progress: false,
|
|
160
|
+
onLeaseAcquired: () => {
|
|
161
|
+
acquired = true;
|
|
162
|
+
runningWrite = store.write(state(parsed, "running", attemptedAt, null, null));
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
if (code === UPDATE_ALREADY_RUNNING_EXIT_CODE)
|
|
166
|
+
return 0;
|
|
167
|
+
if (code !== 0) {
|
|
168
|
+
await runningWrite;
|
|
169
|
+
await store.write(state(parsed, "failed", attemptedAt, null, `exit-${code}`));
|
|
170
|
+
return code;
|
|
171
|
+
}
|
|
172
|
+
const active = await activeRelease(paths.dataDir);
|
|
173
|
+
if (active === null || releaseChannelOf(active.packageVersion) !== parsed.channel
|
|
174
|
+
|| (active.packageVersion !== parsed.targetVersion && !isNewerRelease(active.packageVersion, parsed.targetVersion))) {
|
|
175
|
+
if (acquired) {
|
|
176
|
+
await runningWrite;
|
|
177
|
+
await store.write(state(parsed, "failed", attemptedAt, null, "target-not-active"));
|
|
178
|
+
}
|
|
179
|
+
return 1;
|
|
180
|
+
}
|
|
181
|
+
await runningWrite;
|
|
182
|
+
await store.write(state(parsed, "installed", attemptedAt, active.packageVersion, null));
|
|
183
|
+
return 0;
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
await runningWrite.catch(() => undefined);
|
|
187
|
+
await store.write(state(parsed, "failed", attemptedAt, null, errorMessage(error).slice(0, 512))).catch(() => undefined);
|
|
188
|
+
return 1;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async function spawnAutomaticUpdateWorker(entry, arguments_, environment) {
|
|
192
|
+
const child = spawn(process.execPath, [entry, ...arguments_], {
|
|
193
|
+
detached: true,
|
|
194
|
+
env: environment,
|
|
195
|
+
stdio: "ignore",
|
|
196
|
+
windowsHide: true,
|
|
197
|
+
});
|
|
198
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
199
|
+
child.once("spawn", resolvePromise);
|
|
200
|
+
child.once("error", rejectPromise);
|
|
201
|
+
});
|
|
202
|
+
child.unref();
|
|
203
|
+
}
|
|
204
|
+
async function activeNewerVersion(dataDir, runningVersion) {
|
|
205
|
+
const active = await activeRelease(dataDir);
|
|
206
|
+
return active !== null && isNewerRelease(active.packageVersion, runningVersion) ? active.packageVersion : null;
|
|
207
|
+
}
|
|
208
|
+
async function activeRelease(dataDir) {
|
|
209
|
+
const cohort = await new CohortStateStore(dataDir).read();
|
|
210
|
+
const activeId = cohort.references.active;
|
|
211
|
+
if (activeId === null)
|
|
212
|
+
return null;
|
|
213
|
+
const active = cohort.releases[activeId];
|
|
214
|
+
return active?.approval === "approved" ? active : null;
|
|
215
|
+
}
|
|
216
|
+
function state(parsed, status, attemptedAt, installedVersion, failure) {
|
|
217
|
+
return {
|
|
218
|
+
schema: AUTOMATIC_UPDATE_STATE_SCHEMA,
|
|
219
|
+
channel: parsed.channel,
|
|
220
|
+
targetVersion: parsed.targetVersion,
|
|
221
|
+
status,
|
|
222
|
+
attemptedAt,
|
|
223
|
+
updatedAt: Date.now(),
|
|
224
|
+
installedVersion,
|
|
225
|
+
failure,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function parseWorkerArguments(argv) {
|
|
229
|
+
const values = new Map();
|
|
230
|
+
for (let index = 0; index < argv.length; index += 2) {
|
|
231
|
+
const key = argv[index];
|
|
232
|
+
const value = argv[index + 1];
|
|
233
|
+
if (!key?.startsWith("--") || value === undefined || values.has(key))
|
|
234
|
+
throw new Error("invalid automatic update worker arguments");
|
|
235
|
+
values.set(key, value);
|
|
236
|
+
}
|
|
237
|
+
const packageRoot = values.get("--package-root");
|
|
238
|
+
const channel = values.get("--channel");
|
|
239
|
+
const targetVersion = values.get("--target-version");
|
|
240
|
+
const dataDir = values.get("--data-dir");
|
|
241
|
+
if (!packageRoot || (channel !== "stable" && channel !== "development") || !targetVersion || !dataDir
|
|
242
|
+
|| validSemver(targetVersion) === null)
|
|
243
|
+
throw new Error("incomplete automatic update worker arguments");
|
|
244
|
+
return { packageRoot, channel, targetVersion, dataDir };
|
|
245
|
+
}
|
|
246
|
+
function validateState(value) {
|
|
247
|
+
if (value.schema !== AUTOMATIC_UPDATE_STATE_SCHEMA || (value.channel !== "stable" && value.channel !== "development")
|
|
248
|
+
|| validSemver(value.targetVersion) === null || !["running", "installed", "failed"].includes(value.status)
|
|
249
|
+
|| !Number.isFinite(value.attemptedAt) || !Number.isFinite(value.updatedAt)
|
|
250
|
+
|| (value.installedVersion !== null && validSemver(value.installedVersion) === null)
|
|
251
|
+
|| (value.failure !== null && (typeof value.failure !== "string" || value.failure.length > 512))) {
|
|
252
|
+
throw new Error("invalid automatic update state");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function samePath(left, right) {
|
|
256
|
+
const canonicalLeft = resolve(left);
|
|
257
|
+
const canonicalRight = resolve(right);
|
|
258
|
+
return process.platform === "win32"
|
|
259
|
+
? canonicalLeft.toLowerCase() === canonicalRight.toLowerCase()
|
|
260
|
+
: canonicalLeft === canonicalRight;
|
|
261
|
+
}
|
|
262
|
+
function hasCode(error, code) {
|
|
263
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
264
|
+
}
|
|
265
|
+
function errorMessage(error) { return error instanceof Error ? error.message : String(error); }
|
|
@@ -13,15 +13,7 @@ export interface BootstrapOptions {
|
|
|
13
13
|
};
|
|
14
14
|
readonly environment?: NodeJS.ProcessEnv;
|
|
15
15
|
readonly output?: Pick<NodeJS.WriteStream, "write">;
|
|
16
|
-
/**
|
|
17
|
-
* Whether a materialized release copy is fit to launch. The active release
|
|
18
|
-
* is normally reused while its version matches the installation, but a copy
|
|
19
|
-
* can be broken in ways a version cannot see — materialized from a tree a
|
|
20
|
-
* blocked postinstall never finished repairing. The probe is injected from
|
|
21
|
-
* the bin entry because deciding it requires inspecting dependency
|
|
22
|
-
* resolution, which stays out of production code. Absent means every
|
|
23
|
-
* release is fit.
|
|
24
|
-
*/
|
|
16
|
+
/** Optional package-resolution probe that excludes a damaged retained release. */
|
|
25
17
|
readonly releaseIsLaunchable?: (releaseRoot: string) => boolean;
|
|
26
18
|
/** Test seam for bounded maintenance scheduled after stale endpoint sweeping. */
|
|
27
19
|
readonly scheduleMaintenance?: (dataDir: string, paths: ReturnType<typeof resolveProductPaths>) => Promise<void>;
|
|
@@ -5,6 +5,7 @@ import { connect } from "node:net";
|
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
6
|
import { selectCohortLaunch } from "./cohort-selection.js";
|
|
7
7
|
import { selectOrdinaryLaunchReleaseId } from "./ordinary-launch-selection.js";
|
|
8
|
+
import { releaseChannelOf } from "./latest-release.js";
|
|
8
9
|
import { CohortStateStore } from "./cohort-state.js";
|
|
9
10
|
import { assertLaunchProfileId, createSupervisorStartupAttempt, readSupervisorStartupResult, resolveCohortEndpoint, resolveProductPaths, sessionSelectionArguments } from "../lifecycle/index.js";
|
|
10
11
|
import { encodeFrame, LineFrameDecoder } from "../protocol/index.js";
|
|
@@ -17,7 +18,7 @@ import { scheduleReleaseCleanup } from "./release-gc.js";
|
|
|
17
18
|
import { createRestartSeal, readRestartCertifiedRelease, releaseCertificationDocument } from "./restart-certification.js";
|
|
18
19
|
import { PRODUCT_IDENTITY, PRODUCT_TEXT } from "../../product-identity.js";
|
|
19
20
|
import { markStartupPhase } from "../startup/index.js";
|
|
20
|
-
import { isCurrentLaunchContract, launchContractTarget, readLaunchContext, withLaunchContext } from "../launch-context/index.js";
|
|
21
|
+
import { PRIVATE_ENVIRONMENT, isCurrentLaunchContract, launchContractTarget, readLaunchContext, withLaunchContext } from "../launch-context/index.js";
|
|
21
22
|
import { ensureTerminalHost, readResidentTabLaunchSettings, selectResidentHost } from "../resident-tabs/index.js";
|
|
22
23
|
const RELEASE_RESELECTION_MESSAGE = "a1-release-reselection";
|
|
23
24
|
export async function runBootstrap(options) {
|
|
@@ -124,6 +125,8 @@ async function runBootstrapAttempt(options, retriesRemaining) {
|
|
|
124
125
|
}
|
|
125
126
|
let probe = endpoint ? await probeOwnership(endpoint) : "dead";
|
|
126
127
|
const installedVersion = await readInstalledVersion(options.packageRoot);
|
|
128
|
+
if (releaseChannelOf(installedVersion) !== null)
|
|
129
|
+
environment[PRIVATE_ENVIRONMENT.updateVersion] = installedVersion;
|
|
127
130
|
const activeId = state.references.active;
|
|
128
131
|
const active = activeId === null ? undefined : state.releases[activeId];
|
|
129
132
|
let activeIsLaunchable = active === undefined || (options.releaseIsLaunchable?.(active.releaseRoot) ?? true);
|
|
@@ -434,14 +437,15 @@ async function launchUi(release, environment, sessionArgs, residentContext = {})
|
|
|
434
437
|
* version instead of failing while an installation is being replaced.
|
|
435
438
|
*/
|
|
436
439
|
export function releaseEnvironment(environment, release, profile) {
|
|
437
|
-
const
|
|
440
|
+
const context = readLaunchContext(environment);
|
|
438
441
|
return withLaunchContext(environment, {
|
|
439
442
|
releaseId: release.releaseId,
|
|
440
443
|
releaseLayers: (release.dependencyLayers ?? []).map(layer => layer.layerId).join(","),
|
|
441
444
|
releaseRoot: release.releaseRoot,
|
|
442
445
|
releaseDigest: release.contentDigest,
|
|
443
446
|
...(profile === undefined ? {} : { launchProfile: profile }),
|
|
444
|
-
...(launchMode === undefined ? {} : { launchMode }),
|
|
447
|
+
...(context.launchMode === undefined ? {} : { launchMode: context.launchMode }),
|
|
448
|
+
...(context.updateVersion === undefined ? {} : { updateVersion: context.updateVersion }),
|
|
445
449
|
}, process.platform, launchContractTarget(release));
|
|
446
450
|
}
|
|
447
451
|
export async function waitForVerifiedEndpoint(path, release, timeoutMs, startup) {
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type UiAccentColor = "blue" | "purple" | "cyan" | "green" | "orange" | "pink";
|
|
2
|
+
export type EarlyAccentAppearance = "dark" | "light";
|
|
3
|
+
export type EarlyAccentMode = "truecolor" | "256color";
|
|
4
|
+
/** Read only global profile data, never project settings or the interactive resource pipeline. */
|
|
5
|
+
export declare function resolveEarlyAccentColor(environment?: NodeJS.ProcessEnv, home?: () => string): UiAccentColor;
|
|
6
|
+
export declare function earlyAccentPalette(color: UiAccentColor, appearance?: EarlyAccentAppearance, mode?: EarlyAccentMode): {
|
|
7
|
+
readonly accent: string;
|
|
8
|
+
readonly border: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function earlyTerminalAppearance(environment?: NodeJS.ProcessEnv): EarlyAccentAppearance;
|
|
11
|
+
export declare function earlyTerminalColorMode(environment?: NodeJS.ProcessEnv): EarlyAccentMode;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { isAbsolute, join } from "node:path";
|
|
4
|
+
import { PRODUCT_IDENTITY } from "../../product-identity.js";
|
|
5
|
+
import { SHARED_PROGRESS_PALETTE } from "./progress-palette.generated.js";
|
|
6
|
+
const MAX_SETTINGS_BYTES = 256 * 1024;
|
|
7
|
+
/** Read only global profile data, never project settings or the interactive resource pipeline. */
|
|
8
|
+
export function resolveEarlyAccentColor(environment = process.env, home = homedir) {
|
|
9
|
+
try {
|
|
10
|
+
const selectedHome = environment[PRODUCT_IDENTITY.environment.profileHome] ?? home();
|
|
11
|
+
if (!isAbsolute(selectedHome) || selectedHome.includes("\0"))
|
|
12
|
+
return "blue";
|
|
13
|
+
const file = join(selectedHome, PRODUCT_IDENTITY.state.piAgentProfile, "settings.json");
|
|
14
|
+
if (statSync(file).size > MAX_SETTINGS_BYTES)
|
|
15
|
+
return "blue";
|
|
16
|
+
const raw = readFileSync(file, "utf8");
|
|
17
|
+
if (Buffer.byteLength(raw, "utf8") > MAX_SETTINGS_BYTES)
|
|
18
|
+
return "blue";
|
|
19
|
+
const root = JSON.parse(raw.replace(/^\uFEFF/u, ""));
|
|
20
|
+
if (!isRecord(root))
|
|
21
|
+
return "blue";
|
|
22
|
+
const namespace = root[PRODUCT_IDENTITY.commandName];
|
|
23
|
+
if (!isRecord(namespace))
|
|
24
|
+
return "blue";
|
|
25
|
+
const value = namespace.accentColor;
|
|
26
|
+
if (value === "default")
|
|
27
|
+
return "purple"; // Compatibility: preserve explicitly saved legacy defaults.
|
|
28
|
+
return isAccentColor(value) ? value : "blue";
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return "blue";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function earlyAccentPalette(color, appearance = "dark", mode = "truecolor") {
|
|
35
|
+
return SHARED_PROGRESS_PALETTE[color][appearance][mode];
|
|
36
|
+
}
|
|
37
|
+
export function earlyTerminalAppearance(environment = process.env) {
|
|
38
|
+
const index = Number.parseInt((environment.COLORFGBG ?? "").split(";").at(-1) ?? "", 10);
|
|
39
|
+
return Number.isInteger(index) && (index === 7 || index === 15 || index >= 231) ? "light" : "dark";
|
|
40
|
+
}
|
|
41
|
+
export function earlyTerminalColorMode(environment = process.env) {
|
|
42
|
+
if (environment.PI_TRUE_COLOR === "1")
|
|
43
|
+
return "truecolor";
|
|
44
|
+
if (environment.PI_TRUE_COLOR === "0")
|
|
45
|
+
return "256color";
|
|
46
|
+
const program = (environment.TERM_PROGRAM ?? "").toLowerCase();
|
|
47
|
+
const known = ["kitty", "ghostty", "wezterm", "rex", "warpterminal", "iterm.app", "alacritty", "vscode", "zed"];
|
|
48
|
+
const trueColor = /^(truecolor|24bit)$/iu.test(environment.COLORTERM ?? "")
|
|
49
|
+
|| (environment.TERM ?? "").endsWith("-direct")
|
|
50
|
+
|| process.platform === "win32" || environment.WT_SESSION !== undefined
|
|
51
|
+
|| known.includes(program);
|
|
52
|
+
return trueColor ? "truecolor" : "256color";
|
|
53
|
+
}
|
|
54
|
+
function isRecord(value) {
|
|
55
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
56
|
+
}
|
|
57
|
+
function isAccentColor(value) {
|
|
58
|
+
return typeof value === "string" && Object.hasOwn(SHARED_PROGRESS_PALETTE, value);
|
|
59
|
+
}
|
|
@@ -21,7 +21,7 @@ export { createRestartSeal, readRestartCertifiedRelease, releaseCertificationDoc
|
|
|
21
21
|
export type { RestartSeal, RestartValidationEvent } from "./restart-certification.js";
|
|
22
22
|
export { STABLE_RELEASE_SCHEMA, createStableReleaseEvidence, verifyStableRegistry } from "./stable-release.js";
|
|
23
23
|
export type { StableRegistryState, StableRegistryVerificationOptions, StableReleaseEvidence, StableReleaseEvidenceInput } from "./stable-release.js";
|
|
24
|
-
export { PACKAGE_UNLOCK_PATIENCE_MS, PRODUCT_PACKAGE, assertUpdatePerformanceBudget, createNpmProcessRunner, createUpdateLifecycleCoordinator, isPackageLockError, lockedPackageDiagnostic, planUpdateOwnership, renderUpdateProgressBar, runSelfUpdate, } from "./update.js";
|
|
24
|
+
export { PACKAGE_UNLOCK_PATIENCE_MS, UPDATE_ALREADY_RUNNING_EXIT_CODE, PRODUCT_PACKAGE, assertUpdatePerformanceBudget, createNpmProcessRunner, createUpdateLifecycleCoordinator, isPackageLockError, lockedPackageDiagnostic, planUpdateOwnership, renderUpdateProgressBar, runSelfUpdate, } from "./update.js";
|
|
25
25
|
export type { ProcessRequest, ProcessResult, SelfUpdateOptions, UpdateActivationPhase, UpdateChannel, UpdateFileMetadata, UpdateFileSystem, UpdateLifecycleCoordinator, UpdateMaterializationProgress, UpdateMeasuredPhase, UpdateOutput, UpdateOwnershipAction, UpdatePackageReplacementInput, UpdatePerformanceEvidence, UpdatePhaseTimingEvent, UpdateProcessRunner, UpdateTransactionJournal, UpdateUnlockPatience, } from "./update.js";
|
|
26
26
|
export { UPDATE_ACTIVATION_CONTRACT, UPDATE_ACTIVATION_ENTRY, UPDATE_ACTIVATION_MANIFEST_FIELD, activateInstalledRelease, delegateActivation, readActivationContracts, runActivationEntry, } from "./update-activation.js";
|
|
27
27
|
export type { UpdateActivationCallbacks, UpdateActivationEvent, UpdateActivationRequest } from "./update-activation.js";
|
|
@@ -10,7 +10,7 @@ export { collectRelease, prepareReleaseCleanup, runBoundedReleaseCleanup, runRel
|
|
|
10
10
|
export { RELEASE_MANIFEST_FILENAME, ReleaseRepairUnavailableError, assertCertifiedFilesPresent, assertImmutableExecutionRoot, consumeMaterializationProof, materializeRelease, readCertifiedReleaseManifest, readMaterializedRelease, repairMaterializedRelease, resolveReleaseEntryPoint, verifyMaterializedRelease, } from "./release-store.js";
|
|
11
11
|
export { createRestartSeal, readRestartCertifiedRelease, releaseCertificationDocument, restartSealDigest } from "./restart-certification.js";
|
|
12
12
|
export { STABLE_RELEASE_SCHEMA, createStableReleaseEvidence, verifyStableRegistry } from "./stable-release.js";
|
|
13
|
-
export { PACKAGE_UNLOCK_PATIENCE_MS, PRODUCT_PACKAGE, assertUpdatePerformanceBudget, createNpmProcessRunner, createUpdateLifecycleCoordinator, isPackageLockError, lockedPackageDiagnostic, planUpdateOwnership, renderUpdateProgressBar, runSelfUpdate, } from "./update.js";
|
|
13
|
+
export { PACKAGE_UNLOCK_PATIENCE_MS, UPDATE_ALREADY_RUNNING_EXIT_CODE, PRODUCT_PACKAGE, assertUpdatePerformanceBudget, createNpmProcessRunner, createUpdateLifecycleCoordinator, isPackageLockError, lockedPackageDiagnostic, planUpdateOwnership, renderUpdateProgressBar, runSelfUpdate, } from "./update.js";
|
|
14
14
|
export { UPDATE_ACTIVATION_CONTRACT, UPDATE_ACTIVATION_ENTRY, UPDATE_ACTIVATION_MANIFEST_FIELD, activateInstalledRelease, delegateActivation, readActivationContracts, runActivationEntry, } from "./update-activation.js";
|
|
15
15
|
export { selectSupervisorLaunchReleaseId, selectUpdateLaunchRelease } from "./update-launch.js";
|
|
16
16
|
export { UPDATE_RECOVERY_SCHEMA, cleanupUpdateRecoveryCapsules, inspectUpdateLauncherSet, npmPrefixForGlobalRoot, prepareUpdateRecoveryCapsule, readUpdateRecoveryCapsule, removeUpdateRecoveryCapsule, runProtectedPackageReplacement, updateLauncherPaths, updateNpmInstallArguments, } from "./update-recovery.js";
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Published release channels: stable `X.Y.Z` on dist-tag `latest`, development `X.Y.Z-dev.N` on `next`. */
|
|
2
2
|
export type ReleaseChannel = "stable" | "development";
|
|
3
|
+
export type StartupUpdateMode = "auto" | "notify" | "no";
|
|
3
4
|
export interface DistTagVersions {
|
|
4
5
|
readonly release: string | null;
|
|
5
6
|
readonly develop: string | null;
|
|
@@ -39,8 +40,8 @@ export interface StartupReleaseCheckOptions {
|
|
|
39
40
|
readonly environment?: NodeJS.ProcessEnv;
|
|
40
41
|
/** Whether standard output is an interactive terminal. */
|
|
41
42
|
readonly interactive: boolean;
|
|
42
|
-
/** The bare-A1 `updateCheck` setting; comparison profiles omit it. */
|
|
43
|
-
readonly
|
|
43
|
+
/** The bare-A1 `updateCheck` setting; comparison profiles omit it and use auto. */
|
|
44
|
+
readonly settingMode?: StartupUpdateMode;
|
|
44
45
|
readonly fetcher?: RegistryFetcher;
|
|
45
46
|
readonly now?: () => number;
|
|
46
47
|
}
|
|
@@ -74,7 +74,7 @@ export function startupReleaseCheckSkipReason(options) {
|
|
|
74
74
|
return "ci";
|
|
75
75
|
if (!options.interactive)
|
|
76
76
|
return "not-interactive";
|
|
77
|
-
if (options.
|
|
77
|
+
if (options.settingMode === "no")
|
|
78
78
|
return "disabled-by-setting";
|
|
79
79
|
if (releaseChannelOf(options.runningVersion) === null)
|
|
80
80
|
return "unpublished-version";
|
|
@@ -1,5 +1,139 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generated by scripts/pi/sync-progress-palette.ts from
|
|
3
|
-
* (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0. Do not edit directly.
|
|
2
|
+
* Generated by scripts/pi/sync-progress-palette.ts from A1's named accent projection
|
|
3
|
+
* over pinned Pi 1.4.0 (MIT), commit 4a080252f06caf63a525d7873c5d94d3c23887e0. Do not edit directly.
|
|
4
4
|
*/
|
|
5
|
-
export declare const
|
|
5
|
+
export declare const SHARED_PROGRESS_PALETTE: Readonly<{
|
|
6
|
+
blue: {
|
|
7
|
+
dark: {
|
|
8
|
+
truecolor: {
|
|
9
|
+
accent: string;
|
|
10
|
+
border: string;
|
|
11
|
+
};
|
|
12
|
+
"256color": {
|
|
13
|
+
accent: string;
|
|
14
|
+
border: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
light: {
|
|
18
|
+
truecolor: {
|
|
19
|
+
accent: string;
|
|
20
|
+
border: string;
|
|
21
|
+
};
|
|
22
|
+
"256color": {
|
|
23
|
+
accent: string;
|
|
24
|
+
border: string;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
purple: {
|
|
29
|
+
dark: {
|
|
30
|
+
truecolor: {
|
|
31
|
+
accent: string;
|
|
32
|
+
border: string;
|
|
33
|
+
};
|
|
34
|
+
"256color": {
|
|
35
|
+
accent: string;
|
|
36
|
+
border: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
light: {
|
|
40
|
+
truecolor: {
|
|
41
|
+
accent: string;
|
|
42
|
+
border: string;
|
|
43
|
+
};
|
|
44
|
+
"256color": {
|
|
45
|
+
accent: string;
|
|
46
|
+
border: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
cyan: {
|
|
51
|
+
dark: {
|
|
52
|
+
truecolor: {
|
|
53
|
+
accent: string;
|
|
54
|
+
border: string;
|
|
55
|
+
};
|
|
56
|
+
"256color": {
|
|
57
|
+
accent: string;
|
|
58
|
+
border: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
light: {
|
|
62
|
+
truecolor: {
|
|
63
|
+
accent: string;
|
|
64
|
+
border: string;
|
|
65
|
+
};
|
|
66
|
+
"256color": {
|
|
67
|
+
accent: string;
|
|
68
|
+
border: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
green: {
|
|
73
|
+
dark: {
|
|
74
|
+
truecolor: {
|
|
75
|
+
accent: string;
|
|
76
|
+
border: string;
|
|
77
|
+
};
|
|
78
|
+
"256color": {
|
|
79
|
+
accent: string;
|
|
80
|
+
border: string;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
light: {
|
|
84
|
+
truecolor: {
|
|
85
|
+
accent: string;
|
|
86
|
+
border: string;
|
|
87
|
+
};
|
|
88
|
+
"256color": {
|
|
89
|
+
accent: string;
|
|
90
|
+
border: string;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
orange: {
|
|
95
|
+
dark: {
|
|
96
|
+
truecolor: {
|
|
97
|
+
accent: string;
|
|
98
|
+
border: string;
|
|
99
|
+
};
|
|
100
|
+
"256color": {
|
|
101
|
+
accent: string;
|
|
102
|
+
border: string;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
light: {
|
|
106
|
+
truecolor: {
|
|
107
|
+
accent: string;
|
|
108
|
+
border: string;
|
|
109
|
+
};
|
|
110
|
+
"256color": {
|
|
111
|
+
accent: string;
|
|
112
|
+
border: string;
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
pink: {
|
|
117
|
+
dark: {
|
|
118
|
+
truecolor: {
|
|
119
|
+
accent: string;
|
|
120
|
+
border: string;
|
|
121
|
+
};
|
|
122
|
+
"256color": {
|
|
123
|
+
accent: string;
|
|
124
|
+
border: string;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
light: {
|
|
128
|
+
truecolor: {
|
|
129
|
+
accent: string;
|
|
130
|
+
border: string;
|
|
131
|
+
};
|
|
132
|
+
"256color": {
|
|
133
|
+
accent: string;
|
|
134
|
+
border: string;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
}>;
|
|
139
|
+
export declare const SHARED_PROGRESS_ACCENT_ANSI: string;
|