mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-27 11:03:27 +01:00
fix(runner): restore externally owned session state
This commit is contained in:
1 parent
c03733207e
commit
50d5ecea39
2 files changed
+23
-3
No files matched your search
@@ -1,4 +1,4 @@
|
||||
import { mkdir, mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises";
|
||||
import { mkdir, mkdtemp, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
||||
import { createHash } from "node:crypto";
|
||||
import { tmpdir } from "node:os";
|
||||
import { join, resolve } from "node:path";
|
||||
@@ -993,8 +993,27 @@ it("cold-restores a suspended provider session under a new run binding", async (
|
||||
await first.transport.close();
|
||||
}
|
||||
|
||||
// A remote process owner keeps runner-state outside the controller's local
|
||||
// session root. Resume must defer to its explicit state reader instead of
|
||||
// rejecting recovery before the remote checkpoint can be made available.
|
||||
const externallyOwnedRunnerStateDirectory = join(
|
||||
stateDirectory,
|
||||
"externally-owned-runner",
|
||||
);
|
||||
await rename(
|
||||
join(stateDirectory, "runner"),
|
||||
externallyOwnedRunnerStateDirectory,
|
||||
);
|
||||
const restored = createCapabilityRunnerdCodexTransport({
|
||||
...options,
|
||||
runnerStateDirectory: externallyOwnedRunnerStateDirectory,
|
||||
readRunnerState: async () =>
|
||||
JSON.parse(
|
||||
await readFile(
|
||||
join(externallyOwnedRunnerStateDirectory, "runner-state.json"),
|
||||
"utf8",
|
||||
),
|
||||
) as Record<string, unknown>,
|
||||
resumeDynamicTools: dynamicTools,
|
||||
prpIdentity: {
|
||||
...baseIdentity,
|
||||
@@ -1014,7 +1033,7 @@ it("cold-restores a suspended provider session under a new run binding", async (
|
||||
expect((await stat(join(stateDirectory, "codex-home", "skills", "assigned", "SKILL.md"))).mode & 0o222).toBe(0);
|
||||
const durable = JSON.parse(
|
||||
await readFile(
|
||||
join(stateDirectory, "runner", "runner-state.json"),
|
||||
join(externallyOwnedRunnerStateDirectory, "runner-state.json"),
|
||||
"utf8",
|
||||
),
|
||||
) as { providerToolBridge?: { authorized?: Record<string, unknown> } };
|
||||
|
||||
@@ -1666,7 +1666,8 @@ class DurablePrpCodexTransport implements CodexAppServerTransport {
|
||||
const desiredIdentity = this.options.prpIdentity;
|
||||
if (
|
||||
desiredIdentity === undefined ||
|
||||
!existsSync(resolve(this.#root, "runner", "runner-state.json"))
|
||||
(this.options.readRunnerState === undefined &&
|
||||
!existsSync(resolve(this.#root, "runner", "runner-state.json")))
|
||||
) {
|
||||
throw new Error("PRP provider resume state is unavailable");
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user