@skaile/workspaces 3.14.1 → 3.15.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 (159) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/dist/{asset-feeds-STHKKTW3.js → asset-feeds-XSUE5LE6.js} +7 -7
  3. package/dist/{asset-feeds-STHKKTW3.js.map → asset-feeds-XSUE5LE6.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +1 -1
  5. package/dist/asset-manager/index.js +7 -7
  6. package/dist/asset-manager/installer.js +4 -4
  7. package/dist/asset-manager/renderers.js +2 -2
  8. package/dist/bridge/drivers/claude-sdk.js +9 -6
  9. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  10. package/dist/bridge/drivers/codex.js +2 -2
  11. package/dist/bridge/drivers/continue.js +2 -2
  12. package/dist/bridge/drivers/echo.js +1 -1
  13. package/dist/bridge/drivers/gemini.js +4 -4
  14. package/dist/bridge/drivers/goose.js +2 -2
  15. package/dist/bridge/drivers/omp.js +145 -6
  16. package/dist/bridge/drivers/omp.js.map +1 -1
  17. package/dist/bridge/drivers/opencode.js +2 -2
  18. package/dist/bridge/drivers/qwen.js +4 -4
  19. package/dist/bridge/index.js +4 -4
  20. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  21. package/dist/bridge/src/drivers/omp.d.ts +62 -0
  22. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  23. package/dist/bridge/src/index.d.ts +1 -0
  24. package/dist/bridge/src/index.d.ts.map +1 -1
  25. package/dist/bridge/src/models.d.ts +27 -2
  26. package/dist/bridge/src/models.d.ts.map +1 -1
  27. package/dist/bridge/src/provider-endpoints.d.ts +39 -0
  28. package/dist/bridge/src/provider-endpoints.d.ts.map +1 -1
  29. package/dist/bridge/src/validation.d.ts +6 -1
  30. package/dist/bridge/src/validation.d.ts.map +1 -1
  31. package/dist/{chunk-ZSZSDBBW.js → chunk-4OQ2HQCQ.js} +5 -5
  32. package/dist/{chunk-ZSZSDBBW.js.map → chunk-4OQ2HQCQ.js.map} +1 -1
  33. package/dist/{chunk-ZPCHTTD7.js → chunk-5WMFU575.js} +9 -9
  34. package/dist/{chunk-ZPCHTTD7.js.map → chunk-5WMFU575.js.map} +1 -1
  35. package/dist/{chunk-UTW6YKAC.js → chunk-6YDXCJGK.js} +2 -2
  36. package/dist/{chunk-UTW6YKAC.js.map → chunk-6YDXCJGK.js.map} +1 -1
  37. package/dist/{chunk-IRORTHGA.js → chunk-AN6NAFRT.js} +21 -7
  38. package/dist/chunk-AN6NAFRT.js.map +1 -0
  39. package/dist/{chunk-HYFJPR7W.js → chunk-CWTL2QWL.js} +7 -7
  40. package/dist/{chunk-HYFJPR7W.js.map → chunk-CWTL2QWL.js.map} +1 -1
  41. package/dist/{chunk-2A7BV6WT.js → chunk-DTSKPMP3.js} +9 -6
  42. package/dist/chunk-DTSKPMP3.js.map +1 -0
  43. package/dist/{chunk-IEX5YV4R.js → chunk-DVSASEGO.js} +3 -3
  44. package/dist/{chunk-IEX5YV4R.js.map → chunk-DVSASEGO.js.map} +1 -1
  45. package/dist/{chunk-XICDQVOG.js → chunk-DWO2N72K.js} +4 -4
  46. package/dist/{chunk-XICDQVOG.js.map → chunk-DWO2N72K.js.map} +1 -1
  47. package/dist/{chunk-AZPXCHDK.js → chunk-F2WTSHZS.js} +3 -4
  48. package/dist/chunk-F2WTSHZS.js.map +1 -0
  49. package/dist/{chunk-URB2QZ4W.js → chunk-FI4QNNMD.js} +5 -5
  50. package/dist/{chunk-URB2QZ4W.js.map → chunk-FI4QNNMD.js.map} +1 -1
  51. package/dist/{chunk-PGUTER7Z.js → chunk-FYLIY6TO.js} +3 -3
  52. package/dist/{chunk-PGUTER7Z.js.map → chunk-FYLIY6TO.js.map} +1 -1
  53. package/dist/{chunk-V34ZEXSE.js → chunk-GURXUF2J.js} +32 -7
  54. package/dist/chunk-GURXUF2J.js.map +1 -0
  55. package/dist/{chunk-VW6RUT7X.js → chunk-LAOS2TZU.js} +5 -5
  56. package/dist/{chunk-VW6RUT7X.js.map → chunk-LAOS2TZU.js.map} +1 -1
  57. package/dist/{chunk-5F33LGZL.js → chunk-LVZ5NGME.js} +3 -3
  58. package/dist/{chunk-5F33LGZL.js.map → chunk-LVZ5NGME.js.map} +1 -1
  59. package/dist/{chunk-KKMRT6GU.js → chunk-MTCLDJPR.js} +7 -7
  60. package/dist/{chunk-KKMRT6GU.js.map → chunk-MTCLDJPR.js.map} +1 -1
  61. package/dist/{chunk-GRMQBBN4.js → chunk-O52DU5KU.js} +2 -2
  62. package/dist/{chunk-GRMQBBN4.js.map → chunk-O52DU5KU.js.map} +1 -1
  63. package/dist/{chunk-PW4SJE3X.js → chunk-PPKK5EV6.js} +3 -3
  64. package/dist/{chunk-PW4SJE3X.js.map → chunk-PPKK5EV6.js.map} +1 -1
  65. package/dist/{chunk-OCLCDB7G.js → chunk-Q7KWJO4J.js} +5 -5
  66. package/dist/{chunk-OCLCDB7G.js.map → chunk-Q7KWJO4J.js.map} +1 -1
  67. package/dist/{chunk-OYZIURPH.js → chunk-QZ6XXD3A.js} +3 -3
  68. package/dist/{chunk-OYZIURPH.js.map → chunk-QZ6XXD3A.js.map} +1 -1
  69. package/dist/{chunk-Z7W4B7P2.js → chunk-TMAGWRKY.js} +6 -6
  70. package/dist/{chunk-Z7W4B7P2.js.map → chunk-TMAGWRKY.js.map} +1 -1
  71. package/dist/{chunk-Y6JJHOLR.js → chunk-VFPFW67T.js} +9 -9
  72. package/dist/{chunk-Y6JJHOLR.js.map → chunk-VFPFW67T.js.map} +1 -1
  73. package/dist/{chunk-WAFHQDLK.js → chunk-WE7ONZNB.js} +3 -3
  74. package/dist/{chunk-WAFHQDLK.js.map → chunk-WE7ONZNB.js.map} +1 -1
  75. package/dist/{chunk-O7WKKINT.js → chunk-X5EYJEEQ.js} +4 -4
  76. package/dist/{chunk-O7WKKINT.js.map → chunk-X5EYJEEQ.js.map} +1 -1
  77. package/dist/{chunk-AONVXRAE.js → chunk-Z5ED4E57.js} +2 -2
  78. package/dist/{chunk-AONVXRAE.js.map → chunk-Z5ED4E57.js.map} +1 -1
  79. package/dist/cli/index.js +46 -46
  80. package/dist/cli/index.js.map +1 -1
  81. package/dist/connectors/config.js +1 -1
  82. package/dist/connectors/index.js +6 -6
  83. package/dist/core/index.js +1 -1
  84. package/dist/core/src/settings.d.ts +12 -1
  85. package/dist/core/src/settings.d.ts.map +1 -1
  86. package/dist/deploy/index.js +1 -1
  87. package/dist/discovery/index.js +2 -2
  88. package/dist/{ensure-sources-BFVKV773.js → ensure-sources-SFQT5GXY.js} +10 -10
  89. package/dist/{ensure-sources-BFVKV773.js.map → ensure-sources-SFQT5GXY.js.map} +1 -1
  90. package/dist/factory-assets/connectors/box.js +6 -6
  91. package/dist/factory-assets/connectors/deploy.js +6 -6
  92. package/dist/factory-assets/connectors/devserver.js +6 -6
  93. package/dist/factory-assets/connectors/flow/adapter.js +6 -6
  94. package/dist/factory-assets/connectors/flow/engine.js +2 -2
  95. package/dist/factory-assets/connectors/flow/run-flow.js +7 -7
  96. package/dist/factory-assets/connectors/flow.js +6 -6
  97. package/dist/factory-assets/connectors/git.js +6 -6
  98. package/dist/factory-assets/connectors/gmail.js +6 -6
  99. package/dist/factory-assets/connectors/googledrive.js +6 -6
  100. package/dist/factory-assets/connectors/local.js +6 -6
  101. package/dist/factory-assets/connectors/mattermost.js +6 -6
  102. package/dist/factory-assets/connectors/memory.js +6 -6
  103. package/dist/factory-assets/connectors/minio.js +6 -6
  104. package/dist/factory-assets/connectors/postgres.js +6 -6
  105. package/dist/factory-assets/connectors/s3.js +6 -6
  106. package/dist/factory-assets/connectors/sharepoint.js +6 -6
  107. package/dist/factory-assets/connectors/sqlite.js +6 -6
  108. package/dist/factory-assets/connectors/static-server.js +6 -6
  109. package/dist/factory-assets/connectors/tunnel.js +6 -6
  110. package/dist/factory-assets/connectors/webdav.js +6 -6
  111. package/dist/factory-assets/connectors/xstate-store.js +6 -6
  112. package/dist/factory-assets/connectors/xstate.js +6 -6
  113. package/dist/{flows-4R4VJ5VM.js → flows-Z3DM5BHF.js} +4 -4
  114. package/dist/{flows-4R4VJ5VM.js.map → flows-Z3DM5BHF.js.map} +1 -1
  115. package/dist/{helpers-CQV2V2SL.js → helpers-VRQXNHFR.js} +10 -10
  116. package/dist/{helpers-CQV2V2SL.js.map → helpers-VRQXNHFR.js.map} +1 -1
  117. package/dist/library/index.js +4 -4
  118. package/dist/library/install.js +1 -1
  119. package/dist/{library-publish-6FZCXPYU.js → library-publish-DV3B2ITY.js} +14 -14
  120. package/dist/{library-publish-6FZCXPYU.js.map → library-publish-DV3B2ITY.js.map} +1 -1
  121. package/dist/{open-library-4EOFZ4QD.js → open-library-2BXBAC6Q.js} +12 -12
  122. package/dist/{open-library-4EOFZ4QD.js.map → open-library-2BXBAC6Q.js.map} +1 -1
  123. package/dist/{paths-S7UESJKT.js → paths-AI7MDPNA.js} +3 -3
  124. package/dist/{paths-S7UESJKT.js.map → paths-AI7MDPNA.js.map} +1 -1
  125. package/dist/{plugin-store-5SJX2PRR.js → plugin-store-OO5EZBYP.js} +3 -3
  126. package/dist/{plugin-store-5SJX2PRR.js.map → plugin-store-OO5EZBYP.js.map} +1 -1
  127. package/dist/{project-J7RSKBAU.js → project-2TYDMEZB.js} +11 -11
  128. package/dist/{project-J7RSKBAU.js.map → project-2TYDMEZB.js.map} +1 -1
  129. package/dist/resolver/index.js +1 -1
  130. package/dist/runner/index.js +9 -9
  131. package/dist/sdk/asset-manager.js +7 -7
  132. package/dist/sdk/bridge.js +4 -4
  133. package/dist/sdk/core.js +1 -1
  134. package/dist/sdk/flow.js +2 -2
  135. package/dist/sdk/index.js +9 -9
  136. package/dist/sdk/resolver.js +1 -1
  137. package/dist/sdk/runner.js +9 -9
  138. package/dist/{setup-OQT5YK2Q.js → setup-EH4TZFMN.js} +6 -6
  139. package/dist/{setup-OQT5YK2Q.js.map → setup-EH4TZFMN.js.map} +1 -1
  140. package/dist/{skills-OBJX3VYG.js → skills-XZOG6ZPX.js} +3 -3
  141. package/dist/{skills-OBJX3VYG.js.map → skills-XZOG6ZPX.js.map} +1 -1
  142. package/dist/{source-AJ27AS6D.js → source-PVTUMNAO.js} +13 -13
  143. package/dist/{source-AJ27AS6D.js.map → source-PVTUMNAO.js.map} +1 -1
  144. package/dist/{source-manifest-publish-UCA2O5UA.js → source-manifest-publish-3XYTUVQQ.js} +15 -15
  145. package/dist/{source-manifest-publish-UCA2O5UA.js.map → source-manifest-publish-3XYTUVQQ.js.map} +1 -1
  146. package/dist/tui/index.js +9 -9
  147. package/dist/types/manifests.js +1 -1
  148. package/dist/types/src/manifests/agent.d.ts +47 -7
  149. package/dist/types/src/manifests/agent.d.ts.map +1 -1
  150. package/dist/types/src/manifests/index.d.ts +2 -2
  151. package/dist/types/src/manifests/index.d.ts.map +1 -1
  152. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  153. package/dist/workspace-plugin/adapters/omp.js +7 -7
  154. package/dist/workspace-plugin/index.js +1 -1
  155. package/package.json +2 -1
  156. package/dist/chunk-2A7BV6WT.js.map +0 -1
  157. package/dist/chunk-AZPXCHDK.js.map +0 -1
  158. package/dist/chunk-IRORTHGA.js.map +0 -1
  159. package/dist/chunk-V34ZEXSE.js.map +0 -1
@@ -1,6 +1,6 @@
1
- import { fetchProviderModels } from '../../chunk-V34ZEXSE.js';
1
+ import { fetchProviderModels } from '../../chunk-GURXUF2J.js';
2
2
  import { classifyGenericErrorMessage } from '../../chunk-GAH4YRCI.js';
3
- import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-AONVXRAE.js';
3
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-Z5ED4E57.js';
4
4
  import '../../chunk-6E6PKKAD.js';
5
5
  import '../../chunk-5Q7HA4JP.js';
6
6
  import '../../chunk-3A5IKBHQ.js';
@@ -1,6 +1,6 @@
1
- import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-PGUTER7Z.js';
1
+ import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-FYLIY6TO.js';
2
2
  import '../../chunk-GAH4YRCI.js';
3
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-AONVXRAE.js';
3
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-Z5ED4E57.js';
4
4
  import '../../chunk-6E6PKKAD.js';
5
5
  import '../../chunk-5Q7HA4JP.js';
6
6
  import '../../chunk-3A5IKBHQ.js';
@@ -1,5 +1,5 @@
1
1
  import { dispatchCapability } from '../../chunk-RRVQAE5D.js';
2
- import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-AONVXRAE.js';
2
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-Z5ED4E57.js';
3
3
  import '../../chunk-6E6PKKAD.js';
4
4
  import '../../chunk-5Q7HA4JP.js';
5
5
  import '../../chunk-3A5IKBHQ.js';
@@ -1,8 +1,8 @@
1
- export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-ZSZSDBBW.js';
2
- import '../../chunk-PGUTER7Z.js';
3
- import '../../chunk-V34ZEXSE.js';
1
+ export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-4OQ2HQCQ.js';
2
+ import '../../chunk-FYLIY6TO.js';
3
+ import '../../chunk-GURXUF2J.js';
4
4
  import '../../chunk-GAH4YRCI.js';
5
- import '../../chunk-AONVXRAE.js';
5
+ import '../../chunk-Z5ED4E57.js';
6
6
  import '../../chunk-6E6PKKAD.js';
7
7
  import '../../chunk-5Q7HA4JP.js';
8
8
  import '../../chunk-3A5IKBHQ.js';
@@ -1,6 +1,6 @@
1
- import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-PGUTER7Z.js';
1
+ import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-FYLIY6TO.js';
2
2
  import '../../chunk-GAH4YRCI.js';
3
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-AONVXRAE.js';
3
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-Z5ED4E57.js';
4
4
  import '../../chunk-6E6PKKAD.js';
5
5
  import '../../chunk-5Q7HA4JP.js';
6
6
  import '../../chunk-3A5IKBHQ.js';
@@ -1,5 +1,5 @@
1
1
  import { classifyGenericErrorMessage } from '../../chunk-GAH4YRCI.js';
2
- import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-AONVXRAE.js';
2
+ import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-Z5ED4E57.js';
3
3
  import '../../chunk-6E6PKKAD.js';
4
4
  import '../../chunk-5Q7HA4JP.js';
5
5
  import '../../chunk-3A5IKBHQ.js';
@@ -10,12 +10,73 @@ import path from 'path';
10
10
  import { createInterface } from 'readline';
11
11
  import * as z from 'zod';
12
12
 
13
+ var OMP_BASE_ENV_KEYS = ["PATH", "HOME", "USER", "HOSTNAME", "SKAILE_SESSION_ID"];
14
+ var OMP_PROVIDER_ENV_KEYS = [
15
+ // ── Anthropic (direct, gateway, and Foundry/mTLS transports) ──────────────
16
+ "ANTHROPIC_API_KEY",
17
+ "ANTHROPIC_AUTH_TOKEN",
18
+ "ANTHROPIC_OAUTH_TOKEN",
19
+ "ANTHROPIC_BASE_URL",
20
+ "ANTHROPIC_CUSTOM_HEADERS",
21
+ "ANTHROPIC_FOUNDRY_API_KEY",
22
+ "FOUNDRY_BASE_URL",
23
+ "CLAUDE_CODE_USE_FOUNDRY",
24
+ "CLAUDE_CODE_CLIENT_CERT",
25
+ "CLAUDE_CODE_CLIENT_KEY",
26
+ "NODE_EXTRA_CA_CERTS",
27
+ // ── Other first-party model providers ─────────────────────────────────────
28
+ "OPENAI_API_KEY",
29
+ "OPENAI_BASE_URL",
30
+ "GEMINI_API_KEY",
31
+ "COPILOT_GITHUB_TOKEN",
32
+ "AZURE_OPENAI_API_KEY",
33
+ "GROQ_API_KEY",
34
+ "CEREBRAS_API_KEY",
35
+ "XAI_API_KEY",
36
+ "MISTRAL_API_KEY",
37
+ "ZAI_API_KEY",
38
+ "MINIMAX_API_KEY",
39
+ "DEEPSEEK_API_KEY",
40
+ // ── Aggregators / gateways ────────────────────────────────────────────────
41
+ "OPENROUTER_API_KEY",
42
+ "KILO_API_KEY",
43
+ "AI_GATEWAY_API_KEY",
44
+ "OPENCODE_API_KEY",
45
+ "CURSOR_ACCESS_TOKEN",
46
+ "CLINE_API_KEY",
47
+ "WAFER_SERVERLESS_API_KEY",
48
+ "YOLO_AUTO_API_KEY",
49
+ "ABLITERATION_API_KEY",
50
+ "UMANS_AI_CODING_PLAN_API_KEY",
51
+ "UMANS_WEBSEARCH_PROVIDER",
52
+ // ── Cloud model planes ────────────────────────────────────────────────────
53
+ "AWS_PROFILE",
54
+ "AWS_ACCESS_KEY_ID",
55
+ "AWS_SECRET_ACCESS_KEY",
56
+ "AWS_SESSION_TOKEN",
57
+ "AWS_REGION",
58
+ "AWS_DEFAULT_REGION",
59
+ "GOOGLE_CLOUD_PROJECT",
60
+ "GOOGLE_CLOUD_LOCATION",
61
+ "GOOGLE_APPLICATION_CREDENTIALS",
62
+ // ── Search / tool backends ────────────────────────────────────────────────
63
+ "EXA_API_KEY",
64
+ "BRAVE_API_KEY",
65
+ "PERPLEXITY_API_KEY",
66
+ "PERPLEXITY_COOKIES",
67
+ "TAVILY_API_KEY",
68
+ "TINYFISH_API_KEY",
69
+ "FIRECRAWL_API_KEY",
70
+ "ANTHROPIC_SEARCH_API_KEY",
71
+ "ANTHROPIC_SEARCH_BASE_URL",
72
+ // ── omp's own configuration ───────────────────────────────────────────────
73
+ "OMP_PROFILE"
74
+ ];
13
75
  function buildOmpChildEnv(parent) {
14
76
  const out = {};
15
- const explicit = ["ANTHROPIC_API_KEY", "PATH", "HOME", "USER", "HOSTNAME", "SKAILE_SESSION_ID"];
16
- for (const key of explicit) {
77
+ for (const key of [...OMP_BASE_ENV_KEYS, ...OMP_PROVIDER_ENV_KEYS]) {
17
78
  const v = parent[key];
18
- if (v !== void 0) out[key] = v;
79
+ if (typeof v === "string") out[key] = v;
19
80
  }
20
81
  for (const [key, value] of Object.entries(parent)) {
21
82
  if (typeof value !== "string") continue;
@@ -25,6 +86,70 @@ function buildOmpChildEnv(parent) {
25
86
  }
26
87
  return out;
27
88
  }
89
+ var OMP_BUILTIN_TOOLS = [
90
+ "read",
91
+ "bash",
92
+ "edit",
93
+ "write",
94
+ "grep",
95
+ "glob",
96
+ "lsp",
97
+ "python",
98
+ "notebook",
99
+ "browser",
100
+ "computer",
101
+ "task",
102
+ "todo",
103
+ "web_search",
104
+ "ask"
105
+ ];
106
+ var OMP_DEFAULT_TOOLS = OMP_BUILTIN_TOOLS.filter(
107
+ (t) => t !== "computer"
108
+ );
109
+ var CANONICAL_TO_OMP_TOOL = {
110
+ read: "read",
111
+ write: "write",
112
+ edit: "edit",
113
+ multiedit: "edit",
114
+ notebookedit: "notebook",
115
+ bash: "bash",
116
+ grep: "grep",
117
+ glob: "glob",
118
+ ls: "glob",
119
+ task: "task",
120
+ agent: "task",
121
+ todowrite: "todo",
122
+ todoread: "todo",
123
+ websearch: "web_search",
124
+ web_search: "web_search",
125
+ notebook: "notebook",
126
+ lsp: "lsp",
127
+ python: "python",
128
+ browser: "browser",
129
+ computer: "computer",
130
+ todo: "todo",
131
+ ask: "ask",
132
+ askuserquestion: "ask"
133
+ };
134
+ function toOmpToolNames(names) {
135
+ const out = [];
136
+ for (const raw of names ?? []) {
137
+ const mapped = CANONICAL_TO_OMP_TOOL[raw.trim().toLowerCase().replace(/[\s-]/g, "")];
138
+ if (mapped && !out.includes(mapped)) out.push(mapped);
139
+ }
140
+ return out;
141
+ }
142
+ function buildOmpToolArgs(tools) {
143
+ const allowed = toOmpToolNames(tools?.allowed);
144
+ const denied = new Set(toOmpToolNames(tools?.denied));
145
+ const declaredAllow = (tools?.allowed?.length ?? 0) > 0;
146
+ const declaredDeny = (tools?.denied?.length ?? 0) > 0;
147
+ if (!declaredAllow && !declaredDeny) return [];
148
+ const base = declaredAllow ? allowed : [...OMP_DEFAULT_TOOLS];
149
+ const effective = base.filter((t) => !denied.has(t));
150
+ if (effective.length === 0) return ["--no-tools"];
151
+ return ["--tools", effective.join(",")];
152
+ }
28
153
  var OmpDriver = class extends AgentDriver {
29
154
  driverInfo = {
30
155
  id: "omp",
@@ -84,6 +209,11 @@ var OmpDriver = class extends AgentDriver {
84
209
  const modelArg = this.config.provider ? `${this.config.provider}/${this.config.model}` : this.config.model;
85
210
  args.push("--model", modelArg);
86
211
  }
212
+ const toolArgs = buildOmpToolArgs(this.config.tools);
213
+ if (toolArgs.length > 0) {
214
+ this.log.info("applying tool restrictions", { args: toolArgs });
215
+ args.push(...toolArgs);
216
+ }
87
217
  if (this.config.systemPrompt) {
88
218
  const ompDir = path.join(this.config.cwd, ".omp");
89
219
  await fs.mkdir(ompDir, { recursive: true });
@@ -223,9 +353,18 @@ var OmpDriver = class extends AgentDriver {
223
353
  this.emit("agent-event", { ...event, _textDelta: delta });
224
354
  return;
225
355
  }
226
- if (event.type === "message_start" || event.type === "message_end" || event.type === "agent_end") {
356
+ if (event.type === "message_start") {
357
+ this.prevText = event.message ? this.extractMessageText(event.message) : "";
358
+ }
359
+ if (event.type === "message_end" || event.type === "agent_end") {
227
360
  this.prevText = "";
228
361
  }
362
+ if (event.type === "message_end" && event.message?.role === "assistant" && event.message.stopReason === "error") {
363
+ const error = event.message.errorMessage || "omp request failed";
364
+ const detail = this.classifyErrorMessage(error);
365
+ this.log.error("omp request failed", new Error(error), { detail });
366
+ this.emit("agent-event", { type: "error", error, detail });
367
+ }
229
368
  if (event.type === "agent_end") {
230
369
  void this.captureSessionId();
231
370
  }
@@ -451,6 +590,6 @@ var ompDriverTarget = {
451
590
  listModels: async (apiKeys) => new OmpDriver({ cwd: process.cwd(), sessionId: "model-list", apiKeys }).listModels()
452
591
  };
453
592
 
454
- export { OmpDriver, ompDriverTarget };
593
+ export { OMP_BUILTIN_TOOLS, OMP_DEFAULT_TOOLS, OMP_PROVIDER_ENV_KEYS, OmpDriver, buildOmpChildEnv, buildOmpToolArgs, ompDriverTarget };
455
594
  //# sourceMappingURL=omp.js.map
456
595
  //# 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 { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { classifyGenericErrorMessage } from \"../error-classifier.js\";\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 /** Per-turn settlement handlers; non-null only while a prompt is in flight. */\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\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 (factory-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 // Settle any in-flight turn so a process-level error cannot hang prompt().\n this.rejectTurn(Object.assign(new Error(detail.message), { detail }));\n });\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"process exited\", { code, signal });\n const lastStderr = this.stderrBuffer.slice(-10).join(\"\\n\");\n const crashed = code !== null && code !== 0;\n if (crashed) {\n const detail: AgentError = {\n message: `omp process crashed (exit code ${code})${lastStderr ? `: ${lastStderr}` : \"\"}`,\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 // Settle any in-flight turn: an exit before `agent_end` means the turn\n // can never complete normally, so reject rather than leak a pending promise.\n this.rejectTurn(\n new Error(\n crashed\n ? `omp process crashed (exit code ${code})`\n : `omp process exited before the turn completed${signal ? ` (signal ${signal})` : \"\"}`,\n ),\n );\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 // Resolve AFTER emitting so listeners observing the turn see `agent_end`\n // before the caller's `prompt()` await unblocks.\n if (event.type === \"agent_end\") {\n this.resolveTurn();\n }\n }\n\n /**\n * Resolve the in-flight prompt turn (on `agent_end`). Idempotent — a turn\n * settles at most once, so a stray second `agent_end` is harmless.\n */\n private resolveTurn(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n /**\n * Reject the in-flight prompt turn (process crash/error). Settling here keeps\n * `prompt()` from hanging forever when the child dies before `agent_end`.\n */\n private rejectTurn(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\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 resolves when the turn\n * completes (after the `agent_end` event), honoring the `AgentDriver.prompt`\n * contract so driver-agnostic callers can await turn completion uniformly.\n *\n * The driver emits `agent-event` payloads as omp streams responses on stdout.\n * If the child process errors or exits before `agent_end`, the returned promise\n * rejects rather than hanging.\n *\n * @param message - Plain-text user prompt.\n * @throws {Error} When the omp process is not running, its stdin is closed, or\n * the child crashes/exits before the turn completes.\n */\n public async prompt(message: string): Promise<void> {\n await this.start();\n const id = this.nextId();\n\n // Install the per-turn resolver BEFORE sending: omp can stream a fast\n // `agent_end` on the next readline tick, and if the resolver isn't wired\n // yet that event would be missed and prompt() would hang forever.\n const turnPromise = new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n });\n\n try {\n this.send({ id, type: \"prompt\", message });\n } catch (err) {\n this.turnResolve = null;\n this.turnReject = null;\n throw err;\n }\n\n await turnPromise;\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 // Shared keyword buckets live in error-classifier.ts; only the hint copy is omp-specific.\n const generic = classifyGenericErrorMessage(msg);\n if (!generic) return { message: msg, category: \"unknown\", retryable: true };\n\n const lower = msg.toLowerCase();\n const hint =\n generic.category === \"auth\"\n ? \"Check your API key configuration in Settings.\"\n : generic.category === \"rate_limit\"\n ? \"You have hit the provider rate limit. Wait a moment and try again.\"\n : generic.category === \"network\"\n ? \"A network error occurred. Check your connection and try again.\"\n : // model: distinguish unavailable-model from over-long-context.\n lower.includes(\"model\")\n ? \"The selected model is not available. Change the model in settings.\"\n : \"The conversation is too long. Start a new session or choose a model with a larger context window.\";\n return { message: msg, category: generic.category, retryable: generic.retryable, hint };\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
+ {"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 { classifyGenericErrorMessage } from \"../error-classifier.js\";\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 * Process-level vars omp needs to run at all, independent of any provider.\n */\nconst OMP_BASE_ENV_KEYS = [\"PATH\", \"HOME\", \"USER\", \"HOSTNAME\", \"SKAILE_SESSION_ID\"] as const;\n\n/**\n * Credential and routing env vars forwarded to the omp child process.\n *\n * omp is model-agnostic — it selects a provider from whichever of these it\n * finds. Forwarding only `ANTHROPIC_API_KEY`, as this allowlist used to,\n * silently reduced every non-Anthropic workspace to a fallback: the child had\n * no credential for the provider it was configured for and no way to say so.\n * It also omitted `ANTHROPIC_BASE_URL`, so an Anthropic-compatible gateway was\n * bypassed and traffic went to Anthropic's own API instead.\n *\n * The list mirrors the \"Environment Variables\" section of `omp --help`, which\n * is the authoritative statement of what the child actually reads. Widening it\n * is deliberate: these names *are* the provider credentials, so a host that\n * sets one in the runner's environment is asking for the agent to use it. Vars\n * outside this list — anything a platform provisions under its own naming —\n * still do not reach the child.\n *\n * @docLink packages/bridge/concepts#omp-env-whitelist\n */\nexport const OMP_PROVIDER_ENV_KEYS = [\n // ── Anthropic (direct, gateway, and Foundry/mTLS transports) ──────────────\n \"ANTHROPIC_API_KEY\",\n \"ANTHROPIC_AUTH_TOKEN\",\n \"ANTHROPIC_OAUTH_TOKEN\",\n \"ANTHROPIC_BASE_URL\",\n \"ANTHROPIC_CUSTOM_HEADERS\",\n \"ANTHROPIC_FOUNDRY_API_KEY\",\n \"FOUNDRY_BASE_URL\",\n \"CLAUDE_CODE_USE_FOUNDRY\",\n \"CLAUDE_CODE_CLIENT_CERT\",\n \"CLAUDE_CODE_CLIENT_KEY\",\n \"NODE_EXTRA_CA_CERTS\",\n\n // ── Other first-party model providers ─────────────────────────────────────\n \"OPENAI_API_KEY\",\n \"OPENAI_BASE_URL\",\n \"GEMINI_API_KEY\",\n \"COPILOT_GITHUB_TOKEN\",\n \"AZURE_OPENAI_API_KEY\",\n \"GROQ_API_KEY\",\n \"CEREBRAS_API_KEY\",\n \"XAI_API_KEY\",\n \"MISTRAL_API_KEY\",\n \"ZAI_API_KEY\",\n \"MINIMAX_API_KEY\",\n \"DEEPSEEK_API_KEY\",\n\n // ── Aggregators / gateways ────────────────────────────────────────────────\n \"OPENROUTER_API_KEY\",\n \"KILO_API_KEY\",\n \"AI_GATEWAY_API_KEY\",\n \"OPENCODE_API_KEY\",\n \"CURSOR_ACCESS_TOKEN\",\n \"CLINE_API_KEY\",\n \"WAFER_SERVERLESS_API_KEY\",\n \"YOLO_AUTO_API_KEY\",\n \"ABLITERATION_API_KEY\",\n \"UMANS_AI_CODING_PLAN_API_KEY\",\n \"UMANS_WEBSEARCH_PROVIDER\",\n\n // ── Cloud model planes ────────────────────────────────────────────────────\n \"AWS_PROFILE\",\n \"AWS_ACCESS_KEY_ID\",\n \"AWS_SECRET_ACCESS_KEY\",\n \"AWS_SESSION_TOKEN\",\n \"AWS_REGION\",\n \"AWS_DEFAULT_REGION\",\n \"GOOGLE_CLOUD_PROJECT\",\n \"GOOGLE_CLOUD_LOCATION\",\n \"GOOGLE_APPLICATION_CREDENTIALS\",\n\n // ── Search / tool backends ────────────────────────────────────────────────\n \"EXA_API_KEY\",\n \"BRAVE_API_KEY\",\n \"PERPLEXITY_API_KEY\",\n \"PERPLEXITY_COOKIES\",\n \"TAVILY_API_KEY\",\n \"TINYFISH_API_KEY\",\n \"FIRECRAWL_API_KEY\",\n \"ANTHROPIC_SEARCH_API_KEY\",\n \"ANTHROPIC_SEARCH_BASE_URL\",\n\n // ── omp's own configuration ───────────────────────────────────────────────\n \"OMP_PROFILE\",\n] as const;\n\n/**\n * Build the explicit env allowlist forwarded to the omp child process.\n *\n * The runner's full environment is never inherited — only\n * {@link OMP_BASE_ENV_KEYS} (process essentials),\n * {@link OMP_PROVIDER_ENV_KEYS} (provider credentials and routing), and the\n * `PI_*` prefix (omp's own app config the host operator may have set).\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 */\nexport function buildOmpChildEnv(parent: NodeJS.ProcessEnv): Record<string, string> {\n const out: Record<string, string> = {};\n for (const key of [...OMP_BASE_ENV_KEYS, ...OMP_PROVIDER_ENV_KEYS]) {\n const v = parent[key];\n if (typeof v === \"string\") 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\n/**\n * omp's built-in tools, as reported by `omp --help` (\"Available Tools\").\n *\n * `computer` is the one entry omp does not enable by default; everything else\n * is on unless `--tools` narrows the set. Used to turn a manifest *deny* list\n * into the *allow* list omp's CLI actually accepts.\n */\nexport const OMP_BUILTIN_TOOLS = [\n \"read\",\n \"bash\",\n \"edit\",\n \"write\",\n \"grep\",\n \"glob\",\n \"lsp\",\n \"python\",\n \"notebook\",\n \"browser\",\n \"computer\",\n \"task\",\n \"todo\",\n \"web_search\",\n \"ask\",\n] as const;\n\n/** omp's default-enabled toolset — every built-in except `computer`. */\nexport const OMP_DEFAULT_TOOLS: readonly string[] = OMP_BUILTIN_TOOLS.filter(\n (t) => t !== \"computer\",\n);\n\n/**\n * Canonical (Claude Code) tool name → omp built-in tool name.\n *\n * Agent manifests are authored once in the canonical vocabulary and run on\n * whichever backend the workspace is configured for, so the driver owns the\n * translation. Names already in omp's own spelling pass through unchanged.\n *\n * Deliberately partial: Claude tools with no omp counterpart (`WebFetch`,\n * `BashOutput`, `KillShell`, `mcp__*` server tools) are absent and get dropped\n * from the omp `--tools` value — omp's `--tools` governs built-ins only, so\n * naming a non-built-in there would be rejected, and silently keeping it would\n * not restrict anything.\n */\nconst CANONICAL_TO_OMP_TOOL: Record<string, string> = {\n read: \"read\",\n write: \"write\",\n edit: \"edit\",\n multiedit: \"edit\",\n notebookedit: \"notebook\",\n bash: \"bash\",\n grep: \"grep\",\n glob: \"glob\",\n ls: \"glob\",\n task: \"task\",\n agent: \"task\",\n todowrite: \"todo\",\n todoread: \"todo\",\n websearch: \"web_search\",\n web_search: \"web_search\",\n notebook: \"notebook\",\n lsp: \"lsp\",\n python: \"python\",\n browser: \"browser\",\n computer: \"computer\",\n todo: \"todo\",\n ask: \"ask\",\n askuserquestion: \"ask\",\n};\n\n/**\n * Translate a manifest tool list into omp built-in tool names.\n *\n * Unknown names are dropped rather than passed through: a manifest is expected\n * to run on more than one backend, so it legitimately names tools this one has\n * never heard of.\n */\nfunction toOmpToolNames(names: readonly string[] | undefined): string[] {\n const out: string[] = [];\n for (const raw of names ?? []) {\n const mapped = CANONICAL_TO_OMP_TOOL[raw.trim().toLowerCase().replace(/[\\s-]/g, \"\")];\n if (mapped && !out.includes(mapped)) out.push(mapped);\n }\n return out;\n}\n\n/**\n * Resolve `AgentConfig.tools` into the omp CLI flags that enforce it.\n *\n * omp expresses tool restriction as a positive `--tools a,b,c` list (or\n * `--no-tools`) — there is no deny flag — so a manifest deny list is applied by\n * subtracting from {@link OMP_DEFAULT_TOOLS}.\n *\n * Returns `[]` when the manifest declares no restriction, which leaves omp on\n * its full default toolset exactly as before. That default toolset is the bulk\n * of every request's fixed token prefix, so this is the lever an agent\n * definition needs in order to shrink it.\n *\n * Pure — exported for direct testing.\n *\n * @since 1.5.0\n */\nexport function buildOmpToolArgs(tools: AgentConfig[\"tools\"]): string[] {\n const allowed = toOmpToolNames(tools?.allowed);\n const denied = new Set(toOmpToolNames(tools?.denied));\n\n const declaredAllow = (tools?.allowed?.length ?? 0) > 0;\n const declaredDeny = (tools?.denied?.length ?? 0) > 0;\n if (!declaredAllow && !declaredDeny) return [];\n\n const base = declaredAllow ? allowed : [...OMP_DEFAULT_TOOLS];\n const effective = base.filter((t) => !denied.has(t));\n\n // An allow list that named only tools omp does not have, or a deny list that\n // removed everything, both mean \"no tools\" — say so explicitly rather than\n // emitting `--tools ` and letting omp fall back to the full default set.\n if (effective.length === 0) return [\"--no-tools\"];\n return [\"--tools\", effective.join(\",\")];\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 * Why the turn stopped. omp reports a failed request as a normal\n * `message_end` carrying `stopReason: \"error\"` rather than as an `error`\n * event, so this is the only signal that the turn failed.\n */\n stopReason?: string;\n /** Provider/transport error text accompanying `stopReason: \"error\"`. */\n errorMessage?: string;\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 /** Per-turn settlement handlers; non-null only while a prompt is in flight. */\n private turnResolve: (() => void) | null = null;\n private turnReject: ((err: Error) => void) | null = null;\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 // ── Tool restrictions ─────────────────────────────────────────────────────\n // agent.yaml `tools:` reaches the driver as AgentConfig.tools. The\n // claude-sdk driver has always honoured it; omp did not, so a restricted\n // agent definition silently ran with omp's full default toolset — which\n // dominates the fixed token prefix of every request.\n const toolArgs = buildOmpToolArgs(this.config.tools);\n if (toolArgs.length > 0) {\n this.log.info(\"applying tool restrictions\", { args: toolArgs });\n args.push(...toolArgs);\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 (factory-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 // Settle any in-flight turn so a process-level error cannot hang prompt().\n this.rejectTurn(Object.assign(new Error(detail.message), { detail }));\n });\n\n procEmitter.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\n this.log.info(\"process exited\", { code, signal });\n const lastStderr = this.stderrBuffer.slice(-10).join(\"\\n\");\n const crashed = code !== null && code !== 0;\n if (crashed) {\n const detail: AgentError = {\n message: `omp process crashed (exit code ${code})${lastStderr ? `: ${lastStderr}` : \"\"}`,\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 // Settle any in-flight turn: an exit before `agent_end` means the turn\n // can never complete normally, so reject rather than leak a pending promise.\n this.rejectTurn(\n new Error(\n crashed\n ? `omp process crashed (exit code ${code})`\n : `omp process exited before the turn completed${signal ? ` (signal ${signal})` : \"\"}`,\n ),\n );\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. `message_start` may already\n // carry content (omp emits a partially-populated message when resuming or\n // when the first chunk lands with the start frame); seeding prevText from\n // it rather than clearing keeps the next message_update from re-emitting\n // that text as a delta.\n if (event.type === \"message_start\") {\n this.prevText = event.message ? this.extractMessageText(event.message) : \"\";\n }\n if (event.type === \"message_end\" || event.type === \"agent_end\") {\n this.prevText = \"\";\n }\n\n // A failed omp request arrives as `message_end` with `stopReason: \"error\"`,\n // not as an `error` event. Without this branch the turn ended silently: the\n // caller saw a normal completion with no assistant text and no failure,\n // which reads as a hung or empty agent. Surface it on the same channel as\n // every other driver error so callers can classify and retry.\n if (\n event.type === \"message_end\" &&\n event.message?.role === \"assistant\" &&\n event.message.stopReason === \"error\"\n ) {\n const error = event.message.errorMessage || \"omp request failed\";\n const detail = this.classifyErrorMessage(error);\n this.log.error(\"omp request failed\", new Error(error), { detail });\n this.emit(\"agent-event\", { type: \"error\", error, detail });\n }\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 // Resolve AFTER emitting so listeners observing the turn see `agent_end`\n // before the caller's `prompt()` await unblocks.\n if (event.type === \"agent_end\") {\n this.resolveTurn();\n }\n }\n\n /**\n * Resolve the in-flight prompt turn (on `agent_end`). Idempotent — a turn\n * settles at most once, so a stray second `agent_end` is harmless.\n */\n private resolveTurn(): void {\n const resolve = this.turnResolve;\n this.turnResolve = null;\n this.turnReject = null;\n resolve?.();\n }\n\n /**\n * Reject the in-flight prompt turn (process crash/error). Settling here keeps\n * `prompt()` from hanging forever when the child dies before `agent_end`.\n */\n private rejectTurn(err: Error): void {\n const reject = this.turnReject;\n this.turnResolve = null;\n this.turnReject = null;\n reject?.(err);\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 resolves when the turn\n * completes (after the `agent_end` event), honoring the `AgentDriver.prompt`\n * contract so driver-agnostic callers can await turn completion uniformly.\n *\n * The driver emits `agent-event` payloads as omp streams responses on stdout.\n * If the child process errors or exits before `agent_end`, the returned promise\n * rejects rather than hanging.\n *\n * @param message - Plain-text user prompt.\n * @throws {Error} When the omp process is not running, its stdin is closed, or\n * the child crashes/exits before the turn completes.\n */\n public async prompt(message: string): Promise<void> {\n await this.start();\n const id = this.nextId();\n\n // Install the per-turn resolver BEFORE sending: omp can stream a fast\n // `agent_end` on the next readline tick, and if the resolver isn't wired\n // yet that event would be missed and prompt() would hang forever.\n const turnPromise = new Promise<void>((resolve, reject) => {\n this.turnResolve = resolve;\n this.turnReject = reject;\n });\n\n try {\n this.send({ id, type: \"prompt\", message });\n } catch (err) {\n this.turnResolve = null;\n this.turnReject = null;\n throw err;\n }\n\n await turnPromise;\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 // Shared keyword buckets live in error-classifier.ts; only the hint copy is omp-specific.\n const generic = classifyGenericErrorMessage(msg);\n if (!generic) return { message: msg, category: \"unknown\", retryable: true };\n\n const lower = msg.toLowerCase();\n const hint =\n generic.category === \"auth\"\n ? \"Check your API key configuration in Settings.\"\n : generic.category === \"rate_limit\"\n ? \"You have hit the provider rate limit. Wait a moment and try again.\"\n : generic.category === \"network\"\n ? \"A network error occurred. Check your connection and try again.\"\n : // model: distinguish unavailable-model from over-long-context.\n lower.includes(\"model\")\n ? \"The selected model is not available. Change the model in settings.\"\n : \"The conversation is too long. Start a new session or choose a model with a larger context window.\";\n return { message: msg, category: generic.category, retryable: generic.retryable, hint };\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,6 +1,6 @@
1
- import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-PGUTER7Z.js';
1
+ import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-FYLIY6TO.js';
2
2
  import '../../chunk-GAH4YRCI.js';
3
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-AONVXRAE.js';
3
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-Z5ED4E57.js';
4
4
  import '../../chunk-6E6PKKAD.js';
5
5
  import '../../chunk-5Q7HA4JP.js';
6
6
  import '../../chunk-3A5IKBHQ.js';
@@ -1,8 +1,8 @@
1
- import { GeminiFamilyDriver } from '../../chunk-ZSZSDBBW.js';
2
- import '../../chunk-PGUTER7Z.js';
3
- import { fetchProviderModels } from '../../chunk-V34ZEXSE.js';
1
+ import { GeminiFamilyDriver } from '../../chunk-4OQ2HQCQ.js';
2
+ import '../../chunk-FYLIY6TO.js';
3
+ import { fetchProviderModels } from '../../chunk-GURXUF2J.js';
4
4
  import '../../chunk-GAH4YRCI.js';
5
- import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-AONVXRAE.js';
5
+ import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-Z5ED4E57.js';
6
6
  import '../../chunk-6E6PKKAD.js';
7
7
  import '../../chunk-5Q7HA4JP.js';
8
8
  import '../../chunk-3A5IKBHQ.js';
@@ -1,11 +1,11 @@
1
- export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-2A7BV6WT.js';
1
+ export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey } from '../chunk-DTSKPMP3.js';
2
2
  export { CLOUD_SECRET_ENV_KEYS, SUPPORTED_CLOUDS, buildClaudeCloudEnv, probeResumeTranscript, resolveClaudeConfigDir } from '../chunk-RUFTB7QN.js';
3
3
  export { dispatchCapability, filterRenderCapabilities, renderFallback } from '../chunk-RRVQAE5D.js';
4
- export { ModelTierResolutionError, PROVIDER_MODEL_TIERS, STATIC_MODELS, fetchProviderModels, getModels, getStaticModels, resolveModelTier } from '../chunk-V34ZEXSE.js';
4
+ export { ModelTierResolutionError, PROVIDER_ENDPOINTS, PROVIDER_MODEL_TIERS, STATIC_MODELS, fetchProviderModels, getModels, getStaticModels, resolveModelTier, resolveProviderModelsUrl } from '../chunk-GURXUF2J.js';
5
5
  export { AccountUnavailableError, AuthError, classifyClaudeSdkError, reclassifyAuthAsAccountUnavailable } from '../chunk-GAH4YRCI.js';
6
- export { AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, registerBuiltinDrivers } from '../chunk-AONVXRAE.js';
6
+ export { AgentDriver, BUILTIN_DRIVER_CATALOG, DRIVER_CATALOG, createDriver, getBridgeLogger, listDrivers, listModelsForDriver, registerBuiltinDrivers } from '../chunk-Z5ED4E57.js';
7
7
  import '../chunk-6E6PKKAD.js';
8
- import '../chunk-AZPXCHDK.js';
8
+ import '../chunk-F2WTSHZS.js';
9
9
  import '../chunk-F3HNW354.js';
10
10
  import '../chunk-K5GBV4SA.js';
11
11
  import '../chunk-QVZA2MDT.js';
@@ -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":"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"}
@@ -1,6 +1,68 @@
1
1
  import type { DriverTarget } from "@skaile/workspaces/plugin-registry";
2
2
  import type { ModelEntry } from "../models.js";
3
3
  import { type AgentConfig, AgentDriver, type DriverInfo } from "../types.js";
4
+ /**
5
+ * Credential and routing env vars forwarded to the omp child process.
6
+ *
7
+ * omp is model-agnostic — it selects a provider from whichever of these it
8
+ * finds. Forwarding only `ANTHROPIC_API_KEY`, as this allowlist used to,
9
+ * silently reduced every non-Anthropic workspace to a fallback: the child had
10
+ * no credential for the provider it was configured for and no way to say so.
11
+ * It also omitted `ANTHROPIC_BASE_URL`, so an Anthropic-compatible gateway was
12
+ * bypassed and traffic went to Anthropic's own API instead.
13
+ *
14
+ * The list mirrors the "Environment Variables" section of `omp --help`, which
15
+ * is the authoritative statement of what the child actually reads. Widening it
16
+ * is deliberate: these names *are* the provider credentials, so a host that
17
+ * sets one in the runner's environment is asking for the agent to use it. Vars
18
+ * outside this list — anything a platform provisions under its own naming —
19
+ * still do not reach the child.
20
+ *
21
+ * @docLink packages/bridge/concepts#omp-env-whitelist
22
+ */
23
+ export declare const OMP_PROVIDER_ENV_KEYS: readonly ["ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN", "ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_BASE_URL", "ANTHROPIC_CUSTOM_HEADERS", "ANTHROPIC_FOUNDRY_API_KEY", "FOUNDRY_BASE_URL", "CLAUDE_CODE_USE_FOUNDRY", "CLAUDE_CODE_CLIENT_CERT", "CLAUDE_CODE_CLIENT_KEY", "NODE_EXTRA_CA_CERTS", "OPENAI_API_KEY", "OPENAI_BASE_URL", "GEMINI_API_KEY", "COPILOT_GITHUB_TOKEN", "AZURE_OPENAI_API_KEY", "GROQ_API_KEY", "CEREBRAS_API_KEY", "XAI_API_KEY", "MISTRAL_API_KEY", "ZAI_API_KEY", "MINIMAX_API_KEY", "DEEPSEEK_API_KEY", "OPENROUTER_API_KEY", "KILO_API_KEY", "AI_GATEWAY_API_KEY", "OPENCODE_API_KEY", "CURSOR_ACCESS_TOKEN", "CLINE_API_KEY", "WAFER_SERVERLESS_API_KEY", "YOLO_AUTO_API_KEY", "ABLITERATION_API_KEY", "UMANS_AI_CODING_PLAN_API_KEY", "UMANS_WEBSEARCH_PROVIDER", "AWS_PROFILE", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN", "AWS_REGION", "AWS_DEFAULT_REGION", "GOOGLE_CLOUD_PROJECT", "GOOGLE_CLOUD_LOCATION", "GOOGLE_APPLICATION_CREDENTIALS", "EXA_API_KEY", "BRAVE_API_KEY", "PERPLEXITY_API_KEY", "PERPLEXITY_COOKIES", "TAVILY_API_KEY", "TINYFISH_API_KEY", "FIRECRAWL_API_KEY", "ANTHROPIC_SEARCH_API_KEY", "ANTHROPIC_SEARCH_BASE_URL", "OMP_PROFILE"];
24
+ /**
25
+ * Build the explicit env allowlist forwarded to the omp child process.
26
+ *
27
+ * The runner's full environment is never inherited — only
28
+ * {@link OMP_BASE_ENV_KEYS} (process essentials),
29
+ * {@link OMP_PROVIDER_ENV_KEYS} (provider credentials and routing), and the
30
+ * `PI_*` prefix (omp's own app config the host operator may have set).
31
+ *
32
+ * Test seams (`OMP_BRIDGE_*`, `FAKE_OMP_*`) are passed through so the
33
+ * subprocess harness in `tests/omp-driver.test.ts` can drive a fake-omp
34
+ * script via env-driven mode flags.
35
+ *
36
+ * @docLink packages/bridge/concepts#omp-env-whitelist
37
+ */
38
+ export declare function buildOmpChildEnv(parent: NodeJS.ProcessEnv): Record<string, string>;
39
+ /**
40
+ * omp's built-in tools, as reported by `omp --help` ("Available Tools").
41
+ *
42
+ * `computer` is the one entry omp does not enable by default; everything else
43
+ * is on unless `--tools` narrows the set. Used to turn a manifest *deny* list
44
+ * into the *allow* list omp's CLI actually accepts.
45
+ */
46
+ export declare const OMP_BUILTIN_TOOLS: readonly ["read", "bash", "edit", "write", "grep", "glob", "lsp", "python", "notebook", "browser", "computer", "task", "todo", "web_search", "ask"];
47
+ /** omp's default-enabled toolset — every built-in except `computer`. */
48
+ export declare const OMP_DEFAULT_TOOLS: readonly string[];
49
+ /**
50
+ * Resolve `AgentConfig.tools` into the omp CLI flags that enforce it.
51
+ *
52
+ * omp expresses tool restriction as a positive `--tools a,b,c` list (or
53
+ * `--no-tools`) — there is no deny flag — so a manifest deny list is applied by
54
+ * subtracting from {@link OMP_DEFAULT_TOOLS}.
55
+ *
56
+ * Returns `[]` when the manifest declares no restriction, which leaves omp on
57
+ * its full default toolset exactly as before. That default toolset is the bulk
58
+ * of every request's fixed token prefix, so this is the lever an agent
59
+ * definition needs in order to shrink it.
60
+ *
61
+ * Pure — exported for direct testing.
62
+ *
63
+ * @since 1.5.0
64
+ */
65
+ export declare function buildOmpToolArgs(tools: AgentConfig["tools"]): string[];
4
66
  /**
5
67
  * Agent driver for the oh-my-pi (omp) coding agent.
6
68
  *