@skaile/workspaces 0.20.0 → 0.22.0-beta.0

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 (212) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/{asset-feeds-JSHWTTJC.js → asset-feeds-PJDJ3QYI.js} +11 -11
  3. package/dist/{asset-feeds-JSHWTTJC.js.map → asset-feeds-PJDJ3QYI.js.map} +1 -1
  4. package/dist/asset-manager/index.js +9 -9
  5. package/dist/asset-manager/installer.js +8 -8
  6. package/dist/base-assets/connectors/deploy.js +10 -9
  7. package/dist/base-assets/connectors/devserver.js +10 -9
  8. package/dist/base-assets/connectors/flow/adapter.js +10 -9
  9. package/dist/base-assets/connectors/flow/run-flow.js +11 -10
  10. package/dist/base-assets/connectors/flow.js +10 -9
  11. package/dist/base-assets/connectors/git.js +10 -9
  12. package/dist/base-assets/connectors/gmail.js +10 -9
  13. package/dist/base-assets/connectors/googledrive.js +10 -9
  14. package/dist/base-assets/connectors/local.js +10 -9
  15. package/dist/base-assets/connectors/mattermost.js +10 -9
  16. package/dist/base-assets/connectors/memory.js +10 -9
  17. package/dist/base-assets/connectors/minio.js +10 -9
  18. package/dist/base-assets/connectors/postgres.js +10 -9
  19. package/dist/base-assets/connectors/s3.js +10 -9
  20. package/dist/base-assets/connectors/sharepoint.js +10 -9
  21. package/dist/base-assets/connectors/sqlite.js +10 -9
  22. package/dist/base-assets/connectors/static-server.js +10 -9
  23. package/dist/base-assets/connectors/tunnel.js +10 -9
  24. package/dist/base-assets/connectors/webdav.js +10 -9
  25. package/dist/base-assets/connectors/xstate-store.js +10 -9
  26. package/dist/base-assets/connectors/xstate.js +10 -9
  27. package/dist/bridge/drivers/claude-sdk.js +13 -3
  28. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  29. package/dist/bridge/drivers/codex.js +13 -3
  30. package/dist/bridge/drivers/codex.js.map +1 -1
  31. package/dist/bridge/drivers/echo.js +13 -4
  32. package/dist/bridge/drivers/echo.js.map +1 -1
  33. package/dist/bridge/drivers/omp.js +13 -3
  34. package/dist/bridge/drivers/omp.js.map +1 -1
  35. package/dist/bridge/index.js +3 -2
  36. package/dist/bridge/src/drivers/claude-sdk.d.ts +7 -0
  37. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  38. package/dist/bridge/src/drivers/codex.d.ts +7 -0
  39. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  40. package/dist/bridge/src/drivers/echo.d.ts +6 -0
  41. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  42. package/dist/bridge/src/drivers/omp.d.ts +6 -0
  43. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  44. package/dist/bridge/src/registry.d.ts +32 -34
  45. package/dist/bridge/src/registry.d.ts.map +1 -1
  46. package/dist/{chunk-4YG2AAFV.js → chunk-2DNSSQ22.js} +7 -7
  47. package/dist/{chunk-4YG2AAFV.js.map → chunk-2DNSSQ22.js.map} +1 -1
  48. package/dist/{chunk-ZWIG55ZX.js → chunk-2XY6732A.js} +3 -3
  49. package/dist/{chunk-ZWIG55ZX.js.map → chunk-2XY6732A.js.map} +1 -1
  50. package/dist/{chunk-2DKWQLFS.js → chunk-CSDQBWE6.js} +5 -5
  51. package/dist/{chunk-2DKWQLFS.js.map → chunk-CSDQBWE6.js.map} +1 -1
  52. package/dist/{chunk-KYYMP5PT.js → chunk-F3MGZ5E6.js} +3 -3
  53. package/dist/{chunk-KYYMP5PT.js.map → chunk-F3MGZ5E6.js.map} +1 -1
  54. package/dist/{chunk-IQYWI5OG.js → chunk-G6GKWGOW.js} +114 -619
  55. package/dist/chunk-G6GKWGOW.js.map +1 -0
  56. package/dist/{chunk-LMDRMZ4F.js → chunk-GKM6MDUC.js} +3 -3
  57. package/dist/{chunk-LMDRMZ4F.js.map → chunk-GKM6MDUC.js.map} +1 -1
  58. package/dist/{chunk-4ACWI5YT.js → chunk-IGQEXBBG.js} +44 -36
  59. package/dist/chunk-IGQEXBBG.js.map +1 -0
  60. package/dist/{chunk-BZGDESAG.js → chunk-J2FCO6TM.js} +2 -2
  61. package/dist/{chunk-BZGDESAG.js.map → chunk-J2FCO6TM.js.map} +1 -1
  62. package/dist/{chunk-BSY56QS7.js → chunk-KA46DUM4.js} +3 -3
  63. package/dist/{chunk-BSY56QS7.js.map → chunk-KA46DUM4.js.map} +1 -1
  64. package/dist/{chunk-RCPFXP3Y.js → chunk-MO4JPTRD.js} +4 -4
  65. package/dist/{chunk-RCPFXP3Y.js.map → chunk-MO4JPTRD.js.map} +1 -1
  66. package/dist/{chunk-FNP4OGGY.js → chunk-NGC7ZQI4.js} +10 -10
  67. package/dist/{chunk-FNP4OGGY.js.map → chunk-NGC7ZQI4.js.map} +1 -1
  68. package/dist/{chunk-2ACJB6JF.js → chunk-RENHNO4J.js} +81 -4
  69. package/dist/chunk-RENHNO4J.js.map +1 -0
  70. package/dist/{chunk-4S4TZDCD.js → chunk-SL6JVGRD.js} +3 -3
  71. package/dist/{chunk-4S4TZDCD.js.map → chunk-SL6JVGRD.js.map} +1 -1
  72. package/dist/{chunk-VVS7MACX.js → chunk-TKOLD2O7.js} +213 -20
  73. package/dist/chunk-TKOLD2O7.js.map +1 -0
  74. package/dist/{chunk-R4FRSB47.js → chunk-TTY56FQQ.js} +4 -4
  75. package/dist/{chunk-R4FRSB47.js.map → chunk-TTY56FQQ.js.map} +1 -1
  76. package/dist/chunk-UZRY5UI2.js +96 -0
  77. package/dist/chunk-UZRY5UI2.js.map +1 -0
  78. package/dist/{chunk-NCUTHLRV.js → chunk-UZVHJ7LX.js} +4 -4
  79. package/dist/{chunk-NCUTHLRV.js.map → chunk-UZVHJ7LX.js.map} +1 -1
  80. package/dist/{chunk-FRPKLIEZ.js → chunk-WIR34WMU.js} +3 -3
  81. package/dist/{chunk-FRPKLIEZ.js.map → chunk-WIR34WMU.js.map} +1 -1
  82. package/dist/{chunk-37JKX6D7.js → chunk-X5Y4EGZB.js} +2 -2
  83. package/dist/{chunk-37JKX6D7.js.map → chunk-X5Y4EGZB.js.map} +1 -1
  84. package/dist/{chunk-S2OVTCAL.js → chunk-XHFMUGDD.js} +3 -3
  85. package/dist/{chunk-S2OVTCAL.js.map → chunk-XHFMUGDD.js.map} +1 -1
  86. package/dist/cli/index.js +701 -413
  87. package/dist/cli/index.js.map +1 -1
  88. package/dist/cli/src/commands/deploy.d.ts +24 -0
  89. package/dist/cli/src/commands/deploy.d.ts.map +1 -0
  90. package/dist/cli/src/commands/integration.d.ts +19 -0
  91. package/dist/cli/src/commands/integration.d.ts.map +1 -0
  92. package/dist/cli/src/commands/plugin-registry-cmd.d.ts +22 -0
  93. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -0
  94. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  95. package/dist/cli/src/plugin-store/index.d.ts +37 -0
  96. package/dist/cli/src/plugin-store/index.d.ts.map +1 -0
  97. package/dist/cli/src/plugin-store/load.d.ts +35 -0
  98. package/dist/cli/src/plugin-store/load.d.ts.map +1 -0
  99. package/dist/cli/src/plugin-store/paths.d.ts +23 -0
  100. package/dist/cli/src/plugin-store/paths.d.ts.map +1 -0
  101. package/dist/cli/src/plugin-store/reconcile.d.ts +50 -0
  102. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -0
  103. package/dist/cli/src/plugin-store/spec.d.ts +25 -0
  104. package/dist/cli/src/plugin-store/spec.d.ts.map +1 -0
  105. package/dist/connectors/config.js +8 -8
  106. package/dist/connectors/index.js +10 -9
  107. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  108. package/dist/connectors/src/connector-registry.d.ts +42 -22
  109. package/dist/connectors/src/connector-registry.d.ts.map +1 -1
  110. package/dist/connectors/src/index.d.ts +2 -3
  111. package/dist/connectors/src/index.d.ts.map +1 -1
  112. package/dist/connectors-shared/index.js +8 -0
  113. package/dist/connectors-shared/index.js.map +1 -0
  114. package/dist/connectors-shared/src/index.d.ts +11 -0
  115. package/dist/connectors-shared/src/index.d.ts.map +1 -0
  116. package/dist/connectors-shared/src/schemas.d.ts +10 -0
  117. package/dist/connectors-shared/src/schemas.d.ts.map +1 -0
  118. package/dist/connectors-shared/src/types.d.ts +11 -0
  119. package/dist/connectors-shared/src/types.d.ts.map +1 -0
  120. package/dist/core/index.js +7 -7
  121. package/dist/core/manifest.js +2 -2
  122. package/dist/core/models.js +1 -1
  123. package/dist/core/runtime-assets.js +4 -4
  124. package/dist/core/src/index.d.ts +4 -4
  125. package/dist/core/src/index.d.ts.map +1 -1
  126. package/dist/core/src/lock.d.ts +20 -1
  127. package/dist/core/src/lock.d.ts.map +1 -1
  128. package/dist/core/src/models.d.ts +13 -0
  129. package/dist/core/src/models.d.ts.map +1 -1
  130. package/dist/core/src/workspace-config.d.ts +68 -3
  131. package/dist/core/src/workspace-config.d.ts.map +1 -1
  132. package/dist/core/src/workspace-yaml-editor.d.ts +20 -0
  133. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  134. package/dist/core/workspace-config.js +3 -3
  135. package/dist/deploy/index.js +454 -0
  136. package/dist/deploy/index.js.map +1 -0
  137. package/dist/deploy/src/handle-store.d.ts +22 -0
  138. package/dist/deploy/src/handle-store.d.ts.map +1 -0
  139. package/dist/deploy/src/index.d.ts +21 -0
  140. package/dist/deploy/src/index.d.ts.map +1 -0
  141. package/dist/deploy/src/targets/container-runtime.d.ts +38 -0
  142. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -0
  143. package/dist/deploy/src/targets/docker.d.ts +18 -0
  144. package/dist/deploy/src/targets/docker.d.ts.map +1 -0
  145. package/dist/deploy/src/targets/local.d.ts +30 -0
  146. package/dist/deploy/src/targets/local.d.ts.map +1 -0
  147. package/dist/deploy/src/targets/podman.d.ts +18 -0
  148. package/dist/deploy/src/targets/podman.d.ts.map +1 -0
  149. package/dist/deploy/src/targets/port.d.ts +10 -0
  150. package/dist/deploy/src/targets/port.d.ts.map +1 -0
  151. package/dist/deploy/src/targets/stream-lines.d.ts +44 -0
  152. package/dist/deploy/src/targets/stream-lines.d.ts.map +1 -0
  153. package/dist/discovery/index.js +3 -3
  154. package/dist/{ensure-sources-LRT3TIWI.js → ensure-sources-COGVKY44.js} +11 -11
  155. package/dist/{ensure-sources-LRT3TIWI.js.map → ensure-sources-COGVKY44.js.map} +1 -1
  156. package/dist/{flows-6BNO4GKK.js → flows-DYFTPCPM.js} +4 -4
  157. package/dist/{flows-6BNO4GKK.js.map → flows-DYFTPCPM.js.map} +1 -1
  158. package/dist/library/index.js +4 -4
  159. package/dist/open-library-DWAQFUSQ.js +13 -0
  160. package/dist/{open-library-IOYWFK7M.js.map → open-library-DWAQFUSQ.js.map} +1 -1
  161. package/dist/plugin-registry/index.js +4 -0
  162. package/dist/plugin-registry/index.js.map +1 -0
  163. package/dist/plugin-registry/src/context.d.ts +29 -0
  164. package/dist/plugin-registry/src/context.d.ts.map +1 -0
  165. package/dist/plugin-registry/src/deploy-handle.d.ts +60 -0
  166. package/dist/plugin-registry/src/deploy-handle.d.ts.map +1 -0
  167. package/dist/plugin-registry/src/errors.d.ts +23 -0
  168. package/dist/plugin-registry/src/errors.d.ts.map +1 -0
  169. package/dist/plugin-registry/src/index.d.ts +16 -0
  170. package/dist/plugin-registry/src/index.d.ts.map +1 -0
  171. package/dist/plugin-registry/src/internal.d.ts +13 -0
  172. package/dist/plugin-registry/src/internal.d.ts.map +1 -0
  173. package/dist/plugin-registry/src/registry.d.ts +25 -0
  174. package/dist/plugin-registry/src/registry.d.ts.map +1 -0
  175. package/dist/plugin-registry/src/targets.d.ts +42 -0
  176. package/dist/plugin-registry/src/targets.d.ts.map +1 -0
  177. package/dist/plugin-store-6OENKNFW.js +144 -0
  178. package/dist/plugin-store-6OENKNFW.js.map +1 -0
  179. package/dist/runner/index.js +14 -13
  180. package/dist/sdk/asset-manager.js +9 -9
  181. package/dist/sdk/bridge.js +3 -2
  182. package/dist/sdk/core.js +7 -7
  183. package/dist/sdk/index.js +15 -14
  184. package/dist/sdk/index.js.map +1 -1
  185. package/dist/sdk/runner.js +14 -13
  186. package/dist/{setup-CJWJWYEO.js → setup-ACMP3QZC.js} +12 -11
  187. package/dist/setup-ACMP3QZC.js.map +1 -0
  188. package/dist/store-client-ZSLNOOQG.js +14 -0
  189. package/dist/{store-client-H6BTDCA4.js.map → store-client-ZSLNOOQG.js.map} +1 -1
  190. package/dist/tui/index.js +14 -13
  191. package/dist/tui/index.js.map +1 -1
  192. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  193. package/dist/workspace-plugin/adapters/omp.js +3 -3
  194. package/dist/workspace-plugin/index.js +1 -1
  195. package/package.json +20 -23
  196. package/dist/base-assets/connectors/redis/adapter.d.ts +0 -39
  197. package/dist/base-assets/connectors/redis/adapter.d.ts.map +0 -1
  198. package/dist/base-assets/connectors/redis.js +0 -20
  199. package/dist/base-assets/connectors/redis.js.map +0 -1
  200. package/dist/base-assets/connectors/yjs/adapter.d.ts +0 -50
  201. package/dist/base-assets/connectors/yjs/adapter.d.ts.map +0 -1
  202. package/dist/base-assets/connectors/yjs.js +0 -20
  203. package/dist/base-assets/connectors/yjs.js.map +0 -1
  204. package/dist/chunk-2ACJB6JF.js.map +0 -1
  205. package/dist/chunk-4ACWI5YT.js.map +0 -1
  206. package/dist/chunk-IQYWI5OG.js.map +0 -1
  207. package/dist/chunk-VVS7MACX.js.map +0 -1
  208. package/dist/cli/src/commands/plugin.d.ts +0 -14
  209. package/dist/cli/src/commands/plugin.d.ts.map +0 -1
  210. package/dist/open-library-IOYWFK7M.js +0 -13
  211. package/dist/setup-CJWJWYEO.js.map +0 -1
  212. package/dist/store-client-H6BTDCA4.js +0 -14
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/drivers/codex.ts"],"names":[],"mappings":"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","file":"codex.js","sourcesContent":["import type {\n AgentMessageItem,\n Codex as CodexClient,\n CommandExecutionItem,\n FileChangeItem,\n McpToolCallItem,\n Thread,\n ThreadEvent,\n ThreadItem,\n WebSearchItem,\n} from \"@openai/codex-sdk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, type ModelEntry } from \"../models.js\";\nimport { DRIVER_CATALOG, registerDriver } from \"../registry.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type DriverInfo,\n} from \"../types.js\";\n\ntype CodexSdkModule = typeof import(\"@openai/codex-sdk\");\n\n/**\n * Build the explicit env whitelist forwarded to the Codex SDK child.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment.\n *\n * @docLink packages/bridge/concepts#codex-env-whitelist\n */\nfunction buildCodexChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"HOSTNAME\",\n \"SKAILE_SESSION_ID\",\n ];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (key.startsWith(\"PI_\") && typeof value === \"string\") out[key] = value;\n }\n return out;\n}\n\n/**\n * Agent driver for the OpenAI Codex SDK.\n *\n * Creates or resumes a Codex thread via `@openai/codex-sdk` (lazy-imported in `start()`)\n * and maps Codex SDK thread events to the unified {@link AgentEvent} stream.\n * OpenAI models only — uses `OPENAI_API_KEY` from `apiKeys`, `env`, or the environment.\n *\n * @remarks\n * **Event mapping** — Codex SDK items are translated: `agent_message` → `message_start/update/end`,\n * `command_execution` → Bash-shaped tool events, `mcp_tool_call` → MCP tool events,\n * `file_change` → `ApplyPatch`-shaped events, `web_search` → `WebSearch` events.\n *\n * **Sandbox** — The Codex sandbox mode, approval policy, and reasoning effort are\n * controlled via `AgentConfig.driverOptions.codex`. See {@link CodexDriverOptions}.\n *\n * **Instructions file** — System prompt and pre-rendered agent identity are combined\n * into a single instructions file written to `<cwd>/.codex/skaile-session-instructions.md`\n * and passed to the Codex SDK as `model_instructions_file`.\n *\n * @docLink packages/bridge/drivers#codex-driver\n */\nexport class CodexDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"codex\");\n private config: AgentConfig;\n private thread: Thread | null = null;\n private running = false;\n private abortController: AbortController | null = null;\n private pendingToolResults: AgentMessage[] = [];\n private activeAssistantItemId: string | null = null;\n private activeAssistantText = \"\";\n private _runtimeSessionId: string | undefined;\n /** Token usage from the most recent completed turn. */\n private _lastTokens: TokenUsage | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n override get runtimeSessionId(): string | undefined {\n return this._runtimeSessionId;\n }\n\n public async start(): Promise<void> {\n if (this.thread) return;\n\n let sdk: CodexSdkModule;\n try {\n sdk = await import(\"@openai/codex-sdk\");\n } catch (err) {\n this.log.error(\"codex SDK load failed\", err);\n throw new Error(\"Codex SDK not installed. Run: bun add @openai/codex-sdk\");\n }\n\n // Explicit env whitelist for the Codex SDK child. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned process. `this.config.env`, when\n // supplied, fully overrides the whitelist.\n const env: Record<string, string | undefined> = this.config.env\n ? { ...this.config.env }\n : buildCodexChildEnv(process.env);\n\n const instructionsFile = this.writeInstructionsFile();\n\n const client = new sdk.Codex({\n apiKey:\n this.config.apiKeys?.openai ??\n this.config.env?.OPENAI_API_KEY ??\n process.env.OPENAI_API_KEY,\n env: Object.fromEntries(Object.entries(env).filter(([, value]) => value != null)) as Record<\n string,\n string\n >,\n ...(instructionsFile ? { config: { model_instructions_file: instructionsFile } } : {}),\n });\n\n const codexOptions = this.config.driverOptions?.codex;\n const threadOptions = {\n model: this.config.model,\n sandboxMode: codexOptions?.sandboxMode ?? \"workspace-write\",\n workingDirectory: this.config.cwd,\n skipGitRepoCheck: true,\n modelReasoningEffort: codexOptions?.reasoningEffort ?? \"medium\",\n networkAccessEnabled: codexOptions?.networkAccessEnabled,\n approvalPolicy: codexOptions?.approvalPolicy ?? \"never\",\n additionalDirectories: codexOptions?.additionalDirectories,\n } satisfies Parameters<CodexClient[\"startThread\"]>[0];\n\n this.thread = this.config.resumeSessionId\n ? client.resumeThread(this.config.resumeSessionId, threadOptions)\n : client.startThread(threadOptions);\n this._runtimeSessionId = this.thread.id ?? this.config.resumeSessionId;\n this.log.info(\"codex driver started\", {\n model: this.config.model,\n resumed: Boolean(this.config.resumeSessionId),\n sessionId: this._runtimeSessionId,\n });\n }\n\n public async prompt(message: string): Promise<void> {\n await this.start();\n if (!this.thread) throw new Error(\"Codex thread not initialized\");\n if (this.running) throw new Error(\"Codex turn already in progress\");\n\n this.running = true;\n this.pendingToolResults = [];\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this._lastTokens = null;\n this.abortController = new AbortController();\n let turnFinished = false;\n this.log.debug(\"prompt issued\", { length: message.length });\n\n try {\n const input = message;\n const { events } = await this.thread.runStreamed(input, {\n signal: this.abortController.signal,\n });\n\n for await (const event of events) {\n turnFinished = this.handleThreadEvent(event) || turnFinished;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (error.name !== \"AbortError\") {\n this.log.error(\"prompt failed\", error);\n const detail = this.classifyErrorMessage(error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n }\n } finally {\n if (!turnFinished && this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this.abortController = null;\n this.running = false;\n }\n }\n\n public async abort(): Promise<void> {\n this.abortController?.abort();\n }\n\n public get isRunning(): boolean {\n return this.running;\n }\n\n public kill(): void {\n this.abortController?.abort();\n this.running = false;\n this.abortController = null;\n this.log.info(\"codex driver killed\");\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n const apiKey =\n this.config.apiKeys?.openai || this.config.env?.OPENAI_API_KEY || process.env.OPENAI_API_KEY;\n if (!apiKey) return [];\n const result = await fetchProviderModels(\"openai\", apiKey);\n return result.ok ? (result.models as ModelEntry[]) : [];\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n this.thread = null;\n this._runtimeSessionId = undefined;\n this._lastTokens = null;\n }\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n /**\n * Write a combined instructions file for Codex CLI's `model_instructions_file` config.\n * Combines pre-rendered agent identity (from `skaile install`) with runtime context\n * (resources, environment, prompt-extensions).\n */\n private writeInstructionsFile(): string | undefined {\n const parts: string[] = [];\n\n // 1. Read pre-rendered agent identity if available\n if (this.config.agentDir) {\n const agentFile = join(this.config.cwd, \".codex\", \"skaile-agent.md\");\n if (existsSync(agentFile)) {\n parts.push(readFileSync(agentFile, \"utf-8\"));\n }\n }\n\n // 2. Append runtime system prompt (resources, context, environment)\n if (this.config.systemPrompt) {\n parts.push(this.config.systemPrompt);\n }\n\n if (parts.length === 0) return undefined;\n\n // Write combined instructions to a session file\n const instrFile = join(this.config.cwd, \".codex\", \"skaile-session-instructions.md\");\n mkdirSync(dirname(instrFile), { recursive: true });\n writeFileSync(instrFile, parts.join(\"\\n\\n---\\n\\n\"));\n return instrFile;\n }\n\n private handleThreadEvent(event: ThreadEvent): boolean {\n switch (event.type) {\n case \"thread.started\":\n this._runtimeSessionId = event.thread_id;\n return false;\n\n case \"turn.started\":\n return false;\n\n case \"item.started\":\n case \"item.updated\":\n case \"item.completed\":\n this.handleThreadItem(event.item, event.type === \"item.completed\", event.type);\n return false;\n\n case \"turn.completed\": {\n this.flushToolResults();\n // Map Codex SDK `Usage` shape into the unified `TokenUsage`. Note\n // OpenAI's `input_tokens` is the TOTAL including cached reads, not\n // the fresh-prompt count Anthropic reports — consumers that want\n // a strict \"fresh input\" figure must subtract `cacheReadTokens`.\n const usage = event.usage;\n const tokens: TokenUsage | null = usage\n ? {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadTokens: usage.cached_input_tokens,\n }\n : null;\n this._lastTokens = tokens;\n this.emit(\"agent-event\", {\n type: \"result\",\n subtype: \"success\",\n summary: this.activeAssistantText || \"Task completed\",\n // Codex SDK does not report per-turn cost. `0` signals \"not\n // reported\" — pair with `tokens` to disambiguate from \"free\".\n costUsd: 0,\n ...(tokens ? { tokens } : {}),\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"turn.failed\": {\n this.flushToolResults();\n const detail = this.classifyErrorMessage(event.error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"error\": {\n const detail = this.classifyErrorMessage(event.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n }\n }\n\n private handleThreadItem(item: ThreadItem, completed: boolean, phase: ThreadEvent[\"type\"]): void {\n switch (item.type) {\n case \"agent_message\":\n this.handleAgentMessage(item, completed);\n break;\n\n case \"command_execution\":\n this.handleCommandExecution(item, completed, phase);\n break;\n\n case \"mcp_tool_call\":\n this.handleMcpToolCall(item, completed, phase);\n break;\n\n case \"file_change\":\n this.handleFileChange(item, completed, phase);\n break;\n\n case \"web_search\":\n this.handleWebSearch(item, completed, phase);\n break;\n\n case \"error\":\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"CodexError\",\n content: \"\",\n data: { message: item.message },\n isError: true,\n });\n }\n break;\n\n default:\n break;\n }\n }\n\n private handleAgentMessage(item: AgentMessageItem, completed: boolean): void {\n if (this.activeAssistantItemId !== item.id) {\n if (this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = item.id;\n this.activeAssistantText = \"\";\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: this.buildAssistantMessage(\"\"),\n } satisfies AgentEvent);\n }\n\n const nextText = item.text ?? \"\";\n const delta = nextText.startsWith(this.activeAssistantText)\n ? nextText.slice(this.activeAssistantText.length)\n : nextText;\n this.activeAssistantText = nextText;\n\n if (delta) {\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: this.buildAssistantMessage(nextText),\n _textDelta: delta,\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(nextText),\n } satisfies AgentEvent);\n this.activeAssistantItemId = null;\n }\n }\n\n private handleCommandExecution(\n item: CommandExecutionItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"Bash\",\n tool: { name: \"Bash\" },\n input: { command: item.command },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"Bash\",\n content: \"\",\n data: {\n stdout: item.aggregated_output,\n stderr: \"\",\n exitCode: item.exit_code,\n status: item.status,\n command: item.command,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"Bash\",\n } satisfies AgentEvent);\n }\n }\n\n private handleMcpToolCall(\n item: McpToolCallItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n const toolName = `mcp__${item.server}__${item.tool}`;\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: toolName,\n tool: { name: toolName },\n input: this.toObject(item.arguments),\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName,\n content: \"\",\n data: {\n status: item.status,\n content: item.result?.content,\n structuredContent: item.result?.structured_content,\n error: item.error?.message,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName,\n } satisfies AgentEvent);\n }\n }\n\n private handleFileChange(\n item: FileChangeItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"ApplyPatch\",\n tool: { name: \"ApplyPatch\" },\n input: { changes: item.changes },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"ApplyPatch\",\n content: \"\",\n data: { status: item.status, changes: item.changes },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"ApplyPatch\",\n } satisfies AgentEvent);\n }\n }\n\n private handleWebSearch(\n item: WebSearchItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"WebSearch\",\n tool: { name: \"WebSearch\" },\n input: { query: item.query },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"WebSearch\",\n content: \"\",\n data: { query: item.query, status: \"completed\" },\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"WebSearch\",\n } satisfies AgentEvent);\n }\n }\n\n private flushToolResults(): void {\n if (this.pendingToolResults.length === 0) return;\n this.emit(\"agent-event\", {\n type: \"turn_end\",\n toolResults: [...this.pendingToolResults],\n } satisfies AgentEvent);\n this.pendingToolResults = [];\n }\n\n private buildAssistantMessage(text: string): AgentMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n };\n }\n\n private toObject(value: unknown): Record<string, unknown> {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { arguments: value };\n }\n\n private classifyErrorMessage(message: string): AgentError {\n const lower = message.toLowerCase();\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"401\")\n ) {\n return {\n message,\n category: \"auth\",\n retryable: false,\n hint: \"Check your OpenAI API key configuration in settings or environment.\",\n };\n }\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"429\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"quota\")\n ) {\n return {\n message,\n category: \"rate_limit\",\n retryable: true,\n hint: \"Codex hit an OpenAI rate limit. Wait briefly and try again.\",\n };\n }\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"does not exist\") ||\n lower.includes(\"not available\"))\n ) {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The selected Codex model is unavailable. Choose a different model.\",\n };\n }\n if (\n lower.includes(\"network\") ||\n lower.includes(\"timeout\") ||\n lower.includes(\"connection\") ||\n lower.includes(\"fetch\")\n ) {\n return {\n message,\n category: \"network\",\n retryable: true,\n hint: \"A network error occurred while talking to Codex.\",\n };\n }\n if (\n lower.includes(\"sandbox\") ||\n lower.includes(\"approval\") ||\n lower.includes(\"permission\") ||\n lower.includes(\"git repo\")\n ) {\n return {\n message,\n category: \"config\",\n retryable: false,\n hint: \"Check Codex sandbox, approval, and workspace configuration.\",\n };\n }\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: \"An unexpected Codex error occurred. Try the prompt again.\",\n };\n }\n}\n\nregisterDriver(\"codex\", (config) => new CodexDriver(config), DRIVER_CATALOG.codex);\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/drivers/codex.ts"],"names":[],"mappings":"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","file":"codex.js","sourcesContent":["import type {\n AgentMessageItem,\n Codex as CodexClient,\n CommandExecutionItem,\n FileChangeItem,\n McpToolCallItem,\n Thread,\n ThreadEvent,\n ThreadItem,\n WebSearchItem,\n} from \"@openai/codex-sdk\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger, TokenUsage } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, type ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport {\n type AgentConfig,\n AgentDriver,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type DriverInfo,\n} from \"../types.js\";\n\ntype CodexSdkModule = typeof import(\"@openai/codex-sdk\");\n\n/**\n * Build the explicit env whitelist forwarded to the Codex SDK child.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment.\n *\n * @docLink packages/bridge/concepts#codex-env-whitelist\n */\nfunction buildCodexChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\n \"OPENAI_API_KEY\",\n \"ANTHROPIC_API_KEY\",\n \"PATH\",\n \"HOME\",\n \"USER\",\n \"HOSTNAME\",\n \"SKAILE_SESSION_ID\",\n ];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (key.startsWith(\"PI_\") && typeof value === \"string\") out[key] = value;\n }\n return out;\n}\n\n/**\n * Agent driver for the OpenAI Codex SDK.\n *\n * Creates or resumes a Codex thread via `@openai/codex-sdk` (lazy-imported in `start()`)\n * and maps Codex SDK thread events to the unified {@link AgentEvent} stream.\n * OpenAI models only — uses `OPENAI_API_KEY` from `apiKeys`, `env`, or the environment.\n *\n * @remarks\n * **Event mapping** — Codex SDK items are translated: `agent_message` → `message_start/update/end`,\n * `command_execution` → Bash-shaped tool events, `mcp_tool_call` → MCP tool events,\n * `file_change` → `ApplyPatch`-shaped events, `web_search` → `WebSearch` events.\n *\n * **Sandbox** — The Codex sandbox mode, approval policy, and reasoning effort are\n * controlled via `AgentConfig.driverOptions.codex`. See {@link CodexDriverOptions}.\n *\n * **Instructions file** — System prompt and pre-rendered agent identity are combined\n * into a single instructions file written to `<cwd>/.codex/skaile-session-instructions.md`\n * and passed to the Codex SDK as `model_instructions_file`.\n *\n * @docLink packages/bridge/drivers#codex-driver\n */\nexport class CodexDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"codex\",\n name: \"OpenAI Codex\",\n modelAgnostic: false,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"codex\");\n private config: AgentConfig;\n private thread: Thread | null = null;\n private running = false;\n private abortController: AbortController | null = null;\n private pendingToolResults: AgentMessage[] = [];\n private activeAssistantItemId: string | null = null;\n private activeAssistantText = \"\";\n private _runtimeSessionId: string | undefined;\n /** Token usage from the most recent completed turn. */\n private _lastTokens: TokenUsage | null = null;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n override get runtimeSessionId(): string | undefined {\n return this._runtimeSessionId;\n }\n\n public async start(): Promise<void> {\n if (this.thread) return;\n\n let sdk: CodexSdkModule;\n try {\n sdk = await import(\"@openai/codex-sdk\");\n } catch (err) {\n this.log.error(\"codex SDK load failed\", err);\n throw new Error(\"Codex SDK not installed. Run: bun add @openai/codex-sdk\");\n }\n\n // Explicit env whitelist for the Codex SDK child. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned process. `this.config.env`, when\n // supplied, fully overrides the whitelist.\n const env: Record<string, string | undefined> = this.config.env\n ? { ...this.config.env }\n : buildCodexChildEnv(process.env);\n\n const instructionsFile = this.writeInstructionsFile();\n\n const client = new sdk.Codex({\n apiKey:\n this.config.apiKeys?.openai ??\n this.config.env?.OPENAI_API_KEY ??\n process.env.OPENAI_API_KEY,\n env: Object.fromEntries(Object.entries(env).filter(([, value]) => value != null)) as Record<\n string,\n string\n >,\n ...(instructionsFile ? { config: { model_instructions_file: instructionsFile } } : {}),\n });\n\n const codexOptions = this.config.driverOptions?.codex;\n const threadOptions = {\n model: this.config.model,\n sandboxMode: codexOptions?.sandboxMode ?? \"workspace-write\",\n workingDirectory: this.config.cwd,\n skipGitRepoCheck: true,\n modelReasoningEffort: codexOptions?.reasoningEffort ?? \"medium\",\n networkAccessEnabled: codexOptions?.networkAccessEnabled,\n approvalPolicy: codexOptions?.approvalPolicy ?? \"never\",\n additionalDirectories: codexOptions?.additionalDirectories,\n } satisfies Parameters<CodexClient[\"startThread\"]>[0];\n\n this.thread = this.config.resumeSessionId\n ? client.resumeThread(this.config.resumeSessionId, threadOptions)\n : client.startThread(threadOptions);\n this._runtimeSessionId = this.thread.id ?? this.config.resumeSessionId;\n this.log.info(\"codex driver started\", {\n model: this.config.model,\n resumed: Boolean(this.config.resumeSessionId),\n sessionId: this._runtimeSessionId,\n });\n }\n\n public async prompt(message: string): Promise<void> {\n await this.start();\n if (!this.thread) throw new Error(\"Codex thread not initialized\");\n if (this.running) throw new Error(\"Codex turn already in progress\");\n\n this.running = true;\n this.pendingToolResults = [];\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this._lastTokens = null;\n this.abortController = new AbortController();\n let turnFinished = false;\n this.log.debug(\"prompt issued\", { length: message.length });\n\n try {\n const input = message;\n const { events } = await this.thread.runStreamed(input, {\n signal: this.abortController.signal,\n });\n\n for await (const event of events) {\n turnFinished = this.handleThreadEvent(event) || turnFinished;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n if (error.name !== \"AbortError\") {\n this.log.error(\"prompt failed\", error);\n const detail = this.classifyErrorMessage(error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n }\n } finally {\n if (!turnFinished && this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = null;\n this.activeAssistantText = \"\";\n this.abortController = null;\n this.running = false;\n }\n }\n\n public async abort(): Promise<void> {\n this.abortController?.abort();\n }\n\n public get isRunning(): boolean {\n return this.running;\n }\n\n public kill(): void {\n this.abortController?.abort();\n this.running = false;\n this.abortController = null;\n this.log.info(\"codex driver killed\");\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n const apiKey =\n this.config.apiKeys?.openai || this.config.env?.OPENAI_API_KEY || process.env.OPENAI_API_KEY;\n if (!apiKey) return [];\n const result = await fetchProviderModels(\"openai\", apiKey);\n return result.ok ? (result.models as ModelEntry[]) : [];\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n this.thread = null;\n this._runtimeSessionId = undefined;\n this._lastTokens = null;\n }\n\n override getTokenUsage(): TokenUsage | null {\n return this._lastTokens;\n }\n\n /**\n * Write a combined instructions file for Codex CLI's `model_instructions_file` config.\n * Combines pre-rendered agent identity (from `skaile install`) with runtime context\n * (resources, environment, prompt-extensions).\n */\n private writeInstructionsFile(): string | undefined {\n const parts: string[] = [];\n\n // 1. Read pre-rendered agent identity if available\n if (this.config.agentDir) {\n const agentFile = join(this.config.cwd, \".codex\", \"skaile-agent.md\");\n if (existsSync(agentFile)) {\n parts.push(readFileSync(agentFile, \"utf-8\"));\n }\n }\n\n // 2. Append runtime system prompt (resources, context, environment)\n if (this.config.systemPrompt) {\n parts.push(this.config.systemPrompt);\n }\n\n if (parts.length === 0) return undefined;\n\n // Write combined instructions to a session file\n const instrFile = join(this.config.cwd, \".codex\", \"skaile-session-instructions.md\");\n mkdirSync(dirname(instrFile), { recursive: true });\n writeFileSync(instrFile, parts.join(\"\\n\\n---\\n\\n\"));\n return instrFile;\n }\n\n private handleThreadEvent(event: ThreadEvent): boolean {\n switch (event.type) {\n case \"thread.started\":\n this._runtimeSessionId = event.thread_id;\n return false;\n\n case \"turn.started\":\n return false;\n\n case \"item.started\":\n case \"item.updated\":\n case \"item.completed\":\n this.handleThreadItem(event.item, event.type === \"item.completed\", event.type);\n return false;\n\n case \"turn.completed\": {\n this.flushToolResults();\n // Map Codex SDK `Usage` shape into the unified `TokenUsage`. Note\n // OpenAI's `input_tokens` is the TOTAL including cached reads, not\n // the fresh-prompt count Anthropic reports — consumers that want\n // a strict \"fresh input\" figure must subtract `cacheReadTokens`.\n const usage = event.usage;\n const tokens: TokenUsage | null = usage\n ? {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n cacheReadTokens: usage.cached_input_tokens,\n }\n : null;\n this._lastTokens = tokens;\n this.emit(\"agent-event\", {\n type: \"result\",\n subtype: \"success\",\n summary: this.activeAssistantText || \"Task completed\",\n // Codex SDK does not report per-turn cost. `0` signals \"not\n // reported\" — pair with `tokens` to disambiguate from \"free\".\n costUsd: 0,\n ...(tokens ? { tokens } : {}),\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"turn.failed\": {\n this.flushToolResults();\n const detail = this.classifyErrorMessage(event.error.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n\n case \"error\": {\n const detail = this.classifyErrorMessage(event.message);\n this.emit(\"agent-event\", {\n type: \"error\",\n error: detail.message,\n detail,\n } satisfies AgentEvent);\n this.emit(\"agent-event\", { type: \"agent_end\" } satisfies AgentEvent);\n return true;\n }\n }\n }\n\n private handleThreadItem(item: ThreadItem, completed: boolean, phase: ThreadEvent[\"type\"]): void {\n switch (item.type) {\n case \"agent_message\":\n this.handleAgentMessage(item, completed);\n break;\n\n case \"command_execution\":\n this.handleCommandExecution(item, completed, phase);\n break;\n\n case \"mcp_tool_call\":\n this.handleMcpToolCall(item, completed, phase);\n break;\n\n case \"file_change\":\n this.handleFileChange(item, completed, phase);\n break;\n\n case \"web_search\":\n this.handleWebSearch(item, completed, phase);\n break;\n\n case \"error\":\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"CodexError\",\n content: \"\",\n data: { message: item.message },\n isError: true,\n });\n }\n break;\n\n default:\n break;\n }\n }\n\n private handleAgentMessage(item: AgentMessageItem, completed: boolean): void {\n if (this.activeAssistantItemId !== item.id) {\n if (this.activeAssistantItemId) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(this.activeAssistantText),\n } satisfies AgentEvent);\n }\n this.activeAssistantItemId = item.id;\n this.activeAssistantText = \"\";\n this.emit(\"agent-event\", {\n type: \"message_start\",\n message: this.buildAssistantMessage(\"\"),\n } satisfies AgentEvent);\n }\n\n const nextText = item.text ?? \"\";\n const delta = nextText.startsWith(this.activeAssistantText)\n ? nextText.slice(this.activeAssistantText.length)\n : nextText;\n this.activeAssistantText = nextText;\n\n if (delta) {\n this.emit(\"agent-event\", {\n type: \"message_update\",\n message: this.buildAssistantMessage(nextText),\n _textDelta: delta,\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.emit(\"agent-event\", {\n type: \"message_end\",\n message: this.buildAssistantMessage(nextText),\n } satisfies AgentEvent);\n this.activeAssistantItemId = null;\n }\n }\n\n private handleCommandExecution(\n item: CommandExecutionItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"Bash\",\n tool: { name: \"Bash\" },\n input: { command: item.command },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"Bash\",\n content: \"\",\n data: {\n stdout: item.aggregated_output,\n stderr: \"\",\n exitCode: item.exit_code,\n status: item.status,\n command: item.command,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"Bash\",\n } satisfies AgentEvent);\n }\n }\n\n private handleMcpToolCall(\n item: McpToolCallItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n const toolName = `mcp__${item.server}__${item.tool}`;\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: toolName,\n tool: { name: toolName },\n input: this.toObject(item.arguments),\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName,\n content: \"\",\n data: {\n status: item.status,\n content: item.result?.content,\n structuredContent: item.result?.structured_content,\n error: item.error?.message,\n },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName,\n } satisfies AgentEvent);\n }\n }\n\n private handleFileChange(\n item: FileChangeItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"ApplyPatch\",\n tool: { name: \"ApplyPatch\" },\n input: { changes: item.changes },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"ApplyPatch\",\n content: \"\",\n data: { status: item.status, changes: item.changes },\n isError: item.status === \"failed\",\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"ApplyPatch\",\n } satisfies AgentEvent);\n }\n }\n\n private handleWebSearch(\n item: WebSearchItem,\n completed: boolean,\n phase: ThreadEvent[\"type\"],\n ): void {\n if (phase === \"item.started\") {\n this.emit(\"agent-event\", {\n type: \"tool_call\",\n name: \"WebSearch\",\n tool: { name: \"WebSearch\" },\n input: { query: item.query },\n } satisfies AgentEvent);\n }\n\n if (completed) {\n this.pendingToolResults.push({\n role: \"tool\",\n toolName: \"WebSearch\",\n content: \"\",\n data: { query: item.query, status: \"completed\" },\n });\n this.emit(\"agent-event\", {\n type: \"tool_execution_end\",\n toolName: \"WebSearch\",\n } satisfies AgentEvent);\n }\n }\n\n private flushToolResults(): void {\n if (this.pendingToolResults.length === 0) return;\n this.emit(\"agent-event\", {\n type: \"turn_end\",\n toolResults: [...this.pendingToolResults],\n } satisfies AgentEvent);\n this.pendingToolResults = [];\n }\n\n private buildAssistantMessage(text: string): AgentMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"text\", text }],\n };\n }\n\n private toObject(value: unknown): Record<string, unknown> {\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { arguments: value };\n }\n\n private classifyErrorMessage(message: string): AgentError {\n const lower = message.toLowerCase();\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"401\")\n ) {\n return {\n message,\n category: \"auth\",\n retryable: false,\n hint: \"Check your OpenAI API key configuration in settings or environment.\",\n };\n }\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"429\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"quota\")\n ) {\n return {\n message,\n category: \"rate_limit\",\n retryable: true,\n hint: \"Codex hit an OpenAI rate limit. Wait briefly and try again.\",\n };\n }\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"does not exist\") ||\n lower.includes(\"not available\"))\n ) {\n return {\n message,\n category: \"model\",\n retryable: false,\n hint: \"The selected Codex model is unavailable. Choose a different model.\",\n };\n }\n if (\n lower.includes(\"network\") ||\n lower.includes(\"timeout\") ||\n lower.includes(\"connection\") ||\n lower.includes(\"fetch\")\n ) {\n return {\n message,\n category: \"network\",\n retryable: true,\n hint: \"A network error occurred while talking to Codex.\",\n };\n }\n if (\n lower.includes(\"sandbox\") ||\n lower.includes(\"approval\") ||\n lower.includes(\"permission\") ||\n lower.includes(\"git repo\")\n ) {\n return {\n message,\n category: \"config\",\n retryable: false,\n hint: \"Check Codex sandbox, approval, and workspace configuration.\",\n };\n }\n return {\n message,\n category: \"unknown\",\n retryable: true,\n hint: \"An unexpected Codex error occurred. Try the prompt again.\",\n };\n }\n}\n\n/**\n * `DriverTarget` wrapper for the codex driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`. The Codex SDK is lazy-imported inside\n * `start()` — this target export never pulls it at module top.\n */\nexport const codexDriverTarget: DriverTarget<AgentConfig> = {\n id: \"codex\",\n displayName: BUILTIN_DRIVER_CATALOG.codex?.name ?? \"OpenAI Codex\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new CodexDriver(config),\n listModels: async (apiKeys) =>\n new CodexDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
@@ -1,9 +1,10 @@
1
1
  import { dispatchCapability } from '../../chunk-RRVQAE5D.js';
2
- import { registerDriver, DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-4ACWI5YT.js';
2
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-IGQEXBBG.js';
3
+ import '../../chunk-UZRY5UI2.js';
3
4
  import '../../chunk-24UIWON4.js';
4
5
  import '../../chunk-NSBPE2FW.js';
6
+ import * as z from 'zod';
5
7
 
6
- // bridge/src/drivers/echo.ts
7
8
  var EchoDriver = class extends AgentDriver {
8
9
  driverInfo = {
9
10
  id: "echo",
@@ -212,8 +213,16 @@ function buildEchoEvents(content, originalPrompt) {
212
213
  }
213
214
  return events;
214
215
  }
215
- registerDriver("echo", (config) => new EchoDriver(config), DRIVER_CATALOG.echo);
216
+ var echoDriverTarget = {
217
+ id: "echo",
218
+ displayName: BUILTIN_DRIVER_CATALOG.echo?.name ?? "Echo (E2E mock)",
219
+ apiVersion: 1,
220
+ // Drivers take AgentConfig; passthrough — full schema validation is out of scope.
221
+ configSchema: z.custom(() => true),
222
+ create: async (config, _ctx) => new EchoDriver(config),
223
+ listModels: async (apiKeys) => new EchoDriver({ cwd: process.cwd(), sessionId: "model-list", apiKeys }).listModels()
224
+ };
216
225
 
217
- export { EchoDriver };
226
+ export { EchoDriver, echoDriverTarget };
218
227
  //# sourceMappingURL=echo.js.map
219
228
  //# sourceMappingURL=echo.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/drivers/echo.ts"],"names":["events"],"mappings":"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","file":"echo.js","sourcesContent":["import type { Logger } from \"@skaile/workspaces/types\";\nimport { dispatchCapability } from \"../capability-dispatch.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { DRIVER_CATALOG, registerDriver } from \"../registry.js\";\nimport {\n AgentDriver,\n type AgentConfig,\n type AgentEvent,\n type BridgeCapabilityTool,\n type DriverInfo,\n} from \"../types.js\";\n\n/**\n * Echo/mock driver for E2E testing in docker mode.\n *\n * Runs inside a real Docker container with real WebSocket transport and\n * session lifecycle, but generates deterministic keyword-triggered responses\n * instead of calling the Anthropic API. This lets E2E tests exercise the\n * full infrastructure (containers, WebSocket, session management, message\n * persistence) without needing real AI credentials.\n *\n * Keyword triggers match the MockAgentClient in\n * `platform/backend/libs/agent-gateway/src/mock-agent-client.ts` — the\n * same test messages (\"test toolcall\", \"test question\", etc.) produce\n * the same events.\n *\n * Enable by setting `SKAILE_AGENT_DRIVER=echo` in the container env,\n * or by passing `{ driver: 'echo' }` in the runner config.\n *\n * @docLink packages/bridge/drivers#echo-driver\n */\nexport class EchoDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n private readonly log: Logger = getBridgeLogger(\"echo\");\n private running = false;\n private readonly config: AgentConfig;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Test surface: returns the tool list the LLM would see for this turn.\n * Composition: the registry hooks (Protocol v2) take precedence; legacy\n * `mcpServers` is not enumerated here (the echo driver never exposed MCP\n * tools to the LLM by name).\n */\n listCapabilityTools(): BridgeCapabilityTool[] {\n return this.config.capabilities?.composeTools() ?? [];\n }\n\n /**\n * Test surface: invoke a registered capability through the dispatch\n * helper. Mirrors what a real driver would do when the LLM produced a\n * tool_use for the given name — applies fire-and-forget, render emission,\n * and fallback text. Returns the structured dispatch result so tests can\n * assert immediate-vs-background resolution.\n */\n async invokeCapabilityForTest(\n name: string,\n input: unknown,\n ): Promise<{ result: unknown; background: boolean }> {\n const hooks = this.config.capabilities;\n if (!hooks) throw new Error(\"EchoDriver: no capability hooks configured\");\n const callId = `echo-cap-${Date.now()}`;\n const out = await dispatchCapability(hooks, callId, name, input, (err) =>\n this.log.warn(\"background capability handler failed\", {\n name,\n error: String(err),\n }),\n );\n return out;\n }\n\n async start(): Promise<void> {\n this.running = true;\n this.log.info(\"driver started\");\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.running) return;\n const content = message.toLowerCase();\n this.log.info(\"received prompt\", { preview: message.slice(0, 80), length: message.length });\n\n // Small delay to simulate real agent processing\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n // Phase 7B test seam — explicit capability invocation keyword. Lets E2E\n // tests drive `dispatchCapability` from a chat prompt without a real LLM.\n // Format: `[test-cap:<name>] {json}`. Anything after the closing bracket\n // is parsed as JSON input; on parse error we fall back to `{}`.\n const capMatch = /^\\s*\\[test-cap:([\\w.\\-_]+)\\]\\s*(.*)$/s.exec(message);\n if (capMatch) {\n const name = capMatch[1] ?? \"\";\n const rawInput = (capMatch[2] ?? \"\").trim();\n let input: unknown = {};\n if (rawInput.length > 0) {\n try {\n input = JSON.parse(rawInput);\n } catch (err) {\n this.log.warn(\"test-cap input was not valid JSON; defaulting to {}\", {\n error: String(err),\n preview: rawInput.slice(0, 80),\n });\n }\n }\n const events = await this.runCapabilityKeyword(name, input);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const events = buildEchoEvents(content, message);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n // Small gap between events to let the transport process each one\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n // Signal turn completion — the runner waits for this before accepting\n // the next prompt. Without it, the runner stays stuck after the first message.\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n /**\n * Phase 7B helper — drive a single capability through the dispatcher and\n * surface the structured outcome as a result event the LLM-side test code\n * can assert against. Used exclusively by the `[test-cap:<name>]` prompt\n * keyword above; never wired into normal chat flow.\n */\n private async runCapabilityKeyword(name: string, input: unknown): Promise<AgentEvent[]> {\n const events: AgentEvent[] = [];\n if (!this.config.capabilities) {\n return textAndResult(`echo[test-cap]: no capability hooks configured (skipping ${name})`);\n }\n try {\n const out = await this.invokeCapabilityForTest(name, input);\n const summary = `echo[test-cap]: invoked ${name} background=${String(out.background)} result=${safeStringify(out.result)}`;\n events.push(...textAndResult(summary));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n events.push({\n type: \"error\",\n error: `echo[test-cap]: ${name} failed: ${msg}`,\n fatal: false,\n });\n events.push(...textAndResult(`echo[test-cap]: ${name} errored (${msg})`));\n }\n return events;\n }\n\n async abort(): Promise<void> {\n this.log.info(\"abort requested\");\n }\n\n kill(): void {\n this.running = false;\n this.log.info(\"killed\");\n }\n\n async resetSession(): Promise<void> {\n this.log.info(\"session reset\");\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Echo response generation — mirrors MockAgentClient.buildMockEvents\n// ---------------------------------------------------------------------------\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nfunction textAndResult(summary: string): AgentEvent[] {\n return [\n {\n type: \"message_start\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"message_end\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"result\",\n subtype: \"success\",\n summary,\n costUsd: 0,\n },\n ];\n}\n\nfunction buildEchoEvents(content: string, originalPrompt: string): AgentEvent[] {\n const events: AgentEvent[] = [];\n\n if (content.includes(\"test all\")) {\n events.push(\n { type: \"tool_call\", name: \"Read\", tool: { name: \"Read\" }, input: \"prisma/schema.prisma\" },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n {\n type: \"tool_call\",\n name: \"Write\",\n tool: { name: \"Write\" },\n input: \"src/modules/sprint/sprint.service.ts\",\n },\n { type: \"tool_execution_end\", toolName: \"Write\" },\n );\n events.push(\n ...textAndResult(\n \"All operations completed successfully. Created sprint service, updated schema, started dev server, and ran E2E tests.\",\n ),\n );\n } else if (content.includes(\"test toolcall\")) {\n events.push(\n {\n type: \"tool_call\",\n name: \"Read\",\n tool: { name: \"Read\" },\n input: \"platform/prisma/schema.prisma\",\n },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n );\n events.push(\n ...textAndResult(\n \"I've read the schema and found 42 models. The data model looks well-structured.\",\n ),\n );\n } else if (content.includes(\"test question\")) {\n // Emit a message that asks the user a question (the runner normalizer\n // converts this to a `question` AgentEvent for the transport layer)\n events.push(\n ...textAndResult(\n \"The blueprint calls for a relational database. Which engine should I target? \" +\n \"This will affect the Prisma provider, Docker Compose setup, and the connection string.\\n\\n\" +\n \"Options: PostgreSQL, MySQL, SQLite\",\n ),\n );\n } else if (content.includes(\"test error\")) {\n events.push({\n type: \"error\",\n error:\n \"AI provider returned HTTP 429 — rate limit exceeded. The request will be retried automatically in 35 seconds.\",\n fatal: false,\n });\n } else if (content.includes(\"test fatal\")) {\n events.push({\n type: \"error\",\n error:\n \"Session agent was killed by the container runtime (OOM — memory limit 2 GB exceeded). The session cannot continue.\",\n fatal: true,\n });\n } else {\n // Default echo response\n const summary =\n `I received your message: \"${originalPrompt}\". I'm the Skaile AI assistant running in echo mode. ` +\n `This is a deterministic mock response for E2E testing.`;\n events.push(...textAndResult(summary));\n }\n\n return events;\n}\n\nregisterDriver(\"echo\", (config) => new EchoDriver(config), DRIVER_CATALOG.echo);\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/drivers/echo.ts"],"names":["events"],"mappings":"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","file":"echo.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { dispatchCapability } from \"../capability-dispatch.js\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport {\n AgentDriver,\n type AgentConfig,\n type AgentEvent,\n type BridgeCapabilityTool,\n type DriverInfo,\n} from \"../types.js\";\n\n/**\n * Echo/mock driver for E2E testing in docker mode.\n *\n * Runs inside a real Docker container with real WebSocket transport and\n * session lifecycle, but generates deterministic keyword-triggered responses\n * instead of calling the Anthropic API. This lets E2E tests exercise the\n * full infrastructure (containers, WebSocket, session management, message\n * persistence) without needing real AI credentials.\n *\n * Keyword triggers match the MockAgentClient in\n * `platform/backend/libs/agent-gateway/src/mock-agent-client.ts` — the\n * same test messages (\"test toolcall\", \"test question\", etc.) produce\n * the same events.\n *\n * Enable by setting `SKAILE_AGENT_DRIVER=echo` in the container env,\n * or by passing `{ driver: 'echo' }` in the runner config.\n *\n * @docLink packages/bridge/drivers#echo-driver\n */\nexport class EchoDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"echo\",\n name: \"Echo (E2E mock)\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n private readonly log: Logger = getBridgeLogger(\"echo\");\n private running = false;\n private readonly config: AgentConfig;\n\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n /**\n * Test surface: returns the tool list the LLM would see for this turn.\n * Composition: the registry hooks (Protocol v2) take precedence; legacy\n * `mcpServers` is not enumerated here (the echo driver never exposed MCP\n * tools to the LLM by name).\n */\n listCapabilityTools(): BridgeCapabilityTool[] {\n return this.config.capabilities?.composeTools() ?? [];\n }\n\n /**\n * Test surface: invoke a registered capability through the dispatch\n * helper. Mirrors what a real driver would do when the LLM produced a\n * tool_use for the given name — applies fire-and-forget, render emission,\n * and fallback text. Returns the structured dispatch result so tests can\n * assert immediate-vs-background resolution.\n */\n async invokeCapabilityForTest(\n name: string,\n input: unknown,\n ): Promise<{ result: unknown; background: boolean }> {\n const hooks = this.config.capabilities;\n if (!hooks) throw new Error(\"EchoDriver: no capability hooks configured\");\n const callId = `echo-cap-${Date.now()}`;\n const out = await dispatchCapability(hooks, callId, name, input, (err) =>\n this.log.warn(\"background capability handler failed\", {\n name,\n error: String(err),\n }),\n );\n return out;\n }\n\n async start(): Promise<void> {\n this.running = true;\n this.log.info(\"driver started\");\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.running) return;\n const content = message.toLowerCase();\n this.log.info(\"received prompt\", { preview: message.slice(0, 80), length: message.length });\n\n // Small delay to simulate real agent processing\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n // Phase 7B test seam — explicit capability invocation keyword. Lets E2E\n // tests drive `dispatchCapability` from a chat prompt without a real LLM.\n // Format: `[test-cap:<name>] {json}`. Anything after the closing bracket\n // is parsed as JSON input; on parse error we fall back to `{}`.\n const capMatch = /^\\s*\\[test-cap:([\\w.\\-_]+)\\]\\s*(.*)$/s.exec(message);\n if (capMatch) {\n const name = capMatch[1] ?? \"\";\n const rawInput = (capMatch[2] ?? \"\").trim();\n let input: unknown = {};\n if (rawInput.length > 0) {\n try {\n input = JSON.parse(rawInput);\n } catch (err) {\n this.log.warn(\"test-cap input was not valid JSON; defaulting to {}\", {\n error: String(err),\n preview: rawInput.slice(0, 80),\n });\n }\n }\n const events = await this.runCapabilityKeyword(name, input);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n await new Promise((resolve) => setTimeout(resolve, 20));\n }\n this.emit(\"agent-event\", { type: \"agent_end\" });\n return;\n }\n\n const events = buildEchoEvents(content, message);\n for (const event of events) {\n this.emit(\"agent-event\", event);\n // Small gap between events to let the transport process each one\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n // Signal turn completion — the runner waits for this before accepting\n // the next prompt. Without it, the runner stays stuck after the first message.\n this.emit(\"agent-event\", { type: \"agent_end\" });\n }\n\n /**\n * Phase 7B helper — drive a single capability through the dispatcher and\n * surface the structured outcome as a result event the LLM-side test code\n * can assert against. Used exclusively by the `[test-cap:<name>]` prompt\n * keyword above; never wired into normal chat flow.\n */\n private async runCapabilityKeyword(name: string, input: unknown): Promise<AgentEvent[]> {\n const events: AgentEvent[] = [];\n if (!this.config.capabilities) {\n return textAndResult(`echo[test-cap]: no capability hooks configured (skipping ${name})`);\n }\n try {\n const out = await this.invokeCapabilityForTest(name, input);\n const summary = `echo[test-cap]: invoked ${name} background=${String(out.background)} result=${safeStringify(out.result)}`;\n events.push(...textAndResult(summary));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n events.push({\n type: \"error\",\n error: `echo[test-cap]: ${name} failed: ${msg}`,\n fatal: false,\n });\n events.push(...textAndResult(`echo[test-cap]: ${name} errored (${msg})`));\n }\n return events;\n }\n\n async abort(): Promise<void> {\n this.log.info(\"abort requested\");\n }\n\n kill(): void {\n this.running = false;\n this.log.info(\"killed\");\n }\n\n async resetSession(): Promise<void> {\n this.log.info(\"session reset\");\n }\n\n get isRunning(): boolean {\n return this.running;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Echo response generation — mirrors MockAgentClient.buildMockEvents\n// ---------------------------------------------------------------------------\n\nfunction safeStringify(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n\nfunction textAndResult(summary: string): AgentEvent[] {\n return [\n {\n type: \"message_start\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"message_end\",\n message: { role: \"assistant\", content: summary },\n },\n {\n type: \"result\",\n subtype: \"success\",\n summary,\n costUsd: 0,\n },\n ];\n}\n\nfunction buildEchoEvents(content: string, originalPrompt: string): AgentEvent[] {\n const events: AgentEvent[] = [];\n\n if (content.includes(\"test all\")) {\n events.push(\n { type: \"tool_call\", name: \"Read\", tool: { name: \"Read\" }, input: \"prisma/schema.prisma\" },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n {\n type: \"tool_call\",\n name: \"Write\",\n tool: { name: \"Write\" },\n input: \"src/modules/sprint/sprint.service.ts\",\n },\n { type: \"tool_execution_end\", toolName: \"Write\" },\n );\n events.push(\n ...textAndResult(\n \"All operations completed successfully. Created sprint service, updated schema, started dev server, and ran E2E tests.\",\n ),\n );\n } else if (content.includes(\"test toolcall\")) {\n events.push(\n {\n type: \"tool_call\",\n name: \"Read\",\n tool: { name: \"Read\" },\n input: \"platform/prisma/schema.prisma\",\n },\n { type: \"tool_execution_end\", toolName: \"Read\" },\n );\n events.push(\n ...textAndResult(\n \"I've read the schema and found 42 models. The data model looks well-structured.\",\n ),\n );\n } else if (content.includes(\"test question\")) {\n // Emit a message that asks the user a question (the runner normalizer\n // converts this to a `question` AgentEvent for the transport layer)\n events.push(\n ...textAndResult(\n \"The blueprint calls for a relational database. Which engine should I target? \" +\n \"This will affect the Prisma provider, Docker Compose setup, and the connection string.\\n\\n\" +\n \"Options: PostgreSQL, MySQL, SQLite\",\n ),\n );\n } else if (content.includes(\"test error\")) {\n events.push({\n type: \"error\",\n error:\n \"AI provider returned HTTP 429 — rate limit exceeded. The request will be retried automatically in 35 seconds.\",\n fatal: false,\n });\n } else if (content.includes(\"test fatal\")) {\n events.push({\n type: \"error\",\n error:\n \"Session agent was killed by the container runtime (OOM — memory limit 2 GB exceeded). The session cannot continue.\",\n fatal: true,\n });\n } else {\n // Default echo response\n const summary =\n `I received your message: \"${originalPrompt}\". I'm the Skaile AI assistant running in echo mode. ` +\n `This is a deterministic mock response for E2E testing.`;\n events.push(...textAndResult(summary));\n }\n\n return events;\n}\n\n/**\n * `DriverTarget` wrapper for the echo driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const echoDriverTarget: DriverTarget<AgentConfig> = {\n id: \"echo\",\n displayName: BUILTIN_DRIVER_CATALOG.echo?.name ?? \"Echo (E2E mock)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new EchoDriver(config),\n listModels: async (apiKeys) =>\n new EchoDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
@@ -1,10 +1,12 @@
1
- import { registerDriver, DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-4ACWI5YT.js';
1
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-IGQEXBBG.js';
2
+ import '../../chunk-UZRY5UI2.js';
2
3
  import '../../chunk-24UIWON4.js';
3
4
  import '../../chunk-NSBPE2FW.js';
4
5
  import { spawn, execFile } from 'child_process';
5
6
  import fs from 'fs/promises';
6
7
  import path from 'path';
7
8
  import { createInterface } from 'readline';
9
+ import * as z from 'zod';
8
10
 
9
11
  function buildOmpChildEnv(parent) {
10
12
  const out = {};
@@ -424,8 +426,16 @@ var OmpDriver = class extends AgentDriver {
424
426
  this.stderrBuffer = [];
425
427
  }
426
428
  };
427
- registerDriver("omp", (config) => new OmpDriver(config), DRIVER_CATALOG.omp);
429
+ var ompDriverTarget = {
430
+ id: "omp",
431
+ displayName: BUILTIN_DRIVER_CATALOG.omp?.name ?? "omp (oh-my-pi)",
432
+ apiVersion: 1,
433
+ // Drivers take AgentConfig; passthrough — full schema validation is out of scope.
434
+ configSchema: z.custom(() => true),
435
+ create: async (config, _ctx) => new OmpDriver(config),
436
+ listModels: async (apiKeys) => new OmpDriver({ cwd: process.cwd(), sessionId: "model-list", apiKeys }).listModels()
437
+ };
428
438
 
429
- export { OmpDriver };
439
+ export { OmpDriver, ompDriverTarget };
430
440
  //# sourceMappingURL=omp.js.map
431
441
  //# sourceMappingURL=omp.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../bridge/src/drivers/omp.ts"],"names":[],"mappings":"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","file":"omp.js","sourcesContent":["import { type ChildProcess, execFile, spawn } from \"node:child_process\";\nimport type { EventEmitter } from \"node:events\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { DRIVER_CATALOG, registerDriver } from \"../registry.js\";\nimport { type AgentConfig, AgentDriver, type AgentError, type DriverInfo } from \"../types.js\";\n\n/**\n * Build the explicit env whitelist forwarded to the omp child process.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment. PATH / HOME / USER / HOSTNAME\n * are required for omp to function; the API key passes through so omp\n * can authenticate against the LLM; any `PI_*` keys are app-specific\n * config the host operator may have set explicitly.\n *\n * Test seams (`OMP_BRIDGE_*`, `FAKE_OMP_*`) are passed through so the\n * subprocess harness in `tests/omp-driver.test.ts` can drive a fake-omp\n * script via env-driven mode flags.\n *\n * @docLink packages/bridge/concepts#omp-env-whitelist\n */\nfunction buildOmpChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\"ANTHROPIC_API_KEY\", \"PATH\", \"HOME\", \"USER\", \"HOSTNAME\", \"SKAILE_SESSION_ID\"];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(\"PI_\") || key.startsWith(\"OMP_BRIDGE_\") || key.startsWith(\"FAKE_OMP_\")) {\n out[key] = value;\n }\n }\n return out;\n}\n\ninterface OmpEvent {\n type: string;\n data?: unknown;\n id?: string;\n success?: boolean;\n error?: string;\n message?: OmpMessage;\n [key: string]: unknown;\n}\n\ninterface OmpMessage {\n role?: string;\n content?: string | OmpContentBlock[];\n}\n\ninterface OmpContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n thinking?: string;\n}\n\n/**\n * Agent driver for the oh-my-pi (omp) coding agent.\n *\n * Spawns `omp --mode rpc` as a child process and communicates via newline-delimited\n * JSON-RPC over stdin/stdout. Model-agnostic: supports any LLM provider.\n *\n * @see https://github.com/can1357/oh-my-pi\n *\n * @remarks\n * **Session persistence** — omp writes JSONL session files to `<cwd>/.omp/sessions/`\n * (via `--session-dir`). After each turn (`agent_end`), sends a `get_state` RPC to\n * capture the native session ID and emits a `session_info` event so the forge layer\n * can persist it. On the next spawn, callers pass `resumeSessionId` to restore omp's\n * native context.\n *\n * **stderrBuffer** — collects the last 20 lines of stderr so they can be appended to\n * crash error messages for diagnostics without blocking the stdout readline loop.\n *\n * **systemPrompt injection** — omp does not accept a system prompt string directly.\n * The driver writes `AgentConfig.systemPrompt` to `<cwd>/.omp/system.md` and passes\n * the path via `--append-system-prompt` before spawning.\n *\n * **agentDir** — maps to the `PI_CODING_AGENT_DIR` environment variable. omp reads the\n * GitAgent directory at this path natively (agent.yaml, SOUL.md, RULES.md, knowledge/).\n *\n * @docLink packages/bridge/drivers#omp-driver\n */\nexport class OmpDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"omp\");\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private reqId = 0;\n private config: AgentConfig;\n private ready = false;\n private startPromise: Promise<void> | null = null;\n private stderrBuffer: string[] = [];\n private prevText = \"\";\n /** OMP session ID captured via `get_state` after each turn. */\n private _ompSessionId?: string;\n\n override get runtimeSessionId(): string | undefined {\n return this._ompSessionId;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n /**\n * @param config - Driver configuration. omp-relevant fields:\n * - `cwd` — working directory; omp session files are stored under `<cwd>/.omp/sessions/`.\n * - `model` / `provider` — forwarded as `--model [provider/]model`.\n * - `systemPrompt` — written to `<cwd>/.omp/system.md` and appended via `--append-system-prompt`.\n * - `agentDir` — sets `PI_CODING_AGENT_DIR`; omp reads agent identity from this directory.\n * - `sshKeyPath` — injected as `GIT_SSH_COMMAND` for authenticated git operations.\n * - `resumeSessionId` — omp session UUID to restore via `--session <id>`.\n */\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n public async start(): Promise<void> {\n if (this.proc) return;\n if (this.startPromise) return this.startPromise;\n this.startPromise = this._start();\n return this.startPromise;\n }\n\n private async _start(): Promise<void> {\n const args = [\"--mode\", \"rpc\"];\n\n // ── Session persistence ───────────────────────────────────────────────────\n // Store OMP session files in <cwd>/.omp/sessions/ so they survive process\n // restarts. The caller passes resumeSessionId to restore a prior session.\n const sessionDir = path.join(this.config.cwd, \".omp\", \"sessions\");\n await fs.mkdir(sessionDir, { recursive: true });\n args.push(\"--session-dir\", sessionDir);\n\n if (this.config.resumeSessionId) {\n this.log.info(\"resuming OMP session\", { sessionId: this.config.resumeSessionId });\n args.push(\"--session\", this.config.resumeSessionId);\n }\n\n if (this.config.model) {\n const modelArg = this.config.provider\n ? `${this.config.provider}/${this.config.model}`\n : this.config.model;\n args.push(\"--model\", modelArg);\n }\n\n // ── System prompt injection ───────────────────────────────────────────────\n // omp does not accept a system prompt string directly; it reads from a file.\n // We write it to .omp/system.md (inside the project cwd) and pass the path\n // via --append-system-prompt. This file is overwritten on each driver start.\n //\n // In flow mode (base-assets/connectors/flow/run-flow.ts conductFlow), systemPrompt carries the full agent\n // identity (SOUL + RULES + knowledge + connector docs) because no agentDir is set.\n // In REPL mode (agent.ts buildDriver), systemPrompt carries only connector docs\n // because PI_CODING_AGENT_DIR already gives omp the full agent identity.\n if (this.config.systemPrompt) {\n const ompDir = path.join(this.config.cwd, \".omp\");\n await fs.mkdir(ompDir, { recursive: true });\n const systemFile = path.join(ompDir, \"system.md\");\n await fs.writeFile(systemFile, this.config.systemPrompt);\n args.push(\"--append-system-prompt\", systemFile);\n }\n\n // Explicit env whitelist for the omp child process. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned subprocess. `this.config.env`, when\n // supplied, fully overrides the whitelist (used by tests + advanced\n // callers).\n const env: Record<string, string> = this.config.env\n ? { ...(this.config.env as Record<string, string>) }\n : buildOmpChildEnv(process.env);\n // ── Main-agent handoff ────────────────────────────────────────────────────\n // PI_CODING_AGENT_DIR is the omp equivalent of `claude --agent <name>`.\n // omp reads the GitAgent directory at this path natively: agent.yaml for the\n // manifest, SOUL.md for identity, RULES.md for constraints, knowledge/ for domain\n // context. The path may be the source directory (agentDir in REPL mode) or a\n // rendered copy installed by ompRenderer under .omp/agents/<name>/.\n // Unlike the claude-sdk path, no prior `skaile install` is required for REPL mode\n // because omp reads the source directory directly via this env variable.\n if (this.config.agentDir) {\n env.PI_CODING_AGENT_DIR = this.config.agentDir;\n }\n if (this.config.sshKeyPath) {\n env.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n\n // test-only: `OMP_BRIDGE_BIN` overrides the binary name and `OMP_BRIDGE_PREARGS`\n // (space-delimited) supplies any leading args (e.g. a JS script path when the\n // override binary is `node` or `bun`). Used by the subprocess harness tests in\n // `tests/omp-driver.test.ts` to point spawn at a fake-omp script without\n // monkey-patching `node:child_process`. Both are ignored in production.\n const overrideBin = process.env.OMP_BRIDGE_BIN;\n const overridePreArgs = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n const spawnBin = overrideBin || \"omp\";\n const spawnArgs = overrideBin ? [...overridePreArgs, ...args] : args;\n\n return new Promise<void>((resolve, reject) => {\n this.log.info(\"spawning omp\", {\n bin: spawnBin,\n args: spawnArgs,\n cwd: this.config.cwd,\n });\n if (env.PI_CODING_AGENT_DIR)\n this.log.debug(\"env: PI_CODING_AGENT_DIR set\", { value: env.PI_CODING_AGENT_DIR });\n if (env.GIT_SSH_COMMAND) this.log.debug(\"env: GIT_SSH_COMMAND set\");\n\n // Cast to ChildProcess: spawn infers ChildProcessWithoutNullStreams for\n // pipe stdio, but bun-types doesn't expose EventEmitter.on on that subtype.\n const proc = spawn(spawnBin, spawnArgs, {\n cwd: this.config.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n // bun-types 1.3.11 omits EventEmitter.on from ChildProcess; cast to subscribe.\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"process error\", err, { detail });\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n if (!this.ready) reject(err);\n });\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"process exited\", { code, signal });\n if (code !== null && code !== 0) {\n const lastStderr = this.stderrBuffer.slice(-10).join(\"\\n\");\n const detail: AgentError = {\n message: `omp process crashed (exit code ${code})${lastStderr ? `: ${this.stderrBuffer[this.stderrBuffer.length - 1]}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint:\n lastStderr || \"The agent process exited unexpectedly. Try sending your prompt again.\",\n };\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n }\n this.cleanup();\n this.emit(\"exit\", { code, signal });\n });\n\n if (proc.stdout) {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n // bun-types 1.3.11 omits EventEmitter.on from readline.Interface; cast to subscribe.\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => {\n if (!line.trim()) return;\n try {\n const event: OmpEvent = JSON.parse(line);\n this.handleEvent(event);\n } catch {\n this.log.debug(\"stdout\", { line });\n }\n });\n }\n\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n this.log.warn(\"stderr\", { line });\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n });\n }\n\n const startTime = Date.now();\n const readyTimeout = setTimeout(() => {\n if (!this.ready) {\n this.log.warn(\"ready timeout, proceeding\", { timeoutMs: 5000 });\n this.ready = true;\n resolve();\n }\n }, 5000);\n\n this.once(\"ready\", () => {\n clearTimeout(readyTimeout);\n if (!this.ready) {\n this.log.info(\"process ready\", { elapsedMs: Date.now() - startTime });\n this.ready = true;\n resolve();\n }\n });\n });\n }\n\n private extractMessageText(msg: OmpMessage): string {\n if (!msg) return \"\";\n const c = msg.content;\n if (typeof c === \"string\") return c;\n if (Array.isArray(c))\n return c\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text)\n .join(\"\");\n return \"\";\n }\n\n private handleEvent(event: OmpEvent) {\n if (event.type === \"ready\") {\n this.emit(\"ready\");\n return;\n }\n if (event.type === \"response\") {\n if (!event.success && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { type: \"error\", error: event.error, detail });\n }\n this.emit(`response:${event.id}`, event);\n return;\n }\n if (event.type === \"error\" && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { ...event, detail });\n return;\n }\n // Compute text delta for message_update events\n if (event.type === \"message_update\" && event.message) {\n const text = this.extractMessageText(event.message);\n let delta = \"\";\n if (text.startsWith(this.prevText)) {\n delta = text.slice(this.prevText.length);\n } else {\n // Content restructured (e.g. thinking blocks changed) — emit full text as delta\n delta = text;\n }\n this.prevText = text;\n this.emit(\"agent-event\", { ...event, _textDelta: delta });\n return;\n }\n // Reset delta tracking on message boundaries\n if (\n event.type === \"message_start\" ||\n event.type === \"message_end\" ||\n event.type === \"agent_end\"\n ) {\n this.prevText = \"\";\n }\n // After each turn ends, capture the OMP session ID so callers can persist it\n // and pass it as resumeSessionId on the next spawn.\n if (event.type === \"agent_end\") {\n void this.captureSessionId();\n }\n this.emit(\"agent-event\", event);\n }\n\n /**\n * Query OMP for the current session ID via `get_state` RPC.\n * Emits a `session_info` event on success so the forge layer can persist the ID.\n * Failures are silently swallowed — session tracking is best-effort.\n */\n private async captureSessionId(): Promise<void> {\n try {\n const id = this.nextId();\n const response = await new Promise<OmpEvent>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(\"get_state timeout\")), 5000);\n this.once(`response:${id}`, (resp: OmpEvent) => {\n clearTimeout(timer);\n resolve(resp);\n });\n try {\n this.send({ id, type: \"get_state\" });\n } catch (err) {\n clearTimeout(timer);\n reject(err);\n }\n });\n\n if (response.success && response.data) {\n const data = response.data as Record<string, unknown>;\n const sessionId = data.sessionId as string | undefined;\n const sessionFile = data.sessionFile as string | undefined;\n if (sessionId) {\n this._ompSessionId = sessionId;\n this.log.debug(\"omp session id assigned\", { sessionId });\n this.emit(\"agent-event\", {\n type: \"session_info\",\n driverSessionId: sessionId,\n ...(sessionFile ? { sessionFile } : {}),\n });\n }\n }\n } catch {\n // get_state is best-effort — OMP may not support it yet or the process\n // may have exited. The short-term history injection fallback still works.\n }\n }\n\n private nextId(): string {\n return `req-${++this.reqId}`;\n }\n\n private send(msg: object): void {\n if (!this.proc?.stdin?.writable) {\n const detail: AgentError = {\n message: \"omp process not running\",\n category: \"process\",\n retryable: true,\n hint: \"The agent process is not available. It will restart automatically on the next prompt.\",\n };\n const err = Object.assign(new Error(detail.message), { detail });\n throw err;\n }\n this.proc.stdin.write(`${JSON.stringify(msg)}\\n`);\n }\n\n /**\n * Sends a prompt to the omp process via JSON-RPC and returns immediately.\n *\n * The driver emits `agent-event` payloads as omp streams responses on stdout.\n * Callers should await the `agent_end` event (or the `prompt()` resolution) to\n * know when the turn is complete.\n *\n * @param message - Plain-text user prompt.\n * @throws {Error} When the omp process is not running or its stdin is closed.\n */\n public async prompt(message: string): Promise<void> {\n await this.start();\n const id = this.nextId();\n this.send({ id, type: \"prompt\", message });\n }\n\n /**\n * Sends an in-band abort RPC to the omp process, requesting it to stop the\n * current turn without terminating the child process.\n *\n * @remarks This is a best-effort signal — omp may not honour the abort\n * immediately. The process remains alive after `abort()`.\n */\n public async abort(): Promise<void> {\n if (!this.proc) return;\n const id = this.nextId();\n this.send({ id, type: \"abort\" });\n }\n\n /** `true` when the omp child process is alive and has not been killed. */\n public get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends SIGTERM to the omp child process and performs cleanup.\n *\n * The driver instance must not be reused after `kill()`. Create a new\n * `OmpDriver` to start a fresh session.\n */\n kill(): void {\n if (this.proc) {\n this.proc.kill(\"SIGTERM\");\n this.cleanup();\n }\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n await this.start();\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: \"omp command not found\",\n category: \"config\",\n retryable: false,\n hint: \"The omp agent is not installed or not on your PATH. Install it and try again.\",\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: \"Permission denied running omp\",\n category: \"config\",\n retryable: false,\n hint: \"Check file permissions for the omp binary.\",\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: \"An unexpected process error occurred. Try sending your prompt again.\",\n };\n }\n\n private classifyErrorMessage(msg: string): AgentError {\n const lower = msg.toLowerCase();\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"401\")\n ) {\n return {\n message: msg,\n category: \"auth\",\n retryable: false,\n hint: \"Check your API key configuration in Settings.\",\n };\n }\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"429\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"quota\")\n ) {\n return {\n message: msg,\n category: \"rate_limit\",\n retryable: true,\n hint: \"You have hit the provider rate limit. Wait a moment and try again.\",\n };\n }\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"not available\") ||\n lower.includes(\"does not exist\"))\n ) {\n return {\n message: msg,\n category: \"model\",\n retryable: false,\n hint: \"The selected model is not available. Change the model in settings.\",\n };\n }\n if (\n lower.includes(\"context length\") ||\n lower.includes(\"too long\") ||\n lower.includes(\"token limit\") ||\n lower.includes(\"max_tokens\")\n ) {\n return {\n message: msg,\n category: \"model\",\n retryable: false,\n hint: \"The conversation is too long. Start a new session or choose a model with a larger context window.\",\n };\n }\n if (\n lower.includes(\"timeout\") ||\n lower.includes(\"econnrefused\") ||\n lower.includes(\"enotfound\") ||\n lower.includes(\"network\") ||\n lower.includes(\"fetch failed\")\n ) {\n return {\n message: msg,\n category: \"network\",\n retryable: true,\n hint: \"A network error occurred. Check your connection and try again.\",\n };\n }\n return { message: msg, category: \"unknown\", retryable: true };\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return new Promise((resolve, reject) => {\n execFile(\"omp\", [\"--list-models\"], { timeout: 10_000 }, (err, stdout, stderr) => {\n if (err) {\n reject(new Error(`omp --list-models failed: ${stderr || err.message}`));\n return;\n }\n const models: ModelEntry[] = [];\n let inCanonical = false;\n let headerSkipped = false;\n for (const raw of stdout.split(\"\\n\")) {\n const line = raw.trimEnd();\n if (!inCanonical) {\n if (line.startsWith(\"Canonical models\")) inCanonical = true;\n continue;\n }\n if (!headerSkipped) {\n headerSkipped = true;\n continue;\n }\n // blank line or a new section header ends the canonical block\n if (line === \"\" || (!line.startsWith(\" \") && line.endsWith(\"models\"))) break;\n const canonical = line.split(/\\s{2,}/)[0]?.trim();\n if (canonical) models.push({ id: canonical, name: canonical });\n }\n resolve(models);\n });\n });\n }\n\n private cleanup(): void {\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n this.ready = false;\n this.startPromise = null;\n this.stderrBuffer = [];\n }\n}\n\nregisterDriver(\"omp\", (config) => new OmpDriver(config), DRIVER_CATALOG.omp);\n"]}
1
+ {"version":3,"sources":["../../../bridge/src/drivers/omp.ts"],"names":[],"mappings":"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","file":"omp.js","sourcesContent":["import { type ChildProcess, execFile, spawn } from \"node:child_process\";\nimport type { EventEmitter } from \"node:events\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createInterface, type Interface } from \"node:readline\";\nimport type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport { type AgentConfig, AgentDriver, type AgentError, type DriverInfo } from \"../types.js\";\n\n/**\n * Build the explicit env whitelist forwarded to the omp child process.\n *\n * Omits anything provisioned by `provision_secrets` so user credentials\n * stay out of the subprocess environment. PATH / HOME / USER / HOSTNAME\n * are required for omp to function; the API key passes through so omp\n * can authenticate against the LLM; any `PI_*` keys are app-specific\n * config the host operator may have set explicitly.\n *\n * Test seams (`OMP_BRIDGE_*`, `FAKE_OMP_*`) are passed through so the\n * subprocess harness in `tests/omp-driver.test.ts` can drive a fake-omp\n * script via env-driven mode flags.\n *\n * @docLink packages/bridge/concepts#omp-env-whitelist\n */\nfunction buildOmpChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n const explicit = [\"ANTHROPIC_API_KEY\", \"PATH\", \"HOME\", \"USER\", \"HOSTNAME\", \"SKAILE_SESSION_ID\"];\n for (const key of explicit) {\n const v = parent[key];\n if (v !== undefined) out[key] = v;\n }\n for (const [key, value] of Object.entries(parent)) {\n if (typeof value !== \"string\") continue;\n if (key.startsWith(\"PI_\") || key.startsWith(\"OMP_BRIDGE_\") || key.startsWith(\"FAKE_OMP_\")) {\n out[key] = value;\n }\n }\n return out;\n}\n\ninterface OmpEvent {\n type: string;\n data?: unknown;\n id?: string;\n success?: boolean;\n error?: string;\n message?: OmpMessage;\n [key: string]: unknown;\n}\n\ninterface OmpMessage {\n role?: string;\n content?: string | OmpContentBlock[];\n}\n\ninterface OmpContentBlock {\n type: string;\n text?: string;\n id?: string;\n name?: string;\n input?: unknown;\n thinking?: string;\n}\n\n/**\n * Agent driver for the oh-my-pi (omp) coding agent.\n *\n * Spawns `omp --mode rpc` as a child process and communicates via newline-delimited\n * JSON-RPC over stdin/stdout. Model-agnostic: supports any LLM provider.\n *\n * @see https://github.com/can1357/oh-my-pi\n *\n * @remarks\n * **Session persistence** — omp writes JSONL session files to `<cwd>/.omp/sessions/`\n * (via `--session-dir`). After each turn (`agent_end`), sends a `get_state` RPC to\n * capture the native session ID and emits a `session_info` event so the forge layer\n * can persist it. On the next spawn, callers pass `resumeSessionId` to restore omp's\n * native context.\n *\n * **stderrBuffer** — collects the last 20 lines of stderr so they can be appended to\n * crash error messages for diagnostics without blocking the stdout readline loop.\n *\n * **systemPrompt injection** — omp does not accept a system prompt string directly.\n * The driver writes `AgentConfig.systemPrompt` to `<cwd>/.omp/system.md` and passes\n * the path via `--append-system-prompt` before spawning.\n *\n * **agentDir** — maps to the `PI_CODING_AGENT_DIR` environment variable. omp reads the\n * GitAgent directory at this path natively (agent.yaml, SOUL.md, RULES.md, knowledge/).\n *\n * @docLink packages/bridge/drivers#omp-driver\n */\nexport class OmpDriver extends AgentDriver {\n readonly driverInfo: DriverInfo = {\n id: \"omp\",\n name: \"omp (oh-my-pi)\",\n modelAgnostic: true,\n supportsInBandAbort: true,\n };\n\n private readonly log: Logger = getBridgeLogger(\"omp\");\n private proc: ChildProcess | null = null;\n private rl: Interface | null = null;\n private reqId = 0;\n private config: AgentConfig;\n private ready = false;\n private startPromise: Promise<void> | null = null;\n private stderrBuffer: string[] = [];\n private prevText = \"\";\n /** OMP session ID captured via `get_state` after each turn. */\n private _ompSessionId?: string;\n\n override get runtimeSessionId(): string | undefined {\n return this._ompSessionId;\n }\n\n override getModel(): string | undefined {\n return this.config.model;\n }\n\n /**\n * @param config - Driver configuration. omp-relevant fields:\n * - `cwd` — working directory; omp session files are stored under `<cwd>/.omp/sessions/`.\n * - `model` / `provider` — forwarded as `--model [provider/]model`.\n * - `systemPrompt` — written to `<cwd>/.omp/system.md` and appended via `--append-system-prompt`.\n * - `agentDir` — sets `PI_CODING_AGENT_DIR`; omp reads agent identity from this directory.\n * - `sshKeyPath` — injected as `GIT_SSH_COMMAND` for authenticated git operations.\n * - `resumeSessionId` — omp session UUID to restore via `--session <id>`.\n */\n constructor(config: AgentConfig) {\n super();\n this.config = config;\n }\n\n public async start(): Promise<void> {\n if (this.proc) return;\n if (this.startPromise) return this.startPromise;\n this.startPromise = this._start();\n return this.startPromise;\n }\n\n private async _start(): Promise<void> {\n const args = [\"--mode\", \"rpc\"];\n\n // ── Session persistence ───────────────────────────────────────────────────\n // Store OMP session files in <cwd>/.omp/sessions/ so they survive process\n // restarts. The caller passes resumeSessionId to restore a prior session.\n const sessionDir = path.join(this.config.cwd, \".omp\", \"sessions\");\n await fs.mkdir(sessionDir, { recursive: true });\n args.push(\"--session-dir\", sessionDir);\n\n if (this.config.resumeSessionId) {\n this.log.info(\"resuming OMP session\", { sessionId: this.config.resumeSessionId });\n args.push(\"--session\", this.config.resumeSessionId);\n }\n\n if (this.config.model) {\n const modelArg = this.config.provider\n ? `${this.config.provider}/${this.config.model}`\n : this.config.model;\n args.push(\"--model\", modelArg);\n }\n\n // ── System prompt injection ───────────────────────────────────────────────\n // omp does not accept a system prompt string directly; it reads from a file.\n // We write it to .omp/system.md (inside the project cwd) and pass the path\n // via --append-system-prompt. This file is overwritten on each driver start.\n //\n // In flow mode (base-assets/connectors/flow/run-flow.ts conductFlow), systemPrompt carries the full agent\n // identity (SOUL + RULES + knowledge + connector docs) because no agentDir is set.\n // In REPL mode (agent.ts buildDriver), systemPrompt carries only connector docs\n // because PI_CODING_AGENT_DIR already gives omp the full agent identity.\n if (this.config.systemPrompt) {\n const ompDir = path.join(this.config.cwd, \".omp\");\n await fs.mkdir(ompDir, { recursive: true });\n const systemFile = path.join(ompDir, \"system.md\");\n await fs.writeFile(systemFile, this.config.systemPrompt);\n args.push(\"--append-system-prompt\", systemFile);\n }\n\n // Explicit env whitelist for the omp child process. Avoids leaking the\n // runner's full environment (which may carry user secrets provisioned by\n // the platform) into the spawned subprocess. `this.config.env`, when\n // supplied, fully overrides the whitelist (used by tests + advanced\n // callers).\n const env: Record<string, string> = this.config.env\n ? { ...(this.config.env as Record<string, string>) }\n : buildOmpChildEnv(process.env);\n // ── Main-agent handoff ────────────────────────────────────────────────────\n // PI_CODING_AGENT_DIR is the omp equivalent of `claude --agent <name>`.\n // omp reads the GitAgent directory at this path natively: agent.yaml for the\n // manifest, SOUL.md for identity, RULES.md for constraints, knowledge/ for domain\n // context. The path may be the source directory (agentDir in REPL mode) or a\n // rendered copy installed by ompRenderer under .omp/agents/<name>/.\n // Unlike the claude-sdk path, no prior `skaile install` is required for REPL mode\n // because omp reads the source directory directly via this env variable.\n if (this.config.agentDir) {\n env.PI_CODING_AGENT_DIR = this.config.agentDir;\n }\n if (this.config.sshKeyPath) {\n env.GIT_SSH_COMMAND = `ssh -i \"${this.config.sshKeyPath}\" -o StrictHostKeyChecking=accept-new`;\n }\n\n // test-only: `OMP_BRIDGE_BIN` overrides the binary name and `OMP_BRIDGE_PREARGS`\n // (space-delimited) supplies any leading args (e.g. a JS script path when the\n // override binary is `node` or `bun`). Used by the subprocess harness tests in\n // `tests/omp-driver.test.ts` to point spawn at a fake-omp script without\n // monkey-patching `node:child_process`. Both are ignored in production.\n const overrideBin = process.env.OMP_BRIDGE_BIN;\n const overridePreArgs = process.env.OMP_BRIDGE_PREARGS\n ? process.env.OMP_BRIDGE_PREARGS.split(/\\s+/).filter(Boolean)\n : [];\n const spawnBin = overrideBin || \"omp\";\n const spawnArgs = overrideBin ? [...overridePreArgs, ...args] : args;\n\n return new Promise<void>((resolve, reject) => {\n this.log.info(\"spawning omp\", {\n bin: spawnBin,\n args: spawnArgs,\n cwd: this.config.cwd,\n });\n if (env.PI_CODING_AGENT_DIR)\n this.log.debug(\"env: PI_CODING_AGENT_DIR set\", { value: env.PI_CODING_AGENT_DIR });\n if (env.GIT_SSH_COMMAND) this.log.debug(\"env: GIT_SSH_COMMAND set\");\n\n // Cast to ChildProcess: spawn infers ChildProcessWithoutNullStreams for\n // pipe stdio, but bun-types doesn't expose EventEmitter.on on that subtype.\n const proc = spawn(spawnBin, spawnArgs, {\n cwd: this.config.cwd,\n env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }) as ChildProcess;\n this.proc = proc;\n // bun-types 1.3.11 omits EventEmitter.on from ChildProcess; cast to subscribe.\n const procEmitter = proc as unknown as EventEmitter;\n\n procEmitter.on(\"error\", (err: Error) => {\n const detail = this.classifyProcessError(err as NodeJS.ErrnoException);\n this.log.error(\"process error\", err, { detail });\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n if (!this.ready) reject(err);\n });\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"process exited\", { code, signal });\n if (code !== null && code !== 0) {\n const lastStderr = this.stderrBuffer.slice(-10).join(\"\\n\");\n const detail: AgentError = {\n message: `omp process crashed (exit code ${code})${lastStderr ? `: ${this.stderrBuffer[this.stderrBuffer.length - 1]}` : \"\"}`,\n category: \"process\",\n retryable: true,\n hint:\n lastStderr || \"The agent process exited unexpectedly. Try sending your prompt again.\",\n };\n this.emit(\"agent-event\", { type: \"error\", error: detail.message, detail });\n }\n this.cleanup();\n this.emit(\"exit\", { code, signal });\n });\n\n if (proc.stdout) {\n const rl = createInterface({ input: proc.stdout });\n this.rl = rl;\n // bun-types 1.3.11 omits EventEmitter.on from readline.Interface; cast to subscribe.\n (rl as unknown as EventEmitter).on(\"line\", (line: string) => {\n if (!line.trim()) return;\n try {\n const event: OmpEvent = JSON.parse(line);\n this.handleEvent(event);\n } catch {\n this.log.debug(\"stdout\", { line });\n }\n });\n }\n\n if (proc.stderr) {\n const stderrRl = createInterface({ input: proc.stderr });\n (stderrRl as unknown as EventEmitter).on(\"line\", (line: string) => {\n this.log.warn(\"stderr\", { line });\n this.stderrBuffer.push(line);\n if (this.stderrBuffer.length > 20) this.stderrBuffer.shift();\n });\n }\n\n const startTime = Date.now();\n const readyTimeout = setTimeout(() => {\n if (!this.ready) {\n this.log.warn(\"ready timeout, proceeding\", { timeoutMs: 5000 });\n this.ready = true;\n resolve();\n }\n }, 5000);\n\n this.once(\"ready\", () => {\n clearTimeout(readyTimeout);\n if (!this.ready) {\n this.log.info(\"process ready\", { elapsedMs: Date.now() - startTime });\n this.ready = true;\n resolve();\n }\n });\n });\n }\n\n private extractMessageText(msg: OmpMessage): string {\n if (!msg) return \"\";\n const c = msg.content;\n if (typeof c === \"string\") return c;\n if (Array.isArray(c))\n return c\n .filter((b) => b.type === \"text\" && b.text)\n .map((b) => b.text)\n .join(\"\");\n return \"\";\n }\n\n private handleEvent(event: OmpEvent) {\n if (event.type === \"ready\") {\n this.emit(\"ready\");\n return;\n }\n if (event.type === \"response\") {\n if (!event.success && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { type: \"error\", error: event.error, detail });\n }\n this.emit(`response:${event.id}`, event);\n return;\n }\n if (event.type === \"error\" && event.error) {\n const detail = this.classifyErrorMessage(event.error);\n this.emit(\"agent-event\", { ...event, detail });\n return;\n }\n // Compute text delta for message_update events\n if (event.type === \"message_update\" && event.message) {\n const text = this.extractMessageText(event.message);\n let delta = \"\";\n if (text.startsWith(this.prevText)) {\n delta = text.slice(this.prevText.length);\n } else {\n // Content restructured (e.g. thinking blocks changed) — emit full text as delta\n delta = text;\n }\n this.prevText = text;\n this.emit(\"agent-event\", { ...event, _textDelta: delta });\n return;\n }\n // Reset delta tracking on message boundaries\n if (\n event.type === \"message_start\" ||\n event.type === \"message_end\" ||\n event.type === \"agent_end\"\n ) {\n this.prevText = \"\";\n }\n // After each turn ends, capture the OMP session ID so callers can persist it\n // and pass it as resumeSessionId on the next spawn.\n if (event.type === \"agent_end\") {\n void this.captureSessionId();\n }\n this.emit(\"agent-event\", event);\n }\n\n /**\n * Query OMP for the current session ID via `get_state` RPC.\n * Emits a `session_info` event on success so the forge layer can persist the ID.\n * Failures are silently swallowed — session tracking is best-effort.\n */\n private async captureSessionId(): Promise<void> {\n try {\n const id = this.nextId();\n const response = await new Promise<OmpEvent>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(\"get_state timeout\")), 5000);\n this.once(`response:${id}`, (resp: OmpEvent) => {\n clearTimeout(timer);\n resolve(resp);\n });\n try {\n this.send({ id, type: \"get_state\" });\n } catch (err) {\n clearTimeout(timer);\n reject(err);\n }\n });\n\n if (response.success && response.data) {\n const data = response.data as Record<string, unknown>;\n const sessionId = data.sessionId as string | undefined;\n const sessionFile = data.sessionFile as string | undefined;\n if (sessionId) {\n this._ompSessionId = sessionId;\n this.log.debug(\"omp session id assigned\", { sessionId });\n this.emit(\"agent-event\", {\n type: \"session_info\",\n driverSessionId: sessionId,\n ...(sessionFile ? { sessionFile } : {}),\n });\n }\n }\n } catch {\n // get_state is best-effort — OMP may not support it yet or the process\n // may have exited. The short-term history injection fallback still works.\n }\n }\n\n private nextId(): string {\n return `req-${++this.reqId}`;\n }\n\n private send(msg: object): void {\n if (!this.proc?.stdin?.writable) {\n const detail: AgentError = {\n message: \"omp process not running\",\n category: \"process\",\n retryable: true,\n hint: \"The agent process is not available. It will restart automatically on the next prompt.\",\n };\n const err = Object.assign(new Error(detail.message), { detail });\n throw err;\n }\n this.proc.stdin.write(`${JSON.stringify(msg)}\\n`);\n }\n\n /**\n * Sends a prompt to the omp process via JSON-RPC and returns immediately.\n *\n * The driver emits `agent-event` payloads as omp streams responses on stdout.\n * Callers should await the `agent_end` event (or the `prompt()` resolution) to\n * know when the turn is complete.\n *\n * @param message - Plain-text user prompt.\n * @throws {Error} When the omp process is not running or its stdin is closed.\n */\n public async prompt(message: string): Promise<void> {\n await this.start();\n const id = this.nextId();\n this.send({ id, type: \"prompt\", message });\n }\n\n /**\n * Sends an in-band abort RPC to the omp process, requesting it to stop the\n * current turn without terminating the child process.\n *\n * @remarks This is a best-effort signal — omp may not honour the abort\n * immediately. The process remains alive after `abort()`.\n */\n public async abort(): Promise<void> {\n if (!this.proc) return;\n const id = this.nextId();\n this.send({ id, type: \"abort\" });\n }\n\n /** `true` when the omp child process is alive and has not been killed. */\n public get isRunning(): boolean {\n return this.proc !== null && !this.proc.killed;\n }\n\n /**\n * Sends SIGTERM to the omp child process and performs cleanup.\n *\n * The driver instance must not be reused after `kill()`. Create a new\n * `OmpDriver` to start a fresh session.\n */\n kill(): void {\n if (this.proc) {\n this.proc.kill(\"SIGTERM\");\n this.cleanup();\n }\n }\n\n async resetSession(): Promise<void> {\n this.kill();\n await this.start();\n }\n\n private classifyProcessError(err: NodeJS.ErrnoException): AgentError {\n if (err.code === \"ENOENT\") {\n return {\n message: \"omp command not found\",\n category: \"config\",\n retryable: false,\n hint: \"The omp agent is not installed or not on your PATH. Install it and try again.\",\n };\n }\n if (err.code === \"EACCES\") {\n return {\n message: \"Permission denied running omp\",\n category: \"config\",\n retryable: false,\n hint: \"Check file permissions for the omp binary.\",\n };\n }\n return {\n message: err.message,\n category: \"process\",\n retryable: true,\n hint: \"An unexpected process error occurred. Try sending your prompt again.\",\n };\n }\n\n private classifyErrorMessage(msg: string): AgentError {\n const lower = msg.toLowerCase();\n if (\n lower.includes(\"api key\") ||\n lower.includes(\"unauthorized\") ||\n lower.includes(\"authentication\") ||\n lower.includes(\"401\")\n ) {\n return {\n message: msg,\n category: \"auth\",\n retryable: false,\n hint: \"Check your API key configuration in Settings.\",\n };\n }\n if (\n lower.includes(\"rate limit\") ||\n lower.includes(\"429\") ||\n lower.includes(\"too many requests\") ||\n lower.includes(\"quota\")\n ) {\n return {\n message: msg,\n category: \"rate_limit\",\n retryable: true,\n hint: \"You have hit the provider rate limit. Wait a moment and try again.\",\n };\n }\n if (\n lower.includes(\"model\") &&\n (lower.includes(\"not found\") ||\n lower.includes(\"not available\") ||\n lower.includes(\"does not exist\"))\n ) {\n return {\n message: msg,\n category: \"model\",\n retryable: false,\n hint: \"The selected model is not available. Change the model in settings.\",\n };\n }\n if (\n lower.includes(\"context length\") ||\n lower.includes(\"too long\") ||\n lower.includes(\"token limit\") ||\n lower.includes(\"max_tokens\")\n ) {\n return {\n message: msg,\n category: \"model\",\n retryable: false,\n hint: \"The conversation is too long. Start a new session or choose a model with a larger context window.\",\n };\n }\n if (\n lower.includes(\"timeout\") ||\n lower.includes(\"econnrefused\") ||\n lower.includes(\"enotfound\") ||\n lower.includes(\"network\") ||\n lower.includes(\"fetch failed\")\n ) {\n return {\n message: msg,\n category: \"network\",\n retryable: true,\n hint: \"A network error occurred. Check your connection and try again.\",\n };\n }\n return { message: msg, category: \"unknown\", retryable: true };\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return new Promise((resolve, reject) => {\n execFile(\"omp\", [\"--list-models\"], { timeout: 10_000 }, (err, stdout, stderr) => {\n if (err) {\n reject(new Error(`omp --list-models failed: ${stderr || err.message}`));\n return;\n }\n const models: ModelEntry[] = [];\n let inCanonical = false;\n let headerSkipped = false;\n for (const raw of stdout.split(\"\\n\")) {\n const line = raw.trimEnd();\n if (!inCanonical) {\n if (line.startsWith(\"Canonical models\")) inCanonical = true;\n continue;\n }\n if (!headerSkipped) {\n headerSkipped = true;\n continue;\n }\n // blank line or a new section header ends the canonical block\n if (line === \"\" || (!line.startsWith(\" \") && line.endsWith(\"models\"))) break;\n const canonical = line.split(/\\s{2,}/)[0]?.trim();\n if (canonical) models.push({ id: canonical, name: canonical });\n }\n resolve(models);\n });\n });\n }\n\n private cleanup(): void {\n this.rl?.close();\n this.rl = null;\n this.proc = null;\n this.ready = false;\n this.startPromise = null;\n this.stderrBuffer = [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the omp driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const ompDriverTarget: DriverTarget<AgentConfig> = {\n id: \"omp\",\n displayName: BUILTIN_DRIVER_CATALOG.omp?.name ?? \"omp (oh-my-pi)\",\n apiVersion: 1,\n // Drivers take AgentConfig; passthrough — full schema validation is out of scope.\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OmpDriver(config),\n listModels: async (apiKeys) =>\n new OmpDriver({ cwd: process.cwd(), sessionId: \"model-list\", apiKeys }).listModels(),\n};\n"]}
@@ -1,8 +1,9 @@
1
- export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-S2OVTCAL.js';
1
+ export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-XHFMUGDD.js';
2
2
  export { AuthError, classifyClaudeSdkError } from '../chunk-DQWREFRQ.js';
3
3
  export { STATIC_MODELS, fetchProviderModels, getModels, getStaticModels } from '../chunk-KOVLSBXK.js';
4
4
  export { dispatchCapability, filterRenderCapabilities, renderFallback } from '../chunk-RRVQAE5D.js';
5
- export { AgentDriver, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, loadDriver, registerDriver } from '../chunk-4ACWI5YT.js';
5
+ export { AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, registerBuiltinDrivers } from '../chunk-IGQEXBBG.js';
6
+ import '../chunk-UZRY5UI2.js';
6
7
  import '../chunk-24UIWON4.js';
7
8
  import '../chunk-NSBPE2FW.js';
8
9
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,5 @@
1
1
  import type { TokenUsage } from "@skaile/workspaces/types";
2
+ import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
2
3
  import { type ModelEntry } from "../models.js";
3
4
  import { type AgentConfig, AgentDriver, type DriverInfo, type SlashCommandInfo } from "../types.js";
4
5
  /**
@@ -281,5 +282,11 @@ export declare class ClaudeSdkDriver extends AgentDriver {
281
282
  */
282
283
  private findClaudeBinary;
283
284
  }
285
+ /**
286
+ * `DriverTarget` wrapper for the claude-sdk driver. Registered into the plugin
287
+ * registry by `registerBuiltinDrivers()`. The Claude Agent SDK is lazy-imported
288
+ * inside `start()` — this target export never pulls it at module top.
289
+ */
290
+ export declare const claudeSdkDriverTarget: DriverTarget<AgentConfig>;
284
291
  export {};
285
292
  //# sourceMappingURL=claude-sdk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-sdk.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/claude-sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-sdk.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/claude-sdk.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAanE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EACL,KAAK,WAAW,EAChB,WAAW,EAIX,KAAK,UAAU,EACf,KAAK,gBAAgB,EAEtB,MAAM,aAAa,CAAC;AAiErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH;;;;;;;GAOG;AACH,UAAU,WAAW;IACnB,qEAAqE;IACrE,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,IAAI,EAAE,OAAO,CAAC;CACf;AAOD,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAyC;IAC7D,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,GAAG,CAA6C;IACxD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAM;IAEtB,wEAAwE;IACxE,OAAO,CAAC,KAAK,CAAyB;IACtC,gDAAgD;IAChD,OAAO,CAAC,WAAW,CAA6B;IAChD,4CAA4C;IAC5C,OAAO,CAAC,UAAU,CAAuC;IACzD,6DAA6D;IAC7D,OAAO,CAAC,aAAa,CAAS;IAC9B;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB,CAAS;IACjC,sEAAsE;IACtE,OAAO,CAAC,UAAU,CAAS;IAC3B,+DAA+D;IAC/D,OAAO,CAAC,SAAS,CAAM;IACvB,qDAAqD;IACrD,OAAO,CAAC,cAAc,CAA0B;IAChD,uDAAuD;IACvD,OAAO,CAAC,WAAW,CAA2B;IAC9C,oEAAoE;IACpE,OAAO,CAAC,cAAc,CAAuB;IAC7C;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB,CAAS;IAErC;;;;;;;;;;OAUG;gBACS,MAAM,EAAE,WAAW;IAK/B,IAAa,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAElD;IAEQ,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI;IAMrF,QAAQ,IAAI,MAAM,GAAG,SAAS;IAIvC;;;;;OAKG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;;;;;;;;;;;;OAcG;IACU,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmQ9F;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,2BAA2B;YA6BrB,UAAU;IAyGf,gBAAgB,IAAI,gBAAgB,EAAE;IAI/C;;;;;;;;OAQG;YACW,wBAAwB;IAiBtC;;;;;;;OAOG;YACW,wBAAwB;IAwDtC,yDAAyD;YAC3C,kBAAkB;IAmBhC;;;;OAIG;YACW,eAAe;IAiE7B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAiBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,OAAO,CAAC,QAAQ;IAqChB,OAAO,CAAC,gBAAgB;IAuNxB,+CAA+C;IAC/C,OAAO,CAAC,gBAAgB;IAYxB,gEAAgE;YACjD,kBAAkB;IAIjC,OAAO,CAAC,mBAAmB;IA+B3B,OAAO,CAAC,cAAc;IAqBtB;;;;;;OAMG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAanC,+DAA+D;IAC/D,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;;OAKG;IACI,IAAI,IAAI,IAAI;IAeJ,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAUzC,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBnC;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAazB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,gBAAgB;CAQzB;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAAY,CAAC,WAAW,CAU3D,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
1
2
  import type { TokenUsage } from "@skaile/workspaces/types";
2
3
  import { type ModelEntry } from "../models.js";
3
4
  import { type AgentConfig, AgentDriver, type DriverInfo } from "../types.js";
@@ -63,4 +64,10 @@ export declare class CodexDriver extends AgentDriver {
63
64
  private toObject;
64
65
  private classifyErrorMessage;
65
66
  }
67
+ /**
68
+ * `DriverTarget` wrapper for the codex driver. Registered into the plugin
69
+ * registry by `registerBuiltinDrivers()`. The Codex SDK is lazy-imported inside
70
+ * `start()` — this target export never pulls it at module top.
71
+ */
72
+ export declare const codexDriverTarget: DriverTarget<AgentConfig>;
66
73
  //# sourceMappingURL=codex.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/codex.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EACL,KAAK,WAAW,EAChB,WAAW,EAIX,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AAiCrB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoC;IACxD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,uDAAuD;IACvD,OAAO,CAAC,WAAW,CAA2B;gBAElC,MAAM,EAAE,WAAW;IAK/B,IAAa,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAElD;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDtB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,IAAW,SAAS,IAAI,OAAO,CAE9B;IAEM,IAAI,IAAI,IAAI;IAOJ,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ5C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1B,aAAa,IAAI,UAAU,GAAG,IAAI;IAI3C;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,iBAAiB;IAoEzB,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,sBAAsB;IAmC9B,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,oBAAoB;CA0E7B"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../../bridge/src/drivers/codex.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAAuB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EACL,KAAK,WAAW,EAChB,WAAW,EAIX,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AAiCrB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,WAAY,SAAQ,WAAW;IAC1C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAK7B;IAEF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoC;IACxD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,kBAAkB,CAAsB;IAChD,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,uDAAuD;IACvD,OAAO,CAAC,WAAW,CAA2B;gBAElC,MAAM,EAAE,WAAW;IAK/B,IAAa,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAElD;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDtB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiDtC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC,IAAW,SAAS,IAAI,OAAO,CAE9B;IAEM,IAAI,IAAI,IAAI;IAOJ,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ5C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1B,aAAa,IAAI,UAAU,GAAG,IAAI;IAI3C;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAyB7B,OAAO,CAAC,iBAAiB;IAoEzB,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,sBAAsB;IAmC9B,OAAO,CAAC,iBAAiB;IAmCzB,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,oBAAoB;CA0E7B;AAED;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,WAAW,CASvD,CAAC"}