@undefineds.co/xpod 0.3.6 → 0.3.14
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/cli.json +1 -1
- package/config/cloud.json +54 -22
- package/config/local.json +56 -12
- package/config/resolver.json +10 -2
- package/config/xpod.base.json +50 -0
- package/config/xpod.json +8 -8
- package/dist/agents/config/resolve.js +10 -10
- package/dist/agents/config/resolve.js.map +1 -1
- package/dist/api/chatkit/index.d.ts +1 -1
- package/dist/api/chatkit/index.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +14 -11
- package/dist/api/chatkit/pod-store.js +114 -78
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
- package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
- package/dist/api/chatkit/service.js +1 -1
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +11 -11
- package/dist/api/chatkit/types.js +3 -3
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/cloud.js +0 -8
- package/dist/api/container/cloud.js.map +1 -1
- package/dist/api/container/index.js +2 -1
- package/dist/api/container/index.js.map +1 -1
- package/dist/api/container/local.js +0 -7
- package/dist/api/container/local.js.map +1 -1
- package/dist/api/container/routes.js +3 -17
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +0 -2
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
- package/dist/api/handlers/PodManagementHandler.js +71 -1
- package/dist/api/handlers/PodManagementHandler.js.map +1 -1
- package/dist/api/handlers/RunHandler.js +5 -5
- package/dist/api/handlers/RunHandler.js.map +1 -1
- package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
- package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
- package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
- package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
- package/dist/api/runs/ManagedRunWorker.js +6 -6
- package/dist/api/runs/ManagedRunWorker.js.map +1 -1
- package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
- package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
- package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
- package/dist/api/runs/RunStateCenter.d.ts +3 -3
- package/dist/api/runs/RunStateCenter.js +13 -13
- package/dist/api/runs/RunStateCenter.js.map +1 -1
- package/dist/api/runs/store.d.ts +4 -4
- package/dist/api/runs/store.js +2 -2
- package/dist/api/runs/store.js.map +1 -1
- package/dist/api/service/VectorStoreService.d.ts +1 -1
- package/dist/api/service/VectorStoreService.js +16 -16
- package/dist/api/service/VectorStoreService.js.map +1 -1
- package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
- package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
- package/dist/api/tasks/TaskMaterializer.js +11 -11
- package/dist/api/tasks/TaskMaterializer.js.map +1 -1
- package/dist/api/tasks/TaskService.d.ts +3 -3
- package/dist/api/tasks/TaskService.js +11 -7
- package/dist/api/tasks/TaskService.js.map +1 -1
- package/dist/api/tasks/store.d.ts +10 -4
- package/dist/api/tasks/store.js +14 -4
- package/dist/api/tasks/store.js.map +1 -1
- package/dist/api/workspace/types.d.ts +3 -3
- package/dist/api/workspace/types.js +6 -6
- package/dist/api/workspace/types.js.map +1 -1
- package/dist/cli/commands/config.js +2 -2
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/start.js +9 -3
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/components/components.jsonld +8 -2
- package/dist/components/context.jsonld +302 -51
- package/dist/http/search/SearchHttpHandler.js +8 -8
- package/dist/http/search/SearchHttpHandler.js.map +1 -1
- package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
- package/dist/identity/drizzle/PodLookupRepository.js +95 -4
- package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
- package/dist/identity/drizzle/db.js +4 -43
- package/dist/identity/drizzle/db.js.map +1 -1
- package/dist/identity/drizzle/schema.pg.d.ts +0 -5
- package/dist/identity/drizzle/schema.pg.js +2 -16
- package/dist/identity/drizzle/schema.pg.js.map +1 -1
- package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
- package/dist/identity/drizzle/schema.sqlite.js +2 -16
- package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
- package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
- package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
- package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
- package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
- package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
- package/dist/index.d.ts +12 -2
- package/dist/index.js +16 -4
- package/dist/index.js.map +1 -1
- package/dist/main.js +8 -2
- package/dist/main.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.d.ts +3 -4
- package/dist/provision/ProvisionPodCreator.js +8 -13
- package/dist/provision/ProvisionPodCreator.js.map +1 -1
- package/dist/provision/ProvisionPodCreator.jsonld +7 -7
- package/dist/runtime/Proxy.d.ts +0 -1
- package/dist/runtime/Proxy.js +0 -9
- package/dist/runtime/Proxy.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts +1 -0
- package/dist/runtime/bootstrap.js +5 -2
- package/dist/runtime/bootstrap.js.map +1 -1
- package/dist/runtime/css-process.d.ts +12 -4
- package/dist/runtime/css-process.js +61 -14
- package/dist/runtime/css-process.js.map +1 -1
- package/dist/runtime/oidc-issuer.d.ts +3 -2
- package/dist/runtime/oidc-issuer.js +3 -2
- package/dist/runtime/oidc-issuer.js.map +1 -1
- package/dist/runtime/runtime-types.d.ts +1 -0
- package/dist/runtime/runtime-types.js.map +1 -1
- package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
- package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
- package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
- package/dist/solidfs/LocalSolidFS.d.ts +18 -0
- package/dist/solidfs/LocalSolidFS.js +539 -0
- package/dist/solidfs/LocalSolidFS.js.map +1 -0
- package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
- package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
- package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
- package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
- package/dist/solidfs/PodSolidFsHydrator.js +127 -0
- package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
- package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
- package/dist/solidfs/PodSolidFsSyncer.js +78 -0
- package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
- package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
- package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
- package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
- package/dist/solidfs/index.d.ts +7 -0
- package/dist/solidfs/index.js +24 -0
- package/dist/solidfs/index.js.map +1 -0
- package/dist/solidfs/types.d.ts +131 -0
- package/dist/solidfs/types.js +19 -0
- package/dist/solidfs/types.js.map +1 -0
- package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
- package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
- package/dist/storage/SparqlUpdateResourceStore.js +13 -0
- package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
- package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
- package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
- package/dist/storage/accessors/MixDataAccessor.js +511 -16
- package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
- package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
- package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
- package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
- package/dist/storage/quint/BaseQuintStore.js +51 -27
- package/dist/storage/quint/BaseQuintStore.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.d.ts +1 -0
- package/dist/storage/quint/PgQuintStore.js +50 -32
- package/dist/storage/quint/PgQuintStore.js.map +1 -1
- package/dist/storage/quint/PgQuintStore.jsonld +4 -3
- package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
- package/dist/storage/quint/SqliteQuintStore.js +100 -0
- package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
- package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
- package/dist/storage/quint/types.d.ts +16 -0
- package/dist/storage/quint/types.js.map +1 -1
- package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
- package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
- package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
- package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
- package/dist/storage/rdf/RdfContentTypes.js +79 -0
- package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +76 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.js +2636 -0
- package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
- package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
- package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
- package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
- package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
- package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
- package/dist/storage/rdf/RdfShadowComparator.js +47 -0
- package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
- package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
- package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
- package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
- package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
- package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
- package/dist/storage/rdf/RdfTermDictionary.js +352 -0
- package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
- package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
- package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
- package/dist/storage/rdf/RdfTermSemantics.js +40 -0
- package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
- package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
- package/dist/storage/rdf/RdfTextIndex.js +569 -0
- package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
- package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
- package/dist/storage/rdf/RdfVectorIndex.js +631 -0
- package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
- package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
- package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
- package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
- package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
- package/dist/storage/rdf/SolidRdfEngine.d.ts +51 -0
- package/dist/storage/rdf/SolidRdfEngine.js +264 -0
- package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
- package/dist/storage/rdf/SolidRdfEngine.jsonld +338 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
- package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
- package/dist/storage/rdf/index.d.ts +15 -0
- package/dist/storage/rdf/index.js +61 -0
- package/dist/storage/rdf/index.js.map +1 -0
- package/dist/storage/rdf/models-benchmark.d.ts +260 -0
- package/dist/storage/rdf/models-benchmark.js +1405 -0
- package/dist/storage/rdf/models-benchmark.js.map +1 -0
- package/dist/storage/rdf/types.d.ts +726 -0
- package/dist/storage/rdf/types.js +3 -0
- package/dist/storage/rdf/types.js.map +1 -0
- package/dist/storage/rdf/types.jsonld +316 -0
- package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
- package/dist/storage/vector/VectorIndexingListener.js +19 -19
- package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
- package/package.json +3 -2
- package/templates/pod/acp/.acr.hbs +39 -0
- package/templates/pod/acp/README.acr +18 -0
- package/templates/pod/acp/profile/card.acr +22 -0
- package/templates/pod/base/README$.md.hbs +27 -0
- package/templates/pod/base/profile/card$.ttl.hbs +13 -0
- package/templates/pod/wac/.acl.hbs +26 -0
- package/templates/pod/wac/README.acl.hbs +14 -0
- package/templates/pod/wac/profile/card.acl.hbs +19 -0
- package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
- package/dist/api/handlers/WebIdProfileHandler.js +0 -423
- package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
- package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
- package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
- package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
- package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
- package/dist/storage/quint/BaseQuintStore.jsonld +0 -257
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SolidFS, type SolidFsProjection } from '../../solidfs';
|
|
1
2
|
import type { AgentRuntimeEvent } from './AgentRuntimeTypes';
|
|
2
3
|
import type { RunExecutionBackend, RunExecutionInput } from './RunExecutionBackend';
|
|
3
4
|
type PiSdk = typeof import('@mariozechner/pi-coding-agent');
|
|
@@ -22,6 +23,8 @@ export interface PiAgentRuntimeDriverOptions {
|
|
|
22
23
|
*/
|
|
23
24
|
persistPiSessions?: boolean;
|
|
24
25
|
piSdk?: PiSdk;
|
|
26
|
+
solidfs?: SolidFS;
|
|
27
|
+
solidfsProjection?: SolidFsProjection;
|
|
25
28
|
}
|
|
26
29
|
/**
|
|
27
30
|
* Request-scoped adapter around pi's AgentSession primitives.
|
|
@@ -35,6 +38,7 @@ export declare class PiAgentRuntimeDriver implements RunExecutionBackend {
|
|
|
35
38
|
private static sdkPromise?;
|
|
36
39
|
private readonly git;
|
|
37
40
|
private readonly warmRuntimes;
|
|
41
|
+
private readonly solidfs;
|
|
38
42
|
constructor(options?: PiAgentRuntimeDriverOptions);
|
|
39
43
|
start(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent>;
|
|
40
44
|
private startInProcess;
|
|
@@ -47,10 +51,20 @@ export declare class PiAgentRuntimeDriver implements RunExecutionBackend {
|
|
|
47
51
|
private resolveTools;
|
|
48
52
|
private getWarmRuntime;
|
|
49
53
|
private createWarmRuntime;
|
|
54
|
+
private createSolidFsCodingTools;
|
|
55
|
+
private createSolidFsReadOnlyTools;
|
|
56
|
+
private createSolidFsReadOperations;
|
|
57
|
+
private createSolidFsEditOperations;
|
|
58
|
+
private createSolidFsWriteOperations;
|
|
59
|
+
private ensureSolidFsWritablePath;
|
|
60
|
+
private ensureSolidFsPath;
|
|
61
|
+
private canHydrateWorkspace;
|
|
62
|
+
private detectImageMimeType;
|
|
50
63
|
private warmRuntimeKey;
|
|
51
64
|
private hashSecret;
|
|
52
65
|
private toPiMessages;
|
|
53
|
-
private
|
|
66
|
+
private prepareWorkspace;
|
|
67
|
+
private resolveWorkspaceSource;
|
|
54
68
|
private canResolveFileWorkspace;
|
|
55
69
|
private mapPodUrlToLocalPath;
|
|
56
70
|
private createSessionManager;
|
|
@@ -60,6 +74,7 @@ export declare class PiAgentRuntimeDriver implements RunExecutionBackend {
|
|
|
60
74
|
private extractText;
|
|
61
75
|
private formatError;
|
|
62
76
|
private startupErrorToEvent;
|
|
77
|
+
private logWorkspaceRollbackError;
|
|
63
78
|
private loadPiSdk;
|
|
64
79
|
}
|
|
65
80
|
export declare const PI_AGENT_WORKER_EVENT_PREFIX = "XPOD_AGENT_EVENT ";
|
|
@@ -33,6 +33,7 @@ const provider_registry_1 = require("../service/provider-registry");
|
|
|
33
33
|
const platform_ai_config_1 = require("../service/platform-ai-config");
|
|
34
34
|
const GitWorktreeService_1 = require("../chatkit/runtime/GitWorktreeService");
|
|
35
35
|
const sandbox_1 = require("../../terminal/sandbox");
|
|
36
|
+
const solidfs_1 = require("../../solidfs");
|
|
36
37
|
/**
|
|
37
38
|
* Request-scoped adapter around pi's AgentSession primitives.
|
|
38
39
|
*
|
|
@@ -45,20 +46,38 @@ class PiAgentRuntimeDriver {
|
|
|
45
46
|
this.options = options;
|
|
46
47
|
this.git = new GitWorktreeService_1.GitWorktreeService();
|
|
47
48
|
this.warmRuntimes = new Map();
|
|
49
|
+
this.solidfs = options.solidfs ?? new solidfs_1.LocalSolidFS({
|
|
50
|
+
syncer: new solidfs_1.PodSolidFsSyncer(),
|
|
51
|
+
hydrator: new solidfs_1.PodSolidFsHydrator(),
|
|
52
|
+
});
|
|
48
53
|
}
|
|
49
54
|
async *start(input) {
|
|
50
55
|
if (this.options.agentLoopIsolation === 'sandboxed-process') {
|
|
56
|
+
let workspace;
|
|
57
|
+
let completed = false;
|
|
51
58
|
try {
|
|
52
|
-
|
|
59
|
+
workspace = await this.prepareWorkspace(input);
|
|
53
60
|
const runner = this.options.sandboxedLoopRunner
|
|
54
61
|
?? ((runInput, runWorkdir) => this.startSandboxedAgentLoop(runInput, runWorkdir));
|
|
55
|
-
for await (const event of runner(input,
|
|
62
|
+
for await (const event of runner(input, workspace.cwd)) {
|
|
56
63
|
yield event;
|
|
64
|
+
if (event.type === 'error') {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
57
67
|
}
|
|
68
|
+
await workspace.commit();
|
|
69
|
+
completed = true;
|
|
58
70
|
}
|
|
59
71
|
catch (error) {
|
|
60
72
|
yield this.startupErrorToEvent(error);
|
|
61
73
|
}
|
|
74
|
+
finally {
|
|
75
|
+
if (!completed) {
|
|
76
|
+
await workspace?.rollback().catch((error) => {
|
|
77
|
+
this.logWorkspaceRollbackError(error);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
62
81
|
return;
|
|
63
82
|
}
|
|
64
83
|
yield* this.startInProcess(input);
|
|
@@ -66,8 +85,12 @@ class PiAgentRuntimeDriver {
|
|
|
66
85
|
async *startInProcess(input) {
|
|
67
86
|
const queue = new AsyncPushQueue();
|
|
68
87
|
let session;
|
|
88
|
+
let workspace;
|
|
89
|
+
let completed = false;
|
|
90
|
+
let failed = false;
|
|
69
91
|
try {
|
|
70
|
-
|
|
92
|
+
workspace = await this.prepareWorkspace(input);
|
|
93
|
+
const runtime = await this.getWarmRuntime(input, workspace);
|
|
71
94
|
const sessionManager = this.createSessionManager(runtime.pi, input.runId, runtime.workdir);
|
|
72
95
|
const result = await runtime.pi.createAgentSession({
|
|
73
96
|
cwd: runtime.workdir,
|
|
@@ -102,13 +125,27 @@ class PiAgentRuntimeDriver {
|
|
|
102
125
|
session?.dispose();
|
|
103
126
|
});
|
|
104
127
|
for await (const event of queue.iterate()) {
|
|
128
|
+
if (event.type === 'error') {
|
|
129
|
+
failed = true;
|
|
130
|
+
}
|
|
105
131
|
yield event;
|
|
106
132
|
}
|
|
133
|
+
if (!failed) {
|
|
134
|
+
await workspace.commit();
|
|
135
|
+
completed = true;
|
|
136
|
+
}
|
|
107
137
|
}
|
|
108
138
|
catch (error) {
|
|
109
139
|
session?.dispose();
|
|
110
140
|
yield this.startupErrorToEvent(error);
|
|
111
141
|
}
|
|
142
|
+
finally {
|
|
143
|
+
if (!completed) {
|
|
144
|
+
await workspace?.rollback().catch((error) => {
|
|
145
|
+
this.logWorkspaceRollbackError(error);
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
112
149
|
}
|
|
113
150
|
startSandboxedAgentLoop(input, workdir) {
|
|
114
151
|
const queue = new AsyncPushQueue();
|
|
@@ -288,13 +325,14 @@ class PiAgentRuntimeDriver {
|
|
|
288
325
|
? level
|
|
289
326
|
: 'off';
|
|
290
327
|
}
|
|
291
|
-
resolveTools(pi,
|
|
328
|
+
resolveTools(pi, workspace, config) {
|
|
329
|
+
const workdir = workspace.cwd;
|
|
292
330
|
const permissionMode = config.agentConfig?.permissionMode;
|
|
293
331
|
const allowed = new Set(config.agentConfig?.allowedTools?.map((tool) => tool.toLowerCase()) ?? []);
|
|
294
332
|
const disallowed = new Set(config.agentConfig?.disallowedTools?.map((tool) => tool.toLowerCase()) ?? []);
|
|
295
333
|
const baseTools = permissionMode === 'plan' || allowed.size > 0
|
|
296
|
-
?
|
|
297
|
-
:
|
|
334
|
+
? this.createSolidFsReadOnlyTools(pi, workspace)
|
|
335
|
+
: this.createSolidFsCodingTools(pi, workspace);
|
|
298
336
|
return baseTools.filter((tool) => {
|
|
299
337
|
const name = tool.name.toLowerCase();
|
|
300
338
|
if (disallowed.has(name)) {
|
|
@@ -303,22 +341,23 @@ class PiAgentRuntimeDriver {
|
|
|
303
341
|
return allowed.size === 0 || allowed.has(name);
|
|
304
342
|
});
|
|
305
343
|
}
|
|
306
|
-
async getWarmRuntime(input) {
|
|
344
|
+
async getWarmRuntime(input, workspace) {
|
|
307
345
|
const pi = await this.loadPiSdk();
|
|
308
|
-
const workdir =
|
|
346
|
+
const workdir = workspace.cwd;
|
|
309
347
|
const key = this.warmRuntimeKey(workdir, input.config);
|
|
310
348
|
const existing = this.warmRuntimes.get(key);
|
|
311
349
|
if (existing) {
|
|
312
350
|
return existing;
|
|
313
351
|
}
|
|
314
|
-
const created = this.createWarmRuntime(pi,
|
|
352
|
+
const created = this.createWarmRuntime(pi, workspace, input.config).catch((error) => {
|
|
315
353
|
this.warmRuntimes.delete(key);
|
|
316
354
|
throw error;
|
|
317
355
|
});
|
|
318
356
|
this.warmRuntimes.set(key, created);
|
|
319
357
|
return created;
|
|
320
358
|
}
|
|
321
|
-
async createWarmRuntime(pi,
|
|
359
|
+
async createWarmRuntime(pi, workspace, config) {
|
|
360
|
+
const workdir = workspace.cwd;
|
|
322
361
|
const piConfig = this.resolvePiConfig(config);
|
|
323
362
|
const authStorage = pi.AuthStorage.inMemory();
|
|
324
363
|
authStorage.setRuntimeApiKey(piConfig.provider, piConfig.apiKey);
|
|
@@ -355,9 +394,110 @@ class PiAgentRuntimeDriver {
|
|
|
355
394
|
modelRegistry,
|
|
356
395
|
settingsManager,
|
|
357
396
|
resourceLoader,
|
|
358
|
-
tools: this.resolveTools(pi,
|
|
397
|
+
tools: this.resolveTools(pi, workspace, config),
|
|
359
398
|
};
|
|
360
399
|
}
|
|
400
|
+
createSolidFsCodingTools(pi, workspace) {
|
|
401
|
+
if (!this.canHydrateWorkspace(workspace)) {
|
|
402
|
+
return pi.createCodingTools(workspace.cwd);
|
|
403
|
+
}
|
|
404
|
+
return [
|
|
405
|
+
pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }),
|
|
406
|
+
pi.createBashTool(workspace.cwd),
|
|
407
|
+
pi.createEditTool(workspace.cwd, { operations: this.createSolidFsEditOperations(workspace) }),
|
|
408
|
+
pi.createWriteTool(workspace.cwd, { operations: this.createSolidFsWriteOperations(workspace) }),
|
|
409
|
+
];
|
|
410
|
+
}
|
|
411
|
+
createSolidFsReadOnlyTools(pi, workspace) {
|
|
412
|
+
if (!this.canHydrateWorkspace(workspace)) {
|
|
413
|
+
return pi.createReadOnlyTools(workspace.cwd);
|
|
414
|
+
}
|
|
415
|
+
return [
|
|
416
|
+
pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }),
|
|
417
|
+
...pi.createReadOnlyTools(workspace.cwd).filter((tool) => tool.name !== 'read'),
|
|
418
|
+
];
|
|
419
|
+
}
|
|
420
|
+
createSolidFsReadOperations(workspace) {
|
|
421
|
+
return {
|
|
422
|
+
readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),
|
|
423
|
+
access: async (absolutePath) => {
|
|
424
|
+
await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK);
|
|
425
|
+
},
|
|
426
|
+
detectImageMimeType: async (absolutePath) => this.detectImageMimeType(await this.ensureSolidFsPath(workspace, absolutePath)),
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
createSolidFsEditOperations(workspace) {
|
|
430
|
+
return {
|
|
431
|
+
readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),
|
|
432
|
+
writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),
|
|
433
|
+
access: async (absolutePath) => {
|
|
434
|
+
await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK | fs.constants.W_OK);
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
createSolidFsWriteOperations(workspace) {
|
|
439
|
+
return {
|
|
440
|
+
writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),
|
|
441
|
+
mkdir: (dir) => fs.promises.mkdir(dir, { recursive: true }).then(() => undefined),
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
async ensureSolidFsWritablePath(workspace, absolutePath) {
|
|
445
|
+
try {
|
|
446
|
+
return await this.ensureSolidFsPath(workspace, absolutePath);
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
if (error instanceof solidfs_1.SolidFsNotFoundError) {
|
|
450
|
+
return path.resolve(absolutePath);
|
|
451
|
+
}
|
|
452
|
+
throw error;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
async ensureSolidFsPath(workspace, absolutePath) {
|
|
456
|
+
if (!this.canHydrateWorkspace(workspace)) {
|
|
457
|
+
return absolutePath;
|
|
458
|
+
}
|
|
459
|
+
const resolved = path.resolve(absolutePath);
|
|
460
|
+
const root = path.resolve(workspace.cwd);
|
|
461
|
+
if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {
|
|
462
|
+
return absolutePath;
|
|
463
|
+
}
|
|
464
|
+
try {
|
|
465
|
+
await fs.promises.access(resolved, fs.constants.F_OK);
|
|
466
|
+
return resolved;
|
|
467
|
+
}
|
|
468
|
+
catch {
|
|
469
|
+
const relativePath = path.relative(root, resolved);
|
|
470
|
+
await workspace.hydrate(relativePath);
|
|
471
|
+
return resolved;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
canHydrateWorkspace(workspace) {
|
|
475
|
+
return workspace.manifest.projection === 'hydrated-object' && typeof workspace.hydrate === 'function';
|
|
476
|
+
}
|
|
477
|
+
async detectImageMimeType(absolutePath) {
|
|
478
|
+
const handle = await fs.promises.open(absolutePath, 'r');
|
|
479
|
+
try {
|
|
480
|
+
const buffer = Buffer.alloc(12);
|
|
481
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
482
|
+
const header = buffer.subarray(0, bytesRead);
|
|
483
|
+
if (header.subarray(0, 3).equals(Buffer.from([0xff, 0xd8, 0xff]))) {
|
|
484
|
+
return 'image/jpeg';
|
|
485
|
+
}
|
|
486
|
+
if (header.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {
|
|
487
|
+
return 'image/png';
|
|
488
|
+
}
|
|
489
|
+
if (header.subarray(0, 6).toString('ascii') === 'GIF87a' || header.subarray(0, 6).toString('ascii') === 'GIF89a') {
|
|
490
|
+
return 'image/gif';
|
|
491
|
+
}
|
|
492
|
+
if (header.subarray(0, 4).toString('ascii') === 'RIFF' && header.subarray(8, 12).toString('ascii') === 'WEBP') {
|
|
493
|
+
return 'image/webp';
|
|
494
|
+
}
|
|
495
|
+
return null;
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
await handle.close();
|
|
499
|
+
}
|
|
500
|
+
}
|
|
361
501
|
warmRuntimeKey(workdir, config) {
|
|
362
502
|
const agent = config.agentConfig;
|
|
363
503
|
return JSON.stringify({
|
|
@@ -414,44 +554,60 @@ class PiAgentRuntimeDriver {
|
|
|
414
554
|
};
|
|
415
555
|
});
|
|
416
556
|
}
|
|
417
|
-
async
|
|
557
|
+
async prepareWorkspace(input) {
|
|
558
|
+
const source = await this.resolveWorkspaceSource(input.threadId, input.config.workspace, input.config);
|
|
559
|
+
return this.solidfs.prepare({
|
|
560
|
+
run: {
|
|
561
|
+
id: input.runId,
|
|
562
|
+
workspace: input.config.workspace,
|
|
563
|
+
},
|
|
564
|
+
workspace: input.config.workspace,
|
|
565
|
+
sourcePath: source.sourcePath,
|
|
566
|
+
projection: this.options.solidfsProjection ?? 'direct',
|
|
567
|
+
context: input.context,
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
async resolveWorkspaceSource(threadId, workspace, config) {
|
|
418
571
|
const url = new URL(workspace);
|
|
419
|
-
let
|
|
572
|
+
let sourcePath;
|
|
420
573
|
if (url.protocol === 'http:' || url.protocol === 'https:') {
|
|
421
574
|
const mapped = this.mapPodUrlToLocalPath(workspace);
|
|
422
575
|
if (!mapped || !fs.existsSync(mapped)) {
|
|
423
576
|
throw new WaitingRunnerError(workspace, `Workspace is not mounted on this runner: ${workspace}`);
|
|
424
577
|
}
|
|
425
|
-
|
|
578
|
+
sourcePath = mapped;
|
|
426
579
|
}
|
|
427
580
|
else if (url.protocol === 'file:') {
|
|
428
581
|
if (!this.canResolveFileWorkspace(url)) {
|
|
429
582
|
throw new WaitingRunnerError(workspace, `Waiting for a runner that can resolve workspace ${workspace}`);
|
|
430
583
|
}
|
|
431
|
-
|
|
432
|
-
if (!fs.existsSync(
|
|
433
|
-
throw new Error(`workspace
|
|
584
|
+
sourcePath = decodeURIComponent(url.pathname);
|
|
585
|
+
if (!fs.existsSync(sourcePath)) {
|
|
586
|
+
throw new Error(`workspace reference does not exist on this runner: ${workspace}`);
|
|
434
587
|
}
|
|
435
588
|
}
|
|
436
589
|
else {
|
|
437
|
-
throw new Error(`Unsupported workspace
|
|
590
|
+
throw new Error(`Unsupported workspace reference protocol: ${url.protocol}`);
|
|
438
591
|
}
|
|
439
592
|
const worktree = config?.worktree;
|
|
440
593
|
if (!worktree) {
|
|
441
|
-
return
|
|
594
|
+
return { sourcePath };
|
|
595
|
+
}
|
|
596
|
+
const repoRoot = sourcePath;
|
|
597
|
+
if (!repoRoot) {
|
|
598
|
+
throw new Error(`Cannot create worktree without a local workspace source: ${workspace}`);
|
|
442
599
|
}
|
|
443
|
-
const repoRoot = workdir;
|
|
444
600
|
if (worktree.mode === 'existing') {
|
|
445
601
|
if (!fs.existsSync(worktree.path)) {
|
|
446
602
|
throw new Error(`worktree.path not found: ${worktree.path}`);
|
|
447
603
|
}
|
|
448
|
-
return worktree.path;
|
|
604
|
+
return { sourcePath: worktree.path };
|
|
449
605
|
}
|
|
450
606
|
await this.git.assertGitRepo(repoRoot);
|
|
451
607
|
const root = path.join(repoRoot, '.xpod-worktrees');
|
|
452
608
|
const worktreePath = path.join(root, threadId);
|
|
453
609
|
if (fs.existsSync(worktreePath)) {
|
|
454
|
-
return worktreePath;
|
|
610
|
+
return { sourcePath: worktreePath };
|
|
455
611
|
}
|
|
456
612
|
await this.git.createWorktree({
|
|
457
613
|
repoPath: repoRoot,
|
|
@@ -459,7 +615,7 @@ class PiAgentRuntimeDriver {
|
|
|
459
615
|
baseRef: worktree.baseRef ?? 'main',
|
|
460
616
|
branch: worktree.branch,
|
|
461
617
|
});
|
|
462
|
-
return worktreePath;
|
|
618
|
+
return { sourcePath: worktreePath };
|
|
463
619
|
}
|
|
464
620
|
canResolveFileWorkspace(url) {
|
|
465
621
|
const authority = url.hostname;
|
|
@@ -552,6 +708,9 @@ class PiAgentRuntimeDriver {
|
|
|
552
708
|
}
|
|
553
709
|
return { type: 'error', message: this.formatError(error) };
|
|
554
710
|
}
|
|
711
|
+
logWorkspaceRollbackError(error) {
|
|
712
|
+
console.warn(`SolidFS rollback failed: ${this.formatError(error)}`);
|
|
713
|
+
}
|
|
555
714
|
async loadPiSdk() {
|
|
556
715
|
if (this.options.piSdk) {
|
|
557
716
|
return this.options.piSdk;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiAgentRuntimeDriver.js","sourceRoot":"","sources":["../../../src/api/runs/PiAgentRuntimeDriver.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as crypto from 'node:crypto';\nimport { createInterface } from 'node:readline';\nimport type { WorkspaceUri } from '../workspace/types';\nimport { getDefaultBaseUrl } from '../service/provider-registry';\nimport { getPlatformApiBaseUrl, getPlatformApiKey, getPlatformDefaultModel, getPlatformProviderId } from '../service/platform-ai-config';\nimport { GitWorktreeService } from '../chatkit/runtime/GitWorktreeService';\nimport { SandboxFactory } from '../../terminal/sandbox';\nimport type {\n AgentRuntimeConfig,\n AgentRuntimeEvent,\n} from './AgentRuntimeTypes';\nimport type { RunConversationMessage, RunExecutionBackend, RunExecutionInput } from './RunExecutionBackend';\n\ntype PiSdk = typeof import('@mariozechner/pi-coding-agent');\ntype AgentSessionEvent = import('@mariozechner/pi-coding-agent').AgentSessionEvent;\ntype CreateAgentSessionOptions = NonNullable<Parameters<PiSdk['createAgentSession']>[0]>;\ntype PiApi = string;\ntype PiModel = {\n id: string;\n name: string;\n api: PiApi;\n provider: string;\n baseUrl: string;\n reasoning: boolean;\n input: Array<'text' | 'image'>;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n };\n contextWindow: number;\n maxTokens: number;\n compat?: Record<string, unknown>;\n};\ntype PiMessage =\n | {\n role: 'user';\n content: Array<{ type: 'text'; text: string }>;\n timestamp: number;\n }\n | {\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n api: PiApi;\n provider: string;\n model: string;\n usage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n totalTokens: number;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n total: number;\n };\n };\n stopReason: 'stop';\n timestamp: number;\n };\n\nexport interface PiAgentRuntimeDriverOptions {\n /**\n * local: run pi's full Agent Loop in the API process.\n * cloud: run the entire pi Agent Loop in a sandboxed worker process.\n */\n agentLoopIsolation?: 'in-process' | 'sandboxed-process';\n /**\n * Cloud defaults to strict sandboxing: do not fall back to an unsandboxed\n * process if sandbox-exec/bubblewrap is unavailable.\n */\n requireSandbox?: boolean;\n workerPath?: string;\n sandboxedLoopRunner?: (input: RunExecutionInput, workdir: string) => AsyncIterable<AgentRuntimeEvent>;\n sessionRootDir?: string;\n /**\n * Off by default: pi sessions are request-scoped implementation detail. When\n * enabled, the JSONL session is a diagnostic copy only; Xpod still restores\n * authoritative state from Run/Thread/Message before each execution.\n */\n persistPiSessions?: boolean;\n piSdk?: PiSdk;\n}\n\ntype WarmRuntime = {\n pi: PiSdk;\n workdir: string;\n piConfig: {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n };\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n authStorage: NonNullable<CreateAgentSessionOptions['authStorage']>;\n modelRegistry: NonNullable<CreateAgentSessionOptions['modelRegistry']>;\n settingsManager: ReturnType<PiSdk['SettingsManager']['inMemory']>;\n resourceLoader: NonNullable<CreateAgentSessionOptions['resourceLoader']>;\n tools: ReturnType<PiSdk['createCodingTools']>;\n};\n\n/**\n * Request-scoped adapter around pi's AgentSession primitives.\n *\n * Xpod restores durable conversation state into pi with replaceMessages() on\n * every run. pi owns the atomic agent loop, tools and streaming events for the\n * current invocation only; its SessionManager is not the Xpod state center.\n */\nexport class PiAgentRuntimeDriver implements RunExecutionBackend {\n private static sdkPromise?: Promise<PiSdk>;\n\n private readonly git = new GitWorktreeService();\n private readonly warmRuntimes = new Map<string, Promise<WarmRuntime>>();\n\n public constructor(private readonly options: PiAgentRuntimeDriverOptions = {}) {}\n\n public async *start(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n if (this.options.agentLoopIsolation === 'sandboxed-process') {\n try {\n const workdir = await this.resolveWorkdir(input.threadId, input.config.workspace, input.config);\n const runner = this.options.sandboxedLoopRunner\n ?? ((runInput, runWorkdir) => this.startSandboxedAgentLoop(runInput, runWorkdir));\n for await (const event of runner(input, workdir)) {\n yield event;\n }\n } catch (error) {\n yield this.startupErrorToEvent(error);\n }\n return;\n }\n\n yield* this.startInProcess(input);\n }\n\n private async *startInProcess(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n let session: Awaited<ReturnType<PiSdk['createAgentSession']>>['session'] | undefined;\n\n try {\n const runtime = await this.getWarmRuntime(input);\n const sessionManager = this.createSessionManager(runtime.pi, input.runId, runtime.workdir);\n const result = await runtime.pi.createAgentSession({\n cwd: runtime.workdir,\n authStorage: runtime.authStorage,\n modelRegistry: runtime.modelRegistry,\n settingsManager: runtime.settingsManager,\n sessionManager,\n resourceLoader: runtime.resourceLoader,\n model: runtime.piConfig.model,\n thinkingLevel: runtime.thinkingLevel,\n tools: runtime.tools,\n });\n session = result.session;\n session.agent.replaceMessages(this.toPiMessages(input.conversation, runtime.piConfig));\n\n const streamState = {\n lastAssistantText: '',\n assistantTextStreamed: false,\n };\n const unsubscribe = session.subscribe((event) => {\n this.projectPiEvent(event, queue, streamState);\n });\n\n void session.prompt(input.prompt, { expandPromptTemplates: false, source: 'rpc' }).then(() => {\n if (!streamState.assistantTextStreamed && streamState.lastAssistantText.length > 0) {\n queue.push({ type: 'text', text: streamState.lastAssistantText });\n }\n queue.close();\n }).catch((error) => {\n queue.push({ type: 'error', message: this.formatError(error) });\n queue.close();\n }).finally(() => {\n unsubscribe();\n session?.dispose();\n });\n\n for await (const event of queue.iterate()) {\n yield event;\n }\n } catch (error) {\n session?.dispose();\n yield this.startupErrorToEvent(error);\n }\n }\n\n private startSandboxedAgentLoop(input: RunExecutionInput, workdir: string): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n const requireSandbox = this.options.requireSandbox ?? true;\n\n if (requireSandbox && !SandboxFactory.isAvailable()) {\n queue.push({ type: 'error', message: 'Cloud Agent Runtime requires an OS sandbox, but none is available on this host' });\n queue.close();\n return queue.iterate();\n }\n\n const child = SandboxFactory.launch({\n workdir,\n command: process.execPath,\n args: [this.resolveWorkerPath()],\n env: this.workerEnv(),\n isolateNetwork: false,\n });\n\n if (requireSandbox && !child.sandboxed) {\n child.process.kill();\n queue.push({ type: 'error', message: 'Cloud Agent Runtime refused to run without a sandbox' });\n queue.close();\n return queue.iterate();\n }\n\n const stderrChunks: Buffer[] = [];\n const stderrMaxBytes = 16 * 1024;\n let closed = false;\n\n const closeOnce = (): void => {\n if (closed) {\n return;\n }\n closed = true;\n queue.close();\n };\n\n child.process.stdin?.end(JSON.stringify({\n input,\n options: {\n persistPiSessions: this.options.persistPiSessions === true,\n sessionRootDir: this.options.sessionRootDir,\n },\n }));\n\n const rl = createInterface({ input: child.process.stdout! });\n rl.on('line', (line) => {\n if (!line.startsWith(PI_AGENT_WORKER_EVENT_PREFIX)) {\n return;\n }\n const payload = line.slice(PI_AGENT_WORKER_EVENT_PREFIX.length);\n try {\n queue.push(JSON.parse(payload) as AgentRuntimeEvent);\n } catch (error) {\n queue.push({ type: 'error', message: `Invalid Agent Runtime worker event: ${this.formatError(error)}` });\n }\n });\n\n child.process.stderr?.on('data', (chunk: Buffer) => {\n if (Buffer.concat(stderrChunks).length < stderrMaxBytes) {\n stderrChunks.push(chunk);\n }\n });\n\n child.process.on('error', (error) => {\n queue.push({ type: 'error', message: `Agent Runtime worker failed to start: ${this.formatError(error)}` });\n closeOnce();\n });\n\n child.process.on('close', (code, signal) => {\n rl.close();\n if (code !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString('utf-8').trim();\n const suffix = stderr ? `: ${stderr}` : signal ? ` (signal ${signal})` : '';\n queue.push({ type: 'error', message: `Agent Runtime worker exited with code ${code ?? 'null'}${suffix}` });\n }\n closeOnce();\n });\n\n return queue.iterate();\n }\n\n private projectPiEvent(\n event: AgentSessionEvent,\n queue: AsyncPushQueue<AgentRuntimeEvent>,\n state: {\n lastAssistantText: string;\n assistantTextStreamed: boolean;\n },\n ): void {\n if (event.type === 'message_update' && event.assistantMessageEvent?.type === 'text_delta') {\n queue.push({ type: 'text', text: event.assistantMessageEvent.delta });\n state.assistantTextStreamed = true;\n return;\n }\n\n if (event.type === 'message_update' && event.message.role === 'assistant') {\n state.lastAssistantText = this.extractText(event.message.content);\n return;\n }\n\n if (event.type === 'message_end' && event.message.role === 'assistant') {\n const finalText = this.extractText(event.message.content);\n const alreadyStreamed = state.assistantTextStreamed;\n state.lastAssistantText = '';\n state.assistantTextStreamed = false;\n if (!alreadyStreamed && finalText.length > 0) {\n queue.push({ type: 'text', text: finalText });\n }\n return;\n }\n\n // pi emits tool_execution_start for its own read/bash/edit/write tools.\n // Those are internal runtime activity, not client-side tool requests.\n }\n\n private resolvePiConfig(config: AgentRuntimeConfig): {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n } {\n const baseUrl = config.agentConfig?.baseUrl || getPlatformApiBaseUrl();\n const provider = this.resolveProviderId(baseUrl);\n const apiKey = config.agentConfig?.apiKey || getPlatformApiKey();\n if (!apiKey) {\n throw new Error('No API key configured for pi Agent Runtime. Store the agent credential in the Pod or set DEFAULT_API_KEY for local development.');\n }\n const resolvedBaseUrl = baseUrl || getDefaultBaseUrl(provider);\n const modelId = config.agentConfig?.model || getPlatformDefaultModel();\n const api = this.resolveApiForBaseUrl(resolvedBaseUrl);\n\n return {\n provider,\n apiKey,\n api,\n baseUrl: resolvedBaseUrl,\n model: {\n id: modelId,\n name: modelId,\n api,\n provider,\n baseUrl: resolvedBaseUrl,\n reasoning: false,\n input: ['text'],\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n contextWindow: 128_000,\n maxTokens: 8192,\n compat: api === 'openai-completions'\n ? {\n supportsStore: false,\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n }\n : undefined,\n },\n };\n }\n\n private resolveProviderId(baseUrl: string | undefined): string {\n const configured = getPlatformProviderId();\n if (configured && configured !== 'undefineds') {\n return configured;\n }\n if (!baseUrl) {\n return 'xpod';\n }\n try {\n const host = new URL(baseUrl).hostname;\n if (host.includes('openai.com')) return 'openai';\n if (host.includes('anthropic.com')) return 'anthropic';\n if (host.includes('openrouter.ai')) return 'openrouter';\n if (host.includes('deepseek.com')) return 'deepseek';\n if (host.includes('mistral.ai')) return 'mistral';\n if (host === 'localhost' || host === '127.0.0.1') return 'ollama';\n } catch {\n // fall through to xpod\n }\n return 'xpod';\n }\n\n private resolveApiForBaseUrl(baseUrl: string): PiApi {\n try {\n const host = new URL(baseUrl).hostname;\n return host === 'api.openai.com' ? 'openai-responses' : 'openai-completions';\n } catch {\n return 'openai-completions';\n }\n }\n\n private resolveThinkingLevel(config: AgentRuntimeConfig): 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' {\n const level = (config.agentConfig as any)?.thinkingLevel;\n return level === 'minimal' || level === 'low' || level === 'medium' || level === 'high' || level === 'xhigh'\n ? level\n : 'off';\n }\n\n private resolveTools(pi: PiSdk, workdir: string, config: AgentRuntimeConfig): ReturnType<PiSdk['createCodingTools']> {\n const permissionMode = config.agentConfig?.permissionMode;\n const allowed = new Set(config.agentConfig?.allowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const disallowed = new Set(config.agentConfig?.disallowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const baseTools = permissionMode === 'plan' || allowed.size > 0\n ? pi.createReadOnlyTools(workdir)\n : pi.createCodingTools(workdir);\n\n return baseTools.filter((tool) => {\n const name = tool.name.toLowerCase();\n if (disallowed.has(name)) {\n return false;\n }\n return allowed.size === 0 || allowed.has(name);\n }) as ReturnType<PiSdk['createCodingTools']>;\n }\n\n private async getWarmRuntime(input: RunExecutionInput): Promise<WarmRuntime> {\n const pi = await this.loadPiSdk();\n const workdir = await this.resolveWorkdir(input.threadId, input.config.workspace, input.config);\n const key = this.warmRuntimeKey(workdir, input.config);\n const existing = this.warmRuntimes.get(key);\n if (existing) {\n return existing;\n }\n\n const created = this.createWarmRuntime(pi, workdir, input.config).catch((error) => {\n this.warmRuntimes.delete(key);\n throw error;\n });\n this.warmRuntimes.set(key, created);\n return created;\n }\n\n private async createWarmRuntime(pi: PiSdk, workdir: string, config: AgentRuntimeConfig): Promise<WarmRuntime> {\n const piConfig = this.resolvePiConfig(config);\n const authStorage = pi.AuthStorage.inMemory();\n authStorage.setRuntimeApiKey(piConfig.provider, piConfig.apiKey);\n\n const modelRegistry = new pi.ModelRegistry(authStorage, undefined);\n modelRegistry.registerProvider(piConfig.provider, {\n baseUrl: piConfig.baseUrl,\n apiKey: piConfig.apiKey,\n api: piConfig.api,\n models: [ piConfig.model ],\n });\n\n const thinkingLevel = this.resolveThinkingLevel(config);\n const settingsManager = pi.SettingsManager.inMemory({\n defaultProvider: piConfig.provider,\n defaultModel: piConfig.model.id,\n defaultThinkingLevel: thinkingLevel,\n });\n\n const resourceLoader = new pi.DefaultResourceLoader({\n cwd: workdir,\n settingsManager,\n systemPrompt: config.agentConfig?.systemPrompt,\n appendSystemPrompt: config.agentConfig?.skillsContent,\n noExtensions: true,\n noSkills: true,\n noPromptTemplates: true,\n noThemes: true,\n });\n await resourceLoader.reload();\n\n return {\n pi,\n workdir,\n piConfig,\n thinkingLevel,\n authStorage,\n modelRegistry,\n settingsManager,\n resourceLoader,\n tools: this.resolveTools(pi, workdir, config),\n };\n }\n\n private warmRuntimeKey(workdir: string, config: AgentRuntimeConfig): string {\n const agent = config.agentConfig;\n return JSON.stringify({\n workdir,\n baseUrl: agent?.baseUrl ?? getPlatformApiBaseUrl(),\n model: agent?.model ?? getPlatformDefaultModel(),\n apiKeyHash: this.hashSecret(agent?.apiKey ?? getPlatformApiKey()),\n systemPrompt: agent?.systemPrompt ?? '',\n skillsContent: agent?.skillsContent ?? '',\n permissionMode: agent?.permissionMode ?? '',\n allowedTools: agent?.allowedTools ?? [],\n disallowedTools: agent?.disallowedTools ?? [],\n persistPiSessions: this.options.persistPiSessions === true,\n agentLoopIsolation: this.options.agentLoopIsolation ?? 'in-process',\n thinkingLevel: this.resolveThinkingLevel(config),\n });\n }\n\n private hashSecret(value: string | undefined): string {\n return value\n ? crypto.createHash('sha256').update(value).digest('hex').slice(0, 16)\n : '';\n }\n\n private toPiMessages(\n conversation: RunConversationMessage[],\n config: { api: PiApi; provider: string; model: PiModel },\n ): PiMessage[] {\n return conversation.map((message) => {\n if (message.role === 'user') {\n return {\n role: 'user',\n content: [{ type: 'text', text: message.text }],\n timestamp: message.createdAt * 1000,\n };\n }\n return {\n role: 'assistant',\n content: [{ type: 'text', text: message.text }],\n api: config.api,\n provider: config.provider,\n model: config.model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n },\n stopReason: 'stop',\n timestamp: message.createdAt * 1000,\n };\n });\n }\n\n private async resolveWorkdir(threadId: string, workspace: WorkspaceUri, config?: AgentRuntimeConfig): Promise<string> {\n const url = new URL(workspace);\n let workdir: string;\n\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n const mapped = this.mapPodUrlToLocalPath(workspace);\n if (!mapped || !fs.existsSync(mapped)) {\n throw new WaitingRunnerError(workspace, `Workspace is not mounted on this runner: ${workspace}`);\n }\n workdir = mapped;\n } else if (url.protocol === 'file:') {\n if (!this.canResolveFileWorkspace(url)) {\n throw new WaitingRunnerError(workspace, `Waiting for a runner that can resolve workspace ${workspace}`);\n }\n workdir = decodeURIComponent(url.pathname);\n if (!fs.existsSync(workdir)) {\n throw new Error(`workspace URI does not exist on this runner: ${workspace}`);\n }\n } else {\n throw new Error(`Unsupported workspace URI protocol: ${url.protocol}`);\n }\n\n const worktree = config?.worktree;\n if (!worktree) {\n return workdir;\n }\n\n const repoRoot = workdir;\n\n if (worktree.mode === 'existing') {\n if (!fs.existsSync(worktree.path)) {\n throw new Error(`worktree.path not found: ${worktree.path}`);\n }\n return worktree.path;\n }\n\n await this.git.assertGitRepo(repoRoot);\n\n const root = path.join(repoRoot, '.xpod-worktrees');\n const worktreePath = path.join(root, threadId);\n\n if (fs.existsSync(worktreePath)) {\n return worktreePath;\n }\n\n await this.git.createWorktree({\n repoPath: repoRoot,\n worktreePath,\n baseRef: worktree.baseRef ?? 'main',\n branch: worktree.branch,\n });\n\n return worktreePath;\n }\n\n private canResolveFileWorkspace(url: URL): boolean {\n const authority = url.hostname;\n if (!authority || authority === 'localhost') {\n return true;\n }\n const configured = process.env.XPOD_RUNNER_AUTHORITY?.trim();\n return authority === configured || authority === os.hostname();\n }\n\n private mapPodUrlToLocalPath(rootUrl: string): string | undefined {\n const rootFilePath = process.env.CSS_ROOT_FILE_PATH;\n const baseUrl = process.env.CSS_BASE_URL;\n if (!rootFilePath || !baseUrl) {\n return undefined;\n }\n\n try {\n const base = new URL(baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`);\n const pod = new URL(rootUrl.endsWith('/') ? rootUrl : `${rootUrl}/`);\n if (base.origin !== pod.origin) {\n return undefined;\n }\n if (!pod.pathname.startsWith(base.pathname)) {\n return undefined;\n }\n const relativePath = decodeURIComponent(pod.pathname.slice(base.pathname.length)).replace(/\\/+$/, '');\n const resolvedRoot = path.resolve(rootFilePath);\n const resolved = path.resolve(resolvedRoot, relativePath);\n if (resolved !== resolvedRoot && !resolved.startsWith(`${resolvedRoot}${path.sep}`)) {\n return undefined;\n }\n return resolved;\n } catch {\n return undefined;\n }\n }\n\n private createSessionManager(pi: PiSdk, runId: string, workdir: string): ReturnType<PiSdk['SessionManager']['inMemory']> {\n if (this.options.persistPiSessions) {\n return pi.SessionManager.create(workdir, this.resolveSessionDir(runId, workdir));\n }\n return pi.SessionManager.inMemory(workdir);\n }\n\n private resolveSessionDir(runId: string, workdir: string): string {\n const root = this.options.sessionRootDir ?? path.join(os.tmpdir(), 'xpod-pi-sessions');\n const hash = crypto.createHash('sha256').update(`${workdir}:${runId}`).digest('hex').slice(0, 20);\n return path.join(root, hash);\n }\n\n private resolveWorkerPath(): string {\n if (this.options.workerPath) {\n return this.options.workerPath;\n }\n return path.join(__dirname, `PiAgentRuntimeWorker${path.extname(__filename)}`);\n }\n\n private workerEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') {\n env[key] = value;\n }\n }\n env.XPOD_AGENT_LOOP_WORKER = '1';\n return env;\n }\n\n private extractText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n return content\n .map((part) => {\n if (part && typeof part === 'object' && (part as any).type === 'text') {\n return typeof (part as any).text === 'string' ? (part as any).text : '';\n }\n return '';\n })\n .join('');\n }\n\n private formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private startupErrorToEvent(error: unknown): AgentRuntimeEvent {\n if (error instanceof WaitingRunnerError) {\n return {\n type: 'waiting_runner',\n workspace: error.workspace,\n message: error.message,\n };\n }\n return { type: 'error', message: this.formatError(error) };\n }\n\n private async loadPiSdk(): Promise<PiSdk> {\n if (this.options.piSdk) {\n return this.options.piSdk;\n }\n if (PiAgentRuntimeDriver.sdkPromise) {\n return PiAgentRuntimeDriver.sdkPromise;\n }\n // Keep a native dynamic import so the CommonJS build can lazily load pi's\n // ESM-only package instead of requiring it during CSS component discovery.\n const nativeImport = new Function('specifier', 'return import(specifier)') as (specifier: string) => Promise<PiSdk>;\n PiAgentRuntimeDriver.sdkPromise = nativeImport('@mariozechner/pi-coding-agent');\n return PiAgentRuntimeDriver.sdkPromise;\n }\n}\n\nexport const PI_AGENT_WORKER_EVENT_PREFIX = 'XPOD_AGENT_EVENT ';\n\nclass WaitingRunnerError extends Error {\n public constructor(\n public readonly workspace: WorkspaceUri,\n message: string,\n ) {\n super(message);\n }\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private closed = false;\n\n public push(item: T): void {\n if (this.closed) {\n return;\n }\n this.items.push(item);\n const resolver = this.resolvers.shift();\n resolver?.();\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const resolver of this.resolvers) {\n resolver();\n }\n this.resolvers = [];\n }\n\n public async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this.closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PiAgentRuntimeDriver.js","sourceRoot":"","sources":["../../../src/api/runs/PiAgentRuntimeDriver.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport * as crypto from 'node:crypto';\nimport { createInterface } from 'node:readline';\nimport type { WorkspaceRef } from '../workspace/types';\nimport { getDefaultBaseUrl } from '../service/provider-registry';\nimport { getPlatformApiBaseUrl, getPlatformApiKey, getPlatformDefaultModel, getPlatformProviderId } from '../service/platform-ai-config';\nimport { GitWorktreeService } from '../chatkit/runtime/GitWorktreeService';\nimport { SandboxFactory } from '../../terminal/sandbox';\nimport { LocalSolidFS, PodSolidFsHydrator, PodSolidFsSyncer, SolidFsNotFoundError, type MaterializedWorkspace, type SolidFS, type SolidFsProjection } from '../../solidfs';\nimport type {\n AgentRuntimeConfig,\n AgentRuntimeEvent,\n} from './AgentRuntimeTypes';\nimport type { RunConversationMessage, RunExecutionBackend, RunExecutionInput } from './RunExecutionBackend';\n\ntype PiSdk = typeof import('@mariozechner/pi-coding-agent');\ntype AgentSessionEvent = import('@mariozechner/pi-coding-agent').AgentSessionEvent;\ntype CreateAgentSessionOptions = NonNullable<Parameters<PiSdk['createAgentSession']>[0]>;\ntype PiTool = ReturnType<PiSdk['createCodingTools']>[number];\ntype PiReadOperations = import('@mariozechner/pi-coding-agent').ReadOperations;\ntype PiEditOperations = import('@mariozechner/pi-coding-agent').EditOperations;\ntype PiWriteOperations = import('@mariozechner/pi-coding-agent').WriteOperations;\ntype PiApi = string;\ntype PiModel = {\n id: string;\n name: string;\n api: PiApi;\n provider: string;\n baseUrl: string;\n reasoning: boolean;\n input: Array<'text' | 'image'>;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n };\n contextWindow: number;\n maxTokens: number;\n compat?: Record<string, unknown>;\n};\ntype PiMessage =\n | {\n role: 'user';\n content: Array<{ type: 'text'; text: string }>;\n timestamp: number;\n }\n | {\n role: 'assistant';\n content: Array<{ type: 'text'; text: string }>;\n api: PiApi;\n provider: string;\n model: string;\n usage: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n totalTokens: number;\n cost: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n total: number;\n };\n };\n stopReason: 'stop';\n timestamp: number;\n };\n\nexport interface PiAgentRuntimeDriverOptions {\n /**\n * local: run pi's full Agent Loop in the API process.\n * cloud: run the entire pi Agent Loop in a sandboxed worker process.\n */\n agentLoopIsolation?: 'in-process' | 'sandboxed-process';\n /**\n * Cloud defaults to strict sandboxing: do not fall back to an unsandboxed\n * process if sandbox-exec/bubblewrap is unavailable.\n */\n requireSandbox?: boolean;\n workerPath?: string;\n sandboxedLoopRunner?: (input: RunExecutionInput, workdir: string) => AsyncIterable<AgentRuntimeEvent>;\n sessionRootDir?: string;\n /**\n * Off by default: pi sessions are request-scoped implementation detail. When\n * enabled, the JSONL session is a diagnostic copy only; Xpod still restores\n * authoritative state from Run/Thread/Message before each execution.\n */\n persistPiSessions?: boolean;\n piSdk?: PiSdk;\n solidfs?: SolidFS;\n solidfsProjection?: SolidFsProjection;\n}\n\ntype WarmRuntime = {\n pi: PiSdk;\n workdir: string;\n piConfig: {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n };\n thinkingLevel: 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';\n authStorage: NonNullable<CreateAgentSessionOptions['authStorage']>;\n modelRegistry: NonNullable<CreateAgentSessionOptions['modelRegistry']>;\n settingsManager: ReturnType<PiSdk['SettingsManager']['inMemory']>;\n resourceLoader: NonNullable<CreateAgentSessionOptions['resourceLoader']>;\n tools: PiTool[];\n};\n\n/**\n * Request-scoped adapter around pi's AgentSession primitives.\n *\n * Xpod restores durable conversation state into pi with replaceMessages() on\n * every run. pi owns the atomic agent loop, tools and streaming events for the\n * current invocation only; its SessionManager is not the Xpod state center.\n */\nexport class PiAgentRuntimeDriver implements RunExecutionBackend {\n private static sdkPromise?: Promise<PiSdk>;\n\n private readonly git = new GitWorktreeService();\n private readonly warmRuntimes = new Map<string, Promise<WarmRuntime>>();\n private readonly solidfs: SolidFS;\n\n public constructor(private readonly options: PiAgentRuntimeDriverOptions = {}) {\n this.solidfs = options.solidfs ?? new LocalSolidFS({\n syncer: new PodSolidFsSyncer(),\n hydrator: new PodSolidFsHydrator(),\n });\n }\n\n public async *start(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n if (this.options.agentLoopIsolation === 'sandboxed-process') {\n let workspace: MaterializedWorkspace | undefined;\n let completed = false;\n try {\n workspace = await this.prepareWorkspace(input);\n const runner = this.options.sandboxedLoopRunner\n ?? ((runInput, runWorkdir) => this.startSandboxedAgentLoop(runInput, runWorkdir));\n for await (const event of runner(input, workspace.cwd)) {\n yield event;\n if (event.type === 'error') {\n return;\n }\n }\n await workspace.commit();\n completed = true;\n } catch (error) {\n yield this.startupErrorToEvent(error);\n } finally {\n if (!completed) {\n await workspace?.rollback().catch((error) => {\n this.logWorkspaceRollbackError(error);\n });\n }\n }\n return;\n }\n\n yield* this.startInProcess(input);\n }\n\n private async *startInProcess(input: RunExecutionInput): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n let session: Awaited<ReturnType<PiSdk['createAgentSession']>>['session'] | undefined;\n let workspace: MaterializedWorkspace | undefined;\n let completed = false;\n let failed = false;\n\n try {\n workspace = await this.prepareWorkspace(input);\n const runtime = await this.getWarmRuntime(input, workspace);\n const sessionManager = this.createSessionManager(runtime.pi, input.runId, runtime.workdir);\n const result = await runtime.pi.createAgentSession({\n cwd: runtime.workdir,\n authStorage: runtime.authStorage,\n modelRegistry: runtime.modelRegistry,\n settingsManager: runtime.settingsManager,\n sessionManager,\n resourceLoader: runtime.resourceLoader,\n model: runtime.piConfig.model,\n thinkingLevel: runtime.thinkingLevel,\n tools: runtime.tools,\n });\n session = result.session;\n session.agent.replaceMessages(this.toPiMessages(input.conversation, runtime.piConfig));\n\n const streamState = {\n lastAssistantText: '',\n assistantTextStreamed: false,\n };\n const unsubscribe = session.subscribe((event) => {\n this.projectPiEvent(event, queue, streamState);\n });\n\n void session.prompt(input.prompt, { expandPromptTemplates: false, source: 'rpc' }).then(() => {\n if (!streamState.assistantTextStreamed && streamState.lastAssistantText.length > 0) {\n queue.push({ type: 'text', text: streamState.lastAssistantText });\n }\n queue.close();\n }).catch((error) => {\n queue.push({ type: 'error', message: this.formatError(error) });\n queue.close();\n }).finally(() => {\n unsubscribe();\n session?.dispose();\n });\n\n for await (const event of queue.iterate()) {\n if (event.type === 'error') {\n failed = true;\n }\n yield event;\n }\n if (!failed) {\n await workspace.commit();\n completed = true;\n }\n } catch (error) {\n session?.dispose();\n yield this.startupErrorToEvent(error);\n } finally {\n if (!completed) {\n await workspace?.rollback().catch((error) => {\n this.logWorkspaceRollbackError(error);\n });\n }\n }\n }\n\n private startSandboxedAgentLoop(input: RunExecutionInput, workdir: string): AsyncIterable<AgentRuntimeEvent> {\n const queue = new AsyncPushQueue<AgentRuntimeEvent>();\n const requireSandbox = this.options.requireSandbox ?? true;\n\n if (requireSandbox && !SandboxFactory.isAvailable()) {\n queue.push({ type: 'error', message: 'Cloud Agent Runtime requires an OS sandbox, but none is available on this host' });\n queue.close();\n return queue.iterate();\n }\n\n const child = SandboxFactory.launch({\n workdir,\n command: process.execPath,\n args: [this.resolveWorkerPath()],\n env: this.workerEnv(),\n isolateNetwork: false,\n });\n\n if (requireSandbox && !child.sandboxed) {\n child.process.kill();\n queue.push({ type: 'error', message: 'Cloud Agent Runtime refused to run without a sandbox' });\n queue.close();\n return queue.iterate();\n }\n\n const stderrChunks: Buffer[] = [];\n const stderrMaxBytes = 16 * 1024;\n let closed = false;\n\n const closeOnce = (): void => {\n if (closed) {\n return;\n }\n closed = true;\n queue.close();\n };\n\n child.process.stdin?.end(JSON.stringify({\n input,\n options: {\n persistPiSessions: this.options.persistPiSessions === true,\n sessionRootDir: this.options.sessionRootDir,\n },\n }));\n\n const rl = createInterface({ input: child.process.stdout! });\n rl.on('line', (line) => {\n if (!line.startsWith(PI_AGENT_WORKER_EVENT_PREFIX)) {\n return;\n }\n const payload = line.slice(PI_AGENT_WORKER_EVENT_PREFIX.length);\n try {\n queue.push(JSON.parse(payload) as AgentRuntimeEvent);\n } catch (error) {\n queue.push({ type: 'error', message: `Invalid Agent Runtime worker event: ${this.formatError(error)}` });\n }\n });\n\n child.process.stderr?.on('data', (chunk: Buffer) => {\n if (Buffer.concat(stderrChunks).length < stderrMaxBytes) {\n stderrChunks.push(chunk);\n }\n });\n\n child.process.on('error', (error) => {\n queue.push({ type: 'error', message: `Agent Runtime worker failed to start: ${this.formatError(error)}` });\n closeOnce();\n });\n\n child.process.on('close', (code, signal) => {\n rl.close();\n if (code !== 0) {\n const stderr = Buffer.concat(stderrChunks).toString('utf-8').trim();\n const suffix = stderr ? `: ${stderr}` : signal ? ` (signal ${signal})` : '';\n queue.push({ type: 'error', message: `Agent Runtime worker exited with code ${code ?? 'null'}${suffix}` });\n }\n closeOnce();\n });\n\n return queue.iterate();\n }\n\n private projectPiEvent(\n event: AgentSessionEvent,\n queue: AsyncPushQueue<AgentRuntimeEvent>,\n state: {\n lastAssistantText: string;\n assistantTextStreamed: boolean;\n },\n ): void {\n if (event.type === 'message_update' && event.assistantMessageEvent?.type === 'text_delta') {\n queue.push({ type: 'text', text: event.assistantMessageEvent.delta });\n state.assistantTextStreamed = true;\n return;\n }\n\n if (event.type === 'message_update' && event.message.role === 'assistant') {\n state.lastAssistantText = this.extractText(event.message.content);\n return;\n }\n\n if (event.type === 'message_end' && event.message.role === 'assistant') {\n const finalText = this.extractText(event.message.content);\n const alreadyStreamed = state.assistantTextStreamed;\n state.lastAssistantText = '';\n state.assistantTextStreamed = false;\n if (!alreadyStreamed && finalText.length > 0) {\n queue.push({ type: 'text', text: finalText });\n }\n return;\n }\n\n // pi emits tool_execution_start for its own read/bash/edit/write tools.\n // Those are internal runtime activity, not client-side tool requests.\n }\n\n private resolvePiConfig(config: AgentRuntimeConfig): {\n provider: string;\n apiKey: string;\n api: PiApi;\n baseUrl: string;\n model: PiModel;\n } {\n const baseUrl = config.agentConfig?.baseUrl || getPlatformApiBaseUrl();\n const provider = this.resolveProviderId(baseUrl);\n const apiKey = config.agentConfig?.apiKey || getPlatformApiKey();\n if (!apiKey) {\n throw new Error('No API key configured for pi Agent Runtime. Store the agent credential in the Pod or set DEFAULT_API_KEY for local development.');\n }\n const resolvedBaseUrl = baseUrl || getDefaultBaseUrl(provider);\n const modelId = config.agentConfig?.model || getPlatformDefaultModel();\n const api = this.resolveApiForBaseUrl(resolvedBaseUrl);\n\n return {\n provider,\n apiKey,\n api,\n baseUrl: resolvedBaseUrl,\n model: {\n id: modelId,\n name: modelId,\n api,\n provider,\n baseUrl: resolvedBaseUrl,\n reasoning: false,\n input: ['text'],\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n },\n contextWindow: 128_000,\n maxTokens: 8192,\n compat: api === 'openai-completions'\n ? {\n supportsStore: false,\n supportsDeveloperRole: false,\n supportsReasoningEffort: false,\n }\n : undefined,\n },\n };\n }\n\n private resolveProviderId(baseUrl: string | undefined): string {\n const configured = getPlatformProviderId();\n if (configured && configured !== 'undefineds') {\n return configured;\n }\n if (!baseUrl) {\n return 'xpod';\n }\n try {\n const host = new URL(baseUrl).hostname;\n if (host.includes('openai.com')) return 'openai';\n if (host.includes('anthropic.com')) return 'anthropic';\n if (host.includes('openrouter.ai')) return 'openrouter';\n if (host.includes('deepseek.com')) return 'deepseek';\n if (host.includes('mistral.ai')) return 'mistral';\n if (host === 'localhost' || host === '127.0.0.1') return 'ollama';\n } catch {\n // fall through to xpod\n }\n return 'xpod';\n }\n\n private resolveApiForBaseUrl(baseUrl: string): PiApi {\n try {\n const host = new URL(baseUrl).hostname;\n return host === 'api.openai.com' ? 'openai-responses' : 'openai-completions';\n } catch {\n return 'openai-completions';\n }\n }\n\n private resolveThinkingLevel(config: AgentRuntimeConfig): 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' {\n const level = (config.agentConfig as any)?.thinkingLevel;\n return level === 'minimal' || level === 'low' || level === 'medium' || level === 'high' || level === 'xhigh'\n ? level\n : 'off';\n }\n\n private resolveTools(pi: PiSdk, workspace: MaterializedWorkspace, config: AgentRuntimeConfig): PiTool[] {\n const workdir = workspace.cwd;\n const permissionMode = config.agentConfig?.permissionMode;\n const allowed = new Set(config.agentConfig?.allowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const disallowed = new Set(config.agentConfig?.disallowedTools?.map((tool) => tool.toLowerCase()) ?? []);\n const baseTools = permissionMode === 'plan' || allowed.size > 0\n ? this.createSolidFsReadOnlyTools(pi, workspace)\n : this.createSolidFsCodingTools(pi, workspace);\n\n return baseTools.filter((tool) => {\n const name = tool.name.toLowerCase();\n if (disallowed.has(name)) {\n return false;\n }\n return allowed.size === 0 || allowed.has(name);\n }) as PiTool[];\n }\n\n private async getWarmRuntime(input: RunExecutionInput, workspace: MaterializedWorkspace): Promise<WarmRuntime> {\n const pi = await this.loadPiSdk();\n const workdir = workspace.cwd;\n const key = this.warmRuntimeKey(workdir, input.config);\n const existing = this.warmRuntimes.get(key);\n if (existing) {\n return existing;\n }\n\n const created = this.createWarmRuntime(pi, workspace, input.config).catch((error) => {\n this.warmRuntimes.delete(key);\n throw error;\n });\n this.warmRuntimes.set(key, created);\n return created;\n }\n\n private async createWarmRuntime(pi: PiSdk, workspace: MaterializedWorkspace, config: AgentRuntimeConfig): Promise<WarmRuntime> {\n const workdir = workspace.cwd;\n const piConfig = this.resolvePiConfig(config);\n const authStorage = pi.AuthStorage.inMemory();\n authStorage.setRuntimeApiKey(piConfig.provider, piConfig.apiKey);\n\n const modelRegistry = new pi.ModelRegistry(authStorage, undefined);\n modelRegistry.registerProvider(piConfig.provider, {\n baseUrl: piConfig.baseUrl,\n apiKey: piConfig.apiKey,\n api: piConfig.api,\n models: [ piConfig.model ],\n });\n\n const thinkingLevel = this.resolveThinkingLevel(config);\n const settingsManager = pi.SettingsManager.inMemory({\n defaultProvider: piConfig.provider,\n defaultModel: piConfig.model.id,\n defaultThinkingLevel: thinkingLevel,\n });\n\n const resourceLoader = new pi.DefaultResourceLoader({\n cwd: workdir,\n settingsManager,\n systemPrompt: config.agentConfig?.systemPrompt,\n appendSystemPrompt: config.agentConfig?.skillsContent,\n noExtensions: true,\n noSkills: true,\n noPromptTemplates: true,\n noThemes: true,\n });\n await resourceLoader.reload();\n\n return {\n pi,\n workdir,\n piConfig,\n thinkingLevel,\n authStorage,\n modelRegistry,\n settingsManager,\n resourceLoader,\n tools: this.resolveTools(pi, workspace, config),\n };\n }\n\n private createSolidFsCodingTools(pi: PiSdk, workspace: MaterializedWorkspace): PiTool[] {\n if (!this.canHydrateWorkspace(workspace)) {\n return pi.createCodingTools(workspace.cwd);\n }\n\n return [\n pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }) as PiTool,\n pi.createBashTool(workspace.cwd) as PiTool,\n pi.createEditTool(workspace.cwd, { operations: this.createSolidFsEditOperations(workspace) }) as PiTool,\n pi.createWriteTool(workspace.cwd, { operations: this.createSolidFsWriteOperations(workspace) }) as PiTool,\n ];\n }\n\n private createSolidFsReadOnlyTools(pi: PiSdk, workspace: MaterializedWorkspace): PiTool[] {\n if (!this.canHydrateWorkspace(workspace)) {\n return pi.createReadOnlyTools(workspace.cwd);\n }\n\n return [\n pi.createReadTool(workspace.cwd, { operations: this.createSolidFsReadOperations(workspace) }) as PiTool,\n ...pi.createReadOnlyTools(workspace.cwd).filter((tool) => tool.name !== 'read'),\n ];\n }\n\n private createSolidFsReadOperations(workspace: MaterializedWorkspace): PiReadOperations {\n return {\n readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),\n access: async (absolutePath) => {\n await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK);\n },\n detectImageMimeType: async (absolutePath) => this.detectImageMimeType(await this.ensureSolidFsPath(workspace, absolutePath)),\n };\n }\n\n private createSolidFsEditOperations(workspace: MaterializedWorkspace): PiEditOperations {\n return {\n readFile: async (absolutePath) => fs.promises.readFile(await this.ensureSolidFsPath(workspace, absolutePath)),\n writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),\n access: async (absolutePath) => {\n await fs.promises.access(await this.ensureSolidFsPath(workspace, absolutePath), fs.constants.R_OK | fs.constants.W_OK);\n },\n };\n }\n\n private createSolidFsWriteOperations(workspace: MaterializedWorkspace): PiWriteOperations {\n return {\n writeFile: async (absolutePath, content) => fs.promises.writeFile(await this.ensureSolidFsWritablePath(workspace, absolutePath), content, 'utf8'),\n mkdir: (dir) => fs.promises.mkdir(dir, { recursive: true }).then(() => undefined),\n };\n }\n\n private async ensureSolidFsWritablePath(workspace: MaterializedWorkspace, absolutePath: string): Promise<string> {\n try {\n return await this.ensureSolidFsPath(workspace, absolutePath);\n } catch (error) {\n if (error instanceof SolidFsNotFoundError) {\n return path.resolve(absolutePath);\n }\n throw error;\n }\n }\n\n private async ensureSolidFsPath(workspace: MaterializedWorkspace, absolutePath: string): Promise<string> {\n if (!this.canHydrateWorkspace(workspace)) {\n return absolutePath;\n }\n\n const resolved = path.resolve(absolutePath);\n const root = path.resolve(workspace.cwd);\n if (resolved !== root && !resolved.startsWith(`${root}${path.sep}`)) {\n return absolutePath;\n }\n\n try {\n await fs.promises.access(resolved, fs.constants.F_OK);\n return resolved;\n } catch {\n const relativePath = path.relative(root, resolved);\n await workspace.hydrate(relativePath);\n return resolved;\n }\n }\n\n private canHydrateWorkspace(workspace: MaterializedWorkspace): workspace is MaterializedWorkspace & Required<Pick<MaterializedWorkspace, 'hydrate'>> {\n return workspace.manifest.projection === 'hydrated-object' && typeof workspace.hydrate === 'function';\n }\n\n private async detectImageMimeType(absolutePath: string): Promise<string | null> {\n const handle = await fs.promises.open(absolutePath, 'r');\n try {\n const buffer = Buffer.alloc(12);\n const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);\n const header = buffer.subarray(0, bytesRead);\n if (header.subarray(0, 3).equals(Buffer.from([0xff, 0xd8, 0xff]))) {\n return 'image/jpeg';\n }\n if (header.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {\n return 'image/png';\n }\n if (header.subarray(0, 6).toString('ascii') === 'GIF87a' || header.subarray(0, 6).toString('ascii') === 'GIF89a') {\n return 'image/gif';\n }\n if (header.subarray(0, 4).toString('ascii') === 'RIFF' && header.subarray(8, 12).toString('ascii') === 'WEBP') {\n return 'image/webp';\n }\n return null;\n } finally {\n await handle.close();\n }\n }\n\n private warmRuntimeKey(workdir: string, config: AgentRuntimeConfig): string {\n const agent = config.agentConfig;\n return JSON.stringify({\n workdir,\n baseUrl: agent?.baseUrl ?? getPlatformApiBaseUrl(),\n model: agent?.model ?? getPlatformDefaultModel(),\n apiKeyHash: this.hashSecret(agent?.apiKey ?? getPlatformApiKey()),\n systemPrompt: agent?.systemPrompt ?? '',\n skillsContent: agent?.skillsContent ?? '',\n permissionMode: agent?.permissionMode ?? '',\n allowedTools: agent?.allowedTools ?? [],\n disallowedTools: agent?.disallowedTools ?? [],\n persistPiSessions: this.options.persistPiSessions === true,\n agentLoopIsolation: this.options.agentLoopIsolation ?? 'in-process',\n thinkingLevel: this.resolveThinkingLevel(config),\n });\n }\n\n private hashSecret(value: string | undefined): string {\n return value\n ? crypto.createHash('sha256').update(value).digest('hex').slice(0, 16)\n : '';\n }\n\n private toPiMessages(\n conversation: RunConversationMessage[],\n config: { api: PiApi; provider: string; model: PiModel },\n ): PiMessage[] {\n return conversation.map((message) => {\n if (message.role === 'user') {\n return {\n role: 'user',\n content: [{ type: 'text', text: message.text }],\n timestamp: message.createdAt * 1000,\n };\n }\n return {\n role: 'assistant',\n content: [{ type: 'text', text: message.text }],\n api: config.api,\n provider: config.provider,\n model: config.model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n total: 0,\n },\n },\n stopReason: 'stop',\n timestamp: message.createdAt * 1000,\n };\n });\n }\n\n private async prepareWorkspace(input: RunExecutionInput): Promise<MaterializedWorkspace> {\n const source = await this.resolveWorkspaceSource(input.threadId, input.config.workspace, input.config);\n return this.solidfs.prepare({\n run: {\n id: input.runId,\n workspace: input.config.workspace,\n },\n workspace: input.config.workspace,\n sourcePath: source.sourcePath,\n projection: this.options.solidfsProjection ?? 'direct',\n context: input.context,\n });\n }\n\n private async resolveWorkspaceSource(\n threadId: string,\n workspace: WorkspaceRef,\n config?: AgentRuntimeConfig,\n ): Promise<{ sourcePath?: string }> {\n const url = new URL(workspace);\n let sourcePath: string | undefined;\n\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n const mapped = this.mapPodUrlToLocalPath(workspace);\n if (!mapped || !fs.existsSync(mapped)) {\n throw new WaitingRunnerError(workspace, `Workspace is not mounted on this runner: ${workspace}`);\n }\n sourcePath = mapped;\n } else if (url.protocol === 'file:') {\n if (!this.canResolveFileWorkspace(url)) {\n throw new WaitingRunnerError(workspace, `Waiting for a runner that can resolve workspace ${workspace}`);\n }\n sourcePath = decodeURIComponent(url.pathname);\n if (!fs.existsSync(sourcePath)) {\n throw new Error(`workspace reference does not exist on this runner: ${workspace}`);\n }\n } else {\n throw new Error(`Unsupported workspace reference protocol: ${url.protocol}`);\n }\n\n const worktree = config?.worktree;\n if (!worktree) {\n return { sourcePath };\n }\n\n const repoRoot = sourcePath;\n if (!repoRoot) {\n throw new Error(`Cannot create worktree without a local workspace source: ${workspace}`);\n }\n\n if (worktree.mode === 'existing') {\n if (!fs.existsSync(worktree.path)) {\n throw new Error(`worktree.path not found: ${worktree.path}`);\n }\n return { sourcePath: worktree.path };\n }\n\n await this.git.assertGitRepo(repoRoot);\n\n const root = path.join(repoRoot, '.xpod-worktrees');\n const worktreePath = path.join(root, threadId);\n\n if (fs.existsSync(worktreePath)) {\n return { sourcePath: worktreePath };\n }\n\n await this.git.createWorktree({\n repoPath: repoRoot,\n worktreePath,\n baseRef: worktree.baseRef ?? 'main',\n branch: worktree.branch,\n });\n\n return { sourcePath: worktreePath };\n }\n\n private canResolveFileWorkspace(url: URL): boolean {\n const authority = url.hostname;\n if (!authority || authority === 'localhost') {\n return true;\n }\n const configured = process.env.XPOD_RUNNER_AUTHORITY?.trim();\n return authority === configured || authority === os.hostname();\n }\n\n private mapPodUrlToLocalPath(rootUrl: string): string | undefined {\n const rootFilePath = process.env.CSS_ROOT_FILE_PATH;\n const baseUrl = process.env.CSS_BASE_URL;\n if (!rootFilePath || !baseUrl) {\n return undefined;\n }\n\n try {\n const base = new URL(baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`);\n const pod = new URL(rootUrl.endsWith('/') ? rootUrl : `${rootUrl}/`);\n if (base.origin !== pod.origin) {\n return undefined;\n }\n if (!pod.pathname.startsWith(base.pathname)) {\n return undefined;\n }\n const relativePath = decodeURIComponent(pod.pathname.slice(base.pathname.length)).replace(/\\/+$/, '');\n const resolvedRoot = path.resolve(rootFilePath);\n const resolved = path.resolve(resolvedRoot, relativePath);\n if (resolved !== resolvedRoot && !resolved.startsWith(`${resolvedRoot}${path.sep}`)) {\n return undefined;\n }\n return resolved;\n } catch {\n return undefined;\n }\n }\n\n private createSessionManager(pi: PiSdk, runId: string, workdir: string): ReturnType<PiSdk['SessionManager']['inMemory']> {\n if (this.options.persistPiSessions) {\n return pi.SessionManager.create(workdir, this.resolveSessionDir(runId, workdir));\n }\n return pi.SessionManager.inMemory(workdir);\n }\n\n private resolveSessionDir(runId: string, workdir: string): string {\n const root = this.options.sessionRootDir ?? path.join(os.tmpdir(), 'xpod-pi-sessions');\n const hash = crypto.createHash('sha256').update(`${workdir}:${runId}`).digest('hex').slice(0, 20);\n return path.join(root, hash);\n }\n\n private resolveWorkerPath(): string {\n if (this.options.workerPath) {\n return this.options.workerPath;\n }\n return path.join(__dirname, `PiAgentRuntimeWorker${path.extname(__filename)}`);\n }\n\n private workerEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') {\n env[key] = value;\n }\n }\n env.XPOD_AGENT_LOOP_WORKER = '1';\n return env;\n }\n\n private extractText(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n return content\n .map((part) => {\n if (part && typeof part === 'object' && (part as any).type === 'text') {\n return typeof (part as any).text === 'string' ? (part as any).text : '';\n }\n return '';\n })\n .join('');\n }\n\n private formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n }\n\n private startupErrorToEvent(error: unknown): AgentRuntimeEvent {\n if (error instanceof WaitingRunnerError) {\n return {\n type: 'waiting_runner',\n workspace: error.workspace,\n message: error.message,\n };\n }\n return { type: 'error', message: this.formatError(error) };\n }\n\n private logWorkspaceRollbackError(error: unknown): void {\n console.warn(`SolidFS rollback failed: ${this.formatError(error)}`);\n }\n\n private async loadPiSdk(): Promise<PiSdk> {\n if (this.options.piSdk) {\n return this.options.piSdk;\n }\n if (PiAgentRuntimeDriver.sdkPromise) {\n return PiAgentRuntimeDriver.sdkPromise;\n }\n // Keep a native dynamic import so the CommonJS build can lazily load pi's\n // ESM-only package instead of requiring it during CSS component discovery.\n const nativeImport = new Function('specifier', 'return import(specifier)') as (specifier: string) => Promise<PiSdk>;\n PiAgentRuntimeDriver.sdkPromise = nativeImport('@mariozechner/pi-coding-agent');\n return PiAgentRuntimeDriver.sdkPromise;\n }\n}\n\nexport const PI_AGENT_WORKER_EVENT_PREFIX = 'XPOD_AGENT_EVENT ';\n\nclass WaitingRunnerError extends Error {\n public constructor(\n public readonly workspace: WorkspaceRef,\n message: string,\n ) {\n super(message);\n }\n}\n\nclass AsyncPushQueue<T> {\n private readonly items: T[] = [];\n private resolvers: Array<() => void> = [];\n private closed = false;\n\n public push(item: T): void {\n if (this.closed) {\n return;\n }\n this.items.push(item);\n const resolver = this.resolvers.shift();\n resolver?.();\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n for (const resolver of this.resolvers) {\n resolver();\n }\n this.resolvers = [];\n }\n\n public async *iterate(): AsyncIterable<T> {\n while (true) {\n if (this.items.length > 0) {\n yield this.items.shift()!;\n continue;\n }\n if (this.closed) {\n return;\n }\n await new Promise<void>((resolve) => this.resolvers.push(resolve));\n }\n }\n}\n"]}
|