lazycodex-ai 5.1.41 → 5.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/README.de.md +118 -0
  2. package/README.es.md +118 -0
  3. package/README.fr.md +118 -0
  4. package/README.it.md +118 -0
  5. package/README.ja.md +2 -1
  6. package/README.ko.md +2 -1
  7. package/README.md +3 -2
  8. package/README.pt-br.md +118 -0
  9. package/README.ru.md +2 -1
  10. package/README.zh-cn.md +2 -1
  11. package/dist/cli/index.js +187 -39
  12. package/dist/cli/service-auth/cli-keystore.fixture.d.ts +1 -7
  13. package/dist/cli/service-auth/index.d.ts +3 -0
  14. package/dist/cli/service-auth/keystore.d.ts +8 -2
  15. package/dist/cli/service-auth/secret-service-lock.d.ts +4 -0
  16. package/dist/cli/service-auth/session.d.ts +7 -1
  17. package/dist/cli-node/index.js +187 -39
  18. package/package.json +1 -1
  19. package/packages/lsp-daemon/dist/cli.js +363 -35
  20. package/packages/lsp-daemon/dist/client.js +341 -13
  21. package/packages/lsp-daemon/dist/index.js +344 -16
  22. package/packages/lsp-tools-mcp/dist/cli.js +333 -5
  23. package/packages/lsp-tools-mcp/dist/mcp.js +333 -5
  24. package/packages/lsp-tools-mcp/dist/tools.js +333 -5
  25. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  26. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +68 -9
  27. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  32. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  36. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +358 -36
  37. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  38. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  40. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  41. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  42. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  43. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2 -0
  44. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2 -0
  45. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  46. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  48. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  50. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  51. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  52. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  74. package/packages/omo-codex/plugin/package-lock.json +17 -12
  75. package/packages/omo-codex/plugin/package.json +1 -1
  76. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  77. package/packages/omo-codex/scripts/install-dist/install-local.mjs +72 -11
  78. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
