@renseiai/agentfactory 0.8.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 (246) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/src/config/index.d.ts +3 -0
  4. package/dist/src/config/index.d.ts.map +1 -0
  5. package/dist/src/config/index.js +1 -0
  6. package/dist/src/config/repository-config.d.ts +44 -0
  7. package/dist/src/config/repository-config.d.ts.map +1 -0
  8. package/dist/src/config/repository-config.js +88 -0
  9. package/dist/src/config/repository-config.test.d.ts +2 -0
  10. package/dist/src/config/repository-config.test.d.ts.map +1 -0
  11. package/dist/src/config/repository-config.test.js +249 -0
  12. package/dist/src/deployment/deployment-checker.d.ts +110 -0
  13. package/dist/src/deployment/deployment-checker.d.ts.map +1 -0
  14. package/dist/src/deployment/deployment-checker.js +242 -0
  15. package/dist/src/deployment/index.d.ts +3 -0
  16. package/dist/src/deployment/index.d.ts.map +1 -0
  17. package/dist/src/deployment/index.js +2 -0
  18. package/dist/src/frontend/index.d.ts +2 -0
  19. package/dist/src/frontend/index.d.ts.map +1 -0
  20. package/dist/src/frontend/index.js +1 -0
  21. package/dist/src/frontend/types.d.ts +106 -0
  22. package/dist/src/frontend/types.d.ts.map +1 -0
  23. package/dist/src/frontend/types.js +11 -0
  24. package/dist/src/governor/decision-engine.d.ts +52 -0
  25. package/dist/src/governor/decision-engine.d.ts.map +1 -0
  26. package/dist/src/governor/decision-engine.js +220 -0
  27. package/dist/src/governor/decision-engine.test.d.ts +2 -0
  28. package/dist/src/governor/decision-engine.test.d.ts.map +1 -0
  29. package/dist/src/governor/decision-engine.test.js +629 -0
  30. package/dist/src/governor/event-bus.d.ts +43 -0
  31. package/dist/src/governor/event-bus.d.ts.map +1 -0
  32. package/dist/src/governor/event-bus.js +8 -0
  33. package/dist/src/governor/event-deduplicator.d.ts +43 -0
  34. package/dist/src/governor/event-deduplicator.d.ts.map +1 -0
  35. package/dist/src/governor/event-deduplicator.js +53 -0
  36. package/dist/src/governor/event-driven-governor.d.ts +131 -0
  37. package/dist/src/governor/event-driven-governor.d.ts.map +1 -0
  38. package/dist/src/governor/event-driven-governor.js +379 -0
  39. package/dist/src/governor/event-driven-governor.test.d.ts +2 -0
  40. package/dist/src/governor/event-driven-governor.test.d.ts.map +1 -0
  41. package/dist/src/governor/event-driven-governor.test.js +673 -0
  42. package/dist/src/governor/event-types.d.ts +78 -0
  43. package/dist/src/governor/event-types.d.ts.map +1 -0
  44. package/dist/src/governor/event-types.js +32 -0
  45. package/dist/src/governor/governor-types.d.ts +82 -0
  46. package/dist/src/governor/governor-types.d.ts.map +1 -0
  47. package/dist/src/governor/governor-types.js +21 -0
  48. package/dist/src/governor/governor.d.ts +100 -0
  49. package/dist/src/governor/governor.d.ts.map +1 -0
  50. package/dist/src/governor/governor.js +262 -0
  51. package/dist/src/governor/governor.test.d.ts +2 -0
  52. package/dist/src/governor/governor.test.d.ts.map +1 -0
  53. package/dist/src/governor/governor.test.js +514 -0
  54. package/dist/src/governor/human-touchpoints.d.ts +131 -0
  55. package/dist/src/governor/human-touchpoints.d.ts.map +1 -0
  56. package/dist/src/governor/human-touchpoints.js +251 -0
  57. package/dist/src/governor/human-touchpoints.test.d.ts +2 -0
  58. package/dist/src/governor/human-touchpoints.test.d.ts.map +1 -0
  59. package/dist/src/governor/human-touchpoints.test.js +366 -0
  60. package/dist/src/governor/in-memory-event-bus.d.ts +29 -0
  61. package/dist/src/governor/in-memory-event-bus.d.ts.map +1 -0
  62. package/dist/src/governor/in-memory-event-bus.js +79 -0
  63. package/dist/src/governor/index.d.ts +14 -0
  64. package/dist/src/governor/index.d.ts.map +1 -0
  65. package/dist/src/governor/index.js +13 -0
  66. package/dist/src/governor/override-parser.d.ts +60 -0
  67. package/dist/src/governor/override-parser.d.ts.map +1 -0
  68. package/dist/src/governor/override-parser.js +98 -0
  69. package/dist/src/governor/override-parser.test.d.ts +2 -0
  70. package/dist/src/governor/override-parser.test.d.ts.map +1 -0
  71. package/dist/src/governor/override-parser.test.js +312 -0
  72. package/dist/src/governor/platform-adapter.d.ts +69 -0
  73. package/dist/src/governor/platform-adapter.d.ts.map +1 -0
  74. package/dist/src/governor/platform-adapter.js +11 -0
  75. package/dist/src/governor/processing-state.d.ts +66 -0
  76. package/dist/src/governor/processing-state.d.ts.map +1 -0
  77. package/dist/src/governor/processing-state.js +43 -0
  78. package/dist/src/governor/processing-state.test.d.ts +2 -0
  79. package/dist/src/governor/processing-state.test.d.ts.map +1 -0
  80. package/dist/src/governor/processing-state.test.js +96 -0
  81. package/dist/src/governor/top-of-funnel.d.ts +118 -0
  82. package/dist/src/governor/top-of-funnel.d.ts.map +1 -0
  83. package/dist/src/governor/top-of-funnel.js +168 -0
  84. package/dist/src/governor/top-of-funnel.test.d.ts +2 -0
  85. package/dist/src/governor/top-of-funnel.test.d.ts.map +1 -0
  86. package/dist/src/governor/top-of-funnel.test.js +331 -0
  87. package/dist/src/index.d.ts +11 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/index.js +10 -0
  90. package/dist/src/linear-cli.d.ts +38 -0
  91. package/dist/src/linear-cli.d.ts.map +1 -0
  92. package/dist/src/linear-cli.js +674 -0
  93. package/dist/src/logger.d.ts +117 -0
  94. package/dist/src/logger.d.ts.map +1 -0
  95. package/dist/src/logger.js +430 -0
  96. package/dist/src/manifest/generate.d.ts +20 -0
  97. package/dist/src/manifest/generate.d.ts.map +1 -0
  98. package/dist/src/manifest/generate.js +65 -0
  99. package/dist/src/manifest/index.d.ts +4 -0
  100. package/dist/src/manifest/index.d.ts.map +1 -0
  101. package/dist/src/manifest/index.js +2 -0
  102. package/dist/src/manifest/route-manifest.d.ts +34 -0
  103. package/dist/src/manifest/route-manifest.d.ts.map +1 -0
  104. package/dist/src/manifest/route-manifest.js +148 -0
  105. package/dist/src/orchestrator/activity-emitter.d.ts +119 -0
  106. package/dist/src/orchestrator/activity-emitter.d.ts.map +1 -0
  107. package/dist/src/orchestrator/activity-emitter.js +306 -0
  108. package/dist/src/orchestrator/api-activity-emitter.d.ts +167 -0
  109. package/dist/src/orchestrator/api-activity-emitter.d.ts.map +1 -0
  110. package/dist/src/orchestrator/api-activity-emitter.js +417 -0
  111. package/dist/src/orchestrator/heartbeat-writer.d.ts +57 -0
  112. package/dist/src/orchestrator/heartbeat-writer.d.ts.map +1 -0
  113. package/dist/src/orchestrator/heartbeat-writer.js +137 -0
  114. package/dist/src/orchestrator/index.d.ts +20 -0
  115. package/dist/src/orchestrator/index.d.ts.map +1 -0
  116. package/dist/src/orchestrator/index.js +22 -0
  117. package/dist/src/orchestrator/log-analyzer.d.ts +160 -0
  118. package/dist/src/orchestrator/log-analyzer.d.ts.map +1 -0
  119. package/dist/src/orchestrator/log-analyzer.js +572 -0
  120. package/dist/src/orchestrator/log-config.d.ts +39 -0
  121. package/dist/src/orchestrator/log-config.d.ts.map +1 -0
  122. package/dist/src/orchestrator/log-config.js +45 -0
  123. package/dist/src/orchestrator/orchestrator.d.ts +316 -0
  124. package/dist/src/orchestrator/orchestrator.d.ts.map +1 -0
  125. package/dist/src/orchestrator/orchestrator.js +3290 -0
  126. package/dist/src/orchestrator/parse-work-result.d.ts +16 -0
  127. package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -0
  128. package/dist/src/orchestrator/parse-work-result.js +135 -0
  129. package/dist/src/orchestrator/parse-work-result.test.d.ts +2 -0
  130. package/dist/src/orchestrator/parse-work-result.test.d.ts.map +1 -0
  131. package/dist/src/orchestrator/parse-work-result.test.js +234 -0
  132. package/dist/src/orchestrator/progress-logger.d.ts +72 -0
  133. package/dist/src/orchestrator/progress-logger.d.ts.map +1 -0
  134. package/dist/src/orchestrator/progress-logger.js +135 -0
  135. package/dist/src/orchestrator/session-logger.d.ts +159 -0
  136. package/dist/src/orchestrator/session-logger.d.ts.map +1 -0
  137. package/dist/src/orchestrator/session-logger.js +275 -0
  138. package/dist/src/orchestrator/state-recovery.d.ts +96 -0
  139. package/dist/src/orchestrator/state-recovery.d.ts.map +1 -0
  140. package/dist/src/orchestrator/state-recovery.js +302 -0
  141. package/dist/src/orchestrator/state-types.d.ts +165 -0
  142. package/dist/src/orchestrator/state-types.d.ts.map +1 -0
  143. package/dist/src/orchestrator/state-types.js +7 -0
  144. package/dist/src/orchestrator/stream-parser.d.ts +151 -0
  145. package/dist/src/orchestrator/stream-parser.d.ts.map +1 -0
  146. package/dist/src/orchestrator/stream-parser.js +137 -0
  147. package/dist/src/orchestrator/types.d.ts +232 -0
  148. package/dist/src/orchestrator/types.d.ts.map +1 -0
  149. package/dist/src/orchestrator/types.js +4 -0
  150. package/dist/src/orchestrator/validate-git-remote.test.d.ts +2 -0
  151. package/dist/src/orchestrator/validate-git-remote.test.d.ts.map +1 -0
  152. package/dist/src/orchestrator/validate-git-remote.test.js +61 -0
  153. package/dist/src/providers/a2a-auth.d.ts +81 -0
  154. package/dist/src/providers/a2a-auth.d.ts.map +1 -0
  155. package/dist/src/providers/a2a-auth.js +188 -0
  156. package/dist/src/providers/a2a-auth.test.d.ts +2 -0
  157. package/dist/src/providers/a2a-auth.test.d.ts.map +1 -0
  158. package/dist/src/providers/a2a-auth.test.js +232 -0
  159. package/dist/src/providers/a2a-provider.d.ts +254 -0
  160. package/dist/src/providers/a2a-provider.d.ts.map +1 -0
  161. package/dist/src/providers/a2a-provider.integration.test.d.ts +9 -0
  162. package/dist/src/providers/a2a-provider.integration.test.d.ts.map +1 -0
  163. package/dist/src/providers/a2a-provider.integration.test.js +665 -0
  164. package/dist/src/providers/a2a-provider.js +811 -0
  165. package/dist/src/providers/a2a-provider.test.d.ts +2 -0
  166. package/dist/src/providers/a2a-provider.test.d.ts.map +1 -0
  167. package/dist/src/providers/a2a-provider.test.js +681 -0
  168. package/dist/src/providers/amp-provider.d.ts +20 -0
  169. package/dist/src/providers/amp-provider.d.ts.map +1 -0
  170. package/dist/src/providers/amp-provider.js +24 -0
  171. package/dist/src/providers/claude-provider.d.ts +18 -0
  172. package/dist/src/providers/claude-provider.d.ts.map +1 -0
  173. package/dist/src/providers/claude-provider.js +437 -0
  174. package/dist/src/providers/codex-provider.d.ts +133 -0
  175. package/dist/src/providers/codex-provider.d.ts.map +1 -0
  176. package/dist/src/providers/codex-provider.js +381 -0
  177. package/dist/src/providers/codex-provider.test.d.ts +2 -0
  178. package/dist/src/providers/codex-provider.test.d.ts.map +1 -0
  179. package/dist/src/providers/codex-provider.test.js +387 -0
  180. package/dist/src/providers/index.d.ts +44 -0
  181. package/dist/src/providers/index.d.ts.map +1 -0
  182. package/dist/src/providers/index.js +85 -0
  183. package/dist/src/providers/spring-ai-provider.d.ts +90 -0
  184. package/dist/src/providers/spring-ai-provider.d.ts.map +1 -0
  185. package/dist/src/providers/spring-ai-provider.integration.test.d.ts +13 -0
  186. package/dist/src/providers/spring-ai-provider.integration.test.d.ts.map +1 -0
  187. package/dist/src/providers/spring-ai-provider.integration.test.js +351 -0
  188. package/dist/src/providers/spring-ai-provider.js +317 -0
  189. package/dist/src/providers/spring-ai-provider.test.d.ts +2 -0
  190. package/dist/src/providers/spring-ai-provider.test.d.ts.map +1 -0
  191. package/dist/src/providers/spring-ai-provider.test.js +200 -0
  192. package/dist/src/providers/types.d.ts +165 -0
  193. package/dist/src/providers/types.d.ts.map +1 -0
  194. package/dist/src/providers/types.js +13 -0
  195. package/dist/src/templates/adapters.d.ts +51 -0
  196. package/dist/src/templates/adapters.d.ts.map +1 -0
  197. package/dist/src/templates/adapters.js +104 -0
  198. package/dist/src/templates/adapters.test.d.ts +2 -0
  199. package/dist/src/templates/adapters.test.d.ts.map +1 -0
  200. package/dist/src/templates/adapters.test.js +165 -0
  201. package/dist/src/templates/agent-definition.d.ts +85 -0
  202. package/dist/src/templates/agent-definition.d.ts.map +1 -0
  203. package/dist/src/templates/agent-definition.js +97 -0
  204. package/dist/src/templates/agent-definition.test.d.ts +2 -0
  205. package/dist/src/templates/agent-definition.test.d.ts.map +1 -0
  206. package/dist/src/templates/agent-definition.test.js +209 -0
  207. package/dist/src/templates/index.d.ts +14 -0
  208. package/dist/src/templates/index.d.ts.map +1 -0
  209. package/dist/src/templates/index.js +11 -0
  210. package/dist/src/templates/loader.d.ts +41 -0
  211. package/dist/src/templates/loader.d.ts.map +1 -0
  212. package/dist/src/templates/loader.js +114 -0
  213. package/dist/src/templates/registry.d.ts +80 -0
  214. package/dist/src/templates/registry.d.ts.map +1 -0
  215. package/dist/src/templates/registry.js +177 -0
  216. package/dist/src/templates/registry.test.d.ts +2 -0
  217. package/dist/src/templates/registry.test.d.ts.map +1 -0
  218. package/dist/src/templates/registry.test.js +198 -0
  219. package/dist/src/templates/renderer.d.ts +29 -0
  220. package/dist/src/templates/renderer.d.ts.map +1 -0
  221. package/dist/src/templates/renderer.js +35 -0
  222. package/dist/src/templates/strategy-templates.test.d.ts +2 -0
  223. package/dist/src/templates/strategy-templates.test.d.ts.map +1 -0
  224. package/dist/src/templates/strategy-templates.test.js +619 -0
  225. package/dist/src/templates/types.d.ts +233 -0
  226. package/dist/src/templates/types.d.ts.map +1 -0
  227. package/dist/src/templates/types.js +127 -0
  228. package/dist/src/templates/types.test.d.ts +2 -0
  229. package/dist/src/templates/types.test.d.ts.map +1 -0
  230. package/dist/src/templates/types.test.js +232 -0
  231. package/dist/src/tools/index.d.ts +6 -0
  232. package/dist/src/tools/index.d.ts.map +1 -0
  233. package/dist/src/tools/index.js +3 -0
  234. package/dist/src/tools/linear-runner.d.ts +34 -0
  235. package/dist/src/tools/linear-runner.d.ts.map +1 -0
  236. package/dist/src/tools/linear-runner.js +700 -0
  237. package/dist/src/tools/plugins/linear.d.ts +9 -0
  238. package/dist/src/tools/plugins/linear.d.ts.map +1 -0
  239. package/dist/src/tools/plugins/linear.js +138 -0
  240. package/dist/src/tools/registry.d.ts +9 -0
  241. package/dist/src/tools/registry.d.ts.map +1 -0
  242. package/dist/src/tools/registry.js +18 -0
  243. package/dist/src/tools/types.d.ts +18 -0
  244. package/dist/src/tools/types.d.ts.map +1 -0
  245. package/dist/src/tools/types.js +1 -0
  246. package/package.json +78 -0
@@ -0,0 +1,20 @@
1
+ /**
2
+ * AmpCode (Sourcegraph Amp) Agent Provider (Stub)
3
+ *
4
+ * Will wrap @sourcegraph/amp-sdk to implement the AgentProvider interface.
5
+ * Currently a placeholder — install the SDK and implement when ready.
6
+ *
7
+ * Expected SDK pattern:
8
+ * import { execute } from '@sourcegraph/amp-sdk'
9
+ * const stream = execute({ prompt, cwd, ... })
10
+ * for await (const msg of stream) { ... }
11
+ * // resume: execute({ continue: threadId })
12
+ */
13
+ import type { AgentProvider, AgentSpawnConfig, AgentHandle } from './types.js';
14
+ export declare class AmpProvider implements AgentProvider {
15
+ readonly name: "amp";
16
+ spawn(_config: AgentSpawnConfig): AgentHandle;
17
+ resume(_sessionId: string, _config: AgentSpawnConfig): AgentHandle;
18
+ }
19
+ export declare function createAmpProvider(): AmpProvider;
20
+ //# sourceMappingURL=amp-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amp-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/amp-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACZ,MAAM,YAAY,CAAA;AAEnB,qBAAa,WAAY,YAAW,aAAa;IAC/C,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAS;IAE9B,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW;IAM7C,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,WAAW;CAKnE;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * AmpCode (Sourcegraph Amp) Agent Provider (Stub)
3
+ *
4
+ * Will wrap @sourcegraph/amp-sdk to implement the AgentProvider interface.
5
+ * Currently a placeholder — install the SDK and implement when ready.
6
+ *
7
+ * Expected SDK pattern:
8
+ * import { execute } from '@sourcegraph/amp-sdk'
9
+ * const stream = execute({ prompt, cwd, ... })
10
+ * for await (const msg of stream) { ... }
11
+ * // resume: execute({ continue: threadId })
12
+ */
13
+ export class AmpProvider {
14
+ name = 'amp';
15
+ spawn(_config) {
16
+ throw new Error('Amp provider is not yet implemented. Install @sourcegraph/amp-sdk and implement AmpProvider.');
17
+ }
18
+ resume(_sessionId, _config) {
19
+ throw new Error('Amp provider is not yet implemented. Install @sourcegraph/amp-sdk and implement AmpProvider.');
20
+ }
21
+ }
22
+ export function createAmpProvider() {
23
+ return new AmpProvider();
24
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Claude Agent Provider
3
+ *
4
+ * Wraps @anthropic-ai/claude-agent-sdk to implement the AgentProvider interface.
5
+ * Translates Claude SDK's `query()` and `SDKMessage` stream into normalized AgentEvents.
6
+ */
7
+ import type { AgentProvider, AgentSpawnConfig, AgentHandle } from './types.js';
8
+ export declare class ClaudeProvider implements AgentProvider {
9
+ readonly name: "claude";
10
+ spawn(config: AgentSpawnConfig): AgentHandle;
11
+ resume(sessionId: string, config: AgentSpawnConfig): AgentHandle;
12
+ private createHandle;
13
+ }
14
+ /**
15
+ * Create a new Claude provider instance
16
+ */
17
+ export declare function createClaudeProvider(): ClaudeProvider;
18
+ //# sourceMappingURL=claude-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EAEZ,MAAM,YAAY,CAAA;AA0EnB,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAS;IAEjC,KAAK,CAAC,MAAM,EAAE,gBAAgB,GAAG,WAAW;IAI5C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,WAAW;IAIhE,OAAO,CAAC,YAAY;CAsKrB;AAsND;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAErD"}
@@ -0,0 +1,437 @@
1
+ /**
2
+ * Claude Agent Provider
3
+ *
4
+ * Wraps @anthropic-ai/claude-agent-sdk to implement the AgentProvider interface.
5
+ * Translates Claude SDK's `query()` and `SDKMessage` stream into normalized AgentEvents.
6
+ */
7
+ import { spawn } from 'child_process';
8
+ import { query, } from '@anthropic-ai/claude-agent-sdk';
9
+ /**
10
+ * Programmatic permission handler for autonomous agents.
11
+ *
12
+ * Filesystem-based hooks (.claude/hooks/auto-approve.js) may not load
13
+ * correctly in git worktrees where .git is a file (not a directory),
14
+ * because the SDK's project root resolution can fail to find .claude/.
15
+ *
16
+ * This callback acts as a reliable fallback — it evaluates permissions
17
+ * in-process without filesystem dependencies.
18
+ */
19
+ const autonomousCanUseTool = async (toolName, input) => {
20
+ // Read-only tools: always allow
21
+ if (['Read', 'Glob', 'Grep', 'WebSearch', 'WebFetch'].includes(toolName)) {
22
+ return { behavior: 'allow', updatedInput: input };
23
+ }
24
+ // File write tools: always allow (permissionMode: 'acceptEdits' should
25
+ // handle these, but be explicit as a safety net)
26
+ if (['Write', 'Edit', 'NotebookEdit'].includes(toolName)) {
27
+ return { behavior: 'allow', updatedInput: input };
28
+ }
29
+ // Task management and planning
30
+ if (['Task', 'TaskCreate', 'TaskUpdate', 'TaskGet', 'TaskList',
31
+ 'EnterPlanMode', 'ExitPlanMode', 'Skill'].includes(toolName)) {
32
+ return { behavior: 'allow', updatedInput: input };
33
+ }
34
+ // Bash: evaluate command safety
35
+ if (toolName === 'Bash') {
36
+ const cmd = (typeof input.command === 'string' ? input.command : '').trim();
37
+ if (!cmd)
38
+ return { behavior: 'allow', updatedInput: input };
39
+ // Deny destructive patterns
40
+ if (/rm\s+(-[a-z]*f[a-z]*\s+)?\/\s*$/.test(cmd)) {
41
+ return { behavior: 'deny', message: 'rm of filesystem root blocked' };
42
+ }
43
+ if (/git\s+worktree\s+(remove|prune)/.test(cmd)) {
44
+ return { behavior: 'deny', message: 'worktree remove/prune blocked per project rules' };
45
+ }
46
+ if (/git\s+reset\s+--hard/.test(cmd)) {
47
+ return { behavior: 'deny', message: 'reset --hard blocked' };
48
+ }
49
+ if (/git\s+push\b/.test(cmd) && /(--force\b|-f\b)/.test(cmd)) {
50
+ return { behavior: 'deny', message: 'force push blocked' };
51
+ }
52
+ if (/git\s+(checkout|switch)\b/.test(cmd)) {
53
+ return { behavior: 'deny', message: 'git checkout/switch blocked — agents must not change the checked-out branch' };
54
+ }
55
+ // Allow everything else — autonomous agents run in isolated worktrees
56
+ // managed by the orchestrator, with guardrails at the process level.
57
+ return { behavior: 'allow', updatedInput: input };
58
+ }
59
+ // MCP tools: block Linear (agents must use `pnpm af-linear` CLI instead)
60
+ if (toolName.startsWith('mcp__') && toolName.includes('Linear')) {
61
+ return {
62
+ behavior: 'deny',
63
+ message: 'Linear MCP tools are not available. Use `pnpm af-linear` CLI instead. See CLAUDE.md for the full command reference.',
64
+ };
65
+ }
66
+ // MCP tools: allow others (Vercel, Gmail, etc.)
67
+ if (toolName.startsWith('mcp__')) {
68
+ return { behavior: 'allow', updatedInput: input };
69
+ }
70
+ // Default: allow — autonomous agents should not be blocked by prompts
71
+ return { behavior: 'allow', updatedInput: input };
72
+ };
73
+ export class ClaudeProvider {
74
+ name = 'claude';
75
+ spawn(config) {
76
+ return this.createHandle(config);
77
+ }
78
+ resume(sessionId, config) {
79
+ return this.createHandle(config, sessionId);
80
+ }
81
+ createHandle(config, resumeSessionId) {
82
+ const abortController = config.abortController;
83
+ // Default allowed tools for autonomous agents — ensures bash commands
84
+ // are auto-approved without needing settings.local.json (which isn't
85
+ // available in worktrees). The canUseTool callback handles deny-listing
86
+ // destructive commands; allowedTools just needs to be permissive enough
87
+ // that headless agents aren't blocked by missing permission prompts.
88
+ // Format: Bash(prefix:glob) — colon separates prefix from wildcard.
89
+ const defaultAllowedTools = config.autonomous
90
+ ? [
91
+ 'Bash(pnpm:*)',
92
+ 'Bash(git:*)',
93
+ 'Bash(gh:*)',
94
+ 'Bash(node:*)',
95
+ 'Bash(npx:*)',
96
+ 'Bash(npm:*)',
97
+ 'Bash(tsx:*)',
98
+ 'Bash(python3:*)',
99
+ 'Bash(python:*)',
100
+ 'Bash(curl:*)',
101
+ 'Bash(turbo:*)',
102
+ 'Bash(tsc:*)',
103
+ 'Bash(vitest:*)',
104
+ 'Bash(jest:*)',
105
+ 'Bash(claude:*)',
106
+ // Shell builtins and navigation — cd, pwd, echo, etc.
107
+ 'Bash(cd:*)',
108
+ 'Bash(pwd:*)',
109
+ 'Bash(echo:*)',
110
+ 'Bash(cat:*)',
111
+ 'Bash(ls:*)',
112
+ 'Bash(find:*)',
113
+ 'Bash(grep:*)',
114
+ 'Bash(rg:*)',
115
+ 'Bash(which:*)',
116
+ 'Bash(head:*)',
117
+ 'Bash(tail:*)',
118
+ 'Bash(wc:*)',
119
+ 'Bash(mkdir:*)',
120
+ 'Bash(cp:*)',
121
+ 'Bash(mv:*)',
122
+ 'Bash(touch:*)',
123
+ 'Bash(chmod:*)',
124
+ 'Bash(sed:*)',
125
+ 'Bash(awk:*)',
126
+ 'Bash(sort:*)',
127
+ 'Bash(uniq:*)',
128
+ 'Bash(diff:*)',
129
+ 'Bash(xargs:*)',
130
+ 'Bash(env:*)',
131
+ 'Bash(export:*)',
132
+ 'Bash(source:*)',
133
+ 'Bash(lsof:*)',
134
+ // Non-Node project support: common build tools and shell scripts
135
+ 'Bash(make:*)',
136
+ 'Bash(cmake:*)',
137
+ 'Bash(cargo:*)',
138
+ 'Bash(rustc:*)',
139
+ 'Bash(go:*)',
140
+ 'Bash(bash:*)',
141
+ 'Bash(sh:*)',
142
+ 'Bash(./:*)',
143
+ ]
144
+ : [];
145
+ const agentQuery = query({
146
+ prompt: config.prompt,
147
+ options: {
148
+ cwd: config.cwd,
149
+ env: config.env,
150
+ abortController,
151
+ mcpServers: config.mcpServers,
152
+ maxTurns: config.maxTurns,
153
+ allowedTools: config.allowedTools ?? defaultAllowedTools,
154
+ // Programmatic permission handler for autonomous agents.
155
+ // Filesystem hooks may not resolve in worktrees — this callback
156
+ // ensures headless agents are never blocked by permission prompts.
157
+ canUseTool: config.autonomous ? autonomousCanUseTool : undefined,
158
+ permissionMode: 'acceptEdits',
159
+ disallowedTools: config.autonomous
160
+ ? [
161
+ 'AskUserQuestion',
162
+ // Block Linear MCP tools — agents must use `pnpm af-linear` CLI.
163
+ // disallowedTools is a hard block at the SDK level, more reliable
164
+ // than canUseTool which may race with MCP tool execution.
165
+ 'mcp__claude_ai_Linear__get_issue',
166
+ 'mcp__claude_ai_Linear__list_issues',
167
+ 'mcp__claude_ai_Linear__save_issue',
168
+ 'mcp__claude_ai_Linear__create_comment',
169
+ 'mcp__claude_ai_Linear__list_comments',
170
+ 'mcp__claude_ai_Linear__get_issue_status',
171
+ 'mcp__claude_ai_Linear__list_issue_statuses',
172
+ 'mcp__claude_ai_Linear__create_issue_label',
173
+ 'mcp__claude_ai_Linear__list_issue_labels',
174
+ 'mcp__claude_ai_Linear__get_team',
175
+ 'mcp__claude_ai_Linear__list_teams',
176
+ 'mcp__claude_ai_Linear__get_user',
177
+ 'mcp__claude_ai_Linear__list_users',
178
+ 'mcp__claude_ai_Linear__get_project',
179
+ 'mcp__claude_ai_Linear__list_projects',
180
+ 'mcp__claude_ai_Linear__list_project_labels',
181
+ 'mcp__claude_ai_Linear__search_documentation',
182
+ 'mcp__claude_ai_Linear__get_document',
183
+ 'mcp__claude_ai_Linear__list_documents',
184
+ 'mcp__claude_ai_Linear__create_document',
185
+ 'mcp__claude_ai_Linear__update_document',
186
+ 'mcp__claude_ai_Linear__get_milestone',
187
+ 'mcp__claude_ai_Linear__list_milestones',
188
+ 'mcp__claude_ai_Linear__save_milestone',
189
+ 'mcp__claude_ai_Linear__save_project',
190
+ 'mcp__claude_ai_Linear__list_cycles',
191
+ 'mcp__claude_ai_Linear__get_attachment',
192
+ 'mcp__claude_ai_Linear__create_attachment',
193
+ 'mcp__claude_ai_Linear__delete_attachment',
194
+ 'mcp__claude_ai_Linear__extract_images',
195
+ ]
196
+ : [],
197
+ settingSources: config.autonomous ? [] : ['project'],
198
+ systemPrompt: { type: 'preset', preset: 'claude_code' },
199
+ resume: resumeSessionId,
200
+ sandbox: config.sandboxEnabled
201
+ ? {
202
+ enabled: true,
203
+ autoAllowBashIfSandboxed: true,
204
+ excludedCommands: ['git', 'gh', 'pnpm', 'npm', 'npx', 'node', 'vercel'],
205
+ network: {
206
+ allowLocalBinding: true,
207
+ allowAllUnixSockets: true,
208
+ allowedDomains: ['*'],
209
+ },
210
+ }
211
+ : { enabled: false },
212
+ spawnClaudeCodeProcess: (spawnOptions) => {
213
+ const nodePath = process.execPath;
214
+ const args = spawnOptions.args || [];
215
+ const child = spawn(nodePath, args, {
216
+ cwd: spawnOptions.cwd,
217
+ env: spawnOptions.env,
218
+ stdio: ['pipe', 'pipe', 'pipe'],
219
+ });
220
+ config.onProcessSpawned?.(child.pid);
221
+ child.on('error', (err) => {
222
+ console.error('[ClaudeProvider] Child process error:', err.message);
223
+ });
224
+ if (spawnOptions.signal) {
225
+ const abortHandler = () => {
226
+ child.kill('SIGTERM');
227
+ };
228
+ spawnOptions.signal.addEventListener('abort', abortHandler);
229
+ child.once('exit', () => {
230
+ spawnOptions.signal.removeEventListener('abort', abortHandler);
231
+ });
232
+ }
233
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
234
+ return child;
235
+ },
236
+ },
237
+ });
238
+ return new ClaudeAgentHandle(agentQuery, abortController);
239
+ }
240
+ }
241
+ /**
242
+ * AgentHandle implementation wrapping a Claude SDK Query object.
243
+ */
244
+ class ClaudeAgentHandle {
245
+ sessionId = null;
246
+ agentQuery;
247
+ abortController;
248
+ constructor(agentQuery, abortController) {
249
+ this.agentQuery = agentQuery;
250
+ this.abortController = abortController;
251
+ }
252
+ get stream() {
253
+ return this.createEventStream();
254
+ }
255
+ async injectMessage(text) {
256
+ const sessionId = this.sessionId;
257
+ async function* userMessageGenerator() {
258
+ yield {
259
+ type: 'user',
260
+ message: {
261
+ role: 'user',
262
+ content: text,
263
+ },
264
+ parent_tool_use_id: null,
265
+ session_id: sessionId || '',
266
+ };
267
+ }
268
+ await this.agentQuery.streamInput(userMessageGenerator());
269
+ }
270
+ async stop() {
271
+ this.abortController.abort();
272
+ }
273
+ /**
274
+ * Returns the underlying Query object for direct access if needed.
275
+ * This is an escape hatch — prefer using the AgentHandle interface.
276
+ */
277
+ getRawQuery() {
278
+ return this.agentQuery;
279
+ }
280
+ async *createEventStream() {
281
+ for await (const message of this.agentQuery) {
282
+ const events = this.mapSDKMessage(message);
283
+ for (const event of events) {
284
+ yield event;
285
+ }
286
+ }
287
+ }
288
+ /**
289
+ * Map a single SDKMessage to one or more AgentEvents.
290
+ * Most messages map 1:1, but assistant messages with multiple content blocks
291
+ * may produce multiple events.
292
+ */
293
+ mapSDKMessage(message) {
294
+ switch (message.type) {
295
+ case 'system':
296
+ return this.mapSystemMessage(message);
297
+ case 'user':
298
+ return this.mapUserMessage(message);
299
+ case 'assistant':
300
+ return this.mapAssistantMessage(message);
301
+ case 'result':
302
+ return this.mapResultMessage(message);
303
+ case 'tool_progress':
304
+ return [{
305
+ type: 'tool_progress',
306
+ toolName: message.tool_name,
307
+ elapsedSeconds: message.elapsed_time_seconds,
308
+ raw: message,
309
+ }];
310
+ case 'stream_event':
311
+ // Partial streaming — skip (high frequency, low value for orchestrator)
312
+ return [];
313
+ case 'auth_status':
314
+ if (message.error) {
315
+ return [{
316
+ type: 'error',
317
+ message: message.error,
318
+ raw: message,
319
+ }];
320
+ }
321
+ return [{
322
+ type: 'system',
323
+ subtype: 'auth_status',
324
+ message: message.isAuthenticating ? 'Authenticating...' : 'Authenticated',
325
+ raw: message,
326
+ }];
327
+ default:
328
+ return [{
329
+ type: 'system',
330
+ subtype: 'unknown',
331
+ message: `Unhandled message type: ${message.type}`,
332
+ raw: message,
333
+ }];
334
+ }
335
+ }
336
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
337
+ mapSystemMessage(message) {
338
+ if (message.subtype === 'init') {
339
+ this.sessionId = message.session_id;
340
+ return [{
341
+ type: 'init',
342
+ sessionId: message.session_id,
343
+ raw: message,
344
+ }];
345
+ }
346
+ return [{
347
+ type: 'system',
348
+ subtype: message.subtype ?? 'unknown',
349
+ message: message.status ?? message.message,
350
+ raw: message,
351
+ }];
352
+ }
353
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
354
+ mapUserMessage(message) {
355
+ const events = [];
356
+ if (message.message?.content) {
357
+ for (const block of message.message.content) {
358
+ if (typeof block === 'object' &&
359
+ block !== null &&
360
+ 'type' in block &&
361
+ block.type === 'tool_result' &&
362
+ 'content' in block) {
363
+ events.push({
364
+ type: 'tool_result',
365
+ toolUseId: 'tool_use_id' in block ? String(block.tool_use_id) : undefined,
366
+ content: typeof block.content === 'string' ? block.content : JSON.stringify(block.content),
367
+ isError: 'is_error' in block && block.is_error === true,
368
+ raw: message,
369
+ });
370
+ }
371
+ }
372
+ }
373
+ // If no tool results were extracted, emit as a generic system event
374
+ if (events.length === 0) {
375
+ events.push({
376
+ type: 'system',
377
+ subtype: 'user_message',
378
+ raw: message,
379
+ });
380
+ }
381
+ return events;
382
+ }
383
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
384
+ mapAssistantMessage(message) {
385
+ const events = [];
386
+ if (message.message?.content) {
387
+ for (const block of message.message.content) {
388
+ if (block.type === 'text' && block.text) {
389
+ events.push({
390
+ type: 'assistant_text',
391
+ text: block.text,
392
+ raw: message,
393
+ });
394
+ }
395
+ else if (block.type === 'tool_use') {
396
+ events.push({
397
+ type: 'tool_use',
398
+ toolName: block.name,
399
+ toolUseId: block.id,
400
+ input: block.input,
401
+ raw: message,
402
+ });
403
+ }
404
+ }
405
+ }
406
+ return events;
407
+ }
408
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
409
+ mapResultMessage(message) {
410
+ if (message.subtype === 'success') {
411
+ return [{
412
+ type: 'result',
413
+ success: true,
414
+ message: message.result,
415
+ cost: {
416
+ totalCostUsd: message.total_cost_usd,
417
+ numTurns: message.num_turns,
418
+ },
419
+ raw: message,
420
+ }];
421
+ }
422
+ // Error result
423
+ return [{
424
+ type: 'result',
425
+ success: false,
426
+ errors: 'errors' in message && message.errors ? message.errors : [],
427
+ errorSubtype: message.subtype,
428
+ raw: message,
429
+ }];
430
+ }
431
+ }
432
+ /**
433
+ * Create a new Claude provider instance
434
+ */
435
+ export function createClaudeProvider() {
436
+ return new ClaudeProvider();
437
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * OpenAI Codex Agent Provider
3
+ *
4
+ * Spawns the `codex` CLI (from @openai/codex) as a child process and parses
5
+ * its JSONL event stream into normalized AgentEvents.
6
+ *
7
+ * CLI invocation patterns:
8
+ * New session: codex exec --json --full-auto -C <cwd> "<prompt>"
9
+ * Resume: codex exec resume --json --full-auto <session_id> "<prompt>"
10
+ *
11
+ * JSONL event types:
12
+ * thread.started → init (sessionId)
13
+ * turn.started → system (turn_started)
14
+ * turn.completed → result (success, usage)
15
+ * turn.failed → result (failure)
16
+ * item.* → tool_use / tool_result / assistant_text / system
17
+ * error → error
18
+ */
19
+ import type { AgentProvider, AgentSpawnConfig, AgentHandle, AgentEvent } from './types.js';
20
+ interface CodexThreadStarted {
21
+ type: 'thread.started';
22
+ thread_id: string;
23
+ }
24
+ interface CodexTurnStarted {
25
+ type: 'turn.started';
26
+ }
27
+ interface CodexTurnCompleted {
28
+ type: 'turn.completed';
29
+ usage?: {
30
+ input_tokens?: number;
31
+ cached_input_tokens?: number;
32
+ output_tokens?: number;
33
+ };
34
+ }
35
+ interface CodexTurnFailed {
36
+ type: 'turn.failed';
37
+ error?: {
38
+ message?: string;
39
+ };
40
+ }
41
+ interface CodexItemEvent {
42
+ type: 'item.started' | 'item.updated' | 'item.completed';
43
+ item: CodexItem;
44
+ }
45
+ interface CodexErrorEvent {
46
+ type: 'error';
47
+ message?: string;
48
+ }
49
+ type CodexEvent = CodexThreadStarted | CodexTurnStarted | CodexTurnCompleted | CodexTurnFailed | CodexItemEvent | CodexErrorEvent;
50
+ interface CodexAgentMessage {
51
+ id: string;
52
+ type: 'agent_message';
53
+ text: string;
54
+ }
55
+ interface CodexReasoning {
56
+ id: string;
57
+ type: 'reasoning';
58
+ text: string;
59
+ }
60
+ interface CodexCommandExecution {
61
+ id: string;
62
+ type: 'command_execution';
63
+ command: string;
64
+ aggregated_output: string;
65
+ exit_code?: number;
66
+ status: 'in_progress' | 'completed' | 'failed' | 'declined';
67
+ }
68
+ interface CodexFileChange {
69
+ id: string;
70
+ type: 'file_change';
71
+ changes: Array<{
72
+ path: string;
73
+ kind: string;
74
+ }>;
75
+ status: string;
76
+ }
77
+ interface CodexMcpToolCall {
78
+ id: string;
79
+ type: 'mcp_tool_call';
80
+ server: string;
81
+ tool: string;
82
+ arguments: unknown;
83
+ result?: {
84
+ content?: unknown[];
85
+ };
86
+ error?: {
87
+ message?: string;
88
+ };
89
+ status: string;
90
+ }
91
+ interface CodexTodoList {
92
+ id: string;
93
+ type: 'todo_list';
94
+ items: Array<{
95
+ text: string;
96
+ completed: boolean;
97
+ }>;
98
+ }
99
+ interface CodexErrorItem {
100
+ id: string;
101
+ type: 'error';
102
+ message: string;
103
+ }
104
+ type CodexItem = CodexAgentMessage | CodexReasoning | CodexCommandExecution | CodexFileChange | CodexMcpToolCall | CodexTodoList | CodexErrorItem;
105
+ /** Exported for testing */
106
+ export type { CodexEvent, CodexItem, CodexItemEvent };
107
+ export interface CodexEventMapperState {
108
+ sessionId: string | null;
109
+ totalInputTokens: number;
110
+ totalOutputTokens: number;
111
+ turnCount: number;
112
+ }
113
+ /**
114
+ * Map a single Codex JSONL event to one or more normalized AgentEvents.
115
+ * Exported for unit testing — the AgentHandle uses this internally.
116
+ */
117
+ export declare function mapCodexEvent(event: CodexEvent, state: CodexEventMapperState): AgentEvent[];
118
+ /**
119
+ * Map a Codex item event to AgentEvents.
120
+ * Exported for unit testing.
121
+ */
122
+ export declare function mapCodexItemEvent(event: CodexItemEvent): AgentEvent[];
123
+ export declare class CodexProvider implements AgentProvider {
124
+ readonly name: "codex";
125
+ spawn(config: AgentSpawnConfig): AgentHandle;
126
+ resume(sessionId: string, config: AgentSpawnConfig): AgentHandle;
127
+ private createHandle;
128
+ }
129
+ /**
130
+ * Create a new Codex provider instance
131
+ */
132
+ export declare function createCodexProvider(): CodexProvider;
133
+ //# sourceMappingURL=codex-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/codex-provider.ts"],"names":[],"mappings":"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"}