@codexhost/cli-darwin-x64 0.3.3 → 0.3.4

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.
@@ -12,7 +12,8 @@
12
12
  "pi",
13
13
  "claude-code",
14
14
  "deepseek-harness",
15
- "grok"
15
+ "grok",
16
+ "omp"
16
17
  ];
17
18
  var DEFAULT_RENDERER_AGENTS = KNOWN_RENDERER_AGENTS;
18
19
  function defaultIdFactory(sequence) {
@@ -123,6 +124,7 @@
123
124
  if (agent === "claude-code" && model) state.claudeModel = model;
124
125
  if (agent === "deepseek-harness" && model) state.deepSeekHarnessModel = model;
125
126
  if (agent === "grok" && model) state.grokModel = model;
127
+ if (agent === "omp" && model) state.ompModel = model;
126
128
  if (agent === "pi" && thinkingOptionId) state.piThinkingOptionId = thinkingOptionId;
127
129
  else if (agent === "pi") delete state.piThinkingOptionId;
128
130
  if (agent === "claude-code" && thinkingOptionId) {
@@ -130,9 +132,11 @@
130
132
  } else if (agent === "claude-code") delete state.claudeThinkingOptionId;
131
133
  if (agent === "grok" && thinkingOptionId) state.grokThinkingOptionId = thinkingOptionId;
132
134
  else if (agent === "grok") delete state.grokThinkingOptionId;
135
+ if (agent === "omp" && thinkingOptionId) state.ompThinkingOptionId = thinkingOptionId;
136
+ else if (agent === "omp") delete state.ompThinkingOptionId;
133
137
  if (agent !== "codex") {
134
138
  const permissionModeByAgent = {};
135
- for (const candidate of ["pi", "claude-code", "deepseek-harness", "grok"]) {
139
+ for (const candidate of ["pi", "claude-code", "deepseek-harness", "grok", "omp"]) {
136
140
  const current = state.permissionModeByAgent?.[candidate];
137
141
  if (candidate !== agent && current) permissionModeByAgent[candidate] = current;
138
142
  }
@@ -150,13 +154,15 @@
150
154
  if (agent === "pi") return state.piModel;
151
155
  if (agent === "claude-code") return state.claudeModel;
152
156
  if (agent === "deepseek-harness") return state.deepSeekHarnessModel;
153
- return agent === "grok" ? state.grokModel : void 0;
157
+ if (agent === "grok") return state.grokModel;
158
+ return state.ompModel;
154
159
  }
155
160
  thinkingOptionForAgent(composer, agent) {
156
161
  const state = this.#state(composer);
157
162
  if (agent === "pi") return state.piThinkingOptionId;
158
163
  if (agent === "claude-code") return state.claudeThinkingOptionId;
159
- return agent === "grok" ? state.grokThinkingOptionId : void 0;
164
+ if (agent === "grok") return state.grokThinkingOptionId;
165
+ return state.ompThinkingOptionId;
160
166
  }
161
167
  permissionModeForAgent(composer, agent) {
162
168
  return this.#state(composer).permissionModeByAgent?.[agent];
@@ -174,7 +180,8 @@
174
180
  if (agent === "pi") state.piModel = model;
175
181
  else if (agent === "claude-code") state.claudeModel = model;
176
182
  else if (agent === "deepseek-harness") state.deepSeekHarnessModel = model;
177
- else state.grokModel = model;
183
+ else if (agent === "grok") state.grokModel = model;
184
+ else state.ompModel = model;
178
185
  return state;
179
186
  }
180
187
  setPiConfiguration(composer, model, thinkingOptionId) {
@@ -199,6 +206,10 @@
199
206
  state.grokThinkingOptionId = thinkingOptionId;
200
207
  } else if (agent === "grok") {
201
208
  delete state.grokThinkingOptionId;
209
+ } else if (agent === "omp" && thinkingOptionId) {
210
+ state.ompThinkingOptionId = thinkingOptionId;
211
+ } else if (agent === "omp") {
212
+ delete state.ompThinkingOptionId;
202
213
  }
203
214
  return state;
204
215
  }
@@ -15416,13 +15427,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15416
15427
  // src/assets/grok-agent.png
15417
15428
  var grok_agent_default = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAEk9JREFUeNrtnQdsHEUXx5fee40xnQiQ6b23IAiJAWHACV10AQHRRG8GDJgSOggEGAEBg6gGhAIBQknoppjeezGE3kybb3+je6f1fVdm93Z2Zy870iPmfN67mffmzSv/98bzLIxZZpml2ad2n7p86vWp36cBnwZ9UjlVpcHCWvUX1q6rsJbNnsvD/4ItPnX41Jcz0Rr1Fda4xSXGt/k0MWdO4sSat6XJ+FafpuaMSJ3gQWuSjG/yaUK+8M4RPGmyzfyxPk3LF9tZgjdjbTG/M1/gzFBn3Mzvzhc1c9QdF/N78sXMLPXkO386o5lnnllT3ZogP/OzRzPNNJOac8451bBhw0qFoDOKtZ8vasZ2Pv/uuOOOaoklltDCUPKesWH8/NzVyxjzfdapcePGqa222kr/XMFFbDIRgDzIkzGC4Yceeqg6/fTTKzG/GCwyCe/mi5ox5u+3337q4YcfVvPNN1851V9KrdUEII/tZ4z5e++9t/rmm2/UeuutV2v3F3MH1bJ6+cJmiPnt7e3q77//VieccIIp84XayglAntLNEPO33XZb9dtvv2nVP9tss5mo/iGp5HJgjnxxM8L8TTbZRKv9adOmqVVWWSXs7hdqCQpAR7642WD+hhtuqD777DPFOProo6MyH+oICkAO48oY8ydNmqTmmmuusKp/CLwsCOCcbgImLBg044wz6kUtpRlmmKH4npJwaqrMX3PNNdXHH3+smf/zzz+HsfqrUbNXQJw2dIQsyFx2zSKLLKKWWWYZtfrqq+uFFFpttdXUsssuqxZeeGE199xz6/cH/z4NgeBzV1hhBfX2228rGeecc04czIfavQLsuKESIsIwmI2RNGbMGHX++eere++9V73wwgvq888/Vz/88IP69ddf1e+//16kX375Rb+Omn3xxRf1+y+44AK1++67q1VXXVU/T55dh+oNxfyll15avfzyy0XmIwiLLbaY1mAxfEaXV8CeN8QZCS244IJq9OjR6tJLL1V9fX2aqeXGf//9p+nff/8tkrxWbvCcV155RV1++eVq1KhR+nPkM23NZ6mlllLPPfec/nz5fvvvv3+cn9nrFQoQMq3iUdXrrLOOuuiii9S77747hIn8/M8//9RNpc9855139Oet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";
15418
15429
 
15430
+ // src/assets/omp-agent.svg
15431
+ var omp_agent_default = 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">%0A <defs>%0A <linearGradient id="omp-gradient" x1="0" y1="0" x2="1" y2="1">%0A <stop offset="0" stop-color="%23ed4abf" />%0A <stop offset=".5" stop-color="%239b4dff" />%0A <stop offset="1" stop-color="%235ad8e6" />%0A </linearGradient>%0A </defs>%0A <path%0A fill="url(%23omp-gradient)"%0A transform="translate(-14.4 -20.2) scale(1.45)"%0A d="M14 16h36v8H40v32h-8V24h-6v22h-8V24h-4z"%0A />%0A</svg>%0A';
15432
+
15419
15433
  // src/renderer-agent-icon.ts
15420
15434
  var RENDERER_AGENT_LABELS = {
15421
15435
  codex: "Codex",
15422
15436
  pi: "Pi",
15423
15437
  "claude-code": "Claude Code",
15424
15438
  "deepseek-harness": "DeepSeek Harness",
15425
- grok: "Grok"
15439
+ grok: "Grok",
15440
+ omp: "Oh My Pi"
15426
15441
  };
15427
15442
  var PI_PATHS = [
15428
15443
  {
@@ -15474,6 +15489,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15474
15489
  "0 0 23.16 17.04"
15475
15490
  );
15476
15491
  }
15492
+ if (agent === "omp") {
15493
+ const image = ownerDocument.createElement("img");
15494
+ image.src = omp_agent_default;
15495
+ image.alt = "";
15496
+ image.draggable = false;
15497
+ image.style.width = `${size}px`;
15498
+ image.style.height = `${size}px`;
15499
+ image.style.objectFit = "contain";
15500
+ image.style.borderRadius = "22.37%";
15501
+ image.style.flex = "none";
15502
+ return image;
15503
+ }
15477
15504
  const mark = ownerDocument.createElement("img");
15478
15505
  mark.src = grok_agent_default;
15479
15506
  mark.alt = "";
@@ -15491,7 +15518,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15491
15518
  pi: "https://pi.dev/",
15492
15519
  "claude-code": "https://code.claude.com/docs/en/quickstart",
15493
15520
  "deepseek-harness": "https://github.com/deepseek-ai/deepseek-harness",
15494
- grok: "https://grok.com/"
15521
+ grok: "https://grok.com/",
15522
+ omp: "https://github.com/can1357/oh-my-pi"
15495
15523
  };
