windows-development-sandbox 1.25.0 → 1.25.1
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/config.example.json +5 -2
- package/dist/app/features/data/data.def.d.ts +4 -4
- package/dist/app/features/data/data.run.d.ts +1 -1
- package/dist/app/features/defs.d.ts +161 -6
- package/dist/app/features/defs.js +7 -0
- package/dist/app/features/projects/projects.def.d.ts +1 -1
- package/dist/app/features/projects/projects.run.d.ts +1 -1
- package/dist/app/features/unreal/index.d.ts +2 -0
- package/dist/app/features/unreal/index.js +3 -0
- package/dist/app/features/unreal/unreal.def.d.ts +236 -0
- package/dist/app/features/unreal/unreal.def.js +379 -0
- package/dist/app/features/unreal/unreal.run.d.ts +96 -0
- package/dist/app/features/unreal/unreal.run.js +217 -0
- package/dist/app/registry.js +5 -0
- package/dist/bin/agent-sandbox.js +2 -2
- package/dist/bin/{chunk-SUYYVIDW.js → chunk-3GAXLATK.js} +58 -5
- package/dist/bin/{chunk-IZRGTSQ5.js → chunk-F4PVBN23.js} +2465 -1392
- package/dist/bin/{chunk-KH4MI2U5.js → chunk-G3TG4ZT7.js} +1 -1
- package/dist/bin/claude-host.js +2 -2
- package/dist/bin/claude-sbx.js +2 -2
- package/dist/bin/codex-sbx.js +2 -2
- package/dist/bin/gemini-sbx.js +2 -2
- package/dist/bin/sandbox.js +2 -2
- package/dist/bin/sbx-hide.js +2 -2
- package/dist/bin/sbx-show.js +2 -2
- package/dist/cli/commands/launch/launch.js +5 -2
- package/dist/cli/commands/registry.js +3 -0
- package/dist/cli/manifest.d.ts +18 -0
- package/dist/cli/manifest.js +26 -0
- package/dist/cli/menu/coverage-exempt.js +1 -0
- package/dist/cli/menu/pages/sandbox-page.d.ts +3 -0
- package/dist/cli/menu/pages/sandbox-page.js +34 -4
- package/dist/cli/menu/views.js +2 -0
- package/dist/core/config/defaults.js +18 -4
- package/dist/core/schema/config.d.ts +9 -7
- package/dist/core/schema/pc-installs.d.ts +3 -1
- package/dist/core/schema/pc-installs.js +10 -1
- package/dist/core/schema/toolchains.js +1 -1
- package/dist/guest/accounts/kinds/epic.js +18 -13
- package/dist/guest/apps/after-install.d.ts +1 -1
- package/dist/guest/apps/after-install.js +6 -1
- package/dist/guest/apps/app-installer.d.ts +1 -0
- package/dist/guest/apps/app-installer.js +13 -3
- package/dist/guest/apps/comet-unpack.js +3 -2
- package/dist/guest/apps/resolvers-gamedev.js +55 -1
- package/dist/guest/boot/boot.js +14 -1
- package/dist/guest/boot/guide.js +24 -0
- package/dist/guest/daemon/daemon.js +3 -0
- package/dist/guest/setup/addon-mcp.d.ts +7 -0
- package/dist/guest/setup/addon-mcp.js +19 -4
- package/dist/guest/setup/browser-gpu.js +14 -11
- package/dist/guest/setup/headroom.js +4 -0
- package/dist/guest/toolchains/engines/epic-launcher.d.ts +26 -0
- package/dist/guest/toolchains/engines/epic-launcher.js +127 -0
- package/dist/guest/toolchains/engines/unreal-engines.d.ts +21 -1
- package/dist/guest/toolchains/engines/unreal-engines.js +163 -3
- package/dist/guest/toolchains/engines/unreal-status.d.ts +13 -0
- package/dist/guest/toolchains/engines/unreal-status.js +41 -0
- package/dist/guest/toolchains/native/debuggers.d.ts +6 -0
- package/dist/guest/toolchains/native/debuggers.js +57 -0
- package/dist/guest/toolchains/native/mesa.js +15 -8
- package/dist/guest/toolchains/native/rust-extras.d.ts +7 -0
- package/dist/guest/toolchains/native/rust-extras.js +23 -1
- package/dist/guest/toolchains/native/unreal.d.ts +2 -2
- package/dist/guest/toolchains/native/unreal.js +96 -18
- package/dist/guest/toolchains/plan.js +12 -1
- package/dist/guest/toolchains/tools/vscode-profile.js +2 -0
- package/dist/host/accounts/kinds/epic.js +11 -5
- package/dist/host/accounts/source.d.ts +2 -0
- package/dist/host/accounts/source.js +1 -0
- package/dist/host/pc-installs/discover.d.ts +2 -0
- package/dist/host/pc-installs/discover.js +25 -5
- package/dist/host/pc-installs/epic.d.ts +3 -0
- package/dist/host/pc-installs/epic.js +33 -2
- package/dist/host/pc-installs/source.d.ts +1 -1
- package/dist/host/pc-installs/unreal-vault.d.ts +11 -0
- package/dist/host/pc-installs/unreal-vault.js +78 -0
- package/dist/host/pc-installs/unreal.d.ts +36 -0
- package/dist/host/pc-installs/unreal.js +145 -2
- package/dist/host/profile/claude-profile.d.ts +8 -0
- package/dist/host/profile/claude-profile.js +43 -4
- package/dist/host/profile/index.d.ts +1 -1
- package/dist/host/profile/index.js +1 -1
- package/dist/runtime/agent.js +81 -7
- package/dist/runtime/daemon.js +2645 -1287
- package/dist/runtime/db.js +81 -7
- package/dist/runtime/main.js +2901 -1722
- package/dist/runtime/netproxy.js +81 -7
- package/dist/runtime/tool.js +81 -7
- package/dist/runtime/view.js +81 -7
- package/dist/selftest/agent-paths.test.js +1 -0
- package/dist/selftest/agents-web.test.js +12 -0
- package/dist/selftest/engines.test.js +602 -3
- package/dist/selftest/heavy-load.test.js +3 -1
- package/dist/selftest/hostile-input.test.js +11 -1
- package/dist/selftest/index.js +2 -0
- package/dist/selftest/menu-screens.js +3 -1
- package/dist/selftest/mixamo.test.d.ts +2 -0
- package/dist/selftest/mixamo.test.js +60 -0
- package/dist/selftest/secrets.test.js +36 -1
- package/dist/selftest/support/engine-golden.js +3 -0
- package/dist/selftest/support/fixtures.d.ts +3 -1
- package/dist/selftest/support/unreal-sample.d.ts +2 -0
- package/dist/selftest/support/unreal-sample.js +83 -0
- package/dist/selftest/toolchains.test.js +32 -2
- package/dist/shared/accounts/index.d.ts +1 -1
- package/dist/shared/accounts/index.js +1 -1
- package/dist/shared/accounts/kinds/epic.d.ts +6 -1
- package/dist/shared/accounts/kinds/epic.js +11 -1
- package/dist/shared/apps/associations.d.ts +7 -0
- package/dist/shared/apps/associations.js +26 -0
- package/dist/shared/apps/catalogue-agents-web.d.ts +4 -1
- package/dist/shared/apps/catalogue-agents-web.js +5 -2
- package/dist/shared/apps/catalogue-gamedev.js +71 -1
- package/dist/shared/apps/index.d.ts +2 -0
- package/dist/shared/apps/index.js +2 -0
- package/dist/shared/apps/preview.d.ts +2 -0
- package/dist/shared/apps/preview.js +10 -0
- package/dist/shared/browser-policy.d.ts +14 -0
- package/dist/shared/browser-policy.js +22 -0
- package/dist/shared/io/index.d.ts +1 -0
- package/dist/shared/io/index.js +1 -0
- package/dist/shared/io/rotate-log.d.ts +2 -0
- package/dist/shared/io/rotate-log.js +16 -0
- package/dist/shared/memory/policy.d.ts +5 -0
- package/dist/shared/memory/policy.js +7 -0
- package/dist/shared/paths/pc-installs.d.ts +13 -2
- package/dist/shared/paths/pc-installs.js +1 -0
- package/dist/shared/readiness.d.ts +0 -1
- package/dist/shared/readiness.js +0 -1
- package/dist/shared/signer.d.ts +4 -0
- package/dist/shared/signer.js +2 -0
- package/dist/shared/unreal/engines.d.ts +161 -0
- package/dist/shared/unreal/engines.js +308 -0
- package/dist/shared/unreal/guide.d.ts +19 -0
- package/dist/shared/unreal/guide.js +105 -0
- package/dist/shared/unreal/index.d.ts +7 -0
- package/dist/shared/unreal/index.js +8 -0
- package/dist/shared/unreal/launcher-files.d.ts +88 -0
- package/dist/shared/unreal/launcher-files.js +292 -0
- package/dist/shared/unreal/mixamo.d.ts +5 -0
- package/dist/shared/unreal/mixamo.js +16 -0
- package/dist/shared/unreal/room.d.ts +17 -0
- package/dist/shared/unreal/room.js +34 -0
- package/dist/shared/unreal/status.d.ts +54 -0
- package/dist/shared/unreal/status.js +57 -0
- package/dist/shared/unreal/vault.d.ts +21 -0
- package/dist/shared/unreal/vault.js +67 -0
- package/dist/shared/unreal/vs-check.d.ts +39 -0
- package/dist/shared/unreal/vs-check.js +79 -0
- package/dist/web/index.html +1 -1
- package/dist/web/{main-CCILLX2M.js → main-FNE6XEHA.js} +84 -84
- package/package.json +1 -1
- package/sandbox/csharp/VsSetup.cs +210 -0
- package/sandbox/scripts/get-vs-setup.ps1 +93 -0
- package/sandbox/scripts/set-registry-values.ps1 +35 -0
- package/schemas/config.schema.json +35 -2
- package/schemas/sandbox-config.schema.json +8 -1
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
// Unreal Engine: the engines the sandbox has (and which project uses which), the ones on this PC the next sandbox maps,
|
|
2
|
+
// this PC's asset vault, Visual Studio as UnrealBuildTool finds it, the debuggers, the derived data cache and the
|
|
3
|
+
// editor's MCP server; registering an engine folder of this PC and opening the Epic Games Launcher in the sandbox.
|
|
4
|
+
// Pure: schemas, labels and the view; unreal.run.ts reads the sandbox's tools\unreal\status.json and looks on this PC.
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { action, bytesText, defineOperation, defineQuery, defineView, link, } from '../../kernel/index.js';
|
|
7
|
+
import { browseFolder } from '../files/files.def.js';
|
|
8
|
+
const EngineSchema = z.object({
|
|
9
|
+
id: z.string().describe("UE_5.4, or a source build's registered name"),
|
|
10
|
+
version: z.string().describe('5.4.4'),
|
|
11
|
+
dir: z.string().describe('Its folder in the sandbox'),
|
|
12
|
+
where: z.string().describe('Where it came from, in words'),
|
|
13
|
+
writable: z.boolean().describe('The sandbox can write into it'),
|
|
14
|
+
build: z.enum(['installed', 'source']).describe('An installed (launcher) build or a source build'),
|
|
15
|
+
sizeBytes: z.number().nullable().describe('Its size, when known'),
|
|
16
|
+
projects: z.array(z.string()).describe('The projects that build with it'),
|
|
17
|
+
});
|
|
18
|
+
const PcEngineSchema = z.object({
|
|
19
|
+
id: z.string().describe('Its folder name in the sandbox (C:\\PcInstalls\\unreal\\<id>)'),
|
|
20
|
+
name: z.string().describe('Unreal Engine 5.4.4'),
|
|
21
|
+
folder: z.string().describe('Its folder on this PC'),
|
|
22
|
+
writable: z.boolean().describe('A folder you registered (mapped writable)'),
|
|
23
|
+
source: z.boolean().describe('A source build this PC registered: not mapped until its folder is registered'),
|
|
24
|
+
});
|
|
25
|
+
const PackSchema = z.object({
|
|
26
|
+
name: z.string().describe('The pack folder'),
|
|
27
|
+
size: z.string().describe('Its size in words'),
|
|
28
|
+
kind: z.enum(['content', 'plugin', 'other']).describe('Content, a code plugin, or something else'),
|
|
29
|
+
});
|
|
30
|
+
export const UnrealOverviewSchema = z.object({
|
|
31
|
+
setUp: z.boolean().describe('A sandbox has set Unreal up (its status file exists)'),
|
|
32
|
+
checkedAt: z.string().nullable().describe('When the sandbox last looked'),
|
|
33
|
+
engines: z.array(EngineSchema).describe('The engines the sandbox has'),
|
|
34
|
+
projects: z
|
|
35
|
+
.array(z.object({ project: z.string(), engine: z.string().nullable(), reason: z.string() }))
|
|
36
|
+
.describe('Which engine each project builds with, and why'),
|
|
37
|
+
launcher: z.object({
|
|
38
|
+
installed: z.boolean().describe('The Epic Games Launcher is installed in the sandbox'),
|
|
39
|
+
installLocation: z.string().nullable().describe('Where it installs engines'),
|
|
40
|
+
problem: z.string().nullable().describe('Why engines would not go to the data disk, or would not fit'),
|
|
41
|
+
free: z.string().nullable().describe('Free room there, in words'),
|
|
42
|
+
}),
|
|
43
|
+
visualStudio: z.object({
|
|
44
|
+
version: z.string(),
|
|
45
|
+
path: z.string(),
|
|
46
|
+
how: z.string().describe('Kept on the data disk, or installed in this sandbox'),
|
|
47
|
+
check: z.string().describe('What UnrealBuildTool finds'),
|
|
48
|
+
ok: z.boolean(),
|
|
49
|
+
}),
|
|
50
|
+
debugger: z.string().nullable().describe('cdb.exe, when the debuggers are there'),
|
|
51
|
+
ddc: z.string().nullable().describe('The derived data cache folder, when it is kept'),
|
|
52
|
+
mcpUrl: z.string().nullable().describe("The editor's MCP server address"),
|
|
53
|
+
pc: z.object({
|
|
54
|
+
setting: z.string().describe('pcInstalls.unrealEngines'),
|
|
55
|
+
engines: z.array(PcEngineSchema).describe("This PC's engines the next sandbox maps"),
|
|
56
|
+
problem: z.string().nullable().describe('Why this PC could not be looked at'),
|
|
57
|
+
}),
|
|
58
|
+
vault: z.object({
|
|
59
|
+
setting: z.string().describe('pcInstalls.unrealAssets'),
|
|
60
|
+
folders: z.array(z.object({ folder: z.string(), packs: z.array(PackSchema), more: z.number() })),
|
|
61
|
+
}),
|
|
62
|
+
settings: z.object({
|
|
63
|
+
enabled: z.string(),
|
|
64
|
+
acceptLicense: z.boolean(),
|
|
65
|
+
persistEngines: z.boolean(),
|
|
66
|
+
derivedDataCache: z.string(),
|
|
67
|
+
visualStudio: z.string(),
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
const MessageSchema = z.object({ message: z.string().describe('What happened') });
|
|
71
|
+
export const unrealOverview = defineQuery({
|
|
72
|
+
id: 'unreal.overview',
|
|
73
|
+
title: 'Unreal Engine',
|
|
74
|
+
summary: "the engines, which project uses which, this PC's engines and assets, Visual Studio and the build tools",
|
|
75
|
+
input: z.object({}),
|
|
76
|
+
output: UnrealOverviewSchema,
|
|
77
|
+
cli: { name: 'unreal', action: 'status', json: true },
|
|
78
|
+
});
|
|
79
|
+
export const registerEngineFolder = defineOperation({
|
|
80
|
+
id: 'unreal.registerFolder',
|
|
81
|
+
title: 'Register an engine folder…',
|
|
82
|
+
summary: 'use an Unreal Engine folder of this PC in the sandbox, writable (a source build, or a copy of an engine)',
|
|
83
|
+
input: z.object({
|
|
84
|
+
folder: z.string().optional().describe('the engine folder (it holds Engine\\Build\\Build.version)'),
|
|
85
|
+
}),
|
|
86
|
+
output: MessageSchema,
|
|
87
|
+
text: (o) => o.message,
|
|
88
|
+
cli: { name: 'unreal', action: 'add-engine', positional: ['folder'] },
|
|
89
|
+
});
|
|
90
|
+
export const forgetEngineFolder = defineOperation({
|
|
91
|
+
id: 'unreal.forgetFolder',
|
|
92
|
+
title: 'Forget this engine folder',
|
|
93
|
+
summary: 'stop mapping a registered engine folder into sandboxes (nothing on this PC is deleted)',
|
|
94
|
+
input: z.object({ folder: z.string().describe('the registered folder') }),
|
|
95
|
+
output: MessageSchema,
|
|
96
|
+
text: (o) => o.message,
|
|
97
|
+
cli: { name: 'unreal', action: 'forget-engine', positional: ['folder'] },
|
|
98
|
+
});
|
|
99
|
+
export const openEpicLauncher = defineOperation({
|
|
100
|
+
id: 'unreal.openLauncher',
|
|
101
|
+
title: 'Open the Epic Games Launcher',
|
|
102
|
+
summary: 'open the Epic Games Launcher in the running sandbox (sign in once; engines install to the data disk)',
|
|
103
|
+
input: z.object({}),
|
|
104
|
+
output: MessageSchema,
|
|
105
|
+
text: (o) => o.message,
|
|
106
|
+
cli: { name: 'unreal', action: 'launcher' },
|
|
107
|
+
});
|
|
108
|
+
const SETTINGS = [
|
|
109
|
+
['toolchains.unreal.enabled', 'Unreal set-up'],
|
|
110
|
+
['toolchains.unreal.acceptLicense', 'Licence accepted'],
|
|
111
|
+
['toolchains.unreal.visualStudio', 'Visual Studio'],
|
|
112
|
+
['toolchains.unreal.persistEngines', 'Engines on the data disk'],
|
|
113
|
+
['toolchains.unreal.derivedDataCache', 'Derived data cache'],
|
|
114
|
+
['pcInstalls.unrealEngines', "This PC's engines"],
|
|
115
|
+
['pcInstalls.unrealAssets', "This PC's assets"],
|
|
116
|
+
];
|
|
117
|
+
const sizeOf = (bytes) => (bytes === null ? '' : bytesText(bytes));
|
|
118
|
+
function enginesSection(o) {
|
|
119
|
+
const items = o.engines.map((e) => ({
|
|
120
|
+
id: 'engine:' + e.dir,
|
|
121
|
+
label: e.id + ' ' + e.version,
|
|
122
|
+
hint: e.where,
|
|
123
|
+
tone: e.writable ? 'ok' : 'accent',
|
|
124
|
+
description: e.dir +
|
|
125
|
+
(e.sizeBytes !== null ? ' (' + sizeOf(e.sizeBytes) + ')' : '') +
|
|
126
|
+
'. ' +
|
|
127
|
+
(e.projects.length ? 'Used by ' + e.projects.join(', ') + '.' : 'No project uses it yet.') +
|
|
128
|
+
(e.build === 'source' ? ' A source build.' : ''),
|
|
129
|
+
icon: 'folder',
|
|
130
|
+
cells: {
|
|
131
|
+
engine: e.id,
|
|
132
|
+
version: e.version,
|
|
133
|
+
where: e.where,
|
|
134
|
+
folder: e.dir,
|
|
135
|
+
used: e.projects.join(', ') || '-',
|
|
136
|
+
},
|
|
137
|
+
}));
|
|
138
|
+
return {
|
|
139
|
+
id: 'engines',
|
|
140
|
+
title: 'Engines in the sandbox',
|
|
141
|
+
description: 'A project builds with the engine its .uproject names (a writable copy before the read-only one from this PC), else with the newest.',
|
|
142
|
+
items,
|
|
143
|
+
columns: [
|
|
144
|
+
{ key: 'engine', label: 'Engine' },
|
|
145
|
+
{ key: 'version', label: 'Version' },
|
|
146
|
+
{ key: 'where', label: 'Where' },
|
|
147
|
+
{ key: 'folder', label: 'Folder' },
|
|
148
|
+
{ key: 'used', label: 'Used by' },
|
|
149
|
+
],
|
|
150
|
+
columnsOn: 'cli',
|
|
151
|
+
...(o.projects.length
|
|
152
|
+
? {
|
|
153
|
+
notes: o.projects.map((p) => ({
|
|
154
|
+
text: p.project + ': ' + (p.engine ?? 'no engine') + ' (' + p.reason + ')',
|
|
155
|
+
...(p.engine ? {} : { tone: 'warn' }),
|
|
156
|
+
})),
|
|
157
|
+
}
|
|
158
|
+
: {}),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function pcSection(o) {
|
|
162
|
+
return {
|
|
163
|
+
id: 'pc',
|
|
164
|
+
title: 'From this PC',
|
|
165
|
+
description: o.pc.setting === 'auto'
|
|
166
|
+
? 'The next sandbox set up for Unreal maps these read-only (folders you registered: writable) and registers them: no download.'
|
|
167
|
+
: "This PC's engines setting is " + o.pc.setting + '.',
|
|
168
|
+
items: o.pc.engines.map((e) => ({
|
|
169
|
+
id: 'pc:' + e.folder,
|
|
170
|
+
label: e.name,
|
|
171
|
+
hint: e.source ? 'source build, not mapped' : e.writable ? 'registered, writable' : 'read-only',
|
|
172
|
+
description: e.source
|
|
173
|
+
? e.folder + ' is a source build: building writes inside the engine, so register its folder to use it.'
|
|
174
|
+
: e.folder + ' appears in the sandbox at C:\\PcInstalls\\unreal\\' + e.id + '.',
|
|
175
|
+
cells: { engine: e.name, how: e.source ? 'not mapped' : e.writable ? 'writable' : 'read-only', folder: e.folder },
|
|
176
|
+
...(e.source
|
|
177
|
+
? { actions: [action(registerEngineFolder, { folder: e.folder }, { key: 'a', verb: 'register' })] }
|
|
178
|
+
: e.writable
|
|
179
|
+
? { actions: [action(forgetEngineFolder, { folder: e.folder }, { key: 'x', verb: 'forget' })] }
|
|
180
|
+
: {}),
|
|
181
|
+
})),
|
|
182
|
+
columns: [
|
|
183
|
+
{ key: 'engine', label: 'Engine' },
|
|
184
|
+
{ key: 'how', label: 'Mapped' },
|
|
185
|
+
{ key: 'folder', label: 'Folder on this PC' },
|
|
186
|
+
],
|
|
187
|
+
columnsOn: 'cli',
|
|
188
|
+
notes: o.pc.problem
|
|
189
|
+
? [{ text: o.pc.problem, tone: 'warn' }]
|
|
190
|
+
: o.pc.engines.length
|
|
191
|
+
? []
|
|
192
|
+
: [
|
|
193
|
+
{
|
|
194
|
+
text: o.pc.setting === 'false'
|
|
195
|
+
? "Turned off (This PC's engines)."
|
|
196
|
+
: 'No Unreal Engine on this PC yet: one you install with the Epic Games Launcher shows up here, and the next sandbox maps it.',
|
|
197
|
+
tone: 'muted',
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
actions: [action(registerEngineFolder, {}, { key: 'a', verb: 'register' })],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function vaultSection(o) {
|
|
204
|
+
// A heading per folder only when there are several (most PCs have the default one).
|
|
205
|
+
const group = (folder) => (o.vault.folders.length > 1 ? { group: folder } : {});
|
|
206
|
+
const items = o.vault.folders.flatMap((f) => [
|
|
207
|
+
...f.packs.map((p) => ({
|
|
208
|
+
id: 'pack:' + f.folder + '\\' + p.name,
|
|
209
|
+
label: p.name,
|
|
210
|
+
hint: p.size,
|
|
211
|
+
...group(f.folder),
|
|
212
|
+
description: f.folder +
|
|
213
|
+
'\\' +
|
|
214
|
+
p.name +
|
|
215
|
+
(p.kind === 'plugin'
|
|
216
|
+
? ": a code plugin (agents copy it into a project's Plugins folder)."
|
|
217
|
+
: p.kind === 'content'
|
|
218
|
+
? ": content (agents copy it into a project's Content folder)."
|
|
219
|
+
: '.'),
|
|
220
|
+
})),
|
|
221
|
+
...(f.more
|
|
222
|
+
? [{ id: 'more:' + f.folder, label: '… and ' + f.more + ' more', ...group(f.folder), tone: 'muted' }]
|
|
223
|
+
: []),
|
|
224
|
+
]);
|
|
225
|
+
const empty = !o.vault.folders.some((f) => f.packs.length);
|
|
226
|
+
return {
|
|
227
|
+
id: 'vault',
|
|
228
|
+
title: 'Assets from this PC',
|
|
229
|
+
description: 'The Fab and Marketplace packs your Epic Games Launcher downloaded (its vault cache). The sandbox sees them read-only at C:\\PcInstalls\\unreal\\Vault, and new ones at once; agents copy what a project needs into it.',
|
|
230
|
+
facts: o.vault.folders.map((f, i) => ({
|
|
231
|
+
id: 'vault:' + i,
|
|
232
|
+
label: 'Vault cache',
|
|
233
|
+
value: f.folder,
|
|
234
|
+
description: 'In the sandbox: C:\\PcInstalls\\unreal\\Vault' + (i ? String(i + 1) : ''),
|
|
235
|
+
})),
|
|
236
|
+
items,
|
|
237
|
+
...(empty
|
|
238
|
+
? {
|
|
239
|
+
notes: [
|
|
240
|
+
{
|
|
241
|
+
text: o.vault.setting === 'false'
|
|
242
|
+
? "Turned off (This PC's assets)."
|
|
243
|
+
: 'No packs yet: the ones you add to the vault with the Epic Games Launcher appear here.',
|
|
244
|
+
tone: 'muted',
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
}
|
|
248
|
+
: {}),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
function toolsSection(o) {
|
|
252
|
+
const vs = o.visualStudio;
|
|
253
|
+
return {
|
|
254
|
+
id: 'tools',
|
|
255
|
+
title: 'Build tools',
|
|
256
|
+
facts: [
|
|
257
|
+
{
|
|
258
|
+
id: 'vs',
|
|
259
|
+
label: 'Visual Studio',
|
|
260
|
+
value: vs.version ? vs.version + (vs.how ? ' (' + vs.how + ')' : '') : 'not set up yet',
|
|
261
|
+
tone: vs.version ? (vs.ok ? 'ok' : 'warn') : 'muted',
|
|
262
|
+
...(vs.path ? { description: vs.path } : {}),
|
|
263
|
+
},
|
|
264
|
+
...(vs.check
|
|
265
|
+
? [
|
|
266
|
+
{
|
|
267
|
+
id: 'ubt',
|
|
268
|
+
label: 'UnrealBuildTool finds',
|
|
269
|
+
value: vs.check,
|
|
270
|
+
tone: vs.ok ? 'ok' : 'danger',
|
|
271
|
+
},
|
|
272
|
+
]
|
|
273
|
+
: []),
|
|
274
|
+
{
|
|
275
|
+
id: 'cdb',
|
|
276
|
+
label: 'Debugger',
|
|
277
|
+
value: o.debugger ? 'cdb and windbg' : 'not there yet',
|
|
278
|
+
tone: o.debugger ? 'ok' : 'muted',
|
|
279
|
+
...(o.debugger ? { description: o.debugger } : {}),
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
id: 'ddc',
|
|
283
|
+
label: 'Derived data cache',
|
|
284
|
+
value: o.ddc ?? "Unreal's own place (rebuilt every sandbox)",
|
|
285
|
+
tone: o.ddc ? 'ok' : 'muted',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: 'launcher',
|
|
289
|
+
label: 'Epic Games Launcher',
|
|
290
|
+
value: o.launcher.installed
|
|
291
|
+
? 'installs engines to ' + (o.launcher.installLocation ?? 'the sandbox disk')
|
|
292
|
+
: o.setUp
|
|
293
|
+
? 'not installed'
|
|
294
|
+
: 'not set up yet',
|
|
295
|
+
tone: o.launcher.problem ? 'danger' : o.launcher.installed ? 'ok' : 'muted',
|
|
296
|
+
...(o.launcher.free ? { description: o.launcher.free + ' free there' } : {}),
|
|
297
|
+
},
|
|
298
|
+
...(o.mcpUrl
|
|
299
|
+
? [
|
|
300
|
+
{
|
|
301
|
+
id: 'mcp',
|
|
302
|
+
label: 'Editor MCP server',
|
|
303
|
+
value: o.mcpUrl,
|
|
304
|
+
description: 'In Claude Code as sbx-unreal-editor; it answers while the editor runs with the plugin on.',
|
|
305
|
+
},
|
|
306
|
+
]
|
|
307
|
+
: []),
|
|
308
|
+
],
|
|
309
|
+
actions: [action(openEpicLauncher, {}, { key: 'o', verb: 'launcher' })],
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
function settingsSection(o) {
|
|
313
|
+
const value = {
|
|
314
|
+
'toolchains.unreal.enabled': o.settings.enabled,
|
|
315
|
+
'toolchains.unreal.acceptLicense': o.settings.acceptLicense ? 'yes' : 'no',
|
|
316
|
+
'toolchains.unreal.visualStudio': o.settings.visualStudio,
|
|
317
|
+
'toolchains.unreal.persistEngines': o.settings.persistEngines ? 'yes' : 'no',
|
|
318
|
+
'toolchains.unreal.derivedDataCache': o.settings.derivedDataCache,
|
|
319
|
+
'pcInstalls.unrealEngines': o.pc.setting,
|
|
320
|
+
'pcInstalls.unrealAssets': o.vault.setting,
|
|
321
|
+
};
|
|
322
|
+
return {
|
|
323
|
+
id: 'settings',
|
|
324
|
+
title: 'Settings',
|
|
325
|
+
columns: [
|
|
326
|
+
{ key: 'setting', label: 'Setting' },
|
|
327
|
+
{ key: 'value', label: 'Value' },
|
|
328
|
+
{ key: 'key', label: 'Key' },
|
|
329
|
+
],
|
|
330
|
+
columnsOn: 'cli',
|
|
331
|
+
items: SETTINGS.map(([key, label]) => ({
|
|
332
|
+
id: 'setting:' + key,
|
|
333
|
+
label,
|
|
334
|
+
hint: value[key],
|
|
335
|
+
code: key,
|
|
336
|
+
cells: { setting: label, value: value[key], key },
|
|
337
|
+
...(key === 'toolchains.unreal.acceptLicense' && !o.settings.acceptLicense ? { tone: 'warn' } : {}),
|
|
338
|
+
primary: link({ kind: 'setting', key }, 'Change ' + label.toLowerCase(), { verb: 'change' }),
|
|
339
|
+
})),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
/** The Unreal page. */
|
|
343
|
+
export function unrealPage(o) {
|
|
344
|
+
return {
|
|
345
|
+
title: 'Unreal Engine',
|
|
346
|
+
...(o.launcher.problem ? { notice: { text: o.launcher.problem, tone: 'danger' } } : {}),
|
|
347
|
+
sections: [
|
|
348
|
+
{
|
|
349
|
+
...enginesSection(o),
|
|
350
|
+
...(o.engines.length
|
|
351
|
+
? {}
|
|
352
|
+
: {
|
|
353
|
+
notes: [
|
|
354
|
+
{
|
|
355
|
+
text: o.setUp
|
|
356
|
+
? 'No engine yet. Install Unreal Engine on this PC with the Epic Games Launcher: the next sandbox maps it read-only. Or open the Epic Games Launcher in the sandbox and sign in once: it installs to the data disk, kept between sandboxes.'
|
|
357
|
+
: 'No sandbox has set Unreal up yet. It is set up when a project has a .uproject (or the Unreal set-up setting is on).',
|
|
358
|
+
tone: 'muted',
|
|
359
|
+
},
|
|
360
|
+
],
|
|
361
|
+
}),
|
|
362
|
+
},
|
|
363
|
+
pcSection(o),
|
|
364
|
+
vaultSection(o),
|
|
365
|
+
toolsSection(o),
|
|
366
|
+
settingsSection(o),
|
|
367
|
+
],
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
export const unrealView = defineView({
|
|
371
|
+
id: 'unreal',
|
|
372
|
+
title: 'Unreal Engine',
|
|
373
|
+
summary: "Engines, which project uses which, this PC's engines and assets, Visual Studio and the debugger.",
|
|
374
|
+
queries: { overview: unrealOverview },
|
|
375
|
+
operations: [registerEngineFolder, forgetEngineFolder, openEpicLauncher],
|
|
376
|
+
pickers: [browseFolder],
|
|
377
|
+
inputs: () => ({ overview: {} }),
|
|
378
|
+
build: ({ overview }) => unrealPage(overview),
|
|
379
|
+
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type Context } from '../../../cli/commands/context.js';
|
|
2
|
+
import { type UnrealStatus } from '../../../shared/unreal/index.js';
|
|
3
|
+
import { type UnrealOverview } from './unreal.def.js';
|
|
4
|
+
export declare function readStatus(dataPath: string): UnrealStatus | null;
|
|
5
|
+
/** The overview from the sandbox's status and this PC's own look (no sandbox needed). */
|
|
6
|
+
export declare function unrealOverviewOf(ctx: Context, status: UnrealStatus | null, pcLook: () => {
|
|
7
|
+
engines: UnrealOverview['pc']['engines'];
|
|
8
|
+
vault: UnrealOverview['vault']['folders'];
|
|
9
|
+
}): UnrealOverview;
|
|
10
|
+
export declare const unrealOverviewRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").QueryDef<import("zod").ZodObject<{}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
11
|
+
setUp: import("zod").ZodBoolean;
|
|
12
|
+
checkedAt: import("zod").ZodNullable<import("zod").ZodString>;
|
|
13
|
+
engines: import("zod").ZodArray<import("zod").ZodObject<{
|
|
14
|
+
id: import("zod").ZodString;
|
|
15
|
+
version: import("zod").ZodString;
|
|
16
|
+
dir: import("zod").ZodString;
|
|
17
|
+
where: import("zod").ZodString;
|
|
18
|
+
writable: import("zod").ZodBoolean;
|
|
19
|
+
build: import("zod").ZodEnum<{
|
|
20
|
+
installed: "installed";
|
|
21
|
+
source: "source";
|
|
22
|
+
}>;
|
|
23
|
+
sizeBytes: import("zod").ZodNullable<import("zod").ZodNumber>;
|
|
24
|
+
projects: import("zod").ZodArray<import("zod").ZodString>;
|
|
25
|
+
}, import("zod/v4/core").$strip>>;
|
|
26
|
+
projects: import("zod").ZodArray<import("zod").ZodObject<{
|
|
27
|
+
project: import("zod").ZodString;
|
|
28
|
+
engine: import("zod").ZodNullable<import("zod").ZodString>;
|
|
29
|
+
reason: import("zod").ZodString;
|
|
30
|
+
}, import("zod/v4/core").$strip>>;
|
|
31
|
+
launcher: import("zod").ZodObject<{
|
|
32
|
+
installed: import("zod").ZodBoolean;
|
|
33
|
+
installLocation: import("zod").ZodNullable<import("zod").ZodString>;
|
|
34
|
+
problem: import("zod").ZodNullable<import("zod").ZodString>;
|
|
35
|
+
free: import("zod").ZodNullable<import("zod").ZodString>;
|
|
36
|
+
}, import("zod/v4/core").$strip>;
|
|
37
|
+
visualStudio: import("zod").ZodObject<{
|
|
38
|
+
version: import("zod").ZodString;
|
|
39
|
+
path: import("zod").ZodString;
|
|
40
|
+
how: import("zod").ZodString;
|
|
41
|
+
check: import("zod").ZodString;
|
|
42
|
+
ok: import("zod").ZodBoolean;
|
|
43
|
+
}, import("zod/v4/core").$strip>;
|
|
44
|
+
debugger: import("zod").ZodNullable<import("zod").ZodString>;
|
|
45
|
+
ddc: import("zod").ZodNullable<import("zod").ZodString>;
|
|
46
|
+
mcpUrl: import("zod").ZodNullable<import("zod").ZodString>;
|
|
47
|
+
pc: import("zod").ZodObject<{
|
|
48
|
+
setting: import("zod").ZodString;
|
|
49
|
+
engines: import("zod").ZodArray<import("zod").ZodObject<{
|
|
50
|
+
id: import("zod").ZodString;
|
|
51
|
+
name: import("zod").ZodString;
|
|
52
|
+
folder: import("zod").ZodString;
|
|
53
|
+
writable: import("zod").ZodBoolean;
|
|
54
|
+
source: import("zod").ZodBoolean;
|
|
55
|
+
}, import("zod/v4/core").$strip>>;
|
|
56
|
+
problem: import("zod").ZodNullable<import("zod").ZodString>;
|
|
57
|
+
}, import("zod/v4/core").$strip>;
|
|
58
|
+
vault: import("zod").ZodObject<{
|
|
59
|
+
setting: import("zod").ZodString;
|
|
60
|
+
folders: import("zod").ZodArray<import("zod").ZodObject<{
|
|
61
|
+
folder: import("zod").ZodString;
|
|
62
|
+
packs: import("zod").ZodArray<import("zod").ZodObject<{
|
|
63
|
+
name: import("zod").ZodString;
|
|
64
|
+
size: import("zod").ZodString;
|
|
65
|
+
kind: import("zod").ZodEnum<{
|
|
66
|
+
other: "other";
|
|
67
|
+
content: "content";
|
|
68
|
+
plugin: "plugin";
|
|
69
|
+
}>;
|
|
70
|
+
}, import("zod/v4/core").$strip>>;
|
|
71
|
+
more: import("zod").ZodNumber;
|
|
72
|
+
}, import("zod/v4/core").$strip>>;
|
|
73
|
+
}, import("zod/v4/core").$strip>;
|
|
74
|
+
settings: import("zod").ZodObject<{
|
|
75
|
+
enabled: import("zod").ZodString;
|
|
76
|
+
acceptLicense: import("zod").ZodBoolean;
|
|
77
|
+
persistEngines: import("zod").ZodBoolean;
|
|
78
|
+
derivedDataCache: import("zod").ZodString;
|
|
79
|
+
visualStudio: import("zod").ZodString;
|
|
80
|
+
}, import("zod/v4/core").$strip>;
|
|
81
|
+
}, import("zod/v4/core").$strip>, "unreal.overview">, Context>;
|
|
82
|
+
/** The engine in a folder of this PC, or a failure that says what is wrong. */
|
|
83
|
+
export declare function engineFolderProblem(folder: string, read: (file: string, max: number) => Buffer | null): string | null;
|
|
84
|
+
export declare const registerEngineFolderRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{
|
|
85
|
+
folder: import("zod").ZodOptional<import("zod").ZodString>;
|
|
86
|
+
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
87
|
+
message: import("zod").ZodString;
|
|
88
|
+
}, import("zod/v4/core").$strip>, "unreal.registerFolder">, Context>;
|
|
89
|
+
export declare const forgetEngineFolderRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{
|
|
90
|
+
folder: import("zod").ZodString;
|
|
91
|
+
}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
92
|
+
message: import("zod").ZodString;
|
|
93
|
+
}, import("zod/v4/core").$strip>, "unreal.forgetFolder">, Context>;
|
|
94
|
+
export declare const openEpicLauncherRun: import("../../kernel/define.js").Implementation<import("../../kernel/define.js").OperationDef<import("zod").ZodObject<{}, import("zod/v4/core").$strip>, import("zod").ZodObject<{
|
|
95
|
+
message: import("zod").ZodString;
|
|
96
|
+
}, import("zod/v4/core").$strip>, "unreal.openLauncher">, Context>;
|