@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.
Files changed (249) hide show
  1. package/config/cli.json +1 -1
  2. package/config/cloud.json +54 -22
  3. package/config/local.json +56 -12
  4. package/config/resolver.json +10 -2
  5. package/config/xpod.base.json +50 -0
  6. package/config/xpod.json +8 -8
  7. package/dist/agents/config/resolve.js +10 -10
  8. package/dist/agents/config/resolve.js.map +1 -1
  9. package/dist/api/chatkit/index.d.ts +1 -1
  10. package/dist/api/chatkit/index.js.map +1 -1
  11. package/dist/api/chatkit/pod-store.d.ts +14 -11
  12. package/dist/api/chatkit/pod-store.js +114 -78
  13. package/dist/api/chatkit/pod-store.js.map +1 -1
  14. package/dist/api/chatkit/runtime/AcpAgentRuntime.js +1 -1
  15. package/dist/api/chatkit/runtime/AcpAgentRuntime.js.map +1 -1
  16. package/dist/api/chatkit/service.js +1 -1
  17. package/dist/api/chatkit/service.js.map +1 -1
  18. package/dist/api/chatkit/types.d.ts +11 -11
  19. package/dist/api/chatkit/types.js +3 -3
  20. package/dist/api/chatkit/types.js.map +1 -1
  21. package/dist/api/container/cloud.js +0 -8
  22. package/dist/api/container/cloud.js.map +1 -1
  23. package/dist/api/container/index.js +2 -1
  24. package/dist/api/container/index.js.map +1 -1
  25. package/dist/api/container/local.js +0 -7
  26. package/dist/api/container/local.js.map +1 -1
  27. package/dist/api/container/routes.js +3 -17
  28. package/dist/api/container/routes.js.map +1 -1
  29. package/dist/api/container/types.d.ts +0 -2
  30. package/dist/api/container/types.js.map +1 -1
  31. package/dist/api/handlers/PodManagementHandler.d.ts +3 -0
  32. package/dist/api/handlers/PodManagementHandler.js +71 -1
  33. package/dist/api/handlers/PodManagementHandler.js.map +1 -1
  34. package/dist/api/handlers/RunHandler.js +5 -5
  35. package/dist/api/handlers/RunHandler.js.map +1 -1
  36. package/dist/api/runs/AgentRuntimeTypes.d.ts +7 -8
  37. package/dist/api/runs/AgentRuntimeTypes.js.map +1 -1
  38. package/dist/api/runs/InngestRunExecutionBackend.d.ts +2 -2
  39. package/dist/api/runs/ManagedRunWorker.d.ts +1 -1
  40. package/dist/api/runs/ManagedRunWorker.js +6 -6
  41. package/dist/api/runs/ManagedRunWorker.js.map +1 -1
  42. package/dist/api/runs/PiAgentRuntimeDriver.d.ts +16 -1
  43. package/dist/api/runs/PiAgentRuntimeDriver.js +182 -23
  44. package/dist/api/runs/PiAgentRuntimeDriver.js.map +1 -1
  45. package/dist/api/runs/RunStateCenter.d.ts +3 -3
  46. package/dist/api/runs/RunStateCenter.js +13 -13
  47. package/dist/api/runs/RunStateCenter.js.map +1 -1
  48. package/dist/api/runs/store.d.ts +4 -4
  49. package/dist/api/runs/store.js +2 -2
  50. package/dist/api/runs/store.js.map +1 -1
  51. package/dist/api/service/VectorStoreService.d.ts +1 -1
  52. package/dist/api/service/VectorStoreService.js +16 -16
  53. package/dist/api/service/VectorStoreService.js.map +1 -1
  54. package/dist/api/tasks/InngestTaskScheduler.d.ts +4 -4
  55. package/dist/api/tasks/TaskMaterializer.d.ts +3 -3
  56. package/dist/api/tasks/TaskMaterializer.js +11 -11
  57. package/dist/api/tasks/TaskMaterializer.js.map +1 -1
  58. package/dist/api/tasks/TaskService.d.ts +3 -3
  59. package/dist/api/tasks/TaskService.js +11 -7
  60. package/dist/api/tasks/TaskService.js.map +1 -1
  61. package/dist/api/tasks/store.d.ts +10 -4
  62. package/dist/api/tasks/store.js +14 -4
  63. package/dist/api/tasks/store.js.map +1 -1
  64. package/dist/api/workspace/types.d.ts +3 -3
  65. package/dist/api/workspace/types.js +6 -6
  66. package/dist/api/workspace/types.js.map +1 -1
  67. package/dist/cli/commands/config.js +2 -2
  68. package/dist/cli/commands/config.js.map +1 -1
  69. package/dist/cli/commands/start.js +9 -3
  70. package/dist/cli/commands/start.js.map +1 -1
  71. package/dist/components/components.jsonld +8 -2
  72. package/dist/components/context.jsonld +302 -51
  73. package/dist/http/search/SearchHttpHandler.js +8 -8
  74. package/dist/http/search/SearchHttpHandler.js.map +1 -1
  75. package/dist/identity/drizzle/PodLookupRepository.d.ts +11 -1
  76. package/dist/identity/drizzle/PodLookupRepository.js +95 -4
  77. package/dist/identity/drizzle/PodLookupRepository.js.map +1 -1
  78. package/dist/identity/drizzle/db.js +4 -43
  79. package/dist/identity/drizzle/db.js.map +1 -1
  80. package/dist/identity/drizzle/schema.pg.d.ts +0 -5
  81. package/dist/identity/drizzle/schema.pg.js +2 -16
  82. package/dist/identity/drizzle/schema.pg.js.map +1 -1
  83. package/dist/identity/drizzle/schema.sqlite.d.ts +19 -176
  84. package/dist/identity/drizzle/schema.sqlite.js +2 -16
  85. package/dist/identity/drizzle/schema.sqlite.js.map +1 -1
  86. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.d.ts +4 -4
  87. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js +7 -7
  88. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.js.map +1 -1
  89. package/dist/identity/oidc/AutoDetectIdentityProviderHandler.jsonld +6 -6
  90. package/dist/identity/oidc/AutoDetectOidcHandler.d.ts +4 -4
  91. package/dist/identity/oidc/AutoDetectOidcHandler.js +6 -6
  92. package/dist/identity/oidc/AutoDetectOidcHandler.js.map +1 -1
  93. package/dist/identity/oidc/AutoDetectOidcHandler.jsonld +6 -6
  94. package/dist/identity/oidc/ScopedPickWebIdHandler.d.ts +37 -0
  95. package/dist/identity/oidc/ScopedPickWebIdHandler.js +211 -0
  96. package/dist/identity/oidc/ScopedPickWebIdHandler.js.map +1 -0
  97. package/dist/identity/oidc/ScopedPickWebIdHandler.jsonld +158 -0
  98. package/dist/index.d.ts +12 -2
  99. package/dist/index.js +16 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.js +8 -2
  102. package/dist/main.js.map +1 -1
  103. package/dist/provision/ProvisionPodCreator.d.ts +3 -4
  104. package/dist/provision/ProvisionPodCreator.js +8 -13
  105. package/dist/provision/ProvisionPodCreator.js.map +1 -1
  106. package/dist/provision/ProvisionPodCreator.jsonld +7 -7
  107. package/dist/runtime/Proxy.d.ts +0 -1
  108. package/dist/runtime/Proxy.js +0 -9
  109. package/dist/runtime/Proxy.js.map +1 -1
  110. package/dist/runtime/bootstrap.d.ts +1 -0
  111. package/dist/runtime/bootstrap.js +5 -2
  112. package/dist/runtime/bootstrap.js.map +1 -1
  113. package/dist/runtime/css-process.d.ts +12 -4
  114. package/dist/runtime/css-process.js +61 -14
  115. package/dist/runtime/css-process.js.map +1 -1
  116. package/dist/runtime/oidc-issuer.d.ts +3 -2
  117. package/dist/runtime/oidc-issuer.js +3 -2
  118. package/dist/runtime/oidc-issuer.js.map +1 -1
  119. package/dist/runtime/runtime-types.d.ts +1 -0
  120. package/dist/runtime/runtime-types.js.map +1 -1
  121. package/dist/solidfs/LocalFirstRdfRepresentationResolver.d.ts +21 -0
  122. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js +38 -0
  123. package/dist/solidfs/LocalFirstRdfRepresentationResolver.js.map +1 -0
  124. package/dist/solidfs/LocalSolidFS.d.ts +18 -0
  125. package/dist/solidfs/LocalSolidFS.js +539 -0
  126. package/dist/solidfs/LocalSolidFS.js.map +1 -0
  127. package/dist/solidfs/PodSolidFsHttpClient.d.ts +16 -0
  128. package/dist/solidfs/PodSolidFsHttpClient.js +93 -0
  129. package/dist/solidfs/PodSolidFsHttpClient.js.map +1 -0
  130. package/dist/solidfs/PodSolidFsHydrator.d.ts +27 -0
  131. package/dist/solidfs/PodSolidFsHydrator.js +127 -0
  132. package/dist/solidfs/PodSolidFsHydrator.js.map +1 -0
  133. package/dist/solidfs/PodSolidFsSyncer.d.ts +21 -0
  134. package/dist/solidfs/PodSolidFsSyncer.js +78 -0
  135. package/dist/solidfs/PodSolidFsSyncer.js.map +1 -0
  136. package/dist/solidfs/RdfIndexSolidFsSyncer.d.ts +22 -0
  137. package/dist/solidfs/RdfIndexSolidFsSyncer.js +131 -0
  138. package/dist/solidfs/RdfIndexSolidFsSyncer.js.map +1 -0
  139. package/dist/solidfs/index.d.ts +7 -0
  140. package/dist/solidfs/index.js +24 -0
  141. package/dist/solidfs/index.js.map +1 -0
  142. package/dist/solidfs/types.d.ts +131 -0
  143. package/dist/solidfs/types.js +19 -0
  144. package/dist/solidfs/types.js.map +1 -0
  145. package/dist/storage/RepresentationPartialConvertingStore.js +6 -13
  146. package/dist/storage/RepresentationPartialConvertingStore.js.map +1 -1
  147. package/dist/storage/SparqlUpdateResourceStore.d.ts +4 -0
  148. package/dist/storage/SparqlUpdateResourceStore.js +13 -0
  149. package/dist/storage/SparqlUpdateResourceStore.js.map +1 -1
  150. package/dist/storage/SparqlUpdateResourceStore.jsonld +26 -0
  151. package/dist/storage/accessors/MixDataAccessor.d.ts +85 -4
  152. package/dist/storage/accessors/MixDataAccessor.js +511 -16
  153. package/dist/storage/accessors/MixDataAccessor.js.map +1 -1
  154. package/dist/storage/accessors/MixDataAccessor.jsonld +176 -1
  155. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.d.ts +7 -0
  156. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js +72 -4
  157. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.js.map +1 -1
  158. package/dist/storage/accessors/QuintStoreSparqlDataAccessor.jsonld +24 -0
  159. package/dist/storage/quint/BaseQuintStore.d.ts +3 -0
  160. package/dist/storage/quint/BaseQuintStore.js +51 -27
  161. package/dist/storage/quint/BaseQuintStore.js.map +1 -1
  162. package/dist/storage/quint/PgQuintStore.d.ts +1 -0
  163. package/dist/storage/quint/PgQuintStore.js +50 -32
  164. package/dist/storage/quint/PgQuintStore.js.map +1 -1
  165. package/dist/storage/quint/PgQuintStore.jsonld +4 -3
  166. package/dist/storage/quint/SqliteQuintStore.d.ts +5 -0
  167. package/dist/storage/quint/SqliteQuintStore.js +100 -0
  168. package/dist/storage/quint/SqliteQuintStore.js.map +1 -1
  169. package/dist/storage/quint/SqliteQuintStore.jsonld +20 -0
  170. package/dist/storage/quint/types.d.ts +16 -0
  171. package/dist/storage/quint/types.js.map +1 -1
  172. package/dist/storage/rdf/Rdf3xTripleIndex.d.ts +55 -0
  173. package/dist/storage/rdf/Rdf3xTripleIndex.js +1235 -0
  174. package/dist/storage/rdf/Rdf3xTripleIndex.js.map +1 -0
  175. package/dist/storage/rdf/RdfContentTypes.d.ts +9 -0
  176. package/dist/storage/rdf/RdfContentTypes.js +79 -0
  177. package/dist/storage/rdf/RdfContentTypes.js.map +1 -0
  178. package/dist/storage/rdf/RdfLocalQueryEngine.d.ts +76 -0
  179. package/dist/storage/rdf/RdfLocalQueryEngine.js +2636 -0
  180. package/dist/storage/rdf/RdfLocalQueryEngine.js.map +1 -0
  181. package/dist/storage/rdf/RdfQuadIndex.d.ts +98 -0
  182. package/dist/storage/rdf/RdfQuadIndex.js +1840 -0
  183. package/dist/storage/rdf/RdfQuadIndex.js.map +1 -0
  184. package/dist/storage/rdf/RdfQuadIndex.jsonld +416 -0
  185. package/dist/storage/rdf/RdfShadowComparator.d.ts +12 -0
  186. package/dist/storage/rdf/RdfShadowComparator.js +47 -0
  187. package/dist/storage/rdf/RdfShadowComparator.js.map +1 -0
  188. package/dist/storage/rdf/RdfSparqlAdapter.d.ts +147 -0
  189. package/dist/storage/rdf/RdfSparqlAdapter.js +2420 -0
  190. package/dist/storage/rdf/RdfSparqlAdapter.js.map +1 -0
  191. package/dist/storage/rdf/RdfSparqlAdapter.jsonld +414 -0
  192. package/dist/storage/rdf/RdfTermDictionary.d.ts +27 -0
  193. package/dist/storage/rdf/RdfTermDictionary.js +352 -0
  194. package/dist/storage/rdf/RdfTermDictionary.js.map +1 -0
  195. package/dist/storage/rdf/RdfTermDictionary.jsonld +114 -0
  196. package/dist/storage/rdf/RdfTermSemantics.d.ts +6 -0
  197. package/dist/storage/rdf/RdfTermSemantics.js +40 -0
  198. package/dist/storage/rdf/RdfTermSemantics.js.map +1 -0
  199. package/dist/storage/rdf/RdfTextIndex.d.ts +23 -0
  200. package/dist/storage/rdf/RdfTextIndex.js +569 -0
  201. package/dist/storage/rdf/RdfTextIndex.js.map +1 -0
  202. package/dist/storage/rdf/RdfVectorIndex.d.ts +22 -0
  203. package/dist/storage/rdf/RdfVectorIndex.js +631 -0
  204. package/dist/storage/rdf/RdfVectorIndex.js.map +1 -0
  205. package/dist/storage/rdf/RdfXmlSerializer.d.ts +2 -0
  206. package/dist/storage/rdf/RdfXmlSerializer.js +123 -0
  207. package/dist/storage/rdf/RdfXmlSerializer.js.map +1 -0
  208. package/dist/storage/rdf/ShadowRdfQuintStore.d.ts +58 -0
  209. package/dist/storage/rdf/ShadowRdfQuintStore.js +202 -0
  210. package/dist/storage/rdf/ShadowRdfQuintStore.js.map +1 -0
  211. package/dist/storage/rdf/ShadowRdfQuintStore.jsonld +308 -0
  212. package/dist/storage/rdf/SolidRdfEngine.d.ts +51 -0
  213. package/dist/storage/rdf/SolidRdfEngine.js +264 -0
  214. package/dist/storage/rdf/SolidRdfEngine.js.map +1 -0
  215. package/dist/storage/rdf/SolidRdfEngine.jsonld +338 -0
  216. package/dist/storage/rdf/SolidRdfSparqlEngine.d.ts +92 -0
  217. package/dist/storage/rdf/SolidRdfSparqlEngine.js +477 -0
  218. package/dist/storage/rdf/SolidRdfSparqlEngine.js.map +1 -0
  219. package/dist/storage/rdf/SolidRdfSparqlEngine.jsonld +257 -0
  220. package/dist/storage/rdf/index.d.ts +15 -0
  221. package/dist/storage/rdf/index.js +61 -0
  222. package/dist/storage/rdf/index.js.map +1 -0
  223. package/dist/storage/rdf/models-benchmark.d.ts +260 -0
  224. package/dist/storage/rdf/models-benchmark.js +1405 -0
  225. package/dist/storage/rdf/models-benchmark.js.map +1 -0
  226. package/dist/storage/rdf/types.d.ts +726 -0
  227. package/dist/storage/rdf/types.js +3 -0
  228. package/dist/storage/rdf/types.js.map +1 -0
  229. package/dist/storage/rdf/types.jsonld +316 -0
  230. package/dist/storage/vector/VectorIndexingListener.d.ts +5 -5
  231. package/dist/storage/vector/VectorIndexingListener.js +19 -19
  232. package/dist/storage/vector/VectorIndexingListener.js.map +1 -1
  233. package/package.json +3 -2
  234. package/templates/pod/acp/.acr.hbs +39 -0
  235. package/templates/pod/acp/README.acr +18 -0
  236. package/templates/pod/acp/profile/card.acr +22 -0
  237. package/templates/pod/base/README$.md.hbs +27 -0
  238. package/templates/pod/base/profile/card$.ttl.hbs +13 -0
  239. package/templates/pod/wac/.acl.hbs +26 -0
  240. package/templates/pod/wac/README.acl.hbs +14 -0
  241. package/templates/pod/wac/profile/card.acl.hbs +19 -0
  242. package/dist/api/handlers/WebIdProfileHandler.d.ts +0 -16
  243. package/dist/api/handlers/WebIdProfileHandler.js +0 -423
  244. package/dist/api/handlers/WebIdProfileHandler.js.map +0 -1
  245. package/dist/identity/drizzle/WebIdProfileRepository.d.ts +0 -63
  246. package/dist/identity/drizzle/WebIdProfileRepository.js +0 -168
  247. package/dist/identity/drizzle/WebIdProfileRepository.js.map +0 -1
  248. package/dist/identity/drizzle/WebIdProfileRepository.jsonld +0 -112
  249. 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 resolveWorkdir;
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
- const workdir = await this.resolveWorkdir(input.threadId, input.config.workspace, input.config);
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, workdir)) {
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
- const runtime = await this.getWarmRuntime(input);
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, workdir, config) {
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
- ? pi.createReadOnlyTools(workdir)
297
- : pi.createCodingTools(workdir);
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 = await this.resolveWorkdir(input.threadId, input.config.workspace, input.config);
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, workdir, input.config).catch((error) => {
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, workdir, config) {
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, workdir, config),
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 resolveWorkdir(threadId, workspace, config) {
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 workdir;
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
- workdir = mapped;
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
- workdir = decodeURIComponent(url.pathname);
432
- if (!fs.existsSync(workdir)) {
433
- throw new Error(`workspace URI does not exist on this runner: ${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 URI protocol: ${url.protocol}`);
590
+ throw new Error(`Unsupported workspace reference protocol: ${url.protocol}`);
438
591
  }
439
592
  const worktree = config?.worktree;
440
593
  if (!worktree) {
441
- return workdir;
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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8B;AAC9B,gDAAkC;AAClC,4CAA8B;AAC9B,oDAAsC;AACtC,iDAAgD;AAEhD,oEAAiE;AACjE,sEAAyI;AACzI,8EAA2E;AAC3E,oDAAwD;AACxD,2CAA2K;AA0G3K;;;;;;GAMG;AACH,MAAa,oBAAoB;IAO/B,YAAoC,UAAuC,EAAE;QAAzC,YAAO,GAAP,OAAO,CAAkC;QAJ5D,QAAG,GAAG,IAAI,uCAAkB,EAAE,CAAC;QAC/B,iBAAY,GAAG,IAAI,GAAG,EAAgC,CAAC;QAItE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,sBAAY,CAAC;YACjD,MAAM,EAAE,IAAI,0BAAgB,EAAE;YAC9B,QAAQ,EAAE,IAAI,4BAAkB,EAAE;SACnC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,CAAC,KAAK,CAAC,KAAwB;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,KAAK,mBAAmB,EAAE,CAAC;YAC5D,IAAI,SAA4C,CAAC;YACjD,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB;uBAC1C,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;gBACpF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvD,MAAM,KAAK,CAAC;oBACZ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAC3B,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;gBACzB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBAC1C,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;oBACxC,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO;QACT,CAAC;QAED,KAAK,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,CAAC,cAAc,CAAC,KAAwB;QACpD,MAAM,KAAK,GAAG,IAAI,cAAc,EAAqB,CAAC;QACtD,IAAI,OAAgF,CAAC;QACrF,IAAI,SAA4C,CAAC;QACjD,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,kBAAkB,CAAC;gBACjD,GAAG,EAAE,OAAO,CAAC,OAAO;gBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,cAAc;gBACd,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAC7B,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEvF,MAAM,WAAW,GAAG;gBAClB,iBAAiB,EAAE,EAAE;gBACrB,qBAAqB,EAAE,KAAK;aAC7B,CAAC;YACF,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC3F,IAAI,CAAC,WAAW,CAAC,qBAAqB,IAAI,WAAW,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnF,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,iBAAiB,EAAE,CAAC,CAAC;gBACpE,CAAC;gBACD,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACjB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAChE,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACd,WAAW,EAAE,CAAC;gBACd,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC3B,MAAM,GAAG,IAAI,CAAC;gBAChB,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;gBACzB,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC1C,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,uBAAuB,CAAC,KAAwB,EAAE,OAAe;QACvE,MAAM,KAAK,GAAG,IAAI,cAAc,EAAqB,CAAC;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;QAE3D,IAAI,cAAc,IAAI,CAAC,wBAAc,CAAC,WAAW,EAAE,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gFAAgF,EAAE,CAAC,CAAC;YACzH,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAG,wBAAc,CAAC,MAAM,CAAC;YAClC,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,QAAQ;YACzB,IAAI,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAChC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE;YACrB,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;QAEH,IAAI,cAAc,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAC,CAAC;YAC/F,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;QACjC,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,MAAM,SAAS,GAAG,GAAS,EAAE;YAC3B,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YACD,MAAM,GAAG,IAAI,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC,CAAC;QAEF,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACtC,KAAK;YACL,OAAO,EAAE;gBACP,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI;gBAC1D,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;aAC5C;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,GAAG,IAAA,+BAAe,EAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAO,EAAE,CAAC,CAAC;QAC7D,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,oCAA4B,CAAC,EAAE,CAAC;gBACnD,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,oCAA4B,CAAC,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,uCAAuC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3G,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACjD,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;gBACxD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yCAAyC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3G,SAAS,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACzC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yCAAyC,IAAI,IAAI,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;YAC7G,CAAC;YACD,SAAS,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAEO,cAAc,CACpB,KAAwB,EACxB,KAAwC,EACxC,KAGC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,qBAAqB,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC,CAAC;YACtE,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;YACnC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC1E,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACvE,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1D,MAAM,eAAe,GAAG,KAAK,CAAC,qBAAqB,CAAC;YACpD,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC7B,KAAK,CAAC,qBAAqB,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;QACT,CAAC;QAED,wEAAwE;QACxE,sEAAsE;IACxE,CAAC;IAEO,eAAe,CAAC,MAA0B;QAOhD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,IAAI,IAAA,0CAAqB,GAAE,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,MAAM,IAAI,IAAA,sCAAiB,GAAE,CAAC;QACjE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iIAAiI,CAAC,CAAC;QACrJ,CAAC;QACD,MAAM,eAAe,GAAG,OAAO,IAAI,IAAA,qCAAiB,EAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,IAAI,IAAA,4CAAuB,GAAE,CAAC;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QAEvD,OAAO;YACL,QAAQ;YACR,MAAM;YACN,GAAG;YACH,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE;gBACL,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,OAAO;gBACb,GAAG;gBACH,QAAQ;gBACR,OAAO,EAAE,eAAe;gBACxB,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE,CAAC,MAAM,CAAC;gBACf,IAAI,EAAE;oBACJ,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC;iBACd;gBACD,aAAa,EAAE,OAAO;gBACtB,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,GAAG,KAAK,oBAAoB;oBAClC,CAAC,CAAC;wBACA,aAAa,EAAE,KAAK;wBACpB,qBAAqB,EAAE,KAAK;wBAC5B,uBAAuB,EAAE,KAAK;qBAC/B;oBACD,CAAC,CAAC,SAAS;aACd;SACF,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,OAA2B;QACnD,MAAM,UAAU,GAAG,IAAA,0CAAqB,GAAE,CAAC;QAC3C,IAAI,UAAU,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAC9C,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACjD,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,OAAO,WAAW,CAAC;YACvD,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,OAAO,YAAY,CAAC;YACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAE,OAAO,UAAU,CAAC;YACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,OAAO,SAAS,CAAC;YAClD,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW;gBAAE,OAAO,QAAQ,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,oBAAoB,CAAC,OAAe;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YACvC,OAAO,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,oBAAoB,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,MAA0B;QACrD,MAAM,KAAK,GAAI,MAAM,CAAC,WAAmB,EAAE,aAAa,CAAC;QACzD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;YAC1G,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,KAAK,CAAC;IACZ,CAAC;IAEO,YAAY,CAAC,EAAS,EAAE,SAAgC,EAAE,MAA0B;QAC1F,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;QAC9B,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACnG,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QACzG,MAAM,SAAS,GAAG,cAAc,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;YAC7D,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,EAAE,EAAE,SAAS,CAAC;YAChD,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QAEjD,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC,CAAa,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,KAAwB,EAAE,SAAgC;QACrF,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAClF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,EAAS,EAAE,SAAgC,EAAE,MAA0B;QACrG,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC9C,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEjE,MAAM,aAAa,GAAG,IAAI,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACnE,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE;YAChD,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,MAAM,EAAE,CAAE,QAAQ,CAAC,KAAK,CAAE;SAC3B,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,eAAe,GAAG,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC;YAClD,eAAe,EAAE,QAAQ,CAAC,QAAQ;YAClC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE;YAC/B,oBAAoB,EAAE,aAAa;SACpC,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,IAAI,EAAE,CAAC,qBAAqB,CAAC;YAClD,GAAG,EAAE,OAAO;YACZ,eAAe;YACf,YAAY,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY;YAC9C,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,aAAa;YACrD,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;YACd,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;QAE9B,OAAO;YACL,EAAE;YACF,OAAO;YACP,QAAQ;YACR,aAAa;YACb,WAAW;YACX,aAAa;YACb,eAAe;YACf,cAAc;YACd,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC;SAChD,CAAC;IACJ,CAAC;IAEO,wBAAwB,CAAC,EAAS,EAAE,SAAgC;QAC1E,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO;YACL,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAW;YACvG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,CAAW;YAC1C,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAW;YACvG,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,4BAA4B,CAAC,SAAS,CAAC,EAAE,CAAW;SAC1G,CAAC;IACJ,CAAC;IAEO,0BAA0B,CAAC,EAAS,EAAE,SAAgC;QAC5E,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO;YACL,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAW;YACvG,GAAG,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SAChF,CAAC;IACJ,CAAC;IAEO,2BAA2B,CAAC,SAAgC;QAClE,OAAO;YACL,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC7G,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gBAC7B,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrG,CAAC;YACD,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;SAC7H,CAAC;IACJ,CAAC;IAEO,2BAA2B,CAAC,SAAgC;QAClE,OAAO;YACL,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC7G,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC;YACjJ,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE;gBAC7B,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACzH,CAAC;SACF,CAAC;IACJ,CAAC;IAEO,4BAA4B,CAAC,SAAgC;QACnE,OAAO;YACL,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC;YACjJ,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SAClF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,SAAgC,EAAE,YAAoB;QAC5F,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,8BAAoB,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,SAAgC,EAAE,YAAoB;QACpF,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;YACpE,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACnD,MAAM,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACtC,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,SAAgC;QAC1D,OAAO,SAAS,CAAC,QAAQ,CAAC,UAAU,KAAK,iBAAiB,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,UAAU,CAAC;IACxG,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,YAAoB;QACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClE,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChG,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACjH,OAAO,WAAW,CAAC;YACrB,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC9G,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,OAAe,EAAE,MAA0B;QAChE,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO;YACP,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAA,0CAAqB,GAAE;YAClD,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,IAAA,4CAAuB,GAAE;YAChD,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,IAAI,IAAA,sCAAiB,GAAE,CAAC;YACjE,YAAY,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;YACvC,aAAa,EAAE,KAAK,EAAE,aAAa,IAAI,EAAE;YACzC,cAAc,EAAE,KAAK,EAAE,cAAc,IAAI,EAAE;YAC3C,YAAY,EAAE,KAAK,EAAE,YAAY,IAAI,EAAE;YACvC,eAAe,EAAE,KAAK,EAAE,eAAe,IAAI,EAAE;YAC7C,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI;YAC1D,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,YAAY;YACnE,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAC,KAAyB;QAC1C,OAAO,KAAK;YACV,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YACtE,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAEO,YAAY,CAClB,YAAsC,EACtC,MAAwD;QAExD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAClC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5B,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC/C,SAAS,EAAE,OAAO,CAAC,SAAS,GAAG,IAAI;iBACpC,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC/C,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE;gBACtB,KAAK,EAAE;oBACL,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC;oBACb,WAAW,EAAE,CAAC;oBACd,IAAI,EAAE;wBACJ,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,CAAC;wBACT,SAAS,EAAE,CAAC;wBACZ,UAAU,EAAE,CAAC;wBACb,KAAK,EAAE,CAAC;qBACT;iBACF;gBACD,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,OAAO,CAAC,SAAS,GAAG,IAAI;aACpC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAwB;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvG,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC1B,GAAG,EAAE;gBACH,EAAE,EAAE,KAAK,CAAC,KAAK;gBACf,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;aAClC;YACD,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;YACjC,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,QAAQ;YACtD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,QAAgB,EAChB,SAAuB,EACvB,MAA2B;QAE3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,IAAI,UAA8B,CAAC;QAEnC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,4CAA4C,SAAS,EAAE,CAAC,CAAC;YACnG,CAAC;YACD,UAAU,GAAG,MAAM,CAAC;QACtB,CAAC;aAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,mDAAmD,SAAS,EAAE,CAAC,CAAC;YAC1G,CAAC;YACD,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,sDAAsD,SAAS,EAAE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,UAAU,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,4DAA4D,SAAS,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvC,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAE/C,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;QACtC,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;YAC5B,QAAQ,EAAE,QAAQ;YAClB,YAAY;YACZ,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,MAAM;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;IACtC,CAAC;IAEO,uBAAuB,CAAC,GAAQ;QACtC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;QAC7D,OAAO,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC;IACjE,CAAC;IAEO,oBAAoB,CAAC,OAAe;QAC1C,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;YACtE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACtG,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAC1D,IAAI,QAAQ,KAAK,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;gBACpF,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,EAAS,EAAE,KAAa,EAAE,OAAe;QACpE,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAEO,iBAAiB,CAAC,KAAa,EAAE,OAAe;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClG,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAEO,SAAS;QACf,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACnB,CAAC;QACH,CAAC;QACD,GAAG,CAAC,sBAAsB,GAAG,GAAG,CAAC;QACjC,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,WAAW,CAAC,OAAgB;QAClC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAK,IAAY,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACtE,OAAO,OAAQ,IAAY,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACd,CAAC;IAEO,WAAW,CAAC,KAAc;QAChC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAEO,mBAAmB,CAAC,KAAc;QACxC,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,OAAO;gBACL,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7D,CAAC;IAEO,yBAAyB,CAAC,KAAc;QAC9C,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,SAAS;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5B,CAAC;QACD,IAAI,oBAAoB,CAAC,UAAU,EAAE,CAAC;YACpC,OAAO,oBAAoB,CAAC,UAAU,CAAC;QACzC,CAAC;QACD,0EAA0E;QAC1E,2EAA2E;QAC3E,MAAM,YAAY,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,0BAA0B,CAA0C,CAAC;QACpH,oBAAoB,CAAC,UAAU,GAAG,YAAY,CAAC,+BAA+B,CAAC,CAAC;QAChF,OAAO,oBAAoB,CAAC,UAAU,CAAC;IACzC,CAAC;CACF;AA3vBD,oDA2vBC;AAEY,QAAA,4BAA4B,GAAG,mBAAmB,CAAC;AAEhE,MAAM,kBAAmB,SAAQ,KAAK;IACpC,YACkB,SAAuB,EACvC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,cAAS,GAAT,SAAS,CAAc;IAIzC,CAAC;CACF;AAED,MAAM,cAAc;IAApB;QACmB,UAAK,GAAQ,EAAE,CAAC;QACzB,cAAS,GAAsB,EAAE,CAAC;QAClC,WAAM,GAAG,KAAK,CAAC;IAkCzB,CAAC;IAhCQ,IAAI,CAAC,IAAO;QACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACxC,QAAQ,EAAE,EAAE,CAAC;IACf,CAAC;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,CAAC,OAAO;QACnB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;CACF","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"]}