lazycodex-ai 5.0.0-beta.81 → 5.0.0-beta.83

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 (103) hide show
  1. package/README.ja.md +2 -2
  2. package/README.ko.md +2 -2
  3. package/README.md +4 -4
  4. package/README.ru.md +2 -2
  5. package/README.zh-cn.md +2 -2
  6. package/dist/cli/index.js +439 -98
  7. package/dist/cli/install-native/index.d.ts +4 -0
  8. package/dist/cli/install-native/plan.d.ts +11 -0
  9. package/dist/cli/install-native/run-native-install.d.ts +23 -0
  10. package/dist/cli/install-native-dev/index.d.ts +4 -0
  11. package/dist/cli/native-dev-platform-flag.d.ts +5 -0
  12. package/dist/cli/native-edition-hint.d.ts +10 -0
  13. package/dist/cli/types.d.ts +3 -2
  14. package/dist/cli-node/index.js +439 -98
  15. package/package.json +2 -1
  16. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  17. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +111 -11
  18. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  19. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  23. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  27. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  28. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  30. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  38. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +24 -10
  40. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +8 -6
  41. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +2 -0
  42. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +21 -4
  43. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  44. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +10 -5
  46. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +24 -6
  47. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard-native-reviewer.test.ts +207 -0
  48. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +6 -4
  49. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +43 -4
  50. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  71. package/packages/omo-codex/plugin/package-lock.json +12 -12
  72. package/packages/omo-codex/plugin/package.json +1 -1
  73. package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +25 -0
  74. package/packages/omo-codex/plugin/skills/browser/SKILL.md +89 -0
  75. package/packages/omo-codex/plugin/skills/browser/agents/openai.yaml +2 -0
  76. package/packages/omo-codex/plugin/skills/browser/references/commands.md +90 -0
  77. package/packages/omo-codex/plugin/skills/browser/references/install.md +71 -0
  78. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +42 -0
  79. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +39 -0
  80. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +59 -0
  81. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +42 -0
  82. package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +59 -0
  83. package/packages/omo-codex/plugin/skills/browser/references/remote.md +24 -0
  84. package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +41 -0
  85. package/packages/omo-codex/plugin/skills/browser/scripts/browser-env.mjs +41 -0
  86. package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +51 -0
  87. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -0
  88. package/packages/omo-codex/scripts/install-dist/install-local.mjs +117 -17
  89. package/packages/shared-skills/skills/browser/ATTRIBUTION.md +25 -0
  90. package/packages/shared-skills/skills/browser/SKILL.md +89 -0
  91. package/packages/shared-skills/skills/browser/references/commands.md +90 -0
  92. package/packages/shared-skills/skills/browser/references/install.md +71 -0
  93. package/packages/shared-skills/skills/browser/references/owned-engine/README.md +42 -0
  94. package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +39 -0
  95. package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +59 -0
  96. package/packages/shared-skills/skills/browser/references/owned-engine/network.md +42 -0
  97. package/packages/shared-skills/skills/browser/references/recipes/1password.md +59 -0
  98. package/packages/shared-skills/skills/browser/references/remote.md +24 -0
  99. package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +41 -0
  100. package/packages/shared-skills/skills/browser/scripts/browser-env.mjs +41 -0
  101. package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +51 -0
  102. package/dist/cli/install-senpi/index.d.ts +0 -1
  103. package/dist/cli/senpi-platform-flag.d.ts +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
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",
@@ -24,6 +24,7 @@
24
24
  "packages/openclaw-core",
25
25
  "packages/boulder-state",
26
26
  "packages/memory-core",
27
+ "packages/isolation-core",
27
28
  "packages/telemetry-core",
28
29
  "packages/claude-code-compat-core",
29
30
  "packages/skills-loader-core",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -7072,8 +7072,10 @@ var OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
7072
7072
 
7073
7073
  // ../../omo-config-core/src/schema/harness.ts
7074
7074
  var HARNESS_IDS = ["codex", "opencode", "omo"];
