evil-omo 3.17.4 → 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 (142) hide show
  1. package/README.ja.md +3 -3
  2. package/README.ko.md +3 -3
  3. package/README.ru.md +3 -3
  4. package/README.zh-cn.md +3 -3
  5. package/dist/__tests__/perf/fixtures/in-tree/packages/pkg-one/src/file-16.d.ts +1 -0
  6. package/dist/__tests__/perf/fixtures/in-tree/packages/pkg-one/src/file-17.d.ts +1 -0
  7. package/dist/__tests__/perf/fixtures/in-tree/packages/pkg-one/src/file-18.d.ts +1 -0
  8. package/dist/__tests__/perf/fixtures/in-tree/packages/pkg-one/src/file-19.d.ts +1 -0
  9. package/dist/__tests__/perf/fixtures/in-tree/packages/pkg-one/src/file-20.d.ts +1 -0
  10. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-01.d.ts +1 -0
  11. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-02.d.ts +1 -0
  12. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-03.d.ts +1 -0
  13. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-04.d.ts +1 -0
  14. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-05.d.ts +1 -0
  15. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-06.d.ts +1 -0
  16. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-07.d.ts +1 -0
  17. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-08.d.ts +1 -0
  18. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-09.d.ts +1 -0
  19. package/dist/__tests__/perf/fixtures/in-tree/src/app/file-10.d.ts +1 -0
  20. package/dist/__tests__/perf/fixtures/in-tree/src/lib/file-11.d.ts +1 -0
  21. package/dist/__tests__/perf/fixtures/in-tree/src/lib/file-12.d.ts +1 -0
  22. package/dist/__tests__/perf/fixtures/in-tree/src/lib/file-13.d.ts +1 -0
  23. package/dist/__tests__/perf/fixtures/in-tree/src/lib/file-14.d.ts +1 -0
  24. package/dist/__tests__/perf/fixtures/in-tree/src/lib/file-15.d.ts +1 -0
  25. package/dist/agents/agent-builder.d.ts +2 -3
  26. package/dist/agents/agent-skill-resolution.d.ts +7 -0
  27. package/dist/agents/atlas/default-prompt-sections.d.ts +2 -2
  28. package/dist/agents/atlas/gemini-prompt-sections.d.ts +1 -1
  29. package/dist/agents/atlas/gpt-prompt-sections.d.ts +1 -1
  30. package/dist/agents/frontier-tool-schema-guard.d.ts +3 -0
  31. package/dist/agents/hephaestus/agent.d.ts +1 -1
  32. package/dist/agents/hephaestus/gpt-5-5.d.ts +12 -0
  33. package/dist/agents/sisyphus/claude-opus-4-7.d.ts +20 -0
  34. package/dist/agents/sisyphus/gpt-5-5.d.ts +20 -0
  35. package/dist/agents/sisyphus/index.d.ts +5 -0
  36. package/dist/agents/sisyphus/kimi-k2-6.d.ts +32 -0
  37. package/dist/agents/sisyphus-junior/agent.d.ts +1 -1
  38. package/dist/agents/sisyphus-junior/gpt-5-5.d.ts +14 -0
  39. package/dist/agents/sisyphus-junior/index.d.ts +2 -0
  40. package/dist/agents/sisyphus-junior/kimi-k2-6.d.ts +13 -0
  41. package/dist/agents/types.d.ts +17 -1
  42. package/dist/cli/doctor/checks/model-resolution.d.ts +4 -0
  43. package/dist/cli/index.js +17467 -15371
  44. package/dist/config/schema/background-task.d.ts +0 -1
  45. package/dist/config/schema/evil-omo-config.d.ts +0 -1
  46. package/dist/create-hooks.d.ts +2 -0
  47. package/dist/create-managers.d.ts +2 -0
  48. package/dist/create-tools.d.ts +1 -1
  49. package/dist/evil-omo.schema.json +0 -5
  50. package/dist/features/background-agent/process-cleanup.test-helpers.d.ts +4 -0
  51. package/dist/features/background-agent/subagent-spawn-limits.d.ts +0 -7
  52. package/dist/features/claude-code-command-loader/loader-cache.d.ts +6 -0
  53. package/dist/features/claude-code-command-loader/loader.d.ts +2 -0
  54. package/dist/features/team-mode/index.d.ts +2 -0
  55. package/dist/features/team-mode/team-layout-tmux/index.d.ts +1 -0
  56. package/dist/features/team-mode/team-layout-tmux/layout.d.ts +15 -0
  57. package/dist/features/team-mode/team-worktree/cleanup.d.ts +3 -0
  58. package/dist/features/team-mode/team-worktree/index.d.ts +2 -0
  59. package/dist/features/team-mode/team-worktree/manager.d.ts +15 -0
  60. package/dist/features/team-mode/types.d.ts +210 -0
  61. package/dist/features/tmux-subagent/event-handlers.d.ts +0 -4
  62. package/dist/features/tmux-subagent/index.d.ts +0 -3
  63. package/dist/features/tmux-subagent/manager.d.ts +4 -0
  64. package/dist/features/tmux-subagent/polling-manager.d.ts +2 -1
  65. package/dist/hooks/auto-update-checker/hook/deferred-startup-check.d.ts +1 -0
  66. package/dist/hooks/comment-checker/initialization-gate.d.ts +1 -0
  67. package/dist/hooks/directory-agents-injector/finder.d.ts +1 -1
  68. package/dist/hooks/directory-readme-injector/finder.d.ts +1 -1
  69. package/dist/hooks/index.d.ts +1 -1
  70. package/dist/hooks/model-fallback/controller-accessor.d.ts +8 -0
  71. package/dist/hooks/model-fallback/fallback-state-controller.d.ts +26 -0
  72. package/dist/hooks/model-fallback/hook.d.ts +21 -16
  73. package/dist/hooks/model-fallback/index.d.ts +2 -0
  74. package/dist/hooks/preemptive-compaction-trigger.d.ts +13 -0
  75. package/dist/hooks/preemptive-compaction-types.d.ts +53 -0
  76. package/dist/hooks/preemptive-compaction.d.ts +3 -15
  77. package/dist/hooks/ralph-loop/ralph-loop-event-handler.d.ts +1 -6
  78. package/dist/hooks/ralph-loop/session-event-handler.d.ts +2 -6
  79. package/dist/hooks/ralph-loop/types.d.ts +5 -0
  80. package/dist/hooks/rules-injector/cache.d.ts +5 -0
  81. package/dist/hooks/rules-injector/injector.d.ts +2 -0
  82. package/dist/hooks/rules-injector/project-root-finder.d.ts +1 -0
  83. package/dist/hooks/rules-injector/rule-file-finder.d.ts +2 -19
  84. package/dist/hooks/rules-injector/rule-scan-cache.d.ts +6 -0
  85. package/dist/hooks/session-notification-event-properties.d.ts +5 -0
  86. package/dist/hooks/session-notification-init.d.ts +7 -0
  87. package/dist/hooks/todo-continuation-enforcer/session-state.d.ts +1 -0
  88. package/dist/hooks/write-existing-file-guard/tool-execute-before-handler.d.ts +1 -1
  89. package/dist/index.d.ts +3 -3
  90. package/dist/index.js +52213 -73189
  91. package/dist/plugin/hooks/create-core-hooks.d.ts +4 -0
  92. package/dist/plugin/hooks/create-session-hooks.d.ts +4 -0
  93. package/dist/plugin/tool-registry.d.ts +1 -1
  94. package/dist/shared/agent-display-names.d.ts +7 -2
  95. package/dist/shared/agent-sort-shim.d.ts +28 -0
  96. package/dist/shared/excluded-dirs.d.ts +1 -0
  97. package/dist/shared/file-reference-resolver.d.ts +1 -0
  98. package/dist/shared/index.d.ts +2 -0
  99. package/dist/shared/jsonc-parser.d.ts +8 -5
  100. package/dist/shared/load-opencode-plugins.d.ts +1 -0
  101. package/dist/shared/migration/migrations-sidecar.d.ts +1 -1
  102. package/dist/shared/model-capabilities/supplemental-entries.d.ts +2 -0
  103. package/dist/shared/permission-compat.d.ts +1 -1
  104. package/dist/shared/posthog-activity-state.d.ts +5 -2
  105. package/dist/shared/posthog.d.ts +5 -0
  106. package/dist/shared/project-discovery-dirs.d.ts +2 -0
  107. package/dist/shared/ripgrep-cli.d.ts +8 -0
  108. package/dist/shared/tmux/tmux-utils/index.d.ts +1 -0
  109. package/dist/shared/tmux/tmux-utils/session-kill.d.ts +1 -0
  110. package/dist/shared/tmux/tmux-utils/session-spawn.d.ts +1 -0
  111. package/dist/shared/tmux/tmux-utils/spawn-process.d.ts +1 -0
  112. package/dist/shared/tmux/tmux-utils/stale-session-sweep.d.ts +11 -0
  113. package/dist/shared/tmux/tmux-utils.d.ts +3 -1
  114. package/dist/tools/ast-grep/pattern-hints.d.ts +4 -0
  115. package/dist/tools/ast-grep/tool-descriptions.d.ts +3 -0
  116. package/dist/tools/call-omo-agent/sync-executor.d.ts +2 -3
  117. package/dist/tools/call-omo-agent/tools.d.ts +2 -1
  118. package/dist/tools/delegate-task/background-continuation.d.ts +1 -1
  119. package/dist/tools/delegate-task/executor-types.d.ts +2 -0
  120. package/dist/tools/delegate-task/resolve-metadata-model.d.ts +9 -0
  121. package/dist/tools/delegate-task/sync-continuation.d.ts +2 -2
  122. package/dist/tools/delegate-task/task-id.d.ts +2 -0
  123. package/dist/tools/delegate-task/tool-argument-preparation.d.ts +2 -0
  124. package/dist/tools/delegate-task/tool-description.d.ts +9 -0
  125. package/dist/tools/delegate-task/types.d.ts +4 -5
  126. package/dist/tools/glob/constants.d.ts +1 -1
  127. package/dist/tools/grep/cli.d.ts +1 -1
  128. package/dist/tools/grep/constants.d.ts +0 -8
  129. package/dist/tools/look-at/look-at-input-preparer.d.ts +22 -0
  130. package/dist/tools/look-at/look-at-prompt.d.ts +2 -0
  131. package/dist/tools/look-at/look-at-session-runner.d.ts +12 -0
  132. package/dist/tools/skill/description-formatter.d.ts +1 -1
  133. package/dist/tools/skill/session-skill-cache.d.ts +1 -0
  134. package/dist/tools/skill-mcp/parse-skill-mcp-arguments.d.ts +1 -0
  135. package/dist/tools/slashcommand/command-discovery-deps.d.ts +6 -0
  136. package/package.json +20 -17
  137. package/dist/features/tmux-subagent/cleanup.d.ts +0 -9
  138. package/dist/features/tmux-subagent/session-created-handler.d.ts +0 -22
  139. package/dist/features/tmux-subagent/session-deleted-handler.d.ts +0 -15
  140. package/dist/hooks/ralph-loop/loop-session-recovery.d.ts +0 -7
  141. package/dist/plugin-dispose.d.ts +0 -13
  142. /package/dist/{tools/delegate-task → shared}/model-string-parser.d.ts +0 -0
@@ -4,7 +4,6 @@ export declare const BackgroundTaskConfigSchema: z.ZodObject<{
4
4
  providerConcurrency: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
5
5
  modelConcurrency: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
6
6
  maxDepth: z.ZodOptional<z.ZodNumber>;
7
- maxDescendants: z.ZodOptional<z.ZodNumber>;
8
7
  staleTimeoutMs: z.ZodOptional<z.ZodNumber>;
9
8
  messageStalenessTimeoutMs: z.ZodOptional<z.ZodNumber>;
10
9
  taskTtlMs: z.ZodOptional<z.ZodNumber>;
@@ -1996,7 +1996,6 @@ export declare const OhMyOpenCodeConfigSchema: z.ZodObject<{
1996
1996
  providerConcurrency: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
1997
1997
  modelConcurrency: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
1998
1998
  maxDepth: z.ZodOptional<z.ZodNumber>;
1999
- maxDescendants: z.ZodOptional<z.ZodNumber>;
2000
1999
  staleTimeoutMs: z.ZodOptional<z.ZodNumber>;
2001
2000
  messageStalenessTimeoutMs: z.ZodOptional<z.ZodNumber>;
2002
2001
  taskTtlMs: z.ZodOptional<z.ZodNumber>;
@@ -2,6 +2,7 @@ import type { AvailableSkill } from "./agents/dynamic-agent-prompt-builder";
2
2
  import type { HookName, OhMyOpenCodeConfig } from "./config";
3
3
  import type { LoadedSkill } from "./features/opencode-skill-loader/types";
4
4
  import type { BackgroundManager } from "./features/background-agent";
5
+ import type { ModelFallbackControllerAccessor } from "./hooks/model-fallback";
5
6
  import type { PluginContext } from "./plugin/types";
6
7
  import type { ModelCacheState } from "./plugin-state";
7
8
  export type CreatedHooks = ReturnType<typeof createHooks>;
@@ -22,6 +23,7 @@ export declare function createHooks(args: {
22
23
  pluginConfig: OhMyOpenCodeConfig;
23
24
  modelCacheState: ModelCacheState;
24
25
  backgroundManager: BackgroundManager;
26
+ modelFallbackControllerAccessor?: ModelFallbackControllerAccessor;
25
27
  isHookEnabled: (hookName: HookName) => boolean;
26
28
  safeHookEnabled: boolean;
27
29
  mergedSkills: LoadedSkill[];
@@ -8,6 +8,7 @@ import { TmuxSessionManager } from "./features/tmux-subagent";
8
8
  import { registerManagerForCleanup } from "./features/background-agent/process-cleanup";
9
9
  import { createConfigHandler } from "./plugin-handlers";
10
10
  import { markServerRunningInProcess } from "./shared/tmux/tmux-utils/server-health";
11
+ import type { ModelFallbackControllerAccessor } from "./hooks/model-fallback";
11
12
  type CreateManagersDeps = {
12
13
  BackgroundManagerClass: typeof BackgroundManager;
13
14
  SkillMcpManagerClass: typeof SkillMcpManager;
@@ -22,6 +23,7 @@ export type Managers = {
22
23
  backgroundManager: BackgroundManager;
23
24
  skillMcpManager: SkillMcpManager;
24
25
  configHandler: ReturnType<typeof createConfigHandler>;
26
+ modelFallbackControllerAccessor: ModelFallbackControllerAccessor;
25
27
  };
26
28
  export declare function createManagers(args: {
27
29
  ctx: PluginContext;
@@ -16,6 +16,6 @@ type CreateToolsResult = {
16
16
  export declare function createTools(args: {
17
17
  ctx: PluginContext;
18
18
  pluginConfig: OhMyOpenCodeConfig;
19
- managers: Pick<Managers, "backgroundManager" | "tmuxSessionManager" | "skillMcpManager">;
19
+ managers: Pick<Managers, "backgroundManager" | "tmuxSessionManager" | "skillMcpManager" | "modelFallbackControllerAccessor">;
20
20
  }): Promise<CreateToolsResult>;
21
21
  export {};
@@ -5638,11 +5638,6 @@
5638
5638
  "minimum": 1,
5639
5639
  "maximum": 9007199254740991
5640
5640
  },
5641
- "maxDescendants": {
5642
- "type": "integer",
5643
- "minimum": 1,
5644
- "maximum": 9007199254740991
5645
- },
5646
5641
  "staleTimeoutMs": {
5647
5642
  "type": "number",
5648
5643
  "minimum": 60000
@@ -0,0 +1,4 @@
1
+ type ProcessCleanupEvent = NodeJS.Signals | "beforeExit" | "exit" | "uncaughtException" | "unhandledRejection";
2
+ export declare function getNewListener(signal: ProcessCleanupEvent, existingListeners: Function[]): () => void;
3
+ export declare function flushMicrotasks(): Promise<void>;
4
+ export {};
@@ -1,14 +1,12 @@
1
1
  import type { BackgroundTaskConfig } from "../../config/schema";
2
2
  import type { OpencodeClient } from "./constants";
3
3
  export declare const DEFAULT_MAX_SUBAGENT_DEPTH = 3;
4
- export declare const DEFAULT_MAX_ROOT_SESSION_SPAWN_BUDGET = 50;
5
4
  export interface SubagentSpawnContext {
6
5
  rootSessionID: string;
7
6
  parentDepth: number;
8
7
  childDepth: number;
9
8
  }
10
9
  export declare function getMaxSubagentDepth(config?: BackgroundTaskConfig): number;
11
- export declare function getMaxRootSessionSpawnBudget(config?: BackgroundTaskConfig): number;
12
10
  export declare function resolveSubagentSpawnContext(client: OpencodeClient, parentSessionID: string, directory?: string): Promise<SubagentSpawnContext>;
13
11
  export declare function createSubagentDepthLimitError(input: {
14
12
  childDepth: number;
@@ -16,8 +14,3 @@ export declare function createSubagentDepthLimitError(input: {
16
14
  parentSessionID: string;
17
15
  rootSessionID: string;
18
16
  }): Error;
19
- export declare function createSubagentDescendantLimitError(input: {
20
- rootSessionID: string;
21
- descendantCount: number;
22
- maxDescendants: number;
23
- }): Error;
@@ -0,0 +1,6 @@
1
+ import type { CommandDefinition } from "./types";
2
+ export declare function getCommandLoaderCacheKey(directory?: string): Promise<string>;
3
+ export declare function getCachedCommands(cacheKey: string): Promise<Record<string, CommandDefinition>> | undefined;
4
+ export declare function setCachedCommands(cacheKey: string, commands: Promise<Record<string, CommandDefinition>>): void;
5
+ export declare function deleteCachedCommands(cacheKey: string): void;
6
+ export declare function clearCommandLoaderCache(): void;
@@ -1,4 +1,6 @@
1
+ import { clearCommandLoaderCache } from "./loader-cache";
1
2
  import type { CommandDefinition } from "./types";
3
+ export { clearCommandLoaderCache };
2
4
  export declare function loadUserCommands(): Promise<Record<string, CommandDefinition>>;
3
5
  export declare function loadProjectCommands(directory?: string): Promise<Record<string, CommandDefinition>>;
4
6
  export declare function loadOpencodeGlobalCommands(): Promise<Record<string, CommandDefinition>>;
@@ -0,0 +1,2 @@
1
+ export * from "./types";
2
+ export * from "./team-worktree";
@@ -0,0 +1 @@
1
+ export { canVisualize, createTeamLayout, removeTeamLayout } from "./layout";
@@ -0,0 +1,15 @@
1
+ import type { TmuxSessionManager } from "../../tmux-subagent/manager";
2
+ type TeamLayoutMember = {
3
+ name: string;
4
+ sessionId: string;
5
+ color?: string;
6
+ };
7
+ type TeamLayoutResult = {
8
+ focusWindowId: string;
9
+ gridWindowId: string;
10
+ panesByMember: Record<string, string>;
11
+ };
12
+ export declare function canVisualize(): boolean;
13
+ export declare function createTeamLayout(teamRunId: string, members: Array<TeamLayoutMember>, tmuxMgr: TmuxSessionManager): Promise<TeamLayoutResult | null>;
14
+ export declare function removeTeamLayout(teamRunId: string, tmuxMgr: TmuxSessionManager): Promise<void>;
15
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { TeamModeConfig } from "./manager";
2
+ export declare function removeWorktree(worktreePath: string): Promise<void>;
3
+ export declare function findOrphanWorktrees(baseDir: string, _config: TeamModeConfig): Promise<string[]>;
@@ -0,0 +1,2 @@
1
+ export { GitUnavailableError, createWorktree, isGitAvailable, validateWorktreeSpec } from "./manager";
2
+ export { findOrphanWorktrees, removeWorktree } from "./cleanup";
@@ -0,0 +1,15 @@
1
+ export type TeamModeConfig = {
2
+ worktreeBaseDir?: string;
3
+ };
4
+ export declare class GitUnavailableError extends Error {
5
+ constructor();
6
+ }
7
+ declare function runGit(args: string[], cwd?: string): Promise<{
8
+ code: number;
9
+ stderr: string;
10
+ }>;
11
+ export declare function setGitCommandRunnerForTests(runner: typeof runGit): void;
12
+ export declare function isGitAvailable(): Promise<boolean>;
13
+ export declare function validateWorktreeSpec(spec: string): void;
14
+ export declare function createWorktree(repoRoot: string, _teamRunId: string, _memberName: string, worktreePath: string, _config: TeamModeConfig): Promise<string>;
15
+ export {};
@@ -0,0 +1,210 @@
1
+ import { z } from "zod";
2
+ export declare const MESSAGE_KINDS: readonly ["message", "shutdown_request", "shutdown_approved", "shutdown_rejected", "announcement"];
3
+ export declare const MEMBER_KINDS: readonly ["category", "subagent_type"];
4
+ export declare const TASK_STATUSES: readonly ["pending", "claimed", "in_progress", "completed", "deleted"];
5
+ export declare const RUNTIME_STATUSES: readonly ["creating", "active", "shutdown_requested", "deleting", "deleted", "failed", "orphaned"];
6
+ export declare const CategoryMemberSchema: z.ZodObject<{
7
+ name: z.ZodString;
8
+ cwd: z.ZodOptional<z.ZodString>;
9
+ worktreePath: z.ZodOptional<z.ZodString>;
10
+ subscriptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
11
+ backendType: z.ZodDefault<z.ZodEnum<{
12
+ tmux: "tmux";
13
+ "in-process": "in-process";
14
+ }>>;
15
+ color: z.ZodOptional<z.ZodString>;
16
+ isActive: z.ZodDefault<z.ZodBoolean>;
17
+ kind: z.ZodLiteral<"category">;
18
+ category: z.ZodString;
19
+ prompt: z.ZodString;
20
+ }, z.core.$strict>;
21
+ export declare const SubagentMemberSchema: z.ZodObject<{
22
+ name: z.ZodString;
23
+ cwd: z.ZodOptional<z.ZodString>;
24
+ worktreePath: z.ZodOptional<z.ZodString>;
25
+ subscriptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
26
+ backendType: z.ZodDefault<z.ZodEnum<{
27
+ tmux: "tmux";
28
+ "in-process": "in-process";
29
+ }>>;
30
+ color: z.ZodOptional<z.ZodString>;
31
+ isActive: z.ZodDefault<z.ZodBoolean>;
32
+ kind: z.ZodLiteral<"subagent_type">;
33
+ subagent_type: z.ZodString;
34
+ prompt: z.ZodOptional<z.ZodString>;
35
+ }, z.core.$strict>;
36
+ export declare const MemberSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
37
+ name: z.ZodString;
38
+ cwd: z.ZodOptional<z.ZodString>;
39
+ worktreePath: z.ZodOptional<z.ZodString>;
40
+ subscriptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
41
+ backendType: z.ZodDefault<z.ZodEnum<{
42
+ tmux: "tmux";
43
+ "in-process": "in-process";
44
+ }>>;
45
+ color: z.ZodOptional<z.ZodString>;
46
+ isActive: z.ZodDefault<z.ZodBoolean>;
47
+ kind: z.ZodLiteral<"category">;
48
+ category: z.ZodString;
49
+ prompt: z.ZodString;
50
+ }, z.core.$strict>, z.ZodObject<{
51
+ name: z.ZodString;
52
+ cwd: z.ZodOptional<z.ZodString>;
53
+ worktreePath: z.ZodOptional<z.ZodString>;
54
+ subscriptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
+ backendType: z.ZodDefault<z.ZodEnum<{
56
+ tmux: "tmux";
57
+ "in-process": "in-process";
58
+ }>>;
59
+ color: z.ZodOptional<z.ZodString>;
60
+ isActive: z.ZodDefault<z.ZodBoolean>;
61
+ kind: z.ZodLiteral<"subagent_type">;
62
+ subagent_type: z.ZodString;
63
+ prompt: z.ZodOptional<z.ZodString>;
64
+ }, z.core.$strict>], "kind">;
65
+ export declare const TeamSpecSchema: z.ZodObject<{
66
+ version: z.ZodLiteral<1>;
67
+ name: z.ZodString;
68
+ description: z.ZodOptional<z.ZodString>;
69
+ createdAt: z.ZodNumber;
70
+ leadAgentId: z.ZodString;
71
+ teamAllowedPaths: z.ZodOptional<z.ZodArray<z.ZodString>>;
72
+ sessionPermission: z.ZodOptional<z.ZodString>;
73
+ members: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
74
+ name: z.ZodString;
75
+ cwd: z.ZodOptional<z.ZodString>;
76
+ worktreePath: z.ZodOptional<z.ZodString>;
77
+ subscriptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
78
+ backendType: z.ZodDefault<z.ZodEnum<{
79
+ tmux: "tmux";
80
+ "in-process": "in-process";
81
+ }>>;
82
+ color: z.ZodOptional<z.ZodString>;
83
+ isActive: z.ZodDefault<z.ZodBoolean>;
84
+ kind: z.ZodLiteral<"category">;
85
+ category: z.ZodString;
86
+ prompt: z.ZodString;
87
+ }, z.core.$strict>, z.ZodObject<{
88
+ name: z.ZodString;
89
+ cwd: z.ZodOptional<z.ZodString>;
90
+ worktreePath: z.ZodOptional<z.ZodString>;
91
+ subscriptions: z.ZodOptional<z.ZodArray<z.ZodString>>;
92
+ backendType: z.ZodDefault<z.ZodEnum<{
93
+ tmux: "tmux";
94
+ "in-process": "in-process";
95
+ }>>;
96
+ color: z.ZodOptional<z.ZodString>;
97
+ isActive: z.ZodDefault<z.ZodBoolean>;
98
+ kind: z.ZodLiteral<"subagent_type">;
99
+ subagent_type: z.ZodString;
100
+ prompt: z.ZodOptional<z.ZodString>;
101
+ }, z.core.$strict>], "kind">>;
102
+ }, z.core.$strip>;
103
+ export declare const MessageSchema: z.ZodObject<{
104
+ version: z.ZodLiteral<1>;
105
+ messageId: z.ZodString;
106
+ from: z.ZodString;
107
+ to: z.ZodString;
108
+ kind: z.ZodEnum<{
109
+ message: "message";
110
+ shutdown_request: "shutdown_request";
111
+ shutdown_approved: "shutdown_approved";
112
+ shutdown_rejected: "shutdown_rejected";
113
+ announcement: "announcement";
114
+ }>;
115
+ body: z.ZodString;
116
+ summary: z.ZodOptional<z.ZodString>;
117
+ references: z.ZodOptional<z.ZodArray<z.ZodObject<{
118
+ path: z.ZodString;
119
+ description: z.ZodOptional<z.ZodString>;
120
+ }, z.core.$strict>>>;
121
+ timestamp: z.ZodNumber;
122
+ correlationId: z.ZodOptional<z.ZodString>;
123
+ color: z.ZodOptional<z.ZodString>;
124
+ }, z.core.$strip>;
125
+ export declare const TaskSchema: z.ZodObject<{
126
+ version: z.ZodLiteral<1>;
127
+ id: z.ZodString;
128
+ subject: z.ZodString;
129
+ description: z.ZodString;
130
+ activeForm: z.ZodOptional<z.ZodString>;
131
+ status: z.ZodEnum<{
132
+ pending: "pending";
133
+ in_progress: "in_progress";
134
+ completed: "completed";
135
+ deleted: "deleted";
136
+ claimed: "claimed";
137
+ }>;
138
+ owner: z.ZodOptional<z.ZodString>;
139
+ blocks: z.ZodDefault<z.ZodArray<z.ZodString>>;
140
+ blockedBy: z.ZodDefault<z.ZodArray<z.ZodString>>;
141
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
142
+ createdAt: z.ZodNumber;
143
+ updatedAt: z.ZodNumber;
144
+ claimedAt: z.ZodOptional<z.ZodNumber>;
145
+ }, z.core.$strip>;
146
+ export declare const RuntimeStateSchema: z.ZodObject<{
147
+ version: z.ZodLiteral<1>;
148
+ teamRunId: z.ZodString;
149
+ teamName: z.ZodString;
150
+ specSource: z.ZodEnum<{
151
+ user: "user";
152
+ project: "project";
153
+ }>;
154
+ createdAt: z.ZodNumber;
155
+ status: z.ZodEnum<{
156
+ deleted: "deleted";
157
+ failed: "failed";
158
+ active: "active";
159
+ creating: "creating";
160
+ shutdown_requested: "shutdown_requested";
161
+ deleting: "deleting";
162
+ orphaned: "orphaned";
163
+ }>;
164
+ leadSessionId: z.ZodOptional<z.ZodString>;
165
+ members: z.ZodArray<z.ZodObject<{
166
+ name: z.ZodString;
167
+ sessionId: z.ZodOptional<z.ZodString>;
168
+ tmuxPaneId: z.ZodOptional<z.ZodString>;
169
+ agentType: z.ZodEnum<{
170
+ leader: "leader";
171
+ "general-purpose": "general-purpose";
172
+ }>;
173
+ status: z.ZodEnum<{
174
+ pending: "pending";
175
+ completed: "completed";
176
+ running: "running";
177
+ idle: "idle";
178
+ errored: "errored";
179
+ shutdown_approved: "shutdown_approved";
180
+ }>;
181
+ color: z.ZodOptional<z.ZodString>;
182
+ worktreePath: z.ZodOptional<z.ZodString>;
183
+ lastInjectedTurnMarker: z.ZodOptional<z.ZodString>;
184
+ pendingInjectedMessageIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
185
+ }, z.core.$strict>>;
186
+ shutdownRequests: z.ZodDefault<z.ZodArray<z.ZodObject<{
187
+ memberId: z.ZodString;
188
+ requestedAt: z.ZodNumber;
189
+ approvedAt: z.ZodOptional<z.ZodNumber>;
190
+ rejectedReason: z.ZodOptional<z.ZodString>;
191
+ }, z.core.$strict>>>;
192
+ bounds: z.ZodObject<{
193
+ maxMembers: z.ZodDefault<z.ZodNumber>;
194
+ maxParallelMembers: z.ZodDefault<z.ZodNumber>;
195
+ maxMessagesPerRun: z.ZodDefault<z.ZodNumber>;
196
+ maxWallClockMinutes: z.ZodDefault<z.ZodNumber>;
197
+ maxMemberTurns: z.ZodDefault<z.ZodNumber>;
198
+ }, z.core.$strict>;
199
+ }, z.core.$strip>;
200
+ export declare const AGENT_ELIGIBILITY_REGISTRY: Readonly<Record<string, {
201
+ verdict: "eligible" | "conditional" | "hard-reject";
202
+ rejectionMessage?: string;
203
+ }>>;
204
+ export type TeamSpec = z.infer<typeof TeamSpecSchema>;
205
+ export type Member = z.infer<typeof MemberSchema>;
206
+ export type CategoryMember = z.infer<typeof CategoryMemberSchema>;
207
+ export type SubagentMember = z.infer<typeof SubagentMemberSchema>;
208
+ export type Message = z.infer<typeof MessageSchema>;
209
+ export type Task = z.infer<typeof TaskSchema>;
210
+ export type RuntimeState = z.infer<typeof RuntimeStateSchema>;
@@ -1,6 +1,2 @@
1
1
  export { coerceSessionCreatedEvent } from "./session-created-event";
2
2
  export type { SessionCreatedEvent } from "./session-created-event";
3
- export { handleSessionCreated } from "./session-created-handler";
4
- export type { SessionCreatedHandlerDeps } from "./session-created-handler";
5
- export { handleSessionDeleted } from "./session-deleted-handler";
6
- export type { SessionDeletedHandlerDeps } from "./session-deleted-handler";
@@ -1,10 +1,7 @@
1
1
  export * from "./manager";
2
2
  export * from "./event-handlers";
3
3
  export * from "./polling";
4
- export * from "./cleanup";
5
4
  export * from "./session-created-event";
6
- export * from "./session-created-handler";
7
- export * from "./session-deleted-handler";
8
5
  export * from "./polling-constants";
9
6
  export * from "./session-status-parser";
10
7
  export * from "./session-message-count";
@@ -32,6 +32,8 @@ export declare class TmuxSessionManager {
32
32
  private isolatedContainerPaneId;
33
33
  private isolatedWindowPaneId;
34
34
  private isolatedContainerNullStateCount;
35
+ private staleSweepCompleted;
36
+ private staleSweepInProgress;
35
37
  constructor(ctx: PluginInput, tmuxConfig: TmuxConfig, deps?: TmuxUtilDeps);
36
38
  private isEnabled;
37
39
  private isIsolated;
@@ -54,6 +56,7 @@ export declare class TmuxSessionManager {
54
56
  private startDeferredAttachLoop;
55
57
  private stopDeferredAttachLoop;
56
58
  private tryAttachDeferredSession;
59
+ private logSessionReadinessInBackground;
57
60
  private waitForSessionReady;
58
61
  onSessionCreated(event: SessionCreatedEvent): Promise<void>;
59
62
  private enqueueSpawn;
@@ -72,5 +75,6 @@ export declare class TmuxSessionManager {
72
75
  };
73
76
  }) => Promise<void>;
74
77
  cleanup(): Promise<void>;
78
+ private sweepStaleIsolatedSessionsOnce;
75
79
  }
76
80
  export {};
@@ -4,9 +4,10 @@ export declare class TmuxPollingManager {
4
4
  private client;
5
5
  private sessions;
6
6
  private closeSessionById;
7
+ private retryPendingCloses?;
7
8
  private pollInterval?;
8
9
  private pollingInFlight;
9
- constructor(client: OpencodeClient, sessions: Map<string, TrackedSession>, closeSessionById: (sessionId: string) => Promise<void>);
10
+ constructor(client: OpencodeClient, sessions: Map<string, TrackedSession>, closeSessionById: (sessionId: string) => Promise<void>, retryPendingCloses?: (() => Promise<void>) | undefined);
10
11
  handleEvent(event: {
11
12
  type: string;
12
13
  properties?: Record<string, unknown>;
@@ -0,0 +1 @@
1
+ export declare function scheduleDeferredStartupCheck(runCheck: () => void): void;
@@ -0,0 +1 @@
1
+ export declare function ensureCommentCheckerInitialization(initializer: () => void): void;
@@ -2,4 +2,4 @@ export declare function resolveFilePath(rootDirectory: string, path: string): st
2
2
  export declare function findAgentsMdUp(input: {
3
3
  startDir: string;
4
4
  rootDir: string;
5
- }): string[];
5
+ }): Promise<string[]>;
@@ -2,4 +2,4 @@ export declare function resolveFilePath(rootDirectory: string, path: string): st
2
2
  export declare function findReadmeMdUp(input: {
3
3
  startDir: string;
4
4
  rootDir: string;
5
- }): string[];
5
+ }): Promise<string[]>;
@@ -13,7 +13,7 @@ export { createDirectoryReadmeInjectorHook } from "./directory-readme-injector";
13
13
  export { createEmptyTaskResponseDetectorHook } from "./empty-task-response-detector";
14
14
  export { createAnthropicContextWindowLimitRecoveryHook, type AnthropicContextWindowLimitRecoveryOptions } from "./anthropic-context-window-limit-recovery";
15
15
  export { createThinkModeHook } from "./think-mode";
16
- export { createModelFallbackHook, setPendingModelFallback, clearPendingModelFallback, type ModelFallbackState } from "./model-fallback/hook";
16
+ export { createModelFallbackHook, setPendingModelFallback, clearPendingModelFallback, type ModelFallbackHook, type ModelFallbackState, } from "./model-fallback/hook";
17
17
  export { createClaudeCodeHooksHook } from "./claude-code-hooks";
18
18
  export { createRulesInjectorHook } from "./rules-injector";
19
19
  export { createBackgroundNotificationHook } from "./background-notification";
@@ -0,0 +1,8 @@
1
+ import type { FallbackEntry } from "../../shared/model-requirements";
2
+ import type { ModelFallbackStateController } from "./fallback-state-controller";
3
+ export type ModelFallbackControllerAccessor = {
4
+ register: (controller: ModelFallbackStateController) => void;
5
+ setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void;
6
+ clearSessionFallbackChain: (sessionID: string) => void;
7
+ };
8
+ export declare function createModelFallbackControllerAccessor(): ModelFallbackControllerAccessor;
@@ -0,0 +1,26 @@
1
+ import type { FallbackEntry } from "../../shared/model-requirements";
2
+ import { getNextReachableFallback } from "./next-fallback";
3
+ type ModelFallbackStateLike = {
4
+ providerID: string;
5
+ modelID: string;
6
+ fallbackChain: FallbackEntry[];
7
+ attemptCount: number;
8
+ pending: boolean;
9
+ };
10
+ export type ModelFallbackStateController = {
11
+ lastToastKey: Map<string, string>;
12
+ setSessionFallbackChain: (sessionID: string, fallbackChain: FallbackEntry[] | undefined) => void;
13
+ clearSessionFallbackChain: (sessionID: string) => void;
14
+ setPendingModelFallback: (sessionID: string, agentName: string, currentProviderID: string, currentModelID: string) => boolean;
15
+ getNextFallback: (sessionID: string) => ReturnType<typeof getNextReachableFallback>;
16
+ clearPendingModelFallback: (sessionID: string) => void;
17
+ hasPendingModelFallback: (sessionID: string) => boolean;
18
+ getFallbackState: (sessionID: string) => ModelFallbackStateLike | undefined;
19
+ reset: () => void;
20
+ };
21
+ export declare function createModelFallbackStateController(input: {
22
+ pendingModelFallbacks: Map<string, ModelFallbackStateLike>;
23
+ lastToastKey: Map<string, string>;
24
+ sessionFallbackChains: Map<string, FallbackEntry[]>;
25
+ }): ModelFallbackStateController;
26
+ export {};
@@ -1,5 +1,7 @@
1
1
  import type { FallbackEntry } from "../../shared/model-requirements";
2
2
  import type { ChatMessageInput, ChatMessageHandlerOutput } from "../../plugin/chat-message";
3
+ import { type ModelFallbackStateController } from "./fallback-state-controller";
4
+ import type { ModelFallbackControllerAccessor } from "./controller-accessor";
3
5
  type FallbackToast = (input: {
4
6
  title: string;
5
7
  message: string;
@@ -19,18 +21,27 @@ export type ModelFallbackState = {
19
21
  attemptCount: number;
20
22
  pending: boolean;
21
23
  };
22
- export declare function setSessionFallbackChain(sessionID: string, fallbackChain: FallbackEntry[] | undefined): void;
23
- export declare function clearSessionFallbackChain(sessionID: string): void;
24
+ type ModelFallbackControllerWithState = Pick<ModelFallbackStateController, "lastToastKey" | "setSessionFallbackChain" | "clearSessionFallbackChain" | "setPendingModelFallback" | "getNextFallback" | "clearPendingModelFallback" | "hasPendingModelFallback" | "getFallbackState" | "reset">;
25
+ export type ModelFallbackHook = ModelFallbackControllerWithState & {
26
+ "chat.message": (input: ChatMessageInput, output: ChatMessageHandlerOutput) => Promise<void>;
27
+ };
28
+ type ModelFallbackHookArgs = {
29
+ toast?: FallbackToast;
30
+ onApplied?: FallbackCallback;
31
+ controllerAccessor?: ModelFallbackControllerAccessor;
32
+ };
33
+ export declare function setSessionFallbackChain(controller: Pick<ModelFallbackStateController, "setSessionFallbackChain">, sessionID: string, fallbackChain: FallbackEntry[] | undefined): void;
34
+ export declare function clearSessionFallbackChain(controller: Pick<ModelFallbackStateController, "clearSessionFallbackChain">, sessionID: string): void;
24
35
  /**
25
36
  * Sets a pending model fallback for a session.
26
37
  * Called when a model error is detected in session.error handler.
27
38
  */
28
- export declare function setPendingModelFallback(sessionID: string, agentName: string, currentProviderID: string, currentModelID: string): boolean;
39
+ export declare function setPendingModelFallback(controller: Pick<ModelFallbackStateController, "setPendingModelFallback">, sessionID: string, agentName: string, currentProviderID: string, currentModelID: string): boolean;
29
40
  /**
30
41
  * Gets the next fallback model for a session.
31
42
  * Increments attemptCount each time called.
32
43
  */
33
- export declare function getNextFallback(sessionID: string): {
44
+ export declare function getNextFallback(controller: Pick<ModelFallbackStateController, "getNextFallback">, sessionID: string): {
34
45
  providerID: string;
35
46
  modelID: string;
36
47
  variant?: string;
@@ -39,27 +50,21 @@ export declare function getNextFallback(sessionID: string): {
39
50
  * Clears the pending fallback for a session.
40
51
  * Called after fallback is successfully applied.
41
52
  */
42
- export declare function clearPendingModelFallback(sessionID: string): void;
53
+ export declare function clearPendingModelFallback(controller: Pick<ModelFallbackStateController, "clearPendingModelFallback">, sessionID: string): void;
43
54
  /**
44
55
  * Checks if there's a pending fallback for a session.
45
56
  */
46
- export declare function hasPendingModelFallback(sessionID: string): boolean;
57
+ export declare function hasPendingModelFallback(controller: Pick<ModelFallbackStateController, "hasPendingModelFallback">, sessionID: string): boolean;
47
58
  /**
48
59
  * Gets the current fallback state for a session (for debugging).
49
60
  */
50
- export declare function getFallbackState(sessionID: string): ModelFallbackState | undefined;
61
+ export declare function getFallbackState(controller: Pick<ModelFallbackStateController, "getFallbackState">, sessionID: string): ModelFallbackState | undefined;
51
62
  /**
52
63
  * Creates a chat.message hook that applies model fallbacks when pending.
53
64
  */
54
- export declare function createModelFallbackHook(args?: {
55
- toast?: FallbackToast;
56
- onApplied?: FallbackCallback;
57
- }): {
58
- "chat.message": (input: ChatMessageInput, output: ChatMessageHandlerOutput) => Promise<void>;
59
- };
65
+ export declare function createModelFallbackHook(args?: ModelFallbackHookArgs): ModelFallbackHook;
60
66
  /**
61
- * Resets all module-global state for testing.
62
- * Clears pending fallbacks, toast keys, and session chains.
67
+ * Resets hook-owned state for testing.
63
68
  */
64
- export declare function _resetForTesting(): void;
69
+ export declare function _resetForTesting(controller?: Pick<ModelFallbackStateController, "reset">): void;
65
70
  export {};
@@ -0,0 +1,2 @@
1
+ export { createModelFallbackControllerAccessor } from "./controller-accessor";
2
+ export type { ModelFallbackControllerAccessor } from "./controller-accessor";
@@ -0,0 +1,13 @@
1
+ import type { OhMyOpenCodeConfig } from "../config";
2
+ import { type ContextLimitModelCacheState } from "../shared/context-limit-resolver";
3
+ import type { CachedCompactionState, PreemptiveCompactionContext } from "./preemptive-compaction-types";
4
+ export declare function runPreemptiveCompactionIfNeeded(args: {
5
+ ctx: PreemptiveCompactionContext;
6
+ pluginConfig: OhMyOpenCodeConfig;
7
+ modelCacheState?: ContextLimitModelCacheState;
8
+ sessionID: string;
9
+ tokenCache: Map<string, CachedCompactionState>;
10
+ compactionInProgress: Set<string>;
11
+ compactedSessions: Set<string>;
12
+ lastCompactionTime: Map<string, number>;
13
+ }): Promise<void>;