evil-omo 3.17.5 → 3.17.10

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 (55) hide show
  1. package/README.ja.md +1 -1
  2. package/README.ko.md +1 -1
  3. package/README.ru.md +1 -1
  4. package/README.zh-cn.md +1 -1
  5. package/dist/agents/agent-builder.d.ts +2 -3
  6. package/dist/agents/agent-skill-resolution.d.ts +7 -0
  7. package/dist/agents/frontier-tool-schema-guard.d.ts +3 -0
  8. package/dist/agents/hephaestus/agent.d.ts +1 -1
  9. package/dist/agents/hephaestus/gpt-5-5.d.ts +12 -0
  10. package/dist/agents/sisyphus/claude-opus-4-7.d.ts +20 -0
  11. package/dist/agents/sisyphus/gpt-5-5.d.ts +20 -0
  12. package/dist/agents/sisyphus/index.d.ts +5 -0
  13. package/dist/agents/sisyphus/kimi-k2-6.d.ts +32 -0
  14. package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
  15. package/dist/agents/sisyphus-junior/gpt-5-5.d.ts +14 -0
  16. package/dist/agents/sisyphus-junior/index.d.ts +2 -0
  17. package/dist/agents/sisyphus-junior/kimi-k2-6.d.ts +13 -0
  18. package/dist/agents/types.d.ts +16 -0
  19. package/dist/cli/doctor/checks/model-resolution.d.ts +4 -0
  20. package/dist/cli/index.js +141 -86
  21. package/dist/features/background-agent/attempt-lifecycle.d.ts +12 -0
  22. package/dist/features/background-agent/background-task-notification-template.d.ts +2 -1
  23. package/dist/features/background-agent/constants.d.ts +1 -0
  24. package/dist/features/background-agent/fallback-retry-handler.d.ts +8 -0
  25. package/dist/features/background-agent/manager.d.ts +9 -0
  26. package/dist/features/background-agent/types.d.ts +24 -0
  27. package/dist/hooks/model-fallback/controller-accessor.d.ts +1 -0
  28. package/dist/hooks/model-fallback/fallback-state-controller.d.ts +1 -0
  29. package/dist/hooks/model-fallback/hook.d.ts +2 -1
  30. package/dist/hooks/preemptive-compaction-degradation-monitor.d.ts +1 -0
  31. package/dist/hooks/preemptive-compaction-no-text-tail.d.ts +1 -0
  32. package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +1 -6
  33. package/dist/hooks/ralph-loop/session-event-handler.d.ts +2 -6
  34. package/dist/hooks/ralph-loop/types.d.ts +5 -0
  35. package/dist/index.js +3531 -664
  36. package/dist/plugin/event.d.ts +1 -0
  37. package/dist/plugin/hooks/create-core-hooks.d.ts +2 -0
  38. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -0
  39. package/dist/shared/agent-display-names.d.ts +7 -2
  40. package/dist/shared/agent-sort-shim.d.ts +28 -0
  41. package/dist/shared/dynamic-truncator.d.ts +9 -10
  42. package/dist/shared/file-reference-resolver.d.ts +1 -0
  43. package/dist/shared/model-error-classifier.d.ts +2 -2
  44. package/dist/shared/posthog-activity-state.d.ts +5 -2
  45. package/dist/shared/posthog.d.ts +5 -0
  46. package/dist/tools/background-task/clients.d.ts +1 -0
  47. package/dist/tools/delegate-task/builtin-categories.d.ts +1 -0
  48. package/dist/tools/delegate-task/builtin-category-definition.d.ts +1 -0
  49. package/dist/tools/delegate-task/constants.d.ts +1 -1
  50. package/dist/tools/delegate-task/executor-types.d.ts +1 -0
  51. package/dist/tools/delegate-task/openai-categories.d.ts +3 -0
  52. package/dist/tools/delegate-task/sync-task-fallback.d.ts +3 -0
  53. package/dist/tools/slashcommand/command-discovery-deps.d.ts +6 -0
  54. package/package.json +12 -12
  55. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
package/dist/cli/index.js CHANGED
@@ -6018,8 +6018,10 @@ function normalizeSDKResponse(response, fallback, options) {
6018
6018
  }
6019
6019
 
6020
6020
  // src/shared/dynamic-truncator.ts
6021
+ var usageCacheByClient;
6021
6022
  var init_dynamic_truncator = __esm(() => {
6022
6023
  init_context_limit_resolver();
6024
+ usageCacheByClient = new WeakMap;
6023
6025
  });
6024
6026
 
6025
6027
  // src/shared/data-path.ts
@@ -6205,7 +6207,8 @@ var init_model_versions = __esm(() => {
6205
6207
  "anthropic/claude-opus-4-5": "anthropic/claude-opus-4-7",
6206
6208
  "anthropic/claude-opus-4-6": "anthropic/claude-opus-4-7",
6207
6209
  "anthropic/claude-sonnet-4-5": "anthropic/claude-sonnet-4-6",
6208
- "openai/gpt-5.3-codex": "openai/gpt-5.4"
6210
+ "openai/gpt-5.3-codex": "openai/gpt-5.4",
6211
+ "openai/gpt-5.4": "openai/gpt-5.5"
6209
6212
  };
6210
6213
  });
