oh-my-opencode 5.0.0-beta.8 → 5.0.0-beta.9

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 (114) hide show
  1. package/.agents/command/publish.md +44 -16
  2. package/.agents/skills/publish/SKILL.md +44 -16
  3. package/.opencode/command/publish.md +44 -16
  4. package/dist/agents/atlas/agent.d.ts +0 -1
  5. package/dist/cli/index.js +34 -31
  6. package/dist/cli/run/on-complete-hook.d.ts +2 -0
  7. package/dist/cli-node/index.js +34 -31
  8. package/dist/hooks/atlas/final-wave-approval-gate.test-support.d.ts +50 -0
  9. package/dist/hooks/atlas/system-reminder-templates.d.ts +0 -1
  10. package/dist/index.js +25 -24
  11. package/dist/shared/shell-env.d.ts +1 -1
  12. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +35 -8
  13. package/dist/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  14. package/dist/tui.js +2 -2
  15. package/package.json +15 -14
  16. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  17. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  18. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +2 -2
  20. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +2 -2
  21. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  23. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  25. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +3 -17
  29. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  30. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  31. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  32. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  33. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/rules/test/bundled-rules-priority.test.ts +11 -16
  35. package/packages/omo-codex/plugin/components/rules/test/bundled-rules.test.ts +16 -23
  36. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-budget.test.ts +9 -7
  37. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-context.test.ts +0 -6
  38. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-dedup.test.ts +6 -4
  39. package/packages/omo-codex/plugin/components/rules/test/codex-hook-post-compact-directive.test.ts +12 -9
  40. package/packages/omo-codex/plugin/components/rules/test/codex-hook.test.ts +28 -37
  41. package/packages/omo-codex/plugin/components/rules/test/formatter.test.ts +37 -69
  42. package/packages/omo-codex/plugin/components/rules/test/hook-output.test.ts +2 -3
  43. package/packages/omo-codex/plugin/components/rules/test/windows-git-bash-bundled-rule.test.ts +1 -15
  44. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  45. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +0 -3
  47. package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +2 -16
  48. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  49. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  50. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +3 -9
  51. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  52. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  53. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  54. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +0 -136
  56. package/packages/omo-codex/plugin/components/ultrawork/test/skill-pointer.test.ts +0 -2
  57. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  58. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  59. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-continuation.test.ts +0 -1
  60. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +2 -2
  61. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +0 -3
  62. package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +2 -35
  63. package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +4 -5
  64. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  87. package/packages/omo-codex/plugin/package-lock.json +20 -20
  88. package/packages/omo-codex/plugin/package.json +1 -1
  89. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +35 -8
  90. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  91. package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +19 -173
  92. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +4 -24
  93. package/packages/omo-codex/plugin/test/aggregate-plugin-fixture.mjs +175 -13
  94. package/packages/omo-codex/plugin/test/aggregate.test.mjs +78 -2
  95. package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +19 -33
  96. package/packages/omo-codex/plugin/test/lcx-contribute-bug-fix-template.test.mjs +21 -27
  97. package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +0 -36
  98. package/packages/omo-codex/plugin/test/sync-skills-codex-compatibility.test.mjs +101 -0
  99. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -119
  100. package/packages/omo-codex/plugin/test/teammode-archive-ambiguity.test.mjs +0 -40
  101. package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +6 -62
  102. package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +3 -36
  103. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +0 -44
  104. package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +2 -6
  105. package/packages/omo-codex/plugin/test/ultrawork-skill-pointer.test.mjs +0 -3
  106. package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +0 -3
  107. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2 -2
  108. package/packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs +7 -2
  109. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +35 -8
  110. package/packages/shared-skills/skills/ultimate-browsing/engine/AGENTS.md +110 -0
  111. package/dist/tools/call-omo-agent/background-agent-executor.d.ts +0 -5
  112. package/packages/omo-codex/plugin/test/aggregate-skills.test.mjs +0 -92
  113. package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +0 -314
  114. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +0 -24
@@ -1020,7 +1020,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
1020
1020
  this._exitCallback = (err) => {
1021
1021
  if (err.code !== "commander.executeSubCommandAsync") {
1022
1022
  throw err;
1023
- } else {}
1023
+ }
1024
1024
  };
1025
1025
  }
1026
1026
  return this;
