oh-my-opencode 5.1.12 → 5.1.13

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 (78) hide show
  1. package/dist/cli/index.js +43 -16
  2. package/dist/cli-node/index.js +43 -16
  3. package/dist/features/background-agent/fallback-provider-model-filter.d.ts +12 -0
  4. package/dist/features/background-agent/manager.d.ts +1 -0
  5. package/dist/features/background-agent/session-stopped-on-error.d.ts +9 -0
  6. package/dist/features/background-agent/types.d.ts +2 -0
  7. package/dist/index.js +171 -27
  8. package/dist/oh-my-opencode.schema.json +0 -107
  9. package/dist/shared/posthog.d.ts +1 -0
  10. package/dist/skills/browser/runtime/omowright/manifest.json +1 -1
  11. package/dist/tui.js +14 -14
  12. package/package.json +14 -14
  13. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  14. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  23. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  24. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +1 -1
  26. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +1 -1
  27. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-6.md +1 -1
  28. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  29. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  31. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  33. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  35. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +89 -28
  39. package/packages/omo-codex/plugin/components/ulw-loop/dist/registered-agent-roles.d.ts +1 -0
  40. package/packages/omo-codex/plugin/components/ulw-loop/dist/registered-agent-roles.js +61 -0
  41. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +2 -1
  42. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.d.ts +1 -1
  43. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-role-guard.js +6 -2
  44. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  45. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/ulw-loop/src/registered-agent-roles.ts +60 -0
  47. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +2 -1
  48. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-role-guard.ts +8 -2
  49. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-matrix.test.ts +1 -0
  50. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-role-registered.test.ts +128 -0
  51. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  72. package/packages/omo-codex/plugin/package-lock.json +12 -12
  73. package/packages/omo-codex/plugin/package.json +1 -1
  74. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  75. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +4 -3
  76. package/packages/omo-codex/plugin/test/aggregate.test.mjs +2 -2
  77. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  78. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
