ue-mcp 1.4.11-beta.2 → 1.4.11-beta.4

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 (117) hide show
  1. package/README.md +4 -4
  2. package/dist/bridge/bridge-timeouts.js +1 -0
  3. package/dist/bridge/bridge-timeouts.js.map +1 -1
  4. package/dist/checkpoints/service.d.ts +127 -0
  5. package/dist/checkpoints/service.js +345 -0
  6. package/dist/checkpoints/service.js.map +1 -0
  7. package/dist/checkpoints/shadow-repo.d.ts +151 -0
  8. package/dist/checkpoints/shadow-repo.js +716 -0
  9. package/dist/checkpoints/shadow-repo.js.map +1 -0
  10. package/dist/checkpoints/text-diff.d.ts +10 -0
  11. package/dist/checkpoints/text-diff.js +134 -0
  12. package/dist/checkpoints/text-diff.js.map +1 -0
  13. package/dist/cli/doctor.d.ts +35 -0
  14. package/dist/cli/doctor.js +88 -7
  15. package/dist/cli/doctor.js.map +1 -1
  16. package/dist/config/project.d.ts +5 -0
  17. package/dist/config/project.js.map +1 -1
  18. package/dist/daemon/checkpoint-routes.d.ts +22 -0
  19. package/dist/daemon/checkpoint-routes.js +71 -0
  20. package/dist/daemon/checkpoint-routes.js.map +1 -0
  21. package/dist/daemon/daemon.d.ts +2 -0
  22. package/dist/daemon/daemon.js +40 -1
  23. package/dist/daemon/daemon.js.map +1 -1
  24. package/dist/daemon/extension-api.d.ts +64 -4
  25. package/dist/daemon/extension-api.js +10 -1
  26. package/dist/daemon/extension-api.js.map +1 -1
  27. package/dist/daemon/extension-install.js +3 -3
  28. package/dist/daemon/extension-install.js.map +1 -1
  29. package/dist/daemon/extensions.js +3 -3
  30. package/dist/daemon/extensions.js.map +1 -1
  31. package/dist/daemon-api.d.ts +1 -1
  32. package/dist/daemon-api.js +1 -1
  33. package/dist/daemon-api.js.map +1 -1
  34. package/dist/dispatch/offline.js +6 -0
  35. package/dist/dispatch/offline.js.map +1 -1
  36. package/dist/editor/bridge-update.d.ts +5 -1
  37. package/dist/editor/bridge-update.js +7 -3
  38. package/dist/editor/bridge-update.js.map +1 -1
  39. package/dist/flow/agent-step.d.ts +11 -0
  40. package/dist/flow/agent-step.js +38 -0
  41. package/dist/flow/agent-step.js.map +1 -0
  42. package/dist/flow/flow-inputs.d.ts +29 -0
  43. package/dist/flow/flow-inputs.js +191 -0
  44. package/dist/flow/flow-inputs.js.map +1 -0
  45. package/dist/flow/flow-tool.js +13 -2
  46. package/dist/flow/flow-tool.js.map +1 -1
  47. package/dist/flow/loader.js +3 -1
  48. package/dist/flow/loader.js.map +1 -1
  49. package/dist/flow/model-provider.d.ts +15 -0
  50. package/dist/flow/model-provider.js +121 -0
  51. package/dist/flow/model-provider.js.map +1 -0
  52. package/dist/flow/playtest.d.ts +85 -0
  53. package/dist/flow/playtest.js +313 -0
  54. package/dist/flow/playtest.js.map +1 -0
  55. package/dist/flow/registry.js +7 -0
  56. package/dist/flow/registry.js.map +1 -1
  57. package/dist/integrations/claude-code/mcp-client-config.d.ts +21 -1
  58. package/dist/integrations/claude-code/mcp-client-config.js +60 -4
  59. package/dist/integrations/claude-code/mcp-client-config.js.map +1 -1
  60. package/dist/pie/script-events.d.ts +14 -2
  61. package/dist/pie/script-events.js.map +1 -1
  62. package/dist/pie/script-watch.js +12 -0
  63. package/dist/pie/script-watch.js.map +1 -1
  64. package/dist/server/runtime.js +4 -0
  65. package/dist/server/runtime.js.map +1 -1
  66. package/dist/surface/schemas.d.ts +10 -0
  67. package/dist/surface/schemas.js +14 -0
  68. package/dist/surface/schemas.js.map +1 -1
  69. package/dist/tool-counts.json +8 -8
  70. package/dist/tools/checkpoints.d.ts +15 -0
  71. package/dist/tools/checkpoints.js +59 -0
  72. package/dist/tools/checkpoints.js.map +1 -0
  73. package/dist/tools/editor.js +4 -0
  74. package/dist/tools/editor.js.map +1 -1
  75. package/dist/tools/pie.js +5 -3
  76. package/dist/tools/pie.js.map +1 -1
  77. package/dist/tools/project/source.js +5 -0
  78. package/dist/tools/project/source.js.map +1 -1
  79. package/dist/tools/specs/editor.generated.js +57 -1
  80. package/dist/tools/specs/editor.generated.js.map +1 -1
  81. package/dist/tools/specs/pie.generated.js +84 -10
  82. package/dist/tools/specs/pie.generated.js.map +1 -1
  83. package/dist/ue-mcp.default.yml +189 -7
  84. package/package.json +6 -2
  85. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeStateFiles.cpp +2 -11
  86. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerCatalog.cpp +2 -0
  87. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Asset/AssetHandlers.cpp +6 -0
  88. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Checkpoint/CheckpointHandlers.cpp +358 -0
  89. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Checkpoint/CheckpointHandlers.h +31 -0
  90. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Diff/DiffHandlers.cpp +69 -0
  91. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Diff/DiffHandlers.h +9 -0
  92. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Editor/EditorHandlers.cpp +122 -0
  93. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Editor/EditorHandlers.h +1 -0
  94. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/Level/LevelHandlers_Save.cpp +2 -0
  95. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/MCPPIETestScript.h +16 -0
  96. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEActorPuppet.cpp +10 -3
  97. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEActorPuppet.h +5 -0
  98. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEHandlers.h +2 -0
  99. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEHandlers_Script.cpp +129 -16
  100. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEScenario.cpp +41 -37
  101. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEScenario.h +4 -0
  102. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEScriptRunner.cpp +541 -14
  103. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEScriptRunner.h +74 -4
  104. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEScriptValidation.cpp +1145 -0
  105. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEScriptValidation.h +106 -0
  106. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEStepActions.cpp +543 -0
  107. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEStepActions.h +124 -0
  108. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/PIEUatRunner.cpp +29 -463
  109. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PIE/SMCPPIEStudioPanel.cpp +2 -0
  110. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PIEScriptTests.cpp +313 -0
  111. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Tests/PIEScriptValidationTests.cpp +359 -0
  112. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +2 -0
  113. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerCheckpoint.h +32 -0
  114. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/HandlerPackageSave.h +3 -0
  115. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Private/MCPEngineStatus.cpp +13 -4
  116. package/plugin/ue_mcp_bridge/Source/UE_MCP_BridgeStatus/Public/MCPEngineStatus.h +7 -3
  117. package/plugin/ue_mcp_bridge/UE_MCP_Bridge.uplugin +2 -2