@@ -2146,7 +2146,7 @@ var package_default;
2146
2146
  var init_package = __esm(() => {
2147
2147
  package_default = {
2148
2148
  name: "oh-my-opencode",
2149
- version: "5.0.0-beta.8",
2149
+ version: "5.0.0-beta.9",
2150
2150
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2151
2151
  main: "./dist/index.js",
2152
2152
  types: "dist/index.d.ts",
@@ -2282,6 +2282,7 @@ var init_package = __esm(() => {
2282
2282
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
2283
2283
  test: "bun test",
2284
2284
  "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
2285
+ "test:fast": "bun run script/test-fast.ts",
2285
2286
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test packages/omo-senpi",
2286
2287
  "test:windows-codex": "bun run test:codex",
2287
2288
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
@@ -2326,7 +2327,7 @@ var init_package = __esm(() => {
2326
2327
  zod: "^4.4.3"
2327
2328
  },
2328
2329
  devDependencies: {
2329
- "@code-yeongyu/senpi": "2026.8.16",
2330
+ "@code-yeongyu/senpi": "2026.8.17",
2330
2331
  "@oh-my-opencode/agents-md-core": "workspace:*",
2331
2332
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
2332
2333
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -2367,18 +2368,18 @@ var init_package = __esm(() => {
2367
2368
  typescript: "^7.0.2"
2368
2369
  },
2369
2370
  optionalDependencies: {
2370
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.8",
2371
- "oh-my-opencode-darwin-x64": "5.0.0-beta.8",
2372
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.8",
2373
- "oh-my-opencode-linux-arm64": "5.0.0-beta.8",
2374
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.8",
2375
- "oh-my-opencode-linux-x64": "5.0.0-beta.8",
2376
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.8",
2377
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.8",
2378
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.8",
2379
- "oh-my-opencode-windows-arm64": "5.0.0-beta.8",
2380
- "oh-my-opencode-windows-x64": "5.0.0-beta.8",
2381
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.8"
2371
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.9",
2372
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.9",
2373
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.9",
2374
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.9",
2375
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.9",
2376
+ "oh-my-opencode-linux-x64": "5.0.0-beta.9",
2377
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.9",
2378
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.9",
2379
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.9",
2380
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.9",
2381
+ "oh-my-opencode-windows-x64": "5.0.0-beta.9",
2382
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.9"
2382
2383
  },
2383
2384
  overrides: {
2384
2385
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -18763,7 +18764,7 @@ function finalize(ctx, schema) {
18763
18764
  result.$schema = "http://json-schema.org/draft-07/schema#";
18764
18765
  } else if (ctx.target === "draft-04") {
18765
18766
  result.$schema = "http://json-schema.org/draft-04/schema#";
18766
- } else if (ctx.target === "openapi-3.0") {} else {}
18767
+ } else if (ctx.target === "openapi-3.0") {}
18767
18768
  if (ctx.external?.uri) {
18768
18769
  const id = ctx.external.registry.get(schema)?.id;
18769
18770
  if (!id)
@@ -19024,7 +19025,7 @@ var formatMap, stringProcessor = (schema, ctx, _json, _params) => {
19024
19025
  if (val === undefined) {
19025
19026
  if (ctx.unrepresentable === "throw") {
19026
19027
  throw new Error("Literal `undefined` cannot be represented in JSON Schema");
19027
- } else {}
19028
+ }
19028
19029
  } else if (typeof val === "bigint") {
19029
19030
  if (ctx.unrepresentable === "throw") {
19030
19031
  throw new Error("BigInt literals cannot be represented in JSON Schema");
@@ -83263,21 +83264,21 @@ var init_session_cursor = __esm(() => {
83263
83264
  });
83264
83265
 
83265
83266
  // packages/omo-opencode/src/shared/shell-env.ts
83266
- function detectShellType() {
83267
- if (process.env.SHELL) {
83268
- const shell = process.env.SHELL;
83267
+ function detectShellType(platform = process.platform, env2 = process.env) {
83268
+ if (env2.SHELL) {
83269
+ const shell = env2.SHELL;
83269
83270
  if (shell.includes("csh") || shell.includes("tcsh")) {
83270
83271
  return "csh";
83271
83272
  }
83272
83273
  return "unix";
83273
83274
  }
83274
- if (process.platform === "win32" && (process.env.BASH_VERSION || process.env.MSYSTEM || process.env.WSL_DISTRO_NAME)) {
83275
+ if (platform === "win32" && (env2.BASH_VERSION || env2.MSYSTEM || env2.WSL_DISTRO_NAME)) {
83275
83276
  return "unix";
83276
83277
  }
83277
- if (process.env.PSModulePath) {
83278
+ if (env2.PSModulePath) {
83278
83279
  return "powershell";
83279
83280
  }
83280
- return process.platform === "win32" ? "cmd" : "unix";
83281
+ return platform === "win32" ? "cmd" : "unix";
83281
83282
  }
83282
83283
  var init_shell_env = () => {};
83283
83284
 
@@ -94685,7 +94686,7 @@ var package_default2;
94685
94686
  var init_package2 = __esm(() => {
94686
94687
  package_default2 = {
94687
94688
  name: "@oh-my-opencode/omo-codex",
94688
- version: "5.0.0-beta.8",
94689
+ version: "5.0.0-beta.9",
94689
94690
  type: "module",
94690
94691
  private: true,
94691
94692
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -106470,7 +106471,7 @@ function createJsonOutputManager(options = {}) {
106470
106471
 
106471
106472
  // packages/omo-opencode/src/cli/run/on-complete-hook.ts
106472
106473
  init_spawn_with_windows_hide();
106473
- init_shared();
106474
+ init_shell_env();
106474
106475
  init_logger2();
106475
106476
  var defaultDeps3 = {
106476
106477
  spawnWithWindowsHide,
@@ -106490,15 +106491,15 @@ async function readOutput(stream, streamName, deps = defaultDeps3) {
106490
106491
  return "";
106491
106492
  }
106492
106493
  }
106493
- function resolveHookShellCommand(command) {
106494
- const shellType = detectShellType();
106494
+ function resolveHookShellCommand(command, platform, env3) {
106495
+ const shellType = detectShellType(platform, env3);
106495
106496
  switch (shellType) {
106496
106497
  case "powershell": {
106497
- const powershellExecutable = process.platform === "win32" ? "powershell.exe" : "pwsh";
106498
+ const powershellExecutable = platform === "win32" ? "powershell.exe" : "pwsh";
106498
106499
  return [powershellExecutable, "-NoProfile", "-Command", command];
106499
106500
  }
106500
106501
  case "cmd":
106501
- return [process.env.ComSpec || "cmd.exe", "/d", "/s", "/c", command];
106502
+ return [env3.ComSpec || "cmd.exe", "/d", "/s", "/c", command];
106502
106503
  case "csh":
106503
106504
  return ["csh", "-c", command];
106504
106505
  case "unix":
@@ -106514,10 +106515,12 @@ async function executeOnCompleteHook(options, deps = defaultDeps3) {
106514
106515
  }
106515
106516
  deps.log("Running on-complete hook", { command: trimmedCommand });
106516
106517
  try {
106517
- const shellCommand = resolveHookShellCommand(trimmedCommand);
106518
+ const platform = deps.platform ?? process.platform;
106519
+ const env3 = deps.env ?? process.env;
106520
+ const shellCommand = resolveHookShellCommand(trimmedCommand, platform, env3);
106518
106521
  const proc = deps.spawnWithWindowsHide(shellCommand, {
106519
106522
  env: {
106520
- ...process.env,
106523
+ ...env3,
106521
106524
  SESSION_ID: sessionId,
106522
106525
  EXIT_CODE: String(exitCode),
106523
106526
  DURATION_MS: String(durationMs),
@@ -0,0 +1,50 @@
1
+ import { mock } from "bun:test";
2
+ import type { createAtlasHook } from "./index";
3
+ import type { createToolExecuteAfterHandler } from "./tool-execute-after";
4
+ import type { SessionState, ToolExecuteAfterOutput } from "./types";
5
+ type AtlasHookContext = Parameters<typeof createAtlasHook>[0];
6
+ type PromptMock = ReturnType<typeof mock>;
7
+ export type FinalWaveMockPluginInput = AtlasHookContext & {
8
+ _promptMock: PromptMock;
9
+ };
10
+ export type FinalWaveAfterHandlerHarness = {
11
+ sessionState: SessionState;
12
+ run: (toolOutput: ToolExecuteAfterOutput) => Promise<void>;
13
+ };
14
+ /**
15
+ * Builds a mock plugin input with a recording prompt mock. `resolveParentSessionID`
16
+ * maps a subagent task session id to the orchestrator session the task belongs to.
17
+ */
18
+ export declare function createFinalWaveMockPluginInput(options: {
19
+ directory: string;
20
+ resolveParentSessionID: (taskSessionID: string) => string;
21
+ }): FinalWaveMockPluginInput;
22
+ /**
23
+ * Registers per-test temp-directory lifecycle hooks (`.omo` scaffold + boulder state
24
+ * cleanup) and exposes the current directory. `resetAgentRegistration` also resets
25
+ * the shared claude-code session-state registry between tests.
26
+ */
27
+ export declare function registerFinalWaveTestEnvironment(options?: {
28
+ resetAgentRegistration?: boolean;
29
+ }): {
30
+ readonly directory: string;
31
+ };
32
+ /** Writes the plan markdown plus the boulder state pointing the session at it. */
33
+ export declare function writeFinalWavePlanState(options: {
34
+ directory: string;
35
+ sessionID: string;
36
+ planName: string;
37
+ planContent: string;
38
+ }): string;
39
+ /**
40
+ * Wraps `createToolExecuteAfterHandler` with a shared in-memory session-state map so
41
+ * tests can assert pause/count flags. The handler factory is passed in explicitly:
42
+ * suites that mock modules (`mock.module`) must hand over their post-mock import so
43
+ * the harness runs against the same module instance the suite asserts on.
44
+ */
45
+ export declare function createFinalWaveAfterHandlerHarness(options: {
46
+ ctx: AtlasHookContext;
47
+ sessionID: string;
48
+ createHandler: typeof createToolExecuteAfterHandler;
49
+ }): FinalWaveAfterHandlerHarness;
50
+ export {};
@@ -2,6 +2,5 @@ export declare const DIRECT_WORK_REMINDER: string;
2
2
  export declare const BOULDER_CONTINUATION_PROMPT: string;
3
3
  export declare const BOULDER_COMPLETE_PROMPT = "<system-reminder>\nBOULDER COMPLETE: plan \"{PLAN_NAME}\" is fully checked.\n\nTotal elapsed: {ELAPSED_HUMAN}\n\nPer-task breakdown:\n{TASK_BREAKDOWN}\n\nPer your <boulder_completion_response> instructions, print the final ORCHESTRATION COMPLETE summary in your next turn. This nudge fires at most once.\n</system-reminder>";
4
4
  export declare const VERIFICATION_REMINDER = "**THE SUBAGENT JUST CLAIMED THIS TASK IS DONE. THEY ARE PROBABLY LYING.**\n\nSubagents say \"done\" when code has errors, tests pass trivially, logic is wrong,\nor they quietly added features nobody asked for. This happens EVERY TIME.\nAssume the work is broken until YOU prove otherwise.\n\n---\n\n**PHASE 1: READ THE CODE FIRST (before running anything)**\n\nDo NOT run tests yet. Read the code FIRST so you know what you're testing.\n\n1. `Bash(\"git diff --stat -- ':!node_modules'\")` - see exactly which files changed. Any file outside expected scope = scope creep.\n2. `Read` EVERY changed file - no exceptions, no skimming.\n3. For EACH file, critically ask:\n - Does this code ACTUALLY do what the task required? (Re-read the task, compare line by line)\n - Any stubs, TODOs, placeholders, hardcoded values? (`Grep` for TODO, FIXME, HACK, xxx)\n - Logic errors? Trace the happy path AND the error path in your head.\n - Anti-patterns? (`Grep` for `as any`, `@ts-ignore`, empty catch, console.log in changed files)\n - Scope creep? Did the subagent touch things or add features NOT in the task spec?\n4. Cross-check every claim:\n - Said \"Updated X\" - READ X. Actually updated, or just superficially touched?\n - Said \"Added tests\" - READ the tests. Do they test REAL behavior or just `expect(true).toBe(true)`?\n - Said \"Follows patterns\" - OPEN a reference file. Does it ACTUALLY match?\n\n**If you cannot explain what every changed line does, you have NOT reviewed it.**\n\n**PHASE 2: RUN AUTOMATED CHECKS (targeted, then broad)**\n\nNow that you understand the code, verify mechanically:\n1. `lsp_diagnostics` on EACH changed file - ZERO new errors\n2. Run tests for changed modules FIRST, then full suite\n3. Build/typecheck - exit 0\n\nIf Phase 1 found issues but Phase 2 passes: Phase 2 is WRONG. The code has bugs that tests don't cover. Fix the code.\n\n**PHASE 3: HANDS-ON QA - ACTUALLY RUN IT (MANDATORY for user-facing changes)**\n\nTests and linters CANNOT catch: visual bugs, wrong CLI output, broken user flows, API response shape issues.\n\n**If this task produced anything a user would SEE or INTERACT with, you MUST launch it and verify yourself.**\n\n- **Frontend/UI**: `/playwright` skill - load the page, click through the flow, check console. Verify: page loads, interactions work, console clean, responsive.\n- **TUI/CLI**: `interactive_bash` - run the command, try good input, try bad input, try --help. Verify: command runs, output correct, error messages helpful, edge inputs handled.\n- **API/Backend**: `Bash` with curl - hit the endpoint, check response body, send malformed input. Verify: returns 200, body correct, error cases return proper errors.\n- **Config/Build**: Actually start the service or import the config. Verify: loads without error, backward compatible.\n\nThis is NOT optional \"if applicable\". If the deliverable is user-facing and you did not run it, you are shipping untested work.\n\n**PHASE 4: GATE DECISION - Should you proceed to the next task?**\n\nAnswer honestly:\n1. Can I explain what EVERY changed line does? (If no - back to Phase 1)\n2. Did I SEE it work with my own eyes? (If user-facing and no - back to Phase 3)\n3. Am I confident nothing existing is broken? (If no - run broader tests)\n\nALL three must be YES. \"Probably\" = NO. \"I think so\" = NO. Investigate until CERTAIN.\n\n- **All 3 YES** - Proceed: mark task complete, move to next.\n- **Any NO** - Reject: resume with `task_id`, fix the specific issue.\n- **Unsure** - Reject: \"unsure\" = \"no\". Investigate until you have a definitive answer.\n\n**DO NOT proceed to the next task until all 4 phases are complete and the gate passes.**";
5
- export declare const VERIFICATION_REMINDER_GEMINI = "**THE SUBAGENT HAS FINISHED. THEIR WORK IS EXTREMELY SUSPICIOUS.**\n\nThe subagent CLAIMS this task is done. Based on thousands of executions, subagent claims are FALSE more often than true.\nThey ROUTINELY:\n- Ship code with syntax errors they didn't bother to check\n- Create stub implementations with TODOs and call it \"done\"\n- Write tests that pass trivially (testing nothing meaningful)\n- Implement logic that does NOT match what was requested\n- Add features nobody asked for and call it \"improvement\"\n- Report \"all tests pass\" when they didn't run any tests\n\n**This is NOT a theoretical warning. This WILL happen on this task. Assume the work is BROKEN.**\n\n**YOU MUST VERIFY WITH ACTUAL TOOL CALLS. NOT REASONING. TOOL CALLS.**\nThinking \"it looks correct\" is NOT verification. Running `lsp_diagnostics` IS.\n\n---\n\n**PHASE 1: READ THE CODE FIRST (DO NOT SKIP - DO NOT RUN TESTS YET)**\n\nRead the code FIRST so you know what you're testing.\n\n1. `Bash(\"git diff --stat -- ':!node_modules'\")` - see exactly which files changed.\n2. `Read` EVERY changed file - no exceptions, no skimming.\n3. For EACH file:\n - Does this code ACTUALLY do what the task required? RE-READ the task spec.\n - Any stubs, TODOs, placeholders? `Grep` for TODO, FIXME, HACK, xxx\n - Anti-patterns? `Grep` for `as any`, `@ts-ignore`, empty catch\n - Scope creep? Did the subagent add things NOT in the task spec?\n4. Cross-check EVERY claim against actual code.\n\n**If you cannot explain what every changed line does, GO BACK AND READ AGAIN.**\n\n**PHASE 2: RUN AUTOMATED CHECKS**\n\n1. `lsp_diagnostics` on EACH changed file - ZERO new errors. ACTUALLY RUN THIS.\n2. Run tests for changed modules, then full suite. ACTUALLY RUN THESE.\n3. Build/typecheck - exit 0.\n\nIf Phase 1 found issues but Phase 2 passes: Phase 2 is WRONG. Fix the code.\n\n**PHASE 3: HANDS-ON QA (MANDATORY for user-facing changes)**\n\n- **Frontend/UI**: `/playwright`\n- **TUI/CLI**: `interactive_bash`\n- **API/Backend**: `Bash` with curl\n\n**If user-facing and you did not run it, you are shipping UNTESTED BROKEN work.**\n\n**PHASE 4: GATE DECISION**\n\n1. Can I explain what EVERY changed line does? (If no \u2192 Phase 1)\n2. Did I SEE it work via tool calls? (If user-facing and no \u2192 Phase 3)\n3. Am I confident nothing is broken? (If no \u2192 broader tests)\n\nALL three must be YES. \"Probably\" = NO. \"I think so\" = NO.\n\n**DO NOT proceed to the next task until all 4 phases are complete.**";
6
5
  export declare const ORCHESTRATOR_DELEGATION_REQUIRED: string;
7
6
  export declare const SINGLE_TASK_DIRECTIVE: string;
package/dist/index.js CHANGED
@@ -84416,21 +84416,21 @@ function restoreMessageCursor(sessionID, cursor) {
84416
84416
  sessionCursors.set(sessionID, cloneCursorState(cursor));
84417
84417
  }
84418
84418
  // packages/omo-opencode/src/shared/shell-env.ts
84419
- function detectShellType() {
84420
- if (process.env.SHELL) {
84421
- const shell = process.env.SHELL;
84419
+ function detectShellType(platform = process.platform, env2 = process.env) {
84420
+ if (env2.SHELL) {
84421
+ const shell = env2.SHELL;
84422
84422
  if (shell.includes("csh") || shell.includes("tcsh")) {
84423
84423
  return "csh";
84424
84424
  }
84425
84425
  return "unix";
84426
84426
  }
84427
- if (process.platform === "win32" && (process.env.BASH_VERSION || process.env.MSYSTEM || process.env.WSL_DISTRO_NAME)) {
84427
+ if (platform === "win32" && (env2.BASH_VERSION || env2.MSYSTEM || env2.WSL_DISTRO_NAME)) {
84428
84428
  return "unix";
84429
84429
  }
84430
- if (process.env.PSModulePath) {
84430
+ if (env2.PSModulePath) {
84431
84431
  return "powershell";
84432
84432
  }
84433
- return process.platform === "win32" ? "cmd" : "unix";
84433
+ return platform === "win32" ? "cmd" : "unix";
84434
84434
  }
84435
84435
  function shellEscape(value, shellType) {
84436
84436
  if (value === "") {
@@ -98726,7 +98726,7 @@ function getCachedVersion(options = {}) {
98726
98726
  // package.json
98727
98727
  var package_default = {
98728
98728
  name: "oh-my-opencode",
98729
- version: "5.0.0-beta.8",
98729
+ version: "5.0.0-beta.9",
98730
98730
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
98731
98731
  main: "./dist/index.js",
98732
98732
  types: "dist/index.d.ts",
@@ -98862,6 +98862,7 @@ var package_default = {
98862
98862
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
98863
98863
  test: "bun test",
98864
98864
  "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
98865
+ "test:fast": "bun run script/test-fast.ts",
98865
98866
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test packages/omo-senpi",
98866
98867
  "test:windows-codex": "bun run test:codex",
98867
98868
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
@@ -98906,7 +98907,7 @@ var package_default = {
98906
98907
  zod: "^4.4.3"
98907
98908
  },
98908
98909
  devDependencies: {
98909
- "@code-yeongyu/senpi": "2026.8.16",
98910
+ "@code-yeongyu/senpi": "2026.8.17",
98910
98911
  "@oh-my-opencode/agents-md-core": "workspace:*",
98911
98912
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
98912
98913
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -98947,18 +98948,18 @@ var package_default = {
98947
98948
  typescript: "^7.0.2"
98948
98949
  },
98949
98950
  optionalDependencies: {
98950
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.8",
98951
- "oh-my-opencode-darwin-x64": "5.0.0-beta.8",
98952
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.8",
98953
- "oh-my-opencode-linux-arm64": "5.0.0-beta.8",
98954
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.8",
98955
- "oh-my-opencode-linux-x64": "5.0.0-beta.8",
98956
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.8",
98957
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.8",
98958
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.8",
98959
- "oh-my-opencode-windows-arm64": "5.0.0-beta.8",
98960
- "oh-my-opencode-windows-x64": "5.0.0-beta.8",
98961
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.8"
98951
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.9",
98952
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.9",
98953
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.9",
98954
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.9",
98955
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.9",
98956
+ "oh-my-opencode-linux-x64": "5.0.0-beta.9",
98957
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.9",
98958
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.9",
98959
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.9",
98960
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.9",
98961
+ "oh-my-opencode-windows-x64": "5.0.0-beta.9",
98962
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.9"
98962
98963
  },
98963
98964
  overrides: {
98964
98965
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -116413,6 +116414,10 @@ async function handleAtlasSessionIdle(input) {
116413
116414
  return;
116414
116415
  }
116415
116416
  const { boulderState, progress, appendedSession } = activeBoulderSession;
116417
+ if (sessionState.waitingForFinalWaveApproval) {
116418
+ log2(`[${HOOK_NAME9}] Skipped: waiting for explicit final-wave approval`, { sessionID });
116419
+ return;
116420
+ }
116416
116421
  if (progress.isComplete) {
116417
116422
  await handleCompletedBoulderIdle({ ctx, options, sessionID, sessionState, boulderState });
116418
116423
  return;
@@ -116440,10 +116445,6 @@ async function handleAtlasSessionIdle(input) {
116440
116445
  const now = Date.now();
116441
116446
  const activePlanPath = resolveBoulderPlanPath(ctx.directory, boulderState);
116442
116447
  resetStallStateForPlanChange(sessionState, activePlanPath);
116443
- if (sessionState.waitingForFinalWaveApproval) {
116444
- log2(`[${HOOK_NAME9}] Skipped: waiting for explicit final-wave approval`, { sessionID });
116445
- return;
116446
- }
116447
116448
  if (sessionState.stalledContinuationReason) {
116448
116449
  log2(`[${HOOK_NAME9}] Skipped: boulder continuation stalled`, {
116449
116450
  sessionID,
@@ -13,7 +13,7 @@ export type ShellType = "unix" | "powershell" | "cmd" | "csh";
13
13
  * specific (BASH_VERSION, MSYSTEM, WSL_DISTRO_NAME) — TERM is excluded
14
14
  * because some PowerShell users set it manually.
15
15
  */
16
- export declare function detectShellType(): ShellType;
16
+ export declare function detectShellType(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): ShellType;
17
17
  /**
18
18
  * Shell-escape a value for use in environment variable assignment.
19
19
  *
@@ -1,19 +1,46 @@
1
1
  # ATTRIBUTION / NOTICE
2
2
 
3
3
  This skill (`ultimate-browsing`, part of `@oh-my-opencode/shared-skills`) ships
4
- project-original content plus two third-party tools that it installs at runtime
5
- (it does NOT vendor their source). Each runtime tool's license and required
6
- notices are reproduced below.
4
+ project-original content, one vendored-and-modified upstream engine, plus two
5
+ third-party tools that it installs at runtime (it does NOT vendor their source).
6
+ Each component's provenance, license, and required notices are reproduced below.
7
7
 
8
8
  ---
9
9
 
10
- ## 1. Project-original content (no third-party source vendored)
10
+ ## 1. insane-search engine vendored upstream snapshot, modified
11
+
12
+ `engine/**` originates from the **insane-search** project and is NOT
13
+ project-original code, despite being heavily modified since import.
14
+
15
+ - Upstream source: https://github.com/fivetaku/insane-search
16
+ - Vendored into this repository on 2026-06-21 by commit
17
+ **`a4e4ed797`** (`feat(ultimate-browsing): vendor insane-search engine (junk-excluded)`),
18
+ via an explicit file whitelist that excluded caches and smoke-test junk.
19
+ - Baseline: the upstream state as of that date, a **pre-0.7.0 snapshot**.
20
+ Upstream's CHANGELOG dates 0.7.0 to 2026-06-22; imported files carry no
21
+ version marker. We have never re-vendored since; the tree has diverged in
22
+ both directions.
23
+ - Modifications by this project (non-exhaustive): de-personalization
24
+ (`4743199a5`), the Phase 2.5 surrogate retrieval stage and surrogate registry,
25
+ the provenance/trust result contract, the `bias_check.py` no-site-name CI gate,
26
+ module split of the fetch chain, and the Python test suite under
27
+ `engine/tests/`.
28
+ - No upstream `LICENSE` file was included in the vendored snapshot, so this
29
+ repository has no upstream license text to reproduce here. Do not infer
30
+ project-original licensing from that absence; treat `engine/**` as
31
+ upstream-derived when reasoning about provenance.
32
+
33
+ The binding version policy — which upstream baseline we sit on, why we stay
34
+ pinned, what a future re-vendor must preserve, and what it must not import — is
35
+ [`engine/AGENTS.md` §UPSTREAM BASELINE AND VERSION POLICY](engine/AGENTS.md).
36
+
37
+ ---
38
+
39
+ ## 2. Project-original content (no third-party source vendored)
11
40
 
12
41
  The following are authored by the oh-my-openagent project and carry no third-party
13
42
  license obligation:
14
43
 
15
- - `engine/**` — the insane-search Tier-1 fetch engine (curl_cffi grid, WAF
16
- detection, Playwright fallback templates, `bias_check.py` no-site-name gate).
17
44
  - `references/insane-search/**` and `references/agent-reach/**` — the Tier-1 and
18
45
  Tier-1.5 reference docs.
19
46
  - `scripts/extract_cookies.py`, `scripts/cookie_paths.py`, `scripts/cookie_crypto.py`
@@ -26,7 +53,7 @@ user installs separately; this skill includes none of their source.
26
53
 
27
54
  ---
28
55
 
29
- ## 2. CloakBrowser (CloakHQ) — Tier-2 stealth Chromium (runtime dependency)
56
+ ## 3. CloakBrowser (CloakHQ) — Tier-2 stealth Chromium (runtime dependency)
30
57
 
31
58
  The Tier-2 stealth browser is **CloakBrowser**, installed at runtime via `pip`
32
59
  (`pip install cloakbrowser`). No CloakBrowser source is vendored in this repository.
@@ -73,7 +100,7 @@ SOFTWARE.
73
100
 
74
101
  ---
75
102
 
76
- ## 3. agent-browser (vercel-labs) — Tier-2 CDP automation CLI (runtime dependency)
103
+ ## 4. agent-browser (vercel-labs) — Tier-2 CDP automation CLI (runtime dependency)
77
104
 
78
105
  The Tier-2 automation CLI is **agent-browser**, installed at runtime via `npm`
79
106
  (`npm i -g agent-browser`). No agent-browser source is vendored in this repository.
@@ -2,6 +2,116 @@
2
2
 
3
3
  **Generated:** 2026-08-10 / 38d268995
4
4
 
5
+ ## UPSTREAM BASELINE AND VERSION POLICY
6
+
7
+ **READ THIS BEFORE TOUCHING `engine/**` OR PROPOSING AN UPSTREAM SYNC.**
8
+
9
+ This engine is NOT project-original code. It is a vendored-and-modified snapshot of
10
+ [fivetaku/insane-search](https://github.com/fivetaku/insane-search), and the version
11
+ we run on is a deliberate choice, not an accident of neglect.
12
+
13
+ ### The pin
14
+
15
+ | Fact | Value |
16
+ |---|---|
17
+ | Upstream project | `https://github.com/fivetaku/insane-search` |
18
+ | Vendoring commit | `a4e4ed797` (2026-06-21) `feat(ultimate-browsing): vendor insane-search engine (junk-excluded)` |
19
+ | De-personalization | `4743199a5` (2026-06-21) |
20
+ | Pinned upstream baseline | upstream state as of 2026-06-21, **pre-0.7.0** (0.7.0 is dated 2026-06-22) |
21
+ | Re-vendors since | none — every later change here is ours |
22
+
23
+ We intentionally track a **pinned baseline plus local divergence**, not upstream HEAD.
24
+ There is no submodule and no automated drift check for this engine (unlike the
25
+ `frontend` skill's upstream submodules): the vendored files ARE the source of truth,
26
+ and upstream is a reference we port FROM, deliberately, file by file.
27
+
28
+ ### Why we do not blind-rebase onto upstream HEAD
29
+
30
+ 1. **Upstream reset its public history.** On 2026-08-06 upstream published a single
31
+ squashed commit, `019ee16 refactor: reset public history at 0.14.0`, discarding the
32
+ prior public history through 0.13.x. There is no upstream commit graph to rebase onto and no
33
+ way to cherry-pick an individual upstream change by sha — only whole-file diffing
34
+ against a moving HEAD.
35
+ 2. **Upstream 0.14.0 REMOVED capability.** The endpoint-mining / internal-API
36
+ auto-derivation / site-recipe subsystems that upstream carried publicly between
37
+ 0.12.0 and 0.14.0 are gone from upstream HEAD. Syncing to HEAD is therefore not
38
+ strictly an upgrade: parts of it are a downgrade relative to the intermediate
39
+ versions, and none of it is recoverable from the reset history.
40
+ 3. **Our tree diverged on purpose.** The KEEP list below is functionality upstream
41
+ never had. A wholesale overwrite with upstream HEAD would silently delete it.
42
+ 4. **Different threat model.** Our engine ships inside a published npm package and a
43
+ public marketplace mirror, under a CI no-site-name gate and a de-personalization
44
+ deny-list. Upstream carries neither constraint, so upstream code is not
45
+ drop-in-shippable here.
46
+
47
+ ### KEEP — our divergences a re-vendor MUST NOT regress
48
+
49
+ These exist only in our tree. Any upstream sync that removes or bypasses one of them
50
+ is a regression, not an upgrade:
51
+
52
+ - **Phase 2.5 surrogate retrieval** (`surrogate.py`, `surrogates.yaml`) — archive /
53
+ reader / proxy routes tried before paying for a browser spin-up, with per-entry
54
+ `last_verified` staleness handling and `--allow-proxy` gating.
55
+ - **Provenance / trust contract** (`result_schema.py`) — `Provenance` and `Trust`
56
+ literals on every result, so a snapshot can never be reported as the live page.
57
+ - **Surrogate dead-end validation** (L1.5 in `validators.py`) — interstitial titles and
58
+ AMP-style redirect stubs rejected instead of returned as content.
59
+ - **The no-site-name rule and its CI gate** (`bias_check.py`) — zero hard-coded site
60
+ names, brands, or target domains in `engine/**`.
61
+ - **Module split of the fetch chain** — `curl_probe` / `referers` / `url_transforms` /
62
+ `waf_detector` / `validators` / `executor` / `summary` as separate modules rather than
63
+ one monolith.
64
+ - **The Python test suite** under `engine/tests/` with its HTML/JSON fixtures.
65
+ - **De-personalization** — no personal absolute paths, no personal auth token literals,
66
+ no personal browser choice; enforced by `depersonalization-gate.test.ts`.
67
+ - **Skill-level layering** — the engine is Tier 1 under a router that also owns Tier 1.5
68
+ (agent-reach) and Tier 2 (CloakBrowser + agent-browser). Upstream has no such tiering.
69
+
70
+ ### WANT — upstream improvements worth porting forward
71
+
72
+ Our snapshot predates these; they are wanted, and each must be ported as a reviewed,
73
+ site-agnostic change that preserves every KEEP item above. Port individually; never as
74
+ a tree overwrite:
75
+
76
+ - **Content quality**: dedicated markdown conversion of fetched HTML, main-content
77
+ extraction, PDF text extraction, and JSON-LD rescue when the HTML body is thin.
78
+ - **Transient-failure retry** and **render-merge** of statically fetched HTML with the
79
+ browser-rendered DOM.
80
+ - **Differential block classification** — distinguishing a bot-detection block from an
81
+ infrastructure or authentication failure, instead of collapsing both into `challenge`.
82
+ - **Additional stealth fetch backends** beyond the current Playwright templates, and
83
+ additional WAF vendor profiles.
84
+ - **Per-host route learning** — remembering which route succeeded for a host, with a TTL
85
+ and a bounded store. Must stay runtime state, never committed site knowledge (R4).
86
+ - **Engine-level Phase 0 routing** — the official-public-API preference is currently only
87
+ a documented rule (R5) the agent can skip; upstream moved it into code so it cannot be
88
+ skipped. Worth adopting.
89
+
90
+ ### OUT OF SCOPE
91
+
92
+ - **The removed upstream endpoint-mining / internal-API auto-derivation / site-recipe
93
+ subsystems.** They are absent from upstream HEAD and are not reconstructed here. They
94
+ also sit against R3/R4 and R7's anti-bias rule: discovered internal endpoints are
95
+ runtime findings, never committed engine knowledge.
96
+ - **Any upstream code carrying site-specific selectors, domains, or brand names.** It
97
+ fails `bias_check.py` at the door; re-derive it site-agnostically or leave it out.
98
+ - **Automated upstream tracking.** No submodule, no drift check, no auto-bump. Syncing is
99
+ a deliberate, reviewed, human-initiated act.
100
+
101
+ ### THE SYNC RULE
102
+
103
+ Any future upstream sync preserves BOTH sides. Concretely:
104
+
105
+ 1. Diff the specific upstream capability you want against our tree — do not overwrite
106
+ files wholesale, and never `git checkout` upstream over `engine/`.
107
+ 2. Port it as its own reviewed change, keeping every KEEP item intact.
108
+ 3. Re-run `python3 engine/bias_check.py` and the `engine/tests/` suite; a port that
109
+ introduces a site name or breaks a fixture does not ship.
110
+ 4. Update the pin table above (baseline, date, what was ported) in the same change, plus
111
+ the provenance section of [`../ATTRIBUTION.md`](../ATTRIBUTION.md).
112
+ 5. If a port must drop a KEEP item, say so explicitly in the PR and get it agreed first —
113
+ silent regressions of the KEEP list are the failure mode this policy exists to prevent.
114
+
5
115
  ## OVERVIEW
6
116
 
7
117
  A 17-module Python package embedded in the `ultimate-browsing` skill: a site-agnostic fetch chain that escalates from a cheap curl probe to a real browser, with declarative WAF and surrogate registries. Not "optional scripts" — it has its own CLI entry (`python3 -m engine URL`), two YAML config schemas, a 4-file test suite, and a standalone CI guard. Package exports (`__init__.py`): `fetch`, `FetchResult`, `Attempt`, `Verdict`, `ValidationResult`, `validate`, `CHALLENGE_MARKERS`, `detect`, `TRANSFORMS`, `apply_transform`.
package/dist/tui.js CHANGED
@@ -15197,7 +15197,7 @@ function finalize(ctx, schema) {
15197
15197
  result.$schema = "http://json-schema.org/draft-07/schema#";
15198
15198
  } else if (ctx.target === "draft-04") {
15199
15199
  result.$schema = "http://json-schema.org/draft-04/schema#";
15200
- } else if (ctx.target === "openapi-3.0") {} else {}
15200
+ } else if (ctx.target === "openapi-3.0") {}
15201
15201
  if (ctx.external?.uri) {
15202
15202
  const id = ctx.external.registry.get(schema)?.id;
15203
15203
  if (!id)
@@ -15458,7 +15458,7 @@ var formatMap, stringProcessor = (schema, ctx, _json, _params) => {
15458
15458
  if (val === undefined) {
15459
15459
  if (ctx.unrepresentable === "throw") {
15460
15460
  throw new Error("Literal `undefined` cannot be represented in JSON Schema");
15461
- } else {}
15461
+ }
15462
15462
  } else if (typeof val === "bigint") {
15463
15463
  if (ctx.unrepresentable === "throw") {
15464
15464
  throw new Error("BigInt literals cannot be represented in JSON Schema");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.0.0-beta.8",
3
+ "version": "5.0.0-beta.9",
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",
@@ -136,6 +136,7 @@
136
136
  "typecheck:script": "tsgo --noEmit -p script/tsconfig.json",
137
137
  "test": "bun test",
138
138
  "test:codex": "bun run build:codex-install && bun run build:git-bash-mcp && bun run build:lsp-tools-mcp && bun run build:lsp-daemon && npm --prefix packages/lsp-tools-mcp test && npm --prefix packages/omo-codex/plugin ci && npm --prefix packages/omo-codex/plugin/components/ulw-loop test && bun run --cwd packages/omo-codex/plugin build && npm --prefix packages/omo-codex/plugin/components/codegraph run typecheck && npm --prefix packages/omo-codex/plugin/components/codegraph test && node scripts/check-third-party-notices.mjs --ship && bun test packages/omo-opencode/src/cli/cli-installer.platform.test.ts packages/omo-codex/src/install/codex-cache.test.ts packages/omo-codex/src/install/codex-cleanup.test.ts packages/omo-codex/src/install/codex-config-agent-cleanup.test.ts packages/omo-codex/src/install/codex-config-autonomous-features.test.ts packages/omo-codex/src/install/codex-config-reasoning.test.ts packages/omo-codex/src/install/codex-config-toml.test.ts packages/omo-codex/src/install/codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex-project-local-cleanup.test.ts packages/omo-codex/src/install/install-codex.test.ts packages/omo-codex/src/install/install-codex-packaged.test.ts packages/omo-codex/src/install/link-cached-plugin-agents.test.ts packages/omo-codex/src/**/*.test.ts packages/utils/src/jsonc-parser.test.ts packages/utils/src/frontmatter.test.ts packages/hashline-core/src/hash-computation.test.ts packages/hashline-core/src/smoke-untested-modules.test.ts packages/rules-engine/src/index.test.ts packages/rules-engine/src/security-boundary.test.ts packages/agents-md-core/src/injector.test.ts packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts && node --test packages/omo-codex/plugin/test/*.test.mjs packages/omo-codex/scripts/install-cache-copy.test.mjs packages/omo-codex/scripts/install-cli-args.test.mjs packages/omo-codex/scripts/install-delegated-command.test.mjs packages/omo-codex/scripts/install-config-autonomous-features.test.mjs packages/omo-codex/scripts/install-config-autonomous.test.mjs packages/omo-codex/scripts/install-config-reasoning.test.mjs packages/omo-codex/scripts/install-config.test.mjs packages/omo-codex/scripts/install-hook-targets.test.mjs packages/omo-codex/scripts/install-project-local-cleanup.test.mjs packages/omo-codex/scripts/install-lazycodex-version-stamp.test.mjs packages/omo-codex/scripts/install-local-entrypoint.test.mjs packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs packages/omo-codex/scripts/install-local.test.mjs packages/omo-codex/scripts/install-marketplace-cache.test.mjs packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs packages/omo-codex/scripts/install-mcp-runtime.test.mjs packages/omo-codex/scripts/install-packaged-local.test.mjs packages/omo-codex/scripts/install-generated-bundle.test.mjs packages/omo-codex/scripts/install-agent-links.test.mjs packages/omo-codex/scripts/install-bin-links.test.mjs",
139
+ "test:fast": "bun run script/test-fast.ts",
139
140
  "test:senpi": "bun run build:senpi-plugin && tsgo --noEmit -p packages/omo-senpi/tsconfig.json && bun test packages/omo-senpi",
140
141
  "test:windows-codex": "bun run test:codex",
141
142
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
@@ -180,7 +181,7 @@
180
181
  "zod": "^4.4.3"
181
182
  },
182
183
  "devDependencies": {
183
- "@code-yeongyu/senpi": "2026.8.16",
184
+ "@code-yeongyu/senpi": "2026.8.17",
184
185
  "@oh-my-opencode/agents-md-core": "workspace:*",
185
186
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
186
187
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -221,18 +222,18 @@
221
222
  "typescript": "^7.0.2"
222
223
  },
223
224
  "optionalDependencies": {
224
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.8",
225
- "oh-my-opencode-darwin-x64": "5.0.0-beta.8",
226
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.8",
227
- "oh-my-opencode-linux-arm64": "5.0.0-beta.8",
228
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.8",
229
- "oh-my-opencode-linux-x64": "5.0.0-beta.8",
230
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.8",
231
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.8",
232
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.8",
233
- "oh-my-opencode-windows-arm64": "5.0.0-beta.8",
234
- "oh-my-opencode-windows-x64": "5.0.0-beta.8",
235
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.8"
225
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.9",
226
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.9",
227
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.9",
228
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.9",
229
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.9",
230
+ "oh-my-opencode-linux-x64": "5.0.0-beta.9",
231
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.9",
232
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.9",
233
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.9",
234
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.9",
235
+ "oh-my-opencode-windows-x64": "5.0.0-beta.9",
236
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.9"
236
237
  },
237
238
  "overrides": {
238
239
  "@earendil-works/pi-agent-core": "0.84.2",