lazycodex-ai 5.0.0-beta.82 → 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 (104) 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 +392 -112
  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 +392 -112
  15. package/package.json +1 -1
  16. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  17. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +84 -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 +90 -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-edition-hint.d.ts +0 -10
  104. package/dist/cli/senpi-platform-flag.d.ts +0 -4
@@ -65,7 +65,7 @@ var package_default;
65
65
  var init_package = __esm(() => {
66
66
  package_default = {
67
67
  name: "oh-my-opencode",
68
- version: "5.0.0-beta.82",
68
+ version: "5.0.0-beta.83",
69
69
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
70
70
  main: "./dist/index.js",
71
71
  types: "dist/index.d.ts",
@@ -248,7 +248,7 @@ var init_package = __esm(() => {
248
248
  zod: "^4.6.5"
249
249
  },
250
250
  devDependencies: {
251
- "@code-yeongyu/senpi": "2026.9.22",
251
+ "@code-yeongyu/senpi": "2026.9.22-2",
252
252
  "@oh-my-opencode/agents-md-core": "workspace:*",
253
253
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
254
254
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -288,18 +288,18 @@ var init_package = __esm(() => {
288
288
  typescript: "^7.0.2"
289
289
  },
290
290
  optionalDependencies: {
291
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.82",
292
- "oh-my-opencode-darwin-x64": "5.0.0-beta.82",
293
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.82",
294
- "oh-my-opencode-linux-arm64": "5.0.0-beta.82",
295
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.82",
296
- "oh-my-opencode-linux-x64": "5.0.0-beta.82",
297
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.82",
298
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.82",
299
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.82",
300
- "oh-my-opencode-windows-arm64": "5.0.0-beta.82",
301
- "oh-my-opencode-windows-x64": "5.0.0-beta.82",
302
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.82"
291
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.83",
292
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.83",
293
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.83",
294
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.83",
295
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.83",
296
+ "oh-my-opencode-linux-x64": "5.0.0-beta.83",
297
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.83",
298
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.83",
299
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.83",
300
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.83",
301
+ "oh-my-opencode-windows-x64": "5.0.0-beta.83",
302
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.83"
303
303
  },
304
304
  overrides: {
305
305
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -7228,6 +7228,7 @@ var init_agent_model_requirements = __esm(() => {
7228
7228
  },
7229
7229
  librarian: {
7230
7230
  fallbackChain: [
7231
+ { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
7231
7232
  { providers: ["openai", "openai-codex"], model: "gpt-5.6-luna-fast", variant: "low" },
7232
7233
  { providers: ["deepseek"], model: "deepseek-v4-flash", variant: "max" },
7233
7234
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
@@ -7240,6 +7241,7 @@ var init_agent_model_requirements = __esm(() => {
7240
7241
  },
7241
7242
  explore: {
7242
7243
  fallbackChain: [
7244
+ { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
7243
7245
  { providers: ["openai", "openai-codex"], model: "gpt-5.6-luna-fast", variant: "low" },
7244
7246
  { providers: ["deepseek"], model: "deepseek-v4-flash", variant: "max" },
7245
7247
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
@@ -7413,7 +7415,6 @@ var init_category_model_requirements = __esm(() => {
7413
7415
  },
7414
7416
  quick: {
7415
7417
  fallbackChain: [
7416
- { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed" },
7417
7418
  { providers: ["openai-codex"], model: "gpt-5.6-luna-fast", variant: "low" },
7418
7419
  { providers: ["deepseek"], model: "deepseek-v4-flash", variant: "off" },
7419
7420
  {
@@ -7433,7 +7434,8 @@ var init_category_model_requirements = __esm(() => {
7433
7434
  },
7434
7435
  "unspecified-low": {
7435
7436
  fallbackChain: [
7436
- { providers: ["xai", "github-copilot", "opencode"], model: "grok-4.6", variant: "xhigh" },
7437
+ { providers: ["xiaomi", "opencode-go"], model: "mimo-v2.6-pro", variant: "max" },
7438
+ { providers: ["xai", "github-copilot", "opencode-go"], model: "grok-4.7", variant: "xhigh" },
7437
7439
  {
7438
7440
  providers: ["openai", "openai-codex", "github-copilot", "opencode"],
7439
7441
  model: "gpt-5.6-terra",
@@ -7455,11 +7457,6 @@ var init_category_model_requirements = __esm(() => {
7455
7457
  },
7456
7458
  "unspecified-high": {
7457
7459
  fallbackChain: [
7458
- {
7459
- providers: ["openai", "openai-codex", "github-copilot", "opencode"],
7460
- model: "gpt-6-astra",
7461
- variant: "high"
7462
- },
7463
7460
  {
7464
7461
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
7465
7462
  model: "claude-opus-5",
@@ -8295,6 +8292,36 @@ var init_supplemental_entries = __esm(() => {
8295
8292
  output: 32768
8296
8293
  }
8297
8294
  },
8295
+ "grok-4.7": {
8296
+ id: "grok-4.7",
8297
+ family: "grok",
8298
+ reasoning: false,
8299
+ temperature: true,
8300
+ toolCall: true,
8301
+ modalities: {
8302
+ input: ["text", "image"],
8303
+ output: ["text"]
8304
+ },
8305
+ limit: {
8306
+ context: 500000,
8307
+ output: 32768
8308
+ }
8309
+ },
8310
+ "xai/grok-4.7": {
8311
+ id: "xai/grok-4.7",
8312
+ family: "grok",
8313
+ reasoning: false,
8314
+ temperature: true,
8315
+ toolCall: true,
8316
+ modalities: {
8317
+ input: ["text", "image"],
8318
+ output: ["text"]
8319
+ },
8320
+ limit: {
8321
+ context: 500000,
8322
+ output: 32768
8323
+ }
8324
+ },
8298
8325
  "xai/grok-build-0.1": {
8299
8326
  id: "xai/grok-build-0.1",
8300
8327
  family: "grok",
@@ -8324,6 +8351,36 @@ var init_supplemental_entries = __esm(() => {
8324
8351
  context: 256000,
8325
8352
  output: 32768
8326
8353
  }
8354
+ },
8355
+ "mimo-v2.6-pro": {
8356
+ id: "mimo-v2.6-pro",
8357
+ family: "mimo",
8358
+ reasoning: true,
8359
+ temperature: true,
8360
+ toolCall: true,
8361
+ modalities: {
8362
+ input: ["text", "image"],
8363
+ output: ["text"]
8364
+ },
8365
+ limit: {
8366
+ context: 1048576,
8367
+ output: 131072
8368
+ }
8369
+ },
8370
+ "xiaomi/mimo-v2.6-pro": {
8371
+ id: "xiaomi/mimo-v2.6-pro",
8372
+ family: "mimo",
8373
+ reasoning: true,
8374
+ temperature: true,
8375
+ toolCall: true,
8376
+ modalities: {
8377
+ input: ["text", "image"],
8378
+ output: ["text"]
8379
+ },
8380
+ limit: {
8381
+ context: 1048576,
8382
+ output: 131072
8383
+ }
8327
8384
  }
8328
8385
  };
8329
8386
  });
@@ -9297,21 +9354,21 @@ var init_openai_categories = __esm(() => {
9297
9354
  },
9298
9355
  {
9299
9356
  name: "quick",
9300
- config: { model: "kimi-for-coding/kimi-for-coding-highspeed" },
9357
+ config: { model: "openai/gpt-5.6-luna-fast", variant: "low" },
9301
9358
  description: "Trivial tasks - single file changes, typo fixes, simple modifications",
9302
9359
  callerGuidance: QUICK_CATEGORY_CALLER_GUIDANCE,
9303
9360
  promptAppend: QUICK_CATEGORY_PROMPT_APPEND
9304
9361
  },
9305
9362
  {
9306
9363
  name: "unspecified-low",
9307
- config: { model: "xai/grok-4.6", variant: "xhigh" },
9364
+ config: { model: "xiaomi/mimo-v2.6-pro", variant: "max" },
9308
9365
  description: "Tasks that don't fit other categories, low effort required",
9309
9366
  callerGuidance: UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE,
9310
9367
  promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
9311
9368
  },
9312
9369
  {
9313
9370
  name: "unspecified-high",
9314
- config: { model: "openai/gpt-6-astra", variant: "high" },
9371
+ config: { model: "anthropic/claude-opus-5", variant: "xhigh" },
9315
9372
  description: "Tasks that don't fit other categories, high effort required",
9316
9373
  callerGuidance: UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE,
9317
9374
  promptAppend: UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND,
@@ -73962,12 +74019,14 @@ var init_git_master = __esm(() => {
73962
74019
  });
73963
74020
 
73964
74021
  // packages/omo-config-core/src/schema/harness.ts
73965
- var HARNESS_IDS, OMO_CONFIG_HARNESS_IDS, OmoHarnessIdSchema;
74022
+ var HARNESS_IDS, OMO_CONFIG_HARNESS_IDS, OmoHarnessIdSchema, OMO_CONFIG_LEGACY_HARNESS_ALIASES, OMO_CONFIG_LEGACY_HARNESS_IDS;
73966
74023
  var init_harness = __esm(() => {
73967
74024
  init_zod();
73968
74025
  HARNESS_IDS = ["codex", "opencode", "omo"];
73969
- OMO_CONFIG_HARNESS_IDS = ["opencode", "senpi", "codex"];
74026
+ OMO_CONFIG_HARNESS_IDS = ["opencode", "native", "codex"];
73970
74027
  OmoHarnessIdSchema = _enum(OMO_CONFIG_HARNESS_IDS);
74028
+ OMO_CONFIG_LEGACY_HARNESS_ALIASES = { senpi: "native" };
74029
+ OMO_CONFIG_LEGACY_HARNESS_IDS = Object.keys(OMO_CONFIG_LEGACY_HARNESS_ALIASES);
73971
74030
  });
73972
74031
 
73973
74032
  // packages/omo-config-core/src/schema/memory.ts
@@ -74470,6 +74529,7 @@ var init_config = __esm(() => {
74470
74529
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74471
74530
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74472
74531
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74532
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
74473
74533
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
74474
74534
  "[codex]": OmoTypedHarnessConfigSchema.optional()
74475
74535
  }).strict();
@@ -74488,6 +74548,7 @@ var init_config = __esm(() => {
74488
74548
  telemetry: OmoTelemetrySettingsSchema.optional(),
74489
74549
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74490
74550
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74551
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
74491
74552
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
74492
74553
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
74493
74554
  profiles: record(string2(), OmoConfigProfileSchema).default({}),
@@ -74509,6 +74570,7 @@ var init_config = __esm(() => {
74509
74570
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74510
74571
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74511
74572
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74573
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
74512
74574
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
74513
74575
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
74514
74576
  profiles: record(string2(), OmoConfigProfileSchema).optional(),
@@ -74579,6 +74641,60 @@ var init_legacy_category_names = __esm(() => {
74579
74641
  LEGACY_CATEGORY_NAME_ALIASES = { deep: "deep-low" };
74580
74642
  });
74581
74643
 
74644
+ // packages/omo-config-core/src/schema/legacy-harness-names.ts
74645
+ function canonicalHarnessName(name) {
74646
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, name) ? OMO_CONFIG_LEGACY_HARNESS_ALIASES[name] : name;
74647
+ }
74648
+ function harnessBlockKey(harness) {
74649
+ return `[${harness}]`;
74650
+ }
74651
+ function legacyHarnessOfBlockKey(key) {
74652
+ if (!key.startsWith("[") || !key.endsWith("]"))
74653
+ return;
74654
+ const harness = key.slice(1, -1);
74655
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, harness) ? harness : undefined;
74656
+ }
74657
+ function isRecord10(value) {
74658
+ return typeof value === "object" && value !== null && !Array.isArray(value);
74659
+ }
74660
+ function canonicalizeBlocksIn(container, path, renames) {
74661
+ const result = {};
74662
+ for (const [key, value] of Object.entries(container)) {
74663
+ const legacyHarness = legacyHarnessOfBlockKey(key);
74664
+ if (legacyHarness === undefined) {
74665
+ result[key] = value;
74666
+ continue;
74667
+ }
74668
+ const canonical = harnessBlockKey(canonicalHarnessName(legacyHarness));
74669
+ const dropped = Object.hasOwn(container, canonical);
74670
+ renames.push({ canonical, dropped, legacy: key, path: [...path, key].join(".") });
74671
+ if (!dropped)
74672
+ result[canonical] = value;
74673
+ }
74674
+ return result;
74675
+ }
74676
+ function canonicalizeLegacyHarnessBlocks(document) {
74677
+ if (!isRecord10(document))
74678
+ return { document: {}, renames: [] };
74679
+ const renames = [];
74680
+ const canonicalized = canonicalizeBlocksIn(document, [], renames);
74681
+ const profiles = canonicalized["profiles"];
74682
+ if (isRecord10(profiles)) {
74683
+ const canonicalProfiles = {};
74684
+ for (const [name, profile] of Object.entries(profiles)) {
74685
+ canonicalProfiles[name] = isRecord10(profile) ? canonicalizeBlocksIn(profile, ["profiles", name], renames) : profile;
74686
+ }
74687
+ canonicalized["profiles"] = canonicalProfiles;
74688
+ }
74689
+ return { document: canonicalized, renames };
74690
+ }
74691
+ function hasLegacyHarnessBlocks(document) {
74692
+ return canonicalizeLegacyHarnessBlocks(document).renames.length > 0;
74693
+ }
74694
+ var init_legacy_harness_names = __esm(() => {
74695
+ init_harness();
74696
+ });
74697
+
74582
74698
  // packages/omo-config-core/src/schema/index.ts
74583
74699
  var init_schema = __esm(() => {
74584
74700
  init_agent();
@@ -74589,6 +74705,7 @@ var init_schema = __esm(() => {
74589
74705
  init_git_master();
74590
74706
  init_harness();
74591
74707
  init_legacy_category_names();
74708
+ init_legacy_harness_names();
74592
74709
  init_memory();
74593
74710
  init_model_catalog();
74594
74711
  init_model_profile();
@@ -74598,6 +74715,9 @@ var init_schema = __esm(() => {
74598
74715
  init_telemetry();
74599
74716
  });
74600
74717
 
74718
+ // packages/omo-config-core/src/loader/disabled-skills.ts
74719
+ var init_disabled_skills = () => {};
74720
+
74601
74721
  // packages/omo-config-core/src/loader/merge.ts
74602
74722
  function isUnsafeObjectKey2(key) {
74603
74723
  return DANGEROUS_KEYS2.has(key);
@@ -74772,7 +74892,13 @@ function withoutControlKeys(config) {
74772
74892
  function harnessLayer(config, harness) {
74773
74893
  if (harness === undefined)
74774
74894
  return {};
74775
- return toRecord(config[`[${harness}]`]) ?? {};
74895
+ const canonical = canonicalHarnessName(harness);
74896
+ const legacyKeys = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([legacy]) => harnessBlockKey(legacy));
74897
+ let layer = {};
74898
+ for (const key of [...legacyKeys, harnessBlockKey(canonical)]) {
74899
+ layer = mergeOmoConfigRecords(layer, toRecord(config[key]) ?? {});
74900
+ }
74901
+ return layer;
74776
74902
  }
74777
74903
  function resolveOmoConfigView(options) {
74778
74904
  const profiles = toRecord(options.config["profiles"]);
@@ -74802,7 +74928,7 @@ var HARNESS_KEYS;
74802
74928
  var init_resolution = __esm(() => {
74803
74929
  init_schema();
74804
74930
  init_merge();
74805
- HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS])].map((harness) => `[${harness}]`);
74931
+ HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS, ...OMO_CONFIG_LEGACY_HARNESS_IDS])].map((harness) => harnessBlockKey(harness));
74806
74932
  });
74807
74933
 
74808
74934
  // packages/omo-config-core/src/loader/loader.ts
@@ -74823,6 +74949,7 @@ function parseJsoncSafe2(content) {
74823
74949
  function stripResolutionControlKeys(config) {
74824
74950
  const {
74825
74951
  "[codex]": _codex,
74952
+ "[native]": _native,
74826
74953
  "[opencode]": _opencode,
74827
74954
  "[senpi]": _senpi,
74828
74955
  profiles: _profiles,
@@ -74848,21 +74975,21 @@ function hasUnsafeUnrecognizedKey(issues) {
74848
74975
  function hasTamperedPrototype(value) {
74849
74976
  if (Array.isArray(value))
74850
74977
  return value.some((entry) => hasTamperedPrototype(entry));
74851
- if (!isRecord10(value))
74978
+ if (!isRecord11(value))
74852
74979
  return false;
74853
74980
  const prototype = Object.getPrototypeOf(value);
74854
74981
  if (prototype !== Object.prototype && prototype !== null)
74855
74982
  return true;
74856
74983
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
74857
74984
  }
74858
- function isRecord10(value) {
74985
+ function isRecord11(value) {
74859
74986
  return typeof value === "object" && value !== null && !Array.isArray(value);
74860
74987
  }
74861
74988
  function containerAt(record, path) {
74862
74989
  let container = record;
74863
74990
  for (const segment of path) {
74864
74991
  const next = container[segment];
74865
- if (!isRecord10(next))
74992
+ if (!isRecord11(next))
74866
74993
  return null;
74867
74994
  container = next;
74868
74995
  }
@@ -74973,6 +75100,15 @@ function legacyCategoryDiagnostic(path, renames) {
74973
75100
  issuePaths: renames.map((rename) => rename.path)
74974
75101
  };
74975
75102
  }
75103
+ function legacyHarnessDiagnostic(path, renames) {
75104
+ const detail = renames.map((rename) => rename.dropped ? `${rename.path} ignored because ${rename.canonical} is also configured` : `${rename.path} renamed to ${rename.canonical}`).join(", ");
75105
+ return {
75106
+ kind: "deprecated-keys",
75107
+ message: `Deprecated harness block in ${path}: ${detail}. Rename it; the alias is removed in a future release.`,
75108
+ path,
75109
+ issuePaths: renames.map((rename) => rename.path)
75110
+ };
75111
+ }
74976
75112
  function loadOmoConfig(options = {}) {
74977
75113
  const fileSystem = options.fileSystem ?? DEFAULT_READ_FILE_SYSTEM;
74978
75114
  const cwd = options.cwd ?? process.cwd();
@@ -74995,8 +75131,12 @@ function loadOmoConfig(options = {}) {
74995
75131
  if (canonicalized.renames.length > 0) {
74996
75132
  diagnostics.push(legacyCategoryDiagnostic(candidate.path, canonicalized.renames));
74997
75133
  }
74998
- layers.push({ config: canonicalized.document, source: loaded.source });
74999
- merged = mergeOmoConfigRecords(merged, canonicalized.document);
75134
+ const harnessCanonicalized = canonicalizeLegacyHarnessBlocks(canonicalized.document);
75135
+ if (harnessCanonicalized.renames.length > 0) {
75136
+ diagnostics.push(legacyHarnessDiagnostic(candidate.path, harnessCanonicalized.renames));
75137
+ }
75138
+ layers.push({ config: harnessCanonicalized.document, source: loaded.source });
75139
+ merged = mergeOmoConfigRecords(merged, harnessCanonicalized.document);
75000
75140
  }
75001
75141
  }
75002
75142
  const requestedProfile = resolveOmoProfileName({
@@ -75044,6 +75184,7 @@ var init_loader2 = __esm(() => {
75044
75184
 
75045
75185
  // packages/omo-config-core/src/loader/index.ts
75046
75186
  var init_loader3 = __esm(() => {
75187
+ init_disabled_skills();
75047
75188
  init_loader2();
75048
75189
  init_merge();
75049
75190
  init_paths();
@@ -77361,14 +77502,14 @@ function transformConfigJsoncSources(input) {
77361
77502
  const omo = recordAt(legacy, "[omo]");
77362
77503
  const senpi = recordAt(legacy, "[senpi]");
77363
77504
  const history = legacyMigrationHistory(input.discovered, input.sources);
77364
- const diagnostics = omo !== undefined && senpi !== undefined ? ["conflict: [senpi] legacy [omo] kept [senpi]"] : [];
77505
+ const diagnostics = omo !== undefined && senpi !== undefined ? ["conflict: [native] legacy [omo] kept [native]"] : [];
77365
77506
  return {
77366
77507
  diagnostics,
77367
77508
  document: {
77368
77509
  $schema: OMO_SCHEMA_URL,
77369
77510
  ...recordAt(legacy, "[opencode]") === undefined ? {} : { "[opencode]": recordAt(legacy, "[opencode]") },
77370
77511
  ...recordAt(legacy, "[codex]") === undefined ? {} : { "[codex]": recordAt(legacy, "[codex]") },
77371
- ...senpi === undefined && omo === undefined ? {} : { "[senpi]": senpi ?? omo },
77512
+ ...senpi === undefined && omo === undefined ? {} : { "[native]": senpi ?? omo },
77372
77513
  ...Object.keys(history).length === 0 ? {} : { legacy_migrations: history }
77373
77514
  }
77374
77515
  };
@@ -77632,7 +77773,7 @@ function normalizeTypedBlock(value, path, diagnostics, recurseProfiles) {
77632
77773
  }
77633
77774
  if (result["models"] !== undefined)
77634
77775
  result["models"] = normalizeCatalog(result["models"]);
77635
- for (const harness of ["[senpi]", "[codex]"]) {
77776
+ for (const harness of ["[senpi]", "[native]", "[codex]"]) {
77636
77777
  if (result[harness] !== undefined)
77637
77778
  result[harness] = normalizeTypedBlock(result[harness], [...path, harness], diagnostics, false);
77638
77779
  }
@@ -77686,6 +77827,19 @@ var init_category_deep_split = __esm(() => {
77686
77827
  init_src4();
77687
77828
  });
77688
77829
 
77830
+ // packages/omo-opencode/src/config-migration/harness-native-rename.ts
77831
+ function transformHarnessNativeRename(document) {
77832
+ const { document: canonicalized, renames } = canonicalizeLegacyHarnessBlocks(document);
77833
+ return {
77834
+ diagnostics: renames.map((rename) => rename.dropped ? `${rename.path} removed: ${rename.canonical} is already configured` : `${rename.path} renamed to ${rename.canonical}`),
77835
+ document: canonicalized
77836
+ };
77837
+ }
77838
+ var HARNESS_NATIVE_RENAME_MIGRATION_ID = "2026-09-harness-native-rename";
77839
+ var init_harness_native_rename = __esm(() => {
77840
+ init_src4();
77841
+ });
77842
+
77689
77843
  // packages/omo-opencode/src/config-migration/migration-plans.ts
77690
77844
  function backupTimestamp(value) {
77691
77845
  return value ?? new Date().toISOString().replace(/[:.]/g, "-");
@@ -77764,6 +77918,18 @@ function categoryDeepSplitPlan(targetPath) {
77764
77918
  transform: inspect
77765
77919
  };
77766
77920
  }
77921
+ function harnessNativeRenamePlan(targetPath) {
77922
+ const inspect = (sources) => transformHarnessNativeRename(sources[0]?.value);
77923
+ return {
77924
+ id: HARNESS_NATIVE_RENAME_MIGRATION_ID,
77925
+ inspect,
77926
+ mode: "replace-target",
77927
+ shouldRun: hasLegacyHarnessBlocks,
77928
+ sources: [],
77929
+ targetPath,
77930
+ transform: inspect
77931
+ };
77932
+ }
77767
77933
  function existingOmoConfigPath(directory, options) {
77768
77934
  const fileSystem = discoveryFileSystem(options);
77769
77935
  for (const fileName of ["omo.jsonc", "omo.json"]) {
@@ -77827,7 +77993,8 @@ function createLegacyConfigMigrationPlans(options) {
77827
77993
  return [
77828
77994
  ...legacyPlans,
77829
77995
  ...inPlaceTargets.map(reasoningPlan),
77830
- ...inPlaceTargets.map(categoryDeepSplitPlan)
77996
+ ...inPlaceTargets.map(categoryDeepSplitPlan),
77997
+ ...inPlaceTargets.map(harnessNativeRenamePlan)
77831
77998
  ];
77832
77999
  }
77833
78000
  var init_migration_plans = __esm(() => {
@@ -77838,6 +78005,7 @@ var init_migration_plans = __esm(() => {
77838
78005
  init_transform_opencode();
77839
78006
  init_reasoning_unification();
77840
78007
  init_category_deep_split();
78008
+ init_harness_native_rename();
77841
78009
  init_src4();
77842
78010
  });
77843
78011
 
@@ -78622,7 +78790,7 @@ function shouldRetainLine(line, cutoffMs) {
78622
78790
  function parseDiagnosticLine(line) {
78623
78791
  try {
78624
78792
  const parsed = JSON.parse(line);
78625
- if (!isRecord12(parsed)) {
78793
+ if (!isRecord13(parsed)) {
78626
78794
  return null;
78627
78795
  }
78628
78796
  return parsed;
@@ -78633,7 +78801,7 @@ function parseDiagnosticLine(line) {
78633
78801
  throw error;
78634
78802
  }
78635
78803
  }
78636
- function isRecord12(value) {
78804
+ function isRecord13(value) {
78637
78805
  return value !== null && typeof value === "object" && !Array.isArray(value);
78638
78806
  }
78639
78807
  function trimToMaxBytes(lines) {
@@ -86123,7 +86291,7 @@ function coerceBool(value) {
86123
86291
  function coerceString(value) {
86124
86292
  return typeof value == "string" ? value : undefined;
86125
86293
  }
86126
- function isRecord13(value) {
86294
+ function isRecord14(value) {
86127
86295
  return typeof value == "object" && value !== null && !Array.isArray(value);
86128
86296
  }
86129
86297
  function toRfc3339(timestamp) {
@@ -86145,7 +86313,7 @@ function relocateInto(properties, key, value) {
86145
86313
  properties[key] = value;
86146
86314
  }
86147
86315
  function buildV1Event(message) {
86148
- const sourceProperties = isRecord13(message.properties) ? message.properties : {};
86316
+ const sourceProperties = isRecord14(message.properties) ? message.properties : {};
86149
86317
  const properties = {
86150
86318
  ...sourceProperties
86151
86319
  };
@@ -88290,7 +88458,7 @@ var package_default2;
88290
88458
  var init_package2 = __esm(() => {
88291
88459
  package_default2 = {
88292
88460
  name: "@oh-my-opencode/omo-codex",
88293
- version: "5.0.0-beta.82",
88461
+ version: "5.0.0-beta.83",
88294
88462
  type: "module",
88295
88463
  private: true,
88296
88464
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -91465,8 +91633,11 @@ function formatConfigSummary(config) {
91465
91633
  if (config.hasCodex) {
91466
91634
  lines.push(` ${SYMBOLS.info} Codex autonomous mode: ${config.codexAutonomous ? "enabled" : "disabled"}`);
91467
91635
  }
91468
- if (config.hasSenpi) {
91469
- lines.push(` ${SYMBOLS.info} Senpi adapter: enabled`);
91636
+ if (config.hasNative) {
91637
+ lines.push(` ${SYMBOLS.info} OmO Native: installing from omo-ai@beta`);
91638
+ }
91639
+ if (config.hasNativeDev) {
91640
+ lines.push(` ${SYMBOLS.info} OmO Native development adapter: enabled`);
91470
91641
  }
91471
91642
  if (!config.hasOpenCode)
91472
91643
  return lines.join(`
@@ -91623,7 +91794,8 @@ function argsToConfig(args) {
91623
91794
  const platform = resolvePlatform(args);
91624
91795
  const hasOpenCode = platform === "opencode" || platform === "both";
91625
91796
  const hasCodex = platform === "codex" || platform === "both";
91626
- const hasSenpi = platform === "senpi";
91797
+ const hasNative = platform === "native";
91798
+ const hasNativeDev = platform === "native-dev";
91627
91799
  return {
91628
91800
  platform,
91629
91801
  hasOpenCode,
@@ -91633,7 +91805,8 @@ function argsToConfig(args) {
91633
91805
  hasGemini: hasOpenCode && args.gemini === "yes",
91634
91806
  hasCopilot: hasOpenCode && args.copilot === "yes",
91635
91807
  hasCodex,
91636
- hasSenpi,
91808
+ hasNative,
91809
+ hasNativeDev,
91637
91810
  hasOpencodeZen: hasOpenCode && args.opencodeZen === "yes",
91638
91811
  hasZaiCodingPlan: hasOpenCode && args.zaiCodingPlan === "yes",
91639
91812
  hasKimiForCoding: hasOpenCode && args.kimiForCoding === "yes",
@@ -94357,10 +94530,10 @@ function readCatalogMultiAgentVersion(model, cachePath) {
94357
94530
  } catch {
94358
94531
  return null;
94359
94532
  }
94360
- if (!isRecord11(cache) || !Array.isArray(cache.models))
94533
+ if (!isRecord12(cache) || !Array.isArray(cache.models))
94361
94534
  return null;
94362
94535
  for (const entry of cache.models) {
94363
- if (!isRecord11(entry))
94536
+ if (!isRecord12(entry))
94364
94537
  continue;
94365
94538
  if (entry.slug !== model && entry.id !== model)
94366
94539
  continue;
@@ -94385,7 +94558,7 @@ function readRootModelCatalogPath(config) {
94385
94558
  const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
94386
94559
  return single?.[1] ?? null;
94387
94560
  }
94388
- function isRecord11(value) {
94561
+ function isRecord12(value) {
94389
94562
  return typeof value === "object" && value !== null && !Array.isArray(value);
94390
94563
  }
94391
94564
  function removeFeatureFlagSetting(config, featureName) {
@@ -97194,7 +97367,7 @@ async function readSettings(settingsPath) {
97194
97367
  throw error;
97195
97368
  }
97196
97369
  const parsed = JSON.parse(raw);
97197
- if (!isRecord14(parsed))
97370
+ if (!isRecord15(parsed))
97198
97371
  throw new Error(`${settingsPath} must contain a JSON object`);
97199
97372
  return parsed;
97200
97373
  }
@@ -97255,7 +97428,7 @@ async function nextBackupPath(settingsPath) {
97255
97428
  function timestampForBackup() {
97256
97429
  return new Date().toISOString().replace(/[-:.]/g, "");
97257
97430
  }
97258
- function isRecord14(value) {
97431
+ function isRecord15(value) {
97259
97432
  return typeof value === "object" && value !== null && !Array.isArray(value);
97260
97433
  }
97261
97434
  async function readPackageName(packagePath) {
@@ -97275,7 +97448,7 @@ async function readPackageName(packagePath) {
97275
97448
  return;
97276
97449
  throw error;
97277
97450
  }
97278
- return isRecord14(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
97451
+ return isRecord15(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
97279
97452
  }
97280
97453
  async function fileExists(path) {
97281
97454
  try {
@@ -97299,6 +97472,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
97299
97472
  join61("extensions", "memory-run-supervisor.mjs"),
97300
97473
  ...PERSONA_ASSET_FILES.map((filename) => join61("extensions", filename)),
97301
97474
  join61("skills", "ast-grep", "SKILL.md"),
97475
+ join61("skills", "browser", "SKILL.md"),
97302
97476
  join61("skills", "coding-agent-sessions", "SKILL.md"),
97303
97477
  join61("skills", "debugging", "SKILL.md"),
97304
97478
  join61("skills", "frontend", "SKILL.md"),
@@ -97390,7 +97564,7 @@ async function verifyAstGrepRuntimeIntegrity(pluginPath, platform) {
97390
97564
  }
97391
97565
  }
97392
97566
  function isAstGrepRuntimeManifest(value) {
97393
- if (!isRecord14(value))
97567
+ if (!isRecord15(value))
97394
97568
  return false;
97395
97569
  return typeof value.sha256 === "string" && /^[a-f0-9]{64}$/.test(value.sha256) && typeof value.mode === "number" && Number.isInteger(value.mode) && typeof value.stagedAtUtc === "string" && !Number.isNaN(Date.parse(value.stagedAtUtc));
97396
97570
  }
@@ -97480,23 +97654,88 @@ function findRepoRoot2(importerDir) {
97480
97654
  function fileExistsSync(path) {
97481
97655
  return existsSync30(path);
97482
97656
  }
97483
- // packages/omo-opencode/src/cli/senpi-edition-hint.ts
97484
- var SENPI_EDITION_INSTALL_COMMAND = "bun add -g omo-ai@beta";
97485
- var SENPI_EDITION_GUIDE_URL = "https://github.com/code-yeongyu/oh-my-openagent/blob/dev/docs/guide/installation.md#senpi-edition-beta-omo-via-omo-ai";
97486
- var SENPI_EDITION_HINT_TITLE = "Standalone Senpi edition (beta)";
97657
+ // packages/omo-opencode/src/cli/install-native-dev/index.ts
97658
+ async function runNativeDevInstaller(options) {
97659
+ return runSenpiInstaller(options);
97660
+ }
97661
+
97662
+ // packages/omo-opencode/src/cli/install-native/plan.ts
97663
+ var NATIVE_PACKAGE_SPEC = "omo-ai@beta";
97664
+ var NATIVE_SETUP_COMMAND = "omo setup";
97665
+ var NATIVE_RECOMMENDED_RUNTIME_NOTE = "bun is the recommended runtime for OmO Native; npm works, but bun is what the beta channel is tested on.";
97666
+ var PLANS = {
97667
+ bun: { packageManager: "bun", command: "bun", args: ["add", "-g", NATIVE_PACKAGE_SPEC] },
97668
+ npm: { packageManager: "npm", command: "npm", args: ["i", "-g", NATIVE_PACKAGE_SPEC] }
97669
+ };
97670
+ function resolveNativeInstallPlan(bunAvailable) {
97671
+ return bunAvailable ? PLANS.bun : PLANS.npm;
97672
+ }
97673
+ function formatNativeInstallCommand(plan) {
97674
+ return [plan.command, ...plan.args].join(" ");
97675
+ }
97676
+ // packages/omo-opencode/src/cli/install-native/run-native-install.ts
97677
+ init_bun_which_shim();
97678
+ init_spawn_with_windows_hide();
97679
+ function describeExit(plan, result) {
97680
+ const stderr = result.stderr?.trim();
97681
+ const head = `${plan.packageManager} exited with code ${result.exitCode}`;
97682
+ return stderr ? `${head}: ${stderr.split(`
97683
+ `).slice(-3).join(" ")}` : head;
97684
+ }
97685
+ async function runNativeInstall(dependencies = defaultNativeInstallDependencies()) {
97686
+ const plan = resolveNativeInstallPlan(await dependencies.isBunAvailable());
97687
+ const notes = plan.packageManager === "npm" ? [NATIVE_RECOMMENDED_RUNTIME_NOTE] : [];
97688
+ const manualCommand = formatNativeInstallCommand(plan);
97689
+ try {
97690
+ const result = await dependencies.spawn(plan.command, plan.args);
97691
+ if (result.exitCode === 0)
97692
+ return { ok: true, plan, notes };
97693
+ return { ok: false, plan, notes, failure: { reason: describeExit(plan, result), manualCommand } };
97694
+ } catch (error) {
97695
+ const reason = error instanceof Error ? error.message : String(error);
97696
+ return { ok: false, plan, notes, failure: { reason, manualCommand } };
97697
+ }
97698
+ }
97699
+ function nativeInstallSuccessLine() {
97700
+ return `OmO Native installed. Run ${NATIVE_SETUP_COMMAND} to finish onboarding.`;
97701
+ }
97702
+ function nativeInstallFailureLines(failure) {
97703
+ return [
97704
+ `OmO Native install failed: ${failure.reason}`,
97705
+ `Install it yourself with: ${failure.manualCommand}`,
97706
+ `Then run ${NATIVE_SETUP_COMMAND}.`
97707
+ ];
97708
+ }
97709
+ function defaultNativeInstallDependencies() {
97710
+ return {
97711
+ isBunAvailable: () => bunWhich("bun") !== null,
97712
+ spawn: async (command, args) => {
97713
+ const proc = spawnWithWindowsHide([command, ...args], {
97714
+ env: process.env,
97715
+ stdout: "inherit",
97716
+ stderr: "inherit"
97717
+ });
97718
+ return { exitCode: await proc.exited };
97719
+ }
97720
+ };
97721
+ }
97722
+ // packages/omo-opencode/src/cli/native-edition-hint.ts
97723
+ var NATIVE_EDITION_INSTALL_COMMAND = "bun add -g omo-ai@beta";
97724
+ var NATIVE_EDITION_GUIDE_URL = "https://github.com/code-yeongyu/oh-my-openagent/blob/dev/docs/guide/installation.md#omo-native-beta-omo-via-omo-ai";
97725
+ var NATIVE_EDITION_HINT_TITLE = "OmO Native (beta)";
97487
97726
  var PLAIN_PAINT = {
97488
97727
  command: (text) => text,
97489
97728
  link: (text) => text
97490
97729
  };
97491
- function shouldShowSenpiEditionHint(config) {
97492
- return !config.hasSenpi;
97730
+ function shouldShowNativeEditionHint(config) {
97731
+ return !config.hasNative && !config.hasNativeDev;
97493
97732
  }
97494
- function senpiEditionHintLines(paint = PLAIN_PAINT) {
97733
+ function nativeEditionHintLines(paint = PLAIN_PAINT) {
97495
97734
  return [
97496
- `omo also ships as a standalone Senpi edition: one ${paint.command("omo")} command, no OpenCode host required.`,
97497
- `Try it next to this install: ${paint.command(SENPI_EDITION_INSTALL_COMMAND)}, then run ${paint.command("omo")}.`,
97735
+ `omo also ships as OmO Native: the same omo as one ${paint.command("omo")} command, with no OpenCode host required.`,
97736
+ `Try it next to this install: ${paint.command(NATIVE_EDITION_INSTALL_COMMAND)}, then run ${paint.command("omo")}.`,
97498
97737
  "This install keeps working as-is.",
97499
- `Guide: ${paint.link(SENPI_EDITION_GUIDE_URL)}`
97738
+ `Guide: ${paint.link(NATIVE_EDITION_GUIDE_URL)}`
97500
97739
  ];
97501
97740
  }
97502
97741
 
@@ -97511,7 +97750,8 @@ var PLATFORM_REPOSITORIES = {
97511
97750
  opencode: ["code-yeongyu/oh-my-openagent"],
97512
97751
  codex: STAR_REPOSITORIES,
97513
97752
  both: STAR_REPOSITORIES,
97514
- senpi: STAR_REPOSITORIES
97753
+ native: STAR_REPOSITORIES,
97754
+ "native-dev": STAR_REPOSITORIES
97515
97755
  };
97516
97756
  var execFileAsync2 = promisify3(execFile4);
97517
97757
  async function runGitHubStarCommand(repository) {
@@ -98013,14 +98253,27 @@ async function runCliInstaller(args, version) {
98013
98253
  }
98014
98254
  console.log();
98015
98255
  }
98016
- if (config.hasSenpi) {
98017
- printInfo("Installing Senpi harness adapter...");
98256
+ if (config.hasNative) {
98257
+ printInfo("Installing OmO Native...");
98258
+ const outcome = await runNativeInstall();
98259
+ if (outcome.failure) {
98260
+ for (const line of nativeInstallFailureLines(outcome.failure))
98261
+ printError(line);
98262
+ return 1;
98263
+ }
98264
+ for (const note of outcome.notes)
98265
+ printInfo(note);
98266
+ printSuccess(nativeInstallSuccessLine());
98267
+ console.log();
98268
+ }
98269
+ if (config.hasNativeDev) {
98270
+ printInfo("Installing the OmO Native development adapter...");
98018
98271
  try {
98019
- const senpiResult = await runSenpiInstaller();
98020
- printSuccess(`Senpi adapter installed ${SYMBOLS.arrow} ${import_picocolors3.default.dim(senpiResult.settingsPath)}`);
98272
+ const nativeDevResult = await runNativeDevInstaller();
98273
+ printSuccess(`OmO Native development adapter installed ${SYMBOLS.arrow} ${import_picocolors3.default.dim(nativeDevResult.settingsPath)}`);
98021
98274
  } catch (error) {
98022
98275
  const message = error instanceof Error ? error.message : String(error);
98023
- printError(`Senpi install failed: ${message}`);
98276
+ printError(`OmO Native development adapter install failed: ${message}`);
98024
98277
  return 1;
98025
98278
  }
98026
98279
  console.log();
@@ -98031,9 +98284,9 @@ async function runCliInstaller(args, version) {
98031
98284
  printBox(`${import_picocolors3.default.bold("Pro Tip:")} Include ${import_picocolors3.default.cyan("ultrawork")} (or ${import_picocolors3.default.cyan("ulw")}) in your prompt.
98032
98285
  ` + `All features work like magic-parallel agents, background tasks,
98033
98286
  ` + `deep exploration, and relentless execution until completion.`, "The Magic Word");
98034
- if (shouldShowSenpiEditionHint(config)) {
98035
- printInfo(import_picocolors3.default.bold(SENPI_EDITION_HINT_TITLE));
98036
- for (const line of senpiEditionHintLines({ command: import_picocolors3.default.cyan, link: import_picocolors3.default.underline })) {
98287
+ if (shouldShowNativeEditionHint(config)) {
98288
+ printInfo(import_picocolors3.default.bold(NATIVE_EDITION_HINT_TITLE));
98289
+ for (const line of nativeEditionHintLines({ command: import_picocolors3.default.cyan, link: import_picocolors3.default.underline })) {
98037
98290
  console.log(` ${line}`);
98038
98291
  }
98039
98292
  console.log();
@@ -99173,16 +99426,20 @@ var import_picocolors4 = __toESM(require_picocolors(), 1);
99173
99426
  // packages/omo-opencode/src/cli/tui-install-prompts.ts
99174
99427
  init_model_fallback();
99175
99428
 
99176
- // packages/omo-opencode/src/cli/senpi-platform-flag.ts
99177
- var SENPI_PLATFORM_ENV_FLAG = "OMO_ENABLE_SENPI_PLATFORM";
99178
- function isSenpiPlatformEnabled(env = process.env) {
99179
- const value = env[SENPI_PLATFORM_ENV_FLAG]?.trim().toLowerCase();
99180
- return value === "1" || value === "true";
99429
+ // packages/omo-opencode/src/cli/native-dev-platform-flag.ts
99430
+ var NATIVE_DEV_PLATFORM_ENV_FLAG = "OMO_ENABLE_NATIVE_DEV_PLATFORM";
99431
+ var LEGACY_NATIVE_DEV_PLATFORM_ENV_FLAG = "OMO_ENABLE_SENPI_PLATFORM";
99432
+ function isTruthy(value) {
99433
+ const normalized = value?.trim().toLowerCase();
99434
+ return normalized === "1" || normalized === "true";
99435
+ }
99436
+ function isNativeDevPlatformEnabled(env = process.env) {
99437
+ return isTruthy(env[NATIVE_DEV_PLATFORM_ENV_FLAG]) || isTruthy(env[LEGACY_NATIVE_DEV_PLATFORM_ENV_FLAG]);
99181
99438
  }
99182
99439
  function availableInstallPlatforms(env = process.env) {
99183
- const platforms = ["opencode", "codex", "both"];
99184
- if (isSenpiPlatformEnabled(env))
99185
- platforms.push("senpi");
99440
+ const platforms = ["opencode", "codex", "both", "native"];
99441
+ if (isNativeDevPlatformEnabled(env))
99442
+ platforms.push("native-dev");
99186
99443
  return platforms;
99187
99444
  }
99188
99445
 
@@ -99205,10 +99462,15 @@ async function promptInstallPlatform(initialValue = "opencode") {
99205
99462
  const options = [
99206
99463
  { value: "opencode", label: "OpenCode", hint: "Install OpenCode plugin only" },
99207
99464
  { value: "codex", label: "Codex", hint: "Install Codex harness adapter only" },
99208
- { value: "both", label: "Both", hint: "Install OpenCode plugin and Codex adapter" }
99465
+ { value: "both", label: "Both", hint: "Install OpenCode plugin and Codex adapter" },
99466
+ { value: "native", label: "OmO Native", hint: "Install the standalone omo command (no host required)" }
99209
99467
  ];
99210
- if (isSenpiPlatformEnabled()) {
99211
- options.push({ value: "senpi", label: "Senpi", hint: "Install Senpi harness adapter only" });
99468
+ if (isNativeDevPlatformEnabled()) {
99469
+ options.push({
99470
+ value: "native-dev",
99471
+ label: "OmO Native (development adapter)",
99472
+ hint: "Register this checkout into a local engine install"
99473
+ });
99212
99474
  }
99213
99475
  return selectOrCancel({
99214
99476
  message: "Which platform do you want to install?",
@@ -99219,7 +99481,8 @@ async function promptInstallPlatform(initialValue = "opencode") {
99219
99481
  async function promptInstallConfig(detected, platform, codexAutonomousOverride) {
99220
99482
  const hasOpenCode = platform === "opencode" || platform === "both";
99221
99483
  const hasCodex = platform === "codex" || platform === "both";
99222
- const hasSenpi = platform === "senpi";
99484
+ const hasNative = platform === "native";
99485
+ const hasNativeDev = platform === "native-dev";
99223
99486
  const codexAutonomous = await resolveCodexAutonomous(hasCodex, codexAutonomousOverride);
99224
99487
  if (codexAutonomous === null)
99225
99488
  return null;
@@ -99233,7 +99496,8 @@ async function promptInstallConfig(detected, platform, codexAutonomousOverride)
99233
99496
  hasGemini: false,
99234
99497
  hasCopilot: false,
99235
99498
  hasCodex,
99236
- hasSenpi,
99499
+ hasNative,
99500
+ hasNativeDev,
99237
99501
  hasOpencodeZen: false,
99238
99502
  hasZaiCodingPlan: false,
99239
99503
  hasKimiForCoding: false,
@@ -99376,7 +99640,8 @@ async function promptInstallConfig(detected, platform, codexAutonomousOverride)
99376
99640
  hasGemini: gemini === "yes",
99377
99641
  hasCopilot: copilot === "yes",
99378
99642
  hasCodex,
99379
- hasSenpi,
99643
+ hasNative,
99644
+ hasNativeDev,
99380
99645
  hasOpencodeZen: opencodeZen === "yes",
99381
99646
  hasZaiCodingPlan: zaiCodingPlan === "yes",
99382
99647
  hasKimiForCoding: kimiForCoding === "yes",
@@ -99507,15 +99772,29 @@ async function runTuiInstaller(args, version) {
99507
99772
  log4.info("The Codex harness is NOT installed. Fix the error above, then re-run: bunx oh-my-openagent install --platform=codex");
99508
99773
  }
99509
99774
  }
99510
- if (config.hasSenpi) {
99511
- spinner2.start("Installing Senpi harness adapter");
99775
+ if (config.hasNative) {
99776
+ spinner2.start("Installing OmO Native");
99777
+ const outcome = await runNativeInstall();
99778
+ if (outcome.failure) {
99779
+ spinner2.stop(`OmO Native install failed ${import_picocolors4.default.yellow("[!]")}`);
99780
+ for (const line of nativeInstallFailureLines(outcome.failure))
99781
+ log4.error(line);
99782
+ outro(import_picocolors4.default.red("Installation failed."));
99783
+ return 1;
99784
+ }
99785
+ spinner2.stop(nativeInstallSuccessLine());
99786
+ for (const note of outcome.notes)
99787
+ log4.info(note);
99788
+ }
99789
+ if (config.hasNativeDev) {
99790
+ spinner2.start("Installing the OmO Native development adapter");
99512
99791
  try {
99513
- const senpiResult = await runSenpiInstaller();
99514
- spinner2.stop(`Senpi adapter installed to ${import_picocolors4.default.cyan(senpiResult.settingsPath)}`);
99792
+ const nativeDevResult = await runNativeDevInstaller();
99793
+ spinner2.stop(`OmO Native development adapter installed to ${import_picocolors4.default.cyan(nativeDevResult.settingsPath)}`);
99515
99794
  } catch (error) {
99516
99795
  const message = error instanceof Error ? error.message : String(error);
99517
- spinner2.stop(`Senpi install failed ${import_picocolors4.default.yellow("[!]")}`);
99518
- log4.error(`Senpi install failed: ${message}`);
99796
+ spinner2.stop(`OmO Native development adapter install failed ${import_picocolors4.default.yellow("[!]")}`);
99797
+ log4.error(`OmO Native development adapter install failed: ${message}`);
99519
99798
  outro(import_picocolors4.default.red("Installation failed."));
99520
99799
  return 1;
99521
99800
  }
@@ -99529,9 +99808,9 @@ async function runTuiInstaller(args, version) {
99529
99808
  note(`Include ${import_picocolors4.default.cyan("ultrawork")} (or ${import_picocolors4.default.cyan("ulw")}) in your prompt.
99530
99809
  ` + `All features work like magic-parallel agents, background tasks,
99531
99810
  ` + `deep exploration, and relentless execution until completion.`, "The Magic Word");
99532
- if (shouldShowSenpiEditionHint(config)) {
99533
- log4.info(import_picocolors4.default.bold(SENPI_EDITION_HINT_TITLE));
99534
- log4.message(senpiEditionHintLines({ command: import_picocolors4.default.cyan, link: import_picocolors4.default.underline }).join(`
99811
+ if (shouldShowNativeEditionHint(config)) {
99812
+ log4.info(import_picocolors4.default.bold(NATIVE_EDITION_HINT_TITLE));
99813
+ log4.message(nativeEditionHintLines({ command: import_picocolors4.default.cyan, link: import_picocolors4.default.underline }).join(`
99535
99814
  `));
99536
99815
  }
99537
99816
  const shouldStar = await confirm({
@@ -99572,7 +99851,7 @@ async function runTuiInstaller(args, version) {
99572
99851
 
99573
99852
  // packages/omo-opencode/src/cli/install.ts
99574
99853
  var VERSION = package_default.version;
99575
- async function install3(args) {
99854
+ async function install2(args) {
99576
99855
  return args.tui ? runTuiInstaller(args, VERSION) : runCliInstaller(args, VERSION);
99577
99856
  }
99578
99857
  // packages/omo-opencode/src/cli/cleanup.ts
@@ -101073,7 +101352,8 @@ var HookNameSchema = _enum([
101073
101352
  "webfetch-redirect-guard",
101074
101353
  "fsync-skip-warning",
101075
101354
  "plan-format-validator",
101076
- "legacy-plugin-toast"
101355
+ "legacy-plugin-toast",
101356
+ "native-edition-nudge"
101077
101357
  ]);
101078
101358
  // packages/omo-opencode/src/config/schema/i18n.ts
101079
101359
  init_zod();
@@ -103176,14 +103456,14 @@ var NO_OP_POSTHOG2 = {
103176
103456
  function isFalsy(value) {
103177
103457
  return value === "0" || value === "false" || value === "no";
103178
103458
  }
103179
- function isTruthy(value) {
103459
+ function isTruthy2(value) {
103180
103460
  return value === "1" || value === "true" || value === "yes";
103181
103461
  }
103182
103462
  function shouldDisablePostHog(env, configEnabled) {
103183
103463
  if (configEnabled === false) {
103184
103464
  return true;
103185
103465
  }
103186
- if (isTruthy(env.OMO_DISABLE_POSTHOG?.trim().toLowerCase())) {
103466
+ if (isTruthy2(env.OMO_DISABLE_POSTHOG?.trim().toLowerCase())) {
103187
103467
  return true;
103188
103468
  }
103189
103469
  return isFalsy(env.OMO_SEND_ANONYMOUS_TELEMETRY?.trim().toLowerCase());
@@ -104706,14 +104986,14 @@ var CANONICAL_REPLACEMENT = new Map([
104706
104986
  var MIGRATE_SUFFIX = ", or run: oh-my-openagent config migrate";
104707
104987
  var TUNING_CONTAINERS = new Set(["agents", "categories", "models"]);
104708
104988
  var PASSTHROUGH_CONTAINERS = new Set(["provider_options", "providerOptions"]);
104709
- function isRecord15(value) {
104989
+ function isRecord16(value) {
104710
104990
  return value !== null && typeof value === "object" && !Array.isArray(value);
104711
104991
  }
104712
104992
  function isHarnessBlock(key) {
104713
104993
  return key.startsWith("[") && key.endsWith("]");
104714
104994
  }
104715
104995
  function collectIssues(configPath, value, prefix, fixSuffix) {
104716
- if (!isRecord15(value))
104996
+ if (!isRecord16(value))
104717
104997
  return [];
104718
104998
  const issues = [];
104719
104999
  for (const [key, child] of Object.entries(value)) {
@@ -104729,7 +105009,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
104729
105009
  });
104730
105010
  continue;
104731
105011
  }
104732
- if (!isRecord15(child))
105012
+ if (!isRecord16(child))
104733
105013
  continue;
104734
105014
  if (PASSTHROUGH_CONTAINERS.has(key))
104735
105015
  continue;
@@ -104748,7 +105028,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
104748
105028
  return issues;
104749
105029
  }
104750
105030
  function migrateFixSuffix(parsed) {
104751
- if (isRecord15(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
105031
+ if (isRecord16(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
104752
105032
  return "";
104753
105033
  return MIGRATE_SUFFIX;
104754
105034
  }
@@ -105986,12 +106266,12 @@ async function auditBundleTargets(pluginRoot) {
105986
106266
  let referencedCount = 0;
105987
106267
  for (const manifestPath of await findManifestPaths(pluginRoot, ".mcp.json")) {
105988
106268
  const manifest = await readJson2(manifestPath);
105989
- if (manifest === null || !isRecord16(manifest["mcpServers"]))
106269
+ if (manifest === null || !isRecord17(manifest["mcpServers"]))
105990
106270
  continue;
105991
106271
  const manifestRoot = dirname33(manifestPath);
105992
106272
  const isRootManifest = resolve24(manifestRoot) === resolve24(pluginRoot);
105993
106273
  for (const server of Object.values(manifest["mcpServers"])) {
105994
- if (!isRecord16(server) || !Array.isArray(server["args"]))
106274
+ if (!isRecord17(server) || !Array.isArray(server["args"]))
105995
106275
  continue;
105996
106276
  for (const arg of server["args"]) {
105997
106277
  if (typeof arg !== "string" || !isPluginRuntimePathArg(arg))
@@ -106077,7 +106357,7 @@ function collectHookCommands(value, commands) {
106077
106357
  collectHookCommands(item, commands);
106078
106358
  return;
106079
106359
  }
106080
- if (!isRecord16(value))
106360
+ if (!isRecord17(value))
106081
106361
  return;
106082
106362
  if (value["type"] === "command") {
106083
106363
  if (typeof value["command"] === "string")
@@ -106132,7 +106412,7 @@ function parseDegradedEntries(value) {
106132
106412
  return [];
106133
106413
  const entries = [];
106134
106414
  for (const item of value) {
106135
- if (!isRecord16(item))
106415
+ if (!isRecord17(item))
106136
106416
  continue;
106137
106417
  if (typeof item["component"] !== "string" || typeof item["reason"] !== "string")
106138
106418
  continue;
@@ -106166,7 +106446,7 @@ function degradedDetailLines(entries) {
106166
106446
  async function readJson2(path) {
106167
106447
  try {
106168
106448
  const parsed = JSON.parse(await readFile29(path, "utf8"));
106169
- return isRecord16(parsed) ? parsed : null;
106449
+ return isRecord17(parsed) ? parsed : null;
106170
106450
  } catch (error) {
106171
106451
  if (error instanceof Error)
106172
106452
  return null;
@@ -106187,7 +106467,7 @@ function normalizeRelative(root, target) {
106187
106467
  function normalizePathSeparators(path) {
106188
106468
  return path.split("\\").join("/");
106189
106469
  }
106190
- function isRecord16(value) {
106470
+ function isRecord17(value) {
106191
106471
  return typeof value === "object" && value !== null && !Array.isArray(value);
106192
106472
  }
106193
106473
 
@@ -108297,8 +108577,8 @@ var program2 = new Command;
108297
108577
  function resolveInstallArgs(options, invocationName = process.env.OMO_INVOCATION_NAME) {
108298
108578
  const defaultPlatform = process.env.OMO_EDITION === "codex" || invocationName === "lazycodex" || invocationName === "lazycodex-ai" ? "codex" : undefined;
108299
108579
  const platform = options.platform ?? defaultPlatform;
108300
- if (platform === "senpi" && !isSenpiPlatformEnabled()) {
108301
- throw new Error(`The senpi install platform is not available in this release. Set ${SENPI_PLATFORM_ENV_FLAG}=1 to enable it from a source checkout.`);
108580
+ if (platform === "native-dev" && !isNativeDevPlatformEnabled()) {
108581
+ throw new Error(`The native-dev install platform is not available in this release. Set ${NATIVE_DEV_PLATFORM_ENV_FLAG}=1 to enable it from a source checkout.`);
108302
108582
  }
108303
108583
  return {
108304
108584
  tui: options.tui !== false,
@@ -108343,7 +108623,7 @@ Model Providers (Priority: Native > Copilot > OpenCode Zen > Z.ai > Kimi > Baili
108343
108623
  `).action(async (options) => {
108344
108624
  const rootOptions = program2.opts();
108345
108625
  const args = resolveInstallArgs({ ...options, platform: options.platform ?? rootOptions.platform });
108346
- const exitCode = await install3(args);
108626
+ const exitCode = await install2(args);
108347
108627
  process.exit(exitCode);
108348
108628
  });
108349
108629
  configureCleanupCommand(program2);