oh-my-openagent 5.1.34 → 5.1.35

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 (66) hide show
  1. package/dist/cli/index.js +116 -45
  2. package/dist/cli-node/index.js +116 -45
  3. package/dist/index.js +14 -14
  4. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  5. package/dist/skills/ulw-research/references/report-gates.md +1 -1
  6. package/dist/skills/ulw-research/scripts/gates-figures.mjs +22 -6
  7. package/dist/skills/ulw-research/scripts/gates-static.test.ts +13 -0
  8. package/dist/tui.js +13 -13
  9. package/package.json +13 -13
  10. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  11. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  12. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  14. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  18. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  20. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  21. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  23. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2 -1
  27. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2 -1
  28. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  33. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  35. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  57. package/packages/omo-codex/plugin/package-lock.json +12 -12
  58. package/packages/omo-codex/plugin/package.json +1 -1
  59. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  60. package/packages/omo-codex/plugin/skills/ulw-research/references/report-gates.md +1 -1
  61. package/packages/omo-codex/plugin/skills/ulw-research/scripts/gates-figures.mjs +22 -6
  62. package/packages/omo-codex/scripts/install-dist/install-local.mjs +50 -3
  63. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  64. package/packages/shared-skills/skills/ulw-research/references/report-gates.md +1 -1
  65. package/packages/shared-skills/skills/ulw-research/scripts/gates-figures.mjs +22 -6
  66. package/packages/shared-skills/skills/ulw-research/scripts/gates-static.test.ts +13 -0