7075
- var OMO_CONFIG_HARNESS_IDS = ["opencode", "senpi", "codex"];
7075
+ var OMO_CONFIG_HARNESS_IDS = ["opencode", "native", "codex"];
7076
7076
  var OmoHarnessIdSchema = _enum(OMO_CONFIG_HARNESS_IDS);
7077
+ var OMO_CONFIG_LEGACY_HARNESS_ALIASES = { senpi: "native" };
7078
+ var OMO_CONFIG_LEGACY_HARNESS_IDS = Object.keys(OMO_CONFIG_LEGACY_HARNESS_ALIASES);
7077
7079
 
7078
7080
  // ../../omo-config-core/src/schema/memory.ts
7079
7081
  var OmoMemoryReflectionTriggerSchema = object({
@@ -7315,6 +7317,31 @@ var OmoTaskTeamSettingsSchema = object({
7315
7317
  var OmoTaskWarningsSchema = object({
7316
7318
  unavailable_categories: boolean2().default(true)
7317
7319
  }).strict();
7320
+ var IsolationBackendKindSchema = _enum([
7321
+ "auto",
7322
+ "apfs",
7323
+ "btrfs",
7324
+ "zfs",
7325
+ "reflink",
7326
+ "overlayfs",
7327
+ "block-clone",
7328
+ "rcopy"
7329
+ ]);
7330
+ var OmoTaskIsolationSchema = object({
7331
+ enabled: boolean2().default(false),
7332
+ backend: IsolationBackendKindSchema.default("auto"),
7333
+ apply: boolean2().default(true),
7334
+ merge: _enum(["patch", "branch"]).default("patch"),
7335
+ commits: _enum(["generic", "ai"]).default("generic")
7336
+ }).strict();
7337
+ var isolationDefaults = OmoTaskIsolationSchema.parse({});
7338
+ var OmoTaskIsolationLayerSchema = object({
7339
+ enabled: boolean2().optional(),
7340
+ backend: IsolationBackendKindSchema.optional(),
7341
+ apply: boolean2().optional(),
7342
+ merge: _enum(["patch", "branch"]).optional(),
7343
+ commits: _enum(["generic", "ai"]).optional()
7344
+ }).strict();
7318
7345
  var OmoTaskDagSettingsSchema = object({
7319
7346
  max_nodes_per_run: number2().int().positive().default(64),
7320
7347
  max_runs_per_session: number2().int().positive().default(16),
@@ -7326,6 +7353,7 @@ var OmoTaskDagSettingsSchema = object({
7326
7353
  max_prompt_bytes: number2().int().positive().default(262144)
7327
7354
  }).strict();
7328
7355
  var OmoTaskSettingsSchema = object({
7356
+ isolation: OmoTaskIsolationSchema.default(isolationDefaults),
7329
7357
  default_execution_mode: _enum(["auto", "in-process", "process"]).default("auto"),
7330
7358
  process_runner: _enum(["host", "child-process"]).default("host"),
7331
7359
  host_engine_policy: _enum(["upgrade", "fallback"]).default("upgrade"),
@@ -7374,6 +7402,7 @@ var OmoTaskWarningsLayerSchema = object({
7374
7402
  unavailable_categories: boolean2().optional()
7375
7403
  }).strict();
7376
7404
  var OmoTaskSettingsLayerSchema = object({
7405
+ isolation: OmoTaskIsolationLayerSchema.optional(),
7377
7406
  default_execution_mode: _enum(["auto", "in-process", "process"]).optional(),
7378
7407
  process_runner: _enum(["host", "child-process"]).optional(),
7379
7408
  host_engine_policy: _enum(["upgrade", "fallback"]).optional(),
@@ -7505,6 +7534,7 @@ var OmoConfigProfileSchema = object({
7505
7534
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
7506
7535
  disabled_skills: OmoDisabledSkillsSchema.optional(),
7507
7536
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
7537
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
7508
7538
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
7509
7539
  "[codex]": OmoTypedHarnessConfigSchema.optional()
7510
7540
  }).strict();
@@ -7523,6 +7553,7 @@ var OmoConfigSchema = object({
7523
7553
  telemetry: OmoTelemetrySettingsSchema.optional(),
7524
7554
  disabled_skills: OmoDisabledSkillsSchema.optional(),
7525
7555
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
7556
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
7526
7557
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
7527
7558
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
7528
7559
  profiles: record(string2(), OmoConfigProfileSchema).default({}),
@@ -7544,6 +7575,7 @@ var OmoConfigLayerSchema = object({
7544
7575
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
7545
7576
  disabled_skills: OmoDisabledSkillsSchema.optional(),
7546
7577
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
7578
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
7547
7579
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
7548
7580
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
7549
7581
  profiles: record(string2(), OmoConfigProfileSchema).optional(),
@@ -7607,6 +7639,54 @@ function canonicalizeLegacyCategoryNames(document) {
7607
7639
  return { document: canonicalized, renames };
7608
7640
  }
7609
7641
 
7642
+ // ../../omo-config-core/src/schema/legacy-harness-names.ts
7643
+ function canonicalHarnessName(name) {
7644
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, name) ? OMO_CONFIG_LEGACY_HARNESS_ALIASES[name] : name;
7645
+ }
7646
+ function harnessBlockKey(harness) {
7647
+ return `[${harness}]`;
7648
+ }
7649
+ function legacyHarnessOfBlockKey(key) {
7650
+ if (!key.startsWith("[") || !key.endsWith("]"))
7651
+ return;
7652
+ const harness = key.slice(1, -1);
7653
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, harness) ? harness : undefined;
7654
+ }
7655
+ function isRecord8(value) {
7656
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7657
+ }
7658
+ function canonicalizeBlocksIn(container, path, renames) {
7659
+ const result = {};
7660
+ for (const [key, value] of Object.entries(container)) {
7661
+ const legacyHarness = legacyHarnessOfBlockKey(key);
7662
+ if (legacyHarness === undefined) {
7663
+ result[key] = value;
7664
+ continue;
7665
+ }
7666
+ const canonical = harnessBlockKey(canonicalHarnessName(legacyHarness));
7667
+ const dropped = Object.hasOwn(container, canonical);
7668
+ renames.push({ canonical, dropped, legacy: key, path: [...path, key].join(".") });
7669
+ if (!dropped)
7670
+ result[canonical] = value;
7671
+ }
7672
+ return result;
7673
+ }
7674
+ function canonicalizeLegacyHarnessBlocks(document) {
7675
+ if (!isRecord8(document))
7676
+ return { document: {}, renames: [] };
7677
+ const renames = [];
7678
+ const canonicalized = canonicalizeBlocksIn(document, [], renames);
7679
+ const profiles = canonicalized["profiles"];
7680
+ if (isRecord8(profiles)) {
7681
+ const canonicalProfiles = {};
7682
+ for (const [name, profile] of Object.entries(profiles)) {
7683
+ canonicalProfiles[name] = isRecord8(profile) ? canonicalizeBlocksIn(profile, ["profiles", name], renames) : profile;
7684
+ }
7685
+ canonicalized["profiles"] = canonicalProfiles;
7686
+ }
7687
+ return { document: canonicalized, renames };
7688
+ }
7689
+
7610
7690
  // ../../../node_modules/.bun/jsonc-parser@3.3.1/node_modules/jsonc-parser/lib/esm/impl/scanner.js
7611
7691
  function createScanner(text, ignoreTrivia = false) {
7612
7692
  const len = text.length;
@@ -8582,7 +8662,7 @@ function resolveOmoConfigPaths(options) {
8582
8662
  }
8583
8663
 
8584
8664
  // ../../omo-config-core/src/loader/resolution.ts
8585
- var HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS])].map((harness) => `[${harness}]`);
8665
+ var HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS, ...OMO_CONFIG_LEGACY_HARNESS_IDS])].map((harness) => harnessBlockKey(harness));
8586
8666
  function profileName(value) {
8587
8667
  return value === "" ? undefined : value;
8588
8668
  }
@@ -8611,7 +8691,13 @@ function withoutControlKeys(config) {
8611
8691
  function harnessLayer(config, harness) {
8612
8692
  if (harness === undefined)
8613
8693
  return {};
8614
- return toRecord(config[`[${harness}]`]) ?? {};
8694
+ const canonical = canonicalHarnessName(harness);
8695
+ const legacyKeys = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([legacy]) => harnessBlockKey(legacy));
8696
+ let layer = {};
8697
+ for (const key of [...legacyKeys, harnessBlockKey(canonical)]) {
8698
+ layer = mergeOmoConfigRecords(layer, toRecord(config[key]) ?? {});
8699
+ }
8700
+ return layer;
8615
8701
  }
8616
8702
  function resolveOmoConfigView(options) {
8617
8703
  const profiles = toRecord(options.config["profiles"]);
@@ -8662,6 +8748,7 @@ var DEFAULT_RAW_CONFIG = {
8662
8748
  function stripResolutionControlKeys(config) {
8663
8749
  const {
8664
8750
  "[codex]": _codex,
8751
+ "[native]": _native,
8665
8752
  "[opencode]": _opencode,
8666
8753
  "[senpi]": _senpi,
8667
8754
  profiles: _profiles,
@@ -8687,21 +8774,21 @@ function hasUnsafeUnrecognizedKey(issues) {
8687
8774
  function hasTamperedPrototype(value) {
8688
8775
  if (Array.isArray(value))
8689
8776
  return value.some((entry) => hasTamperedPrototype(entry));
8690
- if (!isRecord8(value))
8777
+ if (!isRecord9(value))
8691
8778
  return false;
8692
8779
  const prototype = Object.getPrototypeOf(value);
8693
8780
  if (prototype !== Object.prototype && prototype !== null)
8694
8781
  return true;
8695
8782
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
8696
8783
  }
8697
- function isRecord8(value) {
8784
+ function isRecord9(value) {
8698
8785
  return typeof value === "object" && value !== null && !Array.isArray(value);
8699
8786
  }
8700
8787
  function containerAt(record, path) {
8701
8788
  let container = record;
8702
8789
  for (const segment of path) {
8703
8790
  const next = container[segment];
8704
- if (!isRecord8(next))
8791
+ if (!isRecord9(next))
8705
8792
  return null;
8706
8793
  container = next;
8707
8794
  }
@@ -8812,6 +8899,15 @@ function legacyCategoryDiagnostic(path, renames) {
8812
8899
  issuePaths: renames.map((rename) => rename.path)
8813
8900
  };
8814
8901
  }
8902
+ function legacyHarnessDiagnostic(path, renames) {
8903
+ const detail = renames.map((rename) => rename.dropped ? `${rename.path} ignored because ${rename.canonical} is also configured` : `${rename.path} renamed to ${rename.canonical}`).join(", ");
8904
+ return {
8905
+ kind: "deprecated-keys",
8906
+ message: `Deprecated harness block in ${path}: ${detail}. Rename it; the alias is removed in a future release.`,
8907
+ path,
8908
+ issuePaths: renames.map((rename) => rename.path)
8909
+ };
8910
+ }
8815
8911
  function loadOmoConfig(options = {}) {
8816
8912
  const fileSystem = options.fileSystem ?? DEFAULT_READ_FILE_SYSTEM;
8817
8913
  const cwd = options.cwd ?? process.cwd();
@@ -8834,8 +8930,12 @@ function loadOmoConfig(options = {}) {
8834
8930
  if (canonicalized.renames.length > 0) {
8835
8931
  diagnostics.push(legacyCategoryDiagnostic(candidate.path, canonicalized.renames));
8836
8932
  }
8837
- layers.push({ config: canonicalized.document, source: loaded.source });
8838
- merged = mergeOmoConfigRecords(merged, canonicalized.document);
8933
+ const harnessCanonicalized = canonicalizeLegacyHarnessBlocks(canonicalized.document);
8934
+ if (harnessCanonicalized.renames.length > 0) {
8935
+ diagnostics.push(legacyHarnessDiagnostic(candidate.path, harnessCanonicalized.renames));
8936
+ }
8937
+ layers.push({ config: harnessCanonicalized.document, source: loaded.source });
8938
+ merged = mergeOmoConfigRecords(merged, harnessCanonicalized.document);
8839
8939
  }
8840
8940
  }
8841
8941
  const requestedProfile = resolveOmoProfileName({
@@ -11239,10 +11339,10 @@ function readCatalogMultiAgentVersion(model, cachePath) {
11239
11339
  } catch {
11240
11340
  return null;
11241
11341
  }
11242
- if (!isRecord9(cache) || !Array.isArray(cache.models))
11342
+ if (!isRecord10(cache) || !Array.isArray(cache.models))
11243
11343
  return null;
11244
11344
  for (const entry of cache.models) {
11245
- if (!isRecord9(entry))
11345
+ if (!isRecord10(entry))
11246
11346
  continue;
11247
11347
  if (entry.slug !== model && entry.id !== model)
11248
11348
  continue;
@@ -11267,7 +11367,7 @@ function readRootModelCatalogPath(config) {
11267
11367
  const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
11268
11368
  return single?.[1] ?? null;
11269
11369
  }
11270
- function isRecord9(value) {
11370
+ function isRecord10(value) {
11271
11371
  return typeof value === "object" && value !== null && !Array.isArray(value);
11272
11372
  }
11273
11373
  function removeFeatureFlagSetting(config, featureName) {
@@ -8,7 +8,7 @@
8
8
  "command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
9
9
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.0-beta.81) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.0-beta.81) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.0.0-beta.81) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) Recommending Git Bash MCP"
12
12
  }
13
13
  ]
14
14
  }
@@ -20,7 +20,7 @@
20
20
  "type": "command",
21
21
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
22
22
  "timeout": 5,
23
- "statusMessage": "(OmO 5.0.0-beta.81) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.83) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.81) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "5.0.0-beta.81",
4
- "inputDigest": "sha256:319828ab37967b4cd77e0a52d4e5d4bada4acea967ec72506e9540f604e56e0d",
3
+ "version": "5.0.0-beta.83",
4
+ "inputDigest": "sha256:c2a4d0a5733ce0a84a7b045a3c294a3b1b17f06e421e60a6f19ce486a03aaa2f",
5
5
  "outputs": [
6
6
  {
7
7
  "path": "cli.d.ts",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 60,
11
- "statusMessage": "(OmO 5.0.0-beta.81) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking LSP Diagnostics"
12
12
  }
13
13
  ]
14
14
  }
@@ -21,7 +21,7 @@
21
21
  "type": "command",
22
22
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
23
23
  "timeout": 5,
24
- "statusMessage": "(OmO 5.0.0-beta.81) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.0.0-beta.83) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.81) Loading Project Rules"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) Loading Project Rules"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 5.0.0-beta.81) Loading Project Rules"
22
+ "statusMessage": "(OmO 5.0.0-beta.83) Loading Project Rules"
23
23
  }
24
24
  ]
25
25
  }
@@ -32,7 +32,7 @@
32
32
  "type": "command",
33
33
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
34
34
  "timeout": 10,
35
- "statusMessage": "(OmO 5.0.0-beta.81) Matching Project Rules"
35
+ "statusMessage": "(OmO 5.0.0-beta.83) Matching Project Rules"
36
36
  }
37
37
  ]
38
38
  }
@@ -45,7 +45,7 @@
45
45
  "type": "command",
46
46
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
47
47
  "timeout": 10,
48
- "statusMessage": "(OmO 5.0.0-beta.81) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 5.0.0-beta.83) Resetting Project Rule Cache"
49
49
  }
50
50
  ]
51
51
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-rules",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.0-beta.81) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking Thread Title Hygiene"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.81) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.81) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.81) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
3
- "version": "5.0.0-beta.81",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1362,12 +1362,24 @@ var REVIEWER_ROLES_BY_SURFACE = {
1362
1362
  gateReview: "lazycodex-gate-reviewer"
1363
1363
  },