6211
6214
 
@@ -6290,12 +6293,15 @@ function migrateConfigFile(configPath, rawConfig) {
6290
6293
  const copy = JSON.parse(JSON.stringify(rawConfig));
6291
6294
  let needsWrite = false;
6292
6295
  const sidecarMigrations = readAppliedMigrations(configPath);
6293
- const inConfigMigrations = Array.isArray(copy._migrations) ? new Set(copy._migrations) : new Set;
6296
+ const inConfigMigrations = Array.isArray(copy._migrations) ? new Set(copy._migrations.filter((migration) => typeof migration === "string")) : new Set;
6297
+ const inlineAppliedMigrations = Array.isArray(copy.appliedMigrations) ? new Set(copy.appliedMigrations.filter((migration) => typeof migration === "string")) : new Set;
6294
6298
  const existingMigrations = new Set([
6295
6299
  ...sidecarMigrations,
6296
- ...inConfigMigrations
6300
+ ...inConfigMigrations,
6301
+ ...inlineAppliedMigrations
6297
6302
  ]);
6298
6303
  const hadLegacyInConfigMigrations = inConfigMigrations.size > 0;
6304
+ const hadInlineAppliedMigrations = inlineAppliedMigrations.size > 0;
6299
6305
  const allNewMigrations = [];
6300
6306
  if (copy.agents && typeof copy.agents === "object") {
6301
6307
  const { migrated, changed } = migrateAgentNames(copy.agents);
@@ -6327,11 +6333,12 @@ function migrateConfigFile(configPath, rawConfig) {
6327
6333
  ...existingMigrations,
6328
6334
  ...newMigrationsToRecord
6329
6335
  ]);
6330
- const shouldWriteSidecar = newMigrationsToRecord.length > 0 || hadLegacyInConfigMigrations;
6336
+ const shouldWriteSidecar = newMigrationsToRecord.length > 0 || hadLegacyInConfigMigrations || hadInlineAppliedMigrations;
6331
6337
  if (newMigrationsToRecord.length > 0) {
6332
6338
  needsWrite = true;
6333
6339
  }
6334
- if (hadLegacyInConfigMigrations) {
6340
+ if (hadLegacyInConfigMigrations || hadInlineAppliedMigrations) {
6341
+ delete copy.appliedMigrations;
6335
6342
  needsWrite = true;
6336
6343
  }
6337
6344
  if (shouldWriteSidecar) {
@@ -6695,11 +6702,6 @@ function stripInvisibleAgentCharacters(agentName) {
6695
6702
  function stripAgentListSortPrefix(agentName) {
6696
6703
  return stripInvisibleAgentCharacters(agentName);
6697
6704
  }
6698
- function getAgentRuntimeName(configKey) {
6699
- const displayName = getAgentDisplayName(configKey);
6700
- const prefix = AGENT_LIST_SORT_PREFIXES[configKey.toLowerCase()];
6701
- return prefix ? `${prefix}${displayName}` : displayName;
6702
- }
6703
6705
  function getAgentDisplayName(configKey) {
6704
6706
  const exactMatch = AGENT_DISPLAY_NAMES[configKey];
6705
6707
  if (exactMatch !== undefined)
@@ -6727,7 +6729,7 @@ function getAgentConfigKey(agentName) {
6727
6729
  const lower = stripAgentListSortPrefix(agentName).trim().toLowerCase();
6728
6730
  return resolveKnownAgentConfigKey(agentName) ?? lower;
6729
6731
  }
6730
- var AGENT_DISPLAY_NAMES, AGENT_LIST_SORT_PREFIXES, INVISIBLE_AGENT_CHARACTERS_REGEX, REVERSE_DISPLAY_NAMES, LEGACY_DISPLAY_NAMES;
6732
+ var AGENT_DISPLAY_NAMES, INVISIBLE_AGENT_CHARACTERS_REGEX, REVERSE_DISPLAY_NAMES, LEGACY_DISPLAY_NAMES;
6731
6733
  var init_agent_display_names = __esm(() => {
6732
6734
  AGENT_DISPLAY_NAMES = {
6733
6735
  sisyphus: "Sisyphus - Ultraworker",
@@ -6745,12 +6747,6 @@ var init_agent_display_names = __esm(() => {
6745
6747
  "multimodal-looker": "multimodal-looker",
6746
6748
  "council-member": "council-member"
6747
6749
  };
6748
- AGENT_LIST_SORT_PREFIXES = {
6749
- sisyphus: "\u200B",
6750
- hephaestus: "\u200B\u200B",
6751
- prometheus: "\u200B\u200B\u200B",
6752
- atlas: "\u200B\u200B\u200B\u200B"
6753
- };
6754
6750
  INVISIBLE_AGENT_CHARACTERS_REGEX = /[\u200B\u200C\u200D\uFEFF]/g;
6755
6751
  REVERSE_DISPLAY_NAMES = Object.fromEntries(Object.entries(AGENT_DISPLAY_NAMES).map(([key, displayName]) => [displayName.toLowerCase(), key]));
6756
6752
  LEGACY_DISPLAY_NAMES = {
@@ -6790,7 +6786,7 @@ var init_model_requirements = __esm(() => {
6790
6786
  ],
6791
6787
  model: "kimi-k2.5"
6792
6788
  },
6793
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" },
6789
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
6794
6790
  { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" },
6795
6791
  { providers: ["opencode"], model: "big-pickle" }
6796
6792
  ],
@@ -6800,7 +6796,7 @@ var init_model_requirements = __esm(() => {
6800
6796
  fallbackChain: [
6801
6797
  {
6802
6798
  providers: ["openai", "github-copilot", "venice", "opencode", "vercel"],
6803
- model: "gpt-5.4",
6799
+ model: "gpt-5.5",
6804
6800
  variant: "medium"
6805
6801
  }
6806
6802
  ],
@@ -6810,7 +6806,7 @@ var init_model_requirements = __esm(() => {
6810
6806
  fallbackChain: [
6811
6807
  {
6812
6808
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6813
- model: "gpt-5.4",
6809
+ model: "gpt-5.5",
6814
6810
  variant: "high"
6815
6811
  },
6816
6812
  {
@@ -6846,7 +6842,7 @@ var init_model_requirements = __esm(() => {
6846
6842
  },
6847
6843
  "multimodal-looker": {
6848
6844
  fallbackChain: [
6849
- { providers: ["openai", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" },
6845
+ { providers: ["openai", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
6850
6846
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
6851
6847
  { providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" },
6852
6848
  { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" }
@@ -6861,7 +6857,7 @@ var init_model_requirements = __esm(() => {
6861
6857
  },
6862
6858
  {
6863
6859
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6864
- model: "gpt-5.4",
6860
+ model: "gpt-5.5",
6865
6861
  variant: "high"
6866
6862
  },
6867
6863
  { providers: ["opencode-go", "vercel"], model: "glm-5" },
@@ -6880,7 +6876,7 @@ var init_model_requirements = __esm(() => {
6880
6876
  },
6881
6877
  {
6882
6878
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6883
- model: "gpt-5.4",
6879
+ model: "gpt-5.5",
6884
6880
  variant: "high"
6885
6881
  },
6886
6882
  { providers: ["opencode-go", "vercel"], model: "glm-5" },
@@ -6891,7 +6887,7 @@ var init_model_requirements = __esm(() => {
6891
6887
  fallbackChain: [
6892
6888
  {
6893
6889
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6894
- model: "gpt-5.4",
6890
+ model: "gpt-5.5",
6895
6891
  variant: "xhigh"
6896
6892
  },
6897
6893
  {
@@ -6913,7 +6909,7 @@ var init_model_requirements = __esm(() => {
6913
6909
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
6914
6910
  {
6915
6911
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6916
- model: "gpt-5.4",
6912
+ model: "gpt-5.5",
6917
6913
  variant: "medium"
6918
6914
  },
6919
6915
  { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }
@@ -6925,7 +6921,7 @@ var init_model_requirements = __esm(() => {
6925
6921
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
6926
6922
  {
6927
6923
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6928
- model: "gpt-5.4",
6924
+ model: "gpt-5.5",
6929
6925
  variant: "medium"
6930
6926
  },
6931
6927
  { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" },
@@ -6955,7 +6951,7 @@ var init_model_requirements = __esm(() => {
6955
6951
  fallbackChain: [
6956
6952
  {
6957
6953
  providers: ["openai", "opencode", "vercel"],
6958
- model: "gpt-5.4",
6954
+ model: "gpt-5.5",
6959
6955
  variant: "xhigh"
6960
6956
  },
6961
6957
  {
@@ -6975,7 +6971,7 @@ var init_model_requirements = __esm(() => {
6975
6971
  fallbackChain: [
6976
6972
  {
6977
6973
  providers: ["openai", "github-copilot", "venice", "opencode", "vercel"],
6978
- model: "gpt-5.4",
6974
+ model: "gpt-5.5",
6979
6975
  variant: "medium"
6980
6976
  },
6981
6977
  {
@@ -7002,7 +6998,7 @@ var init_model_requirements = __esm(() => {
7002
6998
  model: "claude-opus-4-7",
7003
6999
  variant: "max"
7004
7000
  },
7005
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4" }
7001
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5" }
7006
7002
  ],
7007
7003
  requiresModel: "gemini-3.1-pro"
7008
7004
  },
@@ -7052,7 +7048,7 @@ var init_model_requirements = __esm(() => {
7052
7048
  },
7053
7049
  {
7054
7050
  providers: ["openai", "github-copilot", "opencode", "vercel"],
7055
- model: "gpt-5.4",
7051
+ model: "gpt-5.5",
7056
7052
  variant: "high"
7057
7053
  },
7058
7054
  { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" },
@@ -49894,6 +49890,22 @@ var init_supplemental_entries = __esm(() => {
49894
49890
  input: 272000,
49895
49891
  output: 128000
49896
49892
  }
49893
+ },
49894
+ "gpt-5.5": {
49895
+ id: "gpt-5.5",
49896
+ family: "gpt",
49897
+ reasoning: true,
49898
+ temperature: false,
49899
+ toolCall: true,
49900
+ modalities: {
49901
+ input: ["text", "image", "pdf"],
49902
+ output: ["text"]
49903
+ },
49904
+ limit: {
49905
+ context: 400000,
49906
+ input: 272000,
49907
+ output: 128000
49908
+ }
49897
49909
  }
49898
49910
  };
49899
49911
  });
@@ -49973,6 +49985,18 @@ var init_model_capability_aliases = __esm(() => {
49973
49985
  ruleID: "gemini-3-pro-tier-alias",
49974
49986
  canonicalModelID: "gemini-3-pro-preview",
49975
49987
  rationale: "Legacy Gemini 3 tier suffixes still need to land on the canonical preview model."
49988
+ },
49989
+ {
49990
+ aliasModelID: "k2pb",
49991
+ ruleID: "kimi-k2pb-alias",
49992
+ canonicalModelID: "k2p5",
49993
+ rationale: "Kimi for Coding exposes k2pb while the bundled capabilities snapshot uses the canonical k2p5 ID."
49994
+ },
49995
+ {
49996
+ aliasModelID: "claude-opus-4.7",
49997
+ ruleID: "claude-opus-dotted-version-alias",
49998
+ canonicalModelID: "claude-opus-4-7",
49999
+ rationale: "GitHub Copilot exposes Claude Opus 4.7 with dotted version syntax while the snapshot uses dashed syntax."
49976
50000
  }
49977
50001
  ];
49978
50002
  EXACT_ALIAS_RULES_BY_MODEL = new Map(EXACT_ALIAS_RULES.map((rule) => [rule.aliasModelID, rule]));
@@ -50042,10 +50066,18 @@ var init_model_capability_heuristics = __esm(() => {
50042
50066
  includes: ["gemini"],
50043
50067
  variants: ["low", "medium", "high"]
50044
50068
  },
50069
+ {
50070
+ family: "kimi-thinking",
50071
+ includes: ["kimi-thinking", "k2-thinking", "k2-think"],
50072
+ pattern: /(?:kimi|k2).*-(?:thinking|think)/,
50073
+ variants: ["low", "medium", "high"],
50074
+ supportsThinking: true
50075
+ },
50045
50076
  {
50046
50077
  family: "kimi",
50047
50078
  includes: ["kimi", "k2"],
50048
- variants: ["low", "medium", "high"]
50079
+ variants: ["low", "medium", "high"],
50080
+ supportsThinking: false
50049
50081
  },
50050
50082
  {
50051
50083
  family: "glm",
@@ -50055,7 +50087,8 @@ var init_model_capability_heuristics = __esm(() => {
50055
50087
  {
50056
50088
  family: "minimax",
50057
50089
  includes: ["minimax"],
50058
- variants: ["low", "medium", "high"]
50090
+ variants: ["low", "medium", "high"],
50091
+ supportsThinking: false
50059
50092
  },
50060
50093
  {
50061
50094
  family: "deepseek",
@@ -51522,10 +51555,10 @@ var init_openai_only_model_catalog = __esm(() => {
51522
51555
  librarian: { model: "openai/gpt-5.4-mini-fast" }
51523
51556
  };
51524
51557
  OPENAI_ONLY_CATEGORY_OVERRIDES = {
51525
- artistry: { model: "openai/gpt-5.4", variant: "xhigh" },
51558
+ artistry: { model: "openai/gpt-5.5", variant: "xhigh" },
51526
51559
  quick: { model: "openai/gpt-5.4-mini" },
51527
- "visual-engineering": { model: "openai/gpt-5.4", variant: "high" },
51528
- writing: { model: "openai/gpt-5.4", variant: "medium" }
51560
+ "visual-engineering": { model: "openai/gpt-5.5", variant: "high" },
51561
+ writing: { model: "openai/gpt-5.5", variant: "medium" }
51529
51562
  };
51530
51563
  });
51531
51564
 
@@ -51848,6 +51881,30 @@ function archiveLegacyConfigFile(legacyPath) {
51848
51881
  }
51849
51882
  }
51850
51883
  }
51884
+ function migrateLegacySidecarFile(legacyPath, canonicalPath) {
51885
+ const legacySidecarPath = getSidecarPath(legacyPath);
51886
+ if (!existsSync14(legacySidecarPath))
51887
+ return true;
51888
+ const canonicalSidecarPath = getSidecarPath(canonicalPath);
51889
+ if (existsSync14(canonicalSidecarPath))
51890
+ return true;
51891
+ try {
51892
+ const content = readFileSync9(legacySidecarPath, "utf-8");
51893
+ writeFileAtomically(canonicalSidecarPath, content);
51894
+ log("[migrateLegacyConfigFile] Migrated legacy migration sidecar to canonical path", {
51895
+ from: legacySidecarPath,
51896
+ to: canonicalSidecarPath
51897
+ });
51898
+ return true;
51899
+ } catch (error) {
51900
+ log("[migrateLegacyConfigFile] Failed to migrate legacy migration sidecar", {
51901
+ legacySidecarPath,
51902
+ canonicalSidecarPath,
51903
+ error
51904
+ });
51905
+ return false;
51906
+ }
51907
+ }
51851
51908
  function migrateLegacyConfigFile(legacyPath) {
51852
51909
  if (!existsSync14(legacyPath))
51853
51910
  return false;
@@ -51859,10 +51916,12 @@ function migrateLegacyConfigFile(legacyPath) {
51859
51916
  try {
51860
51917
  const content = readFileSync9(legacyPath, "utf-8");
51861
51918
  writeFileAtomically(canonicalPath, content);
51919
+ const migratedSidecar = migrateLegacySidecarFile(legacyPath, canonicalPath);
51862
51920
  const archivedLegacyConfig = archiveLegacyConfigFile(legacyPath);
51863
51921
  log("[migrateLegacyConfigFile] Migrated legacy config to canonical path", {
51864
51922
  from: legacyPath,
51865
51923
  to: canonicalPath,
51924
+ migratedSidecar,
51866
51925
  archivedLegacyConfig
51867
51926
  });
51868
51927
  return true;
@@ -51873,6 +51932,7 @@ function migrateLegacyConfigFile(legacyPath) {
51873
51932
  }
51874
51933
  var init_migrate_legacy_config_file = __esm(() => {
51875
51934
  init_logger();
51935
+ init_migrations_sidecar();
51876
51936
  init_plugin_identity();
51877
51937
  init_write_file_atomically();
51878
51938
  });
@@ -53000,13 +53060,6 @@ function readPackageVersion(packageJsonPath) {
53000
53060
  return pkg.version ?? null;
53001
53061
  }
53002
53062
  function getCachedVersion() {
53003
- for (const candidate of INSTALLED_PACKAGE_JSON_CANDIDATES) {
53004
- try {
53005
- if (fs9.existsSync(candidate)) {
53006
- return readPackageVersion(candidate);
53007
- }
53008
- } catch {}
53009
- }
53010
53063
  try {
53011
53064
  const currentDir = path9.dirname(fileURLToPath2(import.meta.url));
53012
53065
  const pkgPath = findPackageJsonUp(currentDir);
@@ -53016,6 +53069,13 @@ function getCachedVersion() {
53016
53069
  } catch (err) {
53017
53070
  log("[auto-update-checker] Failed to resolve version from current directory:", err);
53018
53071
  }
53072
+ for (const candidate of INSTALLED_PACKAGE_JSON_CANDIDATES) {
53073
+ try {
53074
+ if (fs9.existsSync(candidate)) {
53075
+ return readPackageVersion(candidate);
53076
+ }
53077
+ } catch {}
53078
+ }
53019
53079
  try {
53020
53080
  const execDir = path9.dirname(fs9.realpathSync(process.execPath));
53021
53081
  const pkgPath = findPackageJsonUp(execDir);
@@ -53800,7 +53860,7 @@ var {
53800
53860
  // package.json
53801
53861
  var package_default = {
53802
53862
  name: "evil-omo",
53803
- version: "3.17.5",
53863
+ version: "3.17.10",
53804
53864
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
53805
53865
  main: "./dist/index.js",
53806
53866
  types: "dist/index.d.ts",
@@ -53879,17 +53939,17 @@ var package_default = {
53879
53939
  zod: "^4.3.0"
53880
53940
  },
53881
53941
  optionalDependencies: {
53882
- "evil-omo-darwin-arm64": "3.17.5",
53883
- "evil-omo-darwin-x64": "3.17.5",
53884
- "evil-omo-darwin-x64-baseline": "3.17.5",
53885
- "evil-omo-linux-x64": "3.17.5",
53886
- "evil-omo-linux-x64-baseline": "3.17.5",
53887
- "evil-omo-linux-arm64": "3.17.5",
53888
- "evil-omo-linux-x64-musl": "3.17.5",
53889
- "evil-omo-linux-x64-musl-baseline": "3.17.5",
53890
- "evil-omo-linux-arm64-musl": "3.17.5",
53891
- "evil-omo-windows-x64": "3.17.5",
53892
- "evil-omo-windows-x64-baseline": "3.17.5"
53942
+ "evil-omo-darwin-arm64": "3.17.10",
53943
+ "evil-omo-darwin-x64": "3.17.10",
53944
+ "evil-omo-darwin-x64-baseline": "3.17.10",
53945
+ "evil-omo-linux-x64": "3.17.10",
53946
+ "evil-omo-linux-x64-baseline": "3.17.10",
53947
+ "evil-omo-linux-arm64": "3.17.10",
53948
+ "evil-omo-linux-x64-musl": "3.17.10",
53949
+ "evil-omo-linux-x64-musl-baseline": "3.17.10",
53950
+ "evil-omo-linux-arm64-musl": "3.17.10",
53951
+ "evil-omo-windows-x64": "3.17.10",
53952
+ "evil-omo-windows-x64-baseline": "3.17.10"
53893
53953
  },
53894
53954
  overrides: {},
53895
53955
  trustedDependencies: [
@@ -58569,9 +58629,6 @@ function getPostHogActivityStateFilePath() {
58569
58629
  function getUtcDayString(date) {
58570
58630
  return date.toISOString().slice(0, 10);
58571
58631
  }
58572
- function getUtcHourString(date) {
58573
- return date.toISOString().slice(0, 13);
58574
- }
58575
58632
  function isPostHogActivityState(value) {
58576
58633
  return value !== null && typeof value === "object" && !Array.isArray(value);
58577
58634
  }
@@ -58611,24 +58668,24 @@ function writePostHogActivityState(nextState) {
58611
58668
  function getPostHogActivityCaptureState(now = new Date) {
58612
58669
  const state = readPostHogActivityState();
58613
58670
  const dayUTC = getUtcDayString(now);
58614
- const hourUTC = getUtcHourString(now);
58615
58671
  const captureDaily = state.lastActiveDayUTC !== dayUTC;
58616
- const captureHourly = state.lastActiveHourUTC !== hourUTC;
58617
- if (captureDaily || captureHourly) {
58672
+ if (captureDaily) {
58618
58673
  writePostHogActivityState({
58619
- lastActiveDayUTC: captureDaily ? dayUTC : state.lastActiveDayUTC,
58620
- lastActiveHourUTC: captureHourly ? hourUTC : state.lastActiveHourUTC
58674
+ ...state,
58675
+ lastActiveDayUTC: dayUTC
58621
58676
  });
58622
58677
  }
58623
58678
  return {
58624
58679
  dayUTC,
58625
- hourUTC,
58626
- captureDaily,
58627
- captureHourly
58680
+ captureDaily
58628
58681
  };
58629
58682
  }
58630
58683
 
58631
58684
  // src/shared/posthog.ts
58685
+ var activityStateProviderOverride = null;
58686
+ function resolveActivityState() {
58687
+ return (activityStateProviderOverride ?? getPostHogActivityCaptureState)();
58688
+ }
58632
58689
  var DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com";
58633
58690
  var DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74";
58634
58691
  var NO_OP_POSTHOG = {
@@ -58663,7 +58720,16 @@ function getPostHogApiKey() {
58663
58720
  function getPostHogHost() {
58664
58721
  return process.env.POSTHOG_HOST?.trim() || DEFAULT_POSTHOG_HOST;
58665
58722
  }
58723
+ function safeCpus() {
58724
+ try {
58725
+ const cpus = os3.cpus();
58726
+ return { length: cpus.length, model: cpus[0]?.model };
58727
+ } catch {
58728
+ return { length: 0, model: undefined };
58729
+ }
58730
+ }
58666
58731
  function getSharedProperties(source) {
58732
+ const cpus = safeCpus();
58667
58733
  return {
58668
58734
  platform: "evil-omo",
58669
58735
  package_name: PUBLISHED_PACKAGE_NAME,
@@ -58676,8 +58742,8 @@ function getSharedProperties(source) {
58676
58742
  $os_version: os3.release(),
58677
58743
  os_arch: os3.arch(),
58678
58744
  os_type: os3.type(),
58679
- cpu_count: os3.cpus().length,
58680
- cpu_model: os3.cpus()[0]?.model,
58745
+ cpu_count: cpus.length,
58746
+ cpu_model: cpus.model,
58681
58747
  total_memory_gb: Math.round(os3.totalmem() / 1024 / 1024 / 1024),
58682
58748
  locale: Intl.DateTimeFormat().resolvedOptions().locale,
58683
58749
  timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
@@ -58718,7 +58784,7 @@ function createPostHogClient(source, options) {
58718
58784
  });
58719
58785
  },
58720
58786
  trackActive: (distinctId, reason) => {
58721
- const activityState = getPostHogActivityCaptureState();
58787
+ const activityState = resolveActivityState();
58722
58788
  if (activityState.captureDaily) {
58723
58789
  configuredClient.capture({
58724
58790
  distinctId,
@@ -58730,17 +58796,6 @@ function createPostHogClient(source, options) {
58730
58796
  }
58731
58797
  });
58732
58798
  }
58733
- if (activityState.captureHourly) {
58734
- configuredClient.capture({
58735
- distinctId,
58736
- event: "omo_hourly_active",
58737
- properties: {
58738
- ...sharedProperties,
58739
- hour_utc: activityState.hourUTC,
58740
- reason
58741
- }
58742
- });
58743
- }
58744
58799
  },
58745
58800
  shutdown: async () => configuredClient.shutdown()
58746
58801
  };
@@ -59523,7 +59578,7 @@ async function promptInstallConfig(detected) {
59523
59578
  message: "Do you have access to OpenCode Zen (opencode/ models)?",
59524
59579
  options: [
59525
59580
  { value: "no", label: "No", hint: "Will use other configured providers" },
59526
- { value: "yes", label: "Yes", hint: "opencode/claude-opus-4-7, opencode/gpt-5.4, etc." }
59581
+ { value: "yes", label: "Yes", hint: "opencode/claude-opus-4-7, opencode/gpt-5.5, etc." }
59527
59582
  ],
59528
59583
  initialValue: initial.opencodeZen
59529
59584
  });
@@ -76525,7 +76580,7 @@ var normalizeAgentName = (agent) => {
76525
76580
  return;
76526
76581
  const configKey = getAgentConfigKey(trimmed);
76527
76582
  const displayName = getAgentDisplayName(configKey);
76528
- const runtimeName = getAgentRuntimeName(configKey);
76583
+ const runtimeName = getAgentDisplayName(configKey);
76529
76584
  const isKnownAgent = displayName !== configKey;
76530
76585
  return {
76531
76586
  configKey,
@@ -76553,12 +76608,12 @@ var resolveRunAgent = (options, pluginConfig, env = process.env) => {
76553
76608
  const configAgent = normalizeAgentName(pluginConfig.default_run_agent);
76554
76609
  const resolved = cliAgent ?? envAgent ?? configAgent ?? {
76555
76610
  configKey: DEFAULT_AGENT,
76556
- resolvedName: getAgentRuntimeName(DEFAULT_AGENT)
76611
+ resolvedName: getAgentDisplayName(DEFAULT_AGENT)
76557
76612
  };
76558
76613
  if (isAgentDisabled(resolved.configKey, pluginConfig)) {
76559
76614
  const fallback = pickFallbackAgent(pluginConfig);
76560
76615
  const fallbackDisplayName = getAgentDisplayName(fallback);
76561
- const fallbackRuntimeName = getAgentRuntimeName(fallback);
76616
+ const fallbackRuntimeName = getAgentDisplayName(fallback);
76562
76617
  const fallbackDisabled = isAgentDisabled(fallback, pluginConfig);
76563
76618
  if (fallbackDisabled) {
76564
76619
  console.log(import_picocolors12.default.yellow(`Requested agent "${resolved.resolvedName}" is disabled and no enabled core agent was found. Proceeding with "${fallbackDisplayName}".`));
@@ -78309,7 +78364,7 @@ function buildEffectiveResolution(requirement, userOverride) {
78309
78364
 
78310
78365
  // src/cli/doctor/checks/model-resolution.ts
78311
78366
  function parseProviderModel(value) {
78312
- const slashIndex = value.lastIndexOf("/");
78367
+ const slashIndex = value.indexOf("/");
78313
78368
  if (slashIndex <= 0 || slashIndex === value.length - 1) {
78314
78369
  return null;
78315
78370
  }
@@ -78363,7 +78418,7 @@ function collectCapabilityResolutionIssues(info) {
78363
78418
  const allEntries = [...info.agents, ...info.categories];
78364
78419
  const fallbackEntries = allEntries.filter((entry) => {
78365
78420
  const mode = entry.capabilityDiagnostics?.resolutionMode;
78366
- return mode === "alias-backed" || mode === "heuristic-backed" || mode === "unknown";
78421
+ return mode === "unknown";
78367
78422
  });
78368
78423
  if (fallbackEntries.length === 0) {
78369
78424
  return issues;
@@ -80236,7 +80291,7 @@ Examples:
80236
80291
  $ bunx evil-omo run --on-complete "notify-send Done" "Fix the bug"
80237
80292
  $ bunx evil-omo run --session-id ses_abc123 "Continue the work"
80238
80293
  $ bunx evil-omo run --model anthropic/claude-sonnet-4 "Fix the bug"
80239
- $ bunx evil-omo run --agent Sisyphus --model openai/gpt-5.4 "Implement feature X"
80294
+ $ bunx evil-omo run --agent Sisyphus --model openai/gpt-5.5 "Implement feature X"
80240
80295
 
80241
80296
  Agent resolution order:
80242
80297
  1) --agent flag
@@ -0,0 +1,12 @@
1
+ import type { DelegatedModelConfig } from "../../shared/model-resolution-types";
2
+ import type { BackgroundTask, BackgroundTaskAttempt, BackgroundTaskStatus } from "./types";
3
+ type TerminalAttemptStatus = Extract<BackgroundTaskStatus, "completed" | "error" | "cancelled" | "interrupt">;
4
+ export declare function getCurrentAttempt(task: BackgroundTask): BackgroundTaskAttempt | undefined;
5
+ export declare function ensureCurrentAttempt(task: BackgroundTask, model?: DelegatedModelConfig | undefined): BackgroundTaskAttempt;
6
+ export declare function projectTaskFromCurrentAttempt(task: BackgroundTask): BackgroundTask;
7
+ export declare function startAttempt(task: BackgroundTask, model: DelegatedModelConfig | undefined): BackgroundTaskAttempt;
8
+ export declare function bindAttemptSession(task: BackgroundTask, attemptID: string, sessionID: string, model: DelegatedModelConfig | undefined): BackgroundTaskAttempt | undefined;
9
+ export declare function finalizeAttempt(task: BackgroundTask, attemptID: string, status: TerminalAttemptStatus, error?: string): BackgroundTaskAttempt | undefined;
10
+ export declare function scheduleRetryAttempt(task: BackgroundTask, failedAttemptID: string, nextModel: DelegatedModelConfig, error?: string): BackgroundTaskAttempt | undefined;
11
+ export declare function findAttemptBySession(task: BackgroundTask, sessionID: string): BackgroundTaskAttempt | undefined;
12
+ export {};
@@ -1,10 +1,11 @@
1
- import type { BackgroundTaskStatus } from "./types";
1
+ import type { BackgroundTaskAttempt, BackgroundTaskStatus } from "./types";
2
2
  export type BackgroundTaskNotificationStatus = "COMPLETED" | "CANCELLED" | "INTERRUPTED" | "ERROR";
3
3
  export interface BackgroundTaskNotificationTask {
4
4
  id: string;
5
5
  description: string;
6
6
  status: BackgroundTaskStatus;
7
7
  error?: string;
8
+ attempts?: BackgroundTaskAttempt[];
8
9
  }
9
10
  export declare function buildBackgroundTaskNotificationText(input: {
10
11
  task: BackgroundTaskNotificationTask;
@@ -39,6 +39,7 @@ export interface Todo {
39
39
  id?: string;
40
40
  }
41
41
  export interface QueueItem {
42
+ attemptID: string;
42
43
  task: BackgroundTask;
43
44
  input: LaunchInput;
44
45
  }
@@ -13,4 +13,12 @@ export declare function tryFallbackRetry(args: {
13
13
  idleDeferralTimers: Map<string, ReturnType<typeof setTimeout>>;
14
14
  queuesByKey: Map<string, QueueItem[]>;
15
15
  processKey: (key: string) => void;
16
+ onRetrying?: (details: {
17
+ task: BackgroundTask;
18
+ source: string;
19
+ previousSessionID?: string;
20
+ failedModel?: string;
21
+ failedError?: string;
22
+ nextModel: string;
23
+ }) => void;
16
24
  }): Promise<boolean>;
@@ -1,4 +1,5 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
+ import type { ModelFallbackControllerAccessor } from "../../hooks/model-fallback";
2
3
  import type { BackgroundTask, LaunchInput, ResumeInput } from "./types";
3
4
  import { TaskHistory } from "./task-history";
4
5
  import type { BackgroundTaskConfig, TmuxConfig } from "../../config/schema";
@@ -22,6 +23,7 @@ export interface SubagentSessionCreatedEvent {
22
23
  export type OnSubagentSessionCreated = (event: SubagentSessionCreatedEvent) => Promise<void>;
23
24
  export declare class BackgroundManager {
24
25
  private tasks;
26
+ private tasksByParentSession;
25
27
  private notifications;
26
28
  private pendingNotifications;
27
29
  private pendingByParent;
@@ -46,6 +48,7 @@ export declare class BackgroundManager {
46
48
  private rootDescendantCounts;
47
49
  private preStartDescendantReservations;
48
50
  private enableParentSessionNotifications;
51
+ private modelFallbackControllerAccessor?;
49
52
  readonly taskHistory: TaskHistory;
50
53
  private cachedCircuitBreakerSettings?;
51
54
  constructor(ctx: PluginInput, config?: BackgroundTaskConfig, options?: {
@@ -53,6 +56,7 @@ export declare class BackgroundManager {
53
56
  onSubagentSessionCreated?: OnSubagentSessionCreated;
54
57
  onShutdown?: () => void | Promise<void>;
55
58
  enableParentSessionNotifications?: boolean;
59
+ modelFallbackControllerAccessor?: ModelFallbackControllerAccessor;
56
60
  });
57
61
  private abortSessionWithLogging;
58
62
  assertCanSpawn(parentSessionID: string): Promise<SubagentSpawnContext>;
@@ -67,6 +71,10 @@ export declare class BackgroundManager {
67
71
  private markPreStartDescendantReservation;
68
72
  private settlePreStartDescendantReservation;
69
73
  private rollbackPreStartDescendantReservation;
74
+ private addTask;
75
+ private removeTask;
76
+ private updateTaskParent;
77
+ private removeTaskFromParentIndex;
70
78
  launch(input: LaunchInput): Promise<BackgroundTask>;
71
79
  private processKey;
72
80
  private startTask;
@@ -74,6 +82,7 @@ export declare class BackgroundManager {
74
82
  getTasksByParentSession(sessionID: string): BackgroundTask[];
75
83
  getAllDescendantTasks(sessionID: string): BackgroundTask[];
76
84
  findBySession(sessionID: string): BackgroundTask | undefined;
85
+ private resolveTaskAttemptBySession;
77
86
  private getConcurrencyKeyFromInput;
78
87
  /**
79
88
  * Track a task created elsewhere (e.g., from task) for notification tracking.