@fleetagent/pi-coding-agent 0.0.5 → 0.0.7

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 (201) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +28 -5
  3. package/dist/cli/args.d.ts +2 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +9 -0
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/file-processor.d.ts.map +1 -1
  8. package/dist/cli/file-processor.js +2 -3
  9. package/dist/cli/file-processor.js.map +1 -1
  10. package/dist/config.d.ts.map +1 -1
  11. package/dist/config.js +15 -2
  12. package/dist/config.js.map +1 -1
  13. package/dist/core/agent-session.d.ts +13 -3
  14. package/dist/core/agent-session.d.ts.map +1 -1
  15. package/dist/core/agent-session.js +130 -23
  16. package/dist/core/agent-session.js.map +1 -1
  17. package/dist/core/diagnostics.d.ts +1 -1
  18. package/dist/core/diagnostics.d.ts.map +1 -1
  19. package/dist/core/diagnostics.js.map +1 -1
  20. package/dist/core/export-html/template.js +6 -3
  21. package/dist/core/extensions/runner.d.ts +5 -1
  22. package/dist/core/extensions/runner.d.ts.map +1 -1
  23. package/dist/core/extensions/runner.js +13 -3
  24. package/dist/core/extensions/runner.js.map +1 -1
  25. package/dist/core/extensions/types.d.ts +6 -3
  26. package/dist/core/extensions/types.d.ts.map +1 -1
  27. package/dist/core/extensions/types.js.map +1 -1
  28. package/dist/core/model-registry.d.ts.map +1 -1
  29. package/dist/core/model-registry.js +65 -13
  30. package/dist/core/model-registry.js.map +1 -1
  31. package/dist/core/output-guard.d.ts +1 -0
  32. package/dist/core/output-guard.d.ts.map +1 -1
  33. package/dist/core/output-guard.js +52 -22
  34. package/dist/core/output-guard.js.map +1 -1
  35. package/dist/core/package-manager.d.ts +1 -0
  36. package/dist/core/package-manager.d.ts.map +1 -1
  37. package/dist/core/package-manager.js +161 -24
  38. package/dist/core/package-manager.js.map +1 -1
  39. package/dist/core/pi-agent.d.ts.map +1 -1
  40. package/dist/core/pi-agent.js +12 -3
  41. package/dist/core/pi-agent.js.map +1 -1
  42. package/dist/core/resolve-config-value.d.ts +9 -1
  43. package/dist/core/resolve-config-value.d.ts.map +1 -1
  44. package/dist/core/resolve-config-value.js +134 -11
  45. package/dist/core/resolve-config-value.js.map +1 -1
  46. package/dist/core/resource-loader.d.ts +30 -0
  47. package/dist/core/resource-loader.d.ts.map +1 -1
  48. package/dist/core/resource-loader.js +94 -0
  49. package/dist/core/resource-loader.js.map +1 -1
  50. package/dist/core/rules.d.ts +57 -0
  51. package/dist/core/rules.d.ts.map +1 -0
  52. package/dist/core/rules.js +384 -0
  53. package/dist/core/rules.js.map +1 -0
  54. package/dist/core/session/jsonl-helpers.d.ts +2 -1
  55. package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
  56. package/dist/core/session/jsonl-helpers.js +6 -3
  57. package/dist/core/session/jsonl-helpers.js.map +1 -1
  58. package/dist/core/session/local-session-manager.d.ts +1 -0
  59. package/dist/core/session/local-session-manager.d.ts.map +1 -1
  60. package/dist/core/session/local-session-manager.js +12 -4
  61. package/dist/core/session/local-session-manager.js.map +1 -1
  62. package/dist/core/session/session-manager.d.ts +1 -0
  63. package/dist/core/session/session-manager.d.ts.map +1 -1
  64. package/dist/core/session/session-manager.js.map +1 -1
  65. package/dist/core/session/stores/jsonl-session-store.d.ts +2 -1
  66. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
  67. package/dist/core/session/stores/jsonl-session-store.js +105 -78
  68. package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
  69. package/dist/core/settings-manager.d.ts +7 -0
  70. package/dist/core/settings-manager.d.ts.map +1 -1
  71. package/dist/core/settings-manager.js +28 -9
  72. package/dist/core/settings-manager.js.map +1 -1
  73. package/dist/core/slash-commands.d.ts +1 -1
  74. package/dist/core/slash-commands.d.ts.map +1 -1
  75. package/dist/core/slash-commands.js +1 -1
  76. package/dist/core/slash-commands.js.map +1 -1
  77. package/dist/core/system-prompt.d.ts +3 -0
  78. package/dist/core/system-prompt.d.ts.map +1 -1
  79. package/dist/core/system-prompt.js +11 -3
  80. package/dist/core/system-prompt.js.map +1 -1
  81. package/dist/core/tools/bash.d.ts.map +1 -1
  82. package/dist/core/tools/bash.js +73 -63
  83. package/dist/core/tools/bash.js.map +1 -1
  84. package/dist/core/tools/edit.d.ts.map +1 -1
  85. package/dist/core/tools/edit.js +45 -76
  86. package/dist/core/tools/edit.js.map +1 -1
  87. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  88. package/dist/core/tools/file-mutation-queue.js +27 -12
  89. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  90. package/dist/core/tools/find.d.ts.map +1 -1
  91. package/dist/core/tools/find.js +11 -2
  92. package/dist/core/tools/find.js.map +1 -1
  93. package/dist/core/tools/grep.d.ts.map +1 -1
  94. package/dist/core/tools/grep.js +3 -3
  95. package/dist/core/tools/grep.js.map +1 -1
  96. package/dist/core/tools/ls.d.ts.map +1 -1
  97. package/dist/core/tools/ls.js +13 -4
  98. package/dist/core/tools/ls.js.map +1 -1
  99. package/dist/core/tools/path-utils.d.ts +1 -0
  100. package/dist/core/tools/path-utils.d.ts.map +1 -1
  101. package/dist/core/tools/path-utils.js +37 -0
  102. package/dist/core/tools/path-utils.js.map +1 -1
  103. package/dist/core/tools/read.d.ts.map +1 -1
  104. package/dist/core/tools/read.js +13 -8
  105. package/dist/core/tools/read.js.map +1 -1
  106. package/dist/core/tools/write.d.ts.map +1 -1
  107. package/dist/core/tools/write.js +24 -32
  108. package/dist/core/tools/write.js.map +1 -1
  109. package/dist/index.d.ts +1 -0
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/main.d.ts.map +1 -1
  114. package/dist/main.js +6 -2
  115. package/dist/main.js.map +1 -1
  116. package/dist/migrations.d.ts.map +1 -1
  117. package/dist/migrations.js +118 -1
  118. package/dist/migrations.js.map +1 -1
  119. package/dist/modes/interactive/components/config-selector.d.ts +1 -1
  120. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/config-selector.js +12 -3
  122. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  123. package/dist/modes/interactive/components/footer.d.ts +1 -0
  124. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  125. package/dist/modes/interactive/components/footer.js +14 -5
  126. package/dist/modes/interactive/components/footer.js.map +1 -1
  127. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/settings-selector.js +1 -1
  129. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  130. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/user-message.js +1 -1
  132. package/dist/modes/interactive/components/user-message.js.map +1 -1
  133. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  134. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  135. package/dist/modes/interactive/interactive-mode.js +64 -9
  136. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  137. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  138. package/dist/modes/interactive/theme/theme.js +10 -0
  139. package/dist/modes/interactive/theme/theme.js.map +1 -1
  140. package/dist/modes/rpc/rpc-client.d.ts +5 -0
  141. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  142. package/dist/modes/rpc/rpc-client.js +91 -18
  143. package/dist/modes/rpc/rpc-client.js.map +1 -1
  144. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  145. package/dist/modes/rpc/rpc-mode.js +23 -3
  146. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  147. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  148. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  149. package/dist/modes/rpc/rpc-types.js.map +1 -1
  150. package/dist/utils/clipboard-native.d.ts +3 -1
  151. package/dist/utils/clipboard-native.d.ts.map +1 -1
  152. package/dist/utils/clipboard-native.js +14 -8
  153. package/dist/utils/clipboard-native.js.map +1 -1
  154. package/dist/utils/deprecation.d.ts +4 -0
  155. package/dist/utils/deprecation.d.ts.map +1 -0
  156. package/dist/utils/deprecation.js +13 -0
  157. package/dist/utils/deprecation.js.map +1 -0
  158. package/dist/utils/image-resize-core.d.ts +30 -0
  159. package/dist/utils/image-resize-core.d.ts.map +1 -0
  160. package/dist/utils/image-resize-core.js +124 -0
  161. package/dist/utils/image-resize-core.js.map +1 -0
  162. package/dist/utils/image-resize-worker.d.ts +2 -0
  163. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  164. package/dist/utils/image-resize-worker.js +31 -0
  165. package/dist/utils/image-resize-worker.js.map +1 -0
  166. package/dist/utils/image-resize.d.ts +6 -27
  167. package/dist/utils/image-resize.d.ts.map +1 -1
  168. package/dist/utils/image-resize.js +60 -116
  169. package/dist/utils/image-resize.js.map +1 -1
  170. package/dist/utils/json.d.ts +3 -0
  171. package/dist/utils/json.d.ts.map +1 -0
  172. package/dist/utils/json.js +7 -0
  173. package/dist/utils/json.js.map +1 -0
  174. package/docs/custom-provider.md +22 -9
  175. package/docs/extensions.md +13 -11
  176. package/docs/index.md +3 -2
  177. package/docs/models.md +34 -12
  178. package/docs/packages.md +11 -8
  179. package/docs/providers.md +13 -5
  180. package/docs/quickstart.md +1 -1
  181. package/docs/rpc.md +4 -2
  182. package/docs/rules.md +102 -0
  183. package/docs/sdk.md +57 -1
  184. package/docs/settings.md +6 -3
  185. package/docs/terminal-setup.md +6 -0
  186. package/docs/usage.md +6 -4
  187. package/examples/extensions/README.md +2 -1
  188. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  189. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  190. package/examples/extensions/custom-provider-gitlab-duo/index.ts +54 -3
  191. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  192. package/examples/extensions/dynamic-resources/RULES.md +8 -0
  193. package/examples/extensions/dynamic-resources/index.ts +1 -0
  194. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  195. package/examples/extensions/reload-runtime.ts +2 -2
  196. package/examples/extensions/sandbox/package.json +1 -1
  197. package/examples/extensions/with-deps/package.json +1 -1
  198. package/examples/sdk/12-full-control.ts +1 -0
  199. package/examples/sdk/README.md +1 -1
  200. package/npm-shrinkwrap.json +13 -12
  201. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"pi-agent.d.ts","sourceRoot":"","sources":["../../src/core/pi-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@fleetagent/pi-agent-core\";\nimport { clampThinkingLevel, type ImageContent, type Message, type Model, streamSimple } from \"@fleetagent/pi-ai\";\nimport chalk from \"chalk\";\nimport { getAgentDir } from \"../config.ts\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"../modes/index.ts\";\nimport { stopThemeWatcher } from \"../modes/interactive/theme/theme.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type {\n\tExtensionRunner,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { restoreStdout, takeOverStdout } from \"./output-guard.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport {\n\tgetDefaultSessionDir,\n\tLocalSessionManager,\n\ttype Session,\n\ttype SessionInfo,\n\ttype SessionListProgress,\n\ttype SessionManager,\n} from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\nimport { printTimings, time } from \"./timings.ts\";\nimport type { ToolName } from \"./tools/index.ts\";\n\nexport interface PiAgentDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\nexport interface PiAgentServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: PiAgentDiagnostic[];\n}\n\nexport interface PiAgentSessionOptions {\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\tnoTools?: \"all\" | \"builtin\";\n\tcustomTools?: ToolDefinition[];\n}\n\nexport interface ResolvePiAgentSessionOptionsContext {\n\tservices: PiAgentServices;\n\tsession: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport interface ResolvePiAgentSessionOptionsResult extends PiAgentSessionOptions {\n\tdiagnostics?: PiAgentDiagnostic[];\n}\n\nexport interface CreatePiAgentOptions extends PiAgentSessionOptions {\n\t/** Runtime mode. Default: embedded SDK usage. */\n\tmode?: PiAgentAppMode;\n\tcwd?: string;\n\tagentDir?: string;\n\t/** Session lifecycle/discovery backend. Default: local JSONL sessions for cwd. */\n\tsessionManager?: SessionManager;\n\t/** Shared auth storage reused across runtime recreation. */\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoader?: ResourceLoader;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresolveSessionOptions?: (\n\t\tcontext: ResolvePiAgentSessionOptionsContext,\n\t) => Promise<ResolvePiAgentSessionOptionsResult> | ResolvePiAgentSessionOptionsResult;\n}\n\nexport interface CreatePiAgentSessionOptions {\n\t/** Initial active conversation state. Default: sessionManager.create(). */\n\tsession?: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport type PiAgentAppMode = \"embedded\" | \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface RunPiAgentModeOptions {\n\tmode?: PiAgentAppMode;\n\tmigratedProviders?: string[];\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n\tinitialMessages?: string[];\n\tverbose?: boolean;\n\tstartupBenchmark?: boolean;\n}\n\nexport interface PiAgentRuntimeHost {\n\treadonly services: PiAgentServices;\n\treadonly session: AgentSession;\n\treadonly diagnostics: readonly PiAgentDiagnostic[];\n\treadonly modelFallbackMessage: string | undefined;\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void;\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void;\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\tnewSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }>;\n\timportFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }>;\n\tlistSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tlistAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tdispose(): Promise<void>;\n}\n\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction getAttributionHeaders(\n\tmodel: Model<any>,\n\tsettingsManager: SettingsManager,\n): Record<string, string> | undefined {\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (model.provider === \"openrouter\" || model.baseUrl.includes(\"openrouter.ai\")) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://pi.dev\",\n\t\t\t\"X-OpenRouter-Title\": \"pi\",\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmodel.baseUrl.includes(\"api.cloudflare.com\") ||\n\t\tmodel.baseUrl.includes(\"gateway.ai.cloudflare.com\")\n\t) {\n\t\treturn {\n\t\t\t\"User-Agent\": \"pi-coding-agent\",\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): PiAgentDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: PiAgentDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Application-level composition root for pi's coding agent runtime.\n *\n * PiAgent owns common app services, the session lifecycle backend, and the\n * current active AgentSession. Conversation behavior stays in AgentSession;\n * session lifecycle/discovery stays in SessionManager implementations.\n */\nexport class PiAgent {\n\tprivate readonly initialCwd: string;\n\treadonly agentDir: string;\n\treadonly sessionManager: SessionManager;\n\treadonly authStorage: AuthStorage;\n\n\tprivate readonly options: CreatePiAgentOptions;\n\tprivate _mode: PiAgentAppMode;\n\tprivate _session?: AgentSession;\n\tprivate _services?: PiAgentServices;\n\tprivate _diagnostics: PiAgentDiagnostic[] = [];\n\tprivate _modelFallbackMessage?: string;\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\n\tprivate constructor(\n\t\toptions: CreatePiAgentOptions,\n\t\tresolved: {\n\t\t\tcwd: string;\n\t\t\tagentDir: string;\n\t\t\tsessionManager: SessionManager;\n\t\t\tauthStorage: AuthStorage;\n\t\t},\n\t) {\n\t\tthis.options = options;\n\t\tthis._mode = options.mode ?? \"embedded\";\n\t\tthis.initialCwd = resolved.cwd;\n\t\tthis.agentDir = resolved.agentDir;\n\t\tthis.sessionManager = resolved.sessionManager;\n\t\tthis.authStorage = resolved.authStorage;\n\t}\n\n\tstatic setupStdio(options: { mode: PiAgentAppMode }): void {\n\t\tif (options.mode !== \"embedded\" && options.mode !== \"interactive\") {\n\t\t\ttakeOverStdout();\n\t\t}\n\t}\n\n\tstatic async create(options: CreatePiAgentOptions = {}): Promise<PiAgent> {\n\t\tconst cwd = options.cwd ?? process.cwd();\n\t\tconst agentDir = options.agentDir ?? getAgentDir();\n\t\tconst sessionManager =\n\t\t\toptions.sessionManager ?? new LocalSessionManager({ cwd, sessionDir: getDefaultSessionDir(cwd, agentDir) });\n\t\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\t\treturn new PiAgent(options, { cwd, agentDir, sessionManager, authStorage });\n\t}\n\n\tget mode(): PiAgentAppMode {\n\t\treturn this._mode;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services?.cwd ?? this.initialCwd;\n\t}\n\n\tasync readPipedStdin(): Promise<string | undefined> {\n\t\tif (this._mode === \"embedded\" || this._mode === \"rpc\" || process.stdin.isTTY) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst stdinContent = await new Promise<string | undefined>((resolve) => {\n\t\t\tlet data = \"\";\n\t\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\t\tdata += chunk;\n\t\t\t});\n\t\t\tprocess.stdin.on(\"end\", () => {\n\t\t\t\tresolve(data.trim() || undefined);\n\t\t\t});\n\t\t\tprocess.stdin.resume();\n\t\t});\n\n\t\tif (stdinContent !== undefined && this._mode === \"interactive\") {\n\t\t\tthis._mode = \"print\";\n\t\t}\n\t\treturn stdinContent;\n\t}\n\n\tprivate async createServices(cwd: string): Promise<PiAgentServices> {\n\t\tconst settingsManager = this.options.settingsManager ?? SettingsManager.create(cwd, this.agentDir);\n\t\tconst modelRegistry =\n\t\t\tthis.options.modelRegistry ?? ModelRegistry.create(this.authStorage, join(this.agentDir, \"models.json\"));\n\t\tconst resourceLoader =\n\t\t\tthis.options.resourceLoader ??\n\t\t\tnew DefaultResourceLoader({\n\t\t\t\t...(this.options.resourceLoaderOptions ?? {}),\n\t\t\t\tcwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\tconst diagnostics: PiAgentDiagnostic[] = [];\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t\ttry {\n\t\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\textensionsResult.runtime.pendingProviderRegistrations = [];\n\t\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, this.options.extensionFlagValues));\n\n\t\treturn {\n\t\t\tcwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tauthStorage: this.authStorage,\n\t\t\tsettingsManager,\n\t\t\tmodelRegistry,\n\t\t\tresourceLoader,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async buildAgentSession(\n\t\tactiveSession: Session,\n\t\tsessionStartEvent?: SessionStartEvent,\n\t): Promise<{\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}> {\n\t\tconst services = await this.createServices(activeSession.getCwd());\n\t\tconst diagnostics: PiAgentDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...services.resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\t\tconst resolvedOptions =\n\t\t\t(await this.options.resolveSessionOptions?.({ services, session: activeSession, sessionStartEvent })) ?? {};\n\t\tdiagnostics.push(...(resolvedOptions.diagnostics ?? []));\n\t\tconst sessionOptions: PiAgentSessionOptions = {\n\t\t\tmodel: resolvedOptions.model ?? this.options.model,\n\t\t\tthinkingLevel: resolvedOptions.thinkingLevel ?? this.options.thinkingLevel,\n\t\t\tscopedModels: resolvedOptions.scopedModels ?? this.options.scopedModels,\n\t\t\ttools: resolvedOptions.tools ?? this.options.tools,\n\t\t\tnoTools: resolvedOptions.noTools ?? this.options.noTools,\n\t\t\tcustomTools: resolvedOptions.customTools ?? this.options.customTools,\n\t\t};\n\n\t\tconst existingSession = activeSession.buildSessionContext();\n\t\tconst hasExistingSession = existingSession.messages.length > 0;\n\t\tconst hasThinkingEntry = activeSession.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\t\tlet model = sessionOptions.model;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (model) {\n\t\t\tmodel = services.modelRegistry.find(model.provider, model.id) ?? model;\n\t\t}\n\n\t\tif (!model && hasExistingSession && existingSession.model) {\n\t\t\tconst restoredModel = services.modelRegistry.find(\n\t\t\t\texistingSession.model.provider,\n\t\t\t\texistingSession.model.modelId,\n\t\t\t);\n\t\t\tif (restoredModel && services.modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\t}\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: services.settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: services.settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: services.settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t\t} else if (modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = sessionOptions.thinkingLevel;\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\t\tthinkingLevel = model ? (clampThinkingLevel(model, thinkingLevel) as ThinkingLevel) : \"off\";\n\n\t\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst allowedToolNames = sessionOptions.tools ?? (sessionOptions.noTools === \"all\" ? [] : undefined);\n\t\tconst initialActiveToolNames: string[] = sessionOptions.tools\n\t\t\t? [...sessionOptions.tools]\n\t\t\t: sessionOptions.noTools\n\t\t\t\t? []\n\t\t\t\t: defaultActiveToolNames;\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!services.settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: async (model, context, options) => {\n\t\t\t\tconst auth = await services.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = services.settingsManager.getProviderRetrySettings();\n\t\t\t\tconst attributionHeaders = getAttributionHeaders(model, services.settingsManager);\n\t\t\t\treturn streamSimple(model, context, {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders:\n\t\t\t\t\t\tattributionHeaders || auth.headers || options?.headers\n\t\t\t\t\t\t\t? { ...attributionHeaders, ...auth.headers, ...options?.headers }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonPayload: async (payload) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: activeSession.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\treturn runner ? runner.emitContext(messages) : messages;\n\t\t\t},\n\t\t\tsteeringMode: services.settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: services.settingsManager.getFollowUpMode(),\n\t\t\ttransport: services.settingsManager.getTransport(),\n\t\t\tthinkingBudgets: services.settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: services.settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tactiveSession.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\tsession: new AgentSession({\n\t\t\t\tagent,\n\t\t\t\tsession: activeSession,\n\t\t\t\tsettingsManager: services.settingsManager,\n\t\t\t\tcwd: services.cwd,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\tresourceLoader: services.resourceLoader,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t\tinitialActiveToolNames,\n\t\t\t\tallowedToolNames,\n\t\t\t\textensionRunnerRef,\n\t\t\t\tsessionStartEvent,\n\t\t\t}),\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t}\n\n\tprivate apply(result: {\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t}\n\n\tasync createAgentSession(options: CreatePiAgentSessionOptions = {}): Promise<AgentSession> {\n\t\tconst initialSession = options.session ?? (await this.sessionManager.create());\n\t\tassertSessionCwdExists(initialSession, initialSession.getCwd());\n\t\tthis.apply(await this.buildAgentSession(initialSession, options.sessionStartEvent));\n\t\treturn this.session;\n\t}\n\n\tget runtime(): PiAgent {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tget services(): PiAgentServices {\n\t\tif (!this._services) {\n\t\t\tthrow new Error(\"PiAgent services have not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._session;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget settingsManager(): SettingsManager {\n\t\treturn this.services.settingsManager;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this.services.modelRegistry;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this.services.resourceLoader;\n\t}\n\n\tget diagnostics(): readonly PiAgentDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget currentCwd(): string {\n\t\treturn this.services.cwd;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionReference?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async flushActiveSession(): Promise<void> {\n\t\tconst flushPendingSync = (this.session.session as { flushPendingSync?: () => Promise<void> }).flushPendingSync;\n\t\tif (flushPendingSync) {\n\t\t\tawait flushPendingSync.call(this.session.session);\n\t\t}\n\t}\n\n\tprivate async teardownCurrent(\n\t\treason: SessionShutdownEvent[\"reason\"],\n\t\ttargetSessionReference?: string,\n\t): Promise<void> {\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.openReference(sessionPath, { cwdOverride: options?.cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tconst newSessionOptions = {\n\t\t\tid: options?.id,\n\t\t\tparentSession: options?.parentSession ?? activeSession.getSessionReference(),\n\t\t};\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.createSubSession(newSessionOptions);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.create(newSessionOptions);\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.session);\n\t\t\tthis.session.agent.state.messages = this.session.session.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.session.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.forkSubSession(targetLeafId);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.forkSession(activeSession, targetLeafId);\n\t\t}\n\t\tawait this.teardownCurrent(\"fork\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"fork\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", resolvedPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.importJsonl(resolvedPath, { cwdOverride: cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync runMode(options: RunPiAgentModeOptions = {}): Promise<void> {\n\t\tconst mode = options.mode ?? this._mode;\n\t\tif (mode === \"embedded\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode !== \"interactive\" && !this.session.model) {\n\t\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.startupBenchmark && mode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (mode === \"rpc\") {\n\t\t\tprintTimings();\n\t\t\tawait runRpcMode(this);\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"interactive\") {\n\t\t\tconst interactiveMode = new InteractiveMode(this, {\n\t\t\t\tmigratedProviders: options.migratedProviders,\n\t\t\t\tmodelFallbackMessage: this.modelFallbackMessage,\n\t\t\t\tinitialMessage: options.initialMessage,\n\t\t\t\tinitialImages: options.initialImages,\n\t\t\t\tinitialMessages: options.initialMessages,\n\t\t\t\tverbose: options.verbose,\n\t\t\t});\n\t\t\tif (options.startupBenchmark) {\n\t\t\t\tawait interactiveMode.init();\n\t\t\t\ttime(\"interactiveMode.init\");\n\t\t\t\tprintTimings();\n\t\t\t\tinteractiveMode.stop();\n\t\t\t\tstopThemeWatcher();\n\t\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprintTimings();\n\t\t\tawait interactiveMode.run();\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(this, {\n\t\t\tmode: mode === \"json\" ? \"json\" : \"text\",\n\t\t\tmessages: options.initialMessages,\n\t\t\tinitialMessage: options.initialMessage,\n\t\t\tinitialImages: options.initialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t}\n\n\tcreateSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.create();\n\t}\n\n\topenSessionReference(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.openReference(reference);\n\t}\n\n\tcontinueRecentSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.continueRecent();\n\t}\n\n\tforkSessionFrom(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.forkFrom(reference);\n\t}\n\n\tasync listSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.list(onProgress);\n\t}\n\n\tasync listAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.listAll(onProgress);\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (!this._session) {\n\t\t\treturn;\n\t\t}\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"quit\",\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t\tthis._session = undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"pi-agent.d.ts","sourceRoot":"","sources":["../../src/core/pi-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@fleetagent/pi-agent-core\";\nimport { clampThinkingLevel, type ImageContent, type Message, type Model, streamSimple } from \"@fleetagent/pi-ai\";\nimport chalk from \"chalk\";\nimport { getAgentDir } from \"../config.ts\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"../modes/index.ts\";\nimport { stopThemeWatcher } from \"../modes/interactive/theme/theme.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type {\n\tExtensionRunner,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { restoreStdout, takeOverStdout } from \"./output-guard.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport {\n\tgetDefaultSessionDir,\n\tLocalSessionManager,\n\ttype Session,\n\ttype SessionInfo,\n\ttype SessionListProgress,\n\ttype SessionManager,\n} from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\nimport { printTimings, time } from \"./timings.ts\";\nimport type { ToolName } from \"./tools/index.ts\";\n\nexport interface PiAgentDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\nexport interface PiAgentServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: PiAgentDiagnostic[];\n}\n\nexport interface PiAgentSessionOptions {\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\tnoTools?: \"all\" | \"builtin\";\n\tcustomTools?: ToolDefinition[];\n}\n\nexport interface ResolvePiAgentSessionOptionsContext {\n\tservices: PiAgentServices;\n\tsession: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport interface ResolvePiAgentSessionOptionsResult extends PiAgentSessionOptions {\n\tdiagnostics?: PiAgentDiagnostic[];\n}\n\nexport interface CreatePiAgentOptions extends PiAgentSessionOptions {\n\t/** Runtime mode. Default: embedded SDK usage. */\n\tmode?: PiAgentAppMode;\n\tcwd?: string;\n\tagentDir?: string;\n\t/** Session lifecycle/discovery backend. Default: local JSONL sessions for cwd. */\n\tsessionManager?: SessionManager;\n\t/** Shared auth storage reused across runtime recreation. */\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoader?: ResourceLoader;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresolveSessionOptions?: (\n\t\tcontext: ResolvePiAgentSessionOptionsContext,\n\t) => Promise<ResolvePiAgentSessionOptionsResult> | ResolvePiAgentSessionOptionsResult;\n}\n\nexport interface CreatePiAgentSessionOptions {\n\t/** Initial active conversation state. Default: sessionManager.create(). */\n\tsession?: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport type PiAgentAppMode = \"embedded\" | \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface RunPiAgentModeOptions {\n\tmode?: PiAgentAppMode;\n\tmigratedProviders?: string[];\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n\tinitialMessages?: string[];\n\tverbose?: boolean;\n\tstartupBenchmark?: boolean;\n}\n\nexport interface PiAgentRuntimeHost {\n\treadonly services: PiAgentServices;\n\treadonly session: AgentSession;\n\treadonly diagnostics: readonly PiAgentDiagnostic[];\n\treadonly modelFallbackMessage: string | undefined;\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void;\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void;\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\tnewSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }>;\n\timportFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }>;\n\tlistSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tlistAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tdispose(): Promise<void>;\n}\n\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction getAttributionHeaders(\n\tmodel: Model<any>,\n\tsettingsManager: SettingsManager,\n\tsessionId?: string,\n): Record<string, string> | undefined {\n\tif (\n\t\tsessionId &&\n\t\t(model.provider === \"opencode\" || model.provider === \"opencode-go\" || model.baseUrl.includes(\"opencode.ai\"))\n\t) {\n\t\treturn { \"x-opencode-session\": sessionId, \"x-opencode-client\": \"pi\" };\n\t}\n\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (model.provider === \"openrouter\" || model.baseUrl.includes(\"openrouter.ai\")) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://pi.dev\",\n\t\t\t\"X-OpenRouter-Title\": \"pi\",\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmodel.baseUrl.includes(\"api.cloudflare.com\") ||\n\t\tmodel.baseUrl.includes(\"gateway.ai.cloudflare.com\")\n\t) {\n\t\treturn {\n\t\t\t\"User-Agent\": \"pi-coding-agent\",\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): PiAgentDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: PiAgentDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Application-level composition root for pi's coding agent runtime.\n *\n * PiAgent owns common app services, the session lifecycle backend, and the\n * current active AgentSession. Conversation behavior stays in AgentSession;\n * session lifecycle/discovery stays in SessionManager implementations.\n */\nexport class PiAgent {\n\tprivate readonly initialCwd: string;\n\treadonly agentDir: string;\n\treadonly sessionManager: SessionManager;\n\treadonly authStorage: AuthStorage;\n\n\tprivate readonly options: CreatePiAgentOptions;\n\tprivate _mode: PiAgentAppMode;\n\tprivate _session?: AgentSession;\n\tprivate _services?: PiAgentServices;\n\tprivate _diagnostics: PiAgentDiagnostic[] = [];\n\tprivate _modelFallbackMessage?: string;\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\n\tprivate constructor(\n\t\toptions: CreatePiAgentOptions,\n\t\tresolved: {\n\t\t\tcwd: string;\n\t\t\tagentDir: string;\n\t\t\tsessionManager: SessionManager;\n\t\t\tauthStorage: AuthStorage;\n\t\t},\n\t) {\n\t\tthis.options = options;\n\t\tthis._mode = options.mode ?? \"embedded\";\n\t\tthis.initialCwd = resolved.cwd;\n\t\tthis.agentDir = resolved.agentDir;\n\t\tthis.sessionManager = resolved.sessionManager;\n\t\tthis.authStorage = resolved.authStorage;\n\t}\n\n\tstatic setupStdio(options: { mode: PiAgentAppMode }): void {\n\t\tif (options.mode !== \"embedded\" && options.mode !== \"interactive\") {\n\t\t\ttakeOverStdout();\n\t\t}\n\t}\n\n\tstatic async create(options: CreatePiAgentOptions = {}): Promise<PiAgent> {\n\t\tconst cwd = options.cwd ?? process.cwd();\n\t\tconst agentDir = options.agentDir ?? getAgentDir();\n\t\tconst sessionManager =\n\t\t\toptions.sessionManager ?? new LocalSessionManager({ cwd, sessionDir: getDefaultSessionDir(cwd, agentDir) });\n\t\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\t\treturn new PiAgent(options, { cwd, agentDir, sessionManager, authStorage });\n\t}\n\n\tget mode(): PiAgentAppMode {\n\t\treturn this._mode;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services?.cwd ?? this.initialCwd;\n\t}\n\n\tasync readPipedStdin(): Promise<string | undefined> {\n\t\tif (this._mode === \"embedded\" || this._mode === \"rpc\" || process.stdin.isTTY) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst stdinContent = await new Promise<string | undefined>((resolve) => {\n\t\t\tlet data = \"\";\n\t\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\t\tdata += chunk;\n\t\t\t});\n\t\t\tprocess.stdin.on(\"end\", () => {\n\t\t\t\tresolve(data.trim() || undefined);\n\t\t\t});\n\t\t\tprocess.stdin.resume();\n\t\t});\n\n\t\tif (stdinContent !== undefined && this._mode === \"interactive\") {\n\t\t\tthis._mode = \"print\";\n\t\t}\n\t\treturn stdinContent;\n\t}\n\n\tprivate async createServices(cwd: string): Promise<PiAgentServices> {\n\t\tconst settingsManager = this.options.settingsManager ?? SettingsManager.create(cwd, this.agentDir);\n\t\tconst modelRegistry =\n\t\t\tthis.options.modelRegistry ?? ModelRegistry.create(this.authStorage, join(this.agentDir, \"models.json\"));\n\t\tconst resourceLoader =\n\t\t\tthis.options.resourceLoader ??\n\t\t\tnew DefaultResourceLoader({\n\t\t\t\t...(this.options.resourceLoaderOptions ?? {}),\n\t\t\t\tcwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\tconst diagnostics: PiAgentDiagnostic[] = [];\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t\ttry {\n\t\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\textensionsResult.runtime.pendingProviderRegistrations = [];\n\t\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, this.options.extensionFlagValues));\n\n\t\treturn {\n\t\t\tcwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tauthStorage: this.authStorage,\n\t\t\tsettingsManager,\n\t\t\tmodelRegistry,\n\t\t\tresourceLoader,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async buildAgentSession(\n\t\tactiveSession: Session,\n\t\tsessionStartEvent?: SessionStartEvent,\n\t): Promise<{\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}> {\n\t\tconst services = await this.createServices(activeSession.getCwd());\n\t\tconst diagnostics: PiAgentDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...services.resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\t\tconst resolvedOptions =\n\t\t\t(await this.options.resolveSessionOptions?.({ services, session: activeSession, sessionStartEvent })) ?? {};\n\t\tdiagnostics.push(...(resolvedOptions.diagnostics ?? []));\n\t\tconst sessionOptions: PiAgentSessionOptions = {\n\t\t\tmodel: resolvedOptions.model ?? this.options.model,\n\t\t\tthinkingLevel: resolvedOptions.thinkingLevel ?? this.options.thinkingLevel,\n\t\t\tscopedModels: resolvedOptions.scopedModels ?? this.options.scopedModels,\n\t\t\ttools: resolvedOptions.tools ?? this.options.tools,\n\t\t\tnoTools: resolvedOptions.noTools ?? this.options.noTools,\n\t\t\tcustomTools: resolvedOptions.customTools ?? this.options.customTools,\n\t\t};\n\n\t\tconst existingSession = activeSession.buildSessionContext();\n\t\tconst hasExistingSession = existingSession.messages.length > 0;\n\t\tconst hasThinkingEntry = activeSession.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\t\tlet model = sessionOptions.model;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (model) {\n\t\t\tmodel = services.modelRegistry.find(model.provider, model.id) ?? model;\n\t\t}\n\n\t\tif (!model && hasExistingSession && existingSession.model) {\n\t\t\tconst restoredModel = services.modelRegistry.find(\n\t\t\t\texistingSession.model.provider,\n\t\t\t\texistingSession.model.modelId,\n\t\t\t);\n\t\t\tif (restoredModel && services.modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\t}\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: services.settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: services.settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: services.settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t\t} else if (modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = sessionOptions.thinkingLevel;\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\t\tthinkingLevel = model ? (clampThinkingLevel(model, thinkingLevel) as ThinkingLevel) : \"off\";\n\n\t\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst allowedToolNames = sessionOptions.tools ?? (sessionOptions.noTools === \"all\" ? [] : undefined);\n\t\tconst initialActiveToolNames: string[] = sessionOptions.tools\n\t\t\t? [...sessionOptions.tools]\n\t\t\t: sessionOptions.noTools\n\t\t\t\t? []\n\t\t\t\t: defaultActiveToolNames;\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!services.settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: async (model, context, options) => {\n\t\t\t\tconst auth = await services.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = services.settingsManager.getProviderRetrySettings();\n\t\t\t\tconst timeoutMs =\n\t\t\t\t\toptions?.timeoutMs ??\n\t\t\t\t\tproviderRetrySettings.timeoutMs ??\n\t\t\t\t\t(model.api === \"openai-codex-responses\" ? services.settingsManager.getHttpIdleTimeoutMs() : undefined);\n\t\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\t\toptions?.websocketConnectTimeoutMs ?? services.settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\t\tconst attributionHeaders = getAttributionHeaders(model, services.settingsManager, options?.sessionId);\n\t\t\t\treturn streamSimple(model, context, {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders:\n\t\t\t\t\t\tattributionHeaders || auth.headers || options?.headers\n\t\t\t\t\t\t\t? { ...attributionHeaders, ...auth.headers, ...options?.headers }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonPayload: async (payload) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: activeSession.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\treturn runner ? runner.emitContext(messages) : messages;\n\t\t\t},\n\t\t\tsteeringMode: services.settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: services.settingsManager.getFollowUpMode(),\n\t\t\ttransport: services.settingsManager.getTransport(),\n\t\t\tthinkingBudgets: services.settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: services.settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tactiveSession.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\tsession: new AgentSession({\n\t\t\t\tagent,\n\t\t\t\tsession: activeSession,\n\t\t\t\tsettingsManager: services.settingsManager,\n\t\t\t\tcwd: services.cwd,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\tresourceLoader: services.resourceLoader,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t\tinitialActiveToolNames,\n\t\t\t\tallowedToolNames,\n\t\t\t\textensionRunnerRef,\n\t\t\t\tsessionStartEvent,\n\t\t\t}),\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t}\n\n\tprivate apply(result: {\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t}\n\n\tasync createAgentSession(options: CreatePiAgentSessionOptions = {}): Promise<AgentSession> {\n\t\tconst initialSession = options.session ?? (await this.sessionManager.create());\n\t\tassertSessionCwdExists(initialSession, initialSession.getCwd());\n\t\tthis.apply(await this.buildAgentSession(initialSession, options.sessionStartEvent));\n\t\treturn this.session;\n\t}\n\n\tget runtime(): PiAgent {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tget services(): PiAgentServices {\n\t\tif (!this._services) {\n\t\t\tthrow new Error(\"PiAgent services have not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._session;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget settingsManager(): SettingsManager {\n\t\treturn this.services.settingsManager;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this.services.modelRegistry;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this.services.resourceLoader;\n\t}\n\n\tget diagnostics(): readonly PiAgentDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget currentCwd(): string {\n\t\treturn this.services.cwd;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionReference?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async flushActiveSession(): Promise<void> {\n\t\tconst flushPendingSync = (this.session.session as { flushPendingSync?: () => Promise<void> }).flushPendingSync;\n\t\tif (flushPendingSync) {\n\t\t\tawait flushPendingSync.call(this.session.session);\n\t\t}\n\t}\n\n\tprivate async teardownCurrent(\n\t\treason: SessionShutdownEvent[\"reason\"],\n\t\ttargetSessionReference?: string,\n\t): Promise<void> {\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.openReference(sessionPath, { cwdOverride: options?.cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tconst newSessionOptions = {\n\t\t\tid: options?.id,\n\t\t\tparentSession: options?.parentSession ?? activeSession.getSessionReference(),\n\t\t};\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.createSubSession(newSessionOptions);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.create(newSessionOptions);\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.session);\n\t\t\tthis.session.agent.state.messages = this.session.session.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.session.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.forkSubSession(targetLeafId);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.forkSession(activeSession, targetLeafId);\n\t\t}\n\t\tawait this.teardownCurrent(\"fork\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"fork\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", resolvedPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.importJsonl(resolvedPath, { cwdOverride: cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync runMode(options: RunPiAgentModeOptions = {}): Promise<void> {\n\t\tconst mode = options.mode ?? this._mode;\n\t\tif (mode === \"embedded\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode !== \"interactive\" && !this.session.model) {\n\t\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.startupBenchmark && mode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (mode === \"rpc\") {\n\t\t\tprintTimings();\n\t\t\tawait runRpcMode(this);\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"interactive\") {\n\t\t\tconst interactiveMode = new InteractiveMode(this, {\n\t\t\t\tmigratedProviders: options.migratedProviders,\n\t\t\t\tmodelFallbackMessage: this.modelFallbackMessage,\n\t\t\t\tinitialMessage: options.initialMessage,\n\t\t\t\tinitialImages: options.initialImages,\n\t\t\t\tinitialMessages: options.initialMessages,\n\t\t\t\tverbose: options.verbose,\n\t\t\t});\n\t\t\tif (options.startupBenchmark) {\n\t\t\t\tawait interactiveMode.init();\n\t\t\t\ttime(\"interactiveMode.init\");\n\t\t\t\tprintTimings();\n\t\t\t\tinteractiveMode.stop();\n\t\t\t\tstopThemeWatcher();\n\t\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprintTimings();\n\t\t\tawait interactiveMode.run();\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(this, {\n\t\t\tmode: mode === \"json\" ? \"json\" : \"text\",\n\t\t\tmessages: options.initialMessages,\n\t\t\tinitialMessage: options.initialMessage,\n\t\t\tinitialImages: options.initialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t}\n\n\tcreateSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.create();\n\t}\n\n\topenSessionReference(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.openReference(reference);\n\t}\n\n\tcontinueRecentSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.continueRecent();\n\t}\n\n\tforkSessionFrom(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.forkFrom(reference);\n\t}\n\n\tasync listSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.list(onProgress);\n\t}\n\n\tasync listAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.listAll(onProgress);\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (!this._session) {\n\t\t\treturn;\n\t\t}\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"quit\",\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t\tthis._session = undefined;\n\t}\n}\n"]}