@@ -1,4 +1,5 @@
1
- import { type Credentials } from "./protocol";
1
+ import { type Credentials, SignInError } from "./protocol";
2
+ import { type SecretServiceLockProbe } from "./secret-service-lock";
2
3
  type SecretKey = {
3
4
  readonly service: string;
4
5
  readonly name: string;
@@ -15,6 +16,11 @@ export type CredentialStore = {
15
16
  readonly write: (value: Credentials) => Promise<void>;
16
17
  readonly clear: () => Promise<void>;
17
18
  };
19
+ export declare class KeychainLockedError extends SignInError {
20
+ }
21
+ export declare class SecretServiceUnavailableError extends SignInError {
22
+ }
23
+ export declare const quietNotice: (_message: string) => void;
18
24
  export declare function credentialId(api: string): string;
19
- export declare function createCredentialStore(api: string, secrets?: SecretApi | null, platform?: NodeJS.Platform): CredentialStore;
25
+ export declare function createCredentialStore(api: string, secrets?: SecretApi | null, platform?: NodeJS.Platform, lockProbe?: SecretServiceLockProbe, notice?: (message: string) => void): CredentialStore;
20
26
  export {};
@@ -0,0 +1,4 @@
1
+ export type SecretServiceLockState = "locked" | "unlocked" | "absent" | "unknown";
2
+ export type SecretServiceLockProbe = () => Promise<SecretServiceLockState>;
3
+ export declare const parseLockedReply: (stdout: string) => SecretServiceLockState | null;
4
+ export declare const probeSecretServiceLock: SecretServiceLockProbe;
@@ -1,5 +1,10 @@
1
1
  import { type CredentialStore } from "./keystore";
2
- import { type ChooseDevice, type Credentials } from "./protocol";
2
+ import { type ChooseDevice, type Credentials, SignInError } from "./protocol";
3
+ export declare class SessionEnded extends SignInError {
4
+ readonly deviceRevoked: boolean;
5
+ readonly code: string;
6
+ constructor(message: string, deviceRevoked: boolean, code: string);
7
+ }
3
8
  export declare function createSession(options: {
4
9
  readonly api: string;
5
10
  readonly store: CredentialStore;
@@ -10,6 +15,7 @@ export declare function createSession(options: {
10
15
  signal: AbortSignal | undefined;
11
16
  ready(): Promise<void>;
12
17
  save(value: Credentials): Promise<void>;
18
+ update<T>(action: (current: Credentials | null) => Promise<T>): Promise<T>;
13
19
  logout(): Promise<boolean>;
14
20
  accessToken(): Promise<string>;
15
21
  removeForLimit(error: unknown, choose: ChooseDevice): Promise<boolean>;
@@ -2133,7 +2133,7 @@ var package_default;
2133
2133
  var init_package = __esm(() => {
2134
2134
  package_default = {
2135
2135
  name: "oh-my-opencode",
2136
- version: "5.1.41",
2136
+ version: "5.1.43",
2137
2137
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
2138
2138
  main: "./dist/index.js",
2139
2139
  types: "dist/index.d.ts",
@@ -2310,7 +2310,7 @@ var init_package = __esm(() => {
2310
2310
  },
2311
2311
  devDependencies: {
2312
2312
  "@clack/prompts": "^1.8.1",
2313
- "@code-yeongyu/senpi": "2026.10.21-1",
2313
+ "@code-yeongyu/senpi": "2026.10.21-2",
2314
2314
  "@modelcontextprotocol/sdk": "^1.30.0",
2315
2315
  "@oh-my-opencode/agents-md-core": "workspace:*",
2316
2316
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
@@ -2371,18 +2371,18 @@ var init_package = __esm(() => {
2371
2371
  typescript: "^7.0.2"
2372
2372
  },
2373
2373
  optionalDependencies: {
2374
- "oh-my-opencode-darwin-arm64": "5.1.41",
2375
- "oh-my-opencode-darwin-x64": "5.1.41",
2376
- "oh-my-opencode-darwin-x64-baseline": "5.1.41",
2377
- "oh-my-opencode-linux-arm64": "5.1.41",
2378
- "oh-my-opencode-linux-arm64-musl": "5.1.41",
2379
- "oh-my-opencode-linux-x64": "5.1.41",
2380
- "oh-my-opencode-linux-x64-baseline": "5.1.41",
2381
- "oh-my-opencode-linux-x64-musl": "5.1.41",
2382
- "oh-my-opencode-linux-x64-musl-baseline": "5.1.41",
2383
- "oh-my-opencode-windows-arm64": "5.1.41",
2384
- "oh-my-opencode-windows-x64": "5.1.41",
2385
- "oh-my-opencode-windows-x64-baseline": "5.1.41"
2374
+ "oh-my-opencode-darwin-arm64": "5.1.43",
2375
+ "oh-my-opencode-darwin-x64": "5.1.43",
2376
+ "oh-my-opencode-darwin-x64-baseline": "5.1.43",
2377
+ "oh-my-opencode-linux-arm64": "5.1.43",
2378
+ "oh-my-opencode-linux-arm64-musl": "5.1.43",
2379
+ "oh-my-opencode-linux-x64": "5.1.43",
2380
+ "oh-my-opencode-linux-x64-baseline": "5.1.43",
2381
+ "oh-my-opencode-linux-x64-musl": "5.1.43",
2382
+ "oh-my-opencode-linux-x64-musl-baseline": "5.1.43",
2383
+ "oh-my-opencode-windows-arm64": "5.1.43",
2384
+ "oh-my-opencode-windows-x64": "5.1.43",
2385
+ "oh-my-opencode-windows-x64-baseline": "5.1.43"
2386
2386
  },
2387
2387
  overrides: {
2388
2388
  hono: "^4.13.8",
@@ -76909,7 +76909,7 @@ var init_memory_agreements = __esm(() => {
76909
76909
  });
76910
76910
 
76911
76911
  // packages/omo-config-core/src/schema/memory.ts
76912
- var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallEventCapsSchema, OmoMemoryRecallSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallEventCapsLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryProjectionSchema, OmoMemoryProjectionLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
76912
+ var OmoMemoryReflectionTriggerSchema, OmoMemoryReflectionSchema, OmoMemorySyncSchema, OmoMemorySearchSchema, OmoMemoryRecallEventCapsSchema, OmoMemoryRecallSchema, OmoMemoryNudgeSchema, OmoMemoryFactsSchema, OmoMemoryDreamSchema, OmoMemoryPeopleSchema, OmoMemorySoulSchema, OmoMemoryWriteNoticeSchema, OmoMemoryReflectionTriggerLayerSchema, OmoMemoryReflectionLayerSchema, OmoMemorySyncLayerSchema, OmoMemorySearchLayerSchema, OmoMemoryRecallEventCapsLayerSchema, OmoMemoryRecallLayerSchema, OmoMemoryNudgeLayerSchema, OmoMemoryFactsLayerSchema, OmoMemoryDreamLayerSchema, OmoMemoryPeopleLayerSchema, OmoMemorySoulLayerSchema, OmoMemoryWriteNoticeLayerSchema, OmoMemoryProjectionSchema, OmoMemoryProjectionLayerSchema, OmoMemoryAgentOverridesSchema, OmoMemoryAutoIdentitySchema, OmoMemorySettingsSchema, OmoMemorySettingsLayerSchema;
76913
76913
  var init_memory = __esm(() => {
76914
76914
  init_zod();
76915
76915
  init_memory_agreements();
@@ -77065,9 +77065,11 @@ var init_memory = __esm(() => {
77065
77065
  projection: OmoMemoryProjectionLayerSchema.optional(),
77066
77066
  compile_warn_tokens: number2().int().positive().optional()
77067
77067
  }).strict();
77068
+ OmoMemoryAutoIdentitySchema = _enum(["path", "git"]);
77068
77069
  OmoMemorySettingsSchema = object({
77069
77070
  enabled: boolean2().default(true),
77070
77071
  agent: string2().min(1).default("auto"),
77072
+ auto_identity: OmoMemoryAutoIdentitySchema.default("path"),
77071
77073
  reflection: OmoMemoryReflectionSchema.default({
77072
77074
  enabled: true,
77073
77075
  trigger: { step_count: 25, on_compaction: true },
@@ -77109,6 +77111,7 @@ var init_memory = __esm(() => {
77109
77111
  OmoMemorySettingsLayerSchema = object({
77110
77112
  enabled: boolean2().optional(),
77111
77113
  agent: string2().min(1).optional(),
77114
+ auto_identity: OmoMemoryAutoIdentitySchema.optional(),
77112
77115
  reflection: OmoMemoryReflectionLayerSchema.optional(),
77113
77116
  nudge: OmoMemoryNudgeLayerSchema.optional(),
77114
77117
  facts: OmoMemoryFactsLayerSchema.optional(),
@@ -77158,6 +77161,7 @@ var init_model_profile = __esm(() => {
77158
77161
  init_fallback_models();
77159
77162
  OmoModelProfileInputSchema = object({
77160
77163
  display_name: string2().optional(),
77164
+ caution: string2().optional(),
77161
77165
  family: _enum(["daily", "geeky"]).optional(),
77162
77166
  tier: _enum(["normal", "heavy"]).optional(),
77163
77167
  models: array(union([string2(), OmoFallbackModelObjectSchema])).optional()
@@ -77451,7 +77455,7 @@ var init_gateway = __esm(() => {
77451
77455
  });
77452
77456
 
77453
77457
  // packages/omo-config-core/src/schema/config.ts
77454
- var OmoOpenCodeHarnessConfigSchema, OmoDisabledSkillsSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
77458
+ var OmoOpenCodeHarnessConfigSchema, OmoDisabledSkillsSchema, OmoExcludedModelsSchema, OmoTypedHarnessConfigSchema, OmoConfigProfileSchema, OmoConfigSchema, OmoConfigLayerSchema;
77455
77459
  var init_config = __esm(() => {
77456
77460
  init_zod();
77457
77461
  init_agent();
@@ -77469,6 +77473,7 @@ var init_config = __esm(() => {
77469
77473
  init_gateway();
77470
77474
  OmoOpenCodeHarnessConfigSchema = record(string2(), unknown());
77471
77475
  OmoDisabledSkillsSchema = array(string2());
77476
+ OmoExcludedModelsSchema = array(string2());
77472
77477
  OmoTypedHarnessConfigSchema = object({
77473
77478
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
77474
77479
  gateway: OmoGatewaySectionSchema.optional(),
@@ -77484,7 +77489,8 @@ var init_config = __esm(() => {
77484
77489
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
77485
77490
  side_panel: OmoSidePanelSettingsLayerSchema.optional(),
77486
77491
  computer: OmoComputerSettingsLayerSchema.optional(),
77487
- disabled_skills: OmoDisabledSkillsSchema.optional()
77492
+ disabled_skills: OmoDisabledSkillsSchema.optional(),
77493
+ exclude_models: OmoExcludedModelsSchema.optional()
77488
77494
  }).strict();
77489
77495
  OmoConfigProfileSchema = object({
77490
77496
  formatOnMutation: OmoFormatOnMutationLayerSchema.optional(),
@@ -77501,6 +77507,7 @@ var init_config = __esm(() => {
77501
77507
  side_panel: OmoSidePanelSettingsLayerSchema.optional(),
77502
77508
  computer: OmoComputerSettingsLayerSchema.optional(),
77503
77509
  disabled_skills: OmoDisabledSkillsSchema.optional(),
77510
+ exclude_models: OmoExcludedModelsSchema.optional(),
77504
77511
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
77505
77512
  "[native]": OmoTypedHarnessConfigSchema.optional(),
77506
77513
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
@@ -77523,6 +77530,7 @@ var init_config = __esm(() => {
77523
77530
  side_panel: OmoSidePanelSettingsSchema.optional(),
77524
77531
  computer: OmoComputerSettingsSchema.optional(),
77525
77532
  disabled_skills: OmoDisabledSkillsSchema.optional(),
77533
+ exclude_models: OmoExcludedModelsSchema.optional(),
77526
77534
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
77527
77535
  "[native]": OmoTypedHarnessConfigSchema.optional(),
77528
77536
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
@@ -77548,6 +77556,7 @@ var init_config = __esm(() => {
77548
77556
  side_panel: OmoSidePanelSettingsLayerSchema.optional(),
77549
77557
  computer: OmoComputerSettingsLayerSchema.optional(),
77550
77558
  disabled_skills: OmoDisabledSkillsSchema.optional(),
77559
+ exclude_models: OmoExcludedModelsSchema.optional(),
77551
77560
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
77552
77561
  "[native]": OmoTypedHarnessConfigSchema.optional(),
77553
77562
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
@@ -77756,7 +77765,51 @@ var init_diagnostic_lines = __esm(() => {
77756
77765
  });
77757
77766
 
77758
77767
  // packages/omo-config-core/src/loader/disabled-skills.ts
77759
- var init_disabled_skills = () => {};
77768
+ function toRecord(value) {
77769
+ if (value === null || typeof value !== "object" || Array.isArray(value))
77770
+ return;
77771
+ return value;
77772
+ }
77773
+ function namesAt(record, key) {
77774
+ const value = record?.[key];
77775
+ if (!Array.isArray(value))
77776
+ return [];
77777
+ return value.filter((entry) => typeof entry === "string" && entry.trim() !== "");
77778
+ }
77779
+ function harnessBlockKeys(harness) {
77780
+ const canonical = canonicalHarnessName(harness);
77781
+ const legacy = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([name]) => harnessBlockKey(name));
77782
+ return [harnessBlockKey(canonical), ...legacy];
77783
+ }
77784
+ function scopesOf(config, harness) {
77785
+ if (harness === undefined)
77786
+ return [config];
77787
+ return [config, ...harnessBlockKeys(harness).map((key) => toRecord(config[key]))];
77788
+ }
77789
+ function collectExcludedModels(options) {
77790
+ return collectUnionedList("exclude_models", options);
77791
+ }
77792
+ function collectUnionedList(key, options) {
77793
+ const names = new Set;
77794
+ for (const layer of options.layers) {
77795
+ const config = toRecord(layer.config);
77796
+ if (config === undefined)
77797
+ continue;
77798
+ const profile = options.profile === undefined ? undefined : toRecord(toRecord(config["profiles"])?.[options.profile]);
77799
+ const scopes = [
77800
+ ...scopesOf(config, options.harness),
77801
+ ...profile === undefined ? [] : scopesOf(profile, options.harness)
77802
+ ];
77803
+ for (const scope of scopes) {
77804
+ for (const name of namesAt(scope, key))
77805
+ names.add(name.trim());
77806
+ }
77807
+ }
77808
+ return [...names];
77809
+ }
77810
+ var init_disabled_skills = __esm(() => {
77811
+ init_schema();
77812
+ });
77760
77813
 
77761
77814
  // packages/omo-config-core/src/loader/merge.ts
77762
77815
  function isUnsafeObjectKey2(key) {
@@ -77992,7 +78045,7 @@ function stripUnrecognizedKeys(record, issues) {
77992
78045
  }
77993
78046
  return { issuePaths, stripped };
77994
78047
  }
77995
- function toRecord(value) {
78048
+ function toRecord2(value) {
77996
78049
  if (value === null || typeof value !== "object" || Array.isArray(value))
77997
78050
  return null;
77998
78051
  const record = {};
@@ -78003,7 +78056,7 @@ function toRecord(value) {
78003
78056
  }
78004
78057
  function validateConfigLayer(path, data) {
78005
78058
  const sanitized = sanitizeUnsafeKeys(data);
78006
- const record = toRecord(sanitized.value);
78059
+ const record = toRecord2(sanitized.value);
78007
78060
  const unsafeIssuePaths = sanitized.issues.flatMap((issue) => issue.keys.map((key) => [...issue.path, key].join(".")));
78008
78061
  const unsafeDiagnostics = unsafeIssuePaths.length === 0 ? [] : [{ kind: "unknown-keys", message: `Ignored unknown keys in ${path}: ${unsafeIssuePaths.join(", ")}`, path, issuePaths: unsafeIssuePaths }];
78009
78062
  const validation = OmoConfigLayerSchema.safeParse(sanitized.value);
@@ -78156,7 +78209,7 @@ function resolveOmoProfileName(options = {}) {
78156
78209
  const env = options.env ?? process.env;
78157
78210
  return profileName(options.profile) ?? profileName(env["OMO_PROFILE"]) ?? profileName(env["OCX_PROFILE"]) ?? profileNameFromOpenCodeConfigDir(env["OPENCODE_CONFIG_DIR"]);
78158
78211
  }
78159
- function toRecord2(value) {
78212
+ function toRecord3(value) {
78160
78213
  if (value === null || typeof value !== "object" || Array.isArray(value))
78161
78214
  return;
78162
78215
  return Object.fromEntries(Object.entries(value));
@@ -78177,13 +78230,13 @@ function harnessLayer(config, harness) {
78177
78230
  const legacyKeys = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([legacy]) => harnessBlockKey(legacy));
78178
78231
  let layer = {};
78179
78232
  for (const key of [...legacyKeys, harnessBlockKey(canonical)]) {
78180
- layer = mergeOmoConfigRecords(layer, toRecord2(config[key]) ?? {});
78233
+ layer = mergeOmoConfigRecords(layer, toRecord3(config[key]) ?? {});
78181
78234
  }
78182
78235
  return layer;
78183
78236
  }
78184
78237
  function resolveOmoConfigView(options) {
78185
- const profiles = toRecord2(options.config["profiles"]);
78186
- const profile = options.profile === undefined ? undefined : toRecord2(profiles?.[options.profile]);
78238
+ const profiles = toRecord3(options.config["profiles"]);
78239
+ const profile = options.profile === undefined ? undefined : toRecord3(profiles?.[options.profile]);
78187
78240
  const diagnostics = profile === undefined && options.profile !== undefined ? [{
78188
78241
  kind: "profile",
78189
78242
  message: `Activated omo profile "${options.profile}" does not exist; using the base configuration`,
@@ -78324,9 +78377,15 @@ function loadOmoConfig(options = {}) {
78324
78377
  });
78325
78378
  const finalInput = mergeOmoConfigRecords(DEFAULT_RAW_CONFIG, resolved.config);
78326
78379
  const finalConfig = OmoConfigSchema.safeParse(finalInput);
78380
+ const excludeModels = collectExcludedModels({
78381
+ layers,
78382
+ ...options.harness === undefined ? {} : { harness: options.harness },
78383
+ ...resolved.profile === undefined ? {} : { profile: resolved.profile }
78384
+ });
78385
+ const withExcludedModels = (config) => excludeModels.length === 0 ? config : { ...config, exclude_models: [...excludeModels] };
78327
78386
  if (finalConfig.success) {
78328
78387
  return {
78329
- config: stripResolutionControlKeys(finalConfig.data),
78388
+ config: withExcludedModels(stripResolutionControlKeys(finalConfig.data)),
78330
78389
  diagnostics: [...diagnostics, ...resolved.diagnostics],
78331
78390
  layers,
78332
78391
  ...resolved.profile === undefined ? {} : { profile: resolved.profile },
@@ -78339,7 +78398,7 @@ function loadOmoConfig(options = {}) {
78339
78398
  });
78340
78399
  if (pruned.ok) {
78341
78400
  return {
78342
- config: stripResolutionControlKeys(OmoConfigSchema.parse(pruned.config)),
78401
+ config: withExcludedModels(stripResolutionControlKeys(OmoConfigSchema.parse(pruned.config))),
78343
78402
  diagnostics: [...diagnostics, ...resolved.diagnostics, ...invalidValueDiagnostics(MERGED_OMO_CONFIG_PATH, pruned.dropped)],
78344
78403
  layers,
78345
78404
  ...resolved.profile === undefined ? {} : { profile: resolved.profile },
@@ -78358,6 +78417,7 @@ var DEFAULT_RAW_CONFIG;
78358
78417
  var init_loader2 = __esm(() => {
78359
78418
  init_main();
78360
78419
  init_schema();
78420
+ init_disabled_skills();
78361
78421
  init_layer_validation();
78362
78422
  init_merge();
78363
78423
  init_paths();
@@ -82467,6 +82527,8 @@ function toDiagnosticRecord(input, now) {
82467
82527
  timestamp: now.toISOString(),
82468
82528
  event: input.event,
82469
82529
  source: input.source,
82530
+ ...input.entryKind === undefined ? {} : { entry_kind: input.entryKind },
82531
+ ...input.errorCode === undefined ? {} : { error_code: input.errorCode },
82470
82532
  ...input.count === undefined ? {} : { count: input.count },
82471
82533
  ...serializeError(input.error, input.errorKind)
82472
82534
  };
@@ -92220,7 +92282,7 @@ var package_default2;
92220
92282
  var init_package2 = __esm(() => {
92221
92283
  package_default2 = {
92222
92284
  name: "@oh-my-opencode/omo-codex",
92223
- version: "5.1.41",
92285
+ version: "5.1.43",
92224
92286
  type: "module",
92225
92287
  private: true,
92226
92288
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -99527,6 +99589,7 @@ var REQUIRED_PLUGIN_ARTIFACTS = [
99527
99589
  join63("extensions", "CaseFolding.txt"),
99528
99590
  join63("extensions", "omo-thread-client.js"),
99529
99591
  join63("extensions", "omo-feedback.js"),
99592
+ join63("extensions", "omo-claim-receipt.js"),
99530
99593
  join63("extensions", "assets.generated.json"),
99531
99594
  join63("extensions", "omo-member.js"),
99532
99595
  join63("extensions", "memory-run-supervisor.mjs"),
@@ -108569,6 +108632,10 @@ var package_default3 = {
108569
108632
  types: "./src/config-migration/index.ts",
108570
108633
  import: "./src/config-migration/index.ts"
108571
108634
  },
108635
+ "./service-auth": {
108636
+ types: "./src/cli/service-auth/index.ts",
108637
+ import: "./src/cli/service-auth/index.ts"
108638
+ },
108572
108639
  "./binary-downloader": {
108573
108640
  types: "./src/shared/binary-downloader.ts",
108574
108641
  import: "./src/shared/binary-downloader.ts"
@@ -111582,24 +111649,98 @@ async function loginDevice(session, options) {
111582
111649
 
111583
111650
  // packages/omo-opencode/src/cli/service-auth/keystore.ts
111584
111651
  import { createHash as createHash9 } from "node:crypto";
111652
+
111653
+ // packages/omo-opencode/src/cli/service-auth/secret-service-lock.ts
111654
+ import { spawn as spawn5 } from "node:child_process";
111655
+ var DEFAULT_COLLECTION = "/org/freedesktop/secrets/aliases/default";
111656
+ var PROBE_TIMEOUT_MS2 = 1e4;
111657
+ var parseLockedReply = (stdout) => {
111658
+ const match = /<\s*(true|false)\s*>/.exec(stdout);
111659
+ if (match === null)
111660
+ return null;
111661
+ return match[1] === "true" ? "locked" : "unlocked";
111662
+ };
111663
+ var probeSecretServiceLock = () => new Promise((resolve) => {
111664
+ const child = spawn5("gdbus", [
111665
+ "call",
111666
+ "--session",
111667
+ "--dest",
111668
+ "org.freedesktop.secrets",
111669
+ "--object-path",
111670
+ DEFAULT_COLLECTION,
111671
+ "--method",
111672
+ "org.freedesktop.DBus.Properties.Get",
111673
+ "org.freedesktop.Secret.Collection",
111674
+ "Locked"
111675
+ ], { stdio: ["ignore", "pipe", "ignore"] });
111676
+ let stdout = "";
111677
+ const timer = setTimeout(() => {
111678
+ child.kill();
111679
+ resolve("unknown");
111680
+ }, PROBE_TIMEOUT_MS2);
111681
+ child.stdout.on("data", (chunk) => {
111682
+ stdout += chunk.toString();
111683
+ });
111684
+ child.on("error", () => {
111685
+ clearTimeout(timer);
111686
+ resolve("unknown");
111687
+ });
111688
+ child.on("close", (code) => {
111689
+ clearTimeout(timer);
111690
+ resolve(code === 0 ? parseLockedReply(stdout) ?? "absent" : "absent");
111691
+ });
111692
+ });
111693
+
111694
+ // packages/omo-opencode/src/cli/service-auth/keystore.ts
111695
+ class KeychainLockedError extends SignInError {
111696
+ }
111697
+ var LOCKED = /-25308|errSecInteractionNotAllowed|interaction is not allowed|locked collection/i;
111698
+ var UNLOCKED_REUSE_MS = 30000;
111699
+ var fallbackNoticed = false;
111700
+ var stderrNoticeOncePerProcess = (message) => {
111701
+ if (fallbackNoticed)
111702
+ return;
111703
+ fallbackNoticed = true;
111704
+ process.stderr.write(`${message}
111705
+ `);
111706
+ };
111707
+ var isLocked = (error) => error instanceof Error && (LOCKED.test(error.message) || LOCKED.test(String(error.code ?? "")));
111585
111708
  function credentialId(api) {
111586
111709
  return createHash9("sha256").update(serviceOrigin(api)).digest("hex");
111587
111710
  }
111588
- function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null : Bun.secrets, platform = process.platform) {
111711
+ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null : Bun.secrets, platform = process.platform, lockProbe = probeSecretServiceLock, notice = stderrNoticeOncePerProcess) {
111589
111712
  if (!secrets)
111590
111713
  throw new SignInError("OmO sign-in needs Bun 1.4 or newer with OS credential storage. No file fallback is available.");
111591
111714
  const platformName = platform === "darwin" ? "macOS Keychain" : platform === "linux" ? "Linux Secret Service (libsecret and an unlocked keyring)" : platform === "win32" ? "Windows Credential Manager" : null;
111592
111715
  if (platformName === null)
111593
111716
  throw new SignInError("This platform has no supported OS credential store.");
111594
111717
  const key = { service: "omo-cli", name: credentialId(api) };
111595
- const unavailable = () => new SignInError(`Cannot access ${platformName}. Unlock or enable the OS credential store and try again. Credentials are never saved to a file.`);
111718
+ const unavailable = (error) => isLocked(error) ? new KeychainLockedError(`${platformName} is locked. Unlock it, then try again. Credentials are never saved to a file.`) : new SignInError(`Cannot access ${platformName}. Unlock or enable the OS credential store and try again. Credentials are never saved to a file.`);
111719
+ let unlockedUntil = 0;
111720
+ let noticed = false;
111721
+ const assertUsable = async () => {
111722
+ if (platform !== "linux" || Date.now() < unlockedUntil)
111723
+ return;
111724
+ const lock = await lockProbe();
111725
+ if (lock === "locked")
111726
+ throw new KeychainLockedError(`${platformName} is locked. Unlock it, then try again. Credentials are never saved to a file.`);
111727
+ if (lock === "unlocked") {
111728
+ unlockedUntil = Date.now() + UNLOCKED_REUSE_MS;
111729
+ return;
111730
+ }
111731
+ if (!noticed) {
111732
+ noticed = true;
111733
+ notice("omo: could not check whether the keyring is locked (gdbus or the Secret Service did not answer); using libsecret directly.");
111734
+ }
111735
+ };
111596
111736
  return {
111597
111737
  async read() {
111738
+ await assertUsable();
111598
111739
  let value;
111599
111740
  try {
111600
111741
  value = await secrets.get(key);
111601
- } catch {
111602
- throw unavailable();
111742
+ } catch (error) {
111743
+ throw unavailable(error);
111603
111744
  }
111604
111745
  if (value === null)
111605
111746
  return null;
@@ -111610,17 +111751,19 @@ function createCredentialStore(api, secrets = typeof Bun === "undefined" ? null
111610
111751
  }
111611
111752
  },
111612
111753
  async write(value) {
111754
+ await assertUsable();
111613
111755
  try {
111614
111756
  await secrets.set({ ...key, value: JSON.stringify(credentialSchema.parse(value)) });
111615
- } catch {
111616
- throw unavailable();
111757
+ } catch (error) {
111758
+ throw unavailable(error);
111617
111759
  }
111618
111760
  },
111619
111761
  async clear() {
111762
+ await assertUsable();
111620
111763
  try {
111621
111764
  await secrets.delete(key);
111622
- } catch {
111623
- throw unavailable();
111765
+ } catch (error) {
111766
+ throw unavailable(error);
111624
111767
  }
111625
111768
  }
111626
111769
  };
@@ -111964,9 +112107,11 @@ async function reapStaleLock(lockPath, staleAfterMs = DEFAULT_STALE_AFTER_MS, de
111964
112107
  // packages/omo-opencode/src/cli/service-auth/session.ts
111965
112108
  class SessionEnded extends SignInError {
111966
112109
  deviceRevoked;
111967
- constructor(message, deviceRevoked) {
112110
+ code;
112111
+ constructor(message, deviceRevoked, code) {
111968
112112
  super(message);
111969
112113
  this.deviceRevoked = deviceRevoked;
112114
+ this.code = code;
111970
112115
  }
111971
112116
  }
111972
112117
  var DEVICE_REVOKING_REFUSALS = new Set(["account_deleted", "reauth_required"]);
@@ -111998,7 +112143,7 @@ function createSession(options) {
111998
112143
  } catch (error) {
111999
112144
  if (error instanceof ApiRefusal && error.status < 500 && ["unauthorized", "account_deleted", "reauth_required", "invalid_grant"].includes(error.code)) {
112000
112145
  await store.clear();
112001
- throw new SessionEnded(error.code === "reauth_required" ? "This session was ended because its refresh token was reused. Sign in again with omo login." : "Sign in again with omo login.", DEVICE_REVOKING_REFUSALS.has(error.code));
112146
+ throw new SessionEnded(error.code === "reauth_required" ? "This session was ended because its refresh token was reused. Sign in again with omo login." : "Sign in again with omo login.", DEVICE_REVOKING_REFUSALS.has(error.code), error.code);
112002
112147
  }
112003
112148
  if (error instanceof RequestFailure && error.notSent || error instanceof ApiRefusal && error.status === 429 && error.code === "rate_limited") {
112004
112149
  await store.write(current);
@@ -112016,6 +112161,9 @@ function createSession(options) {
112016
112161
  async save(value) {
112017
112162
  await locked(() => store.write(value));
112018
112163
  },
112164
+ async update(action) {
112165
+ return locked(async () => action(await store.read()));
112166
+ },
112019
112167
  async logout() {
112020
112168
  return locked(async () => {
112021
112169
  try {
@@ -112379,7 +112527,7 @@ async function boulder(options) {
112379
112527
  return 0;
112380
112528
  }
112381
112529
  // packages/omo-opencode/src/cli/codex-ulw-loop.ts
112382
- import { spawn as spawn5 } from "node:child_process";
112530
+ import { spawn as spawn6 } from "node:child_process";
112383
112531
  import { existsSync as existsSync65, readFileSync as readFileSync43, realpathSync as realpathSync11 } from "node:fs";
112384
112532
  import { homedir as homedir29 } from "node:os";
112385
112533
  var ULW_LOOP_DELEGATION_SENTINEL = "OMO_ULW_LOOP_DELEGATED";
@@ -112409,7 +112557,7 @@ async function codexUlwLoop(args) {
112409
112557
  return 1;
112410
112558
  }
112411
112559
  const { promise, resolve } = Promise.withResolvers();
112412
- const child = spawn5(command.executable, [...command.argsPrefix, ...args], {
112560
+ const child = spawn6(command.executable, [...command.argsPrefix, ...args], {
112413
112561
  stdio: "inherit",
112414
112562
  env: { ...process.env, [ULW_LOOP_DELEGATION_SENTINEL]: "1" }
112415
112563
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "5.1.41",
3
+ "version": "5.1.43",
4
4
  "description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
5
5
  "main": "./dist/index.js",
6
6
  "types": "dist/index.d.ts",