package/dist/cli/index.js CHANGED
@@ -2132,7 +2132,7 @@ var package_default;
2132
2132
  var init_package = __esm(() => {
2133
2133
  package_default = {
2134
2134
  name: "oh-my-opencode",
2135
- version: "5.1.34",
2135
+ version: "5.1.35",
2136
2136
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2137
2137
  main: "./dist/index.js",
2138
2138
  types: "dist/index.d.ts",
@@ -2368,18 +2368,18 @@ var init_package = __esm(() => {
2368
2368
  typescript: "^7.0.2"
2369
2369
  },
2370
2370
  optionalDependencies: {
2371
- "oh-my-opencode-darwin-arm64": "5.1.34",
2372
- "oh-my-opencode-darwin-x64": "5.1.34",
2373
- "oh-my-opencode-darwin-x64-baseline": "5.1.34",
2374
- "oh-my-opencode-linux-arm64": "5.1.34",
2375
- "oh-my-opencode-linux-arm64-musl": "5.1.34",
2376
- "oh-my-opencode-linux-x64": "5.1.34",
2377
- "oh-my-opencode-linux-x64-baseline": "5.1.34",
2378
- "oh-my-opencode-linux-x64-musl": "5.1.34",
2379
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.34",
2380
- "oh-my-opencode-windows-arm64": "5.1.34",
2381
- "oh-my-opencode-windows-x64": "5.1.34",
2382
- "oh-my-opencode-windows-x64-baseline": "5.1.34"
2371
+ "oh-my-opencode-darwin-arm64": "5.1.35",
2372
+ "oh-my-opencode-darwin-x64": "5.1.35",
2373
+ "oh-my-opencode-darwin-x64-baseline": "5.1.35",
2374
+ "oh-my-opencode-linux-arm64": "5.1.35",
2375
+ "oh-my-opencode-linux-arm64-musl": "5.1.35",
2376
+ "oh-my-opencode-linux-x64": "5.1.35",
2377
+ "oh-my-opencode-linux-x64-baseline": "5.1.35",
2378
+ "oh-my-opencode-linux-x64-musl": "5.1.35",
2379
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.35",
2380
+ "oh-my-opencode-windows-arm64": "5.1.35",
2381
+ "oh-my-opencode-windows-x64": "5.1.35",
2382
+ "oh-my-opencode-windows-x64-baseline": "5.1.35"
2383
2383
  },
2384
2384
  overrides: {
2385
2385
  hono: "^4.13.8",
@@ -82307,6 +82307,9 @@ var init_activity_state = __esm(() => {
82307
82307
  capturedDaysByStateDir = new Map;
82308
82308
  });
82309
82309
 
82310
+ // packages/telemetry-core/src/consent-gated-fetch.ts
82311
+ var init_consent_gated_fetch = () => {};
82312
+
82310
82313
  // packages/telemetry-core/src/constants.ts
82311
82314
  var DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com", DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74", UNCONFIGURED_POSTHOG_API_KEY = "phc_REPLACE_ME_OMO_NATIVE";
82312
82315
 
@@ -82354,6 +82357,7 @@ function toDiagnosticRecord(input, now) {
82354
82357
  timestamp: now.toISOString(),
82355
82358
  event: input.event,
82356
82359
  source: input.source,
82360
+ ...input.count === undefined ? {} : { count: input.count },
82357
82361
  ...serializeError(input.error, input.errorKind)
82358
82362
  };
82359
82363
  }
@@ -82446,7 +82450,7 @@ function shouldDisableTelemetry(input) {
82446
82450
  const env = input.env ?? process.env;
82447
82451
  const globalPrefix = input.globalEnvPrefix ?? "OMO";
82448
82452
  const prefixes = Array.from(new Set([globalPrefix, input.productEnvPrefix]));
82449
- if (isDisableFlag(env["DO_NOT_TRACK"])) {
82453
+ if (isDisableFlag(env["DO_NOT_TRACK"]) || isDisableFlag(env[`${globalPrefix}_DISABLE_TELEMETRY`])) {
82450
82454
  return true;
82451
82455
  }
82452
82456
  for (const prefix of prefixes) {
@@ -82478,6 +82482,47 @@ var init_env = __esm(() => {
82478
82482
  SEND_OPT_OUT_VALUES = ["0", "false", "no", "yes"];
82479
82483
  });
82480
82484
 
82485
+ // packages/telemetry-core/src/event-id.ts
82486
+ import { randomBytes as nodeRandomBytes } from "crypto";
82487
+ function createUuidV7Generator(source = {}) {
82488
+ const now = source.now ?? Date.now;
82489
+ const randomBytes = source.randomBytes ?? ((size) => new Uint8Array(nodeRandomBytes(size)));
82490
+ let lastMs = -1;
82491
+ let counter = 0;
82492
+ return () => {
82493
+ const random = randomBytes(10);
82494
+ const wallMs = Math.floor(now());
82495
+ if (wallMs > lastMs) {
82496
+ lastMs = wallMs;
82497
+ counter = (random[0] << 8 | random[1]) & COUNTER_SEED_MASK;
82498
+ } else if (counter < MAX_COUNTER) {
82499
+ counter += 1;
82500
+ } else {
82501
+ lastMs += 1;
82502
+ counter = (random[0] << 8 | random[1]) & COUNTER_SEED_MASK;
82503
+ }
82504
+ const bytes = new Uint8Array(16);
82505
+ let timestamp = lastMs;
82506
+ for (let index = 5;index >= 0; index -= 1) {
82507
+ bytes[index] = timestamp % 256;
82508
+ timestamp = Math.floor(timestamp / 256);
82509
+ }
82510
+ bytes[6] = 112 | counter >> 8;
82511
+ bytes[7] = counter & 255;
82512
+ bytes[8] = 128 | random[2] & 63;
82513
+ bytes.set(random.subarray(3, 10), 9);
82514
+ return formatUuid(bytes);
82515
+ };
82516
+ }
82517
+ function formatUuid(bytes) {
82518
+ const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
82519
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
82520
+ }
82521
+ var MAX_COUNTER = 4095, COUNTER_SEED_MASK = 2047, fallbackEventId;
82522
+ var init_event_id = __esm(() => {
82523
+ fallbackEventId = createUuidV7Generator();
82524
+ });
82525
+
82481
82526
  // node_modules/.bun/posthog-node@5.52.4/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
82482
82527
  import { dirname as dirname18, posix as posix7, sep as sep7 } from "path";
82483
82528
  function createModulerModifier() {
@@ -92044,8 +92089,10 @@ var init_record_daily_active = () => {};
92044
92089
  // packages/telemetry-core/src/index.ts
92045
92090
  var init_src5 = __esm(() => {
92046
92091
  init_activity_state();
92092
+ init_consent_gated_fetch();
92047
92093
  init_diagnostics();
92048
92094
  init_env();
92095
+ init_event_id();
92049
92096
  init_events();
92050
92097
  init_machine_id();
92051
92098
  init_posthog_client();
@@ -92057,7 +92104,7 @@ var package_default2;
92057
92104
  var init_package2 = __esm(() => {
92058
92105
  package_default2 = {
92059
92106
  name: "@oh-my-opencode/omo-codex",
92060
- version: "5.1.34",
92107
+ version: "5.1.35",
92061
92108
  type: "module",
92062
92109
  private: true,
92063
92110
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -99355,6 +99402,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99355
99402
  join63("extensions", "omo-computer-use.js"),
99356
99403
  join63("extensions", "omo-memory-doctor.js"),
99357
99404
  join63("extensions", "omo-memory-memfs.js"),
99405
+ join63("extensions", "omo-memory-palace.js"),
99358
99406
  join63("extensions", "omo-thread-client.js"),
99359
99407
  join63("extensions", "assets.generated.json"),
99360
99408
  join63("extensions", "omo-member.js"),
@@ -110494,7 +110542,11 @@ function compareUtf16(left, right) {
110494
110542
  const b = Buffer2.from(right, "utf16le").swap16();
110495
110543
  return Buffer2.compare(a, b);
110496
110544
  }
110497
- function serializeValue(value, out) {
110545
+ var MAX_SERIALIZE_DEPTH = 64;
110546
+ function serializeValue(value, out, depth = 0) {
110547
+ if (typeof value === "object" && value !== null && depth >= MAX_SERIALIZE_DEPTH) {
110548
+ throw new CanonicalJsonError("json", `nesting deeper than ${MAX_SERIALIZE_DEPTH}`);
110549
+ }
110498
110550
  if (value === null)
110499
110551
  out.push("null");
110500
110552
  else if (typeof value === "boolean")
@@ -110508,7 +110560,7 @@ function serializeValue(value, out) {
110508
110560
  value.forEach((element, index) => {
110509
110561
  if (index > 0)
110510
110562
  out.push(",");
110511
- serializeValue(element, out);
110563
+ serializeValue(element, out, depth + 1);
110512
110564
  });
110513
110565
  out.push("]");
110514
110566
  } else {
@@ -110517,7 +110569,7 @@ function serializeValue(value, out) {
110517
110569
  if (index > 0)
110518
110570
  out.push(",");
110519
110571
  out.push(escapeCanonicalString(key), ":");
110520
- serializeValue(value[key], out);
110572
+ serializeValue(value[key], out, depth + 1);
110521
110573
  });
110522
110574
  out.push("}");
110523
110575
  }
@@ -110529,9 +110581,12 @@ function canonicalizeJson(value) {
110529
110581
  }
110530
110582
 
110531
110583
  // packages/memory-core/src/sync/canonical-json.ts
110584
+ var MAX_CANONICAL_DEPTH = 64;
110585
+
110532
110586
  class Parser {
110533
110587
  text;
110534
110588
  position = 0;
110589
+ depth = 0;
110535
110590
  constructor(text) {
110536
110591
  this.text = text;
110537
110592
  }
@@ -110545,10 +110600,14 @@ class Parser {
110545
110600
  parseValue() {
110546
110601
  this.skipInsignificant();
110547
110602
  const char = this.text[this.position];
110548
- if (char === "{")
110549
- return this.parseObject();
110550
- if (char === "[")
110551
- return this.parseArray();
110603
+ if (char === "{" || char === "[") {
110604
+ if (this.depth >= MAX_CANONICAL_DEPTH)
110605
+ throw this.fail("json", `nesting deeper than ${MAX_CANONICAL_DEPTH}`);
110606
+ this.depth++;
110607
+ const value = char === "{" ? this.parseObject() : this.parseArray();
110608
+ this.depth--;
110609
+ return value;
110610
+ }
110552
110611
  if (char === '"')
110553
110612
  return this.parseString().value;
110554
110613
  if (char === "-" || char >= "0" && char <= "9")
@@ -110744,7 +110803,14 @@ function openHpkeSealedBox(sealingPrivateRaw, sealingPublicRaw, wrap, info = Buf
110744
110803
  },
110745
110804
  format: "jwk"
110746
110805
  });
110747
- const dh = diffieHellman({ privateKey, publicKey: x25519PublicKeyFromRaw(enc) });
110806
+ let dh;
110807
+ try {
110808
+ dh = diffieHellman({ privateKey, publicKey: x25519PublicKeyFromRaw(enc) });
110809
+ } catch {
110810
+ throw new Error("sealed box does not open: wrong recipient or corrupted wrap");
110811
+ }
110812
+ if (dh.every((byte) => byte === 0))
110813
+ throw new Error("sealed box does not open: wrong recipient or corrupted wrap");
110748
110814
  const kem = Buffer4.concat([Buffer4.from("KEM"), KEM_ID]);
110749
110815
  const suite = Buffer4.concat([Buffer4.from("HPKE"), KEM_ID, KDF_ID, AEAD_ID]);
110750
110816
  const sharedSecret = labeledExpand(kem, "shared_secret", labeledExtract(kem, "eae_prk", dh, Buffer4.alloc(0)), Buffer4.concat([Buffer4.from(enc), Buffer4.from(sealingPublicRaw)]), 32);
@@ -110784,6 +110850,24 @@ var SIGNING_DOMAIN_TAGS = {
110784
110850
  function domainSeparatedMessage(purpose, payload) {
110785
110851
  return Buffer5.concat([Buffer5.from(SIGNING_DOMAIN_TAGS[purpose], "ascii"), Buffer5.from([0]), Buffer5.from(payload)]);
110786
110852
  }
110853
+ var CANONICAL_REASONS = {
110854
+ json: "record-json",
110855
+ "duplicate-key": "record-canonical-duplicate-key",
110856
+ number: "record-canonical-number",
110857
+ order: "record-canonical-order",
110858
+ escape: "record-canonical-escape",
110859
+ whitespace: "record-canonical-whitespace",
110860
+ encoding: "record-canonical-encoding"
110861
+ };
110862
+ function parseCanonical(bytes, what) {
110863
+ try {
110864
+ return requireCanonicalJson(bytes);
110865
+ } catch (error) {
110866
+ if (!(error instanceof CanonicalJsonError))
110867
+ throw error;
110868
+ throw new DeviceKeyringSignError(CANONICAL_REASONS[error.violation], `sign: ${what} preimage is not RFC 8785 canonical JSON: ${error.message}`);
110869
+ }
110870
+ }
110787
110871
  function validateSignRequest(request) {
110788
110872
  if (typeof request !== "object" || request === null) {
110789
110873
  throw new DeviceKeyringSignError("unknown-purpose", "sign: request must be a typed sign request");
@@ -110798,16 +110882,7 @@ function validateSignRequest(request) {
110798
110882
  if (!(request.canonicalJson instanceof Uint8Array)) {
110799
110883
  throw new DeviceKeyringSignError("record-json", "sign: record needs RFC 8785 canonical JSON bytes");
110800
110884
  }
110801
- let parsed;
110802
- try {
110803
- parsed = requireCanonicalJson(request.canonicalJson);
110804
- } catch (error) {
110805
- if (error instanceof CanonicalJsonError) {
110806
- const reason = error.violation === "json" ? "record-json" : error.violation === "duplicate-key" ? "record-canonical-duplicate-key" : error.violation === "number" ? "record-canonical-number" : error.violation === "order" ? "record-canonical-order" : error.violation === "escape" ? "record-canonical-escape" : error.violation === "whitespace" ? "record-canonical-whitespace" : "record-canonical-encoding";
110807
- throw new DeviceKeyringSignError(reason, `sign: record preimage is not RFC 8785 canonical JSON: ${error.message}`);
110808
- }
110809
- throw error;
110810
- }
110885
+ const parsed = parseCanonical(request.canonicalJson, "record");
110811
110886
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed) || typeof parsed.t !== "string") {
110812
110887
  throw new DeviceKeyringSignError("record-json", 'sign: record preimage needs a top-level "t" string');
110813
110888
  }
@@ -110815,8 +110890,8 @@ function validateSignRequest(request) {
110815
110890
  if (!t.startsWith("omo-sync/v1/")) {
110816
110891
  throw new DeviceKeyringSignError("record-prefix", 'sign: record "t" must start with "omo-sync/v1/"');
110817
110892
  }
110818
- if (t === SIGNING_DOMAIN_TAGS["object-digest"]) {
110819
- throw new DeviceKeyringSignError("record-prefix", 'sign: record "t" must name a record or snapshot type, not the object-digest tag');
110893
+ if (t === SIGNING_DOMAIN_TAGS["object-digest"] || t === SIGNING_DOMAIN_TAGS.snapshot) {
110894
+ throw new DeviceKeyringSignError("record-prefix", `sign: record "t" must name a keyring record type, not another purpose's tag`);
110820
110895
  }
110821
110896
  return request.canonicalJson;
110822
110897
  }
@@ -110824,15 +110899,7 @@ function validateSignRequest(request) {
110824
110899
  if (!(request.canonicalJson instanceof Uint8Array)) {
110825
110900
  throw new DeviceKeyringSignError("record-json", "sign: snapshot needs RFC 8785 canonical JSON bytes");
110826
110901
  }
110827
- let parsed;
110828
- try {
110829
- parsed = requireCanonicalJson(request.canonicalJson);
110830
- } catch (error) {
110831
- if (error instanceof CanonicalJsonError) {
110832
- throw new DeviceKeyringSignError("record-canonical", `sign: snapshot preimage is not RFC 8785 canonical JSON: ${error.message}`);
110833
- }
110834
- throw error;
110835
- }
110902
+ const parsed = parseCanonical(request.canonicalJson, "snapshot");
110836
110903
  const t = typeof parsed === "object" && parsed !== null ? parsed.t : undefined;
110837
110904
  if (t !== SIGNING_DOMAIN_TAGS.snapshot) {
110838
110905
  throw new DeviceKeyringSignError("snapshot-prefix", 'sign: snapshot preimage "t" must be exactly "omo-sync/v1/snapshot"');
@@ -110842,7 +110909,11 @@ function validateSignRequest(request) {
110842
110909
  throw new DeviceKeyringSignError("unknown-purpose", `sign: unsupported purpose ${JSON.stringify(request.purpose ?? null)}`);
110843
110910
  }
110844
110911
  var WRAP_INFO = Buffer5.concat([Buffer5.from("omo-sync/v1/wrap", "ascii"), Buffer5.from([0])]);
110845
- var wrapAad = (binding) => Buffer5.from(`{"account":${JSON.stringify(binding.account)},"epoch":${binding.epoch},"id":${JSON.stringify(binding.id)}}`, "utf8");
110912
+ var wrapAad = (binding) => {
110913
+ if (!Number.isSafeInteger(binding.epoch) || binding.epoch < 0)
110914
+ throw new Error("unseal: the wrap epoch must be a non-negative integer");
110915
+ return canonicalizeJson({ account: binding.account, epoch: binding.epoch, id: binding.id });
110916
+ };
110846
110917
  function generateDeviceKeyMaterial() {
110847
110918
  const signing = generateKeyPairSync("ed25519");
110848
110919
  const sealing = generateKeyPairSync("x25519");
@@ -2133,7 +2133,7 @@ var package_default;
2133
2133
  var init_package = __esm(() => {
2134
2134
  package_default = {
2135
2135
  name: "oh-my-opencode",
2136
- version: "5.1.34",
2136
+ version: "5.1.35",
2137
2137
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2138
2138
  main: "./dist/index.js",
2139
2139
  types: "dist/index.d.ts",
@@ -2369,18 +2369,18 @@ var init_package = __esm(() => {
2369
2369
  typescript: "^7.0.2"
2370
2370
  },
2371
2371
  optionalDependencies: {
2372
- "oh-my-opencode-darwin-arm64": "5.1.34",
2373
- "oh-my-opencode-darwin-x64": "5.1.34",
2374
- "oh-my-opencode-darwin-x64-baseline": "5.1.34",
2375
- "oh-my-opencode-linux-arm64": "5.1.34",
2376
- "oh-my-opencode-linux-arm64-musl": "5.1.34",
2377
- "oh-my-opencode-linux-x64": "5.1.34",
2378
- "oh-my-opencode-linux-x64-baseline": "5.1.34",
2379
- "oh-my-opencode-linux-x64-musl": "5.1.34",
2380
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.34",
2381
- "oh-my-opencode-windows-arm64": "5.1.34",
2382
- "oh-my-opencode-windows-x64": "5.1.34",
2383
- "oh-my-opencode-windows-x64-baseline": "5.1.34"
2372
+ "oh-my-opencode-darwin-arm64": "5.1.35",
2373
+ "oh-my-opencode-darwin-x64": "5.1.35",
2374
+ "oh-my-opencode-darwin-x64-baseline": "5.1.35",
2375
+ "oh-my-opencode-linux-arm64": "5.1.35",
2376
+ "oh-my-opencode-linux-arm64-musl": "5.1.35",
2377
+ "oh-my-opencode-linux-x64": "5.1.35",
2378
+ "oh-my-opencode-linux-x64-baseline": "5.1.35",
2379
+ "oh-my-opencode-linux-x64-musl": "5.1.35",
2380
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.35",
2381
+ "oh-my-opencode-windows-arm64": "5.1.35",
2382
+ "oh-my-opencode-windows-x64": "5.1.35",
2383
+ "oh-my-opencode-windows-x64-baseline": "5.1.35"
2384
2384
  },
2385
2385
  overrides: {
2386
2386
  hono: "^4.13.8",
@@ -82386,6 +82386,9 @@ var init_activity_state = __esm(() => {
82386
82386
  capturedDaysByStateDir = new Map;
82387
82387
  });
82388
82388
 
82389
+ // packages/telemetry-core/src/consent-gated-fetch.ts
82390
+ var init_consent_gated_fetch = () => {};
82391
+
82389
82392
  // packages/telemetry-core/src/constants.ts
82390
82393
  var DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com", DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74", UNCONFIGURED_POSTHOG_API_KEY = "phc_REPLACE_ME_OMO_NATIVE";
82391
82394
 
@@ -82433,6 +82436,7 @@ function toDiagnosticRecord(input, now) {
82433
82436
  timestamp: now.toISOString(),
82434
82437
  event: input.event,
82435
82438
  source: input.source,
82439
+ ...input.count === undefined ? {} : { count: input.count },
82436
82440
  ...serializeError(input.error, input.errorKind)
82437
82441
  };
82438
82442
  }
@@ -82525,7 +82529,7 @@ function shouldDisableTelemetry(input) {
82525
82529
  const env = input.env ?? process.env;
82526
82530
  const globalPrefix = input.globalEnvPrefix ?? "OMO";
82527
82531
  const prefixes = Array.from(new Set([globalPrefix, input.productEnvPrefix]));
82528
- if (isDisableFlag(env["DO_NOT_TRACK"])) {
82532
+ if (isDisableFlag(env["DO_NOT_TRACK"]) || isDisableFlag(env[`${globalPrefix}_DISABLE_TELEMETRY`])) {
82529
82533
  return true;
82530
82534
  }
82531
82535
  for (const prefix of prefixes) {
@@ -82557,6 +82561,47 @@ var init_env = __esm(() => {
82557
82561
  SEND_OPT_OUT_VALUES = ["0", "false", "no", "yes"];
82558
82562
  });
82559
82563
 
82564
+ // packages/telemetry-core/src/event-id.ts
82565
+ import { randomBytes as nodeRandomBytes } from "node:crypto";
82566
+ function createUuidV7Generator(source = {}) {
82567
+ const now = source.now ?? Date.now;
82568
+ const randomBytes = source.randomBytes ?? ((size) => new Uint8Array(nodeRandomBytes(size)));
82569
+ let lastMs = -1;
82570
+ let counter = 0;
82571
+ return () => {
82572
+ const random = randomBytes(10);
82573
+ const wallMs = Math.floor(now());
82574
+ if (wallMs > lastMs) {
82575
+ lastMs = wallMs;
82576
+ counter = (random[0] << 8 | random[1]) & COUNTER_SEED_MASK;
82577
+ } else if (counter < MAX_COUNTER) {
82578
+ counter += 1;
82579
+ } else {
82580
+ lastMs += 1;
82581
+ counter = (random[0] << 8 | random[1]) & COUNTER_SEED_MASK;
82582
+ }
82583
+ const bytes = new Uint8Array(16);
82584
+ let timestamp = lastMs;
82585
+ for (let index = 5;index >= 0; index -= 1) {
82586
+ bytes[index] = timestamp % 256;
82587
+ timestamp = Math.floor(timestamp / 256);
82588
+ }
82589
+ bytes[6] = 112 | counter >> 8;
82590
+ bytes[7] = counter & 255;
82591
+ bytes[8] = 128 | random[2] & 63;
82592
+ bytes.set(random.subarray(3, 10), 9);
82593
+ return formatUuid(bytes);
82594
+ };
82595
+ }
82596
+ function formatUuid(bytes) {
82597
+ const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
82598
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
82599
+ }
82600
+ var MAX_COUNTER = 4095, COUNTER_SEED_MASK = 2047, fallbackEventId;
82601
+ var init_event_id = __esm(() => {
82602
+ fallbackEventId = createUuidV7Generator();
82603
+ });
82604
+
82560
82605
  // node_modules/.bun/posthog-node@5.52.4/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
82561
82606
  import { dirname as dirname18, posix as posix7, sep as sep7 } from "path";
82562
82607
  function createModulerModifier() {
@@ -92123,8 +92168,10 @@ var init_record_daily_active = () => {};
92123
92168
  // packages/telemetry-core/src/index.ts
92124
92169
  var init_src5 = __esm(() => {
92125
92170
  init_activity_state();
92171
+ init_consent_gated_fetch();
92126
92172
  init_diagnostics();
92127
92173
  init_env();
92174
+ init_event_id();
92128
92175
  init_events();
92129
92176
  init_machine_id();
92130
92177
  init_posthog_client();
@@ -92136,7 +92183,7 @@ var package_default2;
92136
92183
  var init_package2 = __esm(() => {
92137
92184
  package_default2 = {
92138
92185
  name: "@oh-my-opencode/omo-codex",
92139
- version: "5.1.34",
92186
+ version: "5.1.35",
92140
92187
  type: "module",
92141
92188
  private: true,
92142
92189
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -99434,6 +99481,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99434
99481
  join63("extensions", "omo-computer-use.js"),
99435
99482
  join63("extensions", "omo-memory-doctor.js"),
99436
99483
  join63("extensions", "omo-memory-memfs.js"),
99484
+ join63("extensions", "omo-memory-palace.js"),
99437
99485
  join63("extensions", "omo-thread-client.js"),
99438
99486
  join63("extensions", "assets.generated.json"),
99439
99487
  join63("extensions", "omo-member.js"),
@@ -110573,7 +110621,11 @@ function compareUtf16(left, right) {
110573
110621
  const b = Buffer2.from(right, "utf16le").swap16();
110574
110622
  return Buffer2.compare(a, b);
110575
110623
  }
110576
- function serializeValue(value, out) {
110624
+ var MAX_SERIALIZE_DEPTH = 64;
110625
+ function serializeValue(value, out, depth = 0) {
110626
+ if (typeof value === "object" && value !== null && depth >= MAX_SERIALIZE_DEPTH) {
110627
+ throw new CanonicalJsonError("json", `nesting deeper than ${MAX_SERIALIZE_DEPTH}`);
110628
+ }
110577
110629
  if (value === null)
110578
110630
  out.push("null");
110579
110631
  else if (typeof value === "boolean")
@@ -110587,7 +110639,7 @@ function serializeValue(value, out) {
110587
110639
  value.forEach((element, index) => {
110588
110640
  if (index > 0)
110589
110641
  out.push(",");
110590
- serializeValue(element, out);
110642
+ serializeValue(element, out, depth + 1);
110591
110643
  });
110592
110644
  out.push("]");
110593
110645
  } else {
@@ -110596,7 +110648,7 @@ function serializeValue(value, out) {
110596
110648
  if (index > 0)
110597
110649
  out.push(",");
110598
110650
  out.push(escapeCanonicalString(key), ":");
110599
- serializeValue(value[key], out);
110651
+ serializeValue(value[key], out, depth + 1);
110600
110652
  });
110601
110653
  out.push("}");
110602
110654
  }
@@ -110608,9 +110660,12 @@ function canonicalizeJson(value) {
110608
110660
  }
110609
110661
 
110610
110662
  // packages/memory-core/src/sync/canonical-json.ts
110663
+ var MAX_CANONICAL_DEPTH = 64;
110664
+
110611
110665
  class Parser {
110612
110666
  text;
110613
110667
  position = 0;
110668
+ depth = 0;
110614
110669
  constructor(text) {
110615
110670
  this.text = text;
110616
110671
  }
@@ -110624,10 +110679,14 @@ class Parser {
110624
110679
  parseValue() {
110625
110680
  this.skipInsignificant();
110626
110681
  const char = this.text[this.position];
110627
- if (char === "{")
110628
- return this.parseObject();
110629
- if (char === "[")
110630
- return this.parseArray();
110682
+ if (char === "{" || char === "[") {
110683
+ if (this.depth >= MAX_CANONICAL_DEPTH)
110684
+ throw this.fail("json", `nesting deeper than ${MAX_CANONICAL_DEPTH}`);
110685
+ this.depth++;
110686
+ const value = char === "{" ? this.parseObject() : this.parseArray();
110687
+ this.depth--;
110688
+ return value;
110689
+ }
110631
110690
  if (char === '"')
110632
110691
  return this.parseString().value;
110633
110692
  if (char === "-" || char >= "0" && char <= "9")
@@ -110823,7 +110882,14 @@ function openHpkeSealedBox(sealingPrivateRaw, sealingPublicRaw, wrap, info = Buf
110823
110882
  },
110824
110883
  format: "jwk"
110825
110884
  });
110826
- const dh = diffieHellman({ privateKey, publicKey: x25519PublicKeyFromRaw(enc) });
110885
+ let dh;
110886
+ try {
110887
+ dh = diffieHellman({ privateKey, publicKey: x25519PublicKeyFromRaw(enc) });
110888
+ } catch {
110889
+ throw new Error("sealed box does not open: wrong recipient or corrupted wrap");
110890
+ }
110891
+ if (dh.every((byte) => byte === 0))
110892
+ throw new Error("sealed box does not open: wrong recipient or corrupted wrap");
110827
110893
  const kem = Buffer4.concat([Buffer4.from("KEM"), KEM_ID]);
110828
110894
  const suite = Buffer4.concat([Buffer4.from("HPKE"), KEM_ID, KDF_ID, AEAD_ID]);
110829
110895
  const sharedSecret = labeledExpand(kem, "shared_secret", labeledExtract(kem, "eae_prk", dh, Buffer4.alloc(0)), Buffer4.concat([Buffer4.from(enc), Buffer4.from(sealingPublicRaw)]), 32);
@@ -110863,6 +110929,24 @@ var SIGNING_DOMAIN_TAGS = {
110863
110929
  function domainSeparatedMessage(purpose, payload) {
110864
110930
  return Buffer5.concat([Buffer5.from(SIGNING_DOMAIN_TAGS[purpose], "ascii"), Buffer5.from([0]), Buffer5.from(payload)]);
110865
110931
  }
110932
+ var CANONICAL_REASONS = {
110933
+ json: "record-json",
110934
+ "duplicate-key": "record-canonical-duplicate-key",
110935
+ number: "record-canonical-number",
110936
+ order: "record-canonical-order",
110937
+ escape: "record-canonical-escape",
110938
+ whitespace: "record-canonical-whitespace",
110939
+ encoding: "record-canonical-encoding"
110940
+ };
110941
+ function parseCanonical(bytes, what) {
110942
+ try {
110943
+ return requireCanonicalJson(bytes);
110944
+ } catch (error) {
110945
+ if (!(error instanceof CanonicalJsonError))
110946
+ throw error;
110947
+ throw new DeviceKeyringSignError(CANONICAL_REASONS[error.violation], `sign: ${what} preimage is not RFC 8785 canonical JSON: ${error.message}`);
110948
+ }
110949
+ }
110866
110950
  function validateSignRequest(request) {
110867
110951
  if (typeof request !== "object" || request === null) {
110868
110952
  throw new DeviceKeyringSignError("unknown-purpose", "sign: request must be a typed sign request");
@@ -110877,16 +110961,7 @@ function validateSignRequest(request) {
110877
110961
  if (!(request.canonicalJson instanceof Uint8Array)) {
110878
110962
  throw new DeviceKeyringSignError("record-json", "sign: record needs RFC 8785 canonical JSON bytes");
110879
110963
  }
110880
- let parsed;
110881
- try {
110882
- parsed = requireCanonicalJson(request.canonicalJson);
110883
- } catch (error) {
110884
- if (error instanceof CanonicalJsonError) {
110885
- const reason = error.violation === "json" ? "record-json" : error.violation === "duplicate-key" ? "record-canonical-duplicate-key" : error.violation === "number" ? "record-canonical-number" : error.violation === "order" ? "record-canonical-order" : error.violation === "escape" ? "record-canonical-escape" : error.violation === "whitespace" ? "record-canonical-whitespace" : "record-canonical-encoding";
110886
- throw new DeviceKeyringSignError(reason, `sign: record preimage is not RFC 8785 canonical JSON: ${error.message}`);
110887
- }
110888
- throw error;
110889
- }
110964
+ const parsed = parseCanonical(request.canonicalJson, "record");
110890
110965
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed) || typeof parsed.t !== "string") {
110891
110966
  throw new DeviceKeyringSignError("record-json", 'sign: record preimage needs a top-level "t" string');
110892
110967
  }
@@ -110894,8 +110969,8 @@ function validateSignRequest(request) {
110894
110969
  if (!t.startsWith("omo-sync/v1/")) {
110895
110970
  throw new DeviceKeyringSignError("record-prefix", 'sign: record "t" must start with "omo-sync/v1/"');
110896
110971
  }
110897
- if (t === SIGNING_DOMAIN_TAGS["object-digest"]) {
110898
- throw new DeviceKeyringSignError("record-prefix", 'sign: record "t" must name a record or snapshot type, not the object-digest tag');
110972
+ if (t === SIGNING_DOMAIN_TAGS["object-digest"] || t === SIGNING_DOMAIN_TAGS.snapshot) {
110973
+ throw new DeviceKeyringSignError("record-prefix", `sign: record "t" must name a keyring record type, not another purpose's tag`);
110899
110974
  }
110900
110975
  return request.canonicalJson;
110901
110976
  }
@@ -110903,15 +110978,7 @@ function validateSignRequest(request) {
110903
110978
  if (!(request.canonicalJson instanceof Uint8Array)) {
110904
110979
  throw new DeviceKeyringSignError("record-json", "sign: snapshot needs RFC 8785 canonical JSON bytes");
110905
110980
  }
110906
- let parsed;
110907
- try {
110908
- parsed = requireCanonicalJson(request.canonicalJson);
110909
- } catch (error) {
110910
- if (error instanceof CanonicalJsonError) {
110911
- throw new DeviceKeyringSignError("record-canonical", `sign: snapshot preimage is not RFC 8785 canonical JSON: ${error.message}`);
110912
- }
110913
- throw error;
110914
- }
110981
+ const parsed = parseCanonical(request.canonicalJson, "snapshot");
110915
110982
  const t = typeof parsed === "object" && parsed !== null ? parsed.t : undefined;
110916
110983
  if (t !== SIGNING_DOMAIN_TAGS.snapshot) {
110917
110984
  throw new DeviceKeyringSignError("snapshot-prefix", 'sign: snapshot preimage "t" must be exactly "omo-sync/v1/snapshot"');
@@ -110921,7 +110988,11 @@ function validateSignRequest(request) {
110921
110988
  throw new DeviceKeyringSignError("unknown-purpose", `sign: unsupported purpose ${JSON.stringify(request.purpose ?? null)}`);
110922
110989
  }
110923
110990
  var WRAP_INFO = Buffer5.concat([Buffer5.from("omo-sync/v1/wrap", "ascii"), Buffer5.from([0])]);
110924
- var wrapAad = (binding) => Buffer5.from(`{"account":${JSON.stringify(binding.account)},"epoch":${binding.epoch},"id":${JSON.stringify(binding.id)}}`, "utf8");
110991
+ var wrapAad = (binding) => {
110992
+ if (!Number.isSafeInteger(binding.epoch) || binding.epoch < 0)
110993
+ throw new Error("unseal: the wrap epoch must be a non-negative integer");
110994
+ return canonicalizeJson({ account: binding.account, epoch: binding.epoch, id: binding.id });
110995
+ };
110925
110996
  function generateDeviceKeyMaterial() {
110926
110997
  const signing = generateKeyPairSync("ed25519");
110927
110998
  const sealing = generateKeyPairSync("x25519");
package/dist/index.js CHANGED
@@ -99221,7 +99221,7 @@ function getCachedVersion(options = {}) {
99221
99221
  // package.json
99222
99222
  var package_default = {
99223
99223
  name: "oh-my-opencode",
99224
- version: "5.1.34",
99224
+ version: "5.1.35",
99225
99225
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
99226
99226
  main: "./dist/index.js",
99227
99227
  types: "dist/index.d.ts",
@@ -99457,18 +99457,18 @@ var package_default = {
99457
99457
  typescript: "^7.0.2"
99458
99458
  },
99459
99459
  optionalDependencies: {
99460
- "oh-my-opencode-darwin-arm64": "5.1.34",
99461
- "oh-my-opencode-darwin-x64": "5.1.34",
99462
- "oh-my-opencode-darwin-x64-baseline": "5.1.34",
99463
- "oh-my-opencode-linux-arm64": "5.1.34",
99464
- "oh-my-opencode-linux-arm64-musl": "5.1.34",
99465
- "oh-my-opencode-linux-x64": "5.1.34",
99466
- "oh-my-opencode-linux-x64-baseline": "5.1.34",
99467
- "oh-my-opencode-linux-x64-musl": "5.1.34",
99468
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.34",
99469
- "oh-my-opencode-windows-arm64": "5.1.34",
99470
- "oh-my-opencode-windows-x64": "5.1.34",
99471
- "oh-my-opencode-windows-x64-baseline": "5.1.34"
99460
+ "oh-my-opencode-darwin-arm64": "5.1.35",
99461
+ "oh-my-opencode-darwin-x64": "5.1.35",
99462
+ "oh-my-opencode-darwin-x64-baseline": "5.1.35",
99463
+ "oh-my-opencode-linux-arm64": "5.1.35",
99464
+ "oh-my-opencode-linux-arm64-musl": "5.1.35",
99465
+ "oh-my-opencode-linux-x64": "5.1.35",
99466
+ "oh-my-opencode-linux-x64-baseline": "5.1.35",
99467
+ "oh-my-opencode-linux-x64-musl": "5.1.35",
99468
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.35",
99469
+ "oh-my-opencode-windows-arm64": "5.1.35",
99470
+ "oh-my-opencode-windows-x64": "5.1.35",
99471
+ "oh-my-opencode-windows-x64-baseline": "5.1.35"
99472
99472
  },
99473
99473
  overrides: {
99474
99474
  hono: "^4.13.8",
@@ -178734,7 +178734,7 @@ function shouldDisableTelemetry(input) {
178734
178734
  const env = input.env ?? process.env;
178735
178735
  const globalPrefix = input.globalEnvPrefix ?? "OMO";
178736
178736
  const prefixes = Array.from(new Set([globalPrefix, input.productEnvPrefix]));
178737
- if (isDisableFlag(env["DO_NOT_TRACK"])) {
178737
+ if (isDisableFlag(env["DO_NOT_TRACK"]) || isDisableFlag(env[`${globalPrefix}_DISABLE_TELEMETRY`])) {
178738
178738
  return true;
178739
178739
  }
178740
178740
  for (const prefix of prefixes) {
@@ -5,5 +5,5 @@
5
5
  "index.js": "f577c49fe18bcc78293e136e112a83861e86cca5d908ebceaaec524dff8b8ccc",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-16T07:26:03.306Z"
8
+ "stagedAtUtc": "2026-10-17T03:46:28.689Z"
9
9
  }