1364
1364
  "omo-senpi": {
1365
- codeReview: "omo-senpi-code-reviewer",
1366
- manualQa: "omo-senpi-qa-executor",
1367
- gateReview: "omo-senpi-gate-reviewer"
1365
+ codeReview: "omo-native-code-reviewer",
1366
+ manualQa: "omo-native-qa-executor",
1367
+ gateReview: "omo-native-gate-reviewer"
1368
1368
  }
1369
1369
  };
1370
- var GATE_REVIEWER_AGENT_NAMES = new Set(Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview));
1370
+ var LEGACY_REVIEWER_AGENT_ALIASES = {
1371
+ "omo-senpi-code-reviewer": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].codeReview,
1372
+ "omo-senpi-qa-executor": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].manualQa,
1373
+ "omo-senpi-gate-reviewer": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].gateReview
1374
+ };
1375
+ function canonicalReviewerAgentName(reviewer) {
1376
+ return LEGACY_REVIEWER_AGENT_ALIASES[reviewer] ?? reviewer;
1377
+ }
1378
+ var CANONICAL_GATE_REVIEW_NAMES = Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview);
1379
+ var GATE_REVIEWER_AGENT_NAMES = new Set([
1380
+ ...CANONICAL_GATE_REVIEW_NAMES,
1381
+ ...Object.entries(LEGACY_REVIEWER_AGENT_ALIASES).filter(([, canonical]) => CANONICAL_GATE_REVIEW_NAMES.includes(canonical)).map(([legacy]) => legacy)
1382
+ ]);
1371
1383
  var REQUIRED_GATE_SECTIONS_BY_SURFACE = {
1372
1384
  lazycodex: ["manualQa", "gateReview", "iteration", "criteriaCoverage"],
1373
1385
  "omo-senpi": ["manualQa", "gateReview", "iteration", "criteriaCoverage"]
@@ -4437,11 +4449,12 @@ var SPAWN_TOOL_TOKENS = new Set([
4437
4449
  ]);
4438
4450
  var DEFAULT_FANOUT_LIMIT = 24;
4439
4451
  var DEFAULT_REVIEW_SPAWN_LIMIT = 3;
4440
- var GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
4452
+ var GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-native-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
4441
4453
  var REVIEW_AGENT_TYPES = [
4442
4454
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview),
4443
4455
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.codeReview),
4444
- ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.manualQa)
4456
+ ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.manualQa),
4457
+ ...Object.keys(LEGACY_REVIEWER_AGENT_ALIASES)
4445
4458
  ];