15496
15524
  var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
15497
15525
  var AGENT_MENU_WIDTH = 200;
@@ -17971,7 +17999,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
17971
17999
  function usagePlacementAnchor(control) {
17972
18000
  const context = control.nativeContextUsageControl?.element;
17973
18001
  const contextWrapper = context?.parentElement;
17974
- return contextWrapper?.parentElement ? contextWrapper : null;
18002
+ if (contextWrapper?.parentElement) return contextWrapper;
18003
+ const modelRoot = control.modelPicker?.root;
18004
+ return modelRoot?.parentElement ? modelRoot : null;
17975
18005
  }
17976
18006
  function creditsPlacementAnchor(control) {
17977
18007
  const root = control.permissionModePicker?.root;
@@ -18219,6 +18249,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18219
18249
  if (ownership.harnessId === "claude-code") return "claude-code";
18220
18250
  if (ownership.harnessId === "deepseek-harness") return "deepseek-harness";
18221
18251
  if (ownership.harnessId === "grok") return "grok";
18252
+ if (ownership.harnessId === "omp") return "omp";
18222
18253
  return null;
18223
18254
  }
18224
18255
  var BrowserSidebarAgentIconRow = class {
@@ -18594,7 +18625,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18594
18625
  pending.add(key);
18595
18626
  void client.inspectThread({ threadId: target.threadId }).then(async (inspection) => {
18596
18627
  if (disposed) return;
18597
- if (inspection.owner === "codex" || !inspection.history.fork || !target.isProjectlessConversation && inspection.history.forkAcrossCwd) {
18628
+ if (inspection.owner === "codex" || !inspection.history.fork || !target.isProjectlessConversation) {
18598
18629
  dom.replay(target);
18599
18630
  return;
18600
18631
  }
@@ -18627,6 +18658,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18627
18658
  var THREAD_PERMISSION_MODE_SELECT_METHOD = "codexhost/thread/permission-mode/select";
18628
18659
  var THREAD_OWNERSHIP_LIST_METHOD = "codexhost/thread/ownership/list";
18629
18660
  var THREAD_USAGE_INSPECT_METHOD = "codexhost/thread/usage/inspect";
18661
+ var THREAD_USAGE_UPDATED_METHOD = "codexhost/thread/usage/updated";
18630
18662
  var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
18631
18663
  var UPDATE_CHECK_METHOD = "codexhost/update/check";
18632
18664
  var UPDATE_START_METHOD = "codexhost/update/start";
@@ -18635,7 +18667,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18635
18667
  return typeof value === "object" && value !== null && !Array.isArray(value);
18636
18668
  }
18637
18669
  function notifiedThreadId(notification) {
18638
- if (!isRecord4(notification) || notification.method !== THREAD_TOKEN_USAGE_UPDATED_METHOD) {
18670
+ if (!isRecord4(notification) || notification.method !== THREAD_TOKEN_USAGE_UPDATED_METHOD && notification.method !== THREAD_USAGE_UPDATED_METHOD) {
18639
18671
  return null;
18640
18672
  }
18641
18673
  const params = notification.params;
@@ -18751,7 +18783,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18751
18783
  let disposed = false;
18752
18784
  const generations = /* @__PURE__ */ new Map();
18753
18785
  const removeNotificationCallback = notifications.addNotificationCallback(
18754
- THREAD_TOKEN_USAGE_UPDATED_METHOD,
18786
+ [THREAD_TOKEN_USAGE_UPDATED_METHOD, THREAD_USAGE_UPDATED_METHOD],
18755
18787
  (notification) => {
18756
18788
  const threadId = notifiedThreadId(notification);
18757
18789
  if (!threadId) return;
@@ -18805,6 +18837,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18805
18837
  var DEEPSEEK_HARNESS_TRANSPORT_MODEL_PREFIX = `${DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID}@`;
18806
18838
  var GROK_TRANSPORT_MODEL_ID = "codexhost/grok-native";
18807
18839
  var GROK_TRANSPORT_MODEL_PREFIX = `${GROK_TRANSPORT_MODEL_ID}@`;
18840
+ var OMP_TRANSPORT_MODEL_ID = "codexhost/omp-native";
18841
+ var OMP_TRANSPORT_MODEL_PREFIX = `${OMP_TRANSPORT_MODEL_ID}@`;
18808
18842
  function transitionRendererAdapterStatus(current, next, publish) {
18809
18843
  if (current.state === next.state && current.reason === next.reason && current.hook === next.hook) {
18810
18844
  return false;
@@ -18822,6 +18856,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18822
18856
  if (agent === "claude-code") return CLAUDE_CODE_TRANSPORT_MODEL_ID;
18823
18857
  if (agent === "deepseek-harness") return DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID;
18824
18858
  if (agent === "grok") return GROK_TRANSPORT_MODEL_ID;
18859
+ if (agent === "omp") return OMP_TRANSPORT_MODEL_ID;
18825
18860
  return null;
18826
18861
  }
18827
18862
  function isRecord5(value) {
@@ -18836,6 +18871,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18836
18871
  const parsedThinking = thinkingOptionId ? harnessThinkingOptionIdSchema.parse(thinkingOptionId) : void 0;
18837
18872
  return `${PI_TRANSPORT_MODEL_PREFIX}${parsedModel.id}${parsedThinking ? `@${parsedThinking}` : ""}`;
18838
18873
  }
18874
+ function ompTransportModelId(model, thinkingOptionId) {
18875
+ if (!model) {
18876
+ if (thinkingOptionId) throw new Error("OMP transport Thinking requires a Model Ref");
18877
+ return OMP_TRANSPORT_MODEL_ID;
18878
+ }
18879
+ const parsedModel = harnessModelRefSchema.parse(model);
18880
+ const parsedThinking = thinkingOptionId ? harnessThinkingOptionIdSchema.parse(thinkingOptionId) : void 0;
18881
+ return `${OMP_TRANSPORT_MODEL_PREFIX}${parsedModel.id}${parsedThinking ? `@${parsedThinking}` : ""}`;
18882
+ }
18839
18883
  function claudeTransportModelId(model, permissionModeId, thinkingOptionId) {
18840
18884
  if (!model) {
18841
18885
  if (permissionModeId || thinkingOptionId) {
@@ -18938,6 +18982,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18938
18982
  ...thinking?.success ? { thinkingOptionId: thinking.data } : {}
18939
18983
  };
18940
18984
  }
18985
+ function decodeOmpTransportModelId(value) {
18986
+ if (value === OMP_TRANSPORT_MODEL_ID) return {};
18987
+ if (typeof value !== "string" || !value.startsWith(OMP_TRANSPORT_MODEL_PREFIX)) return null;
18988
+ const components = value.slice(OMP_TRANSPORT_MODEL_PREFIX.length).split("@");
18989
+ if (components.length < 1 || components.length > 2) return null;
18990
+ const [modelId, thinkingOptionId] = components;
18991
+ if (components.length === 2 && !thinkingOptionId) return null;
18992
+ const model = harnessModelRefSchema.safeParse({ id: modelId });
18993
+ if (!model.success) return null;
18994
+ const thinking = thinkingOptionId ? harnessThinkingOptionIdSchema.safeParse(thinkingOptionId) : null;
18995
+ if (thinking && !thinking.success) return null;
18996
+ return { model: model.data, ...thinking?.success ? { thinkingOptionId: thinking.data } : {} };
18997
+ }
18941
18998
  function threadIdFromComposerModelTarget(target) {
18942
18999
  if (target?.[0] !== "conversation" || typeof target[1] !== "string" || target[1].trim().length === 0) {
18943
19000
  return null;
@@ -19124,7 +19181,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19124
19181
  }
19125
19182
  }
19126
19183
  function modelSelectionForAgent(officialSelection, reasoningEffort, agent, model, thinkingOptionId, permissionModeId) {
19127
- const transportModelId = agent === "pi" ? piTransportModelId(model, thinkingOptionId) : agent === "claude-code" ? claudeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "deepseek-harness" ? deepSeekHarnessTransportModelId(model) : agent === "grok" ? grokTransportModelId(model, permissionModeId, thinkingOptionId) : transportModelIdForAgent(agent);
19184
+ const transportModelId = agent === "pi" ? piTransportModelId(model, thinkingOptionId) : agent === "claude-code" ? claudeTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "deepseek-harness" ? deepSeekHarnessTransportModelId(model) : agent === "grok" ? grokTransportModelId(model, permissionModeId, thinkingOptionId) : agent === "omp" ? ompTransportModelId(model, thinkingOptionId) : transportModelIdForAgent(agent);
19128
19185
  return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
19129
19186
  }
19130
19187
  function installCurrentRendererAdapter() {
@@ -21147,7 +21204,8 @@ ${error51.stderrTail}`] : []
21147
21204
 
21148
21205
  // src/settings/trigger.ts
21149
21206
  var SETTINGS_TRIGGER_ATTRIBUTE = "data-codexhost-settings-trigger";
21150
- var SETTINGS_HEADER_SURFACE_SELECTOR = '[data-testid="app-shell-header-context-menu-surface"]';
21207
+ var SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
21208
+ var SETTINGS_HEADER_SLOT_SELECTOR = ':scope > [data-test-id="header-shell-slot"]';
21151
21209
  function measuredBounds(element) {
21152
21210
  const bounds = element.getBoundingClientRect();
21153
21211
  return {
@@ -21159,38 +21217,16 @@ ${error51.stderrTail}`] : []
21159
21217
  height: bounds.height
21160
21218
  };
21161
21219
  }
21162
- function isVisibleButton(button) {
21163
- const bounds = button.getBoundingClientRect();
21164
- return bounds.width > 0 && bounds.height > 0;
21165
- }
21166
- function selectRendererSettingsHeaderSlot(header, candidates) {
21167
- const midpoint = header.left + header.width / 2;
21168
- const maximumWidth = Math.min(320, header.width / 2);
21169
- const eligible = candidates.filter(
21170
- ({ bounds, visibleButtonCount, structuralActionGroup }) => (visibleButtonCount > 1 || structuralActionGroup === true) && bounds.width >= 0 && bounds.height >= 0 && bounds.width <= maximumWidth && bounds.left >= midpoint && bounds.right <= header.right + 1 && bounds.top >= header.top - 1 && bounds.bottom <= header.bottom + 1
21171
- );
21172
- eligible.sort(
21173
- (left, right) => Math.abs(header.right - left.bounds.right) - Math.abs(header.right - right.bounds.right) || right.visibleButtonCount - left.visibleButtonCount || left.bounds.left - right.bounds.left
21174
- );
21175
- return eligible[0]?.value ?? null;
21176
- }
21177
21220
  function findRendererSettingsHeaderInsertionPoint(ownerDocument) {
21178
- const surface = ownerDocument.querySelector(SETTINGS_HEADER_SURFACE_SELECTOR);
21179
- if (!surface || !surface.closest("header")) return null;
21180
- const surfaceBounds = measuredBounds(surface);
21181
- const view = ownerDocument.defaultView;
21182
- const measuredSlots = [...surface.querySelectorAll("div")].map(
21183
- (slot) => ({
21184
- value: slot,
21185
- bounds: measuredBounds(slot),
21186
- visibleButtonCount: [...slot.querySelectorAll("button")].filter(
21187
- isVisibleButton
21188
- ).length,
21189
- structuralActionGroup: slot.parentElement?.lastElementChild === slot && view?.getComputedStyle(slot.parentElement).display === "grid"
21190
- })
21191
- );
21192
- const actionGroup = selectRendererSettingsHeaderSlot(surfaceBounds, measuredSlots);
21193
- return actionGroup ? { parent: actionGroup, before: actionGroup.firstChild } : null;
21221
+ const header = ownerDocument.querySelector(SETTINGS_APPLICATION_HEADER_SELECTOR);
21222
+ if (!header) return null;
21223
+ const headerBounds = measuredBounds(header);
21224
+ if (headerBounds.width <= 0 || headerBounds.height <= 0) return null;
21225
+ const endSlot = [...header.querySelectorAll(SETTINGS_HEADER_SLOT_SELECTOR)].filter((slot) => {
21226
+ const bounds = measuredBounds(slot);
21227
+ return bounds.width > 0 && bounds.height > 0;
21228
+ }).toSorted((left, right) => measuredBounds(right).left - measuredBounds(left).left)[0];
21229
+ return endSlot ? { parent: header, before: endSlot } : null;
21194
21230
  }
21195
21231
  function mountRendererSettingsTrigger(triggerId, available, onOpen, ownerDocument = document, messages = DEFAULT_RENDERER_SETTINGS_MESSAGES) {
21196
21232
  const root = ownerDocument.createElement("div");
@@ -21318,23 +21354,27 @@ ${error51.stderrTail}`] : []
21318
21354
  let disposed = false;
21319
21355
  const refresh = () => {
21320
21356
  if (disposed) return false;
21321
- if (trigger?.root.isConnected) return true;
21322
- trigger?.dispose();
21323
- trigger = null;
21324
- for (const duplicate of ownerDocument.querySelectorAll(`[${SETTINGS_TRIGGER_ATTRIBUTE}]`)) {
21325
- duplicate.remove();
21326
- }
21327
21357
  const insertionPoint = findRendererSettingsHeaderInsertionPoint(ownerDocument);
21328
- if (!insertionPoint) return false;
21329
- trigger = mountRendererSettingsTrigger(
21330
- "application-header",
21331
- options.available,
21332
- options.onOpen,
21333
- ownerDocument,
21334
- options.messages
21335
- );
21336
- trigger.setUpdateAvailable(updateAvailable);
21337
- insertionPoint.parent.insertBefore(trigger.root, insertionPoint.before);
21358
+ if (!insertionPoint) {
21359
+ trigger?.root.remove();
21360
+ return false;
21361
+ }
21362
+ if (!trigger) {
21363
+ for (const duplicate of ownerDocument.querySelectorAll(`[${SETTINGS_TRIGGER_ATTRIBUTE}]`)) {
21364
+ duplicate.remove();
21365
+ }
21366
+ trigger = mountRendererSettingsTrigger(
21367
+ "application-header",
21368
+ options.available,
21369
+ options.onOpen,
21370
+ ownerDocument,
21371
+ options.messages
21372
+ );
21373
+ trigger.setUpdateAvailable(updateAvailable);
21374
+ }
21375
+ if (trigger.root.parentElement !== insertionPoint.parent || trigger.root.nextSibling !== insertionPoint.before) {
21376
+ insertionPoint.parent.insertBefore(trigger.root, insertionPoint.before);
21377
+ }
21338
21378
  return true;
21339
21379
  };
21340
21380
  refresh();
@@ -21544,13 +21584,15 @@ ${error51.stderrTail}`] : []
21544
21584
  pi: harnessIdSchema.parse("pi"),
21545
21585
  "claude-code": harnessIdSchema.parse("claude-code"),
21546
21586
  "deepseek-harness": harnessIdSchema.parse("deepseek-harness"),
21547
- grok: harnessIdSchema.parse("grok")
21587
+ grok: harnessIdSchema.parse("grok"),
21588
+ omp: harnessIdSchema.parse("omp")
21548
21589
  };
21549
21590
  var externalAgents = [
21550
21591
  "pi",
21551
21592
  "claude-code",
21552
21593
  "deepseek-harness",
21553
- "grok"
21594
+ "grok",
21595
+ "omp"
21554
21596
  ];
21555
21597
  function isRetryableHarnessAvailability(availability, error51) {
21556
21598
  return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
@@ -21624,6 +21666,17 @@ ${error51.stderrTail}`] : []
21624
21666
  ...permissionModeId ? { permissionModeId } : {}
21625
21667
  };
21626
21668
  }
21669
+ if (inspection.harnessId === "omp") {
21670
+ const transportSelection = decodeOmpTransportModelId(inspection.transportModelId);
21671
+ if (!transportSelection) throw new Error("OMP Thread reported an incompatible transport Model");
21672
+ const model = inspection.effectiveModel ?? transportSelection.model;
21673
+ const thinkingOptionId = selectableThinkingOptionId(inspection) ?? transportSelection.thinkingOptionId;
21674
+ return {
21675
+ agent: "omp",
21676
+ ...model ? { model } : {},
21677
+ ...thinkingOptionId ? { thinkingOptionId } : {}
21678
+ };
21679
+ }
21627
21680
  if (inspection.harnessId === "claude-code") {
21628
21681
  const transportSelection = decodeClaudeTransportModelId(inspection.transportModelId);
21629
21682
  if (!transportSelection) {
@@ -21768,7 +21821,8 @@ ${error51.stderrTail}`] : []
21768
21821
  pi: void 0,
21769
21822
  "claude-code": void 0,
21770
21823
  "deepseek-harness": void 0,
21771
- grok: void 0
21824
+ grok: void 0,
21825
+ omp: void 0
21772
21826
  },
21773
21827
  requestGeneration: 0,
21774
21828
  request: null,
package/bin/codexhost CHANGED
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codexhost/cli-darwin-x64",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "Run Pi and Claude Code as first-class external harnesses inside Codex Desktop.",
5
5
  "type": "module",
6
6
  "files": [