@agentuity/opencode 0.1.40 → 0.1.42

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 (165) hide show
  1. package/README.md +324 -19
  2. package/dist/agents/architect.d.ts +4 -0
  3. package/dist/agents/architect.d.ts.map +1 -0
  4. package/dist/agents/architect.js +259 -0
  5. package/dist/agents/architect.js.map +1 -0
  6. package/dist/agents/builder.d.ts +1 -1
  7. package/dist/agents/builder.d.ts.map +1 -1
  8. package/dist/agents/builder.js +44 -1
  9. package/dist/agents/builder.js.map +1 -1
  10. package/dist/agents/index.d.ts.map +1 -1
  11. package/dist/agents/index.js +6 -0
  12. package/dist/agents/index.js.map +1 -1
  13. package/dist/agents/lead.d.ts +1 -1
  14. package/dist/agents/lead.d.ts.map +1 -1
  15. package/dist/agents/lead.js +185 -22
  16. package/dist/agents/lead.js.map +1 -1
  17. package/dist/agents/planner.d.ts +4 -0
  18. package/dist/agents/planner.d.ts.map +1 -0
  19. package/dist/agents/planner.js +158 -0
  20. package/dist/agents/planner.js.map +1 -0
  21. package/dist/agents/runner.d.ts +4 -0
  22. package/dist/agents/runner.d.ts.map +1 -0
  23. package/dist/agents/runner.js +364 -0
  24. package/dist/agents/runner.js.map +1 -0
  25. package/dist/agents/types.d.ts +5 -1
  26. package/dist/agents/types.d.ts.map +1 -1
  27. package/dist/background/concurrency.d.ts +36 -0
  28. package/dist/background/concurrency.d.ts.map +1 -0
  29. package/dist/background/concurrency.js +92 -0
  30. package/dist/background/concurrency.js.map +1 -0
  31. package/dist/background/index.d.ts +5 -0
  32. package/dist/background/index.d.ts.map +1 -0
  33. package/dist/background/index.js +4 -0
  34. package/dist/background/index.js.map +1 -0
  35. package/dist/background/manager.d.ts +54 -0
  36. package/dist/background/manager.d.ts.map +1 -0
  37. package/dist/background/manager.js +409 -0
  38. package/dist/background/manager.js.map +1 -0
  39. package/dist/background/types.d.ts +47 -0
  40. package/dist/background/types.d.ts.map +1 -0
  41. package/dist/background/types.js +2 -0
  42. package/dist/background/types.js.map +1 -0
  43. package/dist/config/index.d.ts +2 -0
  44. package/dist/config/index.d.ts.map +1 -1
  45. package/dist/config/index.js +2 -0
  46. package/dist/config/index.js.map +1 -1
  47. package/dist/config/loader.d.ts +24 -0
  48. package/dist/config/loader.d.ts.map +1 -1
  49. package/dist/config/loader.js +102 -23
  50. package/dist/config/loader.js.map +1 -1
  51. package/dist/config/presets.d.ts +16 -0
  52. package/dist/config/presets.d.ts.map +1 -0
  53. package/dist/config/presets.js +20 -0
  54. package/dist/config/presets.js.map +1 -0
  55. package/dist/config/validation.d.ts +26 -0
  56. package/dist/config/validation.d.ts.map +1 -0
  57. package/dist/config/validation.js +48 -0
  58. package/dist/config/validation.js.map +1 -0
  59. package/dist/index.d.ts +1 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/plugin/hooks/cadence.d.ts.map +1 -1
  63. package/dist/plugin/hooks/cadence.js +3 -1
  64. package/dist/plugin/hooks/cadence.js.map +1 -1
  65. package/dist/plugin/hooks/keyword.d.ts.map +1 -1
  66. package/dist/plugin/hooks/keyword.js +3 -0
  67. package/dist/plugin/hooks/keyword.js.map +1 -1
  68. package/dist/plugin/plugin.d.ts.map +1 -1
  69. package/dist/plugin/plugin.js +335 -36
  70. package/dist/plugin/plugin.js.map +1 -1
  71. package/dist/skills/frontmatter.d.ts +7 -0
  72. package/dist/skills/frontmatter.d.ts.map +1 -0
  73. package/dist/skills/frontmatter.js +17 -0
  74. package/dist/skills/frontmatter.js.map +1 -0
  75. package/dist/skills/index.d.ts +4 -0
  76. package/dist/skills/index.d.ts.map +1 -0
  77. package/dist/skills/index.js +4 -0
  78. package/dist/skills/index.js.map +1 -0
  79. package/dist/skills/loader.d.ts +20 -0
  80. package/dist/skills/loader.d.ts.map +1 -0
  81. package/dist/skills/loader.js +152 -0
  82. package/dist/skills/loader.js.map +1 -0
  83. package/dist/skills/types.d.ts +41 -0
  84. package/dist/skills/types.d.ts.map +1 -0
  85. package/dist/skills/types.js +2 -0
  86. package/dist/skills/types.js.map +1 -0
  87. package/dist/tmux/decision-engine.d.ts +24 -0
  88. package/dist/tmux/decision-engine.d.ts.map +1 -0
  89. package/dist/tmux/decision-engine.js +193 -0
  90. package/dist/tmux/decision-engine.js.map +1 -0
  91. package/dist/tmux/executor.d.ts +84 -0
  92. package/dist/tmux/executor.d.ts.map +1 -0
  93. package/dist/tmux/executor.js +546 -0
  94. package/dist/tmux/executor.js.map +1 -0
  95. package/dist/tmux/index.d.ts +7 -0
  96. package/dist/tmux/index.d.ts.map +1 -0
  97. package/dist/tmux/index.js +7 -0
  98. package/dist/tmux/index.js.map +1 -0
  99. package/dist/tmux/manager.d.ts +116 -0
  100. package/dist/tmux/manager.d.ts.map +1 -0
  101. package/dist/tmux/manager.js +488 -0
  102. package/dist/tmux/manager.js.map +1 -0
  103. package/dist/tmux/state-query.d.ts +7 -0
  104. package/dist/tmux/state-query.d.ts.map +1 -0
  105. package/dist/tmux/state-query.js +70 -0
  106. package/dist/tmux/state-query.js.map +1 -0
  107. package/dist/tmux/types.d.ts +97 -0
  108. package/dist/tmux/types.d.ts.map +1 -0
  109. package/dist/tmux/types.js +8 -0
  110. package/dist/tmux/types.js.map +1 -0
  111. package/dist/tmux/utils.d.ts +32 -0
  112. package/dist/tmux/utils.d.ts.map +1 -0
  113. package/dist/tmux/utils.js +80 -0
  114. package/dist/tmux/utils.js.map +1 -0
  115. package/dist/tools/background.d.ts +61 -0
  116. package/dist/tools/background.d.ts.map +1 -0
  117. package/dist/tools/background.js +78 -0
  118. package/dist/tools/background.js.map +1 -0
  119. package/dist/tools/delegate.d.ts +6 -0
  120. package/dist/tools/delegate.d.ts.map +1 -1
  121. package/dist/tools/delegate.js +8 -2
  122. package/dist/tools/delegate.js.map +1 -1
  123. package/dist/tools/index.d.ts +1 -0
  124. package/dist/tools/index.d.ts.map +1 -1
  125. package/dist/tools/index.js +1 -0
  126. package/dist/tools/index.js.map +1 -1
  127. package/dist/types.d.ts +118 -18
  128. package/dist/types.d.ts.map +1 -1
  129. package/dist/types.js +49 -7
  130. package/dist/types.js.map +1 -1
  131. package/package.json +4 -3
  132. package/src/agents/architect.ts +262 -0
  133. package/src/agents/builder.ts +44 -1
  134. package/src/agents/index.ts +6 -0
  135. package/src/agents/lead.ts +185 -22
  136. package/src/agents/planner.ts +161 -0
  137. package/src/agents/runner.ts +367 -0
  138. package/src/agents/types.ts +5 -1
  139. package/src/background/concurrency.ts +116 -0
  140. package/src/background/index.ts +4 -0
  141. package/src/background/manager.ts +478 -0
  142. package/src/background/types.ts +52 -0
  143. package/src/config/index.ts +2 -0
  144. package/src/config/loader.ts +128 -31
  145. package/src/config/presets.ts +21 -0
  146. package/src/config/validation.ts +70 -0
  147. package/src/index.ts +1 -0
  148. package/src/plugin/hooks/cadence.ts +2 -1
  149. package/src/plugin/hooks/keyword.ts +3 -0
  150. package/src/plugin/plugin.ts +374 -42
  151. package/src/skills/frontmatter.ts +25 -0
  152. package/src/skills/index.ts +3 -0
  153. package/src/skills/loader.ts +185 -0
  154. package/src/skills/types.ts +43 -0
  155. package/src/tmux/decision-engine.ts +246 -0
  156. package/src/tmux/executor.ts +618 -0
  157. package/src/tmux/index.ts +14 -0
  158. package/src/tmux/manager.ts +577 -0
  159. package/src/tmux/state-query.ts +77 -0
  160. package/src/tmux/types.ts +107 -0
  161. package/src/tmux/utils.ts +85 -0
  162. package/src/tools/background.ts +145 -0
  163. package/src/tools/delegate.ts +8 -2
  164. package/src/tools/index.ts +9 -0
  165. package/src/types.ts +88 -15