package/README.md CHANGED
@@ -8,9 +8,9 @@
8
8
  <img width="1354" height="586" alt="{6F52BA62-D736-454E-AD30-A1C98F9EEBAA}" src="https://github.com/user-attachments/assets/9380e080-c608-4609-ba21-90e6b0a3ba7f" />
9
9
 
10
10
 
11
- **Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->30<!-- /count --> category tools covering <!-- count:actions -->2100+<!-- /count --> actions, plus a YAML flow engine for multi-step workflows and an npm plugin system for extending the surface.
11
+ **Unreal Engine Model Context Protocol Server** - gives AI assistants deep read/write access to the Unreal Editor through <!-- count:tools -->30<!-- /count --> category tools covering <!-- count:actions -->2108+<!-- /count --> actions, plus a YAML flow engine for multi-step workflows and an npm plugin system for extending the surface.
12
12
 
13
- That total is <!-- count:ownActions -->1270+<!-- /count --> actions of ue-mcp's own plus Epic's entire native AI Toolset Registry: on UE 5.8+ its <!-- count:nativeToolActions -->830<!-- /count --> official Unreal tools are called in-process and surfaced as `epic_*` actions in the matching category, Sequencer in `animation`, PCG in `pcg`, static meshes in `asset`.
13
+ That total is <!-- count:ownActions -->1278+<!-- /count --> actions of ue-mcp's own plus Epic's entire native AI Toolset Registry: on UE 5.8+ its <!-- count:nativeToolActions -->830<!-- /count --> official Unreal tools are called in-process and surfaced as `epic_*` actions in the matching category, Sequencer in `animation`, PCG in `pcg`, static meshes in `asset`.
14
14
 
