@codexhost/cli-darwin-x64 0.3.3 → 0.3.5

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
  }
@@ -15003,7 +15014,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15003
15014
  productUsage: external_exports.array(accountCreditsProductUsageSchema).min(1).optional()
15004
15015
  }).strict();
15005
15016
  var threadUsageInspectionParamsSchema = external_exports.object({
15006
- threadId: hostThreadIdSchema
15017
+ threadId: hostThreadIdSchema,
15018
+ refresh: external_exports.literal("exact").optional()
15007
15019
  }).strict();
15008
15020
  var threadUsageInspectionSchema = external_exports.object({
15009
15021
  threadId: hostThreadIdSchema,
@@ -15416,13 +15428,17 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15416
15428
  // src/assets/grok-agent.png
15417
15429
  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
15430
 
15431
+ // src/assets/omp-agent.svg
15432
+ 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';
15433
+
15419
15434
  // src/renderer-agent-icon.ts
15420
15435
  var RENDERER_AGENT_LABELS = {
15421
15436
  codex: "Codex",
15422
15437
  pi: "Pi",
15423
15438
  "claude-code": "Claude Code",
15424
15439
  "deepseek-harness": "DeepSeek Harness",
15425
- grok: "Grok"
15440
+ grok: "Grok",
15441
+ omp: "Oh My Pi"
15426
15442
  };
15427
15443
  var PI_PATHS = [
15428
15444
  {
@@ -15474,6 +15490,18 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15474
15490
  "0 0 23.16 17.04"
15475
15491
  );
15476
15492
  }
15493
+ if (agent === "omp") {
15494
+ const image = ownerDocument.createElement("img");
15495
+ image.src = omp_agent_default;
15496
+ image.alt = "";
15497
+ image.draggable = false;
15498
+ image.style.width = `${size}px`;
15499
+ image.style.height = `${size}px`;
15500
+ image.style.objectFit = "contain";
15501
+ image.style.borderRadius = "22.37%";
15502
+ image.style.flex = "none";
15503
+ return image;
15504
+ }
15477
15505
  const mark = ownerDocument.createElement("img");
15478
15506
  mark.src = grok_agent_default;
15479
15507
  mark.alt = "";
@@ -15491,7 +15519,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
15491
15519
  pi: "https://pi.dev/",
15492
15520
  "claude-code": "https://code.claude.com/docs/en/quickstart",
15493
15521
  "deepseek-harness": "https://github.com/deepseek-ai/deepseek-harness",
15494
- grok: "https://grok.com/"
15522
+ grok: "https://grok.com/",
15523
+ omp: "https://github.com/can1357/oh-my-pi"
15495
15524
  };
15496
15525
  var CONTROL_ATTRIBUTE = "data-codexhost-agent-control";
15497
15526
  var AGENT_MENU_WIDTH = 200;
@@ -16975,12 +17004,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
16975
17004
  control.trigger.setAttribute("aria-expanded", "false");
16976
17005
  }
16977
17006
  function openPopover(control) {
17007
+ const wasOpen = control.trigger.getAttribute("aria-expanded") === "true";
16978
17008
  positionPopover(control);
16979
17009
  control.popover.hidden = false;
16980
17010
  if (typeof control.popover.showPopover === "function" && !popoverIsOpen(control.popover)) {
16981
17011
  control.popover.showPopover();
16982
17012
  }
16983
17013
  control.trigger.setAttribute("aria-expanded", "true");
17014
+ if (!wasOpen) control.onOpen?.();
16984
17015
  }
16985
17016
  function togglePopover(control) {
16986
17017
  if (control.trigger.getAttribute("aria-expanded") === "true") closePopover(control);
@@ -17045,6 +17076,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
17045
17076
  popover,
17046
17077
  anchor: null,
17047
17078
  label,
17079
+ onOpen: null,
17048
17080
  dispose() {
17049
17081
  closePopover(control);
17050
17082
  if (closeTimer !== null) window.clearTimeout(closeTimer);
@@ -17971,7 +18003,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
17971
18003
  function usagePlacementAnchor(control) {
17972
18004
  const context = control.nativeContextUsageControl?.element;
17973
18005
  const contextWrapper = context?.parentElement;
17974
- return contextWrapper?.parentElement ? contextWrapper : null;
18006
+ if (contextWrapper?.parentElement) return contextWrapper;
18007
+ const modelRoot = control.modelPicker?.root;
18008
+ return modelRoot?.parentElement ? modelRoot : null;
17975
18009
  }
17976
18010
  function creditsPlacementAnchor(control) {
17977
18011
  const root = control.permissionModePicker?.root;
@@ -18219,6 +18253,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18219
18253
  if (ownership.harnessId === "claude-code") return "claude-code";
18220
18254
  if (ownership.harnessId === "deepseek-harness") return "deepseek-harness";
18221
18255
  if (ownership.harnessId === "grok") return "grok";
18256
+ if (ownership.harnessId === "omp") return "omp";
18222
18257
  return null;
18223
18258
  }
18224
18259
  var BrowserSidebarAgentIconRow = class {
@@ -18594,7 +18629,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18594
18629
  pending.add(key);
18595
18630
  void client.inspectThread({ threadId: target.threadId }).then(async (inspection) => {
18596
18631
  if (disposed) return;
18597
- if (inspection.owner === "codex" || !inspection.history.fork || !target.isProjectlessConversation && inspection.history.forkAcrossCwd) {
18632
+ if (inspection.owner === "codex" || !inspection.history.fork || !target.isProjectlessConversation) {
18598
18633
  dom.replay(target);
18599
18634
  return;
18600
18635
  }
@@ -18627,6 +18662,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18627
18662
  var THREAD_PERMISSION_MODE_SELECT_METHOD = "codexhost/thread/permission-mode/select";
18628
18663
  var THREAD_OWNERSHIP_LIST_METHOD = "codexhost/thread/ownership/list";
18629
18664
  var THREAD_USAGE_INSPECT_METHOD = "codexhost/thread/usage/inspect";
18665
+ var THREAD_USAGE_UPDATED_METHOD = "codexhost/thread/usage/updated";
18630
18666
  var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
18631
18667
  var UPDATE_CHECK_METHOD = "codexhost/update/check";
18632
18668
  var UPDATE_START_METHOD = "codexhost/update/start";
@@ -18635,7 +18671,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18635
18671
  return typeof value === "object" && value !== null && !Array.isArray(value);
18636
18672
  }
18637
18673
  function notifiedThreadId(notification) {
18638
- if (!isRecord4(notification) || notification.method !== THREAD_TOKEN_USAGE_UPDATED_METHOD) {
18674
+ if (!isRecord4(notification) || notification.method !== THREAD_TOKEN_USAGE_UPDATED_METHOD && notification.method !== THREAD_USAGE_UPDATED_METHOD) {
18639
18675
  return null;
18640
18676
  }
18641
18677
  const params = notification.params;
@@ -18751,7 +18787,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18751
18787
  let disposed = false;
18752
18788
  const generations = /* @__PURE__ */ new Map();
18753
18789
  const removeNotificationCallback = notifications.addNotificationCallback(
18754
- THREAD_TOKEN_USAGE_UPDATED_METHOD,
18790
+ [THREAD_TOKEN_USAGE_UPDATED_METHOD, THREAD_USAGE_UPDATED_METHOD],
18755
18791
  (notification) => {
18756
18792
  const threadId = notifiedThreadId(notification);
18757
18793
  if (!threadId) return;
@@ -18805,6 +18841,8 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18805
18841
  var DEEPSEEK_HARNESS_TRANSPORT_MODEL_PREFIX = `${DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID}@`;
18806
18842
  var GROK_TRANSPORT_MODEL_ID = "codexhost/grok-native";
18807
18843
  var GROK_TRANSPORT_MODEL_PREFIX = `${GROK_TRANSPORT_MODEL_ID}@`;
18844
+ var OMP_TRANSPORT_MODEL_ID = "codexhost/omp-native";
18845
+ var OMP_TRANSPORT_MODEL_PREFIX = `${OMP_TRANSPORT_MODEL_ID}@`;
18808
18846
  function transitionRendererAdapterStatus(current, next, publish) {
18809
18847
  if (current.state === next.state && current.reason === next.reason && current.hook === next.hook) {
18810
18848
  return false;
@@ -18822,6 +18860,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18822
18860
  if (agent === "claude-code") return CLAUDE_CODE_TRANSPORT_MODEL_ID;
18823
18861
  if (agent === "deepseek-harness") return DEEPSEEK_HARNESS_TRANSPORT_MODEL_ID;
18824
18862
  if (agent === "grok") return GROK_TRANSPORT_MODEL_ID;
18863
+ if (agent === "omp") return OMP_TRANSPORT_MODEL_ID;
18825
18864
  return null;
18826
18865
  }
18827
18866
  function isRecord5(value) {
@@ -18836,6 +18875,15 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18836
18875
  const parsedThinking = thinkingOptionId ? harnessThinkingOptionIdSchema.parse(thinkingOptionId) : void 0;
18837
18876
  return `${PI_TRANSPORT_MODEL_PREFIX}${parsedModel.id}${parsedThinking ? `@${parsedThinking}` : ""}`;
18838
18877
  }
18878
+ function ompTransportModelId(model, thinkingOptionId) {
18879
+ if (!model) {
18880
+ if (thinkingOptionId) throw new Error("OMP transport Thinking requires a Model Ref");
18881
+ return OMP_TRANSPORT_MODEL_ID;
18882
+ }
18883
+ const parsedModel = harnessModelRefSchema.parse(model);
18884
+ const parsedThinking = thinkingOptionId ? harnessThinkingOptionIdSchema.parse(thinkingOptionId) : void 0;
18885
+ return `${OMP_TRANSPORT_MODEL_PREFIX}${parsedModel.id}${parsedThinking ? `@${parsedThinking}` : ""}`;
18886
+ }
18839
18887
  function claudeTransportModelId(model, permissionModeId, thinkingOptionId) {
18840
18888
  if (!model) {
18841
18889
  if (permissionModeId || thinkingOptionId) {
@@ -18938,6 +18986,19 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
18938
18986
  ...thinking?.success ? { thinkingOptionId: thinking.data } : {}
18939
18987
  };
18940
18988
  }
18989
+ function decodeOmpTransportModelId(value) {
18990
+ if (value === OMP_TRANSPORT_MODEL_ID) return {};
18991
+ if (typeof value !== "string" || !value.startsWith(OMP_TRANSPORT_MODEL_PREFIX)) return null;
18992
+ const components = value.slice(OMP_TRANSPORT_MODEL_PREFIX.length).split("@");
18993
+ if (components.length < 1 || components.length > 2) return null;
18994
+ const [modelId, thinkingOptionId] = components;
18995
+ if (components.length === 2 && !thinkingOptionId) return null;
18996
+ const model = harnessModelRefSchema.safeParse({ id: modelId });
18997
+ if (!model.success) return null;
18998
+ const thinking = thinkingOptionId ? harnessThinkingOptionIdSchema.safeParse(thinkingOptionId) : null;
18999
+ if (thinking && !thinking.success) return null;
19000
+ return { model: model.data, ...thinking?.success ? { thinkingOptionId: thinking.data } : {} };
19001
+ }
18941
19002
  function threadIdFromComposerModelTarget(target) {
18942
19003
  if (target?.[0] !== "conversation" || typeof target[1] !== "string" || target[1].trim().length === 0) {
18943
19004
  return null;
@@ -19124,7 +19185,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
19124
19185
  }
19125
19186
  }
19126
19187
  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);
19188
+ 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
19189
  return transportModelId ? { model: transportModelId, reasoningEffort } : officialSelection;
19129
19190
  }
19130
19191
  function installCurrentRendererAdapter() {
@@ -21147,7 +21208,8 @@ ${error51.stderrTail}`] : []
21147
21208
 
21148
21209
  // src/settings/trigger.ts
21149
21210
  var SETTINGS_TRIGGER_ATTRIBUTE = "data-codexhost-settings-trigger";
21150
- var SETTINGS_HEADER_SURFACE_SELECTOR = '[data-testid="app-shell-header-context-menu-surface"]';
21211
+ var SETTINGS_APPLICATION_HEADER_SELECTOR = 'header[data-pip-obstacle="app-shell-header"]';
21212
+ var SETTINGS_HEADER_SLOT_SELECTOR = ':scope > [data-test-id="header-shell-slot"]';
21151
21213
  function measuredBounds(element) {
21152
21214
  const bounds = element.getBoundingClientRect();
21153
21215
  return {
@@ -21159,38 +21221,16 @@ ${error51.stderrTail}`] : []
21159
21221
  height: bounds.height
21160
21222
  };
21161
21223
  }
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
21224
  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;
21225
+ const header = ownerDocument.querySelector(SETTINGS_APPLICATION_HEADER_SELECTOR);
21226
+ if (!header) return null;
21227
+ const headerBounds = measuredBounds(header);
21228
+ if (headerBounds.width <= 0 || headerBounds.height <= 0) return null;
21229
+ const endSlot = [...header.querySelectorAll(SETTINGS_HEADER_SLOT_SELECTOR)].filter((slot) => {
21230
+ const bounds = measuredBounds(slot);
21231
+ return bounds.width > 0 && bounds.height > 0;
21232
+ }).toSorted((left, right) => measuredBounds(right).left - measuredBounds(left).left)[0];
21233
+ return endSlot ? { parent: header, before: endSlot } : null;
21194
21234
  }
21195
21235
  function mountRendererSettingsTrigger(triggerId, available, onOpen, ownerDocument = document, messages = DEFAULT_RENDERER_SETTINGS_MESSAGES) {
21196
21236
  const root = ownerDocument.createElement("div");
@@ -21318,23 +21358,27 @@ ${error51.stderrTail}`] : []
21318
21358
  let disposed = false;
21319
21359
  const refresh = () => {
21320
21360
  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
21361
  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);
21362
+ if (!insertionPoint) {
21363
+ trigger?.root.remove();
21364
+ return false;
21365
+ }
21366
+ if (!trigger) {
21367
+ for (const duplicate of ownerDocument.querySelectorAll(`[${SETTINGS_TRIGGER_ATTRIBUTE}]`)) {
21368
+ duplicate.remove();
21369
+ }
21370
+ trigger = mountRendererSettingsTrigger(
21371
+ "application-header",
21372
+ options.available,
21373
+ options.onOpen,
21374
+ ownerDocument,
21375
+ options.messages
21376
+ );
21377
+ trigger.setUpdateAvailable(updateAvailable);
21378
+ }
21379
+ if (trigger.root.parentElement !== insertionPoint.parent || trigger.root.nextSibling !== insertionPoint.before) {
21380
+ insertionPoint.parent.insertBefore(trigger.root, insertionPoint.before);
21381
+ }
21338
21382
  return true;
21339
21383
  };
21340
21384
  refresh();
@@ -21522,35 +21566,20 @@ ${error51.stderrTail}`] : []
21522
21566
  };
21523
21567
  }
21524
21568
 
21525
- // src/compatibility-update.ts
21526
- async function startCompatibilityUpdate(client) {
21527
- if (!client) return "unavailable";
21528
- try {
21529
- const check2 = await client.checkUpdate();
21530
- if (check2.updateAvailable && check2.installationAvailable) {
21531
- void client.startUpdate().catch(() => void 0);
21532
- return "update-started";
21533
- }
21534
- if (check2.error === null && check2.latestVersion !== null && check2.currentVersion === check2.latestVersion) {
21535
- return "current";
21536
- }
21537
- } catch {
21538
- }
21539
- return "unavailable";
21540
- }
21541
-
21542
21569
  // src/renderer-binding-probe.ts
21543
21570
  var externalHarnessIds = {
21544
21571
  pi: harnessIdSchema.parse("pi"),
21545
21572
  "claude-code": harnessIdSchema.parse("claude-code"),
21546
21573
  "deepseek-harness": harnessIdSchema.parse("deepseek-harness"),
21547
- grok: harnessIdSchema.parse("grok")
21574
+ grok: harnessIdSchema.parse("grok"),
21575
+ omp: harnessIdSchema.parse("omp")
21548
21576
  };
21549
21577
  var externalAgents = [
21550
21578
  "pi",
21551
21579
  "claude-code",
21552
21580
  "deepseek-harness",
21553
- "grok"
21581
+ "grok",
21582
+ "omp"
21554
21583
  ];
21555
21584
  function isRetryableHarnessAvailability(availability, error51) {
21556
21585
  return availability !== void 0 && availability !== "ready" && availability !== "notInstalled" && error51?.retryable === true;
@@ -21624,6 +21653,17 @@ ${error51.stderrTail}`] : []
21624
21653
  ...permissionModeId ? { permissionModeId } : {}
21625
21654
  };
21626
21655
  }
21656
+ if (inspection.harnessId === "omp") {
21657
+ const transportSelection = decodeOmpTransportModelId(inspection.transportModelId);
21658
+ if (!transportSelection) throw new Error("OMP Thread reported an incompatible transport Model");
21659
+ const model = inspection.effectiveModel ?? transportSelection.model;
21660
+ const thinkingOptionId = selectableThinkingOptionId(inspection) ?? transportSelection.thinkingOptionId;
21661
+ return {
21662
+ agent: "omp",
21663
+ ...model ? { model } : {},
21664
+ ...thinkingOptionId ? { thinkingOptionId } : {}
21665
+ };
21666
+ }
21627
21667
  if (inspection.harnessId === "claude-code") {
21628
21668
  const transportSelection = decodeClaudeTransportModelId(inspection.transportModelId);
21629
21669
  if (!transportSelection) {
@@ -21768,7 +21808,8 @@ ${error51.stderrTail}`] : []
21768
21808
  pi: void 0,
21769
21809
  "claude-code": void 0,
21770
21810
  "deepseek-harness": void 0,
21771
- grok: void 0
21811
+ grok: void 0,
21812
+ omp: void 0
21772
21813
  },
21773
21814
  requestGeneration: 0,
21774
21815
  request: null,
@@ -21832,6 +21873,12 @@ ${error51.stderrTail}`] : []
21832
21873
  mounted.usage,
21833
21874
  mounted.accountCredits
21834
21875
  );
21876
+ if (mounted.control.usage) {
21877
+ mounted.control.usage.onOpen = () => {
21878
+ if (controller.get(mounted.composer).agent === "codex") return;
21879
+ void refreshThreadUsage(mounted, "exact");
21880
+ };
21881
+ }
21835
21882
  };
21836
21883
  const refreshCommands = async (mounted) => {
21837
21884
  const state = controller.get(mounted.composer);
@@ -21877,7 +21924,7 @@ ${error51.stderrTail}`] : []
21877
21924
  renderMounted(mounted);
21878
21925
  }
21879
21926
  };
21880
- const refreshThreadUsage = async (mounted) => {
21927
+ const refreshThreadUsage = async (mounted, refresh) => {
21881
21928
  const threadId = threadIdFromComposerModelTarget(mounted.modelTarget);
21882
21929
  if (!threadId || !modelControl) {
21883
21930
  mounted.usage = null;
@@ -21888,7 +21935,10 @@ ${error51.stderrTail}`] : []
21888
21935
  }
21889
21936
  const generation = ++mounted.usageRequestGeneration;
21890
21937
  try {
21891
- const result = await modelControl.inspectThreadUsage({ threadId });
21938
+ const result = await modelControl.inspectThreadUsage({
21939
+ threadId,
21940
+ ...refresh ? { refresh } : {}
21941
+ });
21892
21942
  if (disposed || mountedByComposer.get(mounted.composer) !== mounted || !mounted.composer.isConnected || mounted.usageRequestGeneration !== generation || threadIdFromComposerModelTarget(mounted.modelTarget) !== threadId || result.threadId !== threadId) {
21893
21943
  return;
21894
21944
  }
@@ -23205,9 +23255,6 @@ ${error51.stderrTail}`] : []
23205
23255
  ...permissionModeId ? { permissionModeId } : {}
23206
23256
  };
23207
23257
  },
23208
- requestCompatibilityUpdate() {
23209
- return startCompatibilityUpdate(modelControl);
23210
- },
23211
23258
  setAdapter(status, dispose, applyAgent, nextModelControl) {
23212
23259
  usageNotificationDispose?.();
23213
23260
  usageNotificationDispose = 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.5",
4
4
  "description": "Run Pi and Claude Code as first-class external harnesses inside Codex Desktop.",
5
5
  "type": "module",
6
6
  "files": [