@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.
- package/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/src/config/index.d.ts +3 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +1 -0
- package/dist/src/config/repository-config.d.ts +44 -0
- package/dist/src/config/repository-config.d.ts.map +1 -0
- package/dist/src/config/repository-config.js +88 -0
- package/dist/src/config/repository-config.test.d.ts +2 -0
- package/dist/src/config/repository-config.test.d.ts.map +1 -0
- package/dist/src/config/repository-config.test.js +249 -0
- package/dist/src/deployment/deployment-checker.d.ts +110 -0
- package/dist/src/deployment/deployment-checker.d.ts.map +1 -0
- package/dist/src/deployment/deployment-checker.js +242 -0
- package/dist/src/deployment/index.d.ts +3 -0
- package/dist/src/deployment/index.d.ts.map +1 -0
- package/dist/src/deployment/index.js +2 -0
- package/dist/src/frontend/index.d.ts +2 -0
- package/dist/src/frontend/index.d.ts.map +1 -0
- package/dist/src/frontend/index.js +1 -0
- package/dist/src/frontend/types.d.ts +106 -0
- package/dist/src/frontend/types.d.ts.map +1 -0
- package/dist/src/frontend/types.js +11 -0
- package/dist/src/governor/decision-engine.d.ts +52 -0
- package/dist/src/governor/decision-engine.d.ts.map +1 -0
- package/dist/src/governor/decision-engine.js +220 -0
- package/dist/src/governor/decision-engine.test.d.ts +2 -0
- package/dist/src/governor/decision-engine.test.d.ts.map +1 -0
- package/dist/src/governor/decision-engine.test.js +629 -0
- package/dist/src/governor/event-bus.d.ts +43 -0
- package/dist/src/governor/event-bus.d.ts.map +1 -0
- package/dist/src/governor/event-bus.js +8 -0
- package/dist/src/governor/event-deduplicator.d.ts +43 -0
- package/dist/src/governor/event-deduplicator.d.ts.map +1 -0
- package/dist/src/governor/event-deduplicator.js +53 -0
- package/dist/src/governor/event-driven-governor.d.ts +131 -0
- package/dist/src/governor/event-driven-governor.d.ts.map +1 -0
- package/dist/src/governor/event-driven-governor.js +379 -0
- package/dist/src/governor/event-driven-governor.test.d.ts +2 -0
- package/dist/src/governor/event-driven-governor.test.d.ts.map +1 -0
- package/dist/src/governor/event-driven-governor.test.js +673 -0
- package/dist/src/governor/event-types.d.ts +78 -0
- package/dist/src/governor/event-types.d.ts.map +1 -0
- package/dist/src/governor/event-types.js +32 -0
- package/dist/src/governor/governor-types.d.ts +82 -0
- package/dist/src/governor/governor-types.d.ts.map +1 -0
- package/dist/src/governor/governor-types.js +21 -0
- package/dist/src/governor/governor.d.ts +100 -0
- package/dist/src/governor/governor.d.ts.map +1 -0
- package/dist/src/governor/governor.js +262 -0
- package/dist/src/governor/governor.test.d.ts +2 -0
- package/dist/src/governor/governor.test.d.ts.map +1 -0
- package/dist/src/governor/governor.test.js +514 -0
- package/dist/src/governor/human-touchpoints.d.ts +131 -0
- package/dist/src/governor/human-touchpoints.d.ts.map +1 -0
- package/dist/src/governor/human-touchpoints.js +251 -0
- package/dist/src/governor/human-touchpoints.test.d.ts +2 -0
- package/dist/src/governor/human-touchpoints.test.d.ts.map +1 -0
- package/dist/src/governor/human-touchpoints.test.js +366 -0
- package/dist/src/governor/in-memory-event-bus.d.ts +29 -0
- package/dist/src/governor/in-memory-event-bus.d.ts.map +1 -0
- package/dist/src/governor/in-memory-event-bus.js +79 -0
- package/dist/src/governor/index.d.ts +14 -0
- package/dist/src/governor/index.d.ts.map +1 -0
- package/dist/src/governor/index.js +13 -0
- package/dist/src/governor/override-parser.d.ts +60 -0
- package/dist/src/governor/override-parser.d.ts.map +1 -0
- package/dist/src/governor/override-parser.js +98 -0
- package/dist/src/governor/override-parser.test.d.ts +2 -0
- package/dist/src/governor/override-parser.test.d.ts.map +1 -0
- package/dist/src/governor/override-parser.test.js +312 -0
- package/dist/src/governor/platform-adapter.d.ts +69 -0
- package/dist/src/governor/platform-adapter.d.ts.map +1 -0
- package/dist/src/governor/platform-adapter.js +11 -0
- package/dist/src/governor/processing-state.d.ts +66 -0
- package/dist/src/governor/processing-state.d.ts.map +1 -0
- package/dist/src/governor/processing-state.js +43 -0
- package/dist/src/governor/processing-state.test.d.ts +2 -0
- package/dist/src/governor/processing-state.test.d.ts.map +1 -0
- package/dist/src/governor/processing-state.test.js +96 -0
- package/dist/src/governor/top-of-funnel.d.ts +118 -0
- package/dist/src/governor/top-of-funnel.d.ts.map +1 -0
- package/dist/src/governor/top-of-funnel.js +168 -0
- package/dist/src/governor/top-of-funnel.test.d.ts +2 -0
- package/dist/src/governor/top-of-funnel.test.d.ts.map +1 -0
- package/dist/src/governor/top-of-funnel.test.js +331 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +10 -0
- package/dist/src/linear-cli.d.ts +38 -0
- package/dist/src/linear-cli.d.ts.map +1 -0
- package/dist/src/linear-cli.js +674 -0
- package/dist/src/logger.d.ts +117 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +430 -0
- package/dist/src/manifest/generate.d.ts +20 -0
- package/dist/src/manifest/generate.d.ts.map +1 -0
- package/dist/src/manifest/generate.js +65 -0
- package/dist/src/manifest/index.d.ts +4 -0
- package/dist/src/manifest/index.d.ts.map +1 -0
- package/dist/src/manifest/index.js +2 -0
- package/dist/src/manifest/route-manifest.d.ts +34 -0
- package/dist/src/manifest/route-manifest.d.ts.map +1 -0
- package/dist/src/manifest/route-manifest.js +148 -0
- package/dist/src/orchestrator/activity-emitter.d.ts +119 -0
- package/dist/src/orchestrator/activity-emitter.d.ts.map +1 -0
- package/dist/src/orchestrator/activity-emitter.js +306 -0
- package/dist/src/orchestrator/api-activity-emitter.d.ts +167 -0
- package/dist/src/orchestrator/api-activity-emitter.d.ts.map +1 -0
- package/dist/src/orchestrator/api-activity-emitter.js +417 -0
- package/dist/src/orchestrator/heartbeat-writer.d.ts +57 -0
- package/dist/src/orchestrator/heartbeat-writer.d.ts.map +1 -0
- package/dist/src/orchestrator/heartbeat-writer.js +137 -0
- package/dist/src/orchestrator/index.d.ts +20 -0
- package/dist/src/orchestrator/index.d.ts.map +1 -0
- package/dist/src/orchestrator/index.js +22 -0
- package/dist/src/orchestrator/log-analyzer.d.ts +160 -0
- package/dist/src/orchestrator/log-analyzer.d.ts.map +1 -0
- package/dist/src/orchestrator/log-analyzer.js +572 -0
- package/dist/src/orchestrator/log-config.d.ts +39 -0
- package/dist/src/orchestrator/log-config.d.ts.map +1 -0
- package/dist/src/orchestrator/log-config.js +45 -0
- package/dist/src/orchestrator/orchestrator.d.ts +316 -0
- package/dist/src/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/src/orchestrator/orchestrator.js +3290 -0
- package/dist/src/orchestrator/parse-work-result.d.ts +16 -0
- package/dist/src/orchestrator/parse-work-result.d.ts.map +1 -0
- package/dist/src/orchestrator/parse-work-result.js +135 -0
- package/dist/src/orchestrator/parse-work-result.test.d.ts +2 -0
- package/dist/src/orchestrator/parse-work-result.test.d.ts.map +1 -0
- package/dist/src/orchestrator/parse-work-result.test.js +234 -0
- package/dist/src/orchestrator/progress-logger.d.ts +72 -0
- package/dist/src/orchestrator/progress-logger.d.ts.map +1 -0
- package/dist/src/orchestrator/progress-logger.js +135 -0
- package/dist/src/orchestrator/session-logger.d.ts +159 -0
- package/dist/src/orchestrator/session-logger.d.ts.map +1 -0
- package/dist/src/orchestrator/session-logger.js +275 -0
- package/dist/src/orchestrator/state-recovery.d.ts +96 -0
- package/dist/src/orchestrator/state-recovery.d.ts.map +1 -0
- package/dist/src/orchestrator/state-recovery.js +302 -0
- package/dist/src/orchestrator/state-types.d.ts +165 -0
- package/dist/src/orchestrator/state-types.d.ts.map +1 -0
- package/dist/src/orchestrator/state-types.js +7 -0
- package/dist/src/orchestrator/stream-parser.d.ts +151 -0
- package/dist/src/orchestrator/stream-parser.d.ts.map +1 -0
- package/dist/src/orchestrator/stream-parser.js +137 -0
- package/dist/src/orchestrator/types.d.ts +232 -0
- package/dist/src/orchestrator/types.d.ts.map +1 -0
- package/dist/src/orchestrator/types.js +4 -0
- package/dist/src/orchestrator/validate-git-remote.test.d.ts +2 -0
- package/dist/src/orchestrator/validate-git-remote.test.d.ts.map +1 -0
- package/dist/src/orchestrator/validate-git-remote.test.js +61 -0
- package/dist/src/providers/a2a-auth.d.ts +81 -0
- package/dist/src/providers/a2a-auth.d.ts.map +1 -0
- package/dist/src/providers/a2a-auth.js +188 -0
- package/dist/src/providers/a2a-auth.test.d.ts +2 -0
- package/dist/src/providers/a2a-auth.test.d.ts.map +1 -0
- package/dist/src/providers/a2a-auth.test.js +232 -0
- package/dist/src/providers/a2a-provider.d.ts +254 -0
- package/dist/src/providers/a2a-provider.d.ts.map +1 -0
- package/dist/src/providers/a2a-provider.integration.test.d.ts +9 -0
- package/dist/src/providers/a2a-provider.integration.test.d.ts.map +1 -0
- package/dist/src/providers/a2a-provider.integration.test.js +665 -0
- package/dist/src/providers/a2a-provider.js +811 -0
- package/dist/src/providers/a2a-provider.test.d.ts +2 -0
- package/dist/src/providers/a2a-provider.test.d.ts.map +1 -0
- package/dist/src/providers/a2a-provider.test.js +681 -0
- package/dist/src/providers/amp-provider.d.ts +20 -0
- package/dist/src/providers/amp-provider.d.ts.map +1 -0
- package/dist/src/providers/amp-provider.js +24 -0
- package/dist/src/providers/claude-provider.d.ts +18 -0
- package/dist/src/providers/claude-provider.d.ts.map +1 -0
- package/dist/src/providers/claude-provider.js +437 -0
- package/dist/src/providers/codex-provider.d.ts +133 -0
- package/dist/src/providers/codex-provider.d.ts.map +1 -0
- package/dist/src/providers/codex-provider.js +381 -0
- package/dist/src/providers/codex-provider.test.d.ts +2 -0
- package/dist/src/providers/codex-provider.test.d.ts.map +1 -0
- package/dist/src/providers/codex-provider.test.js +387 -0
- package/dist/src/providers/index.d.ts +44 -0
- package/dist/src/providers/index.d.ts.map +1 -0
- package/dist/src/providers/index.js +85 -0
- package/dist/src/providers/spring-ai-provider.d.ts +90 -0
- package/dist/src/providers/spring-ai-provider.d.ts.map +1 -0
- package/dist/src/providers/spring-ai-provider.integration.test.d.ts +13 -0
- package/dist/src/providers/spring-ai-provider.integration.test.d.ts.map +1 -0
- package/dist/src/providers/spring-ai-provider.integration.test.js +351 -0
- package/dist/src/providers/spring-ai-provider.js +317 -0
- package/dist/src/providers/spring-ai-provider.test.d.ts +2 -0
- package/dist/src/providers/spring-ai-provider.test.d.ts.map +1 -0
- package/dist/src/providers/spring-ai-provider.test.js +200 -0
- package/dist/src/providers/types.d.ts +165 -0
- package/dist/src/providers/types.d.ts.map +1 -0
- package/dist/src/providers/types.js +13 -0
- package/dist/src/templates/adapters.d.ts +51 -0
- package/dist/src/templates/adapters.d.ts.map +1 -0
- package/dist/src/templates/adapters.js +104 -0
- package/dist/src/templates/adapters.test.d.ts +2 -0
- package/dist/src/templates/adapters.test.d.ts.map +1 -0
- package/dist/src/templates/adapters.test.js +165 -0
- package/dist/src/templates/agent-definition.d.ts +85 -0
- package/dist/src/templates/agent-definition.d.ts.map +1 -0
- package/dist/src/templates/agent-definition.js +97 -0
- package/dist/src/templates/agent-definition.test.d.ts +2 -0
- package/dist/src/templates/agent-definition.test.d.ts.map +1 -0
- package/dist/src/templates/agent-definition.test.js +209 -0
- package/dist/src/templates/index.d.ts +14 -0
- package/dist/src/templates/index.d.ts.map +1 -0
- package/dist/src/templates/index.js +11 -0
- package/dist/src/templates/loader.d.ts +41 -0
- package/dist/src/templates/loader.d.ts.map +1 -0
- package/dist/src/templates/loader.js +114 -0
- package/dist/src/templates/registry.d.ts +80 -0
- package/dist/src/templates/registry.d.ts.map +1 -0
- package/dist/src/templates/registry.js +177 -0
- package/dist/src/templates/registry.test.d.ts +2 -0
- package/dist/src/templates/registry.test.d.ts.map +1 -0
- package/dist/src/templates/registry.test.js +198 -0
- package/dist/src/templates/renderer.d.ts +29 -0
- package/dist/src/templates/renderer.d.ts.map +1 -0
- package/dist/src/templates/renderer.js +35 -0
- package/dist/src/templates/strategy-templates.test.d.ts +2 -0
- package/dist/src/templates/strategy-templates.test.d.ts.map +1 -0
- package/dist/src/templates/strategy-templates.test.js +619 -0
- package/dist/src/templates/types.d.ts +233 -0
- package/dist/src/templates/types.d.ts.map +1 -0
- package/dist/src/templates/types.js +127 -0
- package/dist/src/templates/types.test.d.ts +2 -0
- package/dist/src/templates/types.test.d.ts.map +1 -0
- package/dist/src/templates/types.test.js +232 -0
- package/dist/src/tools/index.d.ts +6 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +3 -0
- package/dist/src/tools/linear-runner.d.ts +34 -0
- package/dist/src/tools/linear-runner.d.ts.map +1 -0
- package/dist/src/tools/linear-runner.js +700 -0
- package/dist/src/tools/plugins/linear.d.ts +9 -0
- package/dist/src/tools/plugins/linear.d.ts.map +1 -0
- package/dist/src/tools/plugins/linear.js +138 -0
- package/dist/src/tools/registry.d.ts +9 -0
- package/dist/src/tools/registry.d.ts.map +1 -0
- package/dist/src/tools/registry.js +18 -0
- package/dist/src/tools/types.d.ts +18 -0
- package/dist/src/tools/types.d.ts.map +1 -0
- package/dist/src/tools/types.js +1 -0
- 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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"}
|