evil-omo 3.17.5 → 3.17.6

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 (34) 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 +132 -79
  21. package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +1 -6
  22. package/dist/hooks/ralph-loop/session-event-handler.d.ts +2 -6
  23. package/dist/hooks/ralph-loop/types.d.ts +5 -0
  24. package/dist/index.js +2569 -366
  25. package/dist/plugin/hooks/create-core-hooks.d.ts +2 -0
  26. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -0
  27. package/dist/shared/agent-display-names.d.ts +7 -2
  28. package/dist/shared/agent-sort-shim.d.ts +28 -0
  29. package/dist/shared/file-reference-resolver.d.ts +1 -0
  30. package/dist/shared/posthog-activity-state.d.ts +5 -2
  31. package/dist/shared/posthog.d.ts +5 -0
  32. package/dist/tools/slashcommand/command-discovery-deps.d.ts +6 -0
  33. package/package.json +12 -12
  34. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
package/dist/cli/index.js CHANGED
@@ -6205,7 +6205,8 @@ var init_model_versions = __esm(() => {
6205
6205
  "anthropic/claude-opus-4-5": "anthropic/claude-opus-4-7",
6206
6206
  "anthropic/claude-opus-4-6": "anthropic/claude-opus-4-7",
6207
6207
  "anthropic/claude-sonnet-4-5": "anthropic/claude-sonnet-4-6",
6208
- "openai/gpt-5.3-codex": "openai/gpt-5.4"
6208
+ "openai/gpt-5.3-codex": "openai/gpt-5.4",
6209
+ "openai/gpt-5.4": "openai/gpt-5.5"
6209
6210
  };
6210
6211
  });
6211
6212
 
@@ -6290,12 +6291,15 @@ function migrateConfigFile(configPath, rawConfig) {
6290
6291
  const copy = JSON.parse(JSON.stringify(rawConfig));
6291
6292
  let needsWrite = false;
6292
6293
  const sidecarMigrations = readAppliedMigrations(configPath);
6293
- const inConfigMigrations = Array.isArray(copy._migrations) ? new Set(copy._migrations) : new Set;
6294
+ const inConfigMigrations = Array.isArray(copy._migrations) ? new Set(copy._migrations.filter((migration) => typeof migration === "string")) : new Set;
6295
+ const inlineAppliedMigrations = Array.isArray(copy.appliedMigrations) ? new Set(copy.appliedMigrations.filter((migration) => typeof migration === "string")) : new Set;
6294
6296
  const existingMigrations = new Set([
6295
6297
  ...sidecarMigrations,
6296
- ...inConfigMigrations
6298
+ ...inConfigMigrations,
6299
+ ...inlineAppliedMigrations
6297
6300
  ]);
6298
6301
  const hadLegacyInConfigMigrations = inConfigMigrations.size > 0;
6302
+ const hadInlineAppliedMigrations = inlineAppliedMigrations.size > 0;
6299
6303
  const allNewMigrations = [];
6300
6304
  if (copy.agents && typeof copy.agents === "object") {
6301
6305
  const { migrated, changed } = migrateAgentNames(copy.agents);
@@ -6327,11 +6331,12 @@ function migrateConfigFile(configPath, rawConfig) {
6327
6331
  ...existingMigrations,
6328
6332
  ...newMigrationsToRecord
6329
6333
  ]);
6330
- const shouldWriteSidecar = newMigrationsToRecord.length > 0 || hadLegacyInConfigMigrations;
6334
+ const shouldWriteSidecar = newMigrationsToRecord.length > 0 || hadLegacyInConfigMigrations || hadInlineAppliedMigrations;
6331
6335
  if (newMigrationsToRecord.length > 0) {
6332
6336
  needsWrite = true;
6333
6337
  }
6334
- if (hadLegacyInConfigMigrations) {
6338
+ if (hadLegacyInConfigMigrations || hadInlineAppliedMigrations) {
6339
+ delete copy.appliedMigrations;
6335
6340
  needsWrite = true;
6336
6341
  }
6337
6342
  if (shouldWriteSidecar) {
@@ -6695,11 +6700,6 @@ function stripInvisibleAgentCharacters(agentName) {
6695
6700
  function stripAgentListSortPrefix(agentName) {
6696
6701
  return stripInvisibleAgentCharacters(agentName);
6697
6702
  }
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
6703
  function getAgentDisplayName(configKey) {
6704
6704
  const exactMatch = AGENT_DISPLAY_NAMES[configKey];
6705
6705
  if (exactMatch !== undefined)
@@ -6727,7 +6727,7 @@ function getAgentConfigKey(agentName) {
6727
6727
  const lower = stripAgentListSortPrefix(agentName).trim().toLowerCase();
6728
6728
  return resolveKnownAgentConfigKey(agentName) ?? lower;
6729
6729
  }
6730
- var AGENT_DISPLAY_NAMES, AGENT_LIST_SORT_PREFIXES, INVISIBLE_AGENT_CHARACTERS_REGEX, REVERSE_DISPLAY_NAMES, LEGACY_DISPLAY_NAMES;
6730
+ var AGENT_DISPLAY_NAMES, INVISIBLE_AGENT_CHARACTERS_REGEX, REVERSE_DISPLAY_NAMES, LEGACY_DISPLAY_NAMES;
6731
6731
  var init_agent_display_names = __esm(() => {
6732
6732
  AGENT_DISPLAY_NAMES = {
6733
6733
  sisyphus: "Sisyphus - Ultraworker",
@@ -6745,12 +6745,6 @@ var init_agent_display_names = __esm(() => {
6745
6745
  "multimodal-looker": "multimodal-looker",
6746
6746
  "council-member": "council-member"
6747
6747
  };
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
6748
  INVISIBLE_AGENT_CHARACTERS_REGEX = /[\u200B\u200C\u200D\uFEFF]/g;
6755
6749
  REVERSE_DISPLAY_NAMES = Object.fromEntries(Object.entries(AGENT_DISPLAY_NAMES).map(([key, displayName]) => [displayName.toLowerCase(), key]));
6756
6750
  LEGACY_DISPLAY_NAMES = {
@@ -6790,7 +6784,7 @@ var init_model_requirements = __esm(() => {
6790
6784
  ],
6791
6785
  model: "kimi-k2.5"
6792
6786
  },
6793
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" },
6787
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
6794
6788
  { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" },
6795
6789
  { providers: ["opencode"], model: "big-pickle" }
6796
6790
  ],
@@ -6800,7 +6794,7 @@ var init_model_requirements = __esm(() => {
6800
6794
  fallbackChain: [
6801
6795
  {
6802
6796
  providers: ["openai", "github-copilot", "venice", "opencode", "vercel"],
6803
- model: "gpt-5.4",
6797
+ model: "gpt-5.5",
6804
6798
  variant: "medium"
6805
6799
  }
6806
6800
  ],
@@ -6810,7 +6804,7 @@ var init_model_requirements = __esm(() => {
6810
6804
  fallbackChain: [
6811
6805
  {
6812
6806
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6813
- model: "gpt-5.4",
6807
+ model: "gpt-5.5",
6814
6808
  variant: "high"
6815
6809
  },
6816
6810
  {
@@ -6846,7 +6840,7 @@ var init_model_requirements = __esm(() => {
6846
6840
  },
6847
6841
  "multimodal-looker": {
6848
6842
  fallbackChain: [
6849
- { providers: ["openai", "opencode", "vercel"], model: "gpt-5.4", variant: "medium" },
6843
+ { providers: ["openai", "opencode", "vercel"], model: "gpt-5.5", variant: "medium" },
6850
6844
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
6851
6845
  { providers: ["zai-coding-plan", "vercel"], model: "glm-4.6v" },
6852
6846
  { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5-nano" }
@@ -6861,7 +6855,7 @@ var init_model_requirements = __esm(() => {
6861
6855
  },
6862
6856
  {
6863
6857
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6864
- model: "gpt-5.4",
6858
+ model: "gpt-5.5",
6865
6859
  variant: "high"
6866
6860
  },
6867
6861
  { providers: ["opencode-go", "vercel"], model: "glm-5" },
@@ -6880,7 +6874,7 @@ var init_model_requirements = __esm(() => {
6880
6874
  },
6881
6875
  {
6882
6876
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6883
- model: "gpt-5.4",
6877
+ model: "gpt-5.5",
6884
6878
  variant: "high"
6885
6879
  },
6886
6880
  { providers: ["opencode-go", "vercel"], model: "glm-5" },
@@ -6891,7 +6885,7 @@ var init_model_requirements = __esm(() => {
6891
6885
  fallbackChain: [
6892
6886
  {
6893
6887
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6894
- model: "gpt-5.4",
6888
+ model: "gpt-5.5",
6895
6889
  variant: "xhigh"
6896
6890
  },
6897
6891
  {
@@ -6913,7 +6907,7 @@ var init_model_requirements = __esm(() => {
6913
6907
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
6914
6908
  {
6915
6909
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6916
- model: "gpt-5.4",
6910
+ model: "gpt-5.5",
6917
6911
  variant: "medium"
6918
6912
  },
6919
6913
  { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" }
@@ -6925,7 +6919,7 @@ var init_model_requirements = __esm(() => {
6925
6919
  { providers: ["opencode-go", "vercel"], model: "kimi-k2.5" },
6926
6920
  {
6927
6921
  providers: ["openai", "github-copilot", "opencode", "vercel"],
6928
- model: "gpt-5.4",
6922
+ model: "gpt-5.5",
6929
6923
  variant: "medium"
6930
6924
  },
6931
6925
  { providers: ["opencode-go", "vercel"], model: "minimax-m2.7" },
@@ -6955,7 +6949,7 @@ var init_model_requirements = __esm(() => {
6955
6949
  fallbackChain: [
6956
6950
  {
6957
6951
  providers: ["openai", "opencode", "vercel"],
6958
- model: "gpt-5.4",
6952
+ model: "gpt-5.5",
6959
6953
  variant: "xhigh"
6960
6954
  },
6961
6955
  {
@@ -6975,7 +6969,7 @@ var init_model_requirements = __esm(() => {
6975
6969
  fallbackChain: [
6976
6970
  {
6977
6971
  providers: ["openai", "github-copilot", "venice", "opencode", "vercel"],
6978
- model: "gpt-5.4",
6972
+ model: "gpt-5.5",
6979
6973
  variant: "medium"
6980
6974
  },
6981
6975
  {
@@ -7002,7 +6996,7 @@ var init_model_requirements = __esm(() => {
7002
6996
  model: "claude-opus-4-7",
7003
6997
  variant: "max"
7004
6998
  },
7005
- { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.4" }
6999
+ { providers: ["openai", "github-copilot", "opencode", "vercel"], model: "gpt-5.5" }
7006
7000
  ],
7007
7001
  requiresModel: "gemini-3.1-pro"
7008
7002
  },
@@ -7052,7 +7046,7 @@ var init_model_requirements = __esm(() => {
7052
7046
  },
7053
7047
  {
7054
7048
  providers: ["openai", "github-copilot", "opencode", "vercel"],
7055
- model: "gpt-5.4",
7049
+ model: "gpt-5.5",
7056
7050
  variant: "high"
7057
7051
  },
7058
7052
  { providers: ["zai-coding-plan", "opencode", "vercel"], model: "glm-5" },
@@ -49894,6 +49888,22 @@ var init_supplemental_entries = __esm(() => {
49894
49888
  input: 272000,
49895
49889
  output: 128000
49896
49890
  }
49891
+ },
49892
+ "gpt-5.5": {
49893
+ id: "gpt-5.5",
49894
+ family: "gpt",
49895
+ reasoning: true,
49896
+ temperature: false,
49897
+ toolCall: true,
49898
+ modalities: {
49899
+ input: ["text", "image", "pdf"],
49900
+ output: ["text"]
49901
+ },
49902
+ limit: {
49903
+ context: 400000,
49904
+ input: 272000,
49905
+ output: 128000
49906
+ }
49897
49907
  }
49898
49908
  };
49899
49909
  });
@@ -49973,6 +49983,18 @@ var init_model_capability_aliases = __esm(() => {
49973
49983
  ruleID: "gemini-3-pro-tier-alias",
49974
49984
  canonicalModelID: "gemini-3-pro-preview",
49975
49985
  rationale: "Legacy Gemini 3 tier suffixes still need to land on the canonical preview model."
49986
+ },
49987
+ {
49988
+ aliasModelID: "k2pb",
49989
+ ruleID: "kimi-k2pb-alias",
49990
+ canonicalModelID: "k2p5",
49991
+ rationale: "Kimi for Coding exposes k2pb while the bundled capabilities snapshot uses the canonical k2p5 ID."
49992
+ },
49993
+ {
49994
+ aliasModelID: "claude-opus-4.7",
49995
+ ruleID: "claude-opus-dotted-version-alias",
49996
+ canonicalModelID: "claude-opus-4-7",
49997
+ rationale: "GitHub Copilot exposes Claude Opus 4.7 with dotted version syntax while the snapshot uses dashed syntax."
49976
49998
  }
49977
49999
  ];
49978
50000
  EXACT_ALIAS_RULES_BY_MODEL = new Map(EXACT_ALIAS_RULES.map((rule) => [rule.aliasModelID, rule]));
@@ -50042,10 +50064,18 @@ var init_model_capability_heuristics = __esm(() => {
50042
50064
  includes: ["gemini"],
50043
50065
  variants: ["low", "medium", "high"]
50044
50066
  },
50067
+ {
50068
+ family: "kimi-thinking",
50069
+ includes: ["kimi-thinking", "k2-thinking", "k2-think"],
50070
+ pattern: /(?:kimi|k2).*-(?:thinking|think)/,
50071
+ variants: ["low", "medium", "high"],
50072
+ supportsThinking: true
50073
+ },
50045
50074
  {
50046
50075
  family: "kimi",
50047
50076
  includes: ["kimi", "k2"],
50048
- variants: ["low", "medium", "high"]
50077
+ variants: ["low", "medium", "high"],
50078
+ supportsThinking: false
50049
50079
  },
50050
50080
  {
50051
50081
  family: "glm",
@@ -50055,7 +50085,8 @@ var init_model_capability_heuristics = __esm(() => {
50055
50085
  {
50056
50086
  family: "minimax",
50057
50087
  includes: ["minimax"],
50058
- variants: ["low", "medium", "high"]
50088
+ variants: ["low", "medium", "high"],
50089
+ supportsThinking: false
50059
50090
  },
50060
50091
  {
50061
50092
  family: "deepseek",
@@ -51522,10 +51553,10 @@ var init_openai_only_model_catalog = __esm(() => {
51522
51553
  librarian: { model: "openai/gpt-5.4-mini-fast" }
51523
51554
  };
51524
51555
  OPENAI_ONLY_CATEGORY_OVERRIDES = {
51525
- artistry: { model: "openai/gpt-5.4", variant: "xhigh" },
51556
+ artistry: { model: "openai/gpt-5.5", variant: "xhigh" },
51526
51557
  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" }
51558
+ "visual-engineering": { model: "openai/gpt-5.5", variant: "high" },
51559
+ writing: { model: "openai/gpt-5.5", variant: "medium" }
51529
51560
  };
51530
51561
  });
51531
51562
 
@@ -51848,6 +51879,30 @@ function archiveLegacyConfigFile(legacyPath) {
51848
51879
  }
51849
51880
  }
51850
51881
  }
51882
+ function migrateLegacySidecarFile(legacyPath, canonicalPath) {
51883
+ const legacySidecarPath = getSidecarPath(legacyPath);
51884
+ if (!existsSync14(legacySidecarPath))
51885
+ return true;
51886
+ const canonicalSidecarPath = getSidecarPath(canonicalPath);
51887
+ if (existsSync14(canonicalSidecarPath))
51888
+ return true;
51889
+ try {
51890
+ const content = readFileSync9(legacySidecarPath, "utf-8");
51891
+ writeFileAtomically(canonicalSidecarPath, content);
51892
+ log("[migrateLegacyConfigFile] Migrated legacy migration sidecar to canonical path", {
51893
+ from: legacySidecarPath,
51894
+ to: canonicalSidecarPath
51895
+ });
51896
+ return true;
51897
+ } catch (error) {
51898
+ log("[migrateLegacyConfigFile] Failed to migrate legacy migration sidecar", {
51899
+ legacySidecarPath,
51900
+ canonicalSidecarPath,
51901
+ error
51902
+ });
51903
+ return false;
51904
+ }
51905
+ }
51851
51906
  function migrateLegacyConfigFile(legacyPath) {
51852
51907
  if (!existsSync14(legacyPath))
51853
51908
  return false;
@@ -51859,10 +51914,12 @@ function migrateLegacyConfigFile(legacyPath) {
51859
51914
  try {
51860
51915
  const content = readFileSync9(legacyPath, "utf-8");
51861
51916
  writeFileAtomically(canonicalPath, content);
51917
+ const migratedSidecar = migrateLegacySidecarFile(legacyPath, canonicalPath);
51862
51918
  const archivedLegacyConfig = archiveLegacyConfigFile(legacyPath);
51863
51919
  log("[migrateLegacyConfigFile] Migrated legacy config to canonical path", {
51864
51920
  from: legacyPath,
51865
51921
  to: canonicalPath,
51922
+ migratedSidecar,
51866
51923
  archivedLegacyConfig
51867
51924
  });
51868
51925
  return true;
@@ -51873,6 +51930,7 @@ function migrateLegacyConfigFile(legacyPath) {
51873
51930
  }
51874
51931
  var init_migrate_legacy_config_file = __esm(() => {
51875
51932
  init_logger();
51933
+ init_migrations_sidecar();
51876
51934
  init_plugin_identity();
51877
51935
  init_write_file_atomically();
51878
51936
  });
@@ -53800,7 +53858,7 @@ var {
53800
53858
  // package.json
53801
53859
  var package_default = {
53802
53860
  name: "evil-omo",
53803
- version: "3.17.5",
53861
+ version: "3.17.6",
53804
53862
  description: "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
53805
53863
  main: "./dist/index.js",
53806
53864
  types: "dist/index.d.ts",
@@ -53879,17 +53937,17 @@ var package_default = {
53879
53937
  zod: "^4.3.0"
53880
53938
  },
53881
53939
  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"
53940
+ "evil-omo-darwin-arm64": "3.17.6",
53941
+ "evil-omo-darwin-x64": "3.17.6",
53942
+ "evil-omo-darwin-x64-baseline": "3.17.6",
53943
+ "evil-omo-linux-x64": "3.17.6",
53944
+ "evil-omo-linux-x64-baseline": "3.17.6",
53945
+ "evil-omo-linux-arm64": "3.17.6",
53946
+ "evil-omo-linux-x64-musl": "3.17.6",
53947
+ "evil-omo-linux-x64-musl-baseline": "3.17.6",
53948
+ "evil-omo-linux-arm64-musl": "3.17.6",
53949
+ "evil-omo-windows-x64": "3.17.6",
53950
+ "evil-omo-windows-x64-baseline": "3.17.6"
53893
53951
  },
53894
53952
  overrides: {},
53895
53953
  trustedDependencies: [
@@ -58569,9 +58627,6 @@ function getPostHogActivityStateFilePath() {
58569
58627
  function getUtcDayString(date) {
58570
58628
  return date.toISOString().slice(0, 10);
58571
58629
  }
58572
- function getUtcHourString(date) {
58573
- return date.toISOString().slice(0, 13);
58574
- }
58575
58630
  function isPostHogActivityState(value) {
58576
58631
  return value !== null && typeof value === "object" && !Array.isArray(value);
58577
58632
  }
@@ -58611,24 +58666,24 @@ function writePostHogActivityState(nextState) {
58611
58666
  function getPostHogActivityCaptureState(now = new Date) {
58612
58667
  const state = readPostHogActivityState();
58613
58668
  const dayUTC = getUtcDayString(now);
58614
- const hourUTC = getUtcHourString(now);
58615
58669
  const captureDaily = state.lastActiveDayUTC !== dayUTC;
58616
- const captureHourly = state.lastActiveHourUTC !== hourUTC;
58617
- if (captureDaily || captureHourly) {
58670
+ if (captureDaily) {
58618
58671
  writePostHogActivityState({
58619
- lastActiveDayUTC: captureDaily ? dayUTC : state.lastActiveDayUTC,
58620
- lastActiveHourUTC: captureHourly ? hourUTC : state.lastActiveHourUTC
58672
+ ...state,
58673
+ lastActiveDayUTC: dayUTC
58621
58674
  });
58622
58675
  }
58623
58676
  return {
58624
58677
  dayUTC,
58625
- hourUTC,
58626
- captureDaily,
58627
- captureHourly
58678
+ captureDaily
58628
58679
  };
58629
58680
  }
58630
58681
 
58631
58682
  // src/shared/posthog.ts
58683
+ var activityStateProviderOverride = null;
58684
+ function resolveActivityState() {
58685
+ return (activityStateProviderOverride ?? getPostHogActivityCaptureState)();
58686
+ }
58632
58687
  var DEFAULT_POSTHOG_HOST = "https://us.i.posthog.com";
58633
58688
  var DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74";
58634
58689
  var NO_OP_POSTHOG = {
@@ -58663,7 +58718,16 @@ function getPostHogApiKey() {
58663
58718
  function getPostHogHost() {
58664
58719
  return process.env.POSTHOG_HOST?.trim() || DEFAULT_POSTHOG_HOST;
58665
58720
  }
58721
+ function safeCpus() {
58722
+ try {
58723
+ const cpus = os3.cpus();
58724
+ return { length: cpus.length, model: cpus[0]?.model };
58725
+ } catch {
58726
+ return { length: 0, model: undefined };
58727
+ }
58728
+ }
58666
58729
  function getSharedProperties(source) {
58730
+ const cpus = safeCpus();
58667
58731
  return {
58668
58732
  platform: "evil-omo",
58669
58733
  package_name: PUBLISHED_PACKAGE_NAME,
@@ -58676,8 +58740,8 @@ function getSharedProperties(source) {
58676
58740
  $os_version: os3.release(),
58677
58741
  os_arch: os3.arch(),
58678
58742
  os_type: os3.type(),
58679
- cpu_count: os3.cpus().length,
58680
- cpu_model: os3.cpus()[0]?.model,
58743
+ cpu_count: cpus.length,
58744
+ cpu_model: cpus.model,
58681
58745
  total_memory_gb: Math.round(os3.totalmem() / 1024 / 1024 / 1024),
58682
58746
  locale: Intl.DateTimeFormat().resolvedOptions().locale,
58683
58747
  timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
@@ -58718,7 +58782,7 @@ function createPostHogClient(source, options) {
58718
58782
  });
58719
58783
  },
58720
58784
  trackActive: (distinctId, reason) => {
58721
- const activityState = getPostHogActivityCaptureState();
58785
+ const activityState = resolveActivityState();
58722
58786
  if (activityState.captureDaily) {
58723
58787
  configuredClient.capture({
58724
58788
  distinctId,
@@ -58730,17 +58794,6 @@ function createPostHogClient(source, options) {
58730
58794
  }
58731
58795
  });
58732
58796
  }
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
58797
  },
58745
58798
  shutdown: async () => configuredClient.shutdown()
58746
58799
  };
@@ -59523,7 +59576,7 @@ async function promptInstallConfig(detected) {
59523
59576
  message: "Do you have access to OpenCode Zen (opencode/ models)?",
59524
59577
  options: [
59525
59578
  { 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." }
59579
+ { value: "yes", label: "Yes", hint: "opencode/claude-opus-4-7, opencode/gpt-5.5, etc." }
59527
59580
  ],
59528
59581
  initialValue: initial.opencodeZen
59529
59582
  });
@@ -76525,7 +76578,7 @@ var normalizeAgentName = (agent) => {
76525
76578
  return;
76526
76579
  const configKey = getAgentConfigKey(trimmed);
76527
76580
  const displayName = getAgentDisplayName(configKey);
76528
- const runtimeName = getAgentRuntimeName(configKey);
76581
+ const runtimeName = getAgentDisplayName(configKey);
76529
76582
  const isKnownAgent = displayName !== configKey;
76530
76583
  return {
76531
76584
  configKey,
@@ -76553,12 +76606,12 @@ var resolveRunAgent = (options, pluginConfig, env = process.env) => {
76553
76606
  const configAgent = normalizeAgentName(pluginConfig.default_run_agent);
76554
76607
  const resolved = cliAgent ?? envAgent ?? configAgent ?? {
76555
76608
  configKey: DEFAULT_AGENT,
76556
- resolvedName: getAgentRuntimeName(DEFAULT_AGENT)
76609
+ resolvedName: getAgentDisplayName(DEFAULT_AGENT)
76557
76610
  };
76558
76611
  if (isAgentDisabled(resolved.configKey, pluginConfig)) {
76559
76612
  const fallback = pickFallbackAgent(pluginConfig);
76560
76613
  const fallbackDisplayName = getAgentDisplayName(fallback);
76561
- const fallbackRuntimeName = getAgentRuntimeName(fallback);
76614
+ const fallbackRuntimeName = getAgentDisplayName(fallback);
76562
76615
  const fallbackDisabled = isAgentDisabled(fallback, pluginConfig);
76563
76616
  if (fallbackDisabled) {
76564
76617
  console.log(import_picocolors12.default.yellow(`Requested agent "${resolved.resolvedName}" is disabled and no enabled core agent was found. Proceeding with "${fallbackDisplayName}".`));
@@ -78309,7 +78362,7 @@ function buildEffectiveResolution(requirement, userOverride) {
78309
78362
 
78310
78363
  // src/cli/doctor/checks/model-resolution.ts
78311
78364
  function parseProviderModel(value) {
78312
- const slashIndex = value.lastIndexOf("/");
78365
+ const slashIndex = value.indexOf("/");
78313
78366
  if (slashIndex <= 0 || slashIndex === value.length - 1) {
78314
78367
  return null;
78315
78368
  }
@@ -78363,7 +78416,7 @@ function collectCapabilityResolutionIssues(info) {
78363
78416
  const allEntries = [...info.agents, ...info.categories];
78364
78417
  const fallbackEntries = allEntries.filter((entry) => {
78365
78418
  const mode = entry.capabilityDiagnostics?.resolutionMode;
78366
- return mode === "alias-backed" || mode === "heuristic-backed" || mode === "unknown";
78419
+ return mode === "unknown";
78367
78420
  });
78368
78421
  if (fallbackEntries.length === 0) {
78369
78422
  return issues;
@@ -80236,7 +80289,7 @@ Examples:
80236
80289
  $ bunx evil-omo run --on-complete "notify-send Done" "Fix the bug"
80237
80290
  $ bunx evil-omo run --session-id ses_abc123 "Continue the work"
80238
80291
  $ 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"
80292
+ $ bunx evil-omo run --agent Sisyphus --model openai/gpt-5.5 "Implement feature X"
80240
80293
 
80241
80294
  Agent resolution order:
80242
80295
  1) --agent flag
@@ -1,10 +1,5 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
2
  import type { RalphLoopOptions, RalphLoopState } from "./types";
3
- type SessionRecovery = {
4
- isRecovering: (sessionID: string) => boolean;
5
- markRecovering: (sessionID: string) => void;
6
- clear: (sessionID: string) => void;
7
- };
8
3
  type LoopStateController = {
9
4
  getState: () => RalphLoopState | null;
10
5
  clear: () => boolean;
@@ -19,7 +14,7 @@ type RalphLoopEventHandlerOptions = {
19
14
  apiTimeoutMs: number;
20
15
  getTranscriptPath: (sessionID: string) => string | undefined;
21
16
  checkSessionExists?: RalphLoopOptions["checkSessionExists"];
22
- sessionRecovery: SessionRecovery;
17
+ backgroundManager?: RalphLoopOptions["backgroundManager"];
23
18
  loopState: LoopStateController;
24
19
  };
25
20
  export declare function createRalphLoopEventHandler(ctx: PluginInput, options: RalphLoopEventHandlerOptions): ({ event }: {
@@ -3,10 +3,6 @@ type LoopStateController = {
3
3
  getState: () => RalphLoopState | null;
4
4
  clear: () => boolean;
5
5
  };
6
- type SessionRecovery = {
7
- clear: (sessionID: string) => void;
8
- markRecovering: (sessionID: string) => void;
9
- };
10
- export declare function handleDeletedLoopSession(props: Record<string, unknown> | undefined, loopState: LoopStateController, sessionRecovery: SessionRecovery): boolean;
11
- export declare function handleErroredLoopSession(props: Record<string, unknown> | undefined, loopState: LoopStateController, sessionRecovery: SessionRecovery): boolean;
6
+ export declare function handleDeletedLoopSession(props: Record<string, unknown> | undefined, loopState: LoopStateController): boolean;
7
+ export declare function handleErroredLoopSession(props: Record<string, unknown> | undefined, loopState: LoopStateController): boolean;
12
8
  export {};
@@ -20,4 +20,9 @@ export interface RalphLoopOptions {
20
20
  getTranscriptPath?: (sessionId: string) => string;
21
21
  apiTimeout?: number;
22
22
  checkSessionExists?: (sessionId: string) => Promise<boolean>;
23
+ backgroundManager?: {
24
+ getTasksByParentSession: (sessionId: string) => Array<{
25
+ status: string;
26
+ }>;
27
+ };
23
28
  }