@posthog/agent 1.0.2 → 1.2.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 (61) hide show
  1. package/CLAUDE.md +68 -35
  2. package/README.md +46 -14
  3. package/dist/index.js +4 -5
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/agent-registry.js +4 -2
  6. package/dist/src/agent-registry.js.map +1 -1
  7. package/dist/src/agent.d.ts +4 -1
  8. package/dist/src/agent.d.ts.map +1 -1
  9. package/dist/src/agent.js +45 -14
  10. package/dist/src/agent.js.map +1 -1
  11. package/dist/src/agents/execution.js +4 -2
  12. package/dist/src/agents/execution.js.map +1 -1
  13. package/dist/src/agents/planning.js +4 -2
  14. package/dist/src/agents/planning.js.map +1 -1
  15. package/dist/src/event-transformer.d.ts +2 -0
  16. package/dist/src/event-transformer.d.ts.map +1 -1
  17. package/dist/src/event-transformer.js +57 -7
  18. package/dist/src/event-transformer.js.map +1 -1
  19. package/dist/src/file-manager.js +17 -14
  20. package/dist/src/file-manager.js.map +1 -1
  21. package/dist/src/git-manager.js +5 -2
  22. package/dist/src/git-manager.js.map +1 -1
  23. package/dist/src/posthog-api.d.ts +34 -0
  24. package/dist/src/posthog-api.d.ts.map +1 -1
  25. package/dist/src/posthog-api.js +42 -2
  26. package/dist/src/posthog-api.js.map +1 -1
  27. package/dist/src/prompt-builder.js +5 -2
  28. package/dist/src/prompt-builder.js.map +1 -1
  29. package/dist/src/stage-executor.d.ts +4 -2
  30. package/dist/src/stage-executor.d.ts.map +1 -1
  31. package/dist/src/stage-executor.js +22 -9
  32. package/dist/src/stage-executor.js.map +1 -1
  33. package/dist/src/task-manager.js +5 -2
  34. package/dist/src/task-manager.js.map +1 -1
  35. package/dist/src/task-progress-reporter.d.ts +44 -0
  36. package/dist/src/task-progress-reporter.d.ts.map +1 -0
  37. package/dist/src/task-progress-reporter.js +234 -0
  38. package/dist/src/task-progress-reporter.js.map +1 -0
  39. package/dist/src/template-manager.d.ts.map +1 -1
  40. package/dist/src/template-manager.js +16 -6
  41. package/dist/src/template-manager.js.map +1 -1
  42. package/dist/src/types.js +4 -2
  43. package/dist/src/types.js.map +1 -1
  44. package/dist/src/utils/logger.js +5 -3
  45. package/dist/src/utils/logger.js.map +1 -1
  46. package/dist/src/utils/mcp.js +4 -2
  47. package/dist/src/utils/mcp.js.map +1 -1
  48. package/dist/src/workflow-registry.js +4 -3
  49. package/dist/src/workflow-registry.js.map +1 -1
  50. package/dist/templates/plan-template.md +45 -0
  51. package/package.json +8 -2
  52. package/src/agent.ts +41 -8
  53. package/src/event-transformer.ts +61 -7
  54. package/src/posthog-api.ts +79 -0
  55. package/src/stage-executor.ts +24 -8
  56. package/src/task-progress-reporter.ts +287 -0
  57. package/src/template-manager.ts +11 -3
  58. package/dist/example.js +0 -49
  59. package/dist/example.js.map +0 -1
  60. package/dist/src/workflow-types.js +0 -2
  61. package/dist/src/workflow-types.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-progress-reporter.js","sources":["../../src/task-progress-reporter.ts"],"sourcesContent":["import type { Logger } from './utils/logger.js';\nimport type { PostHogAPIClient, TaskProgressRecord, TaskProgressUpdate } from './posthog-api.js';\nimport type { AgentEvent } from './types.js';\n\ninterface ProgressMetadata {\n workflowId?: string;\n workflowRunId?: string;\n activityId?: string;\n totalSteps?: number;\n}\n\n/**\n * Persists task execution progress to PostHog so clients can poll for updates.\n *\n * The reporter is intentionally best-effort – failures are logged but never\n * allowed to break the agent execution flow.\n */\nexport class TaskProgressReporter {\n private posthogAPI?: PostHogAPIClient;\n private logger: Logger;\n private progressRecord?: TaskProgressRecord;\n private taskId?: string;\n private outputLog: string[] = [];\n private totalSteps?: number;\n private lastLogEntry?: string;\n\n constructor(posthogAPI: PostHogAPIClient | undefined, logger: Logger) {\n this.posthogAPI = posthogAPI;\n this.logger = logger.child('TaskProgressReporter');\n }\n\n get progressId(): string | undefined {\n return this.progressRecord?.id;\n }\n\n async start(taskId: string, metadata: ProgressMetadata = {}): Promise<void> {\n if (!this.posthogAPI) {\n return;\n }\n\n this.taskId = taskId;\n this.totalSteps = metadata.totalSteps;\n\n try {\n const record = await this.posthogAPI.createTaskProgress(taskId, {\n status: 'started',\n current_step: 'initializing',\n total_steps: metadata.totalSteps ?? 0,\n completed_steps: 0,\n workflow_id: metadata.workflowId,\n workflow_run_id: metadata.workflowRunId,\n activity_id: metadata.activityId,\n output_log: '',\n });\n this.progressRecord = record;\n this.outputLog = record.output_log ? record.output_log.split('\\n') : [];\n this.logger.debug('Created task progress record', { taskId, progressId: record.id });\n } catch (error) {\n this.logger.warn('Failed to create task progress record', { taskId, error: (error as Error).message });\n }\n }\n\n async stageStarted(stageKey: string, stageIndex: number): Promise<void> {\n await this.update({\n status: 'in_progress',\n current_step: stageKey,\n completed_steps: Math.min(stageIndex, this.totalSteps ?? stageIndex),\n }, `Stage started: ${stageKey}`);\n }\n\n async stageCompleted(stageKey: string, completedStages: number): Promise<void> {\n await this.update({\n status: 'in_progress',\n current_step: stageKey,\n completed_steps: Math.min(completedStages, this.totalSteps ?? completedStages),\n }, `Stage completed: ${stageKey}`);\n }\n\n async branchCreated(stageKey: string, branchName: string): Promise<void> {\n await this.appendLog(`Branch created (${stageKey}): ${branchName}`);\n }\n\n async commitMade(stageKey: string, kind: 'plan' | 'implementation'): Promise<void> {\n await this.appendLog(`Commit made (${stageKey}, ${kind})`);\n }\n\n async pullRequestCreated(stageKey: string, prUrl: string): Promise<void> {\n await this.appendLog(`Pull request created (${stageKey}): ${prUrl}`);\n }\n\n async noNextStage(stageKey?: string): Promise<void> {\n await this.appendLog(\n stageKey\n ? `No next stage available after '${stageKey}'. Execution halted.`\n : 'No next stage available. Execution halted.'\n );\n }\n\n async complete(): Promise<void> {\n await this.update({ status: 'completed', completed_steps: this.totalSteps }, 'Workflow execution completed');\n }\n\n async fail(error: Error | string): Promise<void> {\n const message = typeof error === 'string' ? error : error.message;\n await this.update({ status: 'failed', error_message: message }, `Workflow execution failed: ${message}`);\n }\n\n async appendLog(line: string): Promise<void> {\n await this.update({}, line);\n }\n\n async recordEvent(event: AgentEvent): Promise<void> {\n if (!this.posthogAPI || !this.progressId || !this.taskId) {\n return;\n }\n\n switch (event.type) {\n case 'token':\n case 'message_delta':\n case 'content_block_start':\n case 'content_block_stop':\n case 'compact_boundary':\n case 'tool_call':\n case 'tool_result':\n case 'message_start':\n case 'message_stop':\n case 'metric':\n case 'artifact':\n // Skip verbose streaming artifacts from persistence\n return;\n\n case 'file_write':\n await this.appendLog(this.formatFileWriteEvent(event));\n return;\n\n case 'diff':\n await this.appendLog(this.formatDiffEvent(event));\n return;\n\n case 'status':\n // Status events are covered by dedicated progress updates\n return;\n\n case 'error':\n await this.appendLog(`[error] ${event.message}`);\n return;\n\n case 'done': {\n const cost = event.totalCostUsd !== undefined ? ` cost=$${event.totalCostUsd.toFixed(2)}` : '';\n await this.appendLog(\n `[done] duration=${event.durationMs ?? 'unknown'}ms turns=${event.numTurns ?? 'unknown'}${cost}`\n );\n return;\n }\n\n case 'init':\n // Omit verbose init messages from persisted log\n return;\n\n case 'user_message': {\n const summary = this.summarizeUserMessage(event.content);\n if (summary) {\n await this.appendLog(summary);\n }\n return;\n }\n\n default:\n // For any unfamiliar event types, avoid spamming the log.\n return;\n }\n }\n\n private async update(update: TaskProgressUpdate, logLine?: string): Promise<void> {\n if (!this.posthogAPI || !this.progressId || !this.taskId) {\n return;\n }\n\n if (logLine) {\n if (logLine !== this.lastLogEntry) {\n this.outputLog.push(logLine);\n this.lastLogEntry = logLine;\n }\n update.output_log = this.outputLog.join('\\n');\n }\n\n try {\n const record = await this.posthogAPI.updateTaskProgress(this.taskId, this.progressId, update);\n // Sync local cache with server response to avoid drift if server modifies values\n this.progressRecord = record;\n if (record.output_log !== undefined && record.output_log !== null) {\n this.outputLog = record.output_log ? record.output_log.split('\\n') : [];\n }\n } catch (error) {\n this.logger.warn('Failed to update task progress record', {\n taskId: this.taskId,\n progressId: this.progressId,\n error: (error as Error).message,\n });\n }\n }\n\n private summarizeUserMessage(content?: string): string | null {\n if (!content) {\n return null;\n }\n const trimmed = content.trim();\n if (!trimmed) {\n return null;\n }\n\n const fileUpdateMatch = trimmed.match(/The file\\s+([^\\s]+)\\s+has been updated/i);\n if (fileUpdateMatch) {\n return `[user] file updated: ${fileUpdateMatch[1]}`;\n }\n\n if (/Todos have been modified/i.test(trimmed)) {\n return '[todo] list updated';\n }\n\n const diffMatch = trimmed.match(/diff --git a\\/([^\\s]+) b\\/([^\\s]+)/);\n if (diffMatch) {\n return `[diff] ${diffMatch[2] ?? diffMatch[1]}`;\n }\n\n const gitStatusMatch = trimmed.match(/^On branch ([^\\n]+)/);\n if (gitStatusMatch) {\n return `[git] status ${gitStatusMatch[1]}`;\n }\n\n if (/This Bash command contains multiple operations/i.test(trimmed)) {\n return '[approval] multi-step command pending';\n }\n\n if (/This command requires approval/i.test(trimmed)) {\n return '[approval] command awaiting approval';\n }\n\n if (/^Exit plan mode\\?/i.test(trimmed)) {\n return null;\n }\n\n if (trimmed.includes('node_modules')) {\n return null;\n }\n\n if (trimmed.includes('total ') && trimmed.includes('drwx')) {\n return null;\n }\n\n if (trimmed.includes('→')) {\n return null;\n }\n\n if (trimmed.split('\\n').length > 2) {\n return null;\n }\n\n const normalized = trimmed.replace(/\\s+/g, ' ');\n const maxLen = 120;\n if (!normalized) {\n return null;\n }\n const preview = normalized.length > maxLen ? `${normalized.slice(0, maxLen)}…` : normalized;\n return `[user] ${preview}`;\n }\n\n private formatFileWriteEvent(event: Extract<AgentEvent, { type: 'file_write' }>): string {\n const size = event.bytes !== undefined ? ` (${event.bytes} bytes)` : '';\n return `[file] wrote ${event.path}${size}`;\n }\n\n private formatDiffEvent(event: Extract<AgentEvent, { type: 'diff' }>): string {\n const summary = event.summary\n ? event.summary.trim()\n : this.truncateMultiline(event.patch ?? '', 160);\n return `[diff] ${event.file}${summary ? ` | ${summary}` : ''}`;\n }\n\n private truncateMultiline(text: string, max = 160): string {\n if (!text) {\n return '';\n }\n const compact = text.replace(/\\s+/g, ' ').trim();\n return compact.length > max ? `${compact.slice(0, max)}…` : compact;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../src/template-manager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;;YAQf,YAAY;IAS1B,OAAO,CAAC,mBAAmB;IAerB,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3D,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvF,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACrE,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,eAAe,CAAC,EAAE,KAAK,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;KACJ,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAA;KAAE,CAAC,CAAC;IA2CxG,qBAAqB,IAAI,MAAM;CAmChC"}
1
+ {"version":3,"file":"template-manager.d.ts","sourceRoot":"","sources":["../../src/template-manager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,YAAY,CAAS;;YAgBf,YAAY;IAS1B,OAAO,CAAC,mBAAmB;IAerB,YAAY,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAS3D,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQvF,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACrE,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,eAAe,CAAC,EAAE,KAAK,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;KACJ,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAA;KAAE,CAAC,CAAC;IA2CxG,qBAAqB,IAAI,MAAM;CAmChC"}
@@ -1,17 +1,25 @@
1
- import { promises as fs } from 'fs';
2
- import { join, dirname } from 'path';
1
+ import { existsSync, promises } from 'fs';
2
+ import { dirname, join } from 'path';
3
3
  import { fileURLToPath } from 'url';
4
- export class TemplateManager {
4
+
5
+ class TemplateManager {
5
6
  templatesDir;
6
7
  constructor() {
7
8
  const __filename = fileURLToPath(import.meta.url);
8
9
  const __dirname = dirname(__filename);
9
- this.templatesDir = join(__dirname, 'templates');
10
+ const candidateDirs = [
11
+ join(__dirname, 'templates'),
12
+ join(__dirname, '..', 'templates'),
13
+ join(__dirname, '..', '..', 'templates'),
14
+ join(__dirname, '..', '..', 'src', 'templates')
15
+ ];
16
+ const resolvedDir = candidateDirs.find((dir) => existsSync(dir));
17
+ this.templatesDir = resolvedDir ?? candidateDirs[0];
10
18
  }
11
19
  async loadTemplate(templateName) {
12
20
  try {
13
21
  const templatePath = join(this.templatesDir, templateName);
14
- return await fs.readFile(templatePath, 'utf8');
22
+ return await promises.readFile(templatePath, 'utf8');
15
23
  }
16
24
  catch (error) {
17
25
  throw new Error(`Failed to load template ${templateName}: ${error}`);
@@ -115,4 +123,6 @@ Customize \`.posthog/.gitignore\` to control which files are committed:
115
123
  `;
116
124
  }
117
125
  }
118
- //# sourceMappingURL=template-manager.js.map
126
+
127
+ export { TemplateManager };
128
+ //# sourceMappingURL=template-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-manager.js","sourceRoot":"","sources":["../../src/template-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-manager.js","sources":["../../src/template-manager.ts"],"sourcesContent":["import { promises as fs, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nexport interface TemplateVariables {\n task_id: string;\n task_title: string;\n task_description?: string;\n date: string;\n repository?: string;\n [key: string]: string | undefined;\n}\n\nexport class TemplateManager {\n private templatesDir: string;\n\n constructor() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const candidateDirs = [\n join(__dirname, 'templates'),\n join(__dirname, '..', 'templates'),\n join(__dirname, '..', '..', 'templates'),\n join(__dirname, '..', '..', 'src', 'templates')\n ];\n\n const resolvedDir = candidateDirs.find((dir) => existsSync(dir));\n this.templatesDir = resolvedDir ?? candidateDirs[0];\n }\n\n private async loadTemplate(templateName: string): Promise<string> {\n try {\n const templatePath = join(this.templatesDir, templateName);\n return await fs.readFile(templatePath, 'utf8');\n } catch (error) {\n throw new Error(`Failed to load template ${templateName}: ${error}`);\n }\n }\n\n private substituteVariables(template: string, variables: TemplateVariables): string {\n let result = template;\n \n for (const [key, value] of Object.entries(variables)) {\n if (value !== undefined) {\n const placeholder = new RegExp(`{{${key}}}`, 'g');\n result = result.replace(placeholder, value);\n }\n }\n \n result = result.replace(/{{[^}]+}}/g, '[PLACEHOLDER]');\n \n return result;\n }\n\n async generatePlan(variables: TemplateVariables): Promise<string> {\n const template = await this.loadTemplate('plan-template.md');\n return this.substituteVariables(template, {\n ...variables,\n date: variables.date || new Date().toISOString().split('T')[0]\n });\n }\n\n\n async generateCustomFile(templateName: string, variables: TemplateVariables): Promise<string> {\n const template = await this.loadTemplate(templateName);\n return this.substituteVariables(template, {\n ...variables,\n date: variables.date || new Date().toISOString().split('T')[0]\n });\n }\n\n async createTaskStructure(taskId: string, taskTitle: string, options?: {\n includePlan?: boolean;\n additionalFiles?: Array<{\n name: string;\n template?: string;\n content?: string;\n }>;\n }): Promise<Array<{ name: string; content: string; type: 'plan' | 'context' | 'reference' | 'output' }>> {\n const files: Array<{ name: string; content: string; type: 'plan' | 'context' | 'reference' | 'output' }> = [];\n \n const variables: TemplateVariables = {\n task_id: taskId,\n task_title: taskTitle,\n date: new Date().toISOString().split('T')[0]\n };\n\n // Generate plan file if requested\n if (options?.includePlan !== false) {\n const planContent = await this.generatePlan(variables);\n files.push({\n name: 'plan.md',\n content: planContent,\n type: 'plan'\n });\n }\n\n\n if (options?.additionalFiles) {\n for (const file of options.additionalFiles) {\n let content: string;\n \n if (file.template) {\n content = await this.generateCustomFile(file.template, variables);\n } else if (file.content) {\n content = this.substituteVariables(file.content, variables);\n } else {\n content = `# ${file.name}\\n\\nPlaceholder content for ${file.name}`;\n }\n\n files.push({\n name: file.name,\n content,\n type: file.name.includes('context') ? 'context' : 'reference'\n });\n }\n }\n\n return files;\n }\n\n generatePostHogReadme(): string {\n return `# PostHog Task Files\n\nThis directory contains task-related files generated by the PostHog Agent.\n\n## Structure\n\nEach task has its own subdirectory: \\`.posthog/{task-id}/\\`\n\n### Common Files\n\n- **plan.md** - Implementation plan generated during planning phase\n- **Supporting files** - Any additional files added for task context\n- **artifacts/** - Generated files, outputs, and temporary artifacts\n\n### Usage\n\nThese files are:\n- Version controlled alongside your code\n- Used by the PostHog Agent for context\n- Available for review in pull requests\n- Organized by task ID for easy reference\n\n### Gitignore\n\nCustomize \\`.posthog/.gitignore\\` to control which files are committed:\n- Include plans and documentation by default\n- Exclude temporary files and sensitive data\n- Customize based on your team's workflow\n\n---\n\n*Generated by PostHog Agent*\n`;\n }\n}\n"],"names":["fs"],"mappings":"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"}
package/dist/src/types.js CHANGED
@@ -1,9 +1,11 @@
1
1
  // Removed legacy ExecutionMode in favor of configurable workflows
2
- export var PermissionMode;
2
+ var PermissionMode;
3
3
  (function (PermissionMode) {
4
4
  PermissionMode["PLAN"] = "plan";
5
5
  PermissionMode["DEFAULT"] = "default";
6
6
  PermissionMode["ACCEPT_EDITS"] = "acceptEdits";
7
7
  PermissionMode["BYPASS"] = "bypassPermissions";
8
8
  })(PermissionMode || (PermissionMode = {}));
9
- //# sourceMappingURL=types.js.map
9
+
10
+ export { PermissionMode };
11
+ //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AA0BA,kEAAkE;AAElE,MAAM,CAAN,IAAY,cAKX;AALD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,qCAAmB,CAAA;IACnB,8CAA4B,CAAA;IAC5B,8CAA4B,CAAA;AAC9B,CAAC,EALW,cAAc,KAAd,cAAc,QAKzB"}
1
+ {"version":3,"file":"types.js","sources":["../../src/types.ts"],"sourcesContent":["// PostHog Task model (matches Array's OpenAPI schema)\nexport interface Task {\n id: string;\n title: string;\n description: string;\n origin_product: 'error_tracking' | 'eval_clusters' | 'user_created' | 'support_queue' | 'session_summaries';\n position?: number;\n workflow?: string | null;\n current_stage?: string | null;\n github_integration?: number | null;\n repository_config?: unknown; // JSONField\n repository_list: string;\n primary_repository: string;\n github_branch: string | null;\n github_pr_url: string | null;\n created_at: string;\n updated_at: string;\n}\n\nexport interface SupportingFile {\n name: string;\n content: string;\n type: 'plan' | 'context' | 'reference' | 'output';\n created_at: string;\n}\n\n// Removed legacy ExecutionMode in favor of configurable workflows\n\nexport enum PermissionMode {\n PLAN = \"plan\",\n DEFAULT = \"default\",\n ACCEPT_EDITS = \"acceptEdits\",\n BYPASS = \"bypassPermissions\"\n}\n\nexport interface ExecutionOptions {\n repositoryPath?: string;\n permissionMode?: PermissionMode;\n}\n\n// Base event with timestamp\ninterface BaseEvent {\n ts: number;\n}\n\n// Streaming content events\nexport interface TokenEvent extends BaseEvent {\n type: 'token';\n content: string;\n contentType?: 'text' | 'thinking' | 'tool_input';\n}\n\nexport interface ContentBlockStartEvent extends BaseEvent {\n type: 'content_block_start';\n index: number;\n contentType: 'text' | 'tool_use' | 'thinking';\n toolName?: string;\n toolId?: string;\n}\n\nexport interface ContentBlockStopEvent extends BaseEvent {\n type: 'content_block_stop';\n index: number;\n}\n\n// Tool events\nexport interface ToolCallEvent extends BaseEvent {\n type: 'tool_call';\n toolName: string;\n callId: string;\n args: Record<string, any>;\n}\n\nexport interface ToolResultEvent extends BaseEvent {\n type: 'tool_result';\n toolName: string;\n callId: string;\n result: any;\n}\n\n// Message lifecycle events\nexport interface MessageStartEvent extends BaseEvent {\n type: 'message_start';\n messageId?: string;\n model?: string;\n}\n\nexport interface MessageDeltaEvent extends BaseEvent {\n type: 'message_delta';\n stopReason?: string;\n stopSequence?: string;\n usage?: {\n outputTokens: number;\n };\n}\n\nexport interface MessageStopEvent extends BaseEvent {\n type: 'message_stop';\n}\n\n// User message events\nexport interface UserMessageEvent extends BaseEvent {\n type: 'user_message';\n content: string;\n isSynthetic?: boolean;\n}\n\n// System events\nexport interface StatusEvent extends BaseEvent {\n type: 'status';\n phase: string;\n [key: string]: any;\n}\n\nexport interface InitEvent extends BaseEvent {\n type: 'init';\n model: string;\n tools: string[];\n permissionMode: string;\n cwd: string;\n apiKeySource: string;\n}\n\nexport interface CompactBoundaryEvent extends BaseEvent {\n type: 'compact_boundary';\n trigger: 'manual' | 'auto';\n preTokens: number;\n}\n\n// Result events\nexport interface DoneEvent extends BaseEvent {\n type: 'done';\n durationMs?: number;\n numTurns?: number;\n totalCostUsd?: number;\n usage?: any;\n}\n\nexport interface ErrorEvent extends BaseEvent {\n type: 'error';\n message: string;\n error?: any;\n errorType?: string;\n}\n\n// Legacy events (keeping for backwards compatibility)\nexport interface DiffEvent extends BaseEvent {\n type: 'diff';\n file: string;\n patch: string;\n summary?: string;\n}\n\nexport interface FileWriteEvent extends BaseEvent {\n type: 'file_write';\n path: string;\n bytes: number;\n}\n\nexport interface MetricEvent extends BaseEvent {\n type: 'metric';\n key: string;\n value: number;\n unit?: string;\n}\n\nexport interface ArtifactEvent extends BaseEvent {\n type: 'artifact';\n kind: string;\n content: any;\n}\n\nexport type AgentEvent =\n | TokenEvent\n | ContentBlockStartEvent\n | ContentBlockStopEvent\n | ToolCallEvent\n | ToolResultEvent\n | MessageStartEvent\n | MessageDeltaEvent\n | MessageStopEvent\n | UserMessageEvent\n | StatusEvent\n | InitEvent\n | CompactBoundaryEvent\n | DoneEvent\n | ErrorEvent\n | DiffEvent\n | FileWriteEvent\n | MetricEvent\n | ArtifactEvent;\n\nexport interface ExecutionResult {\n results: any[];\n}\n\nexport interface PlanResult {\n plan: string;\n}\n\nexport interface TaskExecutionResult {\n task: Task;\n plan?: string;\n executionResult?: ExecutionResult;\n // Deprecated: mode removed in workflow-based execution\n}\n\nexport interface AgentConfig {\n workingDirectory?: string;\n onEvent?: (event: AgentEvent) => void;\n \n // PostHog API configuration\n posthogApiUrl?: string;\n posthogApiKey?: string;\n \n // Logging configuration\n debug?: boolean;\n}\n\nexport interface PostHogAPIConfig {\n apiUrl: string;\n apiKey: string;\n}"],"names":[],"mappings":"AA0BA;IAEY;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,cAAA,CAAA,GAAA,aAA4B;AAC5B,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,mBAA4B;AAC9B,CAAC,EALW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;;;;"}
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Simple logger utility with configurable debug mode
3
3
  */
4
- export var LogLevel;
4
+ var LogLevel;
5
5
  (function (LogLevel) {
6
6
  LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
7
7
  LogLevel[LogLevel["WARN"] = 1] = "WARN";
8
8
  LogLevel[LogLevel["INFO"] = 2] = "INFO";
9
9
  LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
10
10
  })(LogLevel || (LogLevel = {}));
11
- export class Logger {
11
+ class Logger {
12
12
  debugEnabled;
13
13
  prefix;
14
14
  constructor(config = {}) {
@@ -63,4 +63,6 @@ export class Logger {
63
63
  });
64
64
  }
65
65
  }
66
- //# sourceMappingURL=logger.js.map
66
+
67
+ export { LogLevel, Logger };
68
+ //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAChB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACb,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAOD,MAAM,OAAO,MAAM;IACP,YAAY,CAAU;IACtB,MAAM,CAAS;IAEvB,YAAY,SAAuB,EAAE;QACjC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,iBAAiB,CAAC;IACrD,CAAC;IAED,QAAQ,CAAC,OAAgB;QACrB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAChC,CAAC;IAEO,aAAa,CAAC,KAAa,EAAE,OAAe,EAAE,IAAU;QAC5D,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QAE/D,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,KAAmB;QACtC,oBAAoB;QACpB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE;gBACjD,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;aACrB,CAAC,CAAC,CAAC;QACR,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC5B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,IAAU;QAC5B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,IAAU;QAC7B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAmB;QACrB,OAAO,IAAI,MAAM,CAAC;YACd,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,GAAG;SAC5C,CAAC,CAAC;IACP,CAAC;CACJ"}
1
+ {"version":3,"file":"logger.js","sources":["../../../src/utils/logger.ts"],"sourcesContent":["/**\n * Simple logger utility with configurable debug mode\n */\nexport enum LogLevel {\n ERROR = 0,\n WARN = 1,\n INFO = 2,\n DEBUG = 3\n}\n\nexport interface LoggerConfig {\n debug?: boolean;\n prefix?: string;\n}\n\nexport class Logger {\n private debugEnabled: boolean;\n private prefix: string;\n\n constructor(config: LoggerConfig = {}) {\n this.debugEnabled = config.debug ?? false;\n this.prefix = config.prefix ?? '[PostHog Agent]';\n }\n\n setDebug(enabled: boolean) {\n this.debugEnabled = enabled;\n }\n\n private formatMessage(level: string, message: string, data?: any): string {\n const timestamp = new Date().toISOString();\n const base = `${timestamp} ${this.prefix} ${level} ${message}`;\n \n if (data !== undefined) {\n return `${base} ${JSON.stringify(data, null, 2)}`;\n }\n \n return base;\n }\n\n error(message: string, error?: Error | any) {\n // Always log errors\n if (error instanceof Error) {\n console.error(this.formatMessage('[ERROR]', message, {\n message: error.message,\n stack: error.stack\n }));\n } else {\n console.error(this.formatMessage('[ERROR]', message, error));\n }\n }\n\n warn(message: string, data?: any) {\n if (this.debugEnabled) {\n console.warn(this.formatMessage('[WARN]', message, data));\n }\n }\n\n info(message: string, data?: any) {\n if (this.debugEnabled) {\n console.log(this.formatMessage('[INFO]', message, data));\n }\n }\n\n debug(message: string, data?: any) {\n if (this.debugEnabled) {\n console.log(this.formatMessage('[DEBUG]', message, data));\n }\n }\n\n /**\n * Create a child logger with additional prefix\n */\n child(childPrefix: string): Logger {\n return new Logger({\n debug: this.debugEnabled,\n prefix: `${this.prefix} [${childPrefix}]`\n });\n }\n}"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export const POSTHOG_MCP = {
1
+ const POSTHOG_MCP = {
2
2
  posthog: {
3
3
  command: "npx",
4
4
  args: [
@@ -13,4 +13,6 @@ export const POSTHOG_MCP = {
13
13
  }
14
14
  }
15
15
  };
16
- //# sourceMappingURL=mcp.js.map
16
+
17
+ export { POSTHOG_MCP };
18
+ //# sourceMappingURL=mcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/utils/mcp.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,OAAO,EAAE;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE;YACF,IAAI;YACJ,mBAAmB;YACnB,6BAA6B;YAC7B,UAAU;YACV,sCAAsC;SACzC;QACD,GAAG,EAAE;YACD,qBAAqB,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;SACjE;KACJ;CACJ,CAAC"}
1
+ {"version":3,"file":"mcp.js","sources":["../../../src/utils/mcp.ts"],"sourcesContent":["export const POSTHOG_MCP = {\n posthog: {\n command: \"npx\",\n args: [\n \"-y\",\n \"mcp-remote@latest\",\n \"https://mcp.posthog.com/mcp\",\n \"--header\",\n \"Authorization:${POSTHOG_AUTH_HEADER}\"\n ],\n env: {\n \"POSTHOG_AUTH_HEADER\": `Bearer ${process.env.POSTHOG_API_KEY}`\n }\n }\n};"],"names":[],"mappings":"AAAO,MAAM,WAAW,GAAG;AACvB,IAAA,OAAO,EAAE;AACL,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,IAAI,EAAE;YACF,IAAI;YACJ,mBAAmB;YACnB,6BAA6B;YAC7B,UAAU;YACV;AACH,SAAA;AACD,QAAA,GAAG,EAAE;AACD,YAAA,qBAAqB,EAAE,CAAA,OAAA,EAAU,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;AAC/D;AACJ;;;;;"}
@@ -1,5 +1,4 @@
1
- import { PostHogAPIClient } from './posthog-api.js';
2
- export class WorkflowRegistry {
1
+ class WorkflowRegistry {
3
2
  workflowsById = new Map();
4
3
  apiClient;
5
4
  constructor(apiClient, staticDefinitions) {
@@ -23,4 +22,6 @@ export class WorkflowRegistry {
23
22
  return Array.from(this.workflowsById.values());
24
23
  }
25
24
  }
26
- //# sourceMappingURL=workflow-registry.js.map
25
+
26
+ export { WorkflowRegistry };
27
+ //# sourceMappingURL=workflow-registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-registry.js","sourceRoot":"","sources":["../../src/workflow-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,OAAO,gBAAgB;IACnB,aAAa,GAAoC,IAAI,GAAG,EAAE,CAAC;IAC3D,SAAS,CAAoB;IAErC,YAAY,SAA4B,EAAE,iBAAwC;QAChF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,iBAAiB,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,iBAAiB;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC;YACvD,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;CACF"}
1
+ {"version":3,"file":"workflow-registry.js","sources":["../../src/workflow-registry.ts"],"sourcesContent":["import type { WorkflowDefinition } from './workflow-types.js';\nimport { PostHogAPIClient } from './posthog-api.js';\n\nexport class WorkflowRegistry {\n private workflowsById: Map<string, WorkflowDefinition> = new Map();\n private apiClient?: PostHogAPIClient;\n\n constructor(apiClient?: PostHogAPIClient, staticDefinitions?: WorkflowDefinition[]) {\n this.apiClient = apiClient;\n if (staticDefinitions) {\n for (const w of staticDefinitions) this.workflowsById.set(w.id, w);\n }\n }\n\n async loadWorkflows(): Promise<void> {\n if (this.apiClient) {\n const workflows = await this.apiClient.listWorkflows();\n for (const w of workflows) this.workflowsById.set(w.id, w);\n }\n }\n\n getWorkflow(id: string): WorkflowDefinition | undefined {\n return this.workflowsById.get(id);\n }\n\n listWorkflows(): WorkflowDefinition[] {\n return Array.from(this.workflowsById.values());\n }\n}\n\n"],"names":[],"mappings":"MAGa,gBAAgB,CAAA;AACnB,IAAA,aAAa,GAAoC,IAAI,GAAG,EAAE;AAC1D,IAAA,SAAS;IAEjB,WAAA,CAAY,SAA4B,EAAE,iBAAwC,EAAA;AAChF,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,iBAAiB,EAAE;YACrB,KAAK,MAAM,CAAC,IAAI,iBAAiB;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE;IACF;AAEA,IAAA,MAAM,aAAa,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE;YACtD,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5D;IACF;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;IAEA,aAAa,GAAA;QACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IAChD;AACD;;;;"}
@@ -0,0 +1,45 @@
1
+ # Implementation Plan: {{task_title}}
2
+
3
+ **Task ID:** {{task_id}}
4
+ **Generated:** {{date}}
5
+
6
+ ## Summary
7
+
8
+ Brief description of what will be implemented and the overall approach.
9
+
10
+ ## Implementation Steps
11
+
12
+ ### 1. Analysis
13
+ - [ ] Identify relevant files and components
14
+ - [ ] Review existing patterns and constraints
15
+
16
+ ### 2. Changes Required
17
+ - [ ] Files to create/modify
18
+ - [ ] Dependencies to add/update
19
+
20
+ ### 3. Implementation
21
+ - [ ] Core functionality changes
22
+ - [ ] Tests and validation
23
+ - [ ] Documentation updates
24
+
25
+ ## File Changes
26
+
27
+ ### New Files
28
+ ```
29
+ path/to/new/file.ts - Purpose
30
+ ```
31
+
32
+ ### Modified Files
33
+ ```
34
+ path/to/existing/file.ts - Changes needed
35
+ ```
36
+
37
+ ## Considerations
38
+
39
+ - Key architectural decisions
40
+ - Potential risks and mitigation
41
+ - Testing approach
42
+
43
+ ---
44
+
45
+ *Generated by PostHog Agent*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/agent",
3
- "version": "1.0.2",
3
+ "version": "1.2.0",
4
4
  "description": "TypeScript agent framework wrapping Claude Agent SDK with Git-based workflow for PostHog tasks",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -32,7 +32,13 @@
32
32
  },
33
33
  "devDependencies": {
34
34
  "@changesets/cli": "^2.27.8",
35
+ "@rollup/plugin-commonjs": "^25.0.7",
36
+ "@rollup/plugin-node-resolve": "^15.2.3",
35
37
  "@types/bun": "latest",
38
+ "rimraf": "^6.0.1",
39
+ "rollup": "^4.24.0",
40
+ "rollup-plugin-copy": "^3.5.0",
41
+ "rollup-plugin-typescript2": "^0.36.0",
36
42
  "typescript": "^5.5.0"
37
43
  },
38
44
  "dependencies": {
@@ -49,7 +55,7 @@
49
55
  "access": "public"
50
56
  },
51
57
  "scripts": {
52
- "build": "tsc --project tsconfig.build.json",
58
+ "build": "rimraf dist && rollup -c && tsc --project tsconfig.build.json --emitDeclarationOnly",
53
59
  "example": "bun run example-usage.ts",
54
60
  "dev": "bun run example-usage.ts",
55
61
  "changeset": "changeset",
package/src/agent.ts CHANGED
@@ -14,6 +14,7 @@ import { AgentRegistry } from './agent-registry.js';
14
14
  import { WorkflowRegistry } from './workflow-registry.js';
15
15
  import { StageExecutor } from './stage-executor.js';
16
16
  import { PromptBuilder } from './prompt-builder.js';
17
+ import { TaskProgressReporter } from './task-progress-reporter.js';
17
18
 
18
19
  export class Agent {
19
20
  private workingDirectory: string;
@@ -28,6 +29,7 @@ export class Agent {
28
29
  private agentRegistry: AgentRegistry;
29
30
  private workflowRegistry: WorkflowRegistry;
30
31
  private stageExecutor: StageExecutor;
32
+ private progressReporter: TaskProgressReporter;
31
33
  public debug: boolean;
32
34
 
33
35
  constructor(config: AgentConfig = {}) {
@@ -64,6 +66,8 @@ export class Agent {
64
66
  logger: this.logger.child('PromptBuilder')
65
67
  });
66
68
  this.stageExecutor = new StageExecutor(this.agentRegistry, this.logger, promptBuilder);
69
+ this.stageExecutor.setEventHandler((event) => this.emitEvent(event));
70
+ this.progressReporter = new TaskProgressReporter(this.posthogAPI, this.logger);
67
71
  }
68
72
 
69
73
  /**
@@ -82,6 +86,7 @@ export class Agent {
82
86
  if (!workflow) {
83
87
  throw new Error(`Workflow ${workflowId} not found`);
84
88
  }
89
+ const orderedStages = [...workflow.stages].sort((a, b) => a.position - b.position);
85
90
 
86
91
  // Ensure task is assigned to workflow and positioned at first stage
87
92
  if (this.posthogAPI) {
@@ -103,9 +108,13 @@ export class Agent {
103
108
  const executionId = this.taskManager.generateExecutionId();
104
109
  this.logger.info('Starting workflow execution', { taskId: task.id, workflowId, executionId });
105
110
  this.taskManager.startExecution(task.id, 'plan_and_build', executionId);
111
+ await this.progressReporter.start(task.id, {
112
+ workflowId,
113
+ workflowRunId: executionId,
114
+ totalSteps: orderedStages.length,
115
+ });
106
116
 
107
117
  try {
108
- const orderedStages = [...workflow.stages].sort((a, b) => a.position - b.position);
109
118
  let startIndex = 0;
110
119
  const currentStageId = (task as any).current_stage as string | undefined;
111
120
 
@@ -114,7 +123,10 @@ export class Agent {
114
123
  const currIdx = orderedStages.findIndex(s => s.id === currentStageId);
115
124
  const atLastStage = currIdx >= 0 && currIdx === orderedStages.length - 1;
116
125
  if (atLastStage) {
117
- this.emitEvent(this.eventTransformer.createStatusEvent('no_next_stage', { stage: orderedStages[currIdx].key }));
126
+ const finalStageKey = orderedStages[currIdx]?.key;
127
+ this.emitEvent(this.eventTransformer.createStatusEvent('no_next_stage', { stage: finalStageKey }));
128
+ await this.progressReporter.noNextStage(finalStageKey);
129
+ await this.progressReporter.complete();
118
130
  this.taskManager.completeExecution(executionId, { task, workflow });
119
131
  return { task, workflow };
120
132
  }
@@ -135,7 +147,9 @@ export class Agent {
135
147
 
136
148
  for (let i = startIndex; i < orderedStages.length; i++) {
137
149
  const stage = orderedStages[i];
150
+ await this.progressReporter.stageStarted(stage.key, i);
138
151
  await this.executeStage(task, stage, options);
152
+ await this.progressReporter.stageCompleted(stage.key, i + 1);
139
153
  if (options.autoProgress) {
140
154
  const hasNext = i < orderedStages.length - 1;
141
155
  if (hasNext) {
@@ -143,9 +157,11 @@ export class Agent {
143
157
  }
144
158
  }
145
159
  }
160
+ await this.progressReporter.complete();
146
161
  this.taskManager.completeExecution(executionId, { task, workflow });
147
162
  return { task, workflow };
148
163
  } catch (error) {
164
+ await this.progressReporter.fail(error as Error);
149
165
  this.taskManager.failExecution(executionId, error as Error);
150
166
  throw error;
151
167
  }
@@ -167,10 +183,12 @@ export class Agent {
167
183
  const planningBranch = await this.createPlanningBranch(task.id);
168
184
  await this.updateTaskBranch(task.id, planningBranch);
169
185
  this.emitEvent(this.eventTransformer.createStatusEvent('branch_created', { stage: stage.key, branch: planningBranch }));
186
+ await this.progressReporter.branchCreated(stage.key, planningBranch);
170
187
  } else if (!isPlanning && !isManual && shouldCreateImplBranch) {
171
188
  const implBranch = await this.createImplementationBranch(task.id);
172
189
  await this.updateTaskBranch(task.id, implBranch);
173
190
  this.emitEvent(this.eventTransformer.createStatusEvent('branch_created', { stage: stage.key, branch: implBranch }));
191
+ await this.progressReporter.branchCreated(stage.key, implBranch);
174
192
  }
175
193
 
176
194
  const result = await this.stageExecutor.execute(task, stage, options);
@@ -179,6 +197,7 @@ export class Agent {
179
197
  await this.writePlan(task.id, result.plan);
180
198
  await this.commitPlan(task.id, task.title);
181
199
  this.emitEvent(this.eventTransformer.createStatusEvent('commit_made', { stage: stage.key, kind: 'plan' }));
200
+ await this.progressReporter.commitMade(stage.key, 'plan');
182
201
  }
183
202
 
184
203
  if (isManual) {
@@ -193,12 +212,14 @@ export class Agent {
193
212
  await this.updateTaskBranch(task.id, implBranch);
194
213
  branchName = implBranch;
195
214
  this.emitEvent(this.eventTransformer.createStatusEvent('branch_created', { stage: stage.key, branch: implBranch }));
215
+ await this.progressReporter.branchCreated(stage.key, implBranch);
196
216
  }
197
217
  try {
198
218
  const prUrl = await this.createPullRequest(task.id, branchName, task.title, task.description);
199
219
  await this.updateTaskBranch(task.id, branchName);
200
- await this.attachPullRequestToTask(task.id, prUrl);
220
+ await this.attachPullRequestToTask(task.id, prUrl, branchName);
201
221
  this.emitEvent(this.eventTransformer.createStatusEvent('pr_created', { stage: stage.key, prUrl }));
222
+ await this.progressReporter.pullRequestCreated(stage.key, prUrl);
202
223
  } catch {}
203
224
  }
204
225
  // Do not auto-progress on manual stages
@@ -211,6 +232,7 @@ export class Agent {
211
232
  const planSummary = existingPlan ? existingPlan.split('\n')[0] : undefined;
212
233
  await this.commitImplementation(task.id, task.title, planSummary);
213
234
  this.emitEvent(this.eventTransformer.createStatusEvent('commit_made', { stage: stage.key, kind: 'implementation' }));
235
+ await this.progressReporter.commitMade(stage.key, 'implementation');
214
236
  }
215
237
 
216
238
  // PR creation on complete stage (or if explicitly requested), regardless of whether edits occurred
@@ -222,8 +244,9 @@ export class Agent {
222
244
  try {
223
245
  const prUrl = await this.createPullRequest(task.id, branchName, task.title, task.description);
224
246
  await this.updateTaskBranch(task.id, branchName);
225
- await this.attachPullRequestToTask(task.id, prUrl);
247
+ await this.attachPullRequestToTask(task.id, prUrl, branchName);
226
248
  this.emitEvent(this.eventTransformer.createStatusEvent('pr_created', { stage: stage.key, prUrl }));
249
+ await this.progressReporter.pullRequestCreated(stage.key, prUrl);
227
250
  } catch {}
228
251
  }
229
252
  }
@@ -271,6 +294,10 @@ export class Agent {
271
294
  }
272
295
  return this.posthogAPI.fetchTask(taskId);
273
296
  }
297
+
298
+ getPostHogClient(): PostHogAPIClient | undefined {
299
+ return this.posthogAPI;
300
+ }
274
301
 
275
302
  async listTasks(filters?: {
276
303
  repository?: string;
@@ -367,8 +394,8 @@ Generated by PostHog Agent`;
367
394
  return prUrl;
368
395
  }
369
396
 
370
- async attachPullRequestToTask(taskId: string, prUrl: string): Promise<void> {
371
- this.logger.info('Attaching PR to task', { taskId, prUrl });
397
+ async attachPullRequestToTask(taskId: string, prUrl: string, branchName?: string): Promise<void> {
398
+ this.logger.info('Attaching PR to task', { taskId, prUrl, branchName });
372
399
 
373
400
  if (!this.posthogAPI) {
374
401
  const error = new Error('PostHog API not configured. Cannot attach PR to task.');
@@ -376,7 +403,7 @@ Generated by PostHog Agent`;
376
403
  throw error;
377
404
  }
378
405
 
379
- await this.posthogAPI.updateTask(taskId, { github_pr_url: prUrl });
406
+ await this.posthogAPI.attachTaskPullRequest(taskId, prUrl, branchName);
380
407
  this.logger.debug('PR attached to task', { taskId, prUrl });
381
408
  }
382
409
 
@@ -389,7 +416,7 @@ Generated by PostHog Agent`;
389
416
  throw error;
390
417
  }
391
418
 
392
- await this.posthogAPI.updateTask(taskId, { github_branch: branchName });
419
+ await this.posthogAPI.setTaskBranch(taskId, branchName);
393
420
  this.logger.debug('Task branch updated', { taskId, branchName });
394
421
  }
395
422
 
@@ -419,6 +446,12 @@ Generated by PostHog Agent`;
419
446
  // Log all events except tokens (too verbose)
420
447
  this.logger.debug('Emitting event', { type: event.type, ts: event.ts });
421
448
  }
449
+ const persistPromise = this.progressReporter.recordEvent(event);
450
+ if (persistPromise && typeof persistPromise.then === 'function') {
451
+ persistPromise.catch((error: Error) =>
452
+ this.logger.debug('Failed to persist agent event', { message: error.message })
453
+ );
454
+ }
422
455
  this.onEvent?.(event);
423
456
  }
424
457
  }
@@ -118,15 +118,14 @@ export class EventTransformer {
118
118
 
119
119
  // Handle user messages
120
120
  if (sdkMessage.type === 'user') {
121
- const content = sdkMessage.message.content;
122
- const textContent = Array.isArray(content)
123
- ? content.find(c => c.type === 'text')?.text
124
- : typeof content === 'string' ? content : '';
125
-
121
+ const textContent = this.extractUserContent(sdkMessage.message?.content);
122
+ if (!textContent) {
123
+ return null;
124
+ }
126
125
  return {
127
126
  ...baseEvent,
128
127
  type: 'user_message',
129
- content: textContent || '',
128
+ content: textContent,
130
129
  isSynthetic: sdkMessage.isSynthetic
131
130
  };
132
131
  }
@@ -186,4 +185,59 @@ export class EventTransformer {
186
185
  ...additionalData
187
186
  };
188
187
  }
189
- }
188
+
189
+ private extractUserContent(content: unknown): string | null {
190
+ if (!content) {
191
+ return null;
192
+ }
193
+
194
+ if (typeof content === 'string') {
195
+ const trimmed = content.trim();
196
+ return trimmed.length > 0 ? trimmed : null;
197
+ }
198
+
199
+ if (Array.isArray(content)) {
200
+ const parts: string[] = [];
201
+ for (const block of content) {
202
+ const extracted = this.extractUserContent(block);
203
+ if (extracted) {
204
+ parts.push(extracted);
205
+ } else if (block && typeof block === 'object') {
206
+ const candidate = this.extractFromObject(block as Record<string, unknown>);
207
+ if (candidate) {
208
+ parts.push(candidate);
209
+ }
210
+ }
211
+ }
212
+ const text = parts.join('\n').trim();
213
+ return text.length > 0 ? text : null;
214
+ }
215
+
216
+ if (typeof content === 'object') {
217
+ return this.extractFromObject(content as Record<string, unknown>);
218
+ }
219
+
220
+ return null;
221
+ }
222
+
223
+ private extractFromObject(value: Record<string, unknown>): string | null {
224
+ const preferredKeys = ['text', 'input_text', 'input', 'markdown', 'content', 'message'];
225
+ for (const key of preferredKeys) {
226
+ if (typeof value[key] === 'string') {
227
+ const trimmed = (value[key] as string).trim();
228
+ if (trimmed.length > 0) {
229
+ return trimmed;
230
+ }
231
+ }
232
+ }
233
+
234
+ for (const entry of Object.values(value)) {
235
+ const extracted = this.extractUserContent(entry);
236
+ if (extracted) {
237
+ return extracted;
238
+ }
239
+ }
240
+
241
+ return null;
242
+ }
243
+ }