15
15
  ```mermaid
16
16
  flowchart LR
@@ -68,7 +68,7 @@ If you prefer to configure manually, add to your MCP client config:
68
68
  "mcpServers": {
69
69
  "ue-mcp": {
70
70
  "command": "npx",
71
- "args": ["-y", "ue-mcp@latest", "C:/path/to/MyGame.uproject"]
71
+ "args": ["-y", "--min-release-age=0", "ue-mcp@latest", "C:/path/to/MyGame.uproject"]
72
72
  }
73
73
  }
74
74
  }
@@ -142,7 +142,7 @@ flows:
142
142
  flow(action="run", flowName="build_and_check")
143
143
  ```
144
144
 
145
- Every one of the <!-- count:actions -->2100+<!-- /count --> actions is also a flow task. Flows support step references, retries, rollback, custom tasks in your own `.js`/`.ts`, and shell steps. See [Flows](https://ue-mcp.com/docs/flows/).
145
+ Every one of the <!-- count:actions -->2108+<!-- /count --> actions is also a flow task. Flows support step references, retries, rollback, custom tasks in your own `.js`/`.ts`, and shell steps. See [Flows](https://ue-mcp.com/docs/flows/).
146
146
 
147
147
  ## Plugins
148
148
 
@@ -65,6 +65,7 @@ export const REGISTERED_HANDLER_TIMEOUT_SECONDS = {
65
65
  bulk_restore_data_assets: 120,
66
66
  bulk_set_component_property: 300,
67
67
  bulk_upsert_data_assets: 120,
68
+ checkpoint_finish_restore: 300,
68
69
  compile_customizable_object: 600,
69
70
  convert_brushes_to_static_mesh: 600,
70
71
  create_cpp_class: 300,
@@ -1 +1 @@
1
- {"version":3,"file":"bridge-timeouts.js","sourceRoot":"","sources":["../../src/bridge/bridge-timeouts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge-timeouts.js","sourceRoot":"","sources":["../../src/bridge/bridge-timeouts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ import type { EditorSession } from "../sessions/session.js";
2
+ import { type ChangeEntry, type CheckpointInfo, type CheckpointTrigger, type RestoreRefusal } from "./shadow-repo.js";
3
+ export { CheckpointError } from "./shadow-repo.js";
4
+ export type { ChangeEntry, CheckpointInfo, RestoreRefusal } from "./shadow-repo.js";
5
+ export interface CheckpointState {
6
+ editor: string;
7
+ enabled: boolean;
8
+ source: "config" | "session";
9
+ configured: boolean;
10
+ repository: string | null;
11
+ checkpoints: CheckpointInfo[];
12
+ }
13
+ export interface CheckpointResult extends CheckpointInfo {
14
+ editor: string;
15
+ changes: ChangeEntry[];
16
+ dirtyPackages: string[];
17
+ editorConnected: boolean;
18
+ }
19
+ export interface ChangesResult {
20
+ editor: string;
21
+ from: string;
22
+ to: string | null;
23
+ changes: ChangeEntry[];
24
+ }
25
+ export interface RestoreResult {
26
+ editor: string;
27
+ checkpoint: string;
28
+ before: string;
29
+ after: string;
30
+ restored: Array<{
31
+ path: string;
32
+ action: "written" | "deleted";
33
+ }>;
34
+ refused: RestoreRefusal[];
35
+ reloaded: string[];
36
+ unloaded: string[];
37
+ configsReloaded: string[];
38
+ reopened: string[];
39
+ }
40
+ export type CheckpointEvent = {
41
+ type: "toggled";
42
+ data: {
43
+ editor: string;
44
+ enabled: boolean;
45
+ source: "config" | "session";
46
+ };
47
+ } | {
48
+ type: "created";
49
+ data: {
50
+ editor: string;
51
+ id: string;
52
+ label: string;
53
+ trigger: CheckpointTrigger;
54
+ files: number;
55
+ };
56
+ } | {
57
+ type: "restored";
58
+ data: {
59
+ editor: string;
60
+ checkpoint: string;
61
+ before: string;
62
+ after: string;
63
+ restored: string[];
64
+ refused: Array<{
65
+ path: string;
66
+ reason: string;
67
+ }>;
68
+ };
69
+ } | {
70
+ type: "cleared";
71
+ data: {
72
+ editor: string;
73
+ };
74
+ };
75
+ /** Every session's checkpoint events. The daemon republishes them as checkpoint.* and checkpoints.*. */
76
+ export declare function subscribeCheckpointEvents(listener: (e: CheckpointEvent) => void): () => void;
77
+ /** `on`, `true` and the object form's `enabled` read as on; anything else as off. */
78
+ export declare function configuredCheckpoints(value: unknown): {
79
+ enabled: boolean;
80
+ largeFileBytes: number;
81
+ };
82
+ export declare class SessionCheckpoints {
83
+ private readonly session;
84
+ private override;
85
+ private repoCache;
86
+ /** The generation the connected bridge records into, which a checkpoint must not fold in. */
87
+ private activeGeneration;
88
+ private warnedNoRecorder;
89
+ constructor(session: EditorSession);
90
+ private get projectDir();
91
+ private configured;
92
+ enabled(): boolean;
93
+ private repo;
94
+ private requireEnabled;
95
+ state(limit?: number): Promise<CheckpointState>;
96
+ /** The daemon's per-session override; null goes back to ue-mcp.yml. */
97
+ setEnabled(enabled: boolean | null): Promise<CheckpointState>;
98
+ /**
99
+ * Tell the connected bridge whether to record saves, and where. On means a
100
+ * fresh generation; the previous one is left for the next checkpoint.
101
+ */
102
+ private arm;
103
+ /** A bridge call that reports failure as null, warning once when the plugin predates the recorder. */
104
+ private callBridge;
105
+ /** Copy a file's bytes into the history before the server writes it. A no-op while off. */
106
+ recordBeforeWrite(file: string): void;
107
+ create(label?: string): Promise<CheckpointResult>;
108
+ private createUnlocked;
109
+ changes(from: string, to?: string | null, opts?: {
110
+ blueprintDiffs?: boolean;
111
+ }): Promise<ChangesResult>;
112
+ /** blueprint(diff) against the checkpoint, for modified Blueprint packages, run in the editor. */
113
+ private addBlueprintDiffs;
114
+ restore(checkpoint: string, opts?: {
115
+ paths?: string[];
116
+ force?: boolean;
117
+ }): Promise<RestoreResult>;
118
+ /** Delete the history. Allowed while off, which is how history kept from before is removed. */
119
+ clear(): Promise<{
120
+ editor: string;
121
+ cleared: true;
122
+ }>;
123
+ }
124
+ /** The session's checkpoints, created on first use; creating them creates nothing on disk. */
125
+ export declare function checkpointsFor(session: EditorSession): SessionCheckpoints;
126
+ /** Record a file the server is about to write, for the session a tool call runs in. */
127
+ export declare function recordBeforeWrite(session: EditorSession | undefined, file: string): void;
@@ -0,0 +1,345 @@
1
+ /**
2
+ * Checkpoints per editor session (#1482): whether they are on, the bridge's
3
+ * save recording, and the checkpoint, changes, restore and clear operations
4
+ * the editor(...) actions and the daemon routes share.
5
+ *
6
+ * Off unless `checkpoints: on` is in ue-mcp.yml or the daemon turned them on
7
+ * for the session. While off, no shadow repository is created and the bridge
8
+ * is told not to intercept saves.
9
+ *
10
+ * The bridge records from UPackage::PreSavePackageWithContextEvent into the
11
+ * pending generation it was armed with. Arming happens on every connect, and
12
+ * each checkpoint re-arms it with a fresh generation, so a checkpoint folds in
13
+ * exactly the copies made before it.
14
+ */
15
+ import * as fs from "node:fs";
16
+ import * as path from "node:path";
17
+ import { warn, info } from "../core/log.js";
18
+ import { CheckpointError, DEFAULT_LARGE_FILE_BYTES, ShadowRepo, changeKind, } from "./shadow-repo.js";
19
+ export { CheckpointError } from "./shadow-repo.js";
20
+ /** How many Blueprint packages one list_changes diffs in the editor. */
21
+ const MAX_BLUEPRINT_DIFFS = 25;
22
+ const listeners = new Set();
23
+ /** Every session's checkpoint events. The daemon republishes them as checkpoint.* and checkpoints.*. */
24
+ export function subscribeCheckpointEvents(listener) {
25
+ listeners.add(listener);
26
+ return () => listeners.delete(listener);
27
+ }
28
+ function emit(e) {
29
+ for (const l of listeners) {
30
+ try {
31
+ l(e);
32
+ }
33
+ catch (err) {
34
+ warn("checkpoints", "event listener failed", err);
35
+ }
36
+ }
37
+ }
38
+ /** `on`, `true` and the object form's `enabled` read as on; anything else as off. */
39
+ export function configuredCheckpoints(value) {
40
+ const on = (v) => v === true || v === "on";
41
+ if (value && typeof value === "object") {
42
+ const o = value;
43
+ return {
44
+ enabled: on(o.enabled),
45
+ largeFileBytes: typeof o.largeFileBytes === "number" && o.largeFileBytes > 0 ? o.largeFileBytes : DEFAULT_LARGE_FILE_BYTES,
46
+ };
47
+ }
48
+ return { enabled: on(value), largeFileBytes: DEFAULT_LARGE_FILE_BYTES };
49
+ }
50
+ export class SessionCheckpoints {
51
+ session;
52
+ override = null;
53
+ repoCache = null;
54
+ /** The generation the connected bridge records into, which a checkpoint must not fold in. */
55
+ activeGeneration = null;
56
+ warnedNoRecorder = false;
57
+ constructor(session) {
58
+ this.session = session;
59
+ session.bridge.onConnectionChanged((change) => {
60
+ if (change.connected)
61
+ void this.arm().catch((e) => warn("checkpoints", `arming ${session.name} failed`, e));
62
+ });
63
+ }
64
+ get projectDir() {
65
+ const dir = this.session.project.projectDir;
66
+ if (!dir)
67
+ throw new CheckpointError(400, "Checkpoints need a project; this session has none");
68
+ return dir;
69
+ }
70
+ configured() {
71
+ return configuredCheckpoints(this.session.project.config.checkpoints);
72
+ }
73
+ enabled() {
74
+ return this.override ?? this.configured().enabled;
75
+ }
76
+ repo() {
77
+ const dir = this.projectDir;
78
+ if (!this.repoCache || this.repoCache.projectDir !== dir) {
79
+ this.repoCache = new ShadowRepo(dir, { largeFileBytes: this.configured().largeFileBytes });
80
+ }
81
+ return this.repoCache;
82
+ }
83
+ requireEnabled() {
84
+ if (!this.enabled()) {
85
+ throw new CheckpointError(409, "Checkpoints are off for this session. Set `checkpoints: on` in ue-mcp.yml, or turn them on through the daemon (PUT /v1/checkpoints/enabled).");
86
+ }
87
+ }
88
+ async state(limit = 50) {
89
+ const configured = this.configured().enabled;
90
+ const hasProject = !!this.session.project.projectDir;
91
+ const repo = hasProject ? this.repo() : null;
92
+ return {
93
+ editor: this.session.name,
94
+ enabled: this.enabled(),
95
+ source: this.override === null ? "config" : "session",
96
+ configured,
97
+ repository: repo?.exists() ? repo.gitdir : null,
98
+ checkpoints: repo ? await repo.list(limit) : [],
99
+ };
100
+ }
101
+ /** The daemon's per-session override; null goes back to ue-mcp.yml. */
102
+ async setEnabled(enabled) {
103
+ const was = this.enabled();
104
+ this.override = enabled;
105
+ const now = this.enabled();
106
+ if (now !== was || enabled === null) {
107
+ await this.arm().catch((e) => warn("checkpoints", `arming ${this.session.name} failed`, e));
108
+ emit({ type: "toggled", data: { editor: this.session.name, enabled: now, source: this.override === null ? "config" : "session" } });
109
+ }
110
+ return this.state();
111
+ }
112
+ /**
113
+ * Tell the connected bridge whether to record saves, and where. On means a
114
+ * fresh generation; the previous one is left for the next checkpoint.
115
+ */
116
+ async arm() {
117
+ if (!this.session.bridge.isConnected || !this.session.project.projectDir)
118
+ return null;
119
+ if (!this.enabled()) {
120
+ if (this.activeGeneration === null)
121
+ return null;
122
+ this.activeGeneration = null;
123
+ await this.callBridge("checkpoint_arm", { enabled: false });
124
+ return null;
125
+ }
126
+ const repo = this.repo();
127
+ await repo.ensure();
128
+ const generation = repo.newGeneration("bridge");
129
+ const answer = await this.callBridge("checkpoint_arm", { enabled: true, pendingDir: generation, projectDir: repo.projectDir });
130
+ if (!answer) {
131
+ fs.rmSync(generation, { recursive: true, force: true });
132
+ this.activeGeneration = null;
133
+ return null;
134
+ }
135
+ this.activeGeneration = generation;
136
+ const dirty = Array.isArray(answer.dirtyPackages) ? answer.dirtyPackages.map(String) : [];
137
+ return { dirtyPackages: dirty };
138
+ }
139
+ /** A bridge call that reports failure as null, warning once when the plugin predates the recorder. */
140
+ async callBridge(method, params) {
141
+ try {
142
+ const r = (await this.session.bridge.call(method, params));
143
+ if (r && r.success === false) {
144
+ if (method !== "checkpoint_arm")
145
+ throw new CheckpointError(409, String(r.error ?? `${method} failed`));
146
+ warn("checkpoints", `${method}: ${String(r.error ?? "failed")}`);
147
+ return null;
148
+ }
149
+ return r ?? {};
150
+ }
151
+ catch (e) {
152
+ if (e instanceof CheckpointError)
153
+ throw e;
154
+ const message = e instanceof Error ? e.message : String(e);
155
+ if (/unknown method/i.test(message)) {
156
+ if (!this.warnedNoRecorder) {
157
+ this.warnedNoRecorder = true;
158
+ warn("checkpoints", `The editor's bridge plugin predates checkpoints (${method}); package saves are not recorded until it is updated.`);
159
+ }
160
+ return null;
161
+ }
162
+ if (method === "checkpoint_arm") {
163
+ warn("checkpoints", `${method} failed`, e);
164
+ return null;
165
+ }
166
+ throw e;
167
+ }
168
+ }
169
+ /** Copy a file's bytes into the history before the server writes it. A no-op while off. */
170
+ recordBeforeWrite(file) {
171
+ if (!this.enabled() || !this.session.project.projectDir)
172
+ return;
173
+ try {
174
+ this.repo().recordBeforeWrite(file);
175
+ }
176
+ catch (e) {
177
+ warn("checkpoints", `could not record ${file} before writing it`, e);
178
+ }
179
+ }
180
+ create(label) {
181
+ this.requireEnabled();
182
+ return this.repo().serialize(() => this.createUnlocked(label ?? "", "client"));
183
+ }
184
+ async createUnlocked(label, trigger, expected) {
185
+ const repo = this.repo();
186
+ // Re-arm first, so every save before this point is in a generation this checkpoint folds in.
187
+ const armed = await this.arm();
188
+ const connected = armed !== null;
189
+ const out = await repo.checkpoint({
190
+ label,
191
+ trigger,
192
+ activeGeneration: connected ? this.activeGeneration : null,
193
+ expected,
194
+ });
195
+ emit({ type: "created", data: { editor: this.session.name, id: out.info.id, label: out.info.label, trigger, files: out.info.files } });
196
+ return {
197
+ ...out.info,
198
+ editor: this.session.name,
199
+ changes: out.changes,
200
+ dirtyPackages: armed?.dirtyPackages ?? [],
201
+ editorConnected: connected,
202
+ };
203
+ }
204
+ async changes(from, to, opts = {}) {
205
+ if (!from)
206
+ throw new CheckpointError(400, "from is required: the checkpoint id to compare against");
207
+ const repo = this.repo();
208
+ return repo.serialize(async () => {
209
+ const result = await repo.changes(from, to ?? null);
210
+ if (opts.blueprintDiffs !== false && this.session.bridge.isConnected)
211
+ await this.addBlueprintDiffs(result);
212
+ return { editor: this.session.name, ...result };
213
+ });
214
+ }
215
+ /** blueprint(diff) against the checkpoint, for modified Blueprint packages, run in the editor. */
216
+ async addBlueprintDiffs(result) {
217
+ const repo = this.repo();
218
+ const candidates = result.changes
219
+ .filter((c) => c.status === "modified" && !c.large && c.path.toLowerCase().endsWith(".uasset"))
220
+ .slice(0, MAX_BLUEPRINT_DIFFS);
221
+ // Saved/Diff maps to /Temp, which is where the editor loads a package for diffing.
222
+ const tempDir = path.join(this.projectDir, "Saved", "Diff", "UE_MCP_Checkpoints");
223
+ for (const c of candidates) {
224
+ const base = path.basename(c.path, path.extname(c.path));
225
+ const fromFile = path.join(tempDir, `${base}-${result.from.slice(0, 10)}.uasset`);
226
+ const toFile = result.to ? path.join(tempDir, `${base}-${result.to.slice(0, 10)}.uasset`) : null;
227
+ try {
228
+ if (!(await repo.exportAt(result.from, c.path, fromFile)))
229
+ continue;
230
+ if (toFile && !(await repo.exportAt(result.to, c.path, toFile)))
231
+ continue;
232
+ const answer = await this.callBridge("checkpoint_diff_blueprint", {
233
+ originalFile: path.join(this.projectDir, c.path),
234
+ fromFile,
235
+ ...(toFile ? { toFile } : {}),
236
+ });
237
+ if (answer && answer.isBlueprint === true) {
238
+ const { success: _s, isBlueprint: _b, ...diff } = answer;
239
+ c.blueprintDiff = diff;
240
+ }
241
+ }
242
+ catch (e) {
243
+ warn("checkpoints", `blueprint diff of ${c.path} failed`, e);
244
+ }
245
+ finally {
246
+ fs.rmSync(fromFile, { force: true });
247
+ if (toFile)
248
+ fs.rmSync(toFile, { force: true });
249
+ }
250
+ }
251
+ }
252
+ restore(checkpoint, opts = {}) {
253
+ this.requireEnabled();
254
+ if (!checkpoint)
255
+ throw new CheckpointError(400, "checkpoint is required: the id to restore to");
256
+ const repo = this.repo();
257
+ return repo.serialize(async () => {
258
+ const connected = this.session.bridge.isConnected;
259
+ // Refuse during PIE before anything is recorded or written.
260
+ if (connected)
261
+ await this.callBridge("checkpoint_prepare_restore", { files: [], checkOnly: true });
262
+ const needle = checkpoint.trim().toLowerCase();
263
+ const matches = (await repo.list(Number.MAX_SAFE_INTEGER)).filter((c) => c.id.startsWith(needle));
264
+ if (matches.length !== 1) {
265
+ throw new CheckpointError(400, matches.length === 0 ? `No checkpoint '${checkpoint}' in this project's history` : `'${checkpoint}' matches ${matches.length} checkpoints; give more of the id`);
266
+ }
267
+ const target = matches[0];
268
+ const before = await this.createUnlocked(`before restore to ${target.label}`, "restore-before");
269
+ const { plan, refused } = await repo.planRestore(target.id, before.id, opts.paths, opts.force === true);
270
+ const prepared = connected && plan.length > 0
271
+ ? await this.callBridge("checkpoint_prepare_restore", { files: plan.map((p) => p.file) })
272
+ : null;
273
+ const restored = [];
274
+ for (const entry of plan) {
275
+ try {
276
+ restored.push({ path: entry.path, action: await repo.apply(entry) });
277
+ }
278
+ catch (e) {
279
+ refused.push({ path: entry.path, reason: "write-failed", detail: e instanceof Error ? e.message : String(e) });
280
+ }
281
+ }
282
+ const finished = connected && plan.length > 0
283
+ ? await this.callBridge("checkpoint_finish_restore", {
284
+ files: restored.map((r) => ({ file: path.join(repo.projectDir, r.path), exists: r.action === "written", kind: changeKind(r.path) })),
285
+ reopen: Array.isArray(prepared?.closedEditors) ? prepared.closedEditors : [],
286
+ })
287
+ : null;
288
+ const after = await this.createUnlocked(`restored to ${target.label}`, "restore-after", restored.map((r) => r.path));
289
+ const strings = (v) => (Array.isArray(v) ? v.map(String) : []);
290
+ const result = {
291
+ editor: this.session.name,
292
+ checkpoint: target.id,
293
+ before: before.id,
294
+ after: after.id,
295
+ restored,
296
+ refused,
297
+ reloaded: strings(finished?.reloaded),
298
+ unloaded: strings(finished?.unloaded),
299
+ configsReloaded: strings(finished?.configsReloaded),
300
+ reopened: strings(finished?.reopened),
301
+ };
302
+ emit({
303
+ type: "restored",
304
+ data: {
305
+ editor: this.session.name,
306
+ checkpoint: result.checkpoint,
307
+ before: result.before,
308
+ after: result.after,
309
+ restored: restored.map((r) => r.path),
310
+ refused: refused.map((r) => ({ path: r.path, reason: r.reason })),
311
+ },
312
+ });
313
+ info("checkpoints", `${this.session.name}: restored ${restored.length} path(s) to ${result.checkpoint.slice(0, 10)}, refused ${refused.length}`);
314
+ return result;
315
+ });
316
+ }
317
+ /** Delete the history. Allowed while off, which is how history kept from before is removed. */
318
+ async clear() {
319
+ const repo = this.repo();
320
+ await repo.serialize(async () => {
321
+ repo.clear();
322
+ this.activeGeneration = null;
323
+ if (this.enabled())
324
+ await this.arm().catch((e) => warn("checkpoints", "re-arming after clear failed", e));
325
+ });
326
+ emit({ type: "cleared", data: { editor: this.session.name } });
327
+ return { editor: this.session.name, cleared: true };
328
+ }
329
+ }
330
+ const bySession = new WeakMap();
331
+ /** The session's checkpoints, created on first use; creating them creates nothing on disk. */
332
+ export function checkpointsFor(session) {
333
+ let c = bySession.get(session);
334
+ if (!c) {
335
+ c = new SessionCheckpoints(session);
336
+ bySession.set(session, c);
337
+ }
338
+ return c;
339
+ }
340
+ /** Record a file the server is about to write, for the session a tool call runs in. */
341
+ export function recordBeforeWrite(session, file) {
342
+ if (session)
343
+ checkpointsFor(session).recordBeforeWrite(file);
344
+ }
345
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/checkpoints/service.ts"],"names":[],"mappings":"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"}