@@ -1,22 +1,37 @@
1
1
  import { homedir } from 'node:os';
2
2
  import { join } from 'node:path';
3
3
  import { YAML } from 'bun';
4
- import type { CoderConfig } from '../types';
4
+ import type { CoderConfig, SkillsConfig } from '../types';
5
+ import type { BackgroundTaskConfig } from '../background/types';
5
6
  import { CoderConfigSchema } from '../types';
7
+ import type { TmuxConfig } from '../tmux/types';
8
+ import { MIN_PANE_WIDTH } from '../tmux/types';
6
9
 
7
10
  const CONFIG_DIR = join(homedir(), '.config', 'agentuity');
8
11
  const DEFAULT_PROFILE = 'production.yaml';
9
12
 
13
+ interface CLICoderConfig {
14
+ tmux?: {
15
+ enabled?: boolean;
16
+ maxPanes?: number;
17
+ mainPaneMinWidth?: number;
18
+ agentPaneMinWidth?: number;
19
+ };
20
+ background?: {
21
+ enabled?: boolean;
22
+ defaultConcurrency?: number;
23
+ staleTimeoutMs?: number;
24
+ providerConcurrency?: Record<string, number>;
25
+ modelConcurrency?: Record<string, number>;
26
+ };
27
+ }
28
+
10
29
  interface CLIConfig {
11
30
  name?: string;
12
31
  preferences?: {
13
32
  orgId?: string;
14
33
  };
15
- coder?: {
16
- source?: 'npm' | 'local';
17
- path?: string;
18
- org?: string;
19
- };
34
+ coder?: CLICoderConfig;
20
35
  }
