oh-my-opencode 3.14.0 → 3.15.1

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 (221) hide show
  1. package/README.md +14 -6
  2. package/bin/oh-my-opencode.js +11 -0
  3. package/bin/platform.js +13 -13
  4. package/bin/platform.test.ts +15 -0
  5. package/dist/agents/atlas/agent.d.ts +1 -1
  6. package/dist/agents/atlas/default-prompt-sections.d.ts +6 -0
  7. package/dist/agents/atlas/default.d.ts +0 -9
  8. package/dist/agents/atlas/gemini-prompt-sections.d.ts +6 -0
  9. package/dist/agents/atlas/gemini.d.ts +0 -9
  10. package/dist/agents/atlas/gpt-prompt-sections.d.ts +6 -0
  11. package/dist/agents/atlas/gpt.d.ts +0 -9
  12. package/dist/agents/atlas/shared-prompt.d.ts +9 -0
  13. package/dist/agents/dynamic-agent-category-skills-guide.d.ts +2 -0
  14. package/dist/agents/dynamic-agent-core-sections.d.ts +10 -0
  15. package/dist/agents/dynamic-agent-policy-sections.d.ts +6 -0
  16. package/dist/agents/dynamic-agent-prompt-builder.d.ts +5 -35
  17. package/dist/agents/dynamic-agent-prompt-types.d.ts +20 -0
  18. package/dist/agents/dynamic-agent-tool-categorization.d.ts +3 -0
  19. package/dist/agents/hephaestus/agent.d.ts +1 -1
  20. package/dist/agents/hephaestus/gpt-5-3-codex.d.ts +1 -1
  21. package/dist/agents/hephaestus/gpt.d.ts +1 -1
  22. package/dist/agents/momus.d.ts +2 -2
  23. package/dist/agents/prometheus/behavioral-summary.d.ts +1 -1
  24. package/dist/agents/prometheus/identity-constraints.d.ts +1 -1
  25. package/dist/agents/prometheus/plan-generation.d.ts +1 -1
  26. package/dist/agents/prometheus/plan-template.d.ts +1 -1
  27. package/dist/agents/sisyphus/gpt-5-4.d.ts +14 -14
  28. package/dist/agents/sisyphus/index.d.ts +1 -1
  29. package/dist/agents/sisyphus.d.ts +1 -1
  30. package/dist/agents/types.d.ts +1 -0
  31. package/dist/cli/index.js +832 -500
  32. package/dist/cli/mcp-oauth/login.d.ts +6 -1
  33. package/dist/cli/run/event-state.d.ts +0 -2
  34. package/dist/cli/run/types.d.ts +0 -1
  35. package/dist/config/schema/agent-names.d.ts +2 -0
  36. package/dist/config/schema/agent-overrides.d.ts +330 -15
  37. package/dist/config/schema/background-task.d.ts +2 -0
  38. package/dist/config/schema/categories.d.ts +44 -2
  39. package/dist/config/schema/commands.d.ts +1 -0
  40. package/dist/config/schema/experimental.d.ts +1 -0
  41. package/dist/config/schema/fallback-models.d.ts +67 -1
  42. package/dist/config/schema/hooks.d.ts +3 -0
  43. package/dist/config/schema/oh-my-opencode-config.d.ts +344 -16
  44. package/dist/config/schema/sisyphus-agent.d.ts +1 -0
  45. package/dist/config/schema/tmux.d.ts +11 -0
  46. package/dist/create-hooks.d.ts +6 -0
  47. package/dist/create-runtime-tmux-config.d.ts +9 -0
  48. package/dist/features/background-agent/abort-with-timeout.d.ts +2 -0
  49. package/dist/features/background-agent/background-task-notification-template.d.ts +10 -4
  50. package/dist/features/background-agent/constants.d.ts +1 -0
  51. package/dist/features/background-agent/fallback-retry-handler.d.ts +1 -1
  52. package/dist/features/background-agent/manager.d.ts +10 -0
  53. package/dist/features/background-agent/process-cleanup.d.ts +1 -1
  54. package/dist/features/background-agent/session-existence.d.ts +3 -0
  55. package/dist/features/background-agent/task-poller.d.ts +1 -0
  56. package/dist/features/background-agent/types.d.ts +2 -0
  57. package/dist/features/builtin-commands/commands.d.ts +4 -1
  58. package/dist/features/builtin-commands/templates/handoff.d.ts +1 -1
  59. package/dist/features/builtin-commands/templates/init-deep.d.ts +1 -1
  60. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -0
  61. package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
  62. package/dist/features/builtin-commands/types.d.ts +1 -1
  63. package/dist/features/builtin-skills/skills/ai-slop-remover.d.ts +2 -0
  64. package/dist/features/builtin-skills/skills/git-master-sections/commit-workflow.d.ts +1 -0
  65. package/dist/features/builtin-skills/skills/git-master-sections/history-search-workflow.d.ts +1 -0
  66. package/dist/features/builtin-skills/skills/git-master-sections/overview.d.ts +1 -0
  67. package/dist/features/builtin-skills/skills/git-master-sections/quick-reference.d.ts +1 -0
  68. package/dist/features/builtin-skills/skills/git-master-sections/rebase-workflow.d.ts +1 -0
  69. package/dist/features/builtin-skills/skills/index.d.ts +2 -0
  70. package/dist/features/builtin-skills/skills/playwright-cli.d.ts +1 -1
  71. package/dist/features/builtin-skills/skills/review-work.d.ts +2 -0
  72. package/dist/features/claude-code-mcp-loader/configure-allowed-env-vars.d.ts +5 -0
  73. package/dist/features/claude-code-mcp-loader/index.d.ts +1 -0
  74. package/dist/features/claude-code-mcp-loader/scope-filter.d.ts +2 -0
  75. package/dist/features/claude-code-mcp-loader/types.d.ts +8 -4
  76. package/dist/features/claude-code-session-state/state.d.ts +2 -0
  77. package/dist/features/context-injector/collector.d.ts +1 -0
  78. package/dist/features/opencode-skill-loader/async-loader.d.ts +2 -2
  79. package/dist/features/skill-mcp-manager/manager.d.ts +4 -1
  80. package/dist/features/skill-mcp-manager/oauth-handler.d.ts +5 -4
  81. package/dist/features/skill-mcp-manager/types.d.ts +7 -0
  82. package/dist/features/tmux-subagent/manager.d.ts +15 -13
  83. package/dist/features/tmux-subagent/polling-manager.d.ts +5 -0
  84. package/dist/features/tmux-subagent/types.d.ts +2 -0
  85. package/dist/hooks/agent-usage-reminder/constants.d.ts +1 -1
  86. package/dist/hooks/anthropic-context-window-limit-recovery/message-builder.d.ts +4 -1
  87. package/dist/hooks/anthropic-context-window-limit-recovery/recovery-hook.d.ts +10 -0
  88. package/dist/hooks/anthropic-context-window-limit-recovery/recovery-hook.test-support.d.ts +29 -0
  89. package/dist/hooks/anthropic-context-window-limit-recovery/session-timeout-map.d.ts +2 -0
  90. package/dist/hooks/anthropic-context-window-limit-recovery/state.d.ts +2 -0
  91. package/dist/hooks/anthropic-context-window-limit-recovery/types.d.ts +1 -0
  92. package/dist/hooks/atlas/subagent-session-id.d.ts +1 -0
  93. package/dist/hooks/atlas/system-reminder-templates.d.ts +2 -2
  94. package/dist/hooks/auto-slash-command/executor.d.ts +1 -0
  95. package/dist/hooks/auto-slash-command/hook.d.ts +1 -0
  96. package/dist/hooks/auto-update-checker/checker/sync-package-json.d.ts +1 -1
  97. package/dist/hooks/auto-update-checker/constants.d.ts +3 -2
  98. package/dist/hooks/auto-update-checker/hook/background-update-check.d.ts +29 -1
  99. package/dist/hooks/bash-file-read-guard.d.ts +2 -0
  100. package/dist/hooks/claude-code-hooks/claude-code-hooks-hook.d.ts +1 -0
  101. package/dist/hooks/claude-code-hooks/config-loader.d.ts +1 -0
  102. package/dist/hooks/claude-code-hooks/config.d.ts +1 -0
  103. package/dist/hooks/claude-code-hooks/handlers/session-event-handler.d.ts +3 -1
  104. package/dist/hooks/claude-code-hooks/session-hook-state.d.ts +1 -0
  105. package/dist/hooks/claude-code-hooks/tool-input-cache.d.ts +2 -0
  106. package/dist/hooks/claude-code-hooks/transcript.d.ts +1 -3
  107. package/dist/hooks/comment-checker/hook.d.ts +1 -0
  108. package/dist/hooks/comment-checker/pending-calls.d.ts +1 -0
  109. package/dist/hooks/index.d.ts +3 -0
  110. package/dist/hooks/keyword-detector/ultrawork/default.d.ts +1 -1
  111. package/dist/hooks/keyword-detector/ultrawork/gemini.d.ts +1 -1
  112. package/dist/hooks/keyword-detector/ultrawork/gpt.d.ts +1 -1
  113. package/dist/hooks/legacy-plugin-toast/auto-migrate-runner.d.ts +2 -0
  114. package/dist/hooks/legacy-plugin-toast/auto-migrate.d.ts +7 -0
  115. package/dist/hooks/legacy-plugin-toast/hook.d.ts +18 -0
  116. package/dist/hooks/legacy-plugin-toast/index.d.ts +1 -0
  117. package/dist/hooks/legacy-plugin-toast/plugin-entry-migrator.d.ts +1 -0
  118. package/dist/hooks/model-fallback/chat-message-fallback-handler.d.ts +23 -0
  119. package/dist/hooks/model-fallback/next-fallback.d.ts +6 -0
  120. package/dist/hooks/ralph-loop/completion-promise-detector-test-input.d.ts +11 -0
  121. package/dist/hooks/rules-injector/constants.d.ts +1 -0
  122. package/dist/hooks/rules-injector/finder.d.ts +1 -1
  123. package/dist/hooks/rules-injector/hook.d.ts +2 -0
  124. package/dist/hooks/rules-injector/injector.d.ts +2 -0
  125. package/dist/hooks/rules-injector/rule-file-finder.d.ts +9 -1
  126. package/dist/hooks/runtime-fallback/fallback-models.d.ts +1 -1
  127. package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +5 -1
  128. package/dist/hooks/start-work/context-info-builder.d.ts +12 -0
  129. package/dist/hooks/start-work/start-work-hook.d.ts +6 -0
  130. package/dist/hooks/start-work/worktree-block.d.ts +1 -0
  131. package/dist/hooks/todo-continuation-enforcer/resolve-message-info.d.ts +2 -2
  132. package/dist/hooks/todo-continuation-enforcer/session-state.d.ts +4 -3
  133. package/dist/hooks/todo-continuation-enforcer/types.d.ts +7 -0
  134. package/dist/hooks/todo-description-override/description.d.ts +1 -1
  135. package/dist/hooks/tool-pair-validator/hook.d.ts +28 -0
  136. package/dist/hooks/tool-pair-validator/index.d.ts +1 -0
  137. package/dist/hooks/write-existing-file-guard/hook.d.ts +12 -0
  138. package/dist/hooks/write-existing-file-guard/session-read-permissions.d.ts +3 -0
  139. package/dist/hooks/write-existing-file-guard/tool-execute-before-handler.d.ts +15 -0
  140. package/dist/index.js +9660 -5056
  141. package/dist/mcp/websearch.d.ts +2 -2
  142. package/dist/oh-my-opencode.schema.json +1052 -3
  143. package/dist/openclaw/dispatcher.d.ts +6 -0
  144. package/dist/plugin/command-execute-before.d.ts +17 -0
  145. package/dist/plugin/hooks/create-core-hooks.d.ts +3 -0
  146. package/dist/plugin/hooks/create-session-hooks.d.ts +2 -1
  147. package/dist/plugin/hooks/create-tool-guard-hooks.d.ts +2 -1
  148. package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -1
  149. package/dist/plugin/tool-registry.d.ts +1 -0
  150. package/dist/plugin/types.d.ts +1 -0
  151. package/dist/plugin-dispose.d.ts +3 -0
  152. package/dist/shared/agent-display-names.d.ts +8 -0
  153. package/dist/shared/archive-entry-validator.d.ts +6 -0
  154. package/dist/shared/background-output-consumption.d.ts +5 -0
  155. package/dist/shared/connected-providers-cache.d.ts +2 -1
  156. package/dist/shared/contains-path.d.ts +2 -0
  157. package/dist/shared/external-plugin-detector.d.ts +14 -0
  158. package/dist/shared/index.d.ts +3 -0
  159. package/dist/shared/is-abort-error.d.ts +1 -0
  160. package/dist/shared/json-file-cache-store.d.ts +16 -0
  161. package/dist/shared/jsonc-parser.d.ts +1 -0
  162. package/dist/shared/legacy-plugin-warning.d.ts +1 -0
  163. package/dist/shared/load-opencode-plugins.d.ts +1 -0
  164. package/dist/shared/log-legacy-plugin-startup-warning.d.ts +10 -1
  165. package/dist/shared/migrate-legacy-config-file.d.ts +1 -0
  166. package/dist/shared/migrate-legacy-plugin-entry.d.ts +1 -0
  167. package/dist/shared/model-capabilities/bundled-snapshot.d.ts +2 -0
  168. package/dist/shared/model-capabilities/get-model-capabilities.d.ts +2 -0
  169. package/dist/shared/model-capabilities/index.d.ts +3 -0
  170. package/dist/shared/model-capabilities/runtime-model-readers.d.ts +11 -0
  171. package/dist/shared/{model-capabilities.d.ts → model-capabilities/types.d.ts} +35 -32
  172. package/dist/shared/model-suggestion-retry.d.ts +0 -9
  173. package/dist/shared/plugin-entry-migrator.d.ts +3 -0
  174. package/dist/shared/session-category-registry.d.ts +0 -24
  175. package/dist/shared/session-cursor.d.ts +6 -0
  176. package/dist/shared/skill-path-resolver.d.ts +0 -8
  177. package/dist/shared/task-system-enabled.d.ts +6 -0
  178. package/dist/shared/tmux/tmux-utils/server-health.d.ts +1 -0
  179. package/dist/shared/tmux/tmux-utils/session-spawn.d.ts +3 -0
  180. package/dist/shared/tmux/tmux-utils/window-spawn.d.ts +3 -0
  181. package/dist/shared/tmux/tmux-utils.d.ts +3 -1
  182. package/dist/shared/write-file-atomically.d.ts +1 -0
  183. package/dist/shared/zip-entry-listing/powershell-zip-entry-listing.d.ts +4 -0
  184. package/dist/shared/zip-entry-listing/python-zip-entry-listing.d.ts +3 -0
  185. package/dist/shared/zip-entry-listing/read-zip-symlink-target.d.ts +1 -0
  186. package/dist/shared/zip-entry-listing/tar-zip-entry-listing.d.ts +3 -0
  187. package/dist/shared/zip-entry-listing/zipinfo-zip-entry-listing.d.ts +4 -0
  188. package/dist/shared/zip-entry-listing.d.ts +4 -0
  189. package/dist/tools/call-omo-agent/background-executor.d.ts +2 -1
  190. package/dist/tools/call-omo-agent/sync-executor.d.ts +2 -1
  191. package/dist/tools/delegate-task/anthropic-categories.d.ts +2 -0
  192. package/dist/tools/delegate-task/builtin-categories.d.ts +4 -0
  193. package/dist/tools/delegate-task/builtin-category-definition.d.ts +7 -0
  194. package/dist/tools/delegate-task/constants.d.ts +1 -12
  195. package/dist/tools/delegate-task/executor-types.d.ts +2 -1
  196. package/dist/tools/delegate-task/google-categories.d.ts +2 -0
  197. package/dist/tools/delegate-task/kimi-categories.d.ts +2 -0
  198. package/dist/tools/delegate-task/openai-categories.d.ts +2 -0
  199. package/dist/tools/delegate-task/prompt-builder.d.ts +1 -1
  200. package/dist/tools/delegate-task/sync-prompt-sender.d.ts +2 -0
  201. package/dist/tools/delegate-task/types.d.ts +2 -1
  202. package/dist/tools/grep/cli.d.ts +3 -2
  203. package/dist/tools/grep/constants.d.ts +1 -2
  204. package/dist/tools/hashline-edit/tool-description.d.ts +1 -1
  205. package/dist/tools/look-at/constants.d.ts +1 -1
  206. package/dist/tools/lsp/infer-extension.d.ts +1 -0
  207. package/dist/tools/session-manager/file-storage.d.ts +8 -0
  208. package/dist/tools/session-manager/sdk-storage.d.ts +8 -0
  209. package/dist/tools/session-manager/sdk-unavailable.d.ts +1 -0
  210. package/dist/tools/session-manager/storage.d.ts +1 -1
  211. package/dist/tools/skill/description-formatter.d.ts +3 -0
  212. package/dist/tools/skill/mcp-capability-formatter.d.ts +3 -0
  213. package/dist/tools/skill/native-skills.d.ts +12 -0
  214. package/dist/tools/skill/scope-priority.d.ts +4 -0
  215. package/dist/tools/skill/skill-body.d.ts +2 -0
  216. package/dist/tools/skill/skill-matcher.d.ts +5 -0
  217. package/dist/tools/skill/types.d.ts +30 -2
  218. package/dist/tools/skill-mcp/tools.d.ts +1 -1
  219. package/package.json +14 -14
  220. package/postinstall.mjs +12 -0
  221. package/dist/hooks/openclaw.d.ts +0 -11
@@ -9,6 +9,6 @@ export declare function getFallbackModelsForSession(sessionID: string, agent: st
9
9
  /**
10
10
  * Returns the raw fallback model entries (strings and objects) for a session.
11
11
  * Use this when per-model settings (temperature, reasoningEffort, etc.) must be
12
- * preserved e.g. before passing to buildFallbackChainFromModels.
12
+ * preserved - e.g. before passing to buildFallbackChainFromModels.
13
13
  */
14
14
  export declare function getRawFallbackModels(sessionID: string, agent: string | undefined, pluginConfig: OhMyOpenCodeConfig | undefined): (string | FallbackModelObject)[] | undefined;
@@ -1,7 +1,11 @@
1
- export declare function buildRetryModelPayload(model: string): {
1
+ export declare function buildRetryModelPayload(model: string, agentSettings?: {
2
+ variant?: string;
3
+ reasoningEffort?: string;
4
+ }): {
2
5
  model: {
3
6
  providerID: string;
4
7
  modelID: string;
5
8
  };
6
9
  variant?: string;
10
+ reasoningEffort?: string;
7
11
  } | undefined;
@@ -0,0 +1,12 @@
1
+ import { readBoulderState } from "../../features/boulder-state";
2
+ import type { PluginInput } from "@opencode-ai/plugin";
3
+ export declare function buildStartWorkContextInfo(params: {
4
+ ctx: PluginInput;
5
+ explicitPlanName: string | null;
6
+ existingState: ReturnType<typeof readBoulderState>;
7
+ sessionId: string;
8
+ timestamp: string;
9
+ activeAgent: string;
10
+ worktreePath: string | undefined;
11
+ worktreeBlock: string;
12
+ }): string;
@@ -4,6 +4,11 @@ interface StartWorkHookInput {
4
4
  sessionID: string;
5
5
  messageID?: string;
6
6
  }
7
+ interface StartWorkCommandExecuteBeforeInput {
8
+ sessionID: string;
9
+ command: string;
10
+ arguments: string;
11
+ }
7
12
  interface StartWorkHookOutput {
8
13
  message?: Record<string, unknown>;
9
14
  parts: Array<{
@@ -13,5 +18,6 @@ interface StartWorkHookOutput {
13
18
  }
14
19
  export declare function createStartWorkHook(ctx: PluginInput): {
15
20
  "chat.message": (input: StartWorkHookInput, output: StartWorkHookOutput) => Promise<void>;
21
+ "command.execute.before": (input: StartWorkCommandExecuteBeforeInput, output: StartWorkHookOutput) => Promise<void>;
16
22
  };
17
23
  export {};
@@ -0,0 +1 @@
1
+ export declare function createWorktreeActiveBlock(worktreePath: string): string;
@@ -1,3 +1,3 @@
1
1
  import type { PluginInput } from "@opencode-ai/plugin";
2
- import type { ResolveLatestMessageInfoResult } from "./types";
3
- export declare function resolveLatestMessageInfo(ctx: PluginInput, sessionID: string): Promise<ResolveLatestMessageInfoResult>;
2
+ import type { MessageWithInfo, ResolveLatestMessageInfoResult } from "./types";
3
+ export declare function resolveLatestMessageInfo(ctx: PluginInput, sessionID: string, prefetchedMessages?: MessageWithInfo[]): Promise<ResolveLatestMessageInfoResult>;
@@ -1,15 +1,16 @@
1
- import type { SessionState, Todo } from "./types";
1
+ import type { ContinuationProgressOptions, SessionState, Todo } from "./types";
2
2
  export interface ContinuationProgressUpdate {
3
3
  previousIncompleteCount?: number;
4
4
  previousStagnationCount: number;
5
5
  stagnationCount: number;
6
6
  hasProgressed: boolean;
7
- progressSource: "none" | "todo";
7
+ progressSource: "none" | "todo" | "activity";
8
8
  }
9
9
  export interface SessionStateStore {
10
10
  getState: (sessionID: string) => SessionState;
11
11
  getExistingState: (sessionID: string) => SessionState | undefined;
12
- trackContinuationProgress: (sessionID: string, incompleteCount: number, todos?: Todo[]) => ContinuationProgressUpdate;
12
+ recordActivity: (sessionID: string) => void;
13
+ trackContinuationProgress: (sessionID: string, incompleteCount: number, todos?: Todo[], options?: ContinuationProgressOptions) => ContinuationProgressUpdate;
13
14
  resetContinuationProgress: (sessionID: string) => void;
14
15
  cancelCountdown: (sessionID: string) => void;
15
16
  cleanup: (sessionID: string) => void;
@@ -27,6 +27,7 @@ export interface SessionState {
27
27
  countdownTimer?: ReturnType<typeof setTimeout>;
28
28
  countdownInterval?: ReturnType<typeof setInterval>;
29
29
  isRecovering?: boolean;
30
+ wasCancelled?: boolean;
30
31
  countdownStartedAt?: number;
31
32
  abortDetectedAt?: number;
32
33
  lastIncompleteCount?: number;
@@ -55,6 +56,9 @@ export interface MessageInfo {
55
56
  modelID?: string;
56
57
  tools?: Record<string, ToolPermission>;
57
58
  }
59
+ export interface MessageWithInfo {
60
+ info?: MessageInfo;
61
+ }
58
62
  export interface ResolvedMessageInfo {
59
63
  agent?: string;
60
64
  model?: {
@@ -67,3 +71,6 @@ export interface ResolveLatestMessageInfoResult {
67
71
  resolvedInfo?: ResolvedMessageInfo;
68
72
  encounteredCompaction: boolean;
69
73
  }
74
+ export interface ContinuationProgressOptions {
75
+ allowActivityProgress?: boolean;
76
+ }
@@ -1 +1 @@
1
- export declare const TODOWRITE_DESCRIPTION = "Use this tool to create and manage a structured task list for tracking progress on multi-step work.\n\n## Todo Format (MANDATORY)\n\nEach todo title MUST encode four elements: WHERE, WHY, HOW, and EXPECTED RESULT.\n\nFormat: \"[WHERE] [HOW] to [WHY] \u2014 expect [RESULT]\"\n\nGOOD:\n- \"src/utils/validation.ts: Add validateEmail() for input sanitization \u2014 returns boolean\"\n- \"UserService.create(): Call validateEmail() before DB insert \u2014 rejects invalid emails with 400\"\n- \"validation.test.ts: Add test for missing @ sign \u2014 expect validateEmail('foo') to return false\"\n\nBAD:\n- \"Implement email validation\" (where? how? what result?)\n- \"Add dark mode\" (this is a feature, not a todo)\n- \"Fix auth\" (what file? what changes? what's expected?)\n\n## Granularity Rules\n\nEach todo MUST be a single atomic action completable in 1-3 tool calls. If it needs more, split it.\n\n**Size test**: Can you complete this todo by editing one file or running one command? If not, it's too big.\n\n## Task Management\n- One in_progress at a time. Complete it before starting the next.\n- Mark completed immediately after finishing each item.\n- Skip this tool for single trivial tasks (one-step, obvious action).";
1
+ export declare const TODOWRITE_DESCRIPTION = "Use this tool to create and manage a structured task list for tracking progress on multi-step work.\n\n## Todo Format (MANDATORY)\n\nEach todo title MUST encode four elements: WHERE, WHY, HOW, and EXPECTED RESULT.\n\nFormat: \"[WHERE] [HOW] to [WHY] - expect [RESULT]\"\n\nGOOD:\n- \"src/utils/validation.ts: Add validateEmail() for input sanitization - returns boolean\"\n- \"UserService.create(): Call validateEmail() before DB insert - rejects invalid emails with 400\"\n- \"validation.test.ts: Add test for missing @ sign - expect validateEmail('foo') to return false\"\n\nBAD:\n- \"Implement email validation\" (where? how? what result?)\n- \"Add dark mode\" (feature, not a todo)\n- \"Fix auth\" (what file? what changes? what's expected?)\n\n## Granularity Rules\n\nEach todo MUST be a single atomic action completable in 1-3 tool calls. If it needs more, split it.\n\n**Size test**: Can you complete this todo by editing one file or running one command? If not, it's too big.\n\n## Task Management\n- One in_progress at a time. Complete it before starting the next.\n- Mark completed immediately after finishing each item.\n- Skip this tool for single trivial tasks (one-step, obvious action).";
@@ -0,0 +1,28 @@
1
+ import type { Message, Part } from "@opencode-ai/sdk";
2
+ type ToolUsePart = {
3
+ type: "tool_use";
4
+ id: string;
5
+ [key: string]: unknown;
6
+ };
7
+ type ToolResultPart = {
8
+ type: "tool_result";
9
+ tool_use_id: string;
10
+ content: string;
11
+ [key: string]: unknown;
12
+ };
13
+ type TransformPart = Part | ToolUsePart | ToolResultPart;
14
+ type TransformMessageInfo = Message | {
15
+ role: "user";
16
+ sessionID?: string;
17
+ };
18
+ interface MessageWithParts {
19
+ info: TransformMessageInfo;
20
+ parts: TransformPart[];
21
+ }
22
+ type MessagesTransformHook = {
23
+ "experimental.chat.messages.transform"?: (input: Record<string, never>, output: {
24
+ messages: MessageWithParts[];
25
+ }) => Promise<void>;
26
+ };
27
+ export declare function createToolPairValidatorHook(): MessagesTransformHook;
28
+ export {};
@@ -0,0 +1 @@
1
+ export { createToolPairValidatorHook } from "./hook";
@@ -1,3 +1,15 @@
1
1
  import type { Hooks, PluginInput } from "@opencode-ai/plugin";
2
+ export type GuardArgs = {
3
+ filePath?: string;
4
+ path?: string;
5
+ file_path?: string;
6
+ overwrite?: boolean | string;
7
+ };
2
8
  export declare const MAX_TRACKED_PATHS_PER_SESSION = 1024;
9
+ export declare function asRecord(value: unknown): Record<string, unknown> | undefined;
10
+ export declare function getPathFromArgs(args: GuardArgs | undefined): string | undefined;
11
+ export declare function resolveInputPath(ctx: PluginInput, inputPath: string): string;
12
+ export declare function isPathInsideDirectory(pathToCheck: string, directory: string): boolean;
13
+ export declare function toCanonicalPath(absolutePath: string): string;
14
+ export declare function isOverwriteEnabled(value: boolean | string | undefined): boolean;
3
15
  export declare function createWriteExistingFileGuardHook(ctx: PluginInput): Hooks;
@@ -0,0 +1,3 @@
1
+ export declare function touchSession(sessionLastAccess: Map<string, number>, sessionID: string): void;
2
+ export declare function evictLeastRecentlyUsedSession(readPermissionsBySession: Map<string, Set<string>>, sessionLastAccess: Map<string, number>): void;
3
+ export declare function trimSessionReadSet(readSet: Set<string>, maxTrackedPathsPerSession: number): void;
@@ -0,0 +1,15 @@
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
+ export declare function handleWriteExistingFileGuardToolExecuteBefore(params: {
3
+ ctx: PluginInput;
4
+ input: {
5
+ tool?: string;
6
+ sessionID?: string;
7
+ };
8
+ output: {
9
+ args?: unknown;
10
+ };
11
+ readPermissionsBySession: Map<string, Set<string>>;
12
+ sessionLastAccess: Map<string, number>;
13
+ canonicalSessionRoot: string;
14
+ maxTrackedSessions: number;
15
+ }): Promise<void>;