lazycodex-ai 5.1.66 → 5.1.69

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 (62) hide show
  1. package/dist/cli/index.js +220 -161
  2. package/dist/cli/service-auth/account-home.d.ts +47 -0
  3. package/dist/cli/service-auth/account-home.fixture.d.ts +1 -0
  4. package/dist/cli/service-auth/credential-lock.d.ts +2 -0
  5. package/dist/cli/service-auth/index.d.ts +1 -1
  6. package/dist/cli-node/index.js +220 -161
  7. package/package.json +2 -1
  8. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  9. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +6 -2
  10. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  11. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  15. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  19. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  20. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  21. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  22. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  23. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  32. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  33. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  54. package/packages/omo-codex/plugin/package-lock.json +12 -12
  55. package/packages/omo-codex/plugin/package.json +1 -1
  56. package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +11 -7
  57. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/LICENSE +21 -0
  58. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +4 -3
  59. package/packages/omo-codex/scripts/install-dist/install-local.mjs +8 -4
  60. package/packages/shared-skills/skills/browser/ATTRIBUTION.md +11 -7
  61. package/packages/shared-skills/skills/browser/runtime/omowright/LICENSE +21 -0
  62. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +4 -3
package/dist/cli/index.js CHANGED
@@ -2132,7 +2132,7 @@ var package_default;
2132
2132
  var init_package = __esm(() => {
2133
2133
  package_default = {
2134
2134
  name: "oh-my-opencode",
2135
- version: "5.1.66",
2135
+ version: "5.1.69",
2136
2136
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2137
2137
  main: "./dist/index.js",
2138
2138
  types: "dist/index.d.ts",
@@ -2170,6 +2170,7 @@ var init_package = __esm(() => {
2170
2170
  "packages/senpi-desktop-engine",
2171
2171
  "packages/senpi-desktop-prelude",
2172
2172
  "packages/senpi-desktop-service",
2173
+ "packages/senpi-desktop-sdk",
2173
2174
  "packages/senpi-desktop-tool",
2174
2175
  "packages/omo-opencode",
2175
2176
  "packages/omo-native"
@@ -2277,7 +2278,7 @@ var init_package = __esm(() => {
2277
2278
  "check:copy": "bun script/check-copy.ts",
2278
2279
  typecheck: "bun run check:copy && bun check --no-script --all -p tsconfig.json && bun run typecheck:script && bun run typecheck:packages && bun run typecheck:skill-scripts",
2279
2280
  "typecheck:skill-scripts": "bun check --no-script --all -p packages/shared-skills/skills/frontend/scripts/detect/tsconfig.json",
2280
- "typecheck:packages": "bun check --no-script --all -p packages/rules-engine/tsconfig.json && bun check --no-script --all -p packages/delegate-core/tsconfig.json && bun check --no-script --all -p packages/mcp-stdio-core/tsconfig.json && bun check --no-script --all -p packages/mcp-client-core/tsconfig.json && bun check --no-script --all -p packages/git-bash-mcp/tsconfig.json && bun check --no-script --all -p packages/ast-grep-mcp/tsconfig.json && bun check --no-script --all -p packages/lsp-core/tsconfig.json && bun check --no-script --all -p packages/utils/tsconfig.json && bun check --no-script --all -p packages/device-service-core/tsconfig.json && bun check --no-script --all -p packages/model-core/tsconfig.json && bun check --no-script --all -p packages/omo-config-core/tsconfig.json && bun check --no-script --all -p packages/prompts-core/tsconfig.json && bun check --no-script --all -p packages/comment-checker-core/tsconfig.json && bun check --no-script --all -p packages/hashline-core/tsconfig.json && bun check --no-script --all -p packages/tmux-core/tsconfig.json && bun check --no-script --all -p packages/team-core/tsconfig.json && bun check --no-script --all -p packages/openclaw-core/tsconfig.json && bun check --no-script --all -p packages/boulder-state/tsconfig.json && bun check --no-script --all -p packages/isolation-core/tsconfig.json && bun check --no-script --all -p packages/memory-core/tsconfig.json && bun check --no-script --all -p packages/telemetry-core/tsconfig.json && bun check --no-script --all -p packages/claude-code-compat-core/tsconfig.json && bun check --no-script --all -p packages/skills-loader-core/tsconfig.json && bun check --no-script --all -p packages/agents-md-core/tsconfig.json && bun check --no-script --all -p packages/omo-codex/plugin/shared/tsconfig.json && bun check --no-script --all -p packages/omo-codex/tsconfig.json && bun check --no-script --all -p packages/omo-senpi/tsconfig.json && bun check --no-script --all -p packages/senpi-task/tsconfig.json && bun check --no-script --all -p packages/omo-opencode/tsconfig.json && bun check --no-script --all -p packages/omo-native/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-protocol/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-engine/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-prelude/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-service/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-tool/tsconfig.json",
2281
+ "typecheck:packages": "bun check --no-script --all -p packages/rules-engine/tsconfig.json && bun check --no-script --all -p packages/delegate-core/tsconfig.json && bun check --no-script --all -p packages/mcp-stdio-core/tsconfig.json && bun check --no-script --all -p packages/mcp-client-core/tsconfig.json && bun check --no-script --all -p packages/git-bash-mcp/tsconfig.json && bun check --no-script --all -p packages/ast-grep-mcp/tsconfig.json && bun check --no-script --all -p packages/lsp-core/tsconfig.json && bun check --no-script --all -p packages/utils/tsconfig.json && bun check --no-script --all -p packages/device-service-core/tsconfig.json && bun check --no-script --all -p packages/model-core/tsconfig.json && bun check --no-script --all -p packages/omo-config-core/tsconfig.json && bun check --no-script --all -p packages/prompts-core/tsconfig.json && bun check --no-script --all -p packages/comment-checker-core/tsconfig.json && bun check --no-script --all -p packages/hashline-core/tsconfig.json && bun check --no-script --all -p packages/tmux-core/tsconfig.json && bun check --no-script --all -p packages/team-core/tsconfig.json && bun check --no-script --all -p packages/openclaw-core/tsconfig.json && bun check --no-script --all -p packages/boulder-state/tsconfig.json && bun check --no-script --all -p packages/isolation-core/tsconfig.json && bun check --no-script --all -p packages/memory-core/tsconfig.json && bun check --no-script --all -p packages/telemetry-core/tsconfig.json && bun check --no-script --all -p packages/claude-code-compat-core/tsconfig.json && bun check --no-script --all -p packages/skills-loader-core/tsconfig.json && bun check --no-script --all -p packages/agents-md-core/tsconfig.json && bun check --no-script --all -p packages/omo-codex/plugin/shared/tsconfig.json && bun check --no-script --all -p packages/omo-codex/tsconfig.json && bun check --no-script --all -p packages/omo-senpi/tsconfig.json && bun check --no-script --all -p packages/senpi-task/tsconfig.json && bun check --no-script --all -p packages/omo-opencode/tsconfig.json && bun check --no-script --all -p packages/omo-native/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-protocol/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-engine/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-prelude/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-sdk/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-service/tsconfig.json && bun check --no-script --all -p packages/senpi-desktop-tool/tsconfig.json",
2281
2282
  "typecheck:script": "bun check --no-script --all -p script/tsconfig.json",
2282
2283
  test: "bun test --timeout 20000",
2283
2284
  "changelog:section": "bun script/changelog-section.ts",
@@ -2287,7 +2288,7 @@ var init_package = __esm(() => {
2287
2288
  "test:windows-codex": "bun run test:codex",
2288
2289
  "build:git-bash-mcp": "bun run --cwd packages/git-bash-mcp build",
2289
2290
  "build:ast-grep-mcp": "bun run --cwd packages/ast-grep-mcp build",
2290
- "test:desktop": "bun script/check-cargo-pinned-deps.mjs && bun run --cwd packages/senpi-desktop-protocol test && bun run --cwd packages/senpi-desktop-engine test && bun run --cwd packages/senpi-desktop-prelude test && bun run --cwd packages/senpi-desktop-service test && bun run --cwd packages/senpi-desktop-tool test",
2291
+ "test:desktop": "bun script/check-cargo-pinned-deps.mjs && node --test scripts/desktop-package-boundaries.test.mjs && bun run --cwd packages/senpi-desktop-protocol test && bun run --cwd packages/senpi-desktop-engine test && bun run --cwd packages/senpi-desktop-prelude test && bun run --cwd packages/senpi-desktop-sdk test && bun run --cwd packages/senpi-desktop-service test && bun run --cwd packages/senpi-desktop-tool test",
2291
2292
  "lint:ratchet": "bun script/lint-ratchet.ts",
2292
2293
  "knip:check": "knip --no-progress --no-config-hints",
2293
2294
  "lint:ratchet:update": "bun script/lint-ratchet.ts --update",
@@ -2319,7 +2320,7 @@ var init_package = __esm(() => {
2319
2320
  },
2320
2321
  devDependencies: {
2321
2322
  "@clack/prompts": "^1.8.1",
2322
- "@code-yeongyu/senpi": "2026.11.9-2",
2323
+ "@code-yeongyu/senpi": "2026.11.10-2",
2323
2324
  "@modelcontextprotocol/sdk": "^1.30.0",
2324
2325
  "@oh-my-opencode/agents-md-core": "workspace:*",
2325
2326
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -2346,6 +2347,7 @@ var init_package = __esm(() => {
2346
2347
  "@oh-my-opencode/senpi-desktop-engine": "workspace:*",
2347
2348
  "@oh-my-opencode/senpi-desktop-prelude": "workspace:*",
2348
2349
  "@oh-my-opencode/senpi-desktop-protocol": "workspace:*",
2350
+ "@oh-my-opencode/senpi-desktop-sdk": "workspace:*",
2349
2351
  "@oh-my-opencode/senpi-desktop-service": "workspace:*",
2350
2352
  "@oh-my-opencode/senpi-desktop-tool": "workspace:*",
2351
2353
  "@oh-my-opencode/senpi-task": "workspace:*",
@@ -2384,18 +2386,18 @@ var init_package = __esm(() => {
2384
2386
  typescript: "^7.0.2"
2385
2387
  },
2386
2388
  optionalDependencies: {
2387
- "oh-my-opencode-darwin-arm64": "5.1.66",
2388
- "oh-my-opencode-darwin-x64": "5.1.66",
2389
- "oh-my-opencode-darwin-x64-baseline": "5.1.66",
2390
- "oh-my-opencode-linux-arm64": "5.1.66",
2391
- "oh-my-opencode-linux-arm64-musl": "5.1.66",
2392
- "oh-my-opencode-linux-x64": "5.1.66",
2393
- "oh-my-opencode-linux-x64-baseline": "5.1.66",
2394
- "oh-my-opencode-linux-x64-musl": "5.1.66",
2395
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.66",
2396
- "oh-my-opencode-windows-arm64": "5.1.66",
2397
- "oh-my-opencode-windows-x64": "5.1.66",
2398
- "oh-my-opencode-windows-x64-baseline": "5.1.66"
2389
+ "oh-my-opencode-darwin-arm64": "5.1.69",
2390
+ "oh-my-opencode-darwin-x64": "5.1.69",
2391
+ "oh-my-opencode-darwin-x64-baseline": "5.1.69",
2392
+ "oh-my-opencode-linux-arm64": "5.1.69",
2393
+ "oh-my-opencode-linux-arm64-musl": "5.1.69",
2394
+ "oh-my-opencode-linux-x64": "5.1.69",
2395
+ "oh-my-opencode-linux-x64-baseline": "5.1.69",
2396
+ "oh-my-opencode-linux-x64-musl": "5.1.69",
2397
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.69",
2398
+ "oh-my-opencode-windows-arm64": "5.1.69",
2399
+ "oh-my-opencode-windows-x64": "5.1.69",
2400
+ "oh-my-opencode-windows-x64-baseline": "5.1.69"
2399
2401
  },
2400
2402
  overrides: {
2401
2403
  hono: "^4.13.8",
@@ -8080,7 +8082,7 @@ var init_latest_models = __esm(() => {
8080
8082
  claudeOpus: "claude-opus-5-5",
8081
8083
  claudeSonnet: "claude-sonnet-5-5",
8082
8084
  claudeHaiku: "claude-haiku-5-5",
8083
- claudeFable: "claude-fable-5-1",
8085
+ claudeFable: "claude-fable-5-2",
8084
8086
  gptAstra: "gpt-6-astra",
8085
8087
  gptSol: "gpt-6.1-sol",
8086
8088
  gptSolFast: "gpt-6.1-sol-fast",
@@ -9346,61 +9348,9 @@ var init_file_reference_resolver = __esm(() => {
9346
9348
  init_logger2();
9347
9349
  });
9348
9350
 
9349
- // packages/model-core/src/fable-55-launch.ts
9350
- function isFable55Model(model) {
9351
- const modelId = model.split("/").pop() ?? model;
9352
- return modelId.replaceAll(".", "-") === FABLE_55_LAUNCH.id;
9353
- }
9354
- function selectLaunchRungs(rungs, gate, onRejected) {
9355
- return rungs.filter((rung) => {
9356
- if (!isFable55Model(rung.model))
9357
- return true;
9358
- if (!gate.released)
9359
- return false;
9360
- if (rung.variant !== undefined && gate.accepted.includes(rung.variant))
9361
- return true;
9362
- onRejected({ model: rung.model, variant: rung.variant });
9363
- return false;
9364
- });
9365
- }
9366
- function recordLaunchRungRejection(rejection) {
9367
- launchRungRejectionLog.push(rejection);
9368
- console.warn(`[fable-55-launch] dropped a Fable 5.5 rung with effort "${rejection.variant ?? "(none)"}": not in FABLE_55_EFFORTS.accepted`);
9369
- }
9370
- function launchRungs(rungs) {
9371
- return selectLaunchRungs(rungs, { released: FABLE_55_RELEASED, accepted: FABLE_55_EFFORTS.accepted }, recordLaunchRungRejection);
9372
- }
9373
- function launchDefaultModelId() {
9374
- return FABLE_55_RELEASED ? FABLE_55_LAUNCH.id : FABLE_55_PREDECESSOR;
9375
- }
9376
- var FABLE_55_LAUNCH, FABLE_55_RELEASED = false, FABLE_55_EFFORTS, launchRungRejectionLog, FABLE_55_PREDECESSOR;
9377
- var init_fable_55_launch = __esm(() => {
9378
- init_latest_models();
9379
- FABLE_55_LAUNCH = {
9380
- id: "claude-fable-5-5",
9381
- family: "claude-fable",
9382
- reasoning: undefined,
9383
- temperature: undefined,
9384
- toolCall: undefined,
9385
- modalities: undefined,
9386
- limit: {
9387
- context: undefined,
9388
- input: undefined,
9389
- output: undefined
9390
- }
9391
- };
9392
- FABLE_55_EFFORTS = {
9393
- measured: false,
9394
- accepted: ["xhigh", "max"]
9395
- };
9396
- launchRungRejectionLog = [];
9397
- FABLE_55_PREDECESSOR = LATEST_MODEL_BY_FAMILY.claudeFable;
9398
- });
9399
-
9400
9351
  // packages/model-core/src/agent-model-requirements.ts
9401
9352
  var AGENT_MODEL_REQUIREMENTS;
9402
9353
  var init_agent_model_requirements = __esm(() => {
9403
- init_fable_55_launch();
9404
9354
  init_latest_models();
9405
9355
  AGENT_MODEL_REQUIREMENTS = {
9406
9356
  sisyphus: {
@@ -9495,15 +9445,15 @@ var init_agent_model_requirements = __esm(() => {
9495
9445
  ]
9496
9446
  },
9497
9447
  prometheus: {
9498
- fallbackChain: launchRungs([
9448
+ fallbackChain: [
9499
9449
  {
9500
9450
  providers: ["anthropic", "github-copilot", "opencode"],
9501
- model: FABLE_55_LAUNCH.id,
9451
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9502
9452
  variant: "xhigh"
9503
9453
  },
9504
9454
  {
9505
9455
  providers: ["anthropic", "github-copilot", "opencode"],
9506
- model: LATEST_MODEL_BY_FAMILY.claudeFable,
9456
+ model: "claude-fable-5-1",
9507
9457
  variant: "xhigh"
9508
9458
  },
9509
9459
  {
@@ -9517,18 +9467,18 @@ var init_agent_model_requirements = __esm(() => {
9517
9467
  variant: "max"
9518
9468
  },
9519
9469
  { providers: ["opencode"], model: LATEST_MODEL_BY_FAMILY.kimiK3, variant: "max" }
9520
- ])
9470
+ ]
9521
9471
  },
9522
9472
  metis: {
9523
- fallbackChain: launchRungs([
9473
+ fallbackChain: [
9524
9474
  {
9525
9475
  providers: ["anthropic", "github-copilot", "opencode"],
9526
- model: FABLE_55_LAUNCH.id,
9476
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9527
9477
  variant: "max"
9528
9478
  },
9529
9479
  {
9530
9480
  providers: ["anthropic", "github-copilot", "opencode"],
9531
- model: LATEST_MODEL_BY_FAMILY.claudeFable,
9481
+ model: "claude-fable-5-1",
9532
9482
  variant: "max"
9533
9483
  },
9534
9484
  {
@@ -9542,7 +9492,7 @@ var init_agent_model_requirements = __esm(() => {
9542
9492
  variant: "max"
9543
9493
  },
9544
9494
  { providers: ["opencode"], model: LATEST_MODEL_BY_FAMILY.kimiK3, variant: "max" }
9545
- ])
9495
+ ]
9546
9496
  },
9547
9497
  momus: {
9548
9498
  fallbackChain: [
@@ -9602,20 +9552,19 @@ var init_agent_model_requirements = __esm(() => {
9602
9552
  // packages/model-core/src/category-model-requirements.ts
9603
9553
  var CATEGORY_MODEL_REQUIREMENTS;
9604
9554
  var init_category_model_requirements = __esm(() => {
9605
- init_fable_55_launch();
9606
9555
  init_latest_models();
9607
9556
  CATEGORY_MODEL_REQUIREMENTS = {
9608
9557
  "visual-engineering": {
9609
- fallbackChain: launchRungs([
9558
+ fallbackChain: [
9610
9559
  { providers: ["google", "google-vertex", "opencode"], model: LATEST_MODEL_BY_FAMILY.geminiPro, variant: "low" },
9611
9560
  {
9612
9561
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9613
- model: FABLE_55_LAUNCH.id,
9562
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9614
9563
  variant: "max"
9615
9564
  },
9616
9565
  {
9617
9566
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9618
- model: LATEST_MODEL_BY_FAMILY.claudeFable,
9567
+ model: "claude-fable-5-1",
9619
9568
  variant: "max"
9620
9569
  },
9621
9570
  {
@@ -9629,7 +9578,7 @@ var init_category_model_requirements = __esm(() => {
9629
9578
  variant: "max"
9630
9579
  },
9631
9580
  { providers: ["opencode"], model: LATEST_MODEL_BY_FAMILY.kimiK3, variant: "max" }
9632
- ])
9581
+ ]
9633
9582
  },
9634
9583
  ultrabrain: {
9635
9584
  fallbackChain: [
@@ -9663,15 +9612,15 @@ var init_category_model_requirements = __esm(() => {
9663
9612
  ]
9664
9613
  },
9665
9614
  artistry: {
9666
- fallbackChain: launchRungs([
9615
+ fallbackChain: [
9667
9616
  {
9668
9617
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9669
- model: FABLE_55_LAUNCH.id,
9618
+ model: LATEST_MODEL_BY_FAMILY.claudeFable,
9670
9619
  variant: "max"
9671
9620
  },
9672
9621
  {
9673
9622
  providers: ["anthropic", "anthropic-api", "github-copilot", "opencode"],
9674
- model: LATEST_MODEL_BY_FAMILY.claudeFable,
9623
+ model: "claude-fable-5-1",
9675
9624
  variant: "max"
9676
9625
  },
9677
9626
  {
@@ -9685,7 +9634,7 @@ var init_category_model_requirements = __esm(() => {
9685
9634
  variant: "max"
9686
9635
  },
9687
9636
  { providers: ["opencode"], model: LATEST_MODEL_BY_FAMILY.kimiK3, variant: "max" }
9688
- ])
9637
+ ]
9689
9638
  },
9690
9639
  quick: {
9691
9640
  fallbackChain: [
@@ -10371,9 +10320,7 @@ var init_runtime_fallback_model = () => {};
10371
10320
  // packages/model-core/src/model-capabilities/supplemental-entries.ts
10372
10321
  var SUPPLEMENTAL_MODEL_CAPABILITIES;
10373
10322
  var init_supplemental_entries = __esm(() => {
10374
- init_fable_55_launch();
10375
10323
  SUPPLEMENTAL_MODEL_CAPABILITIES = {
10376
- [FABLE_55_LAUNCH.id]: FABLE_55_LAUNCH,
10377
10324
  "kimi-k3": {
10378
10325
  id: "kimi-k3",
10379
10326
  family: "kimi",
@@ -10449,6 +10396,21 @@ var init_supplemental_entries = __esm(() => {
10449
10396
  output: 128000
10450
10397
  }
10451
10398
  },
10399
+ "claude-fable-5-2": {
10400
+ id: "claude-fable-5-2",
10401
+ family: "claude-fable",
10402
+ reasoning: true,
10403
+ temperature: false,
10404
+ toolCall: true,
10405
+ modalities: {
10406
+ input: ["text", "image", "pdf"],
10407
+ output: ["text"]
10408
+ },
10409
+ limit: {
10410
+ context: 1e6,
10411
+ output: 128000
10412
+ }
10413
+ },
10452
10414
  "gpt-6-astra": {
10453
10415
  id: "gpt-6-astra",
10454
10416
  family: "gpt",
@@ -10853,25 +10815,16 @@ var init_supplemental_entries = __esm(() => {
10853
10815
  });
10854
10816
 
10855
10817
  // packages/model-core/src/model-capabilities/bundled-snapshot.ts
10856
- function fillGaps(generated, placeholder) {
10857
- const merged = { ...placeholder };
10858
- for (const [key, value] of Object.entries(generated)) {
10859
- if (value === undefined)
10860
- continue;
10861
- const base = merged[key];
10862
- merged[key] = value !== null && typeof value === "object" && !Array.isArray(value) && base !== null && typeof base === "object" ? { ...base, ...Object.fromEntries(Object.entries(value).filter(([, v]) => v !== undefined)) } : value;
10863
- }
10864
- return merged;
10865
- }
10866
10818
  function getBundledModelCapabilitiesSnapshot(snapshotJson) {
10867
- const models = { ...snapshotJson.models, ...SUPPLEMENTAL_MODEL_CAPABILITIES };
10868
- const generatedLaunchRow = snapshotJson.models[FABLE_55_LAUNCH.id];
10869
- if (generatedLaunchRow)
10870
- models[FABLE_55_LAUNCH.id] = fillGaps(generatedLaunchRow, FABLE_55_LAUNCH);
10871
- return { ...snapshotJson, models };
10819
+ return {
10820
+ ...snapshotJson,
10821
+ models: {
10822
+ ...snapshotJson.models,
10823
+ ...SUPPLEMENTAL_MODEL_CAPABILITIES
10824
+ }
10825
+ };
10872
10826
  }
10873
10827
  var init_bundled_snapshot = __esm(() => {
10874
- init_fable_55_launch();
10875
10828
  init_supplemental_entries();
10876
10829
  });
10877
10830
 
@@ -11299,7 +11252,6 @@ var init_src2 = __esm(() => {
11299
11252
  init_model_requirements();
11300
11253
  init_latest_models();
11301
11254
  init_model_family_detectors();
11302
- init_fable_55_launch();
11303
11255
  init_model_capability_aliases();
11304
11256
  init_model_capability_heuristics();
11305
11257
  init_model_capability_guardrails();
@@ -11621,7 +11573,6 @@ Approach:
11621
11573
  </Category_Context>`, GOOGLE_CATEGORIES;
11622
11574
  var init_google_categories = __esm(() => {
11623
11575
  init_latest_models();
11624
- init_src2();
11625
11576
  GOOGLE_CATEGORIES = [
11626
11577
  {
11627
11578
  name: "visual-engineering",
@@ -11631,7 +11582,7 @@ var init_google_categories = __esm(() => {
11631
11582
  },
11632
11583
  {
11633
11584
  name: "artistry",
11634
- config: { model: `anthropic/${launchDefaultModelId()}`, variant: "max" },
11585
+ config: { model: `anthropic/${LATEST_MODEL_BY_FAMILY.claudeFable}`, variant: "max" },
11635
11586
  description: "Complex problem-solving with unconventional, creative approaches - beyond standard patterns",
11636
11587
  promptAppend: ARTISTRY_CATEGORY_PROMPT_APPEND
11637
11588
  }
@@ -77065,7 +77016,11 @@ var init_computer = __esm(() => {
77065
77016
  audit_log: object({ enabled: boolean2() }).partial().strict(),
77066
77017
  screenshot_gc: object({ enabled: boolean2(), stale_ms: nonNegativeInteger, scan_interval_ms: nonNegativeInteger }).partial().strict(),
77067
77018
  engine_path: string2().min(1),
77068
- cua_adapter: boolean2()
77019
+ cua_adapter: boolean2(),
77020
+ run_sandbox: _enum(["vm", "quickjs"]).describe("Where `run` code executes (default: vm; reserved: every run uses vm until the QuickJS cell lands)"),
77021
+ intervention: _enum(["continue", "pause"]).describe("What a background action does while the user uses the target app (default: continue)"),
77022
+ macos_key_priming: _enum(["on", "off"]).describe("macOS background keys first make the target window key (default: off)"),
77023
+ trace: boolean2().describe("Per-request timing traces (default: false)")
77069
77024
  }).partial().strict().describe("Experimental computer use in OmO Native: screenshots, windows, accessibility trees and native mouse and keyboard input. Every key is optional; defaults depend on the host.");
77070
77025
  OmoComputerSettingsSchema = OmoComputerSettingsLayerSchema;
77071
77026
  });
@@ -92758,7 +92713,7 @@ var package_default2;
92758
92713
  var init_package2 = __esm(() => {
92759
92714
  package_default2 = {
92760
92715
  name: "@oh-my-opencode/omo-codex",
92761
- version: "5.1.66",
92716
+ version: "5.1.69",
92762
92717
  type: "module",
92763
92718
  private: true,
92764
92719
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -100149,6 +100104,8 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
100149
100104
  join66("extensions", "omo-member.js"),
100150
100105
  join66("extensions", "memory-run-supervisor.mjs"),
100151
100106
  join66("extensions", "gateway-store-worker.mjs"),
100107
+ join66("extensions", "omo-computer-run-worker.mjs"),
100108
+ join66("extensions", "quickjs.wasm"),
100152
100109
  ...PERSONA_ASSET_FILES.map((filename) => join66("extensions", filename)),
100153
100110
  join66("skills", "ast-grep", "SKILL.md"),
100154
100111
  join66("skills", "browser", "SKILL.md"),
@@ -109522,8 +109479,8 @@ var package_default3 = {
109522
109479
  },
109523
109480
  dependencies: {
109524
109481
  "@clack/prompts": "^1.8.1",
109525
- "@code-yeongyu/senpi": "2026.11.9-2",
109526
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.11.9-2",
109482
+ "@code-yeongyu/senpi": "2026.11.10-2",
109483
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.11.10-2",
109527
109484
  "@modelcontextprotocol/sdk": "^1.30.0",
109528
109485
  "@oh-my-opencode/agents-md-core": "workspace:*",
109529
109486
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -112783,8 +112740,110 @@ import { createHash as createHash12, randomUUID as randomUUID8 } from "crypto";
112783
112740
  import { basename as basename17 } from "path";
112784
112741
 
112785
112742
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/darwin-backend.ts
112743
+ import { homedir as homedir32 } from "os";
112744
+ import { join as join110 } from "path";
112745
+
112746
+ // packages/omo-opencode/src/cli/service-auth/account-home.ts
112747
+ import { execFileSync as execFileSync4 } from "child_process";
112748
+ import { accessSync as accessSync5, constants as constants13, mkdirSync as mkdirSync19, readFileSync as readFileSync44, statSync as statSync7 } from "fs";
112786
112749
  import { homedir as homedir31 } from "os";
112787
- import { join as join109 } from "path";
112750
+ import { join as join106, posix as posix13, win32 as win3210 } from "path";
112751
+ var lockDirectoryIn = (home) => join106(home, ".omo", "session-locks");
112752
+ function userRecordHome(facts) {
112753
+ try {
112754
+ if (facts.platform === "linux")
112755
+ return passwdHome(facts);
112756
+ if (facts.platform === "darwin")
112757
+ return darwinHome(facts);
112758
+ if (facts.platform === "win32")
112759
+ return windowsProfile(facts);
112760
+ return;
112761
+ } catch {
112762
+ return;
112763
+ }
112764
+ }
112765
+ function passwdHome(facts) {
112766
+ if (facts.uid === undefined)
112767
+ return;
112768
+ const uid = String(facts.uid);
112769
+ const home = facts.readFile("/etc/passwd").split(`
112770
+ `).map((line) => line.split(":")).find((fields) => fields[2] === uid)?.[5];
112771
+ return home !== undefined && posix13.isAbsolute(home) ? home : undefined;
112772
+ }
112773
+ function darwinHome(facts) {
112774
+ const fields = facts.run("/usr/bin/id", ["-P"]).trim().split(":");
112775
+ const home = fields[8];
112776
+ if (facts.uid !== undefined && fields[2] !== String(facts.uid))
112777
+ return;
112778
+ return home !== undefined && posix13.isAbsolute(home) ? home : undefined;
112779
+ }
112780
+ function windowsProfile(facts) {
112781
+ const whoami = system32Tool(facts, "whoami.exe");
112782
+ const reg = system32Tool(facts, "reg.exe");
112783
+ if (whoami === undefined || reg === undefined)
112784
+ return;
112785
+ const sid = /S-1-[0-9-]+/.exec(facts.run(whoami, ["/user", "/fo", "csv", "/nh"]))?.[0];
112786
+ if (sid === undefined)
112787
+ return;
112788
+ const key = `HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList\\${sid}`;
112789
+ const value = /ProfileImagePath\s+REG_(?:EXPAND_)?SZ\s+(.+)/.exec(facts.run(reg, ["query", key, "/v", "ProfileImagePath"]))?.[1]?.trim();
112790
+ const home = value?.replace(/%([^%]+)%/g, (whole, name) => facts.env[name] ?? whole);
112791
+ return home !== undefined && !home.includes("%") && win3210.isAbsolute(home) ? home : undefined;
112792
+ }
112793
+ function system32Tool(facts, name) {
112794
+ const root = facts.env.SystemRoot;
112795
+ if (root === undefined || !/^[A-Za-z]:[\\/]/.test(root) || root.split(/[\\/]/).includes(".."))
112796
+ return;
112797
+ const tool = win3210.join(root, "System32", name);
112798
+ return facts.isFile(tool) ? tool : undefined;
112799
+ }
112800
+ function chooseLockHome(facts) {
112801
+ const home = facts.homedir();
112802
+ const record = facts.recordHome();
112803
+ if (record === undefined || record === home)
112804
+ return home;
112805
+ try {
112806
+ facts.prepareLockDirectory(lockDirectoryIn(record));
112807
+ return record;
112808
+ } catch (error) {
112809
+ const reason = error instanceof Error && "code" in error ? String(error.code) : String(error);
112810
+ facts.warn(`omo: the account home ${record} cannot hold the credential lock (${reason}); using ${home}. A process started with another HOME may refresh the same sign-in at the same time (#12978).`);
112811
+ return home;
112812
+ }
112813
+ }
112814
+ var systemPlatformFacts = {
112815
+ platform: process.platform,
112816
+ uid: process.getuid?.(),
112817
+ env: process.env,
112818
+ readFile: (path) => readFileSync44(path, "utf8"),
112819
+ isFile: (path) => statSync7(path, { throwIfNoEntry: false })?.isFile() ?? false,
112820
+ run: (command, args) => execFileSync4(command, args, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], timeout: 5000, windowsHide: true })
112821
+ };
112822
+ var systemAccountFacts = {
112823
+ recordHome: () => userRecordHome(systemPlatformFacts),
112824
+ homedir: homedir31,
112825
+ prepareLockDirectory: (directory) => {
112826
+ mkdirSync19(directory, { recursive: true, mode: 448 });
112827
+ accessSync5(directory, constants13.W_OK);
112828
+ },
112829
+ warn: (message) => process.stderr.write(`${message}
112830
+ `)
112831
+ };
112832
+ var TEST_LOCK_HOME_ENV = "OMO_TEST_CREDENTIAL_LOCK_HOME";
112833
+ var INJECTED_SECRETS = Symbol.for("omo.test.injectedSecrets");
112834
+ function testLockHome(env, secrets) {
112835
+ const home = env[TEST_LOCK_HOME_ENV];
112836
+ if (home === undefined || !(posix13.isAbsolute(home) || win3210.isAbsolute(home)))
112837
+ return;
112838
+ const marked = typeof secrets === "object" && secrets !== null && secrets[INJECTED_SECRETS] === true;
112839
+ return marked ? home : undefined;
112840
+ }
112841
+ var facts = systemAccountFacts;
112842
+ var chosen;
112843
+ function accountHome() {
112844
+ chosen ??= testLockHome(process.env, typeof Bun === "undefined" ? undefined : Bun.secrets) ?? chooseLockHome(facts);
112845
+ return chosen;
112846
+ }
112788
112847
 
112789
112848
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/client.ts
112790
112849
  init_zod();
@@ -112899,18 +112958,18 @@ async function callHelper(path, call, options = {}) {
112899
112958
  }
112900
112959
 
112901
112960
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/location.ts
112902
- import { dirname as dirname42, join as join106, posix as posix13 } from "path";
112961
+ import { dirname as dirname42, join as join107, posix as posix14 } from "path";
112903
112962
  import { fileURLToPath as fileURLToPath8 } from "url";
112904
112963
  function bundleCandidates(moduleUrl) {
112905
112964
  const root = dirname42(dirname42(dirname42(fileURLToPath8(moduleUrl))));
112906
- return [join106(root, "bin", "darwin", "omo-keychain"), join106(root, "omo-keychain")];
112965
+ return [join107(root, "bin", "darwin", "omo-keychain"), join107(root, "omo-keychain")];
112907
112966
  }
112908
112967
  function machineCandidates(home, arch = process.arch) {
112909
112968
  const runtimeArch = arch === "arm64" ? "arm64" : "x64";
112910
112969
  return [
112911
112970
  `/Applications/OmO.app/Contents/Resources/omo-runtime/darwin-${runtimeArch}/omo-keychain`,
112912
- posix13.join(home, "Applications", "OmO.app", "Contents", "Resources", "omo-runtime", `darwin-${runtimeArch}`, "omo-keychain"),
112913
- posix13.join(home, ".bun", "install", "global", "node_modules", "omo-ai", "bin", "darwin", "omo-keychain")
112971
+ posix14.join(home, "Applications", "OmO.app", "Contents", "Resources", "omo-runtime", `darwin-${runtimeArch}`, "omo-keychain"),
112972
+ posix14.join(home, ".bun", "install", "global", "node_modules", "omo-ai", "bin", "darwin", "omo-keychain")
112914
112973
  ];
112915
112974
  }
112916
112975
  async function locateHelper(candidates, verify) {
@@ -112927,9 +112986,9 @@ async function locateHelper(candidates, verify) {
112927
112986
 
112928
112987
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/pin.ts
112929
112988
  import { readdirSync as readdirSync14, rmSync as rmSync9 } from "fs";
112930
- import { chmod as chmod2, copyFile as copyFile4, constants as constants13, mkdtemp as mkdtemp2, rm as rm16, stat as stat8 } from "fs/promises";
112989
+ import { chmod as chmod2, copyFile as copyFile4, constants as constants14, mkdtemp as mkdtemp2, rm as rm16, stat as stat8 } from "fs/promises";
112931
112990
  import { tmpdir as tmpdir6 } from "os";
112932
- import { basename as basename15, join as join107 } from "path";
112991
+ import { basename as basename15, join as join108 } from "path";
112933
112992
  var DIR_PREFIX = "omo-keychain-";
112934
112993
  var OWNED_DIR = new RegExp(`^${DIR_PREFIX}(\\d+)-`);
112935
112994
  var isAlive = (pid) => {
@@ -112953,7 +113012,7 @@ function sweepDeadPinDirs(root = tmpdir6()) {
112953
113012
  if (owner === undefined || Number(owner) === process.pid || isAlive(Number(owner)))
112954
113013
  continue;
112955
113014
  try {
112956
- rmSync9(join107(root, entry), { recursive: true, force: true });
113015
+ rmSync9(join108(root, entry), { recursive: true, force: true });
112957
113016
  } catch {
112958
113017
  continue;
112959
113018
  }
@@ -112966,7 +113025,7 @@ async function processPinDir() {
112966
113025
  if (processDir !== undefined)
112967
113026
  return processDir;
112968
113027
  sweepDeadPinDirs();
112969
- const dir = await mkdtemp2(join107(tmpdir6(), `${DIR_PREFIX}${process.pid}-`));
113028
+ const dir = await mkdtemp2(join108(tmpdir6(), `${DIR_PREFIX}${process.pid}-`));
112970
113029
  process.once("exit", () => rmSync9(dir, { recursive: true, force: true }));
112971
113030
  processDir = dir;
112972
113031
  return dir;
@@ -112977,9 +113036,9 @@ async function sourceIdentity(source) {
112977
113036
  return `${source}\x00${info.dev}\x00${info.ino}\x00${info.size}\x00${info.mtimeMs}\x00${info.ctimeMs}`;
112978
113037
  }
112979
113038
  async function copyAndVerify(source, verify, dir) {
112980
- const target = join107(dir, `${crypto.randomUUID()}-${basename15(source)}`);
113039
+ const target = join108(dir, `${crypto.randomUUID()}-${basename15(source)}`);
112981
113040
  try {
112982
- await copyFile4(source, target, constants13.COPYFILE_EXCL);
113041
+ await copyFile4(source, target, constants14.COPYFILE_EXCL);
112983
113042
  await chmod2(target, 320);
112984
113043
  } catch (error) {
112985
113044
  await rm16(target, { force: true });
@@ -113594,16 +113653,16 @@ var {
113594
113653
  unlink: unlink3
113595
113654
  } = promises;
113596
113655
  var {
113597
- accessSync: accessSync5,
113656
+ accessSync: accessSync6,
113598
113657
  chmodSync: chmodSync7,
113599
113658
  fsyncSync: fsyncSync3,
113600
113659
  linkSync,
113601
113660
  lstatSync: lstatSync5,
113602
- mkdirSync: mkdirSync19,
113603
- readFileSync: readFileSync44,
113661
+ mkdirSync: mkdirSync20,
113662
+ readFileSync: readFileSync45,
113604
113663
  readdirSync: readdirSync15,
113605
113664
  realpathSync: realpathSync13,
113606
- statSync: statSync8,
113665
+ statSync: statSync9,
113607
113666
  unlinkSync: unlinkSync10,
113608
113667
  writeFileSync: writeFileSync17,
113609
113668
  writeSync
@@ -114073,7 +114132,7 @@ async function publishLockRecord(lockPath, record) {
114073
114132
  // packages/team-core/src/team-state-store/lock-lease.ts
114074
114133
  import { randomUUID as randomUUID7 } from "crypto";
114075
114134
  import { open as open4, readdir as readdir18, readFile as readFile36, rename as rename9, rm as rm18 } from "fs/promises";
114076
- import { basename as basename16, dirname as dirname44, join as join108 } from "path";
114135
+ import { basename as basename16, dirname as dirname44, join as join109 } from "path";
114077
114136
 
114078
114137
  // packages/team-core/src/team-state-store/lock-reclaim.ts
114079
114138
  import { createHash as createHash10 } from "crypto";
@@ -114152,7 +114211,7 @@ var UUID2 = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
114152
114211
  var escapeRegExp2 = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
114153
114212
  var leaseTempPattern = (lockPath) => new RegExp(`^\\.${escapeRegExp2(basename16(lockPath))}\\.${UUID2}\\.lease$`);
114154
114213
  async function replaceRecord(lockPath, content) {
114155
- const temporary = join108(dirname44(lockPath), `${leaseTempPrefix(lockPath)}${randomUUID7()}${LEASE_TEMP_SUFFIX}`);
114214
+ const temporary = join109(dirname44(lockPath), `${leaseTempPrefix(lockPath)}${randomUUID7()}${LEASE_TEMP_SUFFIX}`);
114156
114215
  try {
114157
114216
  const handle = await open4(temporary, "wx", 384);
114158
114217
  try {
@@ -114178,7 +114237,7 @@ async function removeLeftoverTemps(lockPath) {
114178
114237
  }
114179
114238
  for (const entry of entries) {
114180
114239
  if (pattern.test(entry))
114181
- await rm18(join108(dirname44(lockPath), entry), { force: true });
114240
+ await rm18(join109(dirname44(lockPath), entry), { force: true });
114182
114241
  }
114183
114242
  }
114184
114243
  async function currentRecord(lockPath) {
@@ -114315,7 +114374,7 @@ function promptLockAt(path, hooks = {}) {
114315
114374
  var ROW_9B_DEFAULT = "reinstall-notice";
114316
114375
  var helperAccess = () => sharedHelperAccess(() => {
114317
114376
  const { entryCandidates } = keychainProcessState();
114318
- return resolveHelperAccess([...entryCandidates, ...bundleCandidates(import.meta.url), ...machineCandidates(homedir31())]);
114377
+ return resolveHelperAccess([...entryCandidates, ...bundleCandidates(import.meta.url), ...machineCandidates(homedir32())]);
114319
114378
  });
114320
114379
  function sharedHelperAccess(resolve) {
114321
114380
  const state = keychainProcessState();
@@ -114352,7 +114411,7 @@ function createDarwinBackend(options) {
114352
114411
  access: options.access,
114353
114412
  cache: options.cache ?? processApprovalCache(),
114354
114413
  background: options.background,
114355
- takePromptLock: promptLockAt(join109(options.home ?? homedir31(), ".omo", "session-locks", `${options.account}.keychain-prompt`)),
114414
+ takePromptLock: promptLockAt(join110(lockDirectoryIn(options.home ?? accountHome()), `${options.account}.keychain-prompt`)),
114356
114415
  ownSilentGet: () => silently(() => options.secrets.get(key)),
114357
114416
  ownOverwrite: (value) => silently(() => options.secrets.set({ ...key, value })),
114358
114417
  ownDelete: (name) => name === options.account ? gatedSecrets(() => options.secrets.delete({ ...key, name })) : silently(() => options.secrets.delete({ ...key, name })),
@@ -114380,22 +114439,22 @@ async function guardHelperlessRead(service, account, choice = ROW_9B_DEFAULT, pr
114380
114439
  }
114381
114440
 
114382
114441
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/store-binding.ts
114383
- import { homedir as homedir32 } from "os";
114442
+ import { homedir as homedir33 } from "os";
114384
114443
 
114385
114444
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/creator-handoff.ts
114386
114445
  init_bun_file_shim();
114387
114446
  init_bun_spawn_shim();
114388
- import { dirname as dirname47, posix as posix14 } from "path";
114447
+ import { dirname as dirname47, posix as posix15 } from "path";
114389
114448
 
114390
114449
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/runtime-capabilities.ts
114391
114450
  init_zod();
114392
114451
  import { readFile as readFile37 } from "fs/promises";
114393
- import { dirname as dirname46, join as join110 } from "path";
114452
+ import { dirname as dirname46, join as join111 } from "path";
114394
114453
  var RUNTIME_CAPABILITIES_FILE = "omo-runtime-capabilities.json";
114395
114454
  var RUNTIME_CAPABILITIES = { keychainHandoff: 1 };
114396
114455
  var capabilitiesSchema = object({ keychainHandoff: number2().int() }).passthrough();
114397
114456
  async function runtimeDeclaresKeychainHandoff(runtime) {
114398
- const text = await readFile37(join110(dirname46(runtime), RUNTIME_CAPABILITIES_FILE), "utf8").catch(() => null);
114457
+ const text = await readFile37(join111(dirname46(runtime), RUNTIME_CAPABILITIES_FILE), "utf8").catch(() => null);
114399
114458
  if (text === null)
114400
114459
  return false;
114401
114460
  try {
@@ -114414,9 +114473,9 @@ var HANDOFF_ENV = "OMO_KEYCHAIN_HANDOFF";
114414
114473
  var HANDOFF_DEADLINE_MS = 45000;
114415
114474
  function desktopRuntimeCandidates(home, arch = process.arch) {
114416
114475
  const runtimeArch = arch === "arm64" ? "arm64" : "x64";
114417
- return ["/Applications/OmO.app", posix14.join(home, "Applications", "OmO.app")].map((app) => ({
114476
+ return ["/Applications/OmO.app", posix15.join(home, "Applications", "OmO.app")].map((app) => ({
114418
114477
  app,
114419
- runtime: posix14.join(app, "Contents", "Resources", "omo-runtime", `darwin-${runtimeArch}`, "omo")
114478
+ runtime: posix15.join(app, "Contents", "Resources", "omo-runtime", `darwin-${runtimeArch}`, "omo")
114420
114479
  }));
114421
114480
  }
114422
114481
  var verifyBundle = async (app, requirement) => {
@@ -114474,13 +114533,13 @@ function createCreatorHandOff(options) {
114474
114533
 
114475
114534
  // packages/omo-opencode/src/cli/service-auth/keychain-helper/store-binding.ts
114476
114535
  var readers = new Map;
114477
- var INJECTED_SECRETS = Symbol.for("omo.test.injectedSecrets");
114478
- var isInjectedSecrets = (api) => api[INJECTED_SECRETS] === true;
114536
+ var INJECTED_SECRETS2 = Symbol.for("omo.test.injectedSecrets");
114537
+ var isInjectedSecrets = (api) => api[INJECTED_SECRETS2] === true;
114479
114538
  var backends = new Map;
114480
114539
  function processHandOff(origin) {
114481
114540
  return () => {
114482
114541
  const state = keychainProcessState();
114483
- state.handOff ??= createCreatorHandOff({ candidates: desktopRuntimeCandidates(homedir32()), origin })();
114542
+ state.handOff ??= createCreatorHandOff({ candidates: desktopRuntimeCandidates(homedir33()), origin })();
114484
114543
  return state.handOff;
114485
114544
  };
114486
114545
  }
@@ -114633,18 +114692,18 @@ var probeSecretServiceLock = () => new Promise((resolve) => {
114633
114692
  import { AsyncLocalStorage as AsyncLocalStorage3 } from "async_hooks";
114634
114693
  import { createHash as createHash11 } from "crypto";
114635
114694
  import { mkdir as mkdir12 } from "fs/promises";
114636
- import { homedir as homedir33 } from "os";
114637
- import { join as join112 } from "path";
114695
+ import { join as join113 } from "path";
114638
114696
  var held = new AsyncLocalStorage3;
114639
- function credentialLockPaths(api, home = homedir33()) {
114697
+ var CREDENTIAL_LOCK_STALE_AFTER_MS = 60000;
114698
+ function credentialLockPaths(api, home = accountHome()) {
114640
114699
  const id = createHash11("sha256").update(serviceOrigin(api)).digest("hex");
114641
- const directory = join112(home, ".omo", "session-locks");
114642
- return { directory, lock: join112(directory, `${id}.lock`), desktopRecord: join112(directory, `${id}.desktop-generation.json`) };
114700
+ const directory = lockDirectoryIn(home);
114701
+ return { directory, lock: join113(directory, `${id}.lock`), desktopRecord: join113(directory, `${id}.desktop-generation.json`) };
114643
114702
  }
114644
- function heldCredentialLease(api, home = homedir33()) {
114703
+ function heldCredentialLease(api, home = accountHome()) {
114645
114704
  return held.getStore()?.get(credentialLockPaths(api, home).lock);
114646
114705
  }
114647
- async function withCredentialLock(api, action, home = homedir33(), ownerTag = "cli-session") {
114706
+ async function withCredentialLock(api, action, home = accountHome(), ownerTag = "cli-session") {
114648
114707
  const { directory, lock } = credentialLockPaths(api, home);
114649
114708
  const owned = held.getStore();
114650
114709
  const outer = owned?.get(lock);
@@ -114653,7 +114712,7 @@ async function withCredentialLock(api, action, home = homedir33(), ownerTag = "c
114653
114712
  await mkdir12(directory, { recursive: true, mode: 448 });
114654
114713
  return withLock(lock, (lease) => held.run(new Map([...owned ?? [], [lock, lease]]), () => action(lease)), {
114655
114714
  ownerTag,
114656
- staleAfterMs: Number.POSITIVE_INFINITY
114715
+ staleAfterMs: CREDENTIAL_LOCK_STALE_AFTER_MS
114657
114716
  });
114658
114717
  }
114659
114718
 
@@ -115021,14 +115080,14 @@ async function loginLoopback(session, options) {
115021
115080
 
115022
115081
  // packages/memory-core/src/sync/device-retire.ts
115023
115082
  import { createHash as createHash14, randomBytes as randomBytes6 } from "crypto";
115024
- import { join as join115 } from "path";
115083
+ import { join as join116 } from "path";
115025
115084
 
115026
115085
  // packages/memory-core/src/identity/layout.ts
115027
115086
  import { homedir as homedir34 } from "os";
115028
- import { join as join113, resolve as resolve31 } from "path";
115087
+ import { join as join114, resolve as resolve31 } from "path";
115029
115088
  var MEMORY_ROOT_ENV_VAR = "OMO_MEMORY_HOME";
115030
115089
  function defaultMemoryRoot() {
115031
- return join113(homedir34(), ".omo", "memory");
115090
+ return join114(homedir34(), ".omo", "memory");
115032
115091
  }
115033
115092
  function resolveMemoryRoot(env, cwd) {
115034
115093
  const override = env[MEMORY_ROOT_ENV_VAR];
@@ -115038,13 +115097,13 @@ function resolveMemoryRoot(env, cwd) {
115038
115097
  return resolve31(cwd, override);
115039
115098
  }
115040
115099
  // packages/memory-core/src/sync/pin-dir.ts
115041
- import { join as join114 } from "path";
115042
- var syncPinDir = (memoryRoot) => join114(memoryRoot, "sync-device");
115100
+ import { join as join115 } from "path";
115101
+ var syncPinDir = (memoryRoot) => join115(memoryRoot, "sync-device");
115043
115102
 
115044
115103
  // packages/memory-core/src/sync/device-retire.ts
115045
- var trustAnchorRoot = (pinDir) => join115(pinDir, "trust-anchor");
115104
+ var trustAnchorRoot = (pinDir) => join116(pinDir, "trust-anchor");
115046
115105
  var trustAnchorKey = (account) => createHash14("sha256").update(account, "utf8").digest("base64url");
115047
- var trustAnchorDir = (pinDir, account) => join115(trustAnchorRoot(pinDir), trustAnchorKey(account));
115106
+ var trustAnchorDir = (pinDir, account) => join116(trustAnchorRoot(pinDir), trustAnchorKey(account));
115048
115107
  var hasLiveTrustAnchor = async (pinDir) => {
115049
115108
  try {
115050
115109
  return (await readdir17(trustAnchorRoot(pinDir))).some((name) => !name.includes(".retired-"));
@@ -115070,9 +115129,9 @@ import { homedir as homedir35 } from "os";
115070
115129
  // packages/omo-opencode/src/cli/service-auth/signed-out-marker.ts
115071
115130
  init_zod();
115072
115131
  import { mkdir as mkdir13, readFile as readFile38, rename as rename10, rm as rm19, writeFile as writeFile18 } from "fs/promises";
115073
- import { dirname as dirname48, join as join116 } from "path";
115132
+ import { dirname as dirname48, join as join117 } from "path";
115074
115133
  var markerSchema = object({ device: string2().nullable(), at: string2() });
115075
- var signedOutMarkerPath = (home, credential) => join116(home, ".omo", "account-state", `${credential}.signed-out.json`);
115134
+ var signedOutMarkerPath = (home, credential) => join117(home, ".omo", "account-state", `${credential}.signed-out.json`);
115076
115135
  async function readSignedOutMarker(path) {
115077
115136
  const text = await readFile38(path, "utf8").catch(() => null);
115078
115137
  if (text === null)
@@ -115637,7 +115696,7 @@ async function boulder(options) {
115637
115696
  }
115638
115697
  // packages/omo-opencode/src/cli/codex-ulw-loop.ts
115639
115698
  import { spawn as spawn6 } from "child_process";
115640
- import { existsSync as existsSync67, readFileSync as readFileSync45, realpathSync as realpathSync14 } from "fs";
115699
+ import { existsSync as existsSync67, readFileSync as readFileSync46, realpathSync as realpathSync14 } from "fs";
115641
115700
  import { homedir as homedir36 } from "os";
115642
115701
  var ULW_LOOP_DELEGATION_SENTINEL = "OMO_ULW_LOOP_DELEGATED";
115643
115702
  function resolveCodexUlwLoopCommand(input = {}) {
@@ -115687,7 +115746,7 @@ function resolveLegacyLocalOmoBin(env, homeDir, currentExecutablePaths) {
115687
115746
  }
115688
115747
  function isGeneratedRuntimeWrapper(candidate) {
115689
115748
  try {
115690
- return readFileSync45(candidate, "utf8").includes(RUNTIME_WRAPPER_MARKER);
115749
+ return readFileSync46(candidate, "utf8").includes(RUNTIME_WRAPPER_MARKER);
115691
115750
  } catch (error) {
115692
115751
  if (error instanceof Error)
115693
115752
  return false;
@@ -116133,7 +116192,7 @@ prunes.
116133
116192
 
116134
116193
  // packages/omo-opencode/src/cli/config-migrate.ts
116135
116194
  init_startup_migration();
116136
- import { posix as posix15 } from "path";
116195
+ import { posix as posix16 } from "path";
116137
116196
  function reports(result) {
116138
116197
  return result.results.map((entry) => ({
116139
116198
  diagnostics: entry.diagnostics,
@@ -116167,7 +116226,7 @@ function runConfigMigrate(options = {}) {
116167
116226
  dryRun: options.dryRun ?? false,
116168
116227
  environment,
116169
116228
  ...homeDir === undefined ? {} : { env: { HOME: homeDir }, homeDir },
116170
- pathOperations: posix15
116229
+ pathOperations: posix16
116171
116230
  });
116172
116231
  const report = reports(result);
116173
116232
  const response = {