@@ -0,0 +1,128 @@
1
+ import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { applySpawnGuards } from "../src/spawn-guard.js";
6
+
7
+ let root: string;
8
+ let project: string;
9
+ let codexHome: string;
10
+
11
+ beforeEach(async () => {
12
+ root = await mkdtemp(join(tmpdir(), "spawn-role-registered-"));
13
+ project = join(root, "project");
14
+ codexHome = join(root, "codex-home");
15
+ await mkdir(join(project, "src", "deep"), { recursive: true });
16
+ vi.stubEnv("OMO_AGENT_TOOLKIT_SURFACE", "lazycodex");
17
+ vi.stubEnv("PLUGIN_DATA", join(root, "data"));
18
+ vi.stubEnv("CODEX_HOME", codexHome);
19
+ });
20
+ afterEach(async () => {
21
+ vi.unstubAllEnvs();
22
+ await rm(root, { recursive: true, force: true });
23
+ });
24
+
25
+ async function role(dir: string, file: string, name?: string): Promise<void> {
26
+ await mkdir(dir, { recursive: true });
27
+ const header = name === undefined ? "" : `name = "${name}"\n`;
28
+ await writeFile(join(dir, file), `${header}description = "custom role"\ndeveloper_instructions = "Do the work."\n`);
29
+ }
30
+
31
+ function spawn(cwd: string, input: Record<string, unknown>): string {
32
+ return applySpawnGuards({
33
+ cwd,
34
+ hook_event_name: "PreToolUse",
35
+ model: "test",
36
+ permission_mode: "default",
37
+ session_id: "registered",
38
+ tool_name: "spawn_agent",
39
+ tool_input: {
40
+ task_name: "check",
41
+ message: "Perform the assigned read-only analysis.",
42
+ fork_turns: "none",
43
+ ...input,
44
+ },
45
+ tool_use_id: "call",
46
+ transcript_path: null,
47
+ turn_id: "turn",
48
+ });
49
+ }
50
+
51
+ function denial(output: string): string | null {
52
+ if (output === "") return null;
53
+ const parsed: { hookSpecificOutput: { permissionDecision: string; permissionDecisionReason: string } } =
54
+ JSON.parse(output);
55
+ expect(parsed.hookSpecificOutput.permissionDecision).toBe("deny");
56
+ return parsed.hookSpecificOutput.permissionDecisionReason;
57
+ }
58
+
59
+ describe("#given custom roles registered outside the bundle", () => {
60
+ describe("#when a project registers them in .codex/agents", () => {
61
+ it("#then each registered role spawns, including from a nested working directory", async () => {
62
+ const agents = join(project, ".codex", "agents");
63
+ for (const name of ["cashflow_planner", "debt_planner", "wealth_planner", "finance_reviewer"])
64
+ await role(agents, `${name}.toml`, name);
65
+
66
+ for (const name of ["cashflow_planner", "debt_planner", "wealth_planner", "finance_reviewer"]) {
67
+ expect(denial(spawn(project, { agent_type: name }))).toBeNull();
68
+ expect(denial(spawn(join(project, "src", "deep"), { agent_type: name }))).toBeNull();
69
+ }
70
+ });
71
+
72
+ it("#then the role is keyed by its declared name, not the file name", async () => {
73
+ await role(join(project, ".codex", "agents"), "planner-file.toml", "wealth_planner");
74
+
75
+ expect(denial(spawn(project, { agent_type: "wealth_planner" }))).toBeNull();
76
+ expect(denial(spawn(project, { agent_type: "planner-file" }))).toContain('Received "planner-file"');
77
+ });
78
+
79
+ it("#then a role file without a name field registers under its file name", async () => {
80
+ await role(join(project, ".codex", "agents"), "cashflow_planner.toml");
81
+
82
+ expect(denial(spawn(project, { agent_type: "cashflow_planner" }))).toBeNull();
83
+ });
84
+ });
85
+
86
+ describe("#when they are registered under CODEX_HOME", () => {
87
+ it("#then a standalone agents/*.toml role and a config.toml [agents.<name>] role both spawn", async () => {
88
+ await role(join(codexHome, "agents"), "finance_reviewer.toml", "finance_reviewer");
89
+ await writeFile(
90
+ join(codexHome, "config.toml"),
91
+ '[agents]\nmax_threads = 4\n\n[agents.debt_planner]\nconfig_file = "./agents/debt.toml"\n',
92
+ );
93
+
94
+ expect(denial(spawn(project, { agent_type: "finance_reviewer" }))).toBeNull();
95
+ expect(denial(spawn(project, { agent_type: "debt_planner" }))).toBeNull();
96
+ });
97
+ });
98
+ });
99
+
100
+ describe("#given the guard's purpose of never spawning an unregistered or generic agent", () => {
101
+ it("#when the role has no role file anywhere #then it is still denied and the message lists the registered roles", async () => {
102
+ await role(join(project, ".codex", "agents"), "cashflow_planner.toml", "cashflow_planner");
103
+
104
+ const reason = denial(spawn(project, { agent_type: "worker" }));
105
+
106
+ expect(reason).toContain('Received "worker"');
107
+ expect(reason).toContain("cashflow_planner");
108
+ expect(reason).toContain("lazycodex-worker-medium");
109
+ });
110
+
111
+ it("#when agent_type is missing #then it is denied even with custom roles registered", async () => {
112
+ await role(join(project, ".codex", "agents"), "cashflow_planner.toml", "cashflow_planner");
113
+
114
+ expect(denial(spawn(project, {}))).toContain("Received no agent_type");
115
+ });
116
+
117
+ it("#when a role is registered only in a different project #then this project still denies it", async () => {
118
+ const other = join(root, "other-project");
119
+ await role(join(other, ".codex", "agents"), "cashflow_planner.toml", "cashflow_planner");
120
+
121
+ expect(denial(spawn(project, { agent_type: "cashflow_planner" }))).toContain('Received "cashflow_planner"');
122
+ });
123
+
124
+ it("#when the agents directory is unreadable or absent #then bundled roles still spawn", async () => {
125
+ expect(denial(spawn(project, { agent_type: "lazycodex-worker-medium" }))).toBeNull();
126
+ expect(denial(spawn(project, { agent_type: "explorer" }))).toBeNull();
127
+ });
128
+ });
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.12) Resetting Git Bash MCP Reminder",
10
+ "statusMessage": "(OmO 5.1.13) Resetting Git Bash MCP Reminder",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-compact",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.12) Resetting LSP Diagnostics Cache",
10
+ "statusMessage": "(OmO 5.1.13) Resetting LSP Diagnostics Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-compact",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.12) Resetting Project Rule Cache",
10
+ "statusMessage": "(OmO 5.1.13) Resetting Project Rule Cache",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-compact"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/comment-checker/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 30,
10
- "statusMessage": "(OmO 5.1.12) Checking Comments",
10
+ "statusMessage": "(OmO 5.1.13) Checking Comments",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\comment-checker\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lsp/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 60,
10
- "statusMessage": "(OmO 5.1.12) Checking LSP Diagnostics",
10
+ "statusMessage": "(OmO 5.1.13) Checking LSP Diagnostics",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lsp\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/teammode/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.1.12) Checking Thread Title Hygiene",
11
+ "statusMessage": "(OmO 5.1.13) Checking Thread Title Hygiene",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\teammode\\dist\\cli.js\" hook post-tool-use"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook post-tool-use",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.12) Matching Project Rules",
10
+ "statusMessage": "(OmO 5.1.13) Matching Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook post-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook post-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.1.12) Recording Spawn Admission",
11
+ "statusMessage": "(OmO 5.1.13) Recording Spawn Admission",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook post-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.12) Enforcing Unlimited Goal Budget",
10
+ "statusMessage": "(OmO 5.1.13) Enforcing Unlimited Goal Budget",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook pre-tool-use-spawn",
10
10
  "timeout": 5,