21
36
 
22
37
  async function getProfilePath(): Promise<string> {
@@ -48,6 +63,24 @@ export async function getConfigPath(): Promise<string> {
48
63
  return getProfilePath();
49
64
  }
50
65
 
66
+ /**
67
+ * Load plugin configuration.
68
+ *
69
+ * This primarily loads the orgId from the Agentuity CLI profile.
70
+ * Agent model configuration should be done via OpenCode's native opencode.json.
71
+ *
72
+ * Users can override agent models in their opencode.json:
73
+ * ```json
74
+ * {
75
+ * "agent": {
76
+ * "Agentuity Coder Architect": {
77
+ * "model": "openai/gpt-5.2-codex",
78
+ * "reasoningEffort": "xhigh"
79
+ * }
80
+ * }
81
+ * }
82
+ * ```
83
+ */
51
84
  export async function loadCoderConfig(): Promise<CoderConfig> {
52
85
  try {
53
86
  const configPath = await getProfilePath();
@@ -60,8 +93,23 @@ export async function loadCoderConfig(): Promise<CoderConfig> {
60
93
  const content = await configFile.text();
61
94
  const cliConfig = YAML.parse(content) as CLIConfig;
62
95
 
96
+ // Extract orgId from CLI config preferences
97
+ // Extract coder settings (tmux, background) from CLI config coder section
98
+ // Agent model overrides should be done via opencode.json
63
99
  const coderConfig: CoderConfig = {
64
100
  org: cliConfig.preferences?.orgId,
101
+ tmux: cliConfig.coder?.tmux
102
+ ? {
103
+ ...DEFAULT_TMUX_CONFIG,
104
+ ...cliConfig.coder.tmux,
105
+ }
106
+ : undefined,
107
+ background: cliConfig.coder?.background
108
+ ? {
109
+ ...DEFAULT_BACKGROUND_CONFIG,
110
+ ...cliConfig.coder.background,
111
+ }
112
+ : undefined,
65
113
  };
66
114
 
67
115
  const result = CoderConfigSchema.safeParse(coderConfig);
@@ -86,42 +134,91 @@ const DEFAULT_BLOCKED_COMMANDS = [
86
134
  'auth token', // Don't leak auth tokens
87
135
  ];
88
136
 
137
+ const DEFAULT_BACKGROUND_CONFIG: BackgroundTaskConfig = {
138
+ enabled: true,
139
+ defaultConcurrency: 1,
140
+ staleTimeoutMs: 30 * 60 * 1000,
141
+ providerConcurrency: {},
142
+ modelConcurrency: {},
143
+ };
144
+
145
+ const DEFAULT_SKILLS_CONFIG: SkillsConfig = {
146
+ enabled: true,
147
+ paths: [],
148
+ disabled: [],
149
+ };
150
+
151
+ const DEFAULT_TMUX_CONFIG: TmuxConfig = {
152
+ enabled: false,
153
+ maxPanes: 4,
154
+ mainPaneMinWidth: 100,
155
+ agentPaneMinWidth: MIN_PANE_WIDTH,
156
+ };
157
+
158
+ /**
159
+ * Get default configuration.
160
+ *
161
+ * Note: Agent model defaults are defined in agent definition files (src/agents/).
162
+ * Users can override agent models via opencode.json.
163
+ */
89
164
  export function getDefaultConfig(): CoderConfig {
90
165
  return {
91
- agents: {
92
- lead: { model: 'anthropic/claude-opus-4-5-20251101' },
93
- scout: { model: 'anthropic/claude-haiku-4-5-20251001' },
94
- builder: { model: 'anthropic/claude-opus-4-5-20251101' },
95
- reviewer: { model: 'anthropic/claude-haiku-4-5-20251001' },
96
- memory: { model: 'anthropic/claude-haiku-4-5-20251001' },
97
- expert: { model: 'anthropic/claude-opus-4-5-20251101' },
98
- },
99
166
  disabledMcps: [],
100
167
  blockedCommands: DEFAULT_BLOCKED_COMMANDS,
168
+ background: DEFAULT_BACKGROUND_CONFIG,
169
+ skills: DEFAULT_SKILLS_CONFIG,
170
+ tmux: DEFAULT_TMUX_CONFIG,
101
171
  };
102
172
  }
103
173
 
104
174
  export function mergeConfig(base: CoderConfig, override: CoderConfig): CoderConfig {
105
- // Deep merge agents: for each agent, merge base and override properties
106
- const mergedAgents: CoderConfig['agents'] = {};
107
- const allAgentKeys = new Set([
108
- ...Object.keys(base.agents ?? {}),
109
- ...Object.keys(override.agents ?? {}),
110
- ]);
111
-
112
- for (const key of allAgentKeys) {
113
- const baseAgent = base.agents?.[key as keyof typeof base.agents];
114
- const overrideAgent = override.agents?.[key as keyof typeof override.agents];
115
- mergedAgents[key as keyof typeof mergedAgents] = {
116
- ...baseAgent,
117
- ...overrideAgent,
118
- };
119
- }
120
-
121
175
  return {
122
176
  org: override.org ?? base.org,
123
- agents: mergedAgents,
124
177
  disabledMcps: override.disabledMcps ?? base.disabledMcps,
125
178
  blockedCommands: override.blockedCommands ?? base.blockedCommands,
179
+ background: mergeBackgroundConfig(base.background, override.background),
180
+ skills: mergeSkillsConfig(base.skills, override.skills),
181
+ tmux: mergeTmuxConfig(base.tmux, override.tmux),
182
+ };
183
+ }
184
+
185
+ function mergeBackgroundConfig(
186
+ base?: BackgroundTaskConfig,
187
+ override?: BackgroundTaskConfig
188
+ ): BackgroundTaskConfig | undefined {
189
+ if (!base && !override) return undefined;
190
+ return {
191
+ enabled: override?.enabled ?? base?.enabled ?? true,
192
+ defaultConcurrency: override?.defaultConcurrency ?? base?.defaultConcurrency ?? 1,
193
+ staleTimeoutMs: override?.staleTimeoutMs ?? base?.staleTimeoutMs ?? 30 * 60 * 1000,
194
+ providerConcurrency: {
195
+ ...(base?.providerConcurrency ?? {}),
196
+ ...(override?.providerConcurrency ?? {}),
197
+ },
198
+ modelConcurrency: {
199
+ ...(base?.modelConcurrency ?? {}),
200
+ ...(override?.modelConcurrency ?? {}),
201
+ },
202
+ };
203
+ }
204
+
205
+ function mergeSkillsConfig(base?: SkillsConfig, override?: SkillsConfig): SkillsConfig | undefined {
206
+ if (!base && !override) return undefined;
207
+ const paths = new Set([...(base?.paths ?? []), ...(override?.paths ?? [])]);
208
+ const disabled = new Set([...(base?.disabled ?? []), ...(override?.disabled ?? [])]);
209
+ return {
210
+ enabled: override?.enabled ?? base?.enabled ?? true,
211
+ paths: paths.size > 0 ? Array.from(paths) : undefined,
212
+ disabled: disabled.size > 0 ? Array.from(disabled) : undefined,
213
+ };
214
+ }
215
+
216
+ function mergeTmuxConfig(base?: TmuxConfig, override?: TmuxConfig): TmuxConfig | undefined {
217
+ if (!base && !override) return undefined;
218
+ return {
219
+ enabled: override?.enabled ?? base?.enabled ?? false,
220
+ maxPanes: override?.maxPanes ?? base?.maxPanes ?? 4,
221
+ mainPaneMinWidth: override?.mainPaneMinWidth ?? base?.mainPaneMinWidth ?? 100,
222
+ agentPaneMinWidth: override?.agentPaneMinWidth ?? base?.agentPaneMinWidth ?? MIN_PANE_WIDTH,
126
223
  };
127
224
  }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Model helper utilities.
3
+ *
4
+ * Note: Presets have been removed in favor of using OpenCode's native config.
5
+ * Default models are baked into agent definitions.
6
+ * Users can override via opencode.json.
7
+ */
8
+
9
+ /**
10
+ * Check if a model ID is from OpenAI.
11
+ */
12
+ export function isOpenAIModel(model: string): boolean {
13
+ return model.startsWith('openai/');
14
+ }
15
+
16
+ /**
17
+ * Check if a model ID is from Anthropic.
18
+ */
19
+ export function isAnthropicModel(model: string): boolean {
20
+ return model.startsWith('anthropic/');
21
+ }
@@ -0,0 +1,70 @@
1
+ import { isOpenAIModel, isAnthropicModel } from './presets';
2
+
3
+ export interface ConfigWarning {
4
+ agent: string;
5
+ message: string;
6
+ }
7
+
8
+ /**
9
+ * Minimal config shape for validation - works with both AgentConfig and AgentModelConfig.
10
+ */
11
+ interface ValidatableConfig {
12
+ model?: string;
13
+ reasoningEffort?: string;
14
+ variant?: string;
15
+ thinking?: unknown;
16
+ }
17
+
18
+ /**
19
+ * Validates agent model configuration and returns warnings for mismatches.
20
+ * Does not throw - just warns about potentially incorrect configuration.
21
+ */
22
+ export function validateAgentConfig(agentName: string, config: ValidatableConfig): ConfigWarning[] {
23
+ const warnings: ConfigWarning[] = [];
24
+ const model = config.model;
25
+
26
+ if (!model) return warnings;
27
+
28
+ // Check for OpenAI-specific options on Anthropic models
29
+ if (isAnthropicModel(model)) {
30
+ if (config.reasoningEffort) {
31
+ warnings.push({
32
+ agent: agentName,
33
+ message: `'reasoningEffort' is an OpenAI-specific option but model is Anthropic (${model}). Use 'variant' or 'thinking' instead.`,
34
+ });
35
+ }
36
+ }
37
+
38
+ // Check for Anthropic-specific options on OpenAI models
39
+ if (isOpenAIModel(model)) {
40
+ if (config.variant) {
41
+ warnings.push({
42
+ agent: agentName,
43
+ message: `'variant' is an Anthropic-specific option but model is OpenAI (${model}). Use 'reasoningEffort' instead.`,
44
+ });
45
+ }
46
+ if (config.thinking) {
47
+ warnings.push({
48
+ agent: agentName,
49
+ message: `'thinking' is an Anthropic-specific option but model is OpenAI (${model}). Use 'reasoningEffort' instead.`,
50
+ });
51
+ }
52
+ }
53
+
54
+ return warnings;
55
+ }
56
+
57
+ /**
58
+ * Validates all agent configs and logs warnings.
59
+ */
60
+ export function validateAndWarnConfigs(
61
+ configs: Record<string, ValidatableConfig>,
62
+ logger: { warn: (msg: string) => void } = console
63
+ ): void {
64
+ for (const [agentName, config] of Object.entries(configs)) {
65
+ const warnings = validateAgentConfig(agentName, config);
66
+ for (const warning of warnings) {
67
+ logger.warn(`[Agentuity Coder] Config warning for ${warning.agent}: ${warning.message}`);
68
+ }
69
+ }
70
+ }
package/src/index.ts CHANGED
@@ -13,6 +13,7 @@ export type {
13
13
  AgentContext,
14
14
  CoderTask,
15
15
  CoderConfig,
16
+ BackgroundTaskConfig,
16
17
  McpConfig,
17
18
  TaskStatus,
18
19
  } from './types';
@@ -107,6 +107,7 @@ export function createCadenceHooks(ctx: PluginInput, _config: CoderConfig): Cade
107
107
  );
108
108
  if (statusMatch) {
109
109
  const [, loopId, iteration, maxIterations] = statusMatch;
110
+ if (!iteration || !maxIterations) return;
110
111
  const newIteration = parseInt(iteration, 10);
111
112
  const newMax = parseInt(maxIterations, 10);
112
113
  const changed =
@@ -127,7 +128,7 @@ export function createCadenceHooks(ctx: PluginInput, _config: CoderConfig): Cade
127
128
 
128
129
  // Fallback: try to extract iteration from loose "iteration: N" pattern
129
130
  const iterMatch = messageText.match(/iteration[:\s]+(\d+)/i);
130
- if (iterMatch) {
131
+ if (iterMatch && iterMatch[1]) {
131
132
  const newIteration = parseInt(iterMatch[1], 10);
132
133
  if (newIteration !== state.iteration) {
133
134
  state.iteration = newIteration;
@@ -14,9 +14,12 @@ You are now using the Agentuity Coder agent team from Agentuity.
14
14
  - **@Agentuity Coder Lead**: Orchestrator - breaks down tasks, delegates, never implements directly
15
15
  - **@Agentuity Coder Scout**: Explorer - finds patterns, researches docs, analyzes codebase (read-only)
16
16
  - **@Agentuity Coder Builder**: Implementer - writes code, runs tests, makes changes
17
+ - **@Agentuity Coder Architect**: Senior implementer - complex autonomous tasks, Cadence mode
17
18
  - **@Agentuity Coder Reviewer**: Quality checker - reviews changes, applies fixes
18
19
  - **@Agentuity Coder Memory**: Context keeper - remembers decisions, stores checkpoints
19
20
  - **@Agentuity Coder Expert**: Agentuity specialist - knows CLI commands and cloud services
21
+ - **@Agentuity Coder Planner**: Strategic advisor - complex architecture, deep planning
22
+ - **@Agentuity Coder Runner**: Command executor - runs lint/build/test, returns structured results
20
23
 
21
24
  ## Agentuity Cloud Services Available
22
25
  When genuinely helpful, use these via the CLI: