opencode-dux 1.0.0

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 (302) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +452 -0
  3. package/dist/agents/descriptions.d.ts +6 -0
  4. package/dist/agents/designer.d.ts +2 -0
  5. package/dist/agents/explorer.d.ts +2 -0
  6. package/dist/agents/fixer.d.ts +2 -0
  7. package/dist/agents/index.d.ts +22 -0
  8. package/dist/agents/interpreter.d.ts +2 -0
  9. package/dist/agents/librarian.d.ts +2 -0
  10. package/dist/agents/oracle.d.ts +2 -0
  11. package/dist/agents/orchestrator.d.ts +27 -0
  12. package/dist/agents/overrides.d.ts +18 -0
  13. package/dist/agents/prompt-blocks.d.ts +97 -0
  14. package/dist/agents/steward.d.ts +3 -0
  15. package/dist/cli/config-io.d.ts +24 -0
  16. package/dist/cli/config-manager.d.ts +4 -0
  17. package/dist/cli/index.d.ts +2 -0
  18. package/dist/cli/index.js +1006 -0
  19. package/dist/cli/install.d.ts +2 -0
  20. package/dist/cli/mcps.d.ts +13 -0
  21. package/dist/cli/model-key-normalization.d.ts +1 -0
  22. package/dist/cli/paths.d.ts +35 -0
  23. package/dist/cli/providers.d.ts +137 -0
  24. package/dist/cli/skills.d.ts +22 -0
  25. package/dist/cli/system.d.ts +5 -0
  26. package/dist/cli/types.d.ts +38 -0
  27. package/dist/config/constants.d.ts +12 -0
  28. package/dist/config/index.d.ts +4 -0
  29. package/dist/config/loader.d.ts +40 -0
  30. package/dist/config/runtime-preset.d.ts +12 -0
  31. package/dist/config/schema.d.ts +281 -0
  32. package/dist/config/utils.d.ts +10 -0
  33. package/dist/discovery/local/types.d.ts +79 -0
  34. package/dist/discovery/local.d.ts +73 -0
  35. package/dist/discovery/mcp-servers.d.ts +88 -0
  36. package/dist/discovery/skills.d.ts +94 -0
  37. package/dist/hooks/apply-patch/codec.d.ts +7 -0
  38. package/dist/hooks/apply-patch/errors.d.ts +25 -0
  39. package/dist/hooks/apply-patch/execution-context.d.ts +27 -0
  40. package/dist/hooks/apply-patch/index.d.ts +15 -0
  41. package/dist/hooks/apply-patch/matching.d.ts +26 -0
  42. package/dist/hooks/apply-patch/operations.d.ts +3 -0
  43. package/dist/hooks/apply-patch/patch.d.ts +2 -0
  44. package/dist/hooks/apply-patch/prepared-changes.d.ts +17 -0
  45. package/dist/hooks/apply-patch/resolution.d.ts +19 -0
  46. package/dist/hooks/apply-patch/rewrite.d.ts +7 -0
  47. package/dist/hooks/apply-patch/test-helpers.d.ts +6 -0
  48. package/dist/hooks/apply-patch/types.d.ts +80 -0
  49. package/dist/hooks/auto-update-checker/cache.d.ts +11 -0
  50. package/dist/hooks/auto-update-checker/checker.d.ts +32 -0
  51. package/dist/hooks/auto-update-checker/constants.d.ts +11 -0
  52. package/dist/hooks/auto-update-checker/index.d.ts +18 -0
  53. package/dist/hooks/auto-update-checker/types.d.ts +22 -0
  54. package/dist/hooks/chat-headers.d.ts +16 -0
  55. package/dist/hooks/context-pressure-reminder/index.d.ts +33 -0
  56. package/dist/hooks/delegate-task-retry/guidance.d.ts +2 -0
  57. package/dist/hooks/delegate-task-retry/hook.d.ts +8 -0
  58. package/dist/hooks/delegate-task-retry/index.d.ts +4 -0
  59. package/dist/hooks/delegate-task-retry/patterns.d.ts +11 -0
  60. package/dist/hooks/filter-available-skills/index.d.ts +32 -0
  61. package/dist/hooks/foreground-fallback/index.d.ts +72 -0
  62. package/dist/hooks/image-hook.d.ts +5 -0
  63. package/dist/hooks/index.d.ts +14 -0
  64. package/dist/hooks/json-error-recovery/hook.d.ts +18 -0
  65. package/dist/hooks/json-error-recovery/index.d.ts +1 -0
  66. package/dist/hooks/phase-reminder/index.d.ts +26 -0
  67. package/dist/hooks/post-file-tool-nudge/index.d.ts +19 -0
  68. package/dist/hooks/task-session-manager/index.d.ts +52 -0
  69. package/dist/hooks/todo-continuation/index.d.ts +53 -0
  70. package/dist/hooks/todo-continuation/todo-hygiene.d.ts +35 -0
  71. package/dist/index.d.ts +5 -0
  72. package/dist/index.js +31782 -0
  73. package/dist/mcp/context7.d.ts +6 -0
  74. package/dist/mcp/grep-app.d.ts +6 -0
  75. package/dist/mcp/index.d.ts +13 -0
  76. package/dist/mcp/types.d.ts +12 -0
  77. package/dist/mcp/websearch.d.ts +9 -0
  78. package/dist/skills/registry.d.ts +29 -0
  79. package/dist/subscriptions/accounts-store.d.ts +57 -0
  80. package/dist/subscriptions/index.d.ts +13 -0
  81. package/dist/subscriptions/neuralwatt-scraper.d.ts +14 -0
  82. package/dist/subscriptions/opencode-go-scraper.d.ts +27 -0
  83. package/dist/subscriptions/types.d.ts +115 -0
  84. package/dist/subscriptions/usage-service.d.ts +74 -0
  85. package/dist/tools/ast-grep/cli.d.ts +15 -0
  86. package/dist/tools/ast-grep/constants.d.ts +25 -0
  87. package/dist/tools/ast-grep/downloader.d.ts +5 -0
  88. package/dist/tools/ast-grep/index.d.ts +10 -0
  89. package/dist/tools/ast-grep/tools.d.ts +3 -0
  90. package/dist/tools/ast-grep/types.d.ts +30 -0
  91. package/dist/tools/ast-grep/utils.d.ts +4 -0
  92. package/dist/tools/delegate.d.ts +14 -0
  93. package/dist/tools/index.d.ts +5 -0
  94. package/dist/tools/preset-manager.d.ts +27 -0
  95. package/dist/tools/smartfetch/binary.d.ts +3 -0
  96. package/dist/tools/smartfetch/cache.d.ts +6 -0
  97. package/dist/tools/smartfetch/constants.d.ts +12 -0
  98. package/dist/tools/smartfetch/index.d.ts +3 -0
  99. package/dist/tools/smartfetch/network.d.ts +38 -0
  100. package/dist/tools/smartfetch/secondary-model.d.ts +28 -0
  101. package/dist/tools/smartfetch/tool.d.ts +3 -0
  102. package/dist/tools/smartfetch/types.d.ts +122 -0
  103. package/dist/tools/smartfetch/utils.d.ts +18 -0
  104. package/dist/tui-state.d.ts +168 -0
  105. package/dist/tui.d.ts +37 -0
  106. package/dist/tui.js +1896 -0
  107. package/dist/utils/agent-variant.d.ts +63 -0
  108. package/dist/utils/compat.d.ts +30 -0
  109. package/dist/utils/env.d.ts +1 -0
  110. package/dist/utils/index.d.ts +9 -0
  111. package/dist/utils/internal-initiator.d.ts +6 -0
  112. package/dist/utils/logger.d.ts +8 -0
  113. package/dist/utils/polling.d.ts +21 -0
  114. package/dist/utils/session-manager.d.ts +55 -0
  115. package/dist/utils/session.d.ts +90 -0
  116. package/dist/utils/subagent-depth.d.ts +35 -0
  117. package/dist/utils/system-collapse.d.ts +6 -0
  118. package/dist/utils/task.d.ts +4 -0
  119. package/dist/utils/zip-extractor.d.ts +1 -0
  120. package/index.ts +1 -0
  121. package/opencode-dux.schema.json +634 -0
  122. package/package.json +103 -0
  123. package/src/agents/descriptions.ts +55 -0
  124. package/src/agents/designer.test.ts +86 -0
  125. package/src/agents/designer.ts +154 -0
  126. package/src/agents/display-name.test.ts +186 -0
  127. package/src/agents/explorer.test.ts +79 -0
  128. package/src/agents/explorer.ts +144 -0
  129. package/src/agents/fixer.test.ts +79 -0
  130. package/src/agents/fixer.ts +145 -0
  131. package/src/agents/index.test.ts +472 -0
  132. package/src/agents/index.ts +248 -0
  133. package/src/agents/interpreter.ts +136 -0
  134. package/src/agents/librarian.test.ts +80 -0
  135. package/src/agents/librarian.ts +145 -0
  136. package/src/agents/oracle.test.ts +89 -0
  137. package/src/agents/oracle.ts +184 -0
  138. package/src/agents/orchestrator.test.ts +116 -0
  139. package/src/agents/orchestrator.ts +574 -0
  140. package/src/agents/overrides.ts +95 -0
  141. package/src/agents/prompt-blocks.test.ts +114 -0
  142. package/src/agents/prompt-blocks.ts +640 -0
  143. package/src/agents/steward.ts +146 -0
  144. package/src/cli/config-io.test.ts +536 -0
  145. package/src/cli/config-io.ts +473 -0
  146. package/src/cli/config-manager.test.ts +141 -0
  147. package/src/cli/config-manager.ts +4 -0
  148. package/src/cli/index.ts +88 -0
  149. package/src/cli/install.ts +282 -0
  150. package/src/cli/mcps.test.ts +62 -0
  151. package/src/cli/mcps.ts +39 -0
  152. package/src/cli/model-key-normalization.test.ts +21 -0
  153. package/src/cli/model-key-normalization.ts +60 -0
  154. package/src/cli/paths.test.ts +167 -0
  155. package/src/cli/paths.ts +144 -0
  156. package/src/cli/providers.test.ts +118 -0
  157. package/src/cli/providers.ts +141 -0
  158. package/src/cli/skills.test.ts +111 -0
  159. package/src/cli/skills.ts +103 -0
  160. package/src/cli/system.test.ts +91 -0
  161. package/src/cli/system.ts +180 -0
  162. package/src/cli/types.ts +43 -0
  163. package/src/config/constants.ts +58 -0
  164. package/src/config/index.ts +4 -0
  165. package/src/config/loader.test.ts +1194 -0
  166. package/src/config/loader.ts +269 -0
  167. package/src/config/model-resolution.test.ts +176 -0
  168. package/src/config/runtime-preset.test.ts +61 -0
  169. package/src/config/runtime-preset.ts +37 -0
  170. package/src/config/schema.ts +248 -0
  171. package/src/config/utils.test.ts +41 -0
  172. package/src/config/utils.ts +23 -0
  173. package/src/discovery/local/types.ts +85 -0
  174. package/src/discovery/local.ts +322 -0
  175. package/src/discovery/mcp-servers.ts +804 -0
  176. package/src/discovery/skills.ts +959 -0
  177. package/src/hooks/apply-patch/codec.test.ts +184 -0
  178. package/src/hooks/apply-patch/codec.ts +352 -0
  179. package/src/hooks/apply-patch/errors.ts +117 -0
  180. package/src/hooks/apply-patch/execution-context.ts +432 -0
  181. package/src/hooks/apply-patch/hook.test.ts +768 -0
  182. package/src/hooks/apply-patch/index.ts +126 -0
  183. package/src/hooks/apply-patch/matching.test.ts +215 -0
  184. package/src/hooks/apply-patch/matching.ts +586 -0
  185. package/src/hooks/apply-patch/operations.test.ts +1535 -0
  186. package/src/hooks/apply-patch/operations.ts +3 -0
  187. package/src/hooks/apply-patch/patch.ts +9 -0
  188. package/src/hooks/apply-patch/prepared-changes.ts +400 -0
  189. package/src/hooks/apply-patch/resolution.test.ts +420 -0
  190. package/src/hooks/apply-patch/resolution.ts +437 -0
  191. package/src/hooks/apply-patch/rewrite.ts +496 -0
  192. package/src/hooks/apply-patch/test-helpers.ts +52 -0
  193. package/src/hooks/apply-patch/types.ts +111 -0
  194. package/src/hooks/auto-update-checker/cache.test.ts +179 -0
  195. package/src/hooks/auto-update-checker/cache.ts +188 -0
  196. package/src/hooks/auto-update-checker/checker.test.ts +159 -0
  197. package/src/hooks/auto-update-checker/checker.ts +308 -0
  198. package/src/hooks/auto-update-checker/constants.ts +33 -0
  199. package/src/hooks/auto-update-checker/index.test.ts +282 -0
  200. package/src/hooks/auto-update-checker/index.ts +225 -0
  201. package/src/hooks/auto-update-checker/types.ts +26 -0
  202. package/src/hooks/chat-headers.test.ts +236 -0
  203. package/src/hooks/chat-headers.ts +97 -0
  204. package/src/hooks/context-pressure-reminder/index.test.ts +179 -0
  205. package/src/hooks/context-pressure-reminder/index.ts +137 -0
  206. package/src/hooks/delegate-task-retry/guidance.ts +41 -0
  207. package/src/hooks/delegate-task-retry/hook.ts +23 -0
  208. package/src/hooks/delegate-task-retry/index.test.ts +38 -0
  209. package/src/hooks/delegate-task-retry/index.ts +7 -0
  210. package/src/hooks/delegate-task-retry/patterns.ts +79 -0
  211. package/src/hooks/filter-available-skills/index.test.ts +297 -0
  212. package/src/hooks/filter-available-skills/index.ts +160 -0
  213. package/src/hooks/foreground-fallback/index.test.ts +624 -0
  214. package/src/hooks/foreground-fallback/index.ts +374 -0
  215. package/src/hooks/image-hook.ts +6 -0
  216. package/src/hooks/index.ts +17 -0
  217. package/src/hooks/json-error-recovery/hook.ts +73 -0
  218. package/src/hooks/json-error-recovery/index.test.ts +111 -0
  219. package/src/hooks/json-error-recovery/index.ts +6 -0
  220. package/src/hooks/phase-reminder/index.test.ts +74 -0
  221. package/src/hooks/phase-reminder/index.ts +85 -0
  222. package/src/hooks/post-file-tool-nudge/index.test.ts +94 -0
  223. package/src/hooks/post-file-tool-nudge/index.ts +63 -0
  224. package/src/hooks/task-session-manager/index.test.ts +833 -0
  225. package/src/hooks/task-session-manager/index.ts +434 -0
  226. package/src/hooks/todo-continuation/index.test.ts +3026 -0
  227. package/src/hooks/todo-continuation/index.ts +878 -0
  228. package/src/hooks/todo-continuation/todo-hygiene.test.ts +204 -0
  229. package/src/hooks/todo-continuation/todo-hygiene.ts +207 -0
  230. package/src/index.ts +1672 -0
  231. package/src/mcp/context7.ts +14 -0
  232. package/src/mcp/grep-app.ts +11 -0
  233. package/src/mcp/index.test.ts +96 -0
  234. package/src/mcp/index.ts +66 -0
  235. package/src/mcp/types.ts +16 -0
  236. package/src/mcp/websearch.ts +47 -0
  237. package/src/skills/codemap/README.md +60 -0
  238. package/src/skills/codemap/SKILL.md +174 -0
  239. package/src/skills/codemap/scripts/codemap.mjs +483 -0
  240. package/src/skills/codemap/scripts/codemap.test.ts +129 -0
  241. package/src/skills/registry.ts +218 -0
  242. package/src/skills/simplify/README.md +19 -0
  243. package/src/skills/simplify/SKILL.md +138 -0
  244. package/src/subscriptions/accounts-store.test.ts +236 -0
  245. package/src/subscriptions/accounts-store.ts +184 -0
  246. package/src/subscriptions/index.ts +30 -0
  247. package/src/subscriptions/neuralwatt-scraper.ts +108 -0
  248. package/src/subscriptions/opencode-go-scraper.ts +301 -0
  249. package/src/subscriptions/types.ts +145 -0
  250. package/src/subscriptions/usage-service.test.ts +202 -0
  251. package/src/subscriptions/usage-service.ts +651 -0
  252. package/src/tools/ast-grep/cli.ts +257 -0
  253. package/src/tools/ast-grep/constants.ts +214 -0
  254. package/src/tools/ast-grep/downloader.ts +131 -0
  255. package/src/tools/ast-grep/index.ts +24 -0
  256. package/src/tools/ast-grep/tools.ts +117 -0
  257. package/src/tools/ast-grep/types.ts +51 -0
  258. package/src/tools/ast-grep/utils.ts +126 -0
  259. package/src/tools/delegate-handoff.test.ts +18 -0
  260. package/src/tools/delegate.ts +508 -0
  261. package/src/tools/index.ts +8 -0
  262. package/src/tools/preset-manager.test.ts +795 -0
  263. package/src/tools/preset-manager.ts +332 -0
  264. package/src/tools/smartfetch/binary.ts +58 -0
  265. package/src/tools/smartfetch/cache.test.ts +34 -0
  266. package/src/tools/smartfetch/cache.ts +112 -0
  267. package/src/tools/smartfetch/constants.ts +29 -0
  268. package/src/tools/smartfetch/index.ts +8 -0
  269. package/src/tools/smartfetch/network.test.ts +178 -0
  270. package/src/tools/smartfetch/network.ts +614 -0
  271. package/src/tools/smartfetch/secondary-model.test.ts +85 -0
  272. package/src/tools/smartfetch/secondary-model.ts +276 -0
  273. package/src/tools/smartfetch/tool.test.ts +60 -0
  274. package/src/tools/smartfetch/tool.ts +832 -0
  275. package/src/tools/smartfetch/types.ts +135 -0
  276. package/src/tools/smartfetch/utils.test.ts +24 -0
  277. package/src/tools/smartfetch/utils.ts +456 -0
  278. package/src/tui-state.test.ts +867 -0
  279. package/src/tui-state.ts +1255 -0
  280. package/src/tui.test.ts +336 -0
  281. package/src/tui.ts +1539 -0
  282. package/src/utils/agent-variant.test.ts +244 -0
  283. package/src/utils/agent-variant.ts +187 -0
  284. package/src/utils/compat.ts +91 -0
  285. package/src/utils/env.ts +12 -0
  286. package/src/utils/index.ts +9 -0
  287. package/src/utils/internal-initiator.ts +28 -0
  288. package/src/utils/logger.test.ts +220 -0
  289. package/src/utils/logger.ts +136 -0
  290. package/src/utils/polling.test.ts +191 -0
  291. package/src/utils/polling.ts +67 -0
  292. package/src/utils/session-manager.test.ts +173 -0
  293. package/src/utils/session-manager.ts +356 -0
  294. package/src/utils/session.test.ts +110 -0
  295. package/src/utils/session.ts +389 -0
  296. package/src/utils/subagent-depth.test.ts +170 -0
  297. package/src/utils/subagent-depth.ts +75 -0
  298. package/src/utils/system-collapse.test.ts +86 -0
  299. package/src/utils/system-collapse.ts +24 -0
  300. package/src/utils/task.test.ts +24 -0
  301. package/src/utils/task.ts +20 -0
  302. package/src/utils/zip-extractor.ts +102 -0
@@ -0,0 +1,248 @@
1
+ import { z } from 'zod';
2
+
3
+ const FALLBACK_AGENT_NAMES = [
4
+ 'orchestrator',
5
+ 'oracle',
6
+ 'designer',
7
+ 'explorer',
8
+ 'librarian',
9
+ 'fixer',
10
+ 'steward',
11
+ 'interpreter',
12
+ ] as const;
13
+
14
+ const MANUAL_AGENT_NAMES = [
15
+ 'orchestrator',
16
+ 'oracle',
17
+ 'designer',
18
+ 'explorer',
19
+ 'librarian',
20
+ 'fixer',
21
+ ] as const;
22
+
23
+ export const ProviderModelIdSchema = z
24
+ .string()
25
+ .regex(
26
+ /^[^/\s]+\/[^\s]+$/,
27
+ 'Expected provider/model format (provider/.../model)',
28
+ );
29
+
30
+ export const ManualAgentPlanSchema = z
31
+ .object({
32
+ primary: ProviderModelIdSchema,
33
+ fallback1: ProviderModelIdSchema,
34
+ fallback2: ProviderModelIdSchema,
35
+ fallback3: ProviderModelIdSchema,
36
+ })
37
+ .superRefine((value, ctx) => {
38
+ const unique = new Set([
39
+ value.primary,
40
+ value.fallback1,
41
+ value.fallback2,
42
+ value.fallback3,
43
+ ]);
44
+ if (unique.size !== 4) {
45
+ ctx.addIssue({
46
+ code: z.ZodIssueCode.custom,
47
+ message: 'primary and fallbacks must be unique per agent',
48
+ });
49
+ }
50
+ });
51
+
52
+ export const ManualPlanSchema = z
53
+ .object({
54
+ orchestrator: ManualAgentPlanSchema,
55
+ oracle: ManualAgentPlanSchema,
56
+ designer: ManualAgentPlanSchema,
57
+ explorer: ManualAgentPlanSchema,
58
+ librarian: ManualAgentPlanSchema,
59
+ fixer: ManualAgentPlanSchema,
60
+ })
61
+ .strict();
62
+
63
+ export type ManualAgentName = (typeof MANUAL_AGENT_NAMES)[number];
64
+ export type ManualAgentPlan = z.infer<typeof ManualAgentPlanSchema>;
65
+ export type ManualPlan = z.infer<typeof ManualPlanSchema>;
66
+
67
+ const AgentModelChainSchema = z.array(z.string()).min(1);
68
+
69
+ const FallbackChainsSchema = z
70
+ .object({
71
+ orchestrator: AgentModelChainSchema.optional(),
72
+ oracle: AgentModelChainSchema.optional(),
73
+ designer: AgentModelChainSchema.optional(),
74
+ explorer: AgentModelChainSchema.optional(),
75
+ librarian: AgentModelChainSchema.optional(),
76
+ fixer: AgentModelChainSchema.optional(),
77
+ steward: AgentModelChainSchema.optional(),
78
+ interpreter: AgentModelChainSchema.optional(),
79
+ })
80
+ .catchall(AgentModelChainSchema);
81
+
82
+ export type FallbackAgentName = (typeof FALLBACK_AGENT_NAMES)[number];
83
+
84
+ const SkillOrMcpConfigSchema = z.union([
85
+ z.array(z.string()),
86
+ z.object({
87
+ 'always-load': z.array(z.string()).optional(),
88
+ mandatory: z.array(z.string()).optional(), // DEPRECATED - remove in next release
89
+ wildcard: z.boolean().optional(),
90
+ }),
91
+ ]);
92
+
93
+ // Agent override configuration (distinct from SDK's AgentConfig)
94
+ export const AgentOverrideConfigSchema = z
95
+ .object({
96
+ model: z
97
+ .union([
98
+ z.string(),
99
+ z
100
+ .array(
101
+ z.union([
102
+ z.string(),
103
+ z.object({
104
+ id: z.string(),
105
+ variant: z.string().optional(),
106
+ }),
107
+ ]),
108
+ )
109
+ .min(1),
110
+ ])
111
+ .optional(),
112
+ temperature: z.number().min(0).max(2).optional(),
113
+ variant: z.string().optional().catch(undefined),
114
+ options: z.record(z.string(), z.unknown()).optional(), // provider-specific model options (e.g., textVerbosity, thinking budget)
115
+ displayName: z.string().min(1).optional(),
116
+ skills: SkillOrMcpConfigSchema.optional(), // skills this agent can use ("*" = all, "!item" = exclude)
117
+ mcps: SkillOrMcpConfigSchema.optional(), // MCPs this agent can use (same syntax as skills)
118
+ })
119
+ .strict();
120
+
121
+ export type AgentOverrideConfig = z.infer<typeof AgentOverrideConfigSchema>;
122
+
123
+ /** Normalized model entry with optional per-model variant. */
124
+ export type ModelEntry = { id: string; variant?: string };
125
+
126
+ export const PresetSchema = z.record(z.string(), AgentOverrideConfigSchema);
127
+
128
+ export type Preset = z.infer<typeof PresetSchema>;
129
+
130
+ // Websearch provider configuration
131
+ export const WebsearchConfigSchema = z.object({
132
+ provider: z.enum(['exa', 'tavily']).default('exa'),
133
+ });
134
+ export type WebsearchConfig = z.infer<typeof WebsearchConfigSchema>;
135
+
136
+ // MCP names
137
+ export const McpNameSchema = z.enum(['websearch', 'context7', 'grep_app']);
138
+ export type McpName = z.infer<typeof McpNameSchema>;
139
+
140
+ export const SessionManagerConfigSchema = z.object({
141
+ maxSessionsPerAgent: z.number().int().min(1).max(10).default(2),
142
+ readContextMinLines: z.number().int().min(0).max(1000).default(10),
143
+ readContextMaxFiles: z.number().int().min(0).max(50).default(8),
144
+ });
145
+
146
+ export type SessionManagerConfig = z.infer<typeof SessionManagerConfigSchema>;
147
+
148
+ // Todo continuation configuration
149
+ export const TodoContinuationConfigSchema = z.object({
150
+ maxContinuations: z
151
+ .number()
152
+ .int()
153
+ .min(1)
154
+ .max(50)
155
+ .default(5)
156
+ .describe(
157
+ 'Maximum consecutive auto-continuations before stopping to ask user',
158
+ ),
159
+ cooldownMs: z
160
+ .number()
161
+ .int()
162
+ .min(0)
163
+ .max(30_000)
164
+ .default(3000)
165
+ .describe('Delay in ms before auto-continuing (gives user time to abort)'),
166
+ autoEnable: z
167
+ .boolean()
168
+ .default(false)
169
+ .describe(
170
+ 'Automatically enable auto-continue when the orchestrator session has enough todos',
171
+ ),
172
+ autoEnableThreshold: z
173
+ .number()
174
+ .int()
175
+ .min(1)
176
+ .max(50)
177
+ .default(4)
178
+ .describe(
179
+ 'Number of todos that triggers auto-enable (only used when autoEnable is true)',
180
+ ),
181
+ });
182
+
183
+ export type TodoContinuationConfig = z.infer<
184
+ typeof TodoContinuationConfigSchema
185
+ >;
186
+
187
+ export const ContextPressureConfigSchema = z.object({
188
+ enabled: z
189
+ .boolean()
190
+ .default(true)
191
+ .describe(
192
+ 'When true, warn the orchestrator on high context usage before the model fails.',
193
+ ),
194
+ warnThresholdPct: z
195
+ .number()
196
+ .min(1)
197
+ .max(99)
198
+ .default(75)
199
+ .describe(
200
+ 'Inject a /compact reminder when context (used ÷ limit) is at least this percent.',
201
+ ),
202
+ });
203
+
204
+ export type ContextPressureConfig = z.infer<typeof ContextPressureConfigSchema>;
205
+
206
+ export const FailoverConfigSchema = z.object({
207
+ enabled: z.boolean().default(true),
208
+ timeoutMs: z.number().min(0).default(15000),
209
+ retryDelayMs: z.number().min(0).default(500),
210
+ chains: FallbackChainsSchema.default({}),
211
+ retry_on_empty: z
212
+ .boolean()
213
+ .default(true)
214
+ .describe(
215
+ 'When true (default), empty provider responses are treated as failures, ' +
216
+ 'triggering fallback/retry. Set to false to treat them as successes.',
217
+ ),
218
+ });
219
+
220
+ export type FailoverConfig = z.infer<typeof FailoverConfigSchema>;
221
+
222
+ export const PluginConfigSchema = z.object({
223
+ preset: z.string().optional(),
224
+ setDefaultAgent: z.boolean().optional(),
225
+ scoringEngineVersion: z.enum(['v1', 'v2-shadow', 'v2']).optional(),
226
+ balanceProviderUsage: z.boolean().optional(),
227
+ autoUpdate: z
228
+ .boolean()
229
+ .optional()
230
+ .describe(
231
+ 'Disable automatic installation of plugin updates when false. Defaults to true.',
232
+ ),
233
+ manualPlan: ManualPlanSchema.optional(),
234
+ presets: z.record(z.string(), PresetSchema).optional(),
235
+ agents: z.record(z.string(), AgentOverrideConfigSchema).optional(),
236
+ websearch: WebsearchConfigSchema.optional(),
237
+ sessionManager: SessionManagerConfigSchema.optional(),
238
+ todoContinuation: TodoContinuationConfigSchema.optional(),
239
+ contextPressure: ContextPressureConfigSchema.optional(),
240
+ fallback: FailoverConfigSchema.optional(),
241
+ });
242
+
243
+ export type PluginConfig = z.infer<typeof PluginConfigSchema>;
244
+
245
+ // Agent names - re-exported from constants for convenience
246
+ export type { AgentName } from './constants';
247
+
248
+ export type SkillOrMcpConfig = z.infer<typeof SkillOrMcpConfigSchema>;
@@ -0,0 +1,41 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import type { PluginConfig } from './schema';
3
+ import { getAgentOverride } from './utils';
4
+
5
+ describe('getAgentOverride', () => {
6
+ test('reads override by explicit custom agent key', () => {
7
+ const config = {
8
+ agents: {
9
+ 'custom-reviewer': { model: 'openai/gpt-5.4-mini' },
10
+ },
11
+ } as PluginConfig;
12
+
13
+ const override = getAgentOverride(config, 'custom-reviewer');
14
+
15
+ expect(override).toBeDefined();
16
+ expect(override?.model).toBe('openai/gpt-5.4-mini');
17
+ });
18
+
19
+ test('reads override from legacy alias when mapped', () => {
20
+ const config = {
21
+ agents: {
22
+ explore: { model: 'openai/gpt-5.4-mini' },
23
+ },
24
+ } as PluginConfig;
25
+
26
+ const override = getAgentOverride(config, 'explorer');
27
+
28
+ expect(override).toBeDefined();
29
+ expect(override?.model).toBe('openai/gpt-5.4-mini');
30
+ });
31
+
32
+ test('returns undefined when no override exists', () => {
33
+ const config = {
34
+ agents: {
35
+ explorer: { model: 'openai/gpt-5.4-mini' },
36
+ },
37
+ } as PluginConfig;
38
+
39
+ expect(getAgentOverride(config, 'no-such-agent')).toBeUndefined();
40
+ });
41
+ });
@@ -0,0 +1,23 @@
1
+ import { AGENT_ALIASES } from './constants';
2
+ import type { AgentOverrideConfig, PluginConfig } from './schema';
3
+
4
+ /**
5
+ * Get agent override config by name, supporting backward-compatible aliases.
6
+ * Checks both the current name and any legacy alias names.
7
+ *
8
+ * @param config - The plugin configuration
9
+ * @param name - The current agent name
10
+ * @returns The agent-specific override configuration if found
11
+ */
12
+ export function getAgentOverride(
13
+ config: PluginConfig | undefined,
14
+ name: string,
15
+ ): AgentOverrideConfig | undefined {
16
+ const overrides = config?.agents ?? {};
17
+ return (
18
+ overrides[name] ??
19
+ overrides[
20
+ Object.keys(AGENT_ALIASES).find((k) => AGENT_ALIASES[k] === name) ?? ''
21
+ ]
22
+ );
23
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Type definitions for the discovery module.
3
+ *
4
+ * These types describe MCP servers and skills discovered from local
5
+ * filesystem sources (node_modules, skill directories, etc.).
6
+ *
7
+ * @module
8
+ */
9
+
10
+ /**
11
+ * An MCP server discovered from a local source (e.g., node_modules).
12
+ */
13
+ export interface DiscoveredMcp {
14
+ /** Unique name used as the config key (e.g., 'server-github'). */
15
+ name: string;
16
+ /** Command to launch the MCP server (e.g., `['npx', '@org/mcp-server']`). */
17
+ command: string[];
18
+ /** Human-readable description of what this MCP provides. */
19
+ description?: string;
20
+ /** Categorization tags (e.g., 'browser', 'github', 'filesystem'). */
21
+ tags: string[];
22
+ /** Source identifier indicating where this was found (e.g., 'node_modules'). */
23
+ source: string;
24
+ /** Absolute path to the package.json that defined this MCP. */
25
+ packageJsonPath: string;
26
+ /** Version from the package.json, if available. */
27
+ version?: string;
28
+ }
29
+
30
+ /**
31
+ * A skill discovered from a local source (skill directory, plugin root, etc.).
32
+ */
33
+ export interface DiscoveredSkill {
34
+ /** Unique skill name (derived from folder name). */
35
+ name: string;
36
+ /** Human-readable description. */
37
+ description: string;
38
+ /** Absolute path to the SKILL.md file. */
39
+ path: string;
40
+ /** Tags for categorisation and matching. */
41
+ tags: string[];
42
+ /** Agents that are recommended to use this skill. */
43
+ recommendedAgents: string[];
44
+ /** Source identifier (e.g., 'plugin', 'user-skills-dir'). */
45
+ source: string;
46
+ /** Version of the skill, if available. */
47
+ version?: string;
48
+ }
49
+
50
+ /**
51
+ * Complete result of a local discovery scan.
52
+ */
53
+ export interface LocalDiscoveryResult {
54
+ /** Discovered MCP servers. */
55
+ mcps: DiscoveredMcp[];
56
+ /** Discovered skills. */
57
+ skills: DiscoveredSkill[];
58
+ /** ISO timestamp when the scan was performed. */
59
+ scannedAt: string;
60
+ /** How long the scan took in milliseconds. */
61
+ scanDurationMs: number;
62
+ }
63
+
64
+ /**
65
+ * Options to control the behaviour of a local discovery scan.
66
+ */
67
+ export interface ScanOptions {
68
+ /**
69
+ * Additional directories to scan for skills (absolute paths).
70
+ * Skills are discovered from each directory using the same SKILL.md
71
+ * convention as the plugin's built-in skills.
72
+ */
73
+ userSkillsDirs?: string[];
74
+
75
+ /**
76
+ * If true, skip scanning node_modules for MCP servers.
77
+ * Useful when the caller only needs skill discovery.
78
+ */
79
+ skipNodeModules?: boolean;
80
+
81
+ /**
82
+ * If true, bypass the module-level cache and force a fresh scan.
83
+ */
84
+ forceRefresh?: boolean;
85
+ }