@posthog/agent 1.11.0 → 1.13.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/README.md +26 -65
- package/dist/_virtual/_commonjsHelpers.js +6 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/index.js +4 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/node_modules/@ai-sdk/anthropic/dist/index.js +1154 -0
- package/dist/node_modules/@ai-sdk/anthropic/dist/index.js.map +1 -0
- package/dist/node_modules/@ai-sdk/provider/dist/index.js +296 -0
- package/dist/node_modules/@ai-sdk/provider/dist/index.js.map +1 -0
- package/dist/node_modules/@ai-sdk/provider-utils/dist/index.js +576 -0
- package/dist/node_modules/@ai-sdk/provider-utils/dist/index.js.map +1 -0
- package/dist/node_modules/@ai-sdk/ui-utils/dist/index.js +741 -0
- package/dist/node_modules/@ai-sdk/ui-utils/dist/index.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/context.js +112 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/context.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/diag.js +123 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/diag.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/metrics.js +62 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/metrics.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/propagation.js +91 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/propagation.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/trace.js +79 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/api/trace.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js +59 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/baggage/context-helpers.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js +99 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/baggage/internal/baggage-impl.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/baggage/utils.js +31 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/baggage/utils.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js +69 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/context/NoopContextManager.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/context/context.js +54 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/context/context.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/context-api.js +22 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/context-api.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js +104 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag/ComponentLogger.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js +44 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag/internal/logLevelLogger.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag/types.js +43 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag/types.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag-api.js +27 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/diag-api.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js +62 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/internal/global-utils.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/internal/semver.js +121 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/internal/semver.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js +167 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeter.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js +33 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/metrics/NoopMeterProvider.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/metrics-api.js +22 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/metrics-api.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/platform/node/globalThis.js +21 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/platform/node/globalThis.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js +35 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/propagation/NoopTextMapPropagator.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js +40 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/propagation/TextMapPropagator.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/propagation-api.js +22 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/propagation-api.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js +70 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/NonRecordingSpan.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js +78 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/NoopTracer.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js +34 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/NoopTracerProvider.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js +55 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracer.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js +56 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/ProxyTracerProvider.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js +76 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/context-utils.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js +27 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/invalid-span-constants.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js +45 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/spancontext-utils.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/status.js +22 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/status.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js +25 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace/trace_flags.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace-api.js +24 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/trace-api.js.map +1 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/version.js +20 -0
- package/dist/node_modules/@opentelemetry/api/build/esm/version.js.map +1 -0
- package/dist/node_modules/ai/dist/index.js +2870 -0
- package/dist/node_modules/ai/dist/index.js.map +1 -0
- package/dist/node_modules/nanoid/non-secure/index.js +13 -0
- package/dist/node_modules/nanoid/non-secure/index.js.map +1 -0
- package/dist/node_modules/secure-json-parse/index.js +133 -0
- package/dist/node_modules/secure-json-parse/index.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/Options.js +37 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/Options.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/Refs.js +26 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/Refs.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/errorMessages.js +17 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/errorMessages.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js +11 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/getRelativePath.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/index.js +8 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/index.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parseDef.js +66 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parseDef.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/any.js +21 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/any.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/array.js +30 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/array.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js +53 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js +8 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js +8 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/branded.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js +8 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/catch.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/date.js +50 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/date.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/default.js +11 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/default.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js +11 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/effects.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js +9 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/enum.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js +56 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js +24 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/literal.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/map.js +30 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/map.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js +19 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/never.js +15 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/never.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/null.js +13 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/null.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js +37 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/number.js +56 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/number.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/object.js +76 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/object.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js +25 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/optional.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js +24 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js +8 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/promise.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js +8 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/record.js +65 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/record.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/set.js +24 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/set.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/string.js +350 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/string.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js +36 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js +10 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/union.js +84 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/union.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js +8 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/selectParser.js +110 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/selectParser.js.map +1 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js +90 -0
- package/dist/node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js.map +1 -0
- package/dist/src/adapters/types.d.ts +1 -1
- package/dist/src/agent.d.ts +3 -13
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +94 -504
- package/dist/src/agent.js.map +1 -1
- package/dist/src/agents/execution.d.ts +1 -1
- package/dist/src/agents/execution.js +2 -2
- package/dist/src/agents/execution.js.map +1 -1
- package/dist/src/agents/planning.d.ts +1 -1
- package/dist/src/agents/planning.d.ts.map +1 -1
- package/dist/src/agents/planning.js +1 -2
- package/dist/src/agents/planning.js.map +1 -1
- package/dist/src/agents/research.d.ts +1 -1
- package/dist/src/agents/research.d.ts.map +1 -1
- package/dist/src/agents/research.js +3 -6
- package/dist/src/agents/research.js.map +1 -1
- package/dist/src/git-manager.js +1 -1
- package/dist/src/git-manager.js.map +1 -1
- package/dist/src/posthog-api.d.ts +0 -8
- package/dist/src/posthog-api.d.ts.map +1 -1
- package/dist/src/posthog-api.js +0 -32
- package/dist/src/posthog-api.js.map +1 -1
- package/dist/src/prompt-builder.d.ts.map +1 -1
- package/dist/src/prompt-builder.js +0 -1
- package/dist/src/prompt-builder.js.map +1 -1
- package/dist/src/structured-extraction.d.ts +2 -2
- package/dist/src/structured-extraction.d.ts.map +1 -1
- package/dist/src/structured-extraction.js +51 -110
- package/dist/src/structured-extraction.js.map +1 -1
- package/dist/src/task-progress-reporter.d.ts +0 -6
- package/dist/src/task-progress-reporter.d.ts.map +1 -1
- package/dist/src/task-progress-reporter.js +2 -26
- package/dist/src/task-progress-reporter.js.map +1 -1
- package/dist/src/template-manager.d.ts.map +1 -1
- package/dist/src/template-manager.js +26 -4
- package/dist/src/template-manager.js.map +1 -1
- package/dist/src/types.d.ts +0 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +0 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/workflow/config.d.ts +3 -0
- package/dist/src/workflow/config.d.ts.map +1 -0
- package/dist/src/workflow/config.js +43 -0
- package/dist/src/workflow/config.js.map +1 -0
- package/dist/src/workflow/steps/build.d.ts +3 -0
- package/dist/src/workflow/steps/build.d.ts.map +1 -0
- package/dist/src/workflow/steps/build.js +64 -0
- package/dist/src/workflow/steps/build.js.map +1 -0
- package/dist/src/workflow/steps/plan.d.ts +3 -0
- package/dist/src/workflow/steps/plan.d.ts.map +1 -0
- package/dist/src/workflow/steps/plan.js +86 -0
- package/dist/src/workflow/steps/plan.js.map +1 -0
- package/dist/src/workflow/steps/research.d.ts +3 -0
- package/dist/src/workflow/steps/research.d.ts.map +1 -0
- package/dist/src/workflow/steps/research.js +124 -0
- package/dist/src/workflow/steps/research.js.map +1 -0
- package/dist/src/workflow/types.d.ts +48 -0
- package/dist/src/workflow/types.d.ts.map +1 -0
- package/dist/src/workflow/utils.d.ts +12 -0
- package/dist/src/workflow/utils.d.ts.map +1 -0
- package/dist/src/workflow/utils.js +38 -0
- package/dist/src/workflow/utils.js.map +1 -0
- package/package.json +6 -4
- package/src/adapters/types.ts +1 -1
- package/src/agent.ts +114 -554
- package/src/agents/execution.ts +2 -2
- package/src/agents/planning.ts +1 -2
- package/src/agents/research.ts +3 -6
- package/src/git-manager.ts +1 -1
- package/src/posthog-api.ts +0 -40
- package/src/prompt-builder.ts +0 -2
- package/src/structured-extraction.ts +58 -115
- package/src/task-progress-reporter.ts +2 -34
- package/src/template-manager.ts +35 -5
- package/src/types.ts +0 -7
- package/src/workflow/config.ts +42 -0
- package/src/workflow/steps/build.ts +87 -0
- package/src/workflow/steps/plan.ts +112 -0
- package/src/workflow/steps/research.ts +156 -0
- package/src/workflow/types.ts +53 -0
- package/src/workflow/utils.ts +50 -0
- package/dist/src/agent-registry.d.ts +0 -16
- package/dist/src/agent-registry.d.ts.map +0 -1
- package/dist/src/agent-registry.js +0 -62
- package/dist/src/agent-registry.js.map +0 -1
- package/dist/src/stage-executor.d.ts +0 -20
- package/dist/src/stage-executor.d.ts.map +0 -1
- package/dist/src/stage-executor.js +0 -178
- package/dist/src/stage-executor.js.map +0 -1
- package/dist/src/workflow-registry.d.ts +0 -11
- package/dist/src/workflow-registry.d.ts.map +0 -1
- package/dist/src/workflow-registry.js +0 -27
- package/dist/src/workflow-registry.js.map +0 -1
- package/dist/src/workflow-types.d.ts +0 -45
- package/dist/src/workflow-types.d.ts.map +0 -1
- package/src/agent-registry.ts +0 -65
- package/src/stage-executor.ts +0 -210
- package/src/workflow-registry.ts +0 -30
- package/src/workflow-types.ts +0 -52
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import { PLANNING_SYSTEM_PROMPT } from '../../agents/planning.js';
|
|
3
|
+
import type { WorkflowStepRunner } from '../types.js';
|
|
4
|
+
import { finalizeStepGitActions } from '../utils.js';
|
|
5
|
+
|
|
6
|
+
export const planStep: WorkflowStepRunner = async ({ step, context }) => {
|
|
7
|
+
const {
|
|
8
|
+
task,
|
|
9
|
+
cwd,
|
|
10
|
+
isCloudMode,
|
|
11
|
+
options,
|
|
12
|
+
logger,
|
|
13
|
+
fileManager,
|
|
14
|
+
gitManager,
|
|
15
|
+
promptBuilder,
|
|
16
|
+
adapter,
|
|
17
|
+
mcpServers,
|
|
18
|
+
emitEvent,
|
|
19
|
+
} = context;
|
|
20
|
+
|
|
21
|
+
const stepLogger = logger.child('PlanStep');
|
|
22
|
+
|
|
23
|
+
const existingPlan = await fileManager.readPlan(task.id);
|
|
24
|
+
if (existingPlan) {
|
|
25
|
+
stepLogger.info('Plan already exists, skipping step', { taskId: task.id });
|
|
26
|
+
return { status: 'skipped' };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const questionsData = await fileManager.readQuestions(task.id);
|
|
30
|
+
if (!questionsData || !questionsData.answered) {
|
|
31
|
+
stepLogger.info('Waiting for answered research questions', { taskId: task.id });
|
|
32
|
+
emitEvent(adapter.createStatusEvent('phase_complete', { phase: 'research_questions' }));
|
|
33
|
+
return { status: 'skipped', halt: true };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
stepLogger.info('Starting planning phase', { taskId: task.id });
|
|
37
|
+
emitEvent(adapter.createStatusEvent('phase_start', { phase: 'planning' }));
|
|
38
|
+
|
|
39
|
+
const researchContent = await fileManager.readResearch(task.id);
|
|
40
|
+
let researchContext = '';
|
|
41
|
+
if (researchContent) {
|
|
42
|
+
researchContext += `## Research Analysis\n\n${researchContent}\n\n`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
researchContext += `## Implementation Decisions\n\n`;
|
|
46
|
+
for (const question of questionsData.questions) {
|
|
47
|
+
const answer = questionsData.answers?.find(
|
|
48
|
+
(a: any) => a.questionId === question.id
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
researchContext += `### ${question.question}\n\n`;
|
|
52
|
+
if (answer) {
|
|
53
|
+
researchContext += `**Selected:** ${answer.selectedOption}\n`;
|
|
54
|
+
if (answer.customInput) {
|
|
55
|
+
researchContext += `**Details:** ${answer.customInput}\n`;
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
researchContext += `**Selected:** Not answered\n`;
|
|
59
|
+
}
|
|
60
|
+
researchContext += `\n`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const planningPrompt = await promptBuilder.buildPlanningPrompt(task, cwd);
|
|
64
|
+
const fullPrompt = `${PLANNING_SYSTEM_PROMPT}\n\n${planningPrompt}\n\n${researchContext}`;
|
|
65
|
+
|
|
66
|
+
const baseOptions: Record<string, any> = {
|
|
67
|
+
model: step.model,
|
|
68
|
+
cwd,
|
|
69
|
+
permissionMode: 'plan',
|
|
70
|
+
settingSources: ['local'],
|
|
71
|
+
mcpServers,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const response = query({
|
|
75
|
+
prompt: fullPrompt,
|
|
76
|
+
options: { ...baseOptions, ...(options.queryOverrides || {}) },
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
let planContent = '';
|
|
80
|
+
for await (const message of response) {
|
|
81
|
+
emitEvent(adapter.createRawSDKEvent(message));
|
|
82
|
+
const transformed = adapter.transform(message);
|
|
83
|
+
if (transformed) {
|
|
84
|
+
emitEvent(transformed);
|
|
85
|
+
}
|
|
86
|
+
if (message.type === 'assistant' && message.message?.content) {
|
|
87
|
+
for (const c of message.message.content) {
|
|
88
|
+
if (c.type === 'text' && c.text) {
|
|
89
|
+
planContent += `${c.text}\n`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (planContent.trim()) {
|
|
96
|
+
await fileManager.writePlan(task.id, planContent.trim());
|
|
97
|
+
stepLogger.info('Plan completed', { taskId: task.id });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
await gitManager.addAllPostHogFiles();
|
|
101
|
+
await finalizeStepGitActions(context, step, {
|
|
102
|
+
commitMessage: `Planning phase for ${task.title}`,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
if (!isCloudMode) {
|
|
106
|
+
emitEvent(adapter.createStatusEvent('phase_complete', { phase: 'planning' }));
|
|
107
|
+
return { status: 'completed', halt: true };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
emitEvent(adapter.createStatusEvent('phase_complete', { phase: 'planning' }));
|
|
111
|
+
return { status: 'completed' };
|
|
112
|
+
};
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import { RESEARCH_SYSTEM_PROMPT } from '../../agents/research.js';
|
|
3
|
+
import type { ExtractedQuestionWithAnswer } from '../../structured-extraction.js';
|
|
4
|
+
import type { WorkflowStepRunner } from '../types.js';
|
|
5
|
+
import { finalizeStepGitActions } from '../utils.js';
|
|
6
|
+
|
|
7
|
+
export const researchStep: WorkflowStepRunner = async ({ step, context }) => {
|
|
8
|
+
const {
|
|
9
|
+
task,
|
|
10
|
+
cwd,
|
|
11
|
+
isCloudMode,
|
|
12
|
+
options,
|
|
13
|
+
logger,
|
|
14
|
+
fileManager,
|
|
15
|
+
gitManager,
|
|
16
|
+
promptBuilder,
|
|
17
|
+
adapter,
|
|
18
|
+
mcpServers,
|
|
19
|
+
extractor,
|
|
20
|
+
emitEvent,
|
|
21
|
+
} = context;
|
|
22
|
+
|
|
23
|
+
const stepLogger = logger.child('ResearchStep');
|
|
24
|
+
|
|
25
|
+
const existingResearch = await fileManager.readResearch(task.id);
|
|
26
|
+
if (existingResearch) {
|
|
27
|
+
stepLogger.info('Research already exists, skipping step', { taskId: task.id });
|
|
28
|
+
return { status: 'skipped' };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
stepLogger.info('Starting research phase', { taskId: task.id });
|
|
32
|
+
emitEvent(adapter.createStatusEvent('phase_start', { phase: 'research' }));
|
|
33
|
+
|
|
34
|
+
const researchPrompt = await promptBuilder.buildResearchPrompt(task, cwd);
|
|
35
|
+
const fullPrompt = `${RESEARCH_SYSTEM_PROMPT}\n\n${researchPrompt}`;
|
|
36
|
+
|
|
37
|
+
const baseOptions: Record<string, any> = {
|
|
38
|
+
model: step.model,
|
|
39
|
+
cwd,
|
|
40
|
+
permissionMode: 'plan',
|
|
41
|
+
settingSources: ['local'],
|
|
42
|
+
mcpServers,
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const response = query({
|
|
46
|
+
prompt: fullPrompt,
|
|
47
|
+
options: { ...baseOptions, ...(options.queryOverrides || {}) },
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
let researchContent = '';
|
|
51
|
+
for await (const message of response) {
|
|
52
|
+
emitEvent(adapter.createRawSDKEvent(message));
|
|
53
|
+
const transformed = adapter.transform(message);
|
|
54
|
+
if (transformed) {
|
|
55
|
+
emitEvent(transformed);
|
|
56
|
+
}
|
|
57
|
+
if (message.type === 'assistant' && message.message?.content) {
|
|
58
|
+
for (const c of message.message.content) {
|
|
59
|
+
if (c.type === 'text' && c.text) {
|
|
60
|
+
researchContent += `${c.text}\n`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (researchContent.trim()) {
|
|
67
|
+
await fileManager.writeResearch(task.id, researchContent.trim());
|
|
68
|
+
stepLogger.info('Research completed', { taskId: task.id });
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
await gitManager.addAllPostHogFiles();
|
|
72
|
+
await finalizeStepGitActions(context, step, {
|
|
73
|
+
commitMessage: `Research phase for ${task.title}`,
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (extractor && researchContent.trim()) {
|
|
77
|
+
try {
|
|
78
|
+
stepLogger.info('Extracting questions from research.md', { taskId: task.id });
|
|
79
|
+
const parsedQuestions = await extractor.extractQuestions(researchContent);
|
|
80
|
+
|
|
81
|
+
await fileManager.writeQuestions(task.id, {
|
|
82
|
+
questions: parsedQuestions,
|
|
83
|
+
answered: false,
|
|
84
|
+
answers: null,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
emitEvent({
|
|
88
|
+
type: 'artifact',
|
|
89
|
+
ts: Date.now(),
|
|
90
|
+
kind: 'research_questions',
|
|
91
|
+
content: parsedQuestions,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
stepLogger.info('Questions extracted successfully', {
|
|
95
|
+
taskId: task.id,
|
|
96
|
+
count: parsedQuestions.length,
|
|
97
|
+
});
|
|
98
|
+
} catch (error) {
|
|
99
|
+
stepLogger.error('Failed to extract questions', {
|
|
100
|
+
taskId: task.id,
|
|
101
|
+
error: error instanceof Error ? error.message : String(error),
|
|
102
|
+
});
|
|
103
|
+
emitEvent({
|
|
104
|
+
type: 'error',
|
|
105
|
+
ts: Date.now(),
|
|
106
|
+
message: `Failed to extract questions: ${
|
|
107
|
+
error instanceof Error ? error.message : String(error)
|
|
108
|
+
}`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
} else if (!extractor) {
|
|
112
|
+
stepLogger.warn(
|
|
113
|
+
'Question extractor not available, skipping question extraction. Ensure LLM gateway is configured.'
|
|
114
|
+
);
|
|
115
|
+
emitEvent({
|
|
116
|
+
type: 'status',
|
|
117
|
+
ts: Date.now(),
|
|
118
|
+
phase: 'extraction_skipped',
|
|
119
|
+
message: 'Question extraction skipped - extractor not configured',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (!isCloudMode) {
|
|
124
|
+
emitEvent(adapter.createStatusEvent('phase_complete', { phase: 'research' }));
|
|
125
|
+
return { status: 'completed', halt: true };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const questionsData = await fileManager.readQuestions(task.id);
|
|
129
|
+
if (questionsData && !questionsData.answered && extractor && researchContent.trim()) {
|
|
130
|
+
const researchQuestions = await extractor.extractQuestionsWithAnswers(researchContent);
|
|
131
|
+
const answers = (researchQuestions as ExtractedQuestionWithAnswer[]).map((qa) => ({
|
|
132
|
+
questionId: qa.id,
|
|
133
|
+
selectedOption: qa.recommendedAnswer,
|
|
134
|
+
customInput: qa.justification,
|
|
135
|
+
}));
|
|
136
|
+
|
|
137
|
+
await fileManager.writeQuestions(task.id, {
|
|
138
|
+
questions: researchQuestions.map((qa) => ({
|
|
139
|
+
id: qa.id,
|
|
140
|
+
question: qa.question,
|
|
141
|
+
options: qa.options,
|
|
142
|
+
})),
|
|
143
|
+
answered: true,
|
|
144
|
+
answers,
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
await gitManager.addAllPostHogFiles();
|
|
148
|
+
await finalizeStepGitActions(context, step, {
|
|
149
|
+
commitMessage: `Answer research questions for ${task.title}`,
|
|
150
|
+
});
|
|
151
|
+
stepLogger.info('Auto-answered research questions', { taskId: task.id });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
emitEvent(adapter.createStatusEvent('phase_complete', { phase: 'research' }));
|
|
155
|
+
return { status: 'completed' };
|
|
156
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Task, TaskExecutionOptions, PermissionMode } from '../types.js';
|
|
2
|
+
import type { Logger } from '../utils/logger.js';
|
|
3
|
+
import type { PostHogFileManager } from '../file-manager.js';
|
|
4
|
+
import type { GitManager } from '../git-manager.js';
|
|
5
|
+
import type { PromptBuilder } from '../prompt-builder.js';
|
|
6
|
+
import type { TaskProgressReporter } from '../task-progress-reporter.js';
|
|
7
|
+
import type { ProviderAdapter } from '../adapters/types.js';
|
|
8
|
+
import type { PostHogAPIClient } from '../posthog-api.js';
|
|
9
|
+
import type { StructuredExtractor } from '../structured-extraction.js';
|
|
10
|
+
|
|
11
|
+
export interface WorkflowRuntime {
|
|
12
|
+
task: Task;
|
|
13
|
+
taskSlug: string;
|
|
14
|
+
cwd: string;
|
|
15
|
+
isCloudMode: boolean;
|
|
16
|
+
options: TaskExecutionOptions;
|
|
17
|
+
logger: Logger;
|
|
18
|
+
fileManager: PostHogFileManager;
|
|
19
|
+
gitManager: GitManager;
|
|
20
|
+
promptBuilder: PromptBuilder;
|
|
21
|
+
progressReporter: TaskProgressReporter;
|
|
22
|
+
adapter: ProviderAdapter;
|
|
23
|
+
mcpServers?: Record<string, any>;
|
|
24
|
+
posthogAPI?: PostHogAPIClient;
|
|
25
|
+
extractor?: StructuredExtractor;
|
|
26
|
+
emitEvent: (event: any) => void;
|
|
27
|
+
stepResults: Record<string, any>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface WorkflowStepDefinition {
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
agent: string;
|
|
34
|
+
model: string;
|
|
35
|
+
permissionMode?: PermissionMode | string;
|
|
36
|
+
commit?: boolean;
|
|
37
|
+
push?: boolean;
|
|
38
|
+
run: WorkflowStepRunner;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface WorkflowStepRuntime {
|
|
42
|
+
step: WorkflowStepDefinition;
|
|
43
|
+
context: WorkflowRuntime;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface WorkflowStepResult {
|
|
47
|
+
status: 'completed' | 'skipped';
|
|
48
|
+
halt?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export type WorkflowStepRunner = (runtime: WorkflowStepRuntime) => Promise<WorkflowStepResult>;
|
|
52
|
+
|
|
53
|
+
export type WorkflowDefinition = WorkflowStepDefinition[];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { WorkflowRuntime, WorkflowStepDefinition } from './types.js';
|
|
2
|
+
|
|
3
|
+
interface FinalizeGitOptions {
|
|
4
|
+
commitMessage: string;
|
|
5
|
+
allowEmptyCommit?: boolean;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Commits (and optionally pushes) any staged changes according to the step configuration.
|
|
10
|
+
* Returns true if a commit was created.
|
|
11
|
+
*/
|
|
12
|
+
export async function finalizeStepGitActions(
|
|
13
|
+
context: WorkflowRuntime,
|
|
14
|
+
step: WorkflowStepDefinition,
|
|
15
|
+
options: FinalizeGitOptions
|
|
16
|
+
): Promise<boolean> {
|
|
17
|
+
if (!step.commit) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const { gitManager, logger } = context;
|
|
22
|
+
const hasStagedChanges = await gitManager.hasStagedChanges();
|
|
23
|
+
|
|
24
|
+
if (!hasStagedChanges && !options.allowEmptyCommit) {
|
|
25
|
+
logger.debug('No staged changes to commit for step', { stepId: step.id });
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
await gitManager.commitChanges(options.commitMessage);
|
|
31
|
+
logger.info('Committed changes for step', {
|
|
32
|
+
stepId: step.id,
|
|
33
|
+
message: options.commitMessage,
|
|
34
|
+
});
|
|
35
|
+
} catch (error) {
|
|
36
|
+
logger.error('Failed to commit changes for step', {
|
|
37
|
+
stepId: step.id,
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
});
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (step.push) {
|
|
44
|
+
const branchName = await gitManager.getCurrentBranch();
|
|
45
|
+
await gitManager.pushBranch(branchName);
|
|
46
|
+
logger.info('Pushed branch after step', { stepId: step.id, branch: branchName });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { AgentDefinition, AgentType } from './workflow-types.js';
|
|
2
|
-
export declare class AgentRegistry {
|
|
3
|
-
private agentsByName;
|
|
4
|
-
constructor(definitions?: AgentDefinition[]);
|
|
5
|
-
static getDefaultAgents(): AgentDefinition[];
|
|
6
|
-
register(def: AgentDefinition): void;
|
|
7
|
-
getAgent(name: string): AgentDefinition | undefined;
|
|
8
|
-
listAgents(): AgentDefinition[];
|
|
9
|
-
exportForPostHog(): {
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
agent_type: AgentType;
|
|
13
|
-
description?: string;
|
|
14
|
-
}[];
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=agent-registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/agent-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEtE,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAA2C;gBAEnD,WAAW,CAAC,EAAE,eAAe,EAAE;IAQ3C,MAAM,CAAC,gBAAgB,IAAI,eAAe,EAAE;IAmC5C,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAIpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAInD,UAAU,IAAI,eAAe,EAAE;IAI/B,gBAAgB,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,SAAS,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE;CAGhG"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
class AgentRegistry {
|
|
2
|
-
agentsByName = new Map();
|
|
3
|
-
constructor(definitions) {
|
|
4
|
-
if (definitions) {
|
|
5
|
-
for (const def of definitions)
|
|
6
|
-
this.register(def);
|
|
7
|
-
}
|
|
8
|
-
else {
|
|
9
|
-
for (const def of AgentRegistry.getDefaultAgents())
|
|
10
|
-
this.register(def);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
static getDefaultAgents() {
|
|
14
|
-
return [
|
|
15
|
-
{
|
|
16
|
-
id: 'research',
|
|
17
|
-
name: 'research',
|
|
18
|
-
agent_type: 'research',
|
|
19
|
-
description: 'Explore codebase and generate clarifying questions',
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
id: 'planning',
|
|
23
|
-
name: 'planning',
|
|
24
|
-
agent_type: 'planning',
|
|
25
|
-
description: 'Analyze repo and produce implementation plan',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: 'code_generation',
|
|
29
|
-
name: 'code_generation',
|
|
30
|
-
agent_type: 'execution',
|
|
31
|
-
description: 'Implements code changes using Claude SDK',
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
id: 'review',
|
|
35
|
-
name: 'review',
|
|
36
|
-
agent_type: 'review',
|
|
37
|
-
description: 'Reviews changes and suggests fixes',
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
id: 'testing',
|
|
41
|
-
name: 'testing',
|
|
42
|
-
agent_type: 'testing',
|
|
43
|
-
description: 'Runs tests and reports results',
|
|
44
|
-
},
|
|
45
|
-
];
|
|
46
|
-
}
|
|
47
|
-
register(def) {
|
|
48
|
-
this.agentsByName.set(def.name, def);
|
|
49
|
-
}
|
|
50
|
-
getAgent(name) {
|
|
51
|
-
return this.agentsByName.get(name);
|
|
52
|
-
}
|
|
53
|
-
listAgents() {
|
|
54
|
-
return Array.from(this.agentsByName.values());
|
|
55
|
-
}
|
|
56
|
-
exportForPostHog() {
|
|
57
|
-
return this.listAgents().map(({ id, name, agent_type, description }) => ({ id, name, agent_type, description }));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export { AgentRegistry };
|
|
62
|
-
//# sourceMappingURL=agent-registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registry.js","sources":["../../src/agent-registry.ts"],"sourcesContent":["import type { AgentDefinition, AgentType } from './workflow-types.js';\n\nexport class AgentRegistry {\n private agentsByName: Map<string, AgentDefinition> = new Map();\n\n constructor(definitions?: AgentDefinition[]) {\n if (definitions) {\n for (const def of definitions) this.register(def);\n } else {\n for (const def of AgentRegistry.getDefaultAgents()) this.register(def);\n }\n }\n\n static getDefaultAgents(): AgentDefinition[] {\n return [\n {\n id: 'research',\n name: 'research',\n agent_type: 'research',\n description: 'Explore codebase and generate clarifying questions',\n },\n {\n id: 'planning',\n name: 'planning',\n agent_type: 'planning',\n description: 'Analyze repo and produce implementation plan',\n },\n {\n id: 'code_generation',\n name: 'code_generation',\n agent_type: 'execution',\n description: 'Implements code changes using Claude SDK',\n },\n {\n id: 'review',\n name: 'review',\n agent_type: 'review',\n description: 'Reviews changes and suggests fixes',\n },\n {\n id: 'testing',\n name: 'testing',\n agent_type: 'testing',\n description: 'Runs tests and reports results',\n },\n ];\n }\n\n register(def: AgentDefinition): void {\n this.agentsByName.set(def.name, def);\n }\n\n getAgent(name: string): AgentDefinition | undefined {\n return this.agentsByName.get(name);\n }\n\n listAgents(): AgentDefinition[] {\n return Array.from(this.agentsByName.values());\n }\n\n exportForPostHog(): { id: string; name: string; agent_type: AgentType; description?: string }[] {\n return this.listAgents().map(({ id, name, agent_type, description }) => ({ id, name, agent_type, description }));\n }\n}\n\n"],"names":[],"mappings":"MAEa,aAAa,CAAA;AAChB,IAAA,YAAY,GAAiC,IAAI,GAAG,EAAE;AAE9D,IAAA,WAAA,CAAY,WAA+B,EAAA;QACzC,IAAI,WAAW,EAAE;YACf,KAAK,MAAM,GAAG,IAAI,WAAW;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnD;aAAO;AACL,YAAA,KAAK,MAAM,GAAG,IAAI,aAAa,CAAC,gBAAgB,EAAE;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACxE;IACF;AAEA,IAAA,OAAO,gBAAgB,GAAA;QACrB,OAAO;AACL,YAAA;AACE,gBAAA,EAAE,EAAE,UAAU;AACd,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,UAAU,EAAE,UAAU;AACtB,gBAAA,WAAW,EAAE,oDAAoD;AAClE,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,UAAU;AACd,gBAAA,IAAI,EAAE,UAAU;AAChB,gBAAA,UAAU,EAAE,UAAU;AACtB,gBAAA,WAAW,EAAE,8CAA8C;AAC5D,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,iBAAiB;AACrB,gBAAA,IAAI,EAAE,iBAAiB;AACvB,gBAAA,UAAU,EAAE,WAAW;AACvB,gBAAA,WAAW,EAAE,0CAA0C;AACxD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,QAAQ;AACZ,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,UAAU,EAAE,QAAQ;AACpB,gBAAA,WAAW,EAAE,oCAAoC;AAClD,aAAA;AACD,YAAA;AACE,gBAAA,EAAE,EAAE,SAAS;AACb,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,UAAU,EAAE,SAAS;AACrB,gBAAA,WAAW,EAAE,gCAAgC;AAC9C,aAAA;SACF;IACH;AAEA,IAAA,QAAQ,CAAC,GAAoB,EAAA;QAC3B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;IACtC;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC;IAEA,UAAU,GAAA;QACR,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;IAC/C;IAEA,gBAAgB,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;IAClH;AACD;;;;"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Logger } from './utils/logger.js';
|
|
2
|
-
import { AgentRegistry } from './agent-registry.js';
|
|
3
|
-
import type { AgentEvent, Task, McpServerConfig } from './types.js';
|
|
4
|
-
import type { WorkflowStage, WorkflowStageExecutionResult, WorkflowExecutionOptions } from './workflow-types.js';
|
|
5
|
-
import { PromptBuilder } from './prompt-builder.js';
|
|
6
|
-
export declare class StageExecutor {
|
|
7
|
-
private registry;
|
|
8
|
-
private logger;
|
|
9
|
-
private adapter;
|
|
10
|
-
private promptBuilder;
|
|
11
|
-
private eventHandler?;
|
|
12
|
-
private mcpServers?;
|
|
13
|
-
constructor(registry: AgentRegistry, logger: Logger, promptBuilder?: PromptBuilder, eventHandler?: (event: AgentEvent) => void, mcpServers?: Record<string, McpServerConfig>);
|
|
14
|
-
setEventHandler(handler?: (event: AgentEvent) => void): void;
|
|
15
|
-
execute(task: Task, stage: WorkflowStage, options: WorkflowExecutionOptions): Promise<WorkflowStageExecutionResult>;
|
|
16
|
-
private runResearch;
|
|
17
|
-
private runPlanning;
|
|
18
|
-
private runExecution;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=stage-executor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stage-executor.d.ts","sourceRoot":"","sources":["../../src/stage-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAIjH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,YAAY,CAAC,CAA8B;IACnD,OAAO,CAAC,UAAU,CAAC,CAAkC;gBAGnD,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,aAAa,EAC7B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAc9C,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAItD,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,4BAA4B,CAAC;YAiC3G,WAAW;YA+CX,WAAW;YA+CX,YAAY;CAwC3B"}
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
-
import './utils/logger.js';
|
|
3
|
-
import { ClaudeAdapter } from './adapters/claude/claude-adapter.js';
|
|
4
|
-
import { RESEARCH_SYSTEM_PROMPT } from './agents/research.js';
|
|
5
|
-
import { PLANNING_SYSTEM_PROMPT } from './agents/planning.js';
|
|
6
|
-
import { EXECUTION_SYSTEM_PROMPT } from './agents/execution.js';
|
|
7
|
-
import { PromptBuilder } from './prompt-builder.js';
|
|
8
|
-
|
|
9
|
-
class StageExecutor {
|
|
10
|
-
registry;
|
|
11
|
-
logger;
|
|
12
|
-
adapter;
|
|
13
|
-
promptBuilder;
|
|
14
|
-
eventHandler;
|
|
15
|
-
mcpServers;
|
|
16
|
-
constructor(registry, logger, promptBuilder, eventHandler, mcpServers) {
|
|
17
|
-
this.registry = registry;
|
|
18
|
-
this.logger = logger.child('StageExecutor');
|
|
19
|
-
this.adapter = new ClaudeAdapter();
|
|
20
|
-
this.promptBuilder = promptBuilder || new PromptBuilder({
|
|
21
|
-
getTaskFiles: async () => [],
|
|
22
|
-
generatePlanTemplate: async () => '',
|
|
23
|
-
logger,
|
|
24
|
-
});
|
|
25
|
-
this.eventHandler = eventHandler;
|
|
26
|
-
this.mcpServers = mcpServers;
|
|
27
|
-
}
|
|
28
|
-
setEventHandler(handler) {
|
|
29
|
-
this.eventHandler = handler;
|
|
30
|
-
}
|
|
31
|
-
async execute(task, stage, options) {
|
|
32
|
-
const isManual = stage.is_manual_only === true;
|
|
33
|
-
if (isManual) {
|
|
34
|
-
this.logger.info('Manual stage detected; skipping agent execution', { stage: stage.key });
|
|
35
|
-
return { results: [] };
|
|
36
|
-
}
|
|
37
|
-
const inferredAgent = stage.key.toLowerCase().includes('plan') ? 'planning_basic' : 'code_generation';
|
|
38
|
-
const agentName = stage.agent_name || inferredAgent;
|
|
39
|
-
const agent = this.registry.getAgent(agentName);
|
|
40
|
-
if (!agent) {
|
|
41
|
-
throw new Error(`Unknown agent '${agentName}' for stage '${stage.key}'`);
|
|
42
|
-
}
|
|
43
|
-
const permissionMode = options.permissionMode || 'acceptEdits';
|
|
44
|
-
const cwd = options.repositoryPath || process.cwd();
|
|
45
|
-
switch (agent.agent_type) {
|
|
46
|
-
case 'research':
|
|
47
|
-
return this.runResearch(task, cwd, options, stage.key);
|
|
48
|
-
case 'planning':
|
|
49
|
-
return this.runPlanning(task, cwd, options, stage.key);
|
|
50
|
-
case 'execution':
|
|
51
|
-
return this.runExecution(task, cwd, permissionMode, options, stage.key);
|
|
52
|
-
case 'review': // TODO: Implement review
|
|
53
|
-
case 'testing': // TODO: Implement testing
|
|
54
|
-
default:
|
|
55
|
-
// throw new Error(`Unsupported agent type: ${agent.agent_type}`);
|
|
56
|
-
console.warn(`Unsupported agent type: ${agent.agent_type}`);
|
|
57
|
-
return { results: [] };
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
async runResearch(task, cwd, options, stageKey) {
|
|
61
|
-
const contextPrompt = await this.promptBuilder.buildResearchPrompt(task, cwd);
|
|
62
|
-
let prompt = RESEARCH_SYSTEM_PROMPT + '\n\n' + contextPrompt;
|
|
63
|
-
const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['research'];
|
|
64
|
-
const mergedOverrides = {
|
|
65
|
-
...(options.queryOverrides || {}),
|
|
66
|
-
...(stageOverrides?.queryOverrides || {}),
|
|
67
|
-
};
|
|
68
|
-
const baseOptions = {
|
|
69
|
-
model: 'claude-sonnet-4-5-20250929',
|
|
70
|
-
cwd,
|
|
71
|
-
permissionMode: 'plan',
|
|
72
|
-
settingSources: ['local'],
|
|
73
|
-
mcpServers: this.mcpServers
|
|
74
|
-
};
|
|
75
|
-
const response = query({
|
|
76
|
-
prompt,
|
|
77
|
-
options: { ...baseOptions, ...mergedOverrides },
|
|
78
|
-
});
|
|
79
|
-
let research = '';
|
|
80
|
-
for await (const message of response) {
|
|
81
|
-
// Emit raw SDK event first
|
|
82
|
-
this.eventHandler?.(this.adapter.createRawSDKEvent(message));
|
|
83
|
-
// Then emit transformed event
|
|
84
|
-
const transformed = this.adapter.transform(message);
|
|
85
|
-
if (transformed) {
|
|
86
|
-
if (transformed.type !== 'token') {
|
|
87
|
-
this.logger.debug('Research event', { type: transformed.type });
|
|
88
|
-
}
|
|
89
|
-
this.eventHandler?.(transformed);
|
|
90
|
-
}
|
|
91
|
-
if (message.type === 'assistant' && message.message?.content) {
|
|
92
|
-
for (const c of message.message.content) {
|
|
93
|
-
if (c.type === 'text' && c.text)
|
|
94
|
-
research += c.text + '\n';
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return { plan: research.trim() }; // Return as 'plan' field to match existing interface
|
|
99
|
-
}
|
|
100
|
-
async runPlanning(task, cwd, options, stageKey) {
|
|
101
|
-
const contextPrompt = await this.promptBuilder.buildPlanningPrompt(task, cwd);
|
|
102
|
-
let prompt = PLANNING_SYSTEM_PROMPT + '\n\n' + contextPrompt;
|
|
103
|
-
const stageOverrides = options.stageOverrides?.[stageKey] || options.stageOverrides?.['plan'];
|
|
104
|
-
const mergedOverrides = {
|
|
105
|
-
...(options.queryOverrides || {}),
|
|
106
|
-
...(stageOverrides?.queryOverrides || {}),
|
|
107
|
-
};
|
|
108
|
-
const baseOptions = {
|
|
109
|
-
model: 'claude-sonnet-4-5-20250929',
|
|
110
|
-
cwd,
|
|
111
|
-
permissionMode: 'plan',
|
|
112
|
-
settingSources: ['local'],
|
|
113
|
-
mcpServers: this.mcpServers
|
|
114
|
-
};
|
|
115
|
-
const response = query({
|
|
116
|
-
prompt,
|
|
117
|
-
options: { ...baseOptions, ...mergedOverrides },
|
|
118
|
-
});
|
|
119
|
-
let plan = '';
|
|
120
|
-
for await (const message of response) {
|
|
121
|
-
// Emit raw SDK event first
|
|
122
|
-
this.eventHandler?.(this.adapter.createRawSDKEvent(message));
|
|
123
|
-
// Then emit transformed event
|
|
124
|
-
const transformed = this.adapter.transform(message);
|
|
125
|
-
if (transformed) {
|
|
126
|
-
if (transformed.type !== 'token') {
|
|
127
|
-
this.logger.debug('Planning event', { type: transformed.type });
|
|
128
|
-
}
|
|
129
|
-
this.eventHandler?.(transformed);
|
|
130
|
-
}
|
|
131
|
-
if (message.type === 'assistant' && message.message?.content) {
|
|
132
|
-
for (const c of message.message.content) {
|
|
133
|
-
if (c.type === 'text' && c.text)
|
|
134
|
-
plan += c.text + '\n';
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
return { plan: plan.trim() };
|
|
139
|
-
}
|
|
140
|
-
async runExecution(task, cwd, permissionMode, options, stageKey) {
|
|
141
|
-
const contextPrompt = await this.promptBuilder.buildExecutionPrompt(task, cwd);
|
|
142
|
-
let prompt = EXECUTION_SYSTEM_PROMPT + '\n\n' + contextPrompt;
|
|
143
|
-
const stageOverrides = options.stageOverrides?.[stageKey];
|
|
144
|
-
const mergedOverrides = {
|
|
145
|
-
...(options.queryOverrides || {}),
|
|
146
|
-
...(stageOverrides?.queryOverrides || {}),
|
|
147
|
-
};
|
|
148
|
-
const baseOptions = {
|
|
149
|
-
model: 'claude-sonnet-4-5-20250929',
|
|
150
|
-
cwd,
|
|
151
|
-
permissionMode,
|
|
152
|
-
settingSources: ['local'],
|
|
153
|
-
mcpServers: this.mcpServers
|
|
154
|
-
};
|
|
155
|
-
const response = query({
|
|
156
|
-
prompt,
|
|
157
|
-
options: { ...baseOptions, ...mergedOverrides },
|
|
158
|
-
});
|
|
159
|
-
const results = [];
|
|
160
|
-
for await (const message of response) {
|
|
161
|
-
// Emit raw SDK event first
|
|
162
|
-
this.eventHandler?.(this.adapter.createRawSDKEvent(message));
|
|
163
|
-
// Then emit transformed event
|
|
164
|
-
const transformed = this.adapter.transform(message);
|
|
165
|
-
if (transformed) {
|
|
166
|
-
if (transformed.type !== 'token') {
|
|
167
|
-
this.logger.debug('Execution event', { type: transformed.type });
|
|
168
|
-
}
|
|
169
|
-
this.eventHandler?.(transformed);
|
|
170
|
-
}
|
|
171
|
-
results.push(message);
|
|
172
|
-
}
|
|
173
|
-
return { results };
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export { StageExecutor };
|
|
178
|
-
//# sourceMappingURL=stage-executor.js.map
|