11
- "statusMessage": "(OmO 5.1.12) Guarding Ulw-Loop Spawns",
11
+ "statusMessage": "(OmO 5.1.13) Guarding Ulw-Loop Spawns",
12
12
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook pre-tool-use-spawn"
13
13
  }
14
14
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/git-bash/dist/cli.js\" hook pre-tool-use",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.12) Recommending Git Bash MCP",
10
+ "statusMessage": "(OmO 5.1.13) Recommending Git Bash MCP",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\git-bash\\dist\\cli.js\" hook pre-tool-use"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/scripts/auto-update.mjs\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.1.12) Checking Auto Update",
10
+ "statusMessage": "(OmO 5.1.13) Checking Auto Update",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\scripts\\auto-update.mjs\" hook session-start"
12
12
  }
13
13
  ],
@@ -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.1.12) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.13) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook session-start",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.12) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.1.13) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/telemetry/dist/cli.js\" hook session-start",
9
9
  "timeout": 15,
10
- "statusMessage": "(OmO 5.1.12) Recording Session Telemetry",
10
+ "statusMessage": "(OmO 5.1.13) Recording Session Telemetry",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\telemetry\\dist\\cli.js\" hook session-start"
12
12
  }
13
13
  ]
@@ -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.1.12) Checking Ulw-Execute Continuation",
10
+ "statusMessage": "(OmO 5.1.13) Checking Ulw-Execute Continuation",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-execute-continuation\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.12) Checking Ulw-Loop Resume",
10
+ "statusMessage": "(OmO 5.1.13) Checking Ulw-Loop Resume",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.12) Verifying LazyCodex Executor Evidence",
10
+ "statusMessage": "(OmO 5.1.13) Verifying LazyCodex Executor Evidence",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lazycodex-executor-verify\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.12) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 5.1.13) Checking Ultrawork Trigger",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ultrawork\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.12) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 5.1.13) Checking Ulw-Loop Steering",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.12) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.1.13) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.12",
3
+ "version": "5.1.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "5.1.12",
9
+ "version": "5.1.13",
10
10
  "workspaces": [
11
11
  "components/comment-checker",
12
12
  "components/git-bash",
@@ -95,7 +95,7 @@
95
95
  },
