oh-my-opencode 3.1.3 → 3.1.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.
package/dist/cli/index.js CHANGED
@@ -7380,6 +7380,18 @@ function getCachedVersion() {
7380
7380
  } catch (err) {
7381
7381
  log("[auto-update-checker] Failed to resolve version from current directory:", err);
7382
7382
  }
7383
+ try {
7384
+ const execDir = path5.dirname(fs3.realpathSync(process.execPath));
7385
+ const pkgPath = findPackageJsonUp(execDir);
7386
+ if (pkgPath) {
7387
+ const content = fs3.readFileSync(pkgPath, "utf-8");
7388
+ const pkg = JSON.parse(content);
7389
+ if (pkg.version)
7390
+ return pkg.version;
7391
+ }
7392
+ } catch (err) {
7393
+ log("[auto-update-checker] Failed to resolve version from execPath:", err);
7394
+ }
7383
7395
  return null;
7384
7396
  }
7385
7397
  function updatePinnedVersion(configPath, oldEntry, newVersion) {
@@ -8075,7 +8087,7 @@ var import_picocolors2 = __toESM(require_picocolors(), 1);
8075
8087
  // package.json
8076
8088
  var package_default = {
8077
8089
  name: "oh-my-opencode",
8078
- version: "3.1.3",
8090
+ version: "3.1.4",
8079
8091
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
8080
8092
  main: "dist/index.js",
8081
8093
  types: "dist/index.d.ts",
@@ -8148,13 +8160,13 @@ var package_default = {
8148
8160
  typescript: "^5.7.3"
8149
8161
  },
8150
8162
  optionalDependencies: {
8151
- "oh-my-opencode-darwin-arm64": "3.1.3",
8152
- "oh-my-opencode-darwin-x64": "3.1.3",
8153
- "oh-my-opencode-linux-arm64": "3.1.3",
8154
- "oh-my-opencode-linux-arm64-musl": "3.1.3",
8155
- "oh-my-opencode-linux-x64": "3.1.3",
8156
- "oh-my-opencode-linux-x64-musl": "3.1.3",
8157
- "oh-my-opencode-windows-x64": "3.1.3"
8163
+ "oh-my-opencode-darwin-arm64": "3.1.4",
8164
+ "oh-my-opencode-darwin-x64": "3.1.4",
8165
+ "oh-my-opencode-linux-arm64": "3.1.4",
8166
+ "oh-my-opencode-linux-arm64-musl": "3.1.4",
8167
+ "oh-my-opencode-linux-x64": "3.1.4",
8168
+ "oh-my-opencode-linux-x64-musl": "3.1.4",
8169
+ "oh-my-opencode-windows-x64": "3.1.4"
8158
8170
  },
8159
8171
  trustedDependencies: [
8160
8172
  "@ast-grep/cli",
@@ -23509,7 +23521,7 @@ var GitMasterConfigSchema = exports_external.object({
23509
23521
  commit_footer: exports_external.boolean().default(true),
23510
23522
  include_co_authored_by: exports_external.boolean().default(true)
23511
23523
  });
23512
- var BrowserAutomationProviderSchema = exports_external.enum(["playwright", "agent-browser"]);
23524
+ var BrowserAutomationProviderSchema = exports_external.enum(["playwright", "agent-browser", "dev-browser"]);
23513
23525
  var BrowserAutomationConfigSchema = exports_external.object({
23514
23526
  provider: BrowserAutomationProviderSchema.default("playwright")
23515
23527
  });
@@ -1280,11 +1280,13 @@ export declare const GitMasterConfigSchema: z.ZodObject<{
1280
1280
  export declare const BrowserAutomationProviderSchema: z.ZodEnum<{
1281
1281
  playwright: "playwright";
1282
1282
  "agent-browser": "agent-browser";
1283
+ "dev-browser": "dev-browser";
1283
1284
  }>;
1284
1285
  export declare const BrowserAutomationConfigSchema: z.ZodObject<{
1285
1286
  provider: z.ZodDefault<z.ZodEnum<{
1286
1287
  playwright: "playwright";
1287
1288
  "agent-browser": "agent-browser";
1289
+ "dev-browser": "dev-browser";
1288
1290
  }>>;
1289
1291
  }, z.core.$strip>;
1290
1292
  export declare const TmuxLayoutSchema: z.ZodEnum<{
@@ -2430,6 +2432,7 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
2430
2432
  provider: z.ZodDefault<z.ZodEnum<{
2431
2433
  playwright: "playwright";
2432
2434
  "agent-browser": "agent-browser";
2435
+ "dev-browser": "dev-browser";
2433
2436
  }>>;
2434
2437
  }, z.core.$strip>>;
2435
2438
  tmux: z.ZodOptional<z.ZodObject<{
package/dist/index.js CHANGED
@@ -5330,25 +5330,24 @@ function resolveModelWithFallback(input) {
5330
5330
  if (availableModels.size === 0) {
5331
5331
  const connectedProviders = readConnectedProvidersCache();
5332
5332
  const connectedSet = connectedProviders ? new Set(connectedProviders) : null;
5333
- for (const entry of fallbackChain) {
5334
- for (const provider of entry.providers) {
5335
- if (connectedSet === null || connectedSet.has(provider)) {
5336
- const model2 = `${provider}/${entry.model}`;
5337
- log("Model resolved via fallback chain (no model cache, using connected provider)", {
5338
- provider,
5339
- model: entry.model,
5340
- variant: entry.variant,
5341
- hasConnectedCache: connectedSet !== null
5342
- });
5343
- return { model: model2, source: "provider-fallback", variant: entry.variant };
5333
+ if (connectedSet === null) {
5334
+ log("No cache available, skipping fallback chain to use system default");
5335
+ } else {
5336
+ for (const entry of fallbackChain) {
5337
+ for (const provider of entry.providers) {
5338
+ if (connectedSet.has(provider)) {
5339
+ const model = `${provider}/${entry.model}`;
5340
+ log("Model resolved via fallback chain (no model cache, using connected provider)", {
5341
+ provider,
5342
+ model: entry.model,
5343
+ variant: entry.variant
5344
+ });
5345
+ return { model, source: "provider-fallback", variant: entry.variant };
5346
+ }
5344
5347
  }
5345
5348
  }
5349
+ log("No matching provider in connected cache, falling through to system default");
5346
5350
  }
5347
- const firstEntry = fallbackChain[0];
5348
- const firstProvider = firstEntry.providers[0];
5349
- const model = `${firstProvider}/${firstEntry.model}`;
5350
- log("Model resolved via fallback chain (no cache at all, using first entry)", { provider: firstProvider, model: firstEntry.model, variant: firstEntry.variant });
5351
- return { model, source: "provider-fallback", variant: firstEntry.variant };
5352
5351
  }
5353
5352
  for (const entry of fallbackChain) {
5354
5353
  for (const provider of entry.providers) {
@@ -7274,6 +7273,18 @@ function getCachedVersion() {
7274
7273
  } catch (err) {
7275
7274
  log("[auto-update-checker] Failed to resolve version from current directory:", err);
7276
7275
  }
7276
+ try {
7277
+ const execDir = path5.dirname(fs7.realpathSync(process.execPath));
7278
+ const pkgPath = findPackageJsonUp(execDir);
7279
+ if (pkgPath) {
7280
+ const content = fs7.readFileSync(pkgPath, "utf-8");
7281
+ const pkg = JSON.parse(content);
7282
+ if (pkg.version)
7283
+ return pkg.version;
7284
+ }
7285
+ } catch (err) {
7286
+ log("[auto-update-checker] Failed to resolve version from execPath:", err);
7287
+ }
7277
7288
  return null;
7278
7289
  }
7279
7290
  function updatePinnedVersion(configPath, oldEntry, newVersion) {
@@ -43881,10 +43892,32 @@ If the requested information is not found, clearly state what is missing.`;
43881
43892
  }
43882
43893
  // src/tools/delegate-task/tools.ts
43883
43894
  init_constants4();
43884
- init_hook_message_injector();
43885
43895
  import { existsSync as existsSync46, readdirSync as readdirSync15 } from "fs";
43886
43896
  import { join as join55 } from "path";
43887
43897
 
43898
+ // src/tools/delegate-task/timing.ts
43899
+ var POLL_INTERVAL_MS = 500;
43900
+ var MIN_STABILITY_TIME_MS = 1e4;
43901
+ var STABILITY_POLLS_REQUIRED = 3;
43902
+ var WAIT_FOR_SESSION_INTERVAL_MS = 100;
43903
+ var WAIT_FOR_SESSION_TIMEOUT_MS = 30000;
43904
+ var MAX_POLL_TIME_MS = 10 * 60 * 1000;
43905
+ var SESSION_CONTINUATION_STABILITY_MS = 5000;
43906
+ function getTimingConfig() {
43907
+ return {
43908
+ POLL_INTERVAL_MS,
43909
+ MIN_STABILITY_TIME_MS,
43910
+ STABILITY_POLLS_REQUIRED,
43911
+ WAIT_FOR_SESSION_INTERVAL_MS,
43912
+ WAIT_FOR_SESSION_TIMEOUT_MS,
43913
+ MAX_POLL_TIME_MS,
43914
+ SESSION_CONTINUATION_STABILITY_MS
43915
+ };
43916
+ }
43917
+
43918
+ // src/tools/delegate-task/tools.ts
43919
+ init_hook_message_injector();
43920
+
43888
43921
  // src/features/task-toast-manager/manager.ts
43889
43922
  class TaskToastManager {
43890
43923
  tasks = new Map;
@@ -44349,23 +44382,24 @@ Use \`background_output\` with task_id="${task.id}" to check progress.`;
44349
44382
 
44350
44383
  Session ID: ${args.session_id}`;
44351
44384
  }
44352
- const POLL_INTERVAL_MS = 500;
44353
- const MIN_STABILITY_TIME_MS = 5000;
44354
- const STABILITY_POLLS_REQUIRED = 3;
44385
+ const timing = getTimingConfig();
44386
+ const POLL_INTERVAL_MS2 = timing.POLL_INTERVAL_MS;
44387
+ const MIN_STABILITY_TIME_MS2 = timing.SESSION_CONTINUATION_STABILITY_MS;
44388
+ const STABILITY_POLLS_REQUIRED2 = timing.STABILITY_POLLS_REQUIRED;
44355
44389
  const pollStart = Date.now();
44356
44390
  let lastMsgCount = 0;
44357
44391
  let stablePolls = 0;
44358
44392
  while (Date.now() - pollStart < 60000) {
44359
- await new Promise((resolve10) => setTimeout(resolve10, POLL_INTERVAL_MS));
44393
+ await new Promise((resolve10) => setTimeout(resolve10, POLL_INTERVAL_MS2));
44360
44394
  const elapsed = Date.now() - pollStart;
44361
- if (elapsed < MIN_STABILITY_TIME_MS)
44395
+ if (elapsed < MIN_STABILITY_TIME_MS2)
44362
44396
  continue;
44363
44397
  const messagesCheck = await client2.session.messages({ path: { id: args.session_id } });
44364
44398
  const msgs = messagesCheck.data ?? messagesCheck;
44365
44399
  const currentMsgCount = msgs.length;
44366
44400
  if (currentMsgCount > 0 && currentMsgCount === lastMsgCount) {
44367
44401
  stablePolls++;
44368
- if (stablePolls >= STABILITY_POLLS_REQUIRED)
44402
+ if (stablePolls >= STABILITY_POLLS_REQUIRED2)
44369
44403
  break;
44370
44404
  } else {
44371
44405
  stablePolls = 0;
@@ -44522,16 +44556,16 @@ Available categories: ${categoryNames2.join(", ")}`;
44522
44556
  skills: args.load_skills.length > 0 ? args.load_skills : undefined,
44523
44557
  skillContent: systemContent2
44524
44558
  });
44525
- const WAIT_FOR_SESSION_INTERVAL_MS = 100;
44526
- const WAIT_FOR_SESSION_TIMEOUT_MS = 30000;
44559
+ const WAIT_FOR_SESSION_INTERVAL_MS2 = 100;
44560
+ const WAIT_FOR_SESSION_TIMEOUT_MS2 = 30000;
44527
44561
  const waitStart = Date.now();
44528
- while (!task.sessionID && Date.now() - waitStart < WAIT_FOR_SESSION_TIMEOUT_MS) {
44562
+ while (!task.sessionID && Date.now() - waitStart < WAIT_FOR_SESSION_TIMEOUT_MS2) {
44529
44563
  if (ctx.abort?.aborted) {
44530
44564
  return `Task aborted while waiting for session to start.
44531
44565
 
44532
44566
  Task ID: ${task.id}`;
44533
44567
  }
44534
- await new Promise((resolve10) => setTimeout(resolve10, WAIT_FOR_SESSION_INTERVAL_MS));
44568
+ await new Promise((resolve10) => setTimeout(resolve10, WAIT_FOR_SESSION_INTERVAL_MS2));
44535
44569
  }
44536
44570
  const sessionID = task.sessionID;
44537
44571
  if (!sessionID) {
@@ -44556,20 +44590,21 @@ Task ID: ${task.id}`;
44556
44590
  }
44557
44591
  });
44558
44592
  const startTime = new Date;
44559
- const POLL_INTERVAL_MS = 500;
44560
- const MAX_POLL_TIME_MS = 10 * 60 * 1000;
44561
- const MIN_STABILITY_TIME_MS = 1e4;
44562
- const STABILITY_POLLS_REQUIRED = 3;
44593
+ const timingCfg = getTimingConfig();
44594
+ const POLL_INTERVAL_MS2 = timingCfg.POLL_INTERVAL_MS;
44595
+ const MAX_POLL_TIME_MS2 = timingCfg.MAX_POLL_TIME_MS;
44596
+ const MIN_STABILITY_TIME_MS2 = timingCfg.MIN_STABILITY_TIME_MS;
44597
+ const STABILITY_POLLS_REQUIRED2 = timingCfg.STABILITY_POLLS_REQUIRED;
44563
44598
  const pollStart = Date.now();
44564
44599
  let lastMsgCount = 0;
44565
44600
  let stablePolls = 0;
44566
- while (Date.now() - pollStart < MAX_POLL_TIME_MS) {
44601
+ while (Date.now() - pollStart < MAX_POLL_TIME_MS2) {
44567
44602
  if (ctx.abort?.aborted) {
44568
44603
  return `Task aborted (was running in background mode).
44569
44604
 
44570
44605
  Session ID: ${sessionID}`;
44571
44606
  }
44572
- await new Promise((resolve10) => setTimeout(resolve10, POLL_INTERVAL_MS));
44607
+ await new Promise((resolve10) => setTimeout(resolve10, POLL_INTERVAL_MS2));
44573
44608
  const statusResult = await client2.session.status();
44574
44609
  const allStatuses = statusResult.data ?? {};
44575
44610
  const sessionStatus = allStatuses[sessionID];
@@ -44578,14 +44613,14 @@ Session ID: ${sessionID}`;
44578
44613
  lastMsgCount = 0;
44579
44614
  continue;
44580
44615
  }
44581
- if (Date.now() - pollStart < MIN_STABILITY_TIME_MS)
44616
+ if (Date.now() - pollStart < MIN_STABILITY_TIME_MS2)
44582
44617
  continue;
44583
44618
  const messagesCheck = await client2.session.messages({ path: { id: sessionID } });
44584
44619
  const msgs = messagesCheck.data ?? messagesCheck;
44585
44620
  const currentMsgCount = msgs.length;
44586
44621
  if (currentMsgCount === lastMsgCount) {
44587
44622
  stablePolls++;
44588
- if (stablePolls >= STABILITY_POLLS_REQUIRED)
44623
+ if (stablePolls >= STABILITY_POLLS_REQUIRED2)
44589
44624
  break;
44590
44625
  } else {
44591
44626
  stablePolls = 0;
@@ -44812,16 +44847,17 @@ To continue this session: session_id="${task.sessionID}"`;
44812
44847
  category: args.category
44813
44848
  });
44814
44849
  }
44815
- const POLL_INTERVAL_MS = 500;
44816
- const MAX_POLL_TIME_MS = 10 * 60 * 1000;
44817
- const MIN_STABILITY_TIME_MS = 1e4;
44818
- const STABILITY_POLLS_REQUIRED = 3;
44850
+ const syncTiming = getTimingConfig();
44851
+ const POLL_INTERVAL_MS2 = syncTiming.POLL_INTERVAL_MS;
44852
+ const MAX_POLL_TIME_MS2 = syncTiming.MAX_POLL_TIME_MS;
44853
+ const MIN_STABILITY_TIME_MS2 = syncTiming.MIN_STABILITY_TIME_MS;
44854
+ const STABILITY_POLLS_REQUIRED2 = syncTiming.STABILITY_POLLS_REQUIRED;
44819
44855
  const pollStart = Date.now();
44820
44856
  let lastMsgCount = 0;
44821
44857
  let stablePolls = 0;
44822
44858
  let pollCount = 0;
44823
44859
  log("[delegate_task] Starting poll loop", { sessionID, agentToUse });
44824
- while (Date.now() - pollStart < MAX_POLL_TIME_MS) {
44860
+ while (Date.now() - pollStart < MAX_POLL_TIME_MS2) {
44825
44861
  if (ctx.abort?.aborted) {
44826
44862
  log("[delegate_task] Aborted by user", { sessionID });
44827
44863
  if (toastManager && taskId)
@@ -44830,7 +44866,7 @@ To continue this session: session_id="${task.sessionID}"`;
44830
44866
 
44831
44867
  Session ID: ${sessionID}`;
44832
44868
  }
44833
- await new Promise((resolve10) => setTimeout(resolve10, POLL_INTERVAL_MS));
44869
+ await new Promise((resolve10) => setTimeout(resolve10, POLL_INTERVAL_MS2));
44834
44870
  pollCount++;
44835
44871
  const statusResult = await client2.session.status();
44836
44872
  const allStatuses = statusResult.data ?? {};
@@ -44851,7 +44887,7 @@ Session ID: ${sessionID}`;
44851
44887
  continue;
44852
44888
  }
44853
44889
  const elapsed = Date.now() - pollStart;
44854
- if (elapsed < MIN_STABILITY_TIME_MS) {
44890
+ if (elapsed < MIN_STABILITY_TIME_MS2) {
44855
44891
  continue;
44856
44892
  }
44857
44893
  const messagesCheck = await client2.session.messages({ path: { id: sessionID } });
@@ -44859,7 +44895,7 @@ Session ID: ${sessionID}`;
44859
44895
  const currentMsgCount = msgs.length;
44860
44896
  if (currentMsgCount === lastMsgCount) {
44861
44897
  stablePolls++;
44862
- if (stablePolls >= STABILITY_POLLS_REQUIRED) {
44898
+ if (stablePolls >= STABILITY_POLLS_REQUIRED2) {
44863
44899
  log("[delegate_task] Poll complete - messages stable", { sessionID, pollCount, currentMsgCount });
44864
44900
  break;
44865
44901
  }
@@ -44868,7 +44904,7 @@ Session ID: ${sessionID}`;
44868
44904
  lastMsgCount = currentMsgCount;
44869
44905
  }
44870
44906
  }
44871
- if (Date.now() - pollStart >= MAX_POLL_TIME_MS) {
44907
+ if (Date.now() - pollStart >= MAX_POLL_TIME_MS2) {
44872
44908
  log("[delegate_task] Poll timeout reached", { sessionID, pollCount, lastMsgCount, stablePolls });
44873
44909
  }
44874
44910
  const messagesResult = await client2.session.messages({
@@ -45054,7 +45090,7 @@ init_hook_message_injector();
45054
45090
  import { existsSync as existsSync47, readdirSync as readdirSync16 } from "fs";
45055
45091
  import { join as join56 } from "path";
45056
45092
  var TASK_TTL_MS = 30 * 60 * 1000;
45057
- var MIN_STABILITY_TIME_MS = 10 * 1000;
45093
+ var MIN_STABILITY_TIME_MS2 = 10 * 1000;
45058
45094
  var DEFAULT_STALE_TIMEOUT_MS = 180000;
45059
45095
  var MIN_RUNTIME_BEFORE_STALE_MS = 30000;
45060
45096
 
@@ -45994,7 +46030,7 @@ Use \`background_output(task_id="${task.id}")\` to retrieve this result when rea
45994
46030
  if (!startedAt)
45995
46031
  continue;
45996
46032
  const elapsedMs = Date.now() - startedAt.getTime();
45997
- if (elapsedMs >= MIN_STABILITY_TIME_MS) {
46033
+ if (elapsedMs >= MIN_STABILITY_TIME_MS2) {
45998
46034
  if (task.lastMsgCount === currentMsgCount) {
45999
46035
  task.stablePolls = (task.stablePolls ?? 0) + 1;
46000
46036
  if (task.stablePolls >= 3) {
@@ -51233,7 +51269,7 @@ var GitMasterConfigSchema = exports_external.object({
51233
51269
  commit_footer: exports_external.boolean().default(true),
51234
51270
  include_co_authored_by: exports_external.boolean().default(true)
51235
51271
  });
51236
- var BrowserAutomationProviderSchema = exports_external.enum(["playwright", "agent-browser"]);
51272
+ var BrowserAutomationProviderSchema = exports_external.enum(["playwright", "agent-browser", "dev-browser"]);
51237
51273
  var BrowserAutomationConfigSchema = exports_external.object({
51238
51274
  provider: BrowserAutomationProviderSchema.default("playwright")
51239
51275
  });
@@ -56429,6 +56465,16 @@ var OhMyOpenCodePlugin = async (ctx) => {
56429
56465
  await claudeCodeHooks["chat.message"]?.(input, output);
56430
56466
  await autoSlashCommand?.["chat.message"]?.(input, output);
56431
56467
  await startWork?.["chat.message"]?.(input, output);
56468
+ if (!hasConnectedProvidersCache()) {
56469
+ ctx.client.tui.showToast({
56470
+ body: {
56471
+ title: "\u26A0\uFE0F Provider Cache Missing",
56472
+ message: "Model filtering disabled. RESTART OpenCode to enable full functionality.",
56473
+ variant: "warning",
56474
+ duration: 6000
56475
+ }
56476
+ }).catch(() => {});
56477
+ }
56432
56478
  if (ralphLoop) {
56433
56479
  const parts = output.parts;
56434
56480
  const promptText = parts?.filter((p) => p.type === "text" && p.text).map((p) => p.text).join(`
@@ -0,0 +1,11 @@
1
+ export declare function getTimingConfig(): {
2
+ POLL_INTERVAL_MS: number;
3
+ MIN_STABILITY_TIME_MS: number;
4
+ STABILITY_POLLS_REQUIRED: number;
5
+ WAIT_FOR_SESSION_INTERVAL_MS: number;
6
+ WAIT_FOR_SESSION_TIMEOUT_MS: number;
7
+ MAX_POLL_TIME_MS: number;
8
+ SESSION_CONTINUATION_STABILITY_MS: number;
9
+ };
10
+ export declare function __resetTimingConfig(): void;
11
+ export declare function __setTimingConfig(overrides: Partial<ReturnType<typeof getTimingConfig>>): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "3.1.3",
3
+ "version": "3.1.4",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -73,13 +73,13 @@
73
73
  "typescript": "^5.7.3"
74
74
  },
75
75
  "optionalDependencies": {
76
- "oh-my-opencode-darwin-arm64": "3.1.3",
77
- "oh-my-opencode-darwin-x64": "3.1.3",
78
- "oh-my-opencode-linux-arm64": "3.1.3",
79
- "oh-my-opencode-linux-arm64-musl": "3.1.3",
80
- "oh-my-opencode-linux-x64": "3.1.3",
81
- "oh-my-opencode-linux-x64-musl": "3.1.3",
82
- "oh-my-opencode-windows-x64": "3.1.3"
76
+ "oh-my-opencode-darwin-arm64": "3.1.4",
77
+ "oh-my-opencode-darwin-x64": "3.1.4",
78
+ "oh-my-opencode-linux-arm64": "3.1.4",
79
+ "oh-my-opencode-linux-arm64-musl": "3.1.4",
80
+ "oh-my-opencode-linux-x64": "3.1.4",
81
+ "oh-my-opencode-linux-x64-musl": "3.1.4",
82
+ "oh-my-opencode-windows-x64": "3.1.4"
83
83
  },
84
84
  "trustedDependencies": [
85
85
  "@ast-grep/cli",