@@ -38,7 +38,11 @@ function extractUserMessageText(content) {
38
38
  .map((part) => part.text)
39
39
  .join("");
40
40
  }
41
- function getAttributionHeaders(model, settingsManager) {
41
+ function getAttributionHeaders(model, settingsManager, sessionId) {
42
+ if (sessionId &&
43
+ (model.provider === "opencode" || model.provider === "opencode-go" || model.baseUrl.includes("opencode.ai"))) {
44
+ return { "x-opencode-session": sessionId, "x-opencode-client": "pi" };
45
+ }
42
46
  if (!isInstallTelemetryEnabled(settingsManager)) {
43
47
  return undefined;
44
48
  }
@@ -312,11 +316,16 @@ export class PiAgent {
312
316
  throw new Error(auth.error);
313
317
  }
314
318
  const providerRetrySettings = services.settingsManager.getProviderRetrySettings();
315
- const attributionHeaders = getAttributionHeaders(model, services.settingsManager);
319
+ const timeoutMs = options?.timeoutMs ??
320
+ providerRetrySettings.timeoutMs ??
321
+ (model.api === "openai-codex-responses" ? services.settingsManager.getHttpIdleTimeoutMs() : undefined);
322
+ const websocketConnectTimeoutMs = options?.websocketConnectTimeoutMs ?? services.settingsManager.getWebSocketConnectTimeoutMs();
323
+ const attributionHeaders = getAttributionHeaders(model, services.settingsManager, options?.sessionId);
316
324
  return streamSimple(model, context, {
317
325
  ...options,
318
326
  apiKey: auth.apiKey,
319
- timeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,
327
+ timeoutMs,
328
+ websocketConnectTimeoutMs,
320
329
  maxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,
321
330
  maxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,
322
331
  headers: attributionHeaders || auth.headers || options?.headers
@@ -1 +1 @@
1
- {"version":3,"file":"pi-agent.js","sourceRoot":"","sources":["../../src/core/pi-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAyC,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAA+C,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAQvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAA0D,MAAM,sBAAsB,CAAC;AACrH,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACN,oBAAoB,EACpB,mBAAmB,GAKnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAqGlD,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAC/C,QAAQ,CAAS;IAE1B,YAAY,QAAgB,EAAE;QAC7B,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAAA,CACzB;CACD;AAED,SAAS,sBAAsB,CAAC,OAAwD,EAAU;IACjG,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,IAAI,EAA0C,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC/G,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACX;AAED,SAAS,qBAAqB,CAC7B,KAAiB,EACjB,eAAgC,EACK;IACrC,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAChF,OAAO;YACN,cAAc,EAAE,gBAAgB;YAChC,oBAAoB,EAAE,IAAI;YAC1B,yBAAyB,EAAE,WAAW;SACtC,CAAC;IACH,CAAC;IAED,IACC,KAAK,CAAC,QAAQ,KAAK,uBAAuB;QAC1C,KAAK,CAAC,QAAQ,KAAK,uBAAuB;QAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAClD,CAAC;QACF,OAAO;YACN,YAAY,EAAE,iBAAiB;SAC/B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,wBAAwB,CAChC,cAA8B,EAC9B,mBAA8D,EACxC;IACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;IACxD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0C,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YAC5C,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,mBAAmB,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpD,SAAS;QACV,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrD,SAAS;QACV,CAAC;QACD,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,qBAAqB,IAAI,oBAAoB;SACtD,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,iBAAiB,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACvH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AAAA,CACnB;AAED;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IACF,UAAU,CAAS;IAC3B,QAAQ,CAAS;IACjB,cAAc,CAAiB;IAC/B,WAAW,CAAc;IAEjB,OAAO,CAAuB;IACvC,KAAK,CAAiB;IACtB,QAAQ,CAAgB;IACxB,SAAS,CAAmB;IAC5B,YAAY,GAAwB,EAAE,CAAC;IACvC,qBAAqB,CAAU;IAC/B,aAAa,CAA4C;IACzD,uBAAuB,CAAc;IAE7C,YACC,OAA6B,EAC7B,QAKC,EACA;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IAAA,CACxC;IAED,MAAM,CAAC,UAAU,CAAC,OAAiC,EAAQ;QAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACnE,cAAc,EAAE,CAAC;QAClB,CAAC;IAAA,CACD;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAyB,EAAE,EAAoB;QACzE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnD,MAAM,cAAc,GACnB,OAAO,CAAC,cAAc,IAAI,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7G,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3F,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IAAA,CAC5E;IAED,IAAI,IAAI,GAAmB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;IAAA,CAClB;IAED,IAAI,GAAG,GAAW;QACjB,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;IAAA,CAC9C;IAED,KAAK,CAAC,cAAc,GAAgC;QACnD,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9E,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;YACvE,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnC,IAAI,IAAI,KAAK,CAAC;YAAA,CACd,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC;YAAA,CAClC,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAAA,CACvB,CAAC,CAAC;QAEH,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACtB,CAAC;QACD,OAAO,YAAY,CAAC;IAAA,CACpB;IAEO,KAAK,CAAC,cAAc,CAAC,GAAW,EAA4B;QACnE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnG,MAAM,aAAa,GAClB,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1G,MAAM,cAAc,GACnB,IAAI,CAAC,OAAO,CAAC,cAAc;YAC3B,IAAI,qBAAqB,CAAC;gBACzB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,IAAI,EAAE,CAAC;gBAC7C,GAAG;gBACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,eAAe;aACf,CAAC,CAAC;QACJ,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;QAE9B,MAAM,WAAW,GAAwB,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;QACxD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC;YACrG,IAAI,CAAC;gBACJ,aAAa,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,WAAW,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,cAAc,aAAa,YAAY,OAAO,EAAE;iBACzD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,gBAAgB,CAAC,OAAO,CAAC,4BAA4B,GAAG,EAAE,CAAC;QAC3D,WAAW,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEhG,OAAO;YACN,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe;YACf,aAAa;YACb,cAAc;YACd,WAAW;SACX,CAAC;IAAA,CACF;IAEO,KAAK,CAAC,iBAAiB,CAC9B,aAAsB,EACtB,iBAAqC,EAMnC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,WAAW,GAAwB;YACxC,GAAG,QAAQ,CAAC,WAAW;YACvB,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3E,IAAI,EAAE,OAAgB;gBACtB,OAAO,EAAE,6BAA6B,IAAI,MAAM,KAAK,EAAE;aACvD,CAAC,CAAC;SACH,CAAC;QACF,MAAM,eAAe,GACpB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7G,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,cAAc,GAA0B;YAC7C,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;YAClD,aAAa,EAAE,eAAe,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;YAC1E,YAAY,EAAE,eAAe,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;YACvE,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;YAClD,OAAO,EAAE,eAAe,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YACxD,WAAW,EAAE,eAAe,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW;SACpE,CAAC;QAEF,MAAM,eAAe,GAAG,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAC5D,MAAM,kBAAkB,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC;QAE3G,IAAI,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;QACjC,IAAI,oBAAwC,CAAC;QAE7C,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,kBAAkB,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC;YAC3D,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAChD,eAAe,CAAC,KAAK,CAAC,QAAQ,EAC9B,eAAe,CAAC,KAAK,CAAC,OAAO,CAC7B,CAAC;YACF,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9E,KAAK,GAAG,aAAa,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,oBAAoB,GAAG,2BAA2B,eAAe,CAAC,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACrH,CAAC;QACF,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACrC,YAAY,EAAE,EAAE;gBAChB,YAAY,EAAE,kBAAkB;gBAChC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE;gBAC9D,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE;gBAC1D,oBAAoB,EAAE,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE;gBACxE,aAAa,EAAE,QAAQ,CAAC,aAAa;aACrC,CAAC,CAAC;YACH,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACrB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,oBAAoB,GAAG,8BAA8B,EAAE,CAAC;YACzD,CAAC;iBAAM,IAAI,oBAAoB,EAAE,CAAC;gBACjC,oBAAoB,IAAI,WAAW,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACjE,CAAC;QACF,CAAC;QAED,IAAI,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC;QACjD,IAAI,aAAa,KAAK,SAAS,IAAI,kBAAkB,EAAE,CAAC;YACvD,aAAa,GAAG,gBAAgB;gBAC/B,CAAC,CAAE,eAAe,CAAC,aAA+B;gBAClD,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,sBAAsB,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACjC,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,sBAAsB,CAAC;QAC9F,CAAC;QACD,aAAa,GAAG,KAAK,CAAC,CAAC,CAAE,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAmB,CAAC,CAAC,CAAC,KAAK,CAAC;QAE5F,MAAM,sBAAsB,GAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7E,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrG,MAAM,sBAAsB,GAAa,cAAc,CAAC,KAAK;YAC5D,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;YAC3B,CAAC,CAAC,cAAc,CAAC,OAAO;gBACvB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,sBAAsB,CAAC;QAE3B,MAAM,kBAAkB,GAAkC,EAAE,CAAC;QAC7D,MAAM,2BAA2B,GAAG,CAAC,QAAwB,EAAa,EAAE,CAAC;YAC5E,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC;gBAChD,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACtD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;oBAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;wBAC1D,IAAI,SAAS,EAAE,CAAC;4BACf,MAAM,eAAe,GAAG,OAAO;iCAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACV,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC,CAAC,CACtF;iCACA,MAAM,CACN,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CACb,CAAC,CACA,CAAC,CAAC,IAAI,KAAK,MAAM;gCACjB,CAAC,CAAC,IAAI,KAAK,4BAA4B;gCACvC,CAAC,GAAG,CAAC;gCACL,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;gCACzB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAoC,CAAC,IAAI,KAAK,4BAA4B,CACpF,CACF,CAAC;4BACH,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;wBAC7C,CAAC;oBACF,CAAC;gBACF,CAAC;gBACD,OAAO,GAAG,CAAC;YAAA,CACX,CAAC,CAAC;QAAA,CACH,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACvB,YAAY,EAAE;gBACb,YAAY,EAAE,EAAE;gBAChB,KAAK;gBACL,aAAa;gBACb,KAAK,EAAE,EAAE;aACT;YACD,YAAY,EAAE,2BAA2B;YACzC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;gBACD,MAAM,qBAAqB,GAAG,QAAQ,CAAC,eAAe,CAAC,wBAAwB,EAAE,CAAC;gBAClF,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAClF,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE;oBACnC,GAAG,OAAO;oBACV,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,qBAAqB,CAAC,SAAS;oBAChE,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,qBAAqB,CAAC,UAAU;oBACnE,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,qBAAqB,CAAC,eAAe;oBAClF,OAAO,EACN,kBAAkB,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,OAAO;wBACrD,CAAC,CAAC,EAAE,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE;wBACjE,CAAC,CAAC,SAAS;iBACb,CAAC,CAAC;YAAA,CACH;YACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC;gBAC1C,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,yBAAyB,CAAC,EAAE,CAAC;oBACrD,OAAO,OAAO,CAAC;gBAChB,CAAC;gBACD,OAAO,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;YAAA,CACjD;YACD,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC;gBAC1C,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,yBAAyB,CAAC,EAAE,CAAC;oBACrD,OAAO;gBACR,CAAC;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,yBAAyB;oBAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBACzB,CAAC,CAAC;YAAA,CACH;YACD,SAAS,EAAE,aAAa,CAAC,YAAY,EAAE;YACvC,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC;gBAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAA,CACxD;YACD,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE;YACxD,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE;YACxD,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE;YAClD,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE;YAC9D,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,wBAAwB,EAAE,CAAC,eAAe;SACpF,CAAC,CAAC;QAEH,IAAI,kBAAkB,EAAE,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;YAChD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACvB,aAAa,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACxD,CAAC;QACF,CAAC;aAAM,CAAC;YACP,IAAI,KAAK,EAAE,CAAC;gBACX,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,aAAa,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;QAED,OAAO;YACN,OAAO,EAAE,IAAI,YAAY,CAAC;gBACzB,KAAK;gBACL,OAAO,EAAE,aAAa;gBACtB,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,WAAW,EAAE,cAAc,CAAC,WAAW;gBACvC,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,sBAAsB;gBACtB,gBAAgB;gBAChB,kBAAkB;gBAClB,iBAAiB;aACjB,CAAC;YACF,QAAQ;YACR,WAAW;YACX,oBAAoB;SACpB,CAAC;IAAA,CACF;IAEO,KAAK,CAAC,MAKb,EAAQ;QACR,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAAA,CACzD;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAO,GAAgC,EAAE,EAAyB;QAC1F,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,sBAAsB,CAAC,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,OAAO,CAAC;IAAA,CACpB;IAED,IAAI,OAAO,GAAY;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,IAAI,QAAQ,GAAoB;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IAAA,CACtB;IAED,IAAI,OAAO,GAAiB;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IAAA,CACrB;IAED,IAAI,oBAAoB,GAAuB;QAC9C,OAAO,IAAI,CAAC,qBAAqB,CAAC;IAAA,CAClC;IAED,IAAI,eAAe,GAAoB;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;IAAA,CACrC;IAED,IAAI,aAAa,GAAkB;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;IAAA,CACnC;IAED,IAAI,cAAc,GAAmB;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;IAAA,CACpC;IAED,IAAI,WAAW,GAAiC;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC;IAAA,CACzB;IAED,IAAI,UAAU,GAAW;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IAAA,CACzB;IAED,gBAAgB,CAAC,aAAwD,EAAQ;QAChF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IAAA,CACnC;IAED,0BAA0B,CAAC,uBAAoC,EAAQ;QACtE,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;IAAA,CACvD;IAEO,KAAK,CAAC,gBAAgB,CAC7B,MAAwB,EACxB,sBAA+B,EACG;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAChC,IAAI,EAAE,uBAAuB;YAC7B,MAAM;YACN,sBAAsB;YACtB,iBAAiB,EAAE,sBAAsB;SACzC,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;IAAA,CAC9C;IAEO,KAAK,CAAC,cAAc,CAC3B,OAAe,EACf,OAAsC,EACJ;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAChC,IAAI,EAAE,qBAAqB;YAC3B,OAAO;YACP,GAAG,OAAO;SACV,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;IAAA,CAC9C;IAEO,KAAK,CAAC,kBAAkB,GAAkB;QACjD,MAAM,gBAAgB,GAAI,IAAI,CAAC,OAAO,CAAC,OAAsD,CAAC,gBAAgB,CAAC;QAC/G,IAAI,gBAAgB,EAAE,CAAC;YACtB,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;IAAA,CACD;IAEO,KAAK,CAAC,eAAe,CAC5B,MAAsC,EACtC,sBAA+B,EACf;QAChB,MAAM,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YAC5D,IAAI,EAAE,kBAAkB;YACxB,MAAM;YACN,sBAAsB;YACtB,iBAAiB,EAAE,sBAAsB;SACzC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAAA,CACvB;IAEO,KAAK,CAAC,wBAAwB,CAAC,WAA4D,EAAiB;QACnH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAAC;QAChE,CAAC;IAAA,CACD;IAED,KAAK,CAAC,aAAa,CAClB,WAAmB,EACnB,OAAgG,EAC9D;QAClC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACxE,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAChH,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,QAAQ;YAChB,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,UAAU,CAAC,OAKhB,EAAmC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3C,MAAM,iBAAiB,GAAG;YACzB,EAAE,EAAE,OAAO,EAAE,EAAE;YACf,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,aAAa,CAAC,mBAAmB,EAAE;SAC5E,CAAC;QACF,IAAI,WAAoB,CAAC;QACzB,IAAI,CAAC;YACJ,WAAW,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,6BAA6B,CAAC,EAAE,CAAC;gBAClF,MAAM,KAAK,CAAC;YACb,CAAC;YACD,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,KAAK;YACb,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACpB,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;QACzF,CAAC;QACD,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,IAAI,CACT,OAAe,EACf,OAAsG,EAC7C;QACzD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,QAAQ,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,YAA2B,CAAC;QAChC,IAAI,YAAgC,CAAC;QAErC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACvB,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/E,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACjD,CAAC;YACD,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC;YACtC,YAAY,GAAG,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3C,IAAI,WAAoB,CAAC;QACzB,IAAI,CAAC;YACJ,WAAW,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,6BAA6B,CAAC,EAAE,CAAC;gBAClF,MAAM,KAAK,CAAC;YACb,CAAC;YACD,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAA,CAC1C;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,WAAoB,EAAmC;QAC/F,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,8BAA8B,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACzE,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;QACtG,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,QAAQ;YAChB,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,OAAO,CAAC,OAAO,GAA0B,EAAE,EAAiB;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC5B,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE;gBACjD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;gBAC/C,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,OAAO,EAAE,OAAO,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBAC7B,YAAY,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,EAAE,CAAC;gBACvB,gBAAgB,EAAE,CAAC;gBACnB,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO;YACR,CAAC;YAED,YAAY,EAAE,CAAC;YACf,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC;YAC5B,OAAO;QACR,CAAC;QAED,YAAY,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE;YACzC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACvC,QAAQ,EAAE,OAAO,CAAC,eAAe;YACjC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,aAAa,EAAE,OAAO,CAAC,aAAa;SACpC,CAAC,CAAC;QACH,gBAAgB,EAAE,CAAC;QACnB,aAAa,EAAE,CAAC;QAChB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;IAAA,CACD;IAED,aAAa,GAA+B;QAC3C,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IAAA,CACpC;IAED,oBAAoB,CAAC,SAAiB,EAA8B;QACnE,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAAA,CACpD;IAED,qBAAqB,GAA+B;QACnD,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IAAA,CAC5C;IAED,eAAe,CAAC,SAAiB,EAA8B;QAC9D,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAAA,CAC/C;IAED,KAAK,CAAC,YAAY,CAAC,UAAgC,EAA0B;QAC5E,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CAC5C;IAED,KAAK,CAAC,eAAe,CAAC,UAAgC,EAA0B;QAC/E,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAAA,CAC/C;IAED,KAAK,CAAC,OAAO,GAAkB;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,MAAM,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YAC5D,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;SACd,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAAA,CAC1B;CACD","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@fleetagent/pi-agent-core\";\nimport { clampThinkingLevel, type ImageContent, type Message, type Model, streamSimple } from \"@fleetagent/pi-ai\";\nimport chalk from \"chalk\";\nimport { getAgentDir } from \"../config.ts\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"../modes/index.ts\";\nimport { stopThemeWatcher } from \"../modes/interactive/theme/theme.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type {\n\tExtensionRunner,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { restoreStdout, takeOverStdout } from \"./output-guard.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport {\n\tgetDefaultSessionDir,\n\tLocalSessionManager,\n\ttype Session,\n\ttype SessionInfo,\n\ttype SessionListProgress,\n\ttype SessionManager,\n} from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\nimport { printTimings, time } from \"./timings.ts\";\nimport type { ToolName } from \"./tools/index.ts\";\n\nexport interface PiAgentDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\nexport interface PiAgentServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: PiAgentDiagnostic[];\n}\n\nexport interface PiAgentSessionOptions {\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\tnoTools?: \"all\" | \"builtin\";\n\tcustomTools?: ToolDefinition[];\n}\n\nexport interface ResolvePiAgentSessionOptionsContext {\n\tservices: PiAgentServices;\n\tsession: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport interface ResolvePiAgentSessionOptionsResult extends PiAgentSessionOptions {\n\tdiagnostics?: PiAgentDiagnostic[];\n}\n\nexport interface CreatePiAgentOptions extends PiAgentSessionOptions {\n\t/** Runtime mode. Default: embedded SDK usage. */\n\tmode?: PiAgentAppMode;\n\tcwd?: string;\n\tagentDir?: string;\n\t/** Session lifecycle/discovery backend. Default: local JSONL sessions for cwd. */\n\tsessionManager?: SessionManager;\n\t/** Shared auth storage reused across runtime recreation. */\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoader?: ResourceLoader;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresolveSessionOptions?: (\n\t\tcontext: ResolvePiAgentSessionOptionsContext,\n\t) => Promise<ResolvePiAgentSessionOptionsResult> | ResolvePiAgentSessionOptionsResult;\n}\n\nexport interface CreatePiAgentSessionOptions {\n\t/** Initial active conversation state. Default: sessionManager.create(). */\n\tsession?: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport type PiAgentAppMode = \"embedded\" | \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface RunPiAgentModeOptions {\n\tmode?: PiAgentAppMode;\n\tmigratedProviders?: string[];\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n\tinitialMessages?: string[];\n\tverbose?: boolean;\n\tstartupBenchmark?: boolean;\n}\n\nexport interface PiAgentRuntimeHost {\n\treadonly services: PiAgentServices;\n\treadonly session: AgentSession;\n\treadonly diagnostics: readonly PiAgentDiagnostic[];\n\treadonly modelFallbackMessage: string | undefined;\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void;\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void;\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\tnewSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }>;\n\timportFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }>;\n\tlistSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tlistAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tdispose(): Promise<void>;\n}\n\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction getAttributionHeaders(\n\tmodel: Model<any>,\n\tsettingsManager: SettingsManager,\n): Record<string, string> | undefined {\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (model.provider === \"openrouter\" || model.baseUrl.includes(\"openrouter.ai\")) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://pi.dev\",\n\t\t\t\"X-OpenRouter-Title\": \"pi\",\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmodel.baseUrl.includes(\"api.cloudflare.com\") ||\n\t\tmodel.baseUrl.includes(\"gateway.ai.cloudflare.com\")\n\t) {\n\t\treturn {\n\t\t\t\"User-Agent\": \"pi-coding-agent\",\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): PiAgentDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: PiAgentDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Application-level composition root for pi's coding agent runtime.\n *\n * PiAgent owns common app services, the session lifecycle backend, and the\n * current active AgentSession. Conversation behavior stays in AgentSession;\n * session lifecycle/discovery stays in SessionManager implementations.\n */\nexport class PiAgent {\n\tprivate readonly initialCwd: string;\n\treadonly agentDir: string;\n\treadonly sessionManager: SessionManager;\n\treadonly authStorage: AuthStorage;\n\n\tprivate readonly options: CreatePiAgentOptions;\n\tprivate _mode: PiAgentAppMode;\n\tprivate _session?: AgentSession;\n\tprivate _services?: PiAgentServices;\n\tprivate _diagnostics: PiAgentDiagnostic[] = [];\n\tprivate _modelFallbackMessage?: string;\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\n\tprivate constructor(\n\t\toptions: CreatePiAgentOptions,\n\t\tresolved: {\n\t\t\tcwd: string;\n\t\t\tagentDir: string;\n\t\t\tsessionManager: SessionManager;\n\t\t\tauthStorage: AuthStorage;\n\t\t},\n\t) {\n\t\tthis.options = options;\n\t\tthis._mode = options.mode ?? \"embedded\";\n\t\tthis.initialCwd = resolved.cwd;\n\t\tthis.agentDir = resolved.agentDir;\n\t\tthis.sessionManager = resolved.sessionManager;\n\t\tthis.authStorage = resolved.authStorage;\n\t}\n\n\tstatic setupStdio(options: { mode: PiAgentAppMode }): void {\n\t\tif (options.mode !== \"embedded\" && options.mode !== \"interactive\") {\n\t\t\ttakeOverStdout();\n\t\t}\n\t}\n\n\tstatic async create(options: CreatePiAgentOptions = {}): Promise<PiAgent> {\n\t\tconst cwd = options.cwd ?? process.cwd();\n\t\tconst agentDir = options.agentDir ?? getAgentDir();\n\t\tconst sessionManager =\n\t\t\toptions.sessionManager ?? new LocalSessionManager({ cwd, sessionDir: getDefaultSessionDir(cwd, agentDir) });\n\t\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\t\treturn new PiAgent(options, { cwd, agentDir, sessionManager, authStorage });\n\t}\n\n\tget mode(): PiAgentAppMode {\n\t\treturn this._mode;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services?.cwd ?? this.initialCwd;\n\t}\n\n\tasync readPipedStdin(): Promise<string | undefined> {\n\t\tif (this._mode === \"embedded\" || this._mode === \"rpc\" || process.stdin.isTTY) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst stdinContent = await new Promise<string | undefined>((resolve) => {\n\t\t\tlet data = \"\";\n\t\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\t\tdata += chunk;\n\t\t\t});\n\t\t\tprocess.stdin.on(\"end\", () => {\n\t\t\t\tresolve(data.trim() || undefined);\n\t\t\t});\n\t\t\tprocess.stdin.resume();\n\t\t});\n\n\t\tif (stdinContent !== undefined && this._mode === \"interactive\") {\n\t\t\tthis._mode = \"print\";\n\t\t}\n\t\treturn stdinContent;\n\t}\n\n\tprivate async createServices(cwd: string): Promise<PiAgentServices> {\n\t\tconst settingsManager = this.options.settingsManager ?? SettingsManager.create(cwd, this.agentDir);\n\t\tconst modelRegistry =\n\t\t\tthis.options.modelRegistry ?? ModelRegistry.create(this.authStorage, join(this.agentDir, \"models.json\"));\n\t\tconst resourceLoader =\n\t\t\tthis.options.resourceLoader ??\n\t\t\tnew DefaultResourceLoader({\n\t\t\t\t...(this.options.resourceLoaderOptions ?? {}),\n\t\t\t\tcwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\tconst diagnostics: PiAgentDiagnostic[] = [];\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t\ttry {\n\t\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\textensionsResult.runtime.pendingProviderRegistrations = [];\n\t\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, this.options.extensionFlagValues));\n\n\t\treturn {\n\t\t\tcwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tauthStorage: this.authStorage,\n\t\t\tsettingsManager,\n\t\t\tmodelRegistry,\n\t\t\tresourceLoader,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async buildAgentSession(\n\t\tactiveSession: Session,\n\t\tsessionStartEvent?: SessionStartEvent,\n\t): Promise<{\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}> {\n\t\tconst services = await this.createServices(activeSession.getCwd());\n\t\tconst diagnostics: PiAgentDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...services.resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\t\tconst resolvedOptions =\n\t\t\t(await this.options.resolveSessionOptions?.({ services, session: activeSession, sessionStartEvent })) ?? {};\n\t\tdiagnostics.push(...(resolvedOptions.diagnostics ?? []));\n\t\tconst sessionOptions: PiAgentSessionOptions = {\n\t\t\tmodel: resolvedOptions.model ?? this.options.model,\n\t\t\tthinkingLevel: resolvedOptions.thinkingLevel ?? this.options.thinkingLevel,\n\t\t\tscopedModels: resolvedOptions.scopedModels ?? this.options.scopedModels,\n\t\t\ttools: resolvedOptions.tools ?? this.options.tools,\n\t\t\tnoTools: resolvedOptions.noTools ?? this.options.noTools,\n\t\t\tcustomTools: resolvedOptions.customTools ?? this.options.customTools,\n\t\t};\n\n\t\tconst existingSession = activeSession.buildSessionContext();\n\t\tconst hasExistingSession = existingSession.messages.length > 0;\n\t\tconst hasThinkingEntry = activeSession.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\t\tlet model = sessionOptions.model;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (model) {\n\t\t\tmodel = services.modelRegistry.find(model.provider, model.id) ?? model;\n\t\t}\n\n\t\tif (!model && hasExistingSession && existingSession.model) {\n\t\t\tconst restoredModel = services.modelRegistry.find(\n\t\t\t\texistingSession.model.provider,\n\t\t\t\texistingSession.model.modelId,\n\t\t\t);\n\t\t\tif (restoredModel && services.modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\t}\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: services.settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: services.settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: services.settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t\t} else if (modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = sessionOptions.thinkingLevel;\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\t\tthinkingLevel = model ? (clampThinkingLevel(model, thinkingLevel) as ThinkingLevel) : \"off\";\n\n\t\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst allowedToolNames = sessionOptions.tools ?? (sessionOptions.noTools === \"all\" ? [] : undefined);\n\t\tconst initialActiveToolNames: string[] = sessionOptions.tools\n\t\t\t? [...sessionOptions.tools]\n\t\t\t: sessionOptions.noTools\n\t\t\t\t? []\n\t\t\t\t: defaultActiveToolNames;\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!services.settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: async (model, context, options) => {\n\t\t\t\tconst auth = await services.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = services.settingsManager.getProviderRetrySettings();\n\t\t\t\tconst attributionHeaders = getAttributionHeaders(model, services.settingsManager);\n\t\t\t\treturn streamSimple(model, context, {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders:\n\t\t\t\t\t\tattributionHeaders || auth.headers || options?.headers\n\t\t\t\t\t\t\t? { ...attributionHeaders, ...auth.headers, ...options?.headers }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonPayload: async (payload) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: activeSession.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\treturn runner ? runner.emitContext(messages) : messages;\n\t\t\t},\n\t\t\tsteeringMode: services.settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: services.settingsManager.getFollowUpMode(),\n\t\t\ttransport: services.settingsManager.getTransport(),\n\t\t\tthinkingBudgets: services.settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: services.settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tactiveSession.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\tsession: new AgentSession({\n\t\t\t\tagent,\n\t\t\t\tsession: activeSession,\n\t\t\t\tsettingsManager: services.settingsManager,\n\t\t\t\tcwd: services.cwd,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\tresourceLoader: services.resourceLoader,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t\tinitialActiveToolNames,\n\t\t\t\tallowedToolNames,\n\t\t\t\textensionRunnerRef,\n\t\t\t\tsessionStartEvent,\n\t\t\t}),\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t}\n\n\tprivate apply(result: {\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t}\n\n\tasync createAgentSession(options: CreatePiAgentSessionOptions = {}): Promise<AgentSession> {\n\t\tconst initialSession = options.session ?? (await this.sessionManager.create());\n\t\tassertSessionCwdExists(initialSession, initialSession.getCwd());\n\t\tthis.apply(await this.buildAgentSession(initialSession, options.sessionStartEvent));\n\t\treturn this.session;\n\t}\n\n\tget runtime(): PiAgent {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tget services(): PiAgentServices {\n\t\tif (!this._services) {\n\t\t\tthrow new Error(\"PiAgent services have not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._session;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget settingsManager(): SettingsManager {\n\t\treturn this.services.settingsManager;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this.services.modelRegistry;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this.services.resourceLoader;\n\t}\n\n\tget diagnostics(): readonly PiAgentDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget currentCwd(): string {\n\t\treturn this.services.cwd;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionReference?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async flushActiveSession(): Promise<void> {\n\t\tconst flushPendingSync = (this.session.session as { flushPendingSync?: () => Promise<void> }).flushPendingSync;\n\t\tif (flushPendingSync) {\n\t\t\tawait flushPendingSync.call(this.session.session);\n\t\t}\n\t}\n\n\tprivate async teardownCurrent(\n\t\treason: SessionShutdownEvent[\"reason\"],\n\t\ttargetSessionReference?: string,\n\t): Promise<void> {\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.openReference(sessionPath, { cwdOverride: options?.cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tconst newSessionOptions = {\n\t\t\tid: options?.id,\n\t\t\tparentSession: options?.parentSession ?? activeSession.getSessionReference(),\n\t\t};\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.createSubSession(newSessionOptions);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.create(newSessionOptions);\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.session);\n\t\t\tthis.session.agent.state.messages = this.session.session.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.session.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.forkSubSession(targetLeafId);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.forkSession(activeSession, targetLeafId);\n\t\t}\n\t\tawait this.teardownCurrent(\"fork\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"fork\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", resolvedPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.importJsonl(resolvedPath, { cwdOverride: cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync runMode(options: RunPiAgentModeOptions = {}): Promise<void> {\n\t\tconst mode = options.mode ?? this._mode;\n\t\tif (mode === \"embedded\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode !== \"interactive\" && !this.session.model) {\n\t\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.startupBenchmark && mode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (mode === \"rpc\") {\n\t\t\tprintTimings();\n\t\t\tawait runRpcMode(this);\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"interactive\") {\n\t\t\tconst interactiveMode = new InteractiveMode(this, {\n\t\t\t\tmigratedProviders: options.migratedProviders,\n\t\t\t\tmodelFallbackMessage: this.modelFallbackMessage,\n\t\t\t\tinitialMessage: options.initialMessage,\n\t\t\t\tinitialImages: options.initialImages,\n\t\t\t\tinitialMessages: options.initialMessages,\n\t\t\t\tverbose: options.verbose,\n\t\t\t});\n\t\t\tif (options.startupBenchmark) {\n\t\t\t\tawait interactiveMode.init();\n\t\t\t\ttime(\"interactiveMode.init\");\n\t\t\t\tprintTimings();\n\t\t\t\tinteractiveMode.stop();\n\t\t\t\tstopThemeWatcher();\n\t\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprintTimings();\n\t\t\tawait interactiveMode.run();\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(this, {\n\t\t\tmode: mode === \"json\" ? \"json\" : \"text\",\n\t\t\tmessages: options.initialMessages,\n\t\t\tinitialMessage: options.initialMessage,\n\t\t\tinitialImages: options.initialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t}\n\n\tcreateSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.create();\n\t}\n\n\topenSessionReference(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.openReference(reference);\n\t}\n\n\tcontinueRecentSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.continueRecent();\n\t}\n\n\tforkSessionFrom(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.forkFrom(reference);\n\t}\n\n\tasync listSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.list(onProgress);\n\t}\n\n\tasync listAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.listAll(onProgress);\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (!this._session) {\n\t\t\treturn;\n\t\t}\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"quit\",\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t\tthis._session = undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"pi-agent.js","sourceRoot":"","sources":["../../src/core/pi-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAyC,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAA+C,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAQvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAA0D,MAAM,sBAAsB,CAAC;AACrH,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EACN,oBAAoB,EACpB,mBAAmB,GAKnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAqGlD,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAC/C,QAAQ,CAAS;IAE1B,YAAY,QAAgB,EAAE;QAC7B,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAAA,CACzB;CACD;AAED,SAAS,sBAAsB,CAAC,OAAwD,EAAU;IACjG,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,IAAI,EAA0C,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC/G,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACX;AAED,SAAS,qBAAqB,CAC7B,KAAiB,EACjB,eAAgC,EAChC,SAAkB,EACmB;IACrC,IACC,SAAS;QACT,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAC3G,CAAC;QACF,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,yBAAyB,CAAC,eAAe,CAAC,EAAE,CAAC;QACjD,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,KAAK,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAChF,OAAO;YACN,cAAc,EAAE,gBAAgB;YAChC,oBAAoB,EAAE,IAAI;YAC1B,yBAAyB,EAAE,WAAW;SACtC,CAAC;IACH,CAAC;IAED,IACC,KAAK,CAAC,QAAQ,KAAK,uBAAuB;QAC1C,KAAK,CAAC,QAAQ,KAAK,uBAAuB;QAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC5C,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAClD,CAAC;QACF,OAAO;YACN,YAAY,EAAE,iBAAiB;SAC/B,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,wBAAwB,CAChC,cAA8B,EAC9B,mBAA8D,EACxC;IACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,WAAW,GAAwB,EAAE,CAAC;IAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;IACxD,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0C,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,gBAAgB,CAAC,UAAU,EAAE,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YAC5C,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;IACF,CAAC;IAED,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,mBAAmB,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACX,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpD,SAAS;QACV,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrD,SAAS;QACV,CAAC;QACD,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,qBAAqB,IAAI,oBAAoB;SACtD,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,iBAAiB,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACvH,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,WAAW,CAAC;AAAA,CACnB;AAED;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IACF,UAAU,CAAS;IAC3B,QAAQ,CAAS;IACjB,cAAc,CAAiB;IAC/B,WAAW,CAAc;IAEjB,OAAO,CAAuB;IACvC,KAAK,CAAiB;IACtB,QAAQ,CAAgB;IACxB,SAAS,CAAmB;IAC5B,YAAY,GAAwB,EAAE,CAAC;IACvC,qBAAqB,CAAU;IAC/B,aAAa,CAA4C;IACzD,uBAAuB,CAAc;IAE7C,YACC,OAA6B,EAC7B,QAKC,EACA;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;QAC9C,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IAAA,CACxC;IAED,MAAM,CAAC,UAAU,CAAC,OAAiC,EAAQ;QAC1D,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACnE,cAAc,EAAE,CAAC;QAClB,CAAC;IAAA,CACD;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAyB,EAAE,EAAoB;QACzE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,EAAE,CAAC;QACnD,MAAM,cAAc,GACnB,OAAO,CAAC,cAAc,IAAI,IAAI,mBAAmB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7G,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3F,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IAAA,CAC5E;IAED,IAAI,IAAI,GAAmB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;IAAA,CAClB;IAED,IAAI,GAAG,GAAW;QACjB,OAAO,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;IAAA,CAC9C;IAED,KAAK,CAAC,cAAc,GAAgC;QACnD,IAAI,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9E,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;YACvE,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnC,IAAI,IAAI,KAAK,CAAC;YAAA,CACd,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC;YAAA,CAClC,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAAA,CACvB,CAAC,CAAC;QAEH,IAAI,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACtB,CAAC;QACD,OAAO,YAAY,CAAC;IAAA,CACpB;IAEO,KAAK,CAAC,cAAc,CAAC,GAAW,EAA4B;QACnE,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnG,MAAM,aAAa,GAClB,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1G,MAAM,cAAc,GACnB,IAAI,CAAC,OAAO,CAAC,cAAc;YAC3B,IAAI,qBAAqB,CAAC;gBACzB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,IAAI,EAAE,CAAC;gBAC7C,GAAG;gBACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,eAAe;aACf,CAAC,CAAC;QACJ,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;QAE9B,MAAM,WAAW,GAAwB,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAG,cAAc,CAAC,aAAa,EAAE,CAAC;QACxD,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,gBAAgB,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC;YACrG,IAAI,CAAC;gBACJ,aAAa,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,WAAW,CAAC,IAAI,CAAC;oBAChB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,cAAc,aAAa,YAAY,OAAO,EAAE;iBACzD,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;QACD,gBAAgB,CAAC,OAAO,CAAC,4BAA4B,GAAG,EAAE,CAAC;QAC3D,WAAW,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEhG,OAAO;YACN,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe;YACf,aAAa;YACb,cAAc;YACd,WAAW;SACX,CAAC;IAAA,CACF;IAEO,KAAK,CAAC,iBAAiB,CAC9B,aAAsB,EACtB,iBAAqC,EAMnC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;QACnE,MAAM,WAAW,GAAwB;YACxC,GAAG,QAAQ,CAAC,WAAW;YACvB,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3E,IAAI,EAAE,OAAgB;gBACtB,OAAO,EAAE,6BAA6B,IAAI,MAAM,KAAK,EAAE;aACvD,CAAC,CAAC;SACH,CAAC;QACF,MAAM,eAAe,GACpB,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7G,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;QACzD,MAAM,cAAc,GAA0B;YAC7C,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;YAClD,aAAa,EAAE,eAAe,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa;YAC1E,YAAY,EAAE,eAAe,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY;YACvE,KAAK,EAAE,eAAe,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK;YAClD,OAAO,EAAE,eAAe,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YACxD,WAAW,EAAE,eAAe,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW;SACpE,CAAC;QAEF,MAAM,eAAe,GAAG,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAC5D,MAAM,kBAAkB,GAAG,eAAe,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC;QAE3G,IAAI,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;QACjC,IAAI,oBAAwC,CAAC;QAE7C,IAAI,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,KAAK,IAAI,kBAAkB,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC;YAC3D,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAChD,eAAe,CAAC,KAAK,CAAC,QAAQ,EAC9B,eAAe,CAAC,KAAK,CAAC,OAAO,CAC7B,CAAC;YACF,IAAI,aAAa,IAAI,QAAQ,CAAC,aAAa,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC9E,KAAK,GAAG,aAAa,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,oBAAoB,GAAG,2BAA2B,eAAe,CAAC,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACrH,CAAC;QACF,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACrC,YAAY,EAAE,EAAE;gBAChB,YAAY,EAAE,kBAAkB;gBAChC,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE;gBAC9D,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE;gBAC1D,oBAAoB,EAAE,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE;gBACxE,aAAa,EAAE,QAAQ,CAAC,aAAa;aACrC,CAAC,CAAC;YACH,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACrB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,oBAAoB,GAAG,8BAA8B,EAAE,CAAC;YACzD,CAAC;iBAAM,IAAI,oBAAoB,EAAE,CAAC;gBACjC,oBAAoB,IAAI,WAAW,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACjE,CAAC;QACF,CAAC;QAED,IAAI,aAAa,GAAG,cAAc,CAAC,aAAa,CAAC;QACjD,IAAI,aAAa,KAAK,SAAS,IAAI,kBAAkB,EAAE,CAAC;YACvD,aAAa,GAAG,gBAAgB;gBAC/B,CAAC,CAAE,eAAe,CAAC,aAA+B;gBAClD,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,sBAAsB,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YACjC,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,IAAI,sBAAsB,CAAC;QAC9F,CAAC;QACD,aAAa,GAAG,KAAK,CAAC,CAAC,CAAE,kBAAkB,CAAC,KAAK,EAAE,aAAa,CAAmB,CAAC,CAAC,CAAC,KAAK,CAAC;QAE5F,MAAM,sBAAsB,GAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7E,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrG,MAAM,sBAAsB,GAAa,cAAc,CAAC,KAAK;YAC5D,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC;YAC3B,CAAC,CAAC,cAAc,CAAC,OAAO;gBACvB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,sBAAsB,CAAC;QAE3B,MAAM,kBAAkB,GAAkC,EAAE,CAAC;QAC7D,MAAM,2BAA2B,GAAG,CAAC,QAAwB,EAAa,EAAE,CAAC;YAC5E,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC;gBAChD,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBACtD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;oBAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;wBAC1D,IAAI,SAAS,EAAE,CAAC;4BACf,MAAM,eAAe,GAAG,OAAO;iCAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACV,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC,CAAC,CAAC,CACtF;iCACA,MAAM,CACN,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CACb,CAAC,CACA,CAAC,CAAC,IAAI,KAAK,MAAM;gCACjB,CAAC,CAAC,IAAI,KAAK,4BAA4B;gCACvC,CAAC,GAAG,CAAC;gCACL,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;gCACzB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAoC,CAAC,IAAI,KAAK,4BAA4B,CACpF,CACF,CAAC;4BACH,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;wBAC7C,CAAC;oBACF,CAAC;gBACF,CAAC;gBACD,OAAO,GAAG,CAAC;YAAA,CACX,CAAC,CAAC;QAAA,CACH,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACvB,YAAY,EAAE;gBACb,YAAY,EAAE,EAAE;gBAChB,KAAK;gBACL,aAAa;gBACb,KAAK,EAAE,EAAE;aACT;YACD,YAAY,EAAE,2BAA2B;YACzC,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;gBACD,MAAM,qBAAqB,GAAG,QAAQ,CAAC,eAAe,CAAC,wBAAwB,EAAE,CAAC;gBAClF,MAAM,SAAS,GACd,OAAO,EAAE,SAAS;oBAClB,qBAAqB,CAAC,SAAS;oBAC/B,CAAC,KAAK,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACxG,MAAM,yBAAyB,GAC9B,OAAO,EAAE,yBAAyB,IAAI,QAAQ,CAAC,eAAe,CAAC,4BAA4B,EAAE,CAAC;gBAC/F,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,KAAK,EAAE,QAAQ,CAAC,eAAe,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBACtG,OAAO,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE;oBACnC,GAAG,OAAO;oBACV,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS;oBACT,yBAAyB;oBACzB,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,qBAAqB,CAAC,UAAU;oBACnE,eAAe,EAAE,OAAO,EAAE,eAAe,IAAI,qBAAqB,CAAC,eAAe;oBAClF,OAAO,EACN,kBAAkB,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,OAAO;wBACrD,CAAC,CAAC,EAAE,GAAG,kBAAkB,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE;wBACjE,CAAC,CAAC,SAAS;iBACb,CAAC,CAAC;YAAA,CACH;YACD,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC;gBAC1C,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,yBAAyB,CAAC,EAAE,CAAC;oBACrD,OAAO,OAAO,CAAC;gBAChB,CAAC;gBACD,OAAO,MAAM,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;YAAA,CACjD;YACD,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC;gBAC1C,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,yBAAyB,CAAC,EAAE,CAAC;oBACrD,OAAO;gBACR,CAAC;gBACD,MAAM,MAAM,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,yBAAyB;oBAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;iBACzB,CAAC,CAAC;YAAA,CACH;YACD,SAAS,EAAE,aAAa,CAAC,YAAY,EAAE;YACvC,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC;gBAC1C,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAAA,CACxD;YACD,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE;YACxD,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,EAAE;YACxD,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE;YAClD,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,kBAAkB,EAAE;YAC9D,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,wBAAwB,EAAE,CAAC,eAAe;SACpF,CAAC,CAAC;QAEH,IAAI,kBAAkB,EAAE,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;YAChD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACvB,aAAa,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACxD,CAAC;QACF,CAAC;aAAM,CAAC;YACP,IAAI,KAAK,EAAE,CAAC;gBACX,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,aAAa,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;QAED,OAAO;YACN,OAAO,EAAE,IAAI,YAAY,CAAC;gBACzB,KAAK;gBACL,OAAO,EAAE,aAAa;gBACtB,eAAe,EAAE,QAAQ,CAAC,eAAe;gBACzC,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,YAAY,EAAE,cAAc,CAAC,YAAY;gBACzC,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,WAAW,EAAE,cAAc,CAAC,WAAW;gBACvC,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,sBAAsB;gBACtB,gBAAgB;gBAChB,kBAAkB;gBAClB,iBAAiB;aACjB,CAAC;YACF,QAAQ;YACR,WAAW;YACX,oBAAoB;SACpB,CAAC;IAAA,CACF;IAEO,KAAK,CAAC,MAKb,EAAQ;QACR,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAAA,CACzD;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAO,GAAgC,EAAE,EAAyB;QAC1F,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,sBAAsB,CAAC,cAAc,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,OAAO,CAAC;IAAA,CACpB;IAED,IAAI,OAAO,GAAY;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,IAAI,CAAC;IAAA,CACZ;IAED,IAAI,QAAQ,GAAoB;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IAAA,CACtB;IAED,IAAI,OAAO,GAAiB;QAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IAAA,CACrB;IAED,IAAI,oBAAoB,GAAuB;QAC9C,OAAO,IAAI,CAAC,qBAAqB,CAAC;IAAA,CAClC;IAED,IAAI,eAAe,GAAoB;QACtC,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;IAAA,CACrC;IAED,IAAI,aAAa,GAAkB;QAClC,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;IAAA,CACnC;IAED,IAAI,cAAc,GAAmB;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;IAAA,CACpC;IAED,IAAI,WAAW,GAAiC;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC;IAAA,CACzB;IAED,IAAI,UAAU,GAAW;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IAAA,CACzB;IAED,gBAAgB,CAAC,aAAwD,EAAQ;QAChF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IAAA,CACnC;IAED,0BAA0B,CAAC,uBAAoC,EAAQ;QACtE,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;IAAA,CACvD;IAEO,KAAK,CAAC,gBAAgB,CAC7B,MAAwB,EACxB,sBAA+B,EACG;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAClD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAChC,IAAI,EAAE,uBAAuB;YAC7B,MAAM;YACN,sBAAsB;YACtB,iBAAiB,EAAE,sBAAsB;SACzC,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;IAAA,CAC9C;IAEO,KAAK,CAAC,cAAc,CAC3B,OAAe,EACf,OAAsC,EACJ;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAChC,IAAI,EAAE,qBAAqB;YAC3B,OAAO;YACP,GAAG,OAAO;SACV,CAAC,CAAC;QACH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;IAAA,CAC9C;IAEO,KAAK,CAAC,kBAAkB,GAAkB;QACjD,MAAM,gBAAgB,GAAI,IAAI,CAAC,OAAO,CAAC,OAAsD,CAAC,gBAAgB,CAAC;QAC/G,IAAI,gBAAgB,EAAE,CAAC;YACtB,MAAM,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;IAAA,CACD;IAEO,KAAK,CAAC,eAAe,CAC5B,MAAsC,EACtC,sBAA+B,EACf;QAChB,MAAM,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YAC5D,IAAI,EAAE,kBAAkB;YACxB,MAAM;YACN,sBAAsB;YACtB,iBAAiB,EAAE,sBAAsB;SACzC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAAA,CACvB;IAEO,KAAK,CAAC,wBAAwB,CAAC,WAA4D,EAAiB;QACnH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YACjB,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,CAAC;QAChE,CAAC;IAAA,CACD;IAED,KAAK,CAAC,aAAa,CAClB,WAAmB,EACnB,OAAgG,EAC9D;QAClC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACxE,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QAChH,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,QAAQ;YAChB,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,UAAU,CAAC,OAKhB,EAAmC;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3C,MAAM,iBAAiB,GAAG;YACzB,EAAE,EAAE,OAAO,EAAE,EAAE;YACf,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,aAAa,CAAC,mBAAmB,EAAE;SAC5E,CAAC;QACF,IAAI,WAAoB,CAAC;QACzB,IAAI,CAAC;YACJ,WAAW,GAAG,MAAM,aAAa,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,6BAA6B,CAAC,EAAE,CAAC;gBAClF,MAAM,KAAK,CAAC;YACb,CAAC;YACD,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,KAAK;YACb,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACpB,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC;QACzF,CAAC;QACD,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,IAAI,CACT,OAAe,EACf,OAAsG,EAC7C;QACzD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,QAAQ,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,YAA2B,CAAC;QAChC,IAAI,YAAgC,CAAC;QAErC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACvB,YAAY,GAAG,aAAa,CAAC,EAAE,CAAC;QACjC,CAAC;aAAM,CAAC;YACP,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/E,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACjD,CAAC;YACD,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC;YACtC,YAAY,GAAG,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC3C,IAAI,WAAoB,CAAC;QACzB,IAAI,CAAC;YACJ,WAAW,GAAG,MAAM,aAAa,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,6BAA6B,CAAC,EAAE,CAAC;gBAClF,MAAM,KAAK,CAAC;YACb,CAAC;YACD,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAA,CAC1C;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,WAAoB,EAAmC;QAC/F,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,8BAA8B,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACzE,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO,YAAY,CAAC;QACrB,CAAC;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;QACtG,sBAAsB,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CACT,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,QAAQ;YAChB,wBAAwB;YACxB,mBAAmB,EAAE,wBAAwB;SAC7C,CAAC,CACF,CAAC;QACF,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAAA,CAC5B;IAED,KAAK,CAAC,OAAO,CAAC,OAAO,GAA0B,EAAE,EAAiB;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC;QACxC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACzB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,OAAO,CAAC,gBAAgB,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACpB,YAAY,EAAE,CAAC;YACf,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC5B,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE;gBACjD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;gBAC/C,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,eAAe,EAAE,OAAO,CAAC,eAAe;gBACxC,OAAO,EAAE,OAAO,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,eAAe,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBAC7B,YAAY,EAAE,CAAC;gBACf,eAAe,CAAC,IAAI,EAAE,CAAC;gBACvB,gBAAgB,EAAE,CAAC;gBACnB,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO;YACR,CAAC;YAED,YAAY,EAAE,CAAC;YACf,MAAM,eAAe,CAAC,GAAG,EAAE,CAAC;YAC5B,OAAO;QACR,CAAC;QAED,YAAY,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE;YACzC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACvC,QAAQ,EAAE,OAAO,CAAC,eAAe;YACjC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,aAAa,EAAE,OAAO,CAAC,aAAa;SACpC,CAAC,CAAC;QACH,gBAAgB,EAAE,CAAC;QACnB,aAAa,EAAE,CAAC;QAChB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,CAAC;IAAA,CACD;IAED,aAAa,GAA+B;QAC3C,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IAAA,CACpC;IAED,oBAAoB,CAAC,SAAiB,EAA8B;QACnE,OAAO,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAAA,CACpD;IAED,qBAAqB,GAA+B;QACnD,OAAO,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IAAA,CAC5C;IAED,eAAe,CAAC,SAAiB,EAA8B;QAC9D,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAAA,CAC/C;IAED,KAAK,CAAC,YAAY,CAAC,UAAgC,EAA0B;QAC5E,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CAC5C;IAED,KAAK,CAAC,eAAe,CAAC,UAAgC,EAA0B;QAC/E,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAAA,CAC/C;IAED,KAAK,CAAC,OAAO,GAAkB;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO;QACR,CAAC;QACD,MAAM,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YAC5D,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;SACd,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAChC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAAA,CAC1B;CACD","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@fleetagent/pi-agent-core\";\nimport { clampThinkingLevel, type ImageContent, type Message, type Model, streamSimple } from \"@fleetagent/pi-ai\";\nimport chalk from \"chalk\";\nimport { getAgentDir } from \"../config.ts\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"../modes/index.ts\";\nimport { stopThemeWatcher } from \"../modes/interactive/theme/theme.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type {\n\tExtensionRunner,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { restoreStdout, takeOverStdout } from \"./output-guard.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport {\n\tgetDefaultSessionDir,\n\tLocalSessionManager,\n\ttype Session,\n\ttype SessionInfo,\n\ttype SessionListProgress,\n\ttype SessionManager,\n} from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\nimport { printTimings, time } from \"./timings.ts\";\nimport type { ToolName } from \"./tools/index.ts\";\n\nexport interface PiAgentDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\nexport interface PiAgentServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: PiAgentDiagnostic[];\n}\n\nexport interface PiAgentSessionOptions {\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\tnoTools?: \"all\" | \"builtin\";\n\tcustomTools?: ToolDefinition[];\n}\n\nexport interface ResolvePiAgentSessionOptionsContext {\n\tservices: PiAgentServices;\n\tsession: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport interface ResolvePiAgentSessionOptionsResult extends PiAgentSessionOptions {\n\tdiagnostics?: PiAgentDiagnostic[];\n}\n\nexport interface CreatePiAgentOptions extends PiAgentSessionOptions {\n\t/** Runtime mode. Default: embedded SDK usage. */\n\tmode?: PiAgentAppMode;\n\tcwd?: string;\n\tagentDir?: string;\n\t/** Session lifecycle/discovery backend. Default: local JSONL sessions for cwd. */\n\tsessionManager?: SessionManager;\n\t/** Shared auth storage reused across runtime recreation. */\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoader?: ResourceLoader;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresolveSessionOptions?: (\n\t\tcontext: ResolvePiAgentSessionOptionsContext,\n\t) => Promise<ResolvePiAgentSessionOptionsResult> | ResolvePiAgentSessionOptionsResult;\n}\n\nexport interface CreatePiAgentSessionOptions {\n\t/** Initial active conversation state. Default: sessionManager.create(). */\n\tsession?: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport type PiAgentAppMode = \"embedded\" | \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface RunPiAgentModeOptions {\n\tmode?: PiAgentAppMode;\n\tmigratedProviders?: string[];\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n\tinitialMessages?: string[];\n\tverbose?: boolean;\n\tstartupBenchmark?: boolean;\n}\n\nexport interface PiAgentRuntimeHost {\n\treadonly services: PiAgentServices;\n\treadonly session: AgentSession;\n\treadonly diagnostics: readonly PiAgentDiagnostic[];\n\treadonly modelFallbackMessage: string | undefined;\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void;\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void;\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\tnewSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }>;\n\timportFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }>;\n\tlistSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tlistAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tdispose(): Promise<void>;\n}\n\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction getAttributionHeaders(\n\tmodel: Model<any>,\n\tsettingsManager: SettingsManager,\n\tsessionId?: string,\n): Record<string, string> | undefined {\n\tif (\n\t\tsessionId &&\n\t\t(model.provider === \"opencode\" || model.provider === \"opencode-go\" || model.baseUrl.includes(\"opencode.ai\"))\n\t) {\n\t\treturn { \"x-opencode-session\": sessionId, \"x-opencode-client\": \"pi\" };\n\t}\n\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (model.provider === \"openrouter\" || model.baseUrl.includes(\"openrouter.ai\")) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://pi.dev\",\n\t\t\t\"X-OpenRouter-Title\": \"pi\",\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmodel.baseUrl.includes(\"api.cloudflare.com\") ||\n\t\tmodel.baseUrl.includes(\"gateway.ai.cloudflare.com\")\n\t) {\n\t\treturn {\n\t\t\t\"User-Agent\": \"pi-coding-agent\",\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): PiAgentDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: PiAgentDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Application-level composition root for pi's coding agent runtime.\n *\n * PiAgent owns common app services, the session lifecycle backend, and the\n * current active AgentSession. Conversation behavior stays in AgentSession;\n * session lifecycle/discovery stays in SessionManager implementations.\n */\nexport class PiAgent {\n\tprivate readonly initialCwd: string;\n\treadonly agentDir: string;\n\treadonly sessionManager: SessionManager;\n\treadonly authStorage: AuthStorage;\n\n\tprivate readonly options: CreatePiAgentOptions;\n\tprivate _mode: PiAgentAppMode;\n\tprivate _session?: AgentSession;\n\tprivate _services?: PiAgentServices;\n\tprivate _diagnostics: PiAgentDiagnostic[] = [];\n\tprivate _modelFallbackMessage?: string;\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\n\tprivate constructor(\n\t\toptions: CreatePiAgentOptions,\n\t\tresolved: {\n\t\t\tcwd: string;\n\t\t\tagentDir: string;\n\t\t\tsessionManager: SessionManager;\n\t\t\tauthStorage: AuthStorage;\n\t\t},\n\t) {\n\t\tthis.options = options;\n\t\tthis._mode = options.mode ?? \"embedded\";\n\t\tthis.initialCwd = resolved.cwd;\n\t\tthis.agentDir = resolved.agentDir;\n\t\tthis.sessionManager = resolved.sessionManager;\n\t\tthis.authStorage = resolved.authStorage;\n\t}\n\n\tstatic setupStdio(options: { mode: PiAgentAppMode }): void {\n\t\tif (options.mode !== \"embedded\" && options.mode !== \"interactive\") {\n\t\t\ttakeOverStdout();\n\t\t}\n\t}\n\n\tstatic async create(options: CreatePiAgentOptions = {}): Promise<PiAgent> {\n\t\tconst cwd = options.cwd ?? process.cwd();\n\t\tconst agentDir = options.agentDir ?? getAgentDir();\n\t\tconst sessionManager =\n\t\t\toptions.sessionManager ?? new LocalSessionManager({ cwd, sessionDir: getDefaultSessionDir(cwd, agentDir) });\n\t\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\t\treturn new PiAgent(options, { cwd, agentDir, sessionManager, authStorage });\n\t}\n\n\tget mode(): PiAgentAppMode {\n\t\treturn this._mode;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services?.cwd ?? this.initialCwd;\n\t}\n\n\tasync readPipedStdin(): Promise<string | undefined> {\n\t\tif (this._mode === \"embedded\" || this._mode === \"rpc\" || process.stdin.isTTY) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst stdinContent = await new Promise<string | undefined>((resolve) => {\n\t\t\tlet data = \"\";\n\t\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\t\tdata += chunk;\n\t\t\t});\n\t\t\tprocess.stdin.on(\"end\", () => {\n\t\t\t\tresolve(data.trim() || undefined);\n\t\t\t});\n\t\t\tprocess.stdin.resume();\n\t\t});\n\n\t\tif (stdinContent !== undefined && this._mode === \"interactive\") {\n\t\t\tthis._mode = \"print\";\n\t\t}\n\t\treturn stdinContent;\n\t}\n\n\tprivate async createServices(cwd: string): Promise<PiAgentServices> {\n\t\tconst settingsManager = this.options.settingsManager ?? SettingsManager.create(cwd, this.agentDir);\n\t\tconst modelRegistry =\n\t\t\tthis.options.modelRegistry ?? ModelRegistry.create(this.authStorage, join(this.agentDir, \"models.json\"));\n\t\tconst resourceLoader =\n\t\t\tthis.options.resourceLoader ??\n\t\t\tnew DefaultResourceLoader({\n\t\t\t\t...(this.options.resourceLoaderOptions ?? {}),\n\t\t\t\tcwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\tconst diagnostics: PiAgentDiagnostic[] = [];\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t\ttry {\n\t\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\textensionsResult.runtime.pendingProviderRegistrations = [];\n\t\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, this.options.extensionFlagValues));\n\n\t\treturn {\n\t\t\tcwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tauthStorage: this.authStorage,\n\t\t\tsettingsManager,\n\t\t\tmodelRegistry,\n\t\t\tresourceLoader,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async buildAgentSession(\n\t\tactiveSession: Session,\n\t\tsessionStartEvent?: SessionStartEvent,\n\t): Promise<{\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}> {\n\t\tconst services = await this.createServices(activeSession.getCwd());\n\t\tconst diagnostics: PiAgentDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...services.resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\t\tconst resolvedOptions =\n\t\t\t(await this.options.resolveSessionOptions?.({ services, session: activeSession, sessionStartEvent })) ?? {};\n\t\tdiagnostics.push(...(resolvedOptions.diagnostics ?? []));\n\t\tconst sessionOptions: PiAgentSessionOptions = {\n\t\t\tmodel: resolvedOptions.model ?? this.options.model,\n\t\t\tthinkingLevel: resolvedOptions.thinkingLevel ?? this.options.thinkingLevel,\n\t\t\tscopedModels: resolvedOptions.scopedModels ?? this.options.scopedModels,\n\t\t\ttools: resolvedOptions.tools ?? this.options.tools,\n\t\t\tnoTools: resolvedOptions.noTools ?? this.options.noTools,\n\t\t\tcustomTools: resolvedOptions.customTools ?? this.options.customTools,\n\t\t};\n\n\t\tconst existingSession = activeSession.buildSessionContext();\n\t\tconst hasExistingSession = existingSession.messages.length > 0;\n\t\tconst hasThinkingEntry = activeSession.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\t\tlet model = sessionOptions.model;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (model) {\n\t\t\tmodel = services.modelRegistry.find(model.provider, model.id) ?? model;\n\t\t}\n\n\t\tif (!model && hasExistingSession && existingSession.model) {\n\t\t\tconst restoredModel = services.modelRegistry.find(\n\t\t\t\texistingSession.model.provider,\n\t\t\t\texistingSession.model.modelId,\n\t\t\t);\n\t\t\tif (restoredModel && services.modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\t}\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: services.settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: services.settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: services.settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t\t} else if (modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = sessionOptions.thinkingLevel;\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\t\tthinkingLevel = model ? (clampThinkingLevel(model, thinkingLevel) as ThinkingLevel) : \"off\";\n\n\t\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst allowedToolNames = sessionOptions.tools ?? (sessionOptions.noTools === \"all\" ? [] : undefined);\n\t\tconst initialActiveToolNames: string[] = sessionOptions.tools\n\t\t\t? [...sessionOptions.tools]\n\t\t\t: sessionOptions.noTools\n\t\t\t\t? []\n\t\t\t\t: defaultActiveToolNames;\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!services.settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: async (model, context, options) => {\n\t\t\t\tconst auth = await services.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = services.settingsManager.getProviderRetrySettings();\n\t\t\t\tconst timeoutMs =\n\t\t\t\t\toptions?.timeoutMs ??\n\t\t\t\t\tproviderRetrySettings.timeoutMs ??\n\t\t\t\t\t(model.api === \"openai-codex-responses\" ? services.settingsManager.getHttpIdleTimeoutMs() : undefined);\n\t\t\t\tconst websocketConnectTimeoutMs =\n\t\t\t\t\toptions?.websocketConnectTimeoutMs ?? services.settingsManager.getWebSocketConnectTimeoutMs();\n\t\t\t\tconst attributionHeaders = getAttributionHeaders(model, services.settingsManager, options?.sessionId);\n\t\t\t\treturn streamSimple(model, context, {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\ttimeoutMs,\n\t\t\t\t\twebsocketConnectTimeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders:\n\t\t\t\t\t\tattributionHeaders || auth.headers || options?.headers\n\t\t\t\t\t\t\t? { ...attributionHeaders, ...auth.headers, ...options?.headers }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonPayload: async (payload) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: activeSession.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\treturn runner ? runner.emitContext(messages) : messages;\n\t\t\t},\n\t\t\tsteeringMode: services.settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: services.settingsManager.getFollowUpMode(),\n\t\t\ttransport: services.settingsManager.getTransport(),\n\t\t\tthinkingBudgets: services.settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: services.settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tactiveSession.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\tsession: new AgentSession({\n\t\t\t\tagent,\n\t\t\t\tsession: activeSession,\n\t\t\t\tsettingsManager: services.settingsManager,\n\t\t\t\tcwd: services.cwd,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\tresourceLoader: services.resourceLoader,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t\tinitialActiveToolNames,\n\t\t\t\tallowedToolNames,\n\t\t\t\textensionRunnerRef,\n\t\t\t\tsessionStartEvent,\n\t\t\t}),\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t}\n\n\tprivate apply(result: {\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t}\n\n\tasync createAgentSession(options: CreatePiAgentSessionOptions = {}): Promise<AgentSession> {\n\t\tconst initialSession = options.session ?? (await this.sessionManager.create());\n\t\tassertSessionCwdExists(initialSession, initialSession.getCwd());\n\t\tthis.apply(await this.buildAgentSession(initialSession, options.sessionStartEvent));\n\t\treturn this.session;\n\t}\n\n\tget runtime(): PiAgent {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tget services(): PiAgentServices {\n\t\tif (!this._services) {\n\t\t\tthrow new Error(\"PiAgent services have not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._session;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget settingsManager(): SettingsManager {\n\t\treturn this.services.settingsManager;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this.services.modelRegistry;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this.services.resourceLoader;\n\t}\n\n\tget diagnostics(): readonly PiAgentDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget currentCwd(): string {\n\t\treturn this.services.cwd;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionReference?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async flushActiveSession(): Promise<void> {\n\t\tconst flushPendingSync = (this.session.session as { flushPendingSync?: () => Promise<void> }).flushPendingSync;\n\t\tif (flushPendingSync) {\n\t\t\tawait flushPendingSync.call(this.session.session);\n\t\t}\n\t}\n\n\tprivate async teardownCurrent(\n\t\treason: SessionShutdownEvent[\"reason\"],\n\t\ttargetSessionReference?: string,\n\t): Promise<void> {\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.openReference(sessionPath, { cwdOverride: options?.cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tconst newSessionOptions = {\n\t\t\tid: options?.id,\n\t\t\tparentSession: options?.parentSession ?? activeSession.getSessionReference(),\n\t\t};\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.createSubSession(newSessionOptions);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.create(newSessionOptions);\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.session);\n\t\t\tthis.session.agent.state.messages = this.session.session.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.session.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.forkSubSession(targetLeafId);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.forkSession(activeSession, targetLeafId);\n\t\t}\n\t\tawait this.teardownCurrent(\"fork\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"fork\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", resolvedPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.importJsonl(resolvedPath, { cwdOverride: cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync runMode(options: RunPiAgentModeOptions = {}): Promise<void> {\n\t\tconst mode = options.mode ?? this._mode;\n\t\tif (mode === \"embedded\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode !== \"interactive\" && !this.session.model) {\n\t\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.startupBenchmark && mode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (mode === \"rpc\") {\n\t\t\tprintTimings();\n\t\t\tawait runRpcMode(this);\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"interactive\") {\n\t\t\tconst interactiveMode = new InteractiveMode(this, {\n\t\t\t\tmigratedProviders: options.migratedProviders,\n\t\t\t\tmodelFallbackMessage: this.modelFallbackMessage,\n\t\t\t\tinitialMessage: options.initialMessage,\n\t\t\t\tinitialImages: options.initialImages,\n\t\t\t\tinitialMessages: options.initialMessages,\n\t\t\t\tverbose: options.verbose,\n\t\t\t});\n\t\t\tif (options.startupBenchmark) {\n\t\t\t\tawait interactiveMode.init();\n\t\t\t\ttime(\"interactiveMode.init\");\n\t\t\t\tprintTimings();\n\t\t\t\tinteractiveMode.stop();\n\t\t\t\tstopThemeWatcher();\n\t\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprintTimings();\n\t\t\tawait interactiveMode.run();\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(this, {\n\t\t\tmode: mode === \"json\" ? \"json\" : \"text\",\n\t\t\tmessages: options.initialMessages,\n\t\t\tinitialMessage: options.initialMessage,\n\t\t\tinitialImages: options.initialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t}\n\n\tcreateSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.create();\n\t}\n\n\topenSessionReference(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.openReference(reference);\n\t}\n\n\tcontinueRecentSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.continueRecent();\n\t}\n\n\tforkSessionFrom(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.forkFrom(reference);\n\t}\n\n\tasync listSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.list(onProgress);\n\t}\n\n\tasync listAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.listAll(onProgress);\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (!this._session) {\n\t\t\treturn;\n\t\t}\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"quit\",\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t\tthis._session = undefined;\n\t}\n}\n"]}
@@ -2,10 +2,18 @@
2
2
  * Resolve configuration values that may be shell commands, environment variables, or literals.
3
3
  * Used by auth-storage.ts and model-registry.ts.
4
4
  */
5
+ export declare function getConfigValueEnvVarName(config: string): string | undefined;
6
+ export declare function getConfigValueEnvVarNames(config: string): string[];
7
+ export declare function getMissingConfigValueEnvVarNames(config: string): string[];
8
+ export declare function isCommandConfigValue(config: string): boolean;
9
+ export declare function isConfigValueConfigured(config: string): boolean;
10
+ export declare function isLegacyEnvVarNameConfigValue(config: string): boolean;
5
11
  /**
6
12
  * Resolve a config value (API key, header value, etc.) to an actual value.
7
13
  * - If starts with "!", executes the rest as a shell command and uses stdout (cached)
8
- * - Otherwise checks environment variable first, then treats as literal (not cached)
14
+ * - Interpolates "$ENV_VAR" or "${ENV_VAR}" references with the named environment variable
15
+ * - In non-command values, "$$" escapes a literal "$" and "$!" escapes a literal "!"
16
+ * - Otherwise treats the value as a literal
9
17
  */
10
18
  export declare function resolveConfigValue(config: string): string | undefined;
11
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-config-value.d.ts","sourceRoot":"","sources":["../../src/core/resolve-config-value.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMrE;AAiED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAWrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAU9G;AAED,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,WAAW,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOpC;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C","sourcesContent":["/**\n * Resolve configuration values that may be shell commands, environment variables, or literals.\n * Used by auth-storage.ts and model-registry.ts.\n */\n\nimport { execSync, spawnSync } from \"child_process\";\nimport { getShellConfig } from \"../utils/shell.ts\";\n\n// Cache for shell command results (persists for process lifetime)\nconst commandResultCache = new Map<string, string | undefined>();\n\n/**\n * Resolve a config value (API key, header value, etc.) to an actual value.\n * - If starts with \"!\", executes the rest as a shell command and uses stdout (cached)\n * - Otherwise checks environment variable first, then treats as literal (not cached)\n */\nexport function resolveConfigValue(config: string): string | undefined {\n\tif (config.startsWith(\"!\")) {\n\t\treturn executeCommand(config);\n\t}\n\tconst envValue = process.env[config];\n\treturn envValue || config;\n}\n\nfunction executeWithConfiguredShell(command: string): { executed: boolean; value: string | undefined } {\n\ttry {\n\t\tconst { shell, args } = getShellConfig();\n\t\tconst result = spawnSync(shell, [...args, command], {\n\t\t\tencoding: \"utf-8\",\n\t\t\ttimeout: 10000,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\tshell: false,\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tif (result.error) {\n\t\t\tconst error = result.error as NodeJS.ErrnoException;\n\t\t\tif (error.code === \"ENOENT\") {\n\t\t\t\treturn { executed: false, value: undefined };\n\t\t\t}\n\t\t\treturn { executed: true, value: undefined };\n\t\t}\n\n\t\tif (result.status !== 0) {\n\t\t\treturn { executed: true, value: undefined };\n\t\t}\n\n\t\tconst value = (result.stdout ?? \"\").trim();\n\t\treturn { executed: true, value: value || undefined };\n\t} catch {\n\t\treturn { executed: false, value: undefined };\n\t}\n}\n\nfunction executeWithDefaultShell(command: string): string | undefined {\n\ttry {\n\t\tconst output = execSync(command, {\n\t\t\tencoding: \"utf-8\",\n\t\t\ttimeout: 10000,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t});\n\t\treturn output.trim() || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction executeCommandUncached(commandConfig: string): string | undefined {\n\tconst command = commandConfig.slice(1);\n\treturn process.platform === \"win32\"\n\t\t? (() => {\n\t\t\t\tconst configuredResult = executeWithConfiguredShell(command);\n\t\t\t\treturn configuredResult.executed ? configuredResult.value : executeWithDefaultShell(command);\n\t\t\t})()\n\t\t: executeWithDefaultShell(command);\n}\n\nfunction executeCommand(commandConfig: string): string | undefined {\n\tif (commandResultCache.has(commandConfig)) {\n\t\treturn commandResultCache.get(commandConfig);\n\t}\n\n\tconst result = executeCommandUncached(commandConfig);\n\tcommandResultCache.set(commandConfig, result);\n\treturn result;\n}\n\n/**\n * Resolve all header values using the same resolution logic as API keys.\n */\nexport function resolveConfigValueUncached(config: string): string | undefined {\n\tif (config.startsWith(\"!\")) {\n\t\treturn executeCommandUncached(config);\n\t}\n\tconst envValue = process.env[config];\n\treturn envValue || config;\n}\n\nexport function resolveConfigValueOrThrow(config: string, description: string): string {\n\tconst resolvedValue = resolveConfigValueUncached(config);\n\tif (resolvedValue !== undefined) {\n\t\treturn resolvedValue;\n\t}\n\n\tif (config.startsWith(\"!\")) {\n\t\tthrow new Error(`Failed to resolve ${description} from shell command: ${config.slice(1)}`);\n\t}\n\n\tthrow new Error(`Failed to resolve ${description}`);\n}\n\n/**\n * Resolve all header values using the same resolution logic as API keys.\n */\nexport function resolveHeaders(headers: Record<string, string> | undefined): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tconst resolvedValue = resolveConfigValue(value);\n\t\tif (resolvedValue) {\n\t\t\tresolved[key] = resolvedValue;\n\t\t}\n\t}\n\treturn Object.keys(resolved).length > 0 ? resolved : undefined;\n}\n\nexport function resolveHeadersOrThrow(\n\theaders: Record<string, string> | undefined,\n\tdescription: string,\n): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tresolved[key] = resolveConfigValueOrThrow(value, `${description} header \"${key}\"`);\n\t}\n\treturn Object.keys(resolved).length > 0 ? resolved : undefined;\n}\n\n/** Clear the config value command cache. Exported for testing. */\nexport function clearConfigValueCache(): void {\n\tcommandResultCache.clear();\n}\n"]}
1
+ {"version":3,"file":"resolve-config-value.d.ts","sourceRoot":"","sources":["../../src/core/resolve-config-value.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgHH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI3E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAGlE;AAED,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMrE;AAiED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM7E;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAsBrF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAU9G;AAED,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAC3C,WAAW,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAOpC;AAED,kEAAkE;AAClE,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C","sourcesContent":["/**\n * Resolve configuration values that may be shell commands, environment variables, or literals.\n * Used by auth-storage.ts and model-registry.ts.\n */\n\nimport { execSync, spawnSync } from \"child_process\";\nimport { getShellConfig } from \"../utils/shell.ts\";\n\n// Cache for shell command results (persists for process lifetime)\nconst commandResultCache = new Map<string, string | undefined>();\nconst ENV_VAR_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ENV_VAR_NAME_PREFIX_RE = /^[A-Za-z_][A-Za-z0-9_]*/;\nconst LEGACY_ENV_VAR_NAME_RE = /^[A-Z_][A-Z0-9_]*$/;\n\ntype TemplatePart = { type: \"literal\"; value: string } | { type: \"env\"; name: string };\n\ntype ConfigValueReference = { type: \"command\"; config: string } | { type: \"template\"; parts: TemplatePart[] };\n\nfunction appendLiteral(parts: TemplatePart[], value: string): void {\n\tif (!value) return;\n\tconst previousPart = parts[parts.length - 1];\n\tif (previousPart?.type === \"literal\") {\n\t\tpreviousPart.value += value;\n\t\treturn;\n\t}\n\tparts.push({ type: \"literal\", value });\n}\n\nfunction parseConfigValueTemplate(config: string): TemplatePart[] {\n\tconst parts: TemplatePart[] = [];\n\tlet index = 0;\n\n\twhile (index < config.length) {\n\t\tconst dollarIndex = config.indexOf(\"$\", index);\n\t\tif (dollarIndex < 0) {\n\t\t\tappendLiteral(parts, config.slice(index));\n\t\t\tbreak;\n\t\t}\n\n\t\tappendLiteral(parts, config.slice(index, dollarIndex));\n\t\tconst nextChar = config[dollarIndex + 1];\n\n\t\tif (nextChar === \"$\" || nextChar === \"!\") {\n\t\t\tappendLiteral(parts, nextChar);\n\t\t\tindex = dollarIndex + 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (nextChar === \"{\") {\n\t\t\tconst endIndex = config.indexOf(\"}\", dollarIndex + 2);\n\t\t\tif (endIndex < 0) {\n\t\t\t\tappendLiteral(parts, \"$\");\n\t\t\t\tindex = dollarIndex + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst name = config.slice(dollarIndex + 2, endIndex);\n\t\t\tif (ENV_VAR_NAME_RE.test(name)) {\n\t\t\t\tparts.push({ type: \"env\", name });\n\t\t\t} else {\n\t\t\t\tappendLiteral(parts, config.slice(dollarIndex, endIndex + 1));\n\t\t\t}\n\t\t\tindex = endIndex + 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst match = config.slice(dollarIndex + 1).match(ENV_VAR_NAME_PREFIX_RE);\n\t\tif (match) {\n\t\t\tparts.push({ type: \"env\", name: match[0] });\n\t\t\tindex = dollarIndex + 1 + match[0].length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tappendLiteral(parts, \"$\");\n\t\tindex = dollarIndex + 1;\n\t}\n\n\treturn parts;\n}\n\nfunction parseConfigValueReference(config: string): ConfigValueReference {\n\tif (config.startsWith(\"!\")) {\n\t\treturn { type: \"command\", config };\n\t}\n\n\treturn { type: \"template\", parts: parseConfigValueTemplate(config) };\n}\n\nfunction resolveEnvConfigValue(name: string): string | undefined {\n\treturn process.env[name] || undefined;\n}\n\nfunction getTemplateEnvVarNames(parts: TemplatePart[]): string[] {\n\tconst names: string[] = [];\n\tfor (const part of parts) {\n\t\tif (part.type !== \"env\" || names.includes(part.name)) continue;\n\t\tnames.push(part.name);\n\t}\n\treturn names;\n}\n\nfunction resolveTemplate(parts: TemplatePart[]): string | undefined {\n\tlet resolved = \"\";\n\tfor (const part of parts) {\n\t\tif (part.type === \"literal\") {\n\t\t\tresolved += part.value;\n\t\t\tcontinue;\n\t\t}\n\t\tconst envValue = resolveEnvConfigValue(part.name);\n\t\tif (envValue === undefined) return undefined;\n\t\tresolved += envValue;\n\t}\n\treturn resolved;\n}\n\nexport function getConfigValueEnvVarName(config: string): string | undefined {\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type !== \"template\") return undefined;\n\treturn reference.parts.length === 1 && reference.parts[0]?.type === \"env\" ? reference.parts[0].name : undefined;\n}\n\nexport function getConfigValueEnvVarNames(config: string): string[] {\n\tconst reference = parseConfigValueReference(config);\n\treturn reference.type === \"template\" ? getTemplateEnvVarNames(reference.parts) : [];\n}\n\nexport function getMissingConfigValueEnvVarNames(config: string): string[] {\n\treturn getConfigValueEnvVarNames(config).filter((name) => resolveEnvConfigValue(name) === undefined);\n}\n\nexport function isCommandConfigValue(config: string): boolean {\n\treturn parseConfigValueReference(config).type === \"command\";\n}\n\nexport function isConfigValueConfigured(config: string): boolean {\n\treturn getMissingConfigValueEnvVarNames(config).length === 0;\n}\n\nexport function isLegacyEnvVarNameConfigValue(config: string): boolean {\n\treturn LEGACY_ENV_VAR_NAME_RE.test(config);\n}\n\n/**\n * Resolve a config value (API key, header value, etc.) to an actual value.\n * - If starts with \"!\", executes the rest as a shell command and uses stdout (cached)\n * - Interpolates \"$ENV_VAR\" or \"${ENV_VAR}\" references with the named environment variable\n * - In non-command values, \"$$\" escapes a literal \"$\" and \"$!\" escapes a literal \"!\"\n * - Otherwise treats the value as a literal\n */\nexport function resolveConfigValue(config: string): string | undefined {\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type === \"command\") {\n\t\treturn executeCommand(reference.config);\n\t}\n\treturn resolveTemplate(reference.parts);\n}\n\nfunction executeWithConfiguredShell(command: string): { executed: boolean; value: string | undefined } {\n\ttry {\n\t\tconst { shell, args } = getShellConfig();\n\t\tconst result = spawnSync(shell, [...args, command], {\n\t\t\tencoding: \"utf-8\",\n\t\t\ttimeout: 10000,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t\tshell: false,\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tif (result.error) {\n\t\t\tconst error = result.error as NodeJS.ErrnoException;\n\t\t\tif (error.code === \"ENOENT\") {\n\t\t\t\treturn { executed: false, value: undefined };\n\t\t\t}\n\t\t\treturn { executed: true, value: undefined };\n\t\t}\n\n\t\tif (result.status !== 0) {\n\t\t\treturn { executed: true, value: undefined };\n\t\t}\n\n\t\tconst value = (result.stdout ?? \"\").trim();\n\t\treturn { executed: true, value: value || undefined };\n\t} catch {\n\t\treturn { executed: false, value: undefined };\n\t}\n}\n\nfunction executeWithDefaultShell(command: string): string | undefined {\n\ttry {\n\t\tconst output = execSync(command, {\n\t\t\tencoding: \"utf-8\",\n\t\t\ttimeout: 10000,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t});\n\t\treturn output.trim() || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction executeCommandUncached(commandConfig: string): string | undefined {\n\tconst command = commandConfig.slice(1);\n\treturn process.platform === \"win32\"\n\t\t? (() => {\n\t\t\t\tconst configuredResult = executeWithConfiguredShell(command);\n\t\t\t\treturn configuredResult.executed ? configuredResult.value : executeWithDefaultShell(command);\n\t\t\t})()\n\t\t: executeWithDefaultShell(command);\n}\n\nfunction executeCommand(commandConfig: string): string | undefined {\n\tif (commandResultCache.has(commandConfig)) {\n\t\treturn commandResultCache.get(commandConfig);\n\t}\n\n\tconst result = executeCommandUncached(commandConfig);\n\tcommandResultCache.set(commandConfig, result);\n\treturn result;\n}\n\n/**\n * Resolve all header values using the same resolution logic as API keys.\n */\nexport function resolveConfigValueUncached(config: string): string | undefined {\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type === \"command\") {\n\t\treturn executeCommandUncached(reference.config);\n\t}\n\treturn resolveTemplate(reference.parts);\n}\n\nexport function resolveConfigValueOrThrow(config: string, description: string): string {\n\tconst resolvedValue = resolveConfigValueUncached(config);\n\tif (resolvedValue !== undefined) {\n\t\treturn resolvedValue;\n\t}\n\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type === \"command\") {\n\t\tthrow new Error(`Failed to resolve ${description} from shell command: ${reference.config.slice(1)}`);\n\t}\n\n\tif (reference.type === \"template\") {\n\t\tconst missingEnvVars = getMissingConfigValueEnvVarNames(config);\n\t\tif (missingEnvVars.length === 1) {\n\t\t\tthrow new Error(`Failed to resolve ${description} from environment variable: ${missingEnvVars[0]}`);\n\t\t}\n\t\tif (missingEnvVars.length > 1) {\n\t\t\tthrow new Error(`Failed to resolve ${description} from environment variables: ${missingEnvVars.join(\", \")}`);\n\t\t}\n\t}\n\n\tthrow new Error(`Failed to resolve ${description}`);\n}\n\n/**\n * Resolve all header values using the same resolution logic as API keys.\n */\nexport function resolveHeaders(headers: Record<string, string> | undefined): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tconst resolvedValue = resolveConfigValue(value);\n\t\tif (resolvedValue) {\n\t\t\tresolved[key] = resolvedValue;\n\t\t}\n\t}\n\treturn Object.keys(resolved).length > 0 ? resolved : undefined;\n}\n\nexport function resolveHeadersOrThrow(\n\theaders: Record<string, string> | undefined,\n\tdescription: string,\n): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tresolved[key] = resolveConfigValueOrThrow(value, `${description} header \"${key}\"`);\n\t}\n\treturn Object.keys(resolved).length > 0 ? resolved : undefined;\n}\n\n/** Clear the config value command cache. Exported for testing. */\nexport function clearConfigValueCache(): void {\n\tcommandResultCache.clear();\n}\n"]}