96
96
  "components/comment-checker": {
97
97
  "name": "@code-yeongyu/codex-comment-checker",
98
- "version": "5.1.12",
98
+ "version": "5.1.13",
99
99
  "license": "MIT",
100
100
  "bin": {
101
101
  "omo-comment-checker": "dist/cli.js"
@@ -117,7 +117,7 @@
117
117
  },
118
118
  "components/git-bash": {
119
119
  "name": "@sisyphuslabs/codex-git-bash-hook",
120
- "version": "5.1.12",
120
+ "version": "5.1.13",
121
121
  "bin": {
122
122
  "omo-git-bash-hook": "dist/cli.js"
123
123
  },
@@ -131,7 +131,7 @@
131
131
  },
132
132
  "components/lazycodex-executor-verify": {
133
133
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
134
- "version": "5.1.12",
134
+ "version": "5.1.13",
135
135
  "license": "MIT",
136
136
  "bin": {
137
137
  "lazycodex-executor-verify": "dist/cli.js"
@@ -149,7 +149,7 @@
149
149
  },
150
150
  "components/lsp": {
151
151
  "name": "@code-yeongyu/codex-lsp",
152
- "version": "5.1.12",
152
+ "version": "5.1.13",
153
153
  "license": "MIT",
154
154
  "dependencies": {
155
155
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon",
@@ -171,7 +171,7 @@
171
171
  },
172
172
  "components/rules": {
173
173
  "name": "@code-yeongyu/codex-rules",
174
- "version": "5.1.12",
174
+ "version": "5.1.13",
175
175
  "license": "MIT",
176
176
  "dependencies": {
177
177
  "picomatch": "^4.0.7"
@@ -194,7 +194,7 @@
194
194
  },
195
195
  "components/teammode": {
196
196
  "name": "@sisyphuslabs/codex-teammode",
197
- "version": "5.1.12",
197
+ "version": "5.1.13",
198
198
  "devDependencies": {
199
199
  "@types/node": "^26.6.2",
200
200
  "@vitest/coverage-v8": "5.0.1",
@@ -208,7 +208,7 @@
208
208
  },
209
209
  "components/telemetry": {
210
210
  "name": "@code-yeongyu/codex-telemetry",
211
- "version": "5.1.12",
211
+ "version": "5.1.13",
212
212
  "license": "MIT",
213
213
  "bin": {
214
214
  "omo-telemetry": "dist/cli.js"
@@ -227,7 +227,7 @@
227
227
  },
228
228
  "components/ultrawork": {
229
229
  "name": "@code-yeongyu/codex-ultrawork",
230
- "version": "5.1.12",
230
+ "version": "5.1.13",
231
231
  "license": "MIT",
232
232
  "bin": {
233
233
  "omo-ultrawork": "dist/cli.js"
@@ -246,7 +246,7 @@
246
246
  },
247
247
  "components/ulw-execute-continuation": {
248
248
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
249
- "version": "5.1.12",
249
+ "version": "5.1.13",
250
250
  "license": "MIT",
251
251
  "bin": {
252
252
  "omo-ulw-execute-continuation": "dist/cli.js"
@@ -264,7 +264,7 @@
264
264
  },
265
265
  "components/ulw-loop": {
266
266
  "name": "@code-yeongyu/codex-ulw-loop",
267
- "version": "5.1.12",
267
+ "version": "5.1.13",
268
268
  "license": "MIT",
269
269
  "bin": {
270
270
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.12",
3
+ "version": "5.1.13",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -5,5 +5,5 @@
5
5
  "index.js": "b6b064fab277031c6c51f5a58b84b31040f9960bf767bf646adc0540c1d25c1b",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-03T02:23:11.058Z"
8
+ "stagedAtUtc": "2026-10-03T10:05:36.975Z"
9
9
  }
@@ -232,10 +232,11 @@ export function findSpawnAgentCallsWithoutIsolation(content) {
232
232
 
233
233
  export function findSpawnAgentCallsWithUnsupportedParameters(content) {
234
234
  return findSpawnAgentCalls(content).flatMap((entry) => {
235
- const allowsObjectAgentType = entry.receiver === "multi_agent_v1";
235
+ // Both multi_agent_v1 and the flat v2 spawn_agent take an object agent_type once roles are
236
+ // configured (codex exposes it whenever agent_roles is non-empty), and the LazyCodex spawn
237
+ // guard requires it, so only the direct keyword form is unsupported.
236
238
  const parameters = spawnParameters(entry.call)
237
- .filter(({ name, direct }) => name === "model" || name === "reasoning_effort" ||
238
- (name === "agent_type" && (direct || !allowsObjectAgentType)))
239
+ .filter(({ name, direct }) => name === "model" || name === "reasoning_effort" || (name === "agent_type" && direct))
239
240
  .map(({ name }) => name);
240
241
  return parameters.length === 0 ? [] : [{ ...entry, parameters }];
241
242
  });
@@ -37,7 +37,7 @@ test("#given spawn parameter mutations and role-like prose #when parsed #then on
37
37
  const content = [
38
38
  'multi_agent_v1.spawn_agent({"message":"model and reasoning_effort are prose","agent_type":"explorer","fork_context":false})',
39
39
  'multi_agent_v1.spawn_agent(agent_type="explorer", message="invalid keyword role", fork_context=false)',
40
- 'spawn_agent({"message":"invalid flat role","agent_type":"explorer","fork_turns":"none"})',
40
+ 'spawn_agent({"message":"valid flat role","agent_type":"explorer","fork_turns":"none"})',
41
41
  'spawn_agent(agent_type="explorer", message="invalid direct role", fork_turns="none")',
42
42
  'spawn_agent({"message":"model and agent_type are prose","metadata":{"model":"nested","agent_type":"nested"},"fork_turns":"none"})',
43
43
  'spawn_agent({"message":"placeholder prose","agent_type":...,"fork_turns":"none"})',
@@ -47,7 +47,7 @@ test("#given spawn parameter mutations and role-like prose #when parsed #then on
47
47
 
48
48
  assert.deepEqual(
49
49
  findSpawnAgentCallsWithUnsupportedParameters(content).map(({ parameters }) => parameters),
50
- [["agent_type"], ["agent_type"], ["agent_type"], ["model"], ["reasoning_effort"]],
50
+ [["agent_type"], ["agent_type"], ["model"], ["reasoning_effort"]],
51
51
  );
52
52
  });
53
53
 
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // omo-codex-install:c0b6024c5ee9234aa4d998b1b7d8d3ba1f32b7c9ef694bec8770b7bfc1d89cf5:71dfd93a6476d503675beb6000f5aa02a1cd0304a8f2c977e661a745529feca2
2
+ // omo-codex-install:a0bebc8c2920f1b4f3d773bba8b0126d4e26039d00ceb022bbd3b4108129f67b:ecb26caccb183103b6079eb81ab2586dbfd542b38b3b25fb0fa890bf11b654eb
3
3
  var __esm = (fn, res, err) => () => {
4
4
  if (fn)
5
5
  try {
@@ -9984,7 +9984,7 @@ var package_default;
9984
9984
  var init_package = __esm(() => {
9985
9985
  package_default = {
9986
9986
  name: "@oh-my-opencode/omo-codex",
9987
- version: "5.1.12",
9987
+ version: "5.1.13",
9988
9988
  type: "module",
9989
9989
  private: true,
9990
9990
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -5,5 +5,5 @@
5
5
  "index.js": "b6b064fab277031c6c51f5a58b84b31040f9960bf767bf646adc0540c1d25c1b",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-03T02:23:11.058Z"
8
+ "stagedAtUtc": "2026-10-03T10:05:36.975Z"
9
9
  }