4446
4459
  var REVIEW_AGENT_TYPE_SET = new Set(REVIEW_AGENT_TYPES);
4447
4460
  function applySpawnGuards(payload, options = {}) {
@@ -4623,16 +4636,17 @@ function reviewAgentType(toolInput) {
4623
4636
  return GATE_MESSAGE_PATTERN.test(message) ? reviewerRolesFor(resolveToolkitSurface()).gateReview : null;
4624
4637
  }
4625
4638
  function activeSurfaceReviewerAlias(reviewer) {
4639
+ const canonical = canonicalReviewerAgentName(reviewer);
4626
4640
  const activeRoles = reviewerRolesFor(resolveToolkitSurface());
4627
4641
  for (const roles of Object.values(REVIEWER_ROLES_BY_SURFACE)) {
4628
- if (reviewer === roles.codeReview)
4642
+ if (canonical === roles.codeReview)
4629
4643
  return activeRoles.codeReview;
4630
- if (reviewer === roles.manualQa)
4644
+ if (canonical === roles.manualQa)
4631
4645
  return activeRoles.manualQa;
4632
- if (reviewer === roles.gateReview)
4646
+ if (canonical === roles.gateReview)
4633
4647
  return activeRoles.gateReview;
4634
4648
  }
4635
- return reviewer;
4649
+ return canonical;
4636
4650
  }
4637
4651
  function deny(reason) {
4638
4652
  return `${JSON.stringify({
@@ -7,7 +7,7 @@ import { readUlwLoopPlanSync } from "./plan-io.js";
7
7
  import { atomicWriteJson, isNonEmptyFile, readAdmissionBreaker, readCount, readCounts } from "./spawn-budget-io.js";
8
8
  import { spawnRoleDenial } from "./spawn-role-guard.js";
9
9
  import { isStateLockTimeout, withStateLockSync } from "./state-lock.js";
10
- import { GATE_REVIEWER_AGENT_NAMES, REVIEWER_ROLES_BY_SURFACE, resolveToolkitSurface, reviewerRolesFor, } from "./surface.js";
10
+ import { canonicalReviewerAgentName, GATE_REVIEWER_AGENT_NAMES, LEGACY_REVIEWER_AGENT_ALIASES, REVIEWER_ROLES_BY_SURFACE, resolveToolkitSurface, reviewerRolesFor, } from "./surface.js";
11
11
  // spawn_agent = v1; collaborationspawn_agent = the delimiter-free flattened v2
12
12
  // hook token from codex-rs hook_names.rs; collaboration.spawn_agent = the
13
13
  // dotted token observed live in the task-1 probe (hook-tool-tokens.txt).
@@ -19,11 +19,12 @@ const SPAWN_TOOL_TOKENS = new Set([
19
19
  ]);
20
20
  export const DEFAULT_FANOUT_LIMIT = 24;
21
21
  const DEFAULT_REVIEW_SPAWN_LIMIT = 3;
22
- const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
22
+ const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-native-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
23
23
  const REVIEW_AGENT_TYPES = [
24
24
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview),
25
25
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.codeReview),
26
26
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.manualQa),
27
+ ...Object.keys(LEGACY_REVIEWER_AGENT_ALIASES),
27
28
  ];
28
29
  const REVIEW_AGENT_TYPE_SET = new Set(REVIEW_AGENT_TYPES);
29
30
  export function applySpawnGuards(payload, options = {}) {
@@ -230,16 +231,17 @@ function reviewAgentType(toolInput) {
230
231
  return GATE_MESSAGE_PATTERN.test(message) ? reviewerRolesFor(resolveToolkitSurface()).gateReview : null;
231
232
  }
232
233
  function activeSurfaceReviewerAlias(reviewer) {
234
+ const canonical = canonicalReviewerAgentName(reviewer);
233
235
  const activeRoles = reviewerRolesFor(resolveToolkitSurface());
234
236
  for (const roles of Object.values(REVIEWER_ROLES_BY_SURFACE)) {
235
- if (reviewer === roles.codeReview)
237
+ if (canonical === roles.codeReview)
236
238
  return activeRoles.codeReview;
237
- if (reviewer === roles.manualQa)
239
+ if (canonical === roles.manualQa)
238
240
  return activeRoles.manualQa;
239
- if (reviewer === roles.gateReview)
241
+ if (canonical === roles.gateReview)
240
242
  return activeRoles.gateReview;
241
243
  }
242
- return reviewer;
244
+ return canonical;
243
245
  }
244
246
  function deny(reason) {
245
247
  return `${JSON.stringify({
@@ -5,6 +5,8 @@ export interface UlwLoopReviewerRoles {
5
5
  readonly gateReview: string;
6
6
  }
7
7
  export declare const REVIEWER_ROLES_BY_SURFACE: Readonly<Record<UlwLoopToolkitSurface, UlwLoopReviewerRoles>>;
8
+ export declare const LEGACY_REVIEWER_AGENT_ALIASES: Readonly<Record<string, string>>;
9
+ export declare function canonicalReviewerAgentName(reviewer: string): string;
8
10
  export declare const GATE_REVIEWER_AGENT_NAMES: ReadonlySet<string>;
9
11
  export type UlwLoopGateSection = "codeReview" | "manualQa" | "gateReview" | "iteration" | "criteriaCoverage";
10
12
  export declare const REQUIRED_GATE_SECTIONS_BY_SURFACE: Readonly<Record<UlwLoopToolkitSurface, readonly UlwLoopGateSection[]>>;