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
package/dist/cli/index.js CHANGED
@@ -64,7 +64,7 @@ var package_default;
64
64
  var init_package = __esm(() => {
65
65
  package_default = {
66
66
  name: "oh-my-opencode",
67
- version: "5.0.0-beta.82",
67
+ version: "5.0.0-beta.83",
68
68
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
69
69
  main: "./dist/index.js",
70
70
  types: "dist/index.d.ts",
@@ -247,7 +247,7 @@ var init_package = __esm(() => {
247
247
  zod: "^4.6.5"
248
248
  },
249
249
  devDependencies: {
250
- "@code-yeongyu/senpi": "2026.9.22",
250
+ "@code-yeongyu/senpi": "2026.9.22-2",
251
251
  "@oh-my-opencode/agents-md-core": "workspace:*",
252
252
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
253
253
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -287,18 +287,18 @@ var init_package = __esm(() => {
287
287
  typescript: "^7.0.2"
288
288
  },
289
289
  optionalDependencies: {
290
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.82",
291
- "oh-my-opencode-darwin-x64": "5.0.0-beta.82",
292
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.82",
293
- "oh-my-opencode-linux-arm64": "5.0.0-beta.82",
294
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.82",
295
- "oh-my-opencode-linux-x64": "5.0.0-beta.82",
296
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.82",
297
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.82",
298
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.82",
299
- "oh-my-opencode-windows-arm64": "5.0.0-beta.82",
300
- "oh-my-opencode-windows-x64": "5.0.0-beta.82",
301
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.82"
290
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.83",
291
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.83",
292
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.83",
293
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.83",
294
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.83",
295
+ "oh-my-opencode-linux-x64": "5.0.0-beta.83",
296
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.83",
297
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.83",
298
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.83",
299
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.83",
300
+ "oh-my-opencode-windows-x64": "5.0.0-beta.83",
301
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.83"
302
302
  },
303
303
  overrides: {
304
304
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -7227,6 +7227,7 @@ var init_agent_model_requirements = __esm(() => {
7227
7227
  },
7228
7228
  librarian: {
7229
7229
  fallbackChain: [
7230
+ { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
7230
7231
  { providers: ["openai", "openai-codex"], model: "gpt-5.6-luna-fast", variant: "low" },
7231
7232
  { providers: ["deepseek"], model: "deepseek-v4-flash", variant: "max" },
7232
7233
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
@@ -7239,6 +7240,7 @@ var init_agent_model_requirements = __esm(() => {
7239
7240
  },
7240
7241
  explore: {
7241
7242
  fallbackChain: [
7243
+ { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed", variant: "off" },
7242
7244
  { providers: ["openai", "openai-codex"], model: "gpt-5.6-luna-fast", variant: "low" },
7243
7245
  { providers: ["deepseek"], model: "deepseek-v4-flash", variant: "max" },
7244
7246
  { providers: ["opencode-go", "bailian-coding-plan"], model: "qwen3.7-plus" },
@@ -7412,7 +7414,6 @@ var init_category_model_requirements = __esm(() => {
7412
7414
  },
7413
7415
  quick: {
7414
7416
  fallbackChain: [
7415
- { providers: ["kimi-for-coding"], model: "kimi-for-coding-highspeed" },
7416
7417
  { providers: ["openai-codex"], model: "gpt-5.6-luna-fast", variant: "low" },
7417
7418
  { providers: ["deepseek"], model: "deepseek-v4-flash", variant: "off" },
7418
7419
  {
@@ -7432,7 +7433,8 @@ var init_category_model_requirements = __esm(() => {
7432
7433
  },
7433
7434
  "unspecified-low": {
7434
7435
  fallbackChain: [
7435
- { providers: ["xai", "github-copilot", "opencode"], model: "grok-4.6", variant: "xhigh" },
7436
+ { providers: ["xiaomi", "opencode-go"], model: "mimo-v2.6-pro", variant: "max" },
7437
+ { providers: ["xai", "github-copilot", "opencode-go"], model: "grok-4.7", variant: "xhigh" },
7436
7438
  {
7437
7439
  providers: ["openai", "openai-codex", "github-copilot", "opencode"],
7438
7440
  model: "gpt-5.6-terra",
@@ -7454,11 +7456,6 @@ var init_category_model_requirements = __esm(() => {
7454
7456
  },
7455
7457
  "unspecified-high": {
7456
7458
  fallbackChain: [
7457
- {
7458
- providers: ["openai", "openai-codex", "github-copilot", "opencode"],
7459
- model: "gpt-6-astra",
7460
- variant: "high"
7461
- },
7462
7459
  {
7463
7460
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
7464
7461
  model: "claude-opus-5",
@@ -8294,6 +8291,36 @@ var init_supplemental_entries = __esm(() => {
8294
8291
  output: 32768
8295
8292
  }
8296
8293
  },
8294
+ "grok-4.7": {
8295
+ id: "grok-4.7",
8296
+ family: "grok",
8297
+ reasoning: false,
8298
+ temperature: true,
8299
+ toolCall: true,
8300
+ modalities: {
8301
+ input: ["text", "image"],
8302
+ output: ["text"]
8303
+ },
8304
+ limit: {
8305
+ context: 500000,
8306
+ output: 32768
8307
+ }
8308
+ },
8309
+ "xai/grok-4.7": {
8310
+ id: "xai/grok-4.7",
8311
+ family: "grok",
8312
+ reasoning: false,
8313
+ temperature: true,
8314
+ toolCall: true,
8315
+ modalities: {
8316
+ input: ["text", "image"],
8317
+ output: ["text"]
8318
+ },
8319
+ limit: {
8320
+ context: 500000,
8321
+ output: 32768
8322
+ }
8323
+ },
8297
8324
  "xai/grok-build-0.1": {
8298
8325
  id: "xai/grok-build-0.1",
8299
8326
  family: "grok",
@@ -8323,6 +8350,36 @@ var init_supplemental_entries = __esm(() => {
8323
8350
  context: 256000,
8324
8351
  output: 32768
8325
8352
  }
8353
+ },
8354
+ "mimo-v2.6-pro": {
8355
+ id: "mimo-v2.6-pro",
8356
+ family: "mimo",
8357
+ reasoning: true,
8358
+ temperature: true,
8359
+ toolCall: true,
8360
+ modalities: {
8361
+ input: ["text", "image"],
8362
+ output: ["text"]
8363
+ },
8364
+ limit: {
8365
+ context: 1048576,
8366
+ output: 131072
8367
+ }
8368
+ },
8369
+ "xiaomi/mimo-v2.6-pro": {
8370
+ id: "xiaomi/mimo-v2.6-pro",
8371
+ family: "mimo",
8372
+ reasoning: true,
8373
+ temperature: true,
8374
+ toolCall: true,
8375
+ modalities: {
8376
+ input: ["text", "image"],
8377
+ output: ["text"]
8378
+ },
8379
+ limit: {
8380
+ context: 1048576,
8381
+ output: 131072
8382
+ }
8326
8383
  }
8327
8384
  };
8328
8385
  });
@@ -9296,21 +9353,21 @@ var init_openai_categories = __esm(() => {
9296
9353
  },
9297
9354
  {
9298
9355
  name: "quick",
9299
- config: { model: "kimi-for-coding/kimi-for-coding-highspeed" },
9356
+ config: { model: "openai/gpt-5.6-luna-fast", variant: "low" },
9300
9357
  description: "Trivial tasks - single file changes, typo fixes, simple modifications",
9301
9358
  callerGuidance: QUICK_CATEGORY_CALLER_GUIDANCE,
9302
9359
  promptAppend: QUICK_CATEGORY_PROMPT_APPEND
9303
9360
  },
9304
9361
  {
9305
9362
  name: "unspecified-low",
9306
- config: { model: "xai/grok-4.6", variant: "xhigh" },
9363
+ config: { model: "xiaomi/mimo-v2.6-pro", variant: "max" },
9307
9364
  description: "Tasks that don't fit other categories, low effort required",
9308
9365
  callerGuidance: UNSPECIFIED_LOW_CATEGORY_CALLER_GUIDANCE,
9309
9366
  promptAppend: UNSPECIFIED_LOW_CATEGORY_PROMPT_APPEND
9310
9367
  },
9311
9368
  {
9312
9369
  name: "unspecified-high",
9313
- config: { model: "openai/gpt-6-astra", variant: "high" },
9370
+ config: { model: "anthropic/claude-opus-5", variant: "xhigh" },
9314
9371
  description: "Tasks that don't fit other categories, high effort required",
9315
9372
  callerGuidance: UNSPECIFIED_HIGH_CATEGORY_CALLER_GUIDANCE,
9316
9373
  promptAppend: UNSPECIFIED_HIGH_CATEGORY_PROMPT_APPEND,
@@ -73883,12 +73940,14 @@ var init_git_master = __esm(() => {
73883
73940
  });
73884
73941
 
73885
73942
  // packages/omo-config-core/src/schema/harness.ts
73886
- var HARNESS_IDS, OMO_CONFIG_HARNESS_IDS, OmoHarnessIdSchema;
73943
+ var HARNESS_IDS, OMO_CONFIG_HARNESS_IDS, OmoHarnessIdSchema, OMO_CONFIG_LEGACY_HARNESS_ALIASES, OMO_CONFIG_LEGACY_HARNESS_IDS;
73887
73944
  var init_harness = __esm(() => {
73888
73945
  init_zod();
73889
73946
  HARNESS_IDS = ["codex", "opencode", "omo"];
73890
- OMO_CONFIG_HARNESS_IDS = ["opencode", "senpi", "codex"];
73947
+ OMO_CONFIG_HARNESS_IDS = ["opencode", "native", "codex"];
73891
73948
  OmoHarnessIdSchema = _enum(OMO_CONFIG_HARNESS_IDS);
73949
+ OMO_CONFIG_LEGACY_HARNESS_ALIASES = { senpi: "native" };
73950
+ OMO_CONFIG_LEGACY_HARNESS_IDS = Object.keys(OMO_CONFIG_LEGACY_HARNESS_ALIASES);
73892
73951
  });
73893
73952
 
73894
73953
  // packages/omo-config-core/src/schema/memory.ts
@@ -74391,6 +74450,7 @@ var init_config = __esm(() => {
74391
74450
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74392
74451
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74393
74452
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74453
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
74394
74454
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
74395
74455
  "[codex]": OmoTypedHarnessConfigSchema.optional()
74396
74456
  }).strict();
@@ -74409,6 +74469,7 @@ var init_config = __esm(() => {
74409
74469
  telemetry: OmoTelemetrySettingsSchema.optional(),
74410
74470
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74411
74471
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74472
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
74412
74473
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
74413
74474
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
74414
74475
  profiles: record(string2(), OmoConfigProfileSchema).default({}),
@@ -74430,6 +74491,7 @@ var init_config = __esm(() => {
74430
74491
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
74431
74492
  disabled_skills: OmoDisabledSkillsSchema.optional(),
74432
74493
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
74494
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
74433
74495
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
74434
74496
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
74435
74497
  profiles: record(string2(), OmoConfigProfileSchema).optional(),
@@ -74500,6 +74562,60 @@ var init_legacy_category_names = __esm(() => {
74500
74562
  LEGACY_CATEGORY_NAME_ALIASES = { deep: "deep-low" };
74501
74563
  });
74502
74564
 
74565
+ // packages/omo-config-core/src/schema/legacy-harness-names.ts
74566
+ function canonicalHarnessName(name) {
74567
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, name) ? OMO_CONFIG_LEGACY_HARNESS_ALIASES[name] : name;
74568
+ }
74569
+ function harnessBlockKey(harness) {
74570
+ return `[${harness}]`;
74571
+ }
74572
+ function legacyHarnessOfBlockKey(key) {
74573
+ if (!key.startsWith("[") || !key.endsWith("]"))
74574
+ return;
74575
+ const harness = key.slice(1, -1);
74576
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, harness) ? harness : undefined;
74577
+ }
74578
+ function isRecord10(value) {
74579
+ return typeof value === "object" && value !== null && !Array.isArray(value);
74580
+ }
74581
+ function canonicalizeBlocksIn(container, path, renames) {
74582
+ const result = {};
74583
+ for (const [key, value] of Object.entries(container)) {
74584
+ const legacyHarness = legacyHarnessOfBlockKey(key);
74585
+ if (legacyHarness === undefined) {
74586
+ result[key] = value;
74587
+ continue;
74588
+ }
74589
+ const canonical = harnessBlockKey(canonicalHarnessName(legacyHarness));
74590
+ const dropped = Object.hasOwn(container, canonical);
74591
+ renames.push({ canonical, dropped, legacy: key, path: [...path, key].join(".") });
74592
+ if (!dropped)
74593
+ result[canonical] = value;
74594
+ }
74595
+ return result;
74596
+ }
74597
+ function canonicalizeLegacyHarnessBlocks(document) {
74598
+ if (!isRecord10(document))
74599
+ return { document: {}, renames: [] };
74600
+ const renames = [];
74601
+ const canonicalized = canonicalizeBlocksIn(document, [], renames);
74602
+ const profiles = canonicalized["profiles"];
74603
+ if (isRecord10(profiles)) {
74604
+ const canonicalProfiles = {};
74605
+ for (const [name, profile] of Object.entries(profiles)) {
74606
+ canonicalProfiles[name] = isRecord10(profile) ? canonicalizeBlocksIn(profile, ["profiles", name], renames) : profile;
74607
+ }
74608
+ canonicalized["profiles"] = canonicalProfiles;
74609
+ }
74610
+ return { document: canonicalized, renames };
74611
+ }
74612
+ function hasLegacyHarnessBlocks(document) {
74613
+ return canonicalizeLegacyHarnessBlocks(document).renames.length > 0;
74614
+ }
74615
+ var init_legacy_harness_names = __esm(() => {
74616
+ init_harness();
74617
+ });
74618
+
74503
74619
  // packages/omo-config-core/src/schema/index.ts
74504
74620
  var init_schema = __esm(() => {
74505
74621
  init_agent();
@@ -74510,6 +74626,7 @@ var init_schema = __esm(() => {
74510
74626
  init_git_master();
74511
74627
  init_harness();
74512
74628
  init_legacy_category_names();
74629
+ init_legacy_harness_names();
74513
74630
  init_memory();
74514
74631
  init_model_catalog();
74515
74632
  init_model_profile();
@@ -74519,6 +74636,9 @@ var init_schema = __esm(() => {
74519
74636
  init_telemetry();
74520
74637
  });
74521
74638
 
74639
+ // packages/omo-config-core/src/loader/disabled-skills.ts
74640
+ var init_disabled_skills = () => {};
74641
+
74522
74642
  // packages/omo-config-core/src/loader/merge.ts
74523
74643
  function isUnsafeObjectKey2(key) {
74524
74644
  return DANGEROUS_KEYS2.has(key);
@@ -74693,7 +74813,13 @@ function withoutControlKeys(config) {
74693
74813
  function harnessLayer(config, harness) {
74694
74814
  if (harness === undefined)
74695
74815
  return {};
74696
- return toRecord(config[`[${harness}]`]) ?? {};
74816
+ const canonical = canonicalHarnessName(harness);
74817
+ const legacyKeys = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([legacy]) => harnessBlockKey(legacy));
74818
+ let layer = {};
74819
+ for (const key of [...legacyKeys, harnessBlockKey(canonical)]) {
74820
+ layer = mergeOmoConfigRecords(layer, toRecord(config[key]) ?? {});
74821
+ }
74822
+ return layer;
74697
74823
  }
74698
74824
  function resolveOmoConfigView(options) {
74699
74825
  const profiles = toRecord(options.config["profiles"]);
@@ -74723,7 +74849,7 @@ var HARNESS_KEYS;
74723
74849
  var init_resolution = __esm(() => {
74724
74850
  init_schema();
74725
74851
  init_merge();
74726
- HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS])].map((harness) => `[${harness}]`);
74852
+ HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS, ...OMO_CONFIG_LEGACY_HARNESS_IDS])].map((harness) => harnessBlockKey(harness));
74727
74853
  });
74728
74854
 
74729
74855
  // packages/omo-config-core/src/loader/loader.ts
@@ -74744,6 +74870,7 @@ function parseJsoncSafe2(content) {
74744
74870
  function stripResolutionControlKeys(config) {
74745
74871
  const {
74746
74872
  "[codex]": _codex,
74873
+ "[native]": _native,
74747
74874
  "[opencode]": _opencode,
74748
74875
  "[senpi]": _senpi,
74749
74876
  profiles: _profiles,
@@ -74769,21 +74896,21 @@ function hasUnsafeUnrecognizedKey(issues) {
74769
74896
  function hasTamperedPrototype(value) {
74770
74897
  if (Array.isArray(value))
74771
74898
  return value.some((entry) => hasTamperedPrototype(entry));
74772
- if (!isRecord10(value))
74899
+ if (!isRecord11(value))
74773
74900
  return false;
74774
74901
  const prototype = Object.getPrototypeOf(value);
74775
74902
  if (prototype !== Object.prototype && prototype !== null)
74776
74903
  return true;
74777
74904
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
74778
74905
  }
74779
- function isRecord10(value) {
74906
+ function isRecord11(value) {
74780
74907
  return typeof value === "object" && value !== null && !Array.isArray(value);
74781
74908
  }
74782
74909
  function containerAt(record, path) {
74783
74910
  let container = record;
74784
74911
  for (const segment of path) {
74785
74912
  const next = container[segment];
74786
- if (!isRecord10(next))
74913
+ if (!isRecord11(next))
74787
74914
  return null;
74788
74915
  container = next;
74789
74916
  }
@@ -74894,6 +75021,15 @@ function legacyCategoryDiagnostic(path, renames) {
74894
75021
  issuePaths: renames.map((rename) => rename.path)
74895
75022
  };
74896
75023
  }
75024
+ function legacyHarnessDiagnostic(path, renames) {
75025
+ const detail = renames.map((rename) => rename.dropped ? `${rename.path} ignored because ${rename.canonical} is also configured` : `${rename.path} renamed to ${rename.canonical}`).join(", ");
75026
+ return {
75027
+ kind: "deprecated-keys",
75028
+ message: `Deprecated harness block in ${path}: ${detail}. Rename it; the alias is removed in a future release.`,
75029
+ path,
75030
+ issuePaths: renames.map((rename) => rename.path)
75031
+ };
75032
+ }
74897
75033
  function loadOmoConfig(options = {}) {
74898
75034
  const fileSystem = options.fileSystem ?? DEFAULT_READ_FILE_SYSTEM;
74899
75035
  const cwd = options.cwd ?? process.cwd();
@@ -74916,8 +75052,12 @@ function loadOmoConfig(options = {}) {
74916
75052
  if (canonicalized.renames.length > 0) {
74917
75053
  diagnostics.push(legacyCategoryDiagnostic(candidate.path, canonicalized.renames));
74918
75054
  }
74919
- layers.push({ config: canonicalized.document, source: loaded.source });
74920
- merged = mergeOmoConfigRecords(merged, canonicalized.document);
75055
+ const harnessCanonicalized = canonicalizeLegacyHarnessBlocks(canonicalized.document);
75056
+ if (harnessCanonicalized.renames.length > 0) {
75057
+ diagnostics.push(legacyHarnessDiagnostic(candidate.path, harnessCanonicalized.renames));
75058
+ }
75059
+ layers.push({ config: harnessCanonicalized.document, source: loaded.source });
75060
+ merged = mergeOmoConfigRecords(merged, harnessCanonicalized.document);
74921
75061
  }
74922
75062
  }
74923
75063
  const requestedProfile = resolveOmoProfileName({
@@ -74965,6 +75105,7 @@ var init_loader2 = __esm(() => {
74965
75105
 
74966
75106
  // packages/omo-config-core/src/loader/index.ts
74967
75107
  var init_loader3 = __esm(() => {
75108
+ init_disabled_skills();
74968
75109
  init_loader2();
74969
75110
  init_merge();
74970
75111
  init_paths();
@@ -77282,14 +77423,14 @@ function transformConfigJsoncSources(input) {
77282
77423
  const omo = recordAt(legacy, "[omo]");
77283
77424
  const senpi = recordAt(legacy, "[senpi]");
77284
77425
  const history = legacyMigrationHistory(input.discovered, input.sources);
77285
- const diagnostics = omo !== undefined && senpi !== undefined ? ["conflict: [senpi] legacy [omo] kept [senpi]"] : [];
77426
+ const diagnostics = omo !== undefined && senpi !== undefined ? ["conflict: [native] legacy [omo] kept [native]"] : [];
77286
77427
  return {
77287
77428
  diagnostics,
77288
77429
  document: {
77289
77430
  $schema: OMO_SCHEMA_URL,
77290
77431
  ...recordAt(legacy, "[opencode]") === undefined ? {} : { "[opencode]": recordAt(legacy, "[opencode]") },
77291
77432
  ...recordAt(legacy, "[codex]") === undefined ? {} : { "[codex]": recordAt(legacy, "[codex]") },
77292
- ...senpi === undefined && omo === undefined ? {} : { "[senpi]": senpi ?? omo },
77433
+ ...senpi === undefined && omo === undefined ? {} : { "[native]": senpi ?? omo },
77293
77434
  ...Object.keys(history).length === 0 ? {} : { legacy_migrations: history }
77294
77435
  }
77295
77436
  };
@@ -77553,7 +77694,7 @@ function normalizeTypedBlock(value, path, diagnostics, recurseProfiles) {
77553
77694
  }
77554
77695
  if (result["models"] !== undefined)
77555
77696
  result["models"] = normalizeCatalog(result["models"]);
77556
- for (const harness of ["[senpi]", "[codex]"]) {
77697
+ for (const harness of ["[senpi]", "[native]", "[codex]"]) {
77557
77698
  if (result[harness] !== undefined)
77558
77699
  result[harness] = normalizeTypedBlock(result[harness], [...path, harness], diagnostics, false);
77559
77700
  }
@@ -77607,6 +77748,19 @@ var init_category_deep_split = __esm(() => {
77607
77748
  init_src4();
77608
77749
  });
77609
77750
 
77751
+ // packages/omo-opencode/src/config-migration/harness-native-rename.ts
77752
+ function transformHarnessNativeRename(document) {
77753
+ const { document: canonicalized, renames } = canonicalizeLegacyHarnessBlocks(document);
77754
+ return {
77755
+ diagnostics: renames.map((rename) => rename.dropped ? `${rename.path} removed: ${rename.canonical} is already configured` : `${rename.path} renamed to ${rename.canonical}`),
77756
+ document: canonicalized
77757
+ };
77758
+ }
77759
+ var HARNESS_NATIVE_RENAME_MIGRATION_ID = "2026-09-harness-native-rename";
77760
+ var init_harness_native_rename = __esm(() => {
77761
+ init_src4();
77762
+ });
77763
+
77610
77764
  // packages/omo-opencode/src/config-migration/migration-plans.ts
77611
77765
  function backupTimestamp(value) {
77612
77766
  return value ?? new Date().toISOString().replace(/[:.]/g, "-");
@@ -77685,6 +77839,18 @@ function categoryDeepSplitPlan(targetPath) {
77685
77839
  transform: inspect
77686
77840
  };
77687
77841
  }
77842
+ function harnessNativeRenamePlan(targetPath) {
77843
+ const inspect = (sources) => transformHarnessNativeRename(sources[0]?.value);
77844
+ return {
77845
+ id: HARNESS_NATIVE_RENAME_MIGRATION_ID,
77846
+ inspect,
77847
+ mode: "replace-target",
77848
+ shouldRun: hasLegacyHarnessBlocks,
77849
+ sources: [],
77850
+ targetPath,
77851
+ transform: inspect
77852
+ };
77853
+ }
77688
77854
  function existingOmoConfigPath(directory, options) {
77689
77855
  const fileSystem = discoveryFileSystem(options);
77690
77856
  for (const fileName of ["omo.jsonc", "omo.json"]) {
@@ -77748,7 +77914,8 @@ function createLegacyConfigMigrationPlans(options) {
77748
77914
  return [
77749
77915
  ...legacyPlans,
77750
77916
  ...inPlaceTargets.map(reasoningPlan),
77751
- ...inPlaceTargets.map(categoryDeepSplitPlan)
77917
+ ...inPlaceTargets.map(categoryDeepSplitPlan),
77918
+ ...inPlaceTargets.map(harnessNativeRenamePlan)
77752
77919
  ];
77753
77920
  }
77754
77921
  var init_migration_plans = __esm(() => {
@@ -77759,6 +77926,7 @@ var init_migration_plans = __esm(() => {
77759
77926
  init_transform_opencode();
77760
77927
  init_reasoning_unification();
77761
77928
  init_category_deep_split();
77929
+ init_harness_native_rename();
77762
77930
  init_src4();
77763
77931
  });
77764
77932
 
@@ -78543,7 +78711,7 @@ function shouldRetainLine(line, cutoffMs) {
78543
78711
  function parseDiagnosticLine(line) {
78544
78712
  try {
78545
78713
  const parsed = JSON.parse(line);
78546
- if (!isRecord12(parsed)) {
78714
+ if (!isRecord13(parsed)) {
78547
78715
  return null;
78548
78716
  }
78549
78717
  return parsed;
@@ -78554,7 +78722,7 @@ function parseDiagnosticLine(line) {
78554
78722
  throw error;
78555
78723
  }
78556
78724
  }
78557
- function isRecord12(value) {
78725
+ function isRecord13(value) {
78558
78726
  return value !== null && typeof value === "object" && !Array.isArray(value);
78559
78727
  }
78560
78728
  function trimToMaxBytes(lines) {
@@ -86044,7 +86212,7 @@ function coerceBool(value) {
86044
86212
  function coerceString(value) {
86045
86213
  return typeof value == "string" ? value : undefined;
86046
86214
  }
86047
- function isRecord13(value) {
86215
+ function isRecord14(value) {
86048
86216
  return typeof value == "object" && value !== null && !Array.isArray(value);
86049
86217
  }
86050
86218
  function toRfc3339(timestamp) {
@@ -86066,7 +86234,7 @@ function relocateInto(properties, key, value) {
86066
86234
  properties[key] = value;
86067
86235
  }
86068
86236
  function buildV1Event(message) {
86069
- const sourceProperties = isRecord13(message.properties) ? message.properties : {};
86237
+ const sourceProperties = isRecord14(message.properties) ? message.properties : {};
86070
86238
  const properties = {
86071
86239
  ...sourceProperties
86072
86240
  };
@@ -88211,7 +88379,7 @@ var package_default2;
88211
88379
  var init_package2 = __esm(() => {
88212
88380
  package_default2 = {
88213
88381
  name: "@oh-my-opencode/omo-codex",
88214
- version: "5.0.0-beta.82",
88382
+ version: "5.0.0-beta.83",
88215
88383
  type: "module",
88216
88384
  private: true,
88217
88385
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -91386,8 +91554,11 @@ function formatConfigSummary(config) {
91386
91554
  if (config.hasCodex) {
91387
91555
  lines.push(` ${SYMBOLS.info} Codex autonomous mode: ${config.codexAutonomous ? "enabled" : "disabled"}`);
91388
91556
  }
91389
- if (config.hasSenpi) {
91390
- lines.push(` ${SYMBOLS.info} Senpi adapter: enabled`);
91557
+ if (config.hasNative) {
91558
+ lines.push(` ${SYMBOLS.info} OmO Native: installing from omo-ai@beta`);
91559
+ }
91560
+ if (config.hasNativeDev) {
91561
+ lines.push(` ${SYMBOLS.info} OmO Native development adapter: enabled`);
91391
91562
  }
91392
91563
  if (!config.hasOpenCode)
91393
91564
  return lines.join(`
@@ -91544,7 +91715,8 @@ function argsToConfig(args) {
91544
91715
  const platform = resolvePlatform(args);
91545
91716
  const hasOpenCode = platform === "opencode" || platform === "both";
91546
91717
  const hasCodex = platform === "codex" || platform === "both";
91547
- const hasSenpi = platform === "senpi";
91718
+ const hasNative = platform === "native";
91719
+ const hasNativeDev = platform === "native-dev";
91548
91720
  return {
91549
91721
  platform,
91550
91722
  hasOpenCode,
@@ -91554,7 +91726,8 @@ function argsToConfig(args) {
91554
91726
  hasGemini: hasOpenCode && args.gemini === "yes",
91555
91727
  hasCopilot: hasOpenCode && args.copilot === "yes",
91556
91728
  hasCodex,
91557
- hasSenpi,
91729
+ hasNative,
91730
+ hasNativeDev,
91558
91731
  hasOpencodeZen: hasOpenCode && args.opencodeZen === "yes",
91559
91732
  hasZaiCodingPlan: hasOpenCode && args.zaiCodingPlan === "yes",
91560
91733
  hasKimiForCoding: hasOpenCode && args.kimiForCoding === "yes",
@@ -94278,10 +94451,10 @@ function readCatalogMultiAgentVersion(model, cachePath) {
94278
94451
  } catch {
94279
94452
  return null;
94280
94453
  }
94281
- if (!isRecord11(cache) || !Array.isArray(cache.models))
94454
+ if (!isRecord12(cache) || !Array.isArray(cache.models))
94282
94455
  return null;
94283
94456
  for (const entry of cache.models) {
94284
- if (!isRecord11(entry))
94457
+ if (!isRecord12(entry))
94285
94458
  continue;
94286
94459
  if (entry.slug !== model && entry.id !== model)
94287
94460
  continue;
@@ -94306,7 +94479,7 @@ function readRootModelCatalogPath(config) {
94306
94479
  const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
94307
94480
  return single?.[1] ?? null;
94308
94481
  }
94309
- function isRecord11(value) {
94482
+ function isRecord12(value) {
94310
94483
  return typeof value === "object" && value !== null && !Array.isArray(value);
94311
94484
  }
94312
94485
  function removeFeatureFlagSetting(config, featureName) {
@@ -97115,7 +97288,7 @@ async function readSettings(settingsPath) {
97115
97288
  throw error;
97116
97289
  }
97117
97290
  const parsed = JSON.parse(raw);
97118
- if (!isRecord14(parsed))
97291
+ if (!isRecord15(parsed))
97119
97292
  throw new Error(`${settingsPath} must contain a JSON object`);
97120
97293
  return parsed;
97121
97294
  }
@@ -97176,7 +97349,7 @@ async function nextBackupPath(settingsPath) {
97176
97349
  function timestampForBackup() {
97177
97350
  return new Date().toISOString().replace(/[-:.]/g, "");
97178
97351
  }
97179
- function isRecord14(value) {
97352
+ function isRecord15(value) {
97180
97353
  return typeof value === "object" && value !== null && !Array.isArray(value);
97181
97354
  }
97182
97355
  async function readPackageName(packagePath) {
@@ -97196,7 +97369,7 @@ async function readPackageName(packagePath) {
97196
97369
  return;
97197
97370
  throw error;
97198
97371
  }
97199
- return isRecord14(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
97372
+ return isRecord15(parsed) && typeof parsed.name === "string" ? parsed.name : undefined;
97200
97373
  }
97201
97374
  async function fileExists(path) {
97202
97375
  try {
@@ -97220,6 +97393,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
97220
97393
  join61("extensions", "memory-run-supervisor.mjs"),
97221
97394
  ...PERSONA_ASSET_FILES.map((filename) => join61("extensions", filename)),
97222
97395
  join61("skills", "ast-grep", "SKILL.md"),
97396
+ join61("skills", "browser", "SKILL.md"),
97223
97397
  join61("skills", "coding-agent-sessions", "SKILL.md"),
97224
97398
  join61("skills", "debugging", "SKILL.md"),
97225
97399
  join61("skills", "frontend", "SKILL.md"),
@@ -97311,7 +97485,7 @@ async function verifyAstGrepRuntimeIntegrity(pluginPath, platform) {
97311
97485
  }
97312
97486
  }
97313
97487
  function isAstGrepRuntimeManifest(value) {
97314
- if (!isRecord14(value))
97488
+ if (!isRecord15(value))
97315
97489
  return false;
97316
97490
  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));
97317
97491
  }
@@ -97401,23 +97575,88 @@ function findRepoRoot2(importerDir) {
97401
97575
  function fileExistsSync(path) {
97402
97576
  return existsSync30(path);
97403
97577
  }
97404
- // packages/omo-opencode/src/cli/senpi-edition-hint.ts
97405
- var SENPI_EDITION_INSTALL_COMMAND = "bun add -g omo-ai@beta";
97406
- 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";
97407
- var SENPI_EDITION_HINT_TITLE = "Standalone Senpi edition (beta)";
97578
+ // packages/omo-opencode/src/cli/install-native-dev/index.ts
97579
+ async function runNativeDevInstaller(options) {
97580
+ return runSenpiInstaller(options);
97581
+ }
97582
+
97583
+ // packages/omo-opencode/src/cli/install-native/plan.ts
97584
+ var NATIVE_PACKAGE_SPEC = "omo-ai@beta";
97585
+ var NATIVE_SETUP_COMMAND = "omo setup";
97586
+ 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.";
97587
+ var PLANS = {
97588
+ bun: { packageManager: "bun", command: "bun", args: ["add", "-g", NATIVE_PACKAGE_SPEC] },
97589
+ npm: { packageManager: "npm", command: "npm", args: ["i", "-g", NATIVE_PACKAGE_SPEC] }
97590
+ };
97591
+ function resolveNativeInstallPlan(bunAvailable) {
97592
+ return bunAvailable ? PLANS.bun : PLANS.npm;
97593
+ }
97594
+ function formatNativeInstallCommand(plan) {
97595
+ return [plan.command, ...plan.args].join(" ");
97596
+ }
97597
+ // packages/omo-opencode/src/cli/install-native/run-native-install.ts
97598
+ init_bun_which_shim();
97599
+ init_spawn_with_windows_hide();
97600
+ function describeExit(plan, result) {
97601
+ const stderr = result.stderr?.trim();
97602
+ const head = `${plan.packageManager} exited with code ${result.exitCode}`;
97603
+ return stderr ? `${head}: ${stderr.split(`
97604
+ `).slice(-3).join(" ")}` : head;
97605
+ }
97606
+ async function runNativeInstall(dependencies = defaultNativeInstallDependencies()) {
97607
+ const plan = resolveNativeInstallPlan(await dependencies.isBunAvailable());
97608
+ const notes = plan.packageManager === "npm" ? [NATIVE_RECOMMENDED_RUNTIME_NOTE] : [];
97609
+ const manualCommand = formatNativeInstallCommand(plan);
97610
+ try {
97611
+ const result = await dependencies.spawn(plan.command, plan.args);
97612
+ if (result.exitCode === 0)
97613
+ return { ok: true, plan, notes };
97614
+ return { ok: false, plan, notes, failure: { reason: describeExit(plan, result), manualCommand } };
97615
+ } catch (error) {
97616
+ const reason = error instanceof Error ? error.message : String(error);
97617
+ return { ok: false, plan, notes, failure: { reason, manualCommand } };
97618
+ }
97619
+ }
97620
+ function nativeInstallSuccessLine() {
97621
+ return `OmO Native installed. Run ${NATIVE_SETUP_COMMAND} to finish onboarding.`;
97622
+ }
97623
+ function nativeInstallFailureLines(failure) {
97624
+ return [
97625
+ `OmO Native install failed: ${failure.reason}`,
97626
+ `Install it yourself with: ${failure.manualCommand}`,
97627
+ `Then run ${NATIVE_SETUP_COMMAND}.`
97628
+ ];
97629
+ }
97630
+ function defaultNativeInstallDependencies() {
97631
+ return {
97632
+ isBunAvailable: () => bunWhich("bun") !== null,
97633
+ spawn: async (command, args) => {
97634
+ const proc = spawnWithWindowsHide([command, ...args], {
97635
+ env: process.env,
97636
+ stdout: "inherit",
97637
+ stderr: "inherit"
97638
+ });
97639
+ return { exitCode: await proc.exited };
97640
+ }
97641
+ };
97642
+ }
97643
+ // packages/omo-opencode/src/cli/native-edition-hint.ts
97644
+ var NATIVE_EDITION_INSTALL_COMMAND = "bun add -g omo-ai@beta";
97645
+ 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";
97646
+ var NATIVE_EDITION_HINT_TITLE = "OmO Native (beta)";
97408
97647
  var PLAIN_PAINT = {
97409
97648
  command: (text) => text,
97410
97649
  link: (text) => text
97411
97650
  };
97412
- function shouldShowSenpiEditionHint(config) {
97413
- return !config.hasSenpi;
97651
+ function shouldShowNativeEditionHint(config) {
97652
+ return !config.hasNative && !config.hasNativeDev;
97414
97653
  }
97415
- function senpiEditionHintLines(paint = PLAIN_PAINT) {
97654
+ function nativeEditionHintLines(paint = PLAIN_PAINT) {
97416
97655
  return [
97417
- `omo also ships as a standalone Senpi edition: one ${paint.command("omo")} command, no OpenCode host required.`,
97418
- `Try it next to this install: ${paint.command(SENPI_EDITION_INSTALL_COMMAND)}, then run ${paint.command("omo")}.`,
97656
+ `omo also ships as OmO Native: the same omo as one ${paint.command("omo")} command, with no OpenCode host required.`,
97657
+ `Try it next to this install: ${paint.command(NATIVE_EDITION_INSTALL_COMMAND)}, then run ${paint.command("omo")}.`,
97419
97658
  "This install keeps working as-is.",
97420
- `Guide: ${paint.link(SENPI_EDITION_GUIDE_URL)}`
97659
+ `Guide: ${paint.link(NATIVE_EDITION_GUIDE_URL)}`
97421
97660
  ];
97422
97661
  }
97423
97662
 
@@ -97432,7 +97671,8 @@ var PLATFORM_REPOSITORIES = {
97432
97671
  opencode: ["code-yeongyu/oh-my-openagent"],
97433
97672
  codex: STAR_REPOSITORIES,
97434
97673
  both: STAR_REPOSITORIES,
97435
- senpi: STAR_REPOSITORIES
97674
+ native: STAR_REPOSITORIES,
97675
+ "native-dev": STAR_REPOSITORIES
97436
97676
  };
97437
97677
  var execFileAsync2 = promisify3(execFile4);
97438
97678
  async function runGitHubStarCommand(repository) {
@@ -97934,14 +98174,27 @@ async function runCliInstaller(args, version) {
97934
98174
  }
97935
98175
  console.log();
97936
98176
  }
97937
- if (config.hasSenpi) {
97938
- printInfo("Installing Senpi harness adapter...");
98177
+ if (config.hasNative) {
98178
+ printInfo("Installing OmO Native...");
98179
+ const outcome = await runNativeInstall();
98180
+ if (outcome.failure) {
98181
+ for (const line of nativeInstallFailureLines(outcome.failure))
98182
+ printError(line);
98183
+ return 1;
98184
+ }
98185
+ for (const note of outcome.notes)
98186
+ printInfo(note);
98187
+ printSuccess(nativeInstallSuccessLine());
98188
+ console.log();
98189
+ }
98190
+ if (config.hasNativeDev) {
98191
+ printInfo("Installing the OmO Native development adapter...");
97939
98192
  try {
97940
- const senpiResult = await runSenpiInstaller();
97941
- printSuccess(`Senpi adapter installed ${SYMBOLS.arrow} ${import_picocolors3.default.dim(senpiResult.settingsPath)}`);
98193
+ const nativeDevResult = await runNativeDevInstaller();
98194
+ printSuccess(`OmO Native development adapter installed ${SYMBOLS.arrow} ${import_picocolors3.default.dim(nativeDevResult.settingsPath)}`);
97942
98195
  } catch (error) {
97943
98196
  const message = error instanceof Error ? error.message : String(error);
97944
- printError(`Senpi install failed: ${message}`);
98197
+ printError(`OmO Native development adapter install failed: ${message}`);
97945
98198
  return 1;
97946
98199
  }
97947
98200
  console.log();
@@ -97952,9 +98205,9 @@ async function runCliInstaller(args, version) {
97952
98205
  printBox(`${import_picocolors3.default.bold("Pro Tip:")} Include ${import_picocolors3.default.cyan("ultrawork")} (or ${import_picocolors3.default.cyan("ulw")}) in your prompt.
97953
98206
  ` + `All features work like magic-parallel agents, background tasks,
97954
98207
  ` + `deep exploration, and relentless execution until completion.`, "The Magic Word");
97955
- if (shouldShowSenpiEditionHint(config)) {
97956
- printInfo(import_picocolors3.default.bold(SENPI_EDITION_HINT_TITLE));
97957
- for (const line of senpiEditionHintLines({ command: import_picocolors3.default.cyan, link: import_picocolors3.default.underline })) {
98208
+ if (shouldShowNativeEditionHint(config)) {
98209
+ printInfo(import_picocolors3.default.bold(NATIVE_EDITION_HINT_TITLE));
98210
+ for (const line of nativeEditionHintLines({ command: import_picocolors3.default.cyan, link: import_picocolors3.default.underline })) {
97958
98211
  console.log(` ${line}`);
97959
98212
  }
97960
98213
  console.log();
@@ -99094,16 +99347,20 @@ var import_picocolors4 = __toESM(require_picocolors(), 1);
99094
99347
  // packages/omo-opencode/src/cli/tui-install-prompts.ts
99095
99348
  init_model_fallback();
99096
99349
 
99097
- // packages/omo-opencode/src/cli/senpi-platform-flag.ts
99098
- var SENPI_PLATFORM_ENV_FLAG = "OMO_ENABLE_SENPI_PLATFORM";
99099
- function isSenpiPlatformEnabled(env = process.env) {
99100
- const value = env[SENPI_PLATFORM_ENV_FLAG]?.trim().toLowerCase();
99101
- return value === "1" || value === "true";
99350
+ // packages/omo-opencode/src/cli/native-dev-platform-flag.ts
99351
+ var NATIVE_DEV_PLATFORM_ENV_FLAG = "OMO_ENABLE_NATIVE_DEV_PLATFORM";
99352
+ var LEGACY_NATIVE_DEV_PLATFORM_ENV_FLAG = "OMO_ENABLE_SENPI_PLATFORM";
99353
+ function isTruthy(value) {
99354
+ const normalized = value?.trim().toLowerCase();
99355
+ return normalized === "1" || normalized === "true";
99356
+ }
99357
+ function isNativeDevPlatformEnabled(env = process.env) {
99358
+ return isTruthy(env[NATIVE_DEV_PLATFORM_ENV_FLAG]) || isTruthy(env[LEGACY_NATIVE_DEV_PLATFORM_ENV_FLAG]);
99102
99359
  }
99103
99360
  function availableInstallPlatforms(env = process.env) {
99104
- const platforms = ["opencode", "codex", "both"];
99105
- if (isSenpiPlatformEnabled(env))
99106
- platforms.push("senpi");
99361
+ const platforms = ["opencode", "codex", "both", "native"];
99362
+ if (isNativeDevPlatformEnabled(env))
99363
+ platforms.push("native-dev");
99107
99364
  return platforms;
99108
99365
  }
99109
99366
 
@@ -99126,10 +99383,15 @@ async function promptInstallPlatform(initialValue = "opencode") {
99126
99383
  const options = [
99127
99384
  { value: "opencode", label: "OpenCode", hint: "Install OpenCode plugin only" },
99128
99385
  { value: "codex", label: "Codex", hint: "Install Codex harness adapter only" },
99129
- { value: "both", label: "Both", hint: "Install OpenCode plugin and Codex adapter" }
99386
+ { value: "both", label: "Both", hint: "Install OpenCode plugin and Codex adapter" },
99387
+ { value: "native", label: "OmO Native", hint: "Install the standalone omo command (no host required)" }
99130
99388
  ];
99131
- if (isSenpiPlatformEnabled()) {
99132
- options.push({ value: "senpi", label: "Senpi", hint: "Install Senpi harness adapter only" });
99389
+ if (isNativeDevPlatformEnabled()) {
99390
+ options.push({
99391
+ value: "native-dev",
99392
+ label: "OmO Native (development adapter)",
99393
+ hint: "Register this checkout into a local engine install"
99394
+ });
99133
99395
  }
99134
99396
  return selectOrCancel({
99135
99397
  message: "Which platform do you want to install?",
@@ -99140,7 +99402,8 @@ async function promptInstallPlatform(initialValue = "opencode") {
99140
99402
  async function promptInstallConfig(detected, platform, codexAutonomousOverride) {
99141
99403
  const hasOpenCode = platform === "opencode" || platform === "both";
99142
99404
  const hasCodex = platform === "codex" || platform === "both";
99143
- const hasSenpi = platform === "senpi";
99405
+ const hasNative = platform === "native";
99406
+ const hasNativeDev = platform === "native-dev";
99144
99407
  const codexAutonomous = await resolveCodexAutonomous(hasCodex, codexAutonomousOverride);
99145
99408
  if (codexAutonomous === null)
99146
99409
  return null;
@@ -99154,7 +99417,8 @@ async function promptInstallConfig(detected, platform, codexAutonomousOverride)
99154
99417
  hasGemini: false,
99155
99418
  hasCopilot: false,
99156
99419
  hasCodex,
99157
- hasSenpi,
99420
+ hasNative,
99421
+ hasNativeDev,
99158
99422
  hasOpencodeZen: false,
99159
99423
  hasZaiCodingPlan: false,
99160
99424
  hasKimiForCoding: false,
@@ -99297,7 +99561,8 @@ async function promptInstallConfig(detected, platform, codexAutonomousOverride)
99297
99561
  hasGemini: gemini === "yes",
99298
99562
  hasCopilot: copilot === "yes",
99299
99563
  hasCodex,
99300
- hasSenpi,
99564
+ hasNative,
99565
+ hasNativeDev,
99301
99566
  hasOpencodeZen: opencodeZen === "yes",
99302
99567
  hasZaiCodingPlan: zaiCodingPlan === "yes",
99303
99568
  hasKimiForCoding: kimiForCoding === "yes",
@@ -99428,15 +99693,29 @@ async function runTuiInstaller(args, version) {
99428
99693
  log4.info("The Codex harness is NOT installed. Fix the error above, then re-run: bunx oh-my-openagent install --platform=codex");
99429
99694
  }
99430
99695
  }
99431
- if (config.hasSenpi) {
99432
- spinner2.start("Installing Senpi harness adapter");
99696
+ if (config.hasNative) {
99697
+ spinner2.start("Installing OmO Native");
99698
+ const outcome = await runNativeInstall();
99699
+ if (outcome.failure) {
99700
+ spinner2.stop(`OmO Native install failed ${import_picocolors4.default.yellow("[!]")}`);
99701
+ for (const line of nativeInstallFailureLines(outcome.failure))
99702
+ log4.error(line);
99703
+ outro(import_picocolors4.default.red("Installation failed."));
99704
+ return 1;
99705
+ }
99706
+ spinner2.stop(nativeInstallSuccessLine());
99707
+ for (const note of outcome.notes)
99708
+ log4.info(note);
99709
+ }
99710
+ if (config.hasNativeDev) {
99711
+ spinner2.start("Installing the OmO Native development adapter");
99433
99712
  try {
99434
- const senpiResult = await runSenpiInstaller();
99435
- spinner2.stop(`Senpi adapter installed to ${import_picocolors4.default.cyan(senpiResult.settingsPath)}`);
99713
+ const nativeDevResult = await runNativeDevInstaller();
99714
+ spinner2.stop(`OmO Native development adapter installed to ${import_picocolors4.default.cyan(nativeDevResult.settingsPath)}`);
99436
99715
  } catch (error) {
99437
99716
  const message = error instanceof Error ? error.message : String(error);
99438
- spinner2.stop(`Senpi install failed ${import_picocolors4.default.yellow("[!]")}`);
99439
- log4.error(`Senpi install failed: ${message}`);
99717
+ spinner2.stop(`OmO Native development adapter install failed ${import_picocolors4.default.yellow("[!]")}`);
99718
+ log4.error(`OmO Native development adapter install failed: ${message}`);
99440
99719
  outro(import_picocolors4.default.red("Installation failed."));
99441
99720
  return 1;
99442
99721
  }
@@ -99450,9 +99729,9 @@ async function runTuiInstaller(args, version) {
99450
99729
  note(`Include ${import_picocolors4.default.cyan("ultrawork")} (or ${import_picocolors4.default.cyan("ulw")}) in your prompt.
99451
99730
  ` + `All features work like magic-parallel agents, background tasks,
99452
99731
  ` + `deep exploration, and relentless execution until completion.`, "The Magic Word");
99453
- if (shouldShowSenpiEditionHint(config)) {
99454
- log4.info(import_picocolors4.default.bold(SENPI_EDITION_HINT_TITLE));
99455
- log4.message(senpiEditionHintLines({ command: import_picocolors4.default.cyan, link: import_picocolors4.default.underline }).join(`
99732
+ if (shouldShowNativeEditionHint(config)) {
99733
+ log4.info(import_picocolors4.default.bold(NATIVE_EDITION_HINT_TITLE));
99734
+ log4.message(nativeEditionHintLines({ command: import_picocolors4.default.cyan, link: import_picocolors4.default.underline }).join(`
99456
99735
  `));
99457
99736
  }
99458
99737
  const shouldStar = await confirm({
@@ -99493,7 +99772,7 @@ async function runTuiInstaller(args, version) {
99493
99772
 
99494
99773
  // packages/omo-opencode/src/cli/install.ts
99495
99774
  var VERSION = package_default.version;
99496
- async function install3(args) {
99775
+ async function install2(args) {
99497
99776
  return args.tui ? runTuiInstaller(args, VERSION) : runCliInstaller(args, VERSION);
99498
99777
  }
99499
99778
  // packages/omo-opencode/src/cli/cleanup.ts
@@ -100994,7 +101273,8 @@ var HookNameSchema = _enum([
100994
101273
  "webfetch-redirect-guard",
100995
101274
  "fsync-skip-warning",
100996
101275
  "plan-format-validator",
100997
- "legacy-plugin-toast"
101276
+ "legacy-plugin-toast",
101277
+ "native-edition-nudge"
100998
101278
  ]);
100999
101279
  // packages/omo-opencode/src/config/schema/i18n.ts
101000
101280
  init_zod();
@@ -103097,14 +103377,14 @@ var NO_OP_POSTHOG2 = {
103097
103377
  function isFalsy(value) {
103098
103378
  return value === "0" || value === "false" || value === "no";
103099
103379
  }
103100
- function isTruthy(value) {
103380
+ function isTruthy2(value) {
103101
103381
  return value === "1" || value === "true" || value === "yes";
103102
103382
  }
103103
103383
  function shouldDisablePostHog(env, configEnabled) {
103104
103384
  if (configEnabled === false) {
103105
103385
  return true;
103106
103386
  }
103107
- if (isTruthy(env.OMO_DISABLE_POSTHOG?.trim().toLowerCase())) {
103387
+ if (isTruthy2(env.OMO_DISABLE_POSTHOG?.trim().toLowerCase())) {
103108
103388
  return true;
103109
103389
  }
103110
103390
  return isFalsy(env.OMO_SEND_ANONYMOUS_TELEMETRY?.trim().toLowerCase());
@@ -104627,14 +104907,14 @@ var CANONICAL_REPLACEMENT = new Map([
104627
104907
  var MIGRATE_SUFFIX = ", or run: oh-my-openagent config migrate";
104628
104908
  var TUNING_CONTAINERS = new Set(["agents", "categories", "models"]);
104629
104909
  var PASSTHROUGH_CONTAINERS = new Set(["provider_options", "providerOptions"]);
104630
- function isRecord15(value) {
104910
+ function isRecord16(value) {
104631
104911
  return value !== null && typeof value === "object" && !Array.isArray(value);
104632
104912
  }
104633
104913
  function isHarnessBlock(key) {
104634
104914
  return key.startsWith("[") && key.endsWith("]");
104635
104915
  }
104636
104916
  function collectIssues(configPath, value, prefix, fixSuffix) {
104637
- if (!isRecord15(value))
104917
+ if (!isRecord16(value))
104638
104918
  return [];
104639
104919
  const issues = [];
104640
104920
  for (const [key, child] of Object.entries(value)) {
@@ -104650,7 +104930,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
104650
104930
  });
104651
104931
  continue;
104652
104932
  }
104653
- if (!isRecord15(child))
104933
+ if (!isRecord16(child))
104654
104934
  continue;
104655
104935
  if (PASSTHROUGH_CONTAINERS.has(key))
104656
104936
  continue;
@@ -104669,7 +104949,7 @@ function collectIssues(configPath, value, prefix, fixSuffix) {
104669
104949
  return issues;
104670
104950
  }
104671
104951
  function migrateFixSuffix(parsed) {
104672
- if (isRecord15(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
104952
+ if (isRecord16(parsed) && hasMigrationMarker(parsed, REASONING_UNIFICATION_MIGRATION_ID))
104673
104953
  return "";
104674
104954
  return MIGRATE_SUFFIX;
104675
104955
  }
@@ -105907,12 +106187,12 @@ async function auditBundleTargets(pluginRoot) {
105907
106187
  let referencedCount = 0;
105908
106188
  for (const manifestPath of await findManifestPaths(pluginRoot, ".mcp.json")) {
105909
106189
  const manifest = await readJson2(manifestPath);
105910
- if (manifest === null || !isRecord16(manifest["mcpServers"]))
106190
+ if (manifest === null || !isRecord17(manifest["mcpServers"]))
105911
106191
  continue;
105912
106192
  const manifestRoot = dirname33(manifestPath);
105913
106193
  const isRootManifest = resolve24(manifestRoot) === resolve24(pluginRoot);
105914
106194
  for (const server of Object.values(manifest["mcpServers"])) {
105915
- if (!isRecord16(server) || !Array.isArray(server["args"]))
106195
+ if (!isRecord17(server) || !Array.isArray(server["args"]))
105916
106196
  continue;
105917
106197
  for (const arg of server["args"]) {
105918
106198
  if (typeof arg !== "string" || !isPluginRuntimePathArg(arg))
@@ -105998,7 +106278,7 @@ function collectHookCommands(value, commands) {
105998
106278
  collectHookCommands(item, commands);
105999
106279
  return;
106000
106280
  }
106001
- if (!isRecord16(value))
106281
+ if (!isRecord17(value))
106002
106282
  return;
106003
106283
  if (value["type"] === "command") {
106004
106284
  if (typeof value["command"] === "string")
@@ -106053,7 +106333,7 @@ function parseDegradedEntries(value) {
106053
106333
  return [];
106054
106334
  const entries = [];
106055
106335
  for (const item of value) {
106056
- if (!isRecord16(item))
106336
+ if (!isRecord17(item))
106057
106337
  continue;
106058
106338
  if (typeof item["component"] !== "string" || typeof item["reason"] !== "string")
106059
106339
  continue;
@@ -106087,7 +106367,7 @@ function degradedDetailLines(entries) {
106087
106367
  async function readJson2(path) {
106088
106368
  try {
106089
106369
  const parsed = JSON.parse(await readFile29(path, "utf8"));
106090
- return isRecord16(parsed) ? parsed : null;
106370
+ return isRecord17(parsed) ? parsed : null;
106091
106371
  } catch (error) {
106092
106372
  if (error instanceof Error)
106093
106373
  return null;
@@ -106108,7 +106388,7 @@ function normalizeRelative(root, target) {
106108
106388
  function normalizePathSeparators(path) {
106109
106389
  return path.split("\\").join("/");
106110
106390
  }
106111
- function isRecord16(value) {
106391
+ function isRecord17(value) {
106112
106392
  return typeof value === "object" && value !== null && !Array.isArray(value);
106113
106393
  }
106114
106394
 
@@ -108218,8 +108498,8 @@ var program2 = new Command;
108218
108498
  function resolveInstallArgs(options, invocationName = process.env.OMO_INVOCATION_NAME) {
108219
108499
  const defaultPlatform = process.env.OMO_EDITION === "codex" || invocationName === "lazycodex" || invocationName === "lazycodex-ai" ? "codex" : undefined;
108220
108500
  const platform = options.platform ?? defaultPlatform;
108221
- if (platform === "senpi" && !isSenpiPlatformEnabled()) {
108222
- 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.`);
108501
+ if (platform === "native-dev" && !isNativeDevPlatformEnabled()) {
108502
+ 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.`);
108223
108503
  }
108224
108504
  return {
108225
108505
  tui: options.tui !== false,
@@ -108264,7 +108544,7 @@ Model Providers (Priority: Native > Copilot > OpenCode Zen > Z.ai > Kimi > Baili
108264
108544
  `).action(async (options) => {
108265
108545
  const rootOptions = program2.opts();
108266
108546
  const args = resolveInstallArgs({ ...options, platform: options.platform ?? rootOptions.platform });
108267
- const exitCode = await install3(args);
108547
+ const exitCode = await install2(args);
108268
108548
  process.exit(exitCode);
108269
108549
  });
108270
108550
  configureCleanupCommand(program2);