@ai-sdlc/orchestrator 0.1.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 (203) hide show
  1. package/dist/adapters.d.ts +60 -0
  2. package/dist/adapters.js +160 -0
  3. package/dist/admission.d.ts +49 -0
  4. package/dist/admission.js +90 -0
  5. package/dist/analysis/analyzer.d.ts +10 -0
  6. package/dist/analysis/analyzer.js +67 -0
  7. package/dist/analysis/complexity-scorer.d.ts +24 -0
  8. package/dist/analysis/complexity-scorer.js +39 -0
  9. package/dist/analysis/context-builder.d.ts +14 -0
  10. package/dist/analysis/context-builder.js +79 -0
  11. package/dist/analysis/convention-detector.d.ts +9 -0
  12. package/dist/analysis/convention-detector.js +177 -0
  13. package/dist/analysis/dependency-parser.d.ts +17 -0
  14. package/dist/analysis/dependency-parser.js +167 -0
  15. package/dist/analysis/file-walker.d.ts +18 -0
  16. package/dist/analysis/file-walker.js +158 -0
  17. package/dist/analysis/hotspot-analyzer.d.ts +28 -0
  18. package/dist/analysis/hotspot-analyzer.js +85 -0
  19. package/dist/analysis/index.d.ts +13 -0
  20. package/dist/analysis/index.js +12 -0
  21. package/dist/analysis/pattern-detector.d.ts +10 -0
  22. package/dist/analysis/pattern-detector.js +86 -0
  23. package/dist/analysis/types.d.ts +94 -0
  24. package/dist/analysis/types.js +5 -0
  25. package/dist/audit-archival.d.ts +48 -0
  26. package/dist/audit-archival.js +72 -0
  27. package/dist/audit-export.d.ts +45 -0
  28. package/dist/audit-export.js +100 -0
  29. package/dist/audit-extended.d.ts +28 -0
  30. package/dist/audit-extended.js +38 -0
  31. package/dist/audit-scheduler.d.ts +32 -0
  32. package/dist/audit-scheduler.js +52 -0
  33. package/dist/audit-sqlite-sink.d.ts +11 -0
  34. package/dist/audit-sqlite-sink.js +51 -0
  35. package/dist/autonomy-tracker.d.ts +76 -0
  36. package/dist/autonomy-tracker.js +277 -0
  37. package/dist/check-runs.d.ts +37 -0
  38. package/dist/check-runs.js +72 -0
  39. package/dist/cli/commands/agents.d.ts +6 -0
  40. package/dist/cli/commands/agents.js +33 -0
  41. package/dist/cli/commands/complexity.d.ts +6 -0
  42. package/dist/cli/commands/complexity.js +35 -0
  43. package/dist/cli/commands/cost.d.ts +6 -0
  44. package/dist/cli/commands/cost.js +53 -0
  45. package/dist/cli/commands/dashboard.d.ts +9 -0
  46. package/dist/cli/commands/dashboard.js +50 -0
  47. package/dist/cli/commands/health.d.ts +6 -0
  48. package/dist/cli/commands/health.js +33 -0
  49. package/dist/cli/commands/init.d.ts +6 -0
  50. package/dist/cli/commands/init.js +127 -0
  51. package/dist/cli/commands/routing.d.ts +6 -0
  52. package/dist/cli/commands/routing.js +46 -0
  53. package/dist/cli/commands/run.d.ts +6 -0
  54. package/dist/cli/commands/run.js +36 -0
  55. package/dist/cli/commands/start.d.ts +6 -0
  56. package/dist/cli/commands/start.js +26 -0
  57. package/dist/cli/commands/status.d.ts +6 -0
  58. package/dist/cli/commands/status.js +34 -0
  59. package/dist/cli/dashboard-renderer.d.ts +24 -0
  60. package/dist/cli/dashboard-renderer.js +129 -0
  61. package/dist/cli/formatters/index.d.ts +6 -0
  62. package/dist/cli/formatters/index.js +18 -0
  63. package/dist/cli/formatters/json.d.ts +5 -0
  64. package/dist/cli/formatters/json.js +7 -0
  65. package/dist/cli/formatters/minimal.d.ts +5 -0
  66. package/dist/cli/formatters/minimal.js +36 -0
  67. package/dist/cli/formatters/table.d.ts +5 -0
  68. package/dist/cli/formatters/table.js +184 -0
  69. package/dist/cli/index.d.ts +6 -0
  70. package/dist/cli/index.js +35 -0
  71. package/dist/compliance-extended.d.ts +41 -0
  72. package/dist/compliance-extended.js +58 -0
  73. package/dist/config.d.ts +26 -0
  74. package/dist/config.js +66 -0
  75. package/dist/context-enrichment.d.ts +33 -0
  76. package/dist/context-enrichment.js +125 -0
  77. package/dist/cost-governance.d.ts +22 -0
  78. package/dist/cost-governance.js +106 -0
  79. package/dist/cost-tracker.d.ts +75 -0
  80. package/dist/cost-tracker.js +177 -0
  81. package/dist/defaults.d.ts +140 -0
  82. package/dist/defaults.js +218 -0
  83. package/dist/deploy/flyio-target.d.ts +19 -0
  84. package/dist/deploy/flyio-target.js +114 -0
  85. package/dist/deploy/index.d.ts +15 -0
  86. package/dist/deploy/index.js +11 -0
  87. package/dist/deploy/kubernetes-target.d.ts +25 -0
  88. package/dist/deploy/kubernetes-target.js +124 -0
  89. package/dist/deploy/metrics-collector.d.ts +31 -0
  90. package/dist/deploy/metrics-collector.js +75 -0
  91. package/dist/deploy/rollout-controller.d.ts +42 -0
  92. package/dist/deploy/rollout-controller.js +192 -0
  93. package/dist/deploy/rollout-types.d.ts +86 -0
  94. package/dist/deploy/rollout-types.js +5 -0
  95. package/dist/deploy/types.d.ts +47 -0
  96. package/dist/deploy/types.js +5 -0
  97. package/dist/deploy/vercel-target.d.ts +16 -0
  98. package/dist/deploy/vercel-target.js +115 -0
  99. package/dist/discovery.d.ts +26 -0
  100. package/dist/discovery.js +46 -0
  101. package/dist/episodic-enhanced.d.ts +88 -0
  102. package/dist/episodic-enhanced.js +212 -0
  103. package/dist/execute.d.ts +81 -0
  104. package/dist/execute.js +703 -0
  105. package/dist/fix-ci.d.ts +61 -0
  106. package/dist/fix-ci.js +380 -0
  107. package/dist/handoff-executor.d.ts +61 -0
  108. package/dist/handoff-executor.js +119 -0
  109. package/dist/index.d.ts +70 -0
  110. package/dist/index.js +87 -0
  111. package/dist/instrumented.d.ts +27 -0
  112. package/dist/instrumented.js +34 -0
  113. package/dist/logger.d.ts +17 -0
  114. package/dist/logger.js +37 -0
  115. package/dist/multi-repo/impact-analyzer.d.ts +22 -0
  116. package/dist/multi-repo/impact-analyzer.js +95 -0
  117. package/dist/multi-repo/index.d.ts +5 -0
  118. package/dist/multi-repo/index.js +4 -0
  119. package/dist/multi-repo/monorepo-detector.d.ts +16 -0
  120. package/dist/multi-repo/monorepo-detector.js +246 -0
  121. package/dist/multi-repo/service-map-builder.d.ts +24 -0
  122. package/dist/multi-repo/service-map-builder.js +235 -0
  123. package/dist/multi-repo/types.d.ts +54 -0
  124. package/dist/multi-repo/types.js +5 -0
  125. package/dist/notifications/index.d.ts +4 -0
  126. package/dist/notifications/index.js +4 -0
  127. package/dist/notifications/notification-router.d.ts +62 -0
  128. package/dist/notifications/notification-router.js +206 -0
  129. package/dist/notifications/slack-messenger.d.ts +26 -0
  130. package/dist/notifications/slack-messenger.js +69 -0
  131. package/dist/notifications/teams-messenger.d.ts +21 -0
  132. package/dist/notifications/teams-messenger.js +85 -0
  133. package/dist/notifications.d.ts +13 -0
  134. package/dist/notifications.js +15 -0
  135. package/dist/orchestration.d.ts +20 -0
  136. package/dist/orchestration.js +53 -0
  137. package/dist/orchestrator.d.ts +160 -0
  138. package/dist/orchestrator.js +372 -0
  139. package/dist/otel-exporter.d.ts +37 -0
  140. package/dist/otel-exporter.js +128 -0
  141. package/dist/plugin.d.ts +45 -0
  142. package/dist/plugin.js +8 -0
  143. package/dist/policy-evaluators.d.ts +40 -0
  144. package/dist/policy-evaluators.js +57 -0
  145. package/dist/process-escalation.d.ts +38 -0
  146. package/dist/process-escalation.js +129 -0
  147. package/dist/progressive-gates.d.ts +54 -0
  148. package/dist/progressive-gates.js +135 -0
  149. package/dist/provenance.d.ts +29 -0
  150. package/dist/provenance.js +61 -0
  151. package/dist/reconcilers.d.ts +28 -0
  152. package/dist/reconcilers.js +37 -0
  153. package/dist/runners/claude-code.d.ts +17 -0
  154. package/dist/runners/claude-code.js +200 -0
  155. package/dist/runners/codex.d.ts +19 -0
  156. package/dist/runners/codex.js +153 -0
  157. package/dist/runners/copilot-stub.d.ts +9 -0
  158. package/dist/runners/copilot-stub.js +15 -0
  159. package/dist/runners/copilot.d.ts +15 -0
  160. package/dist/runners/copilot.js +119 -0
  161. package/dist/runners/cursor-stub.d.ts +9 -0
  162. package/dist/runners/cursor-stub.js +15 -0
  163. package/dist/runners/cursor.d.ts +20 -0
  164. package/dist/runners/cursor.js +140 -0
  165. package/dist/runners/devin-stub.d.ts +9 -0
  166. package/dist/runners/devin-stub.js +15 -0
  167. package/dist/runners/generic-llm.d.ts +51 -0
  168. package/dist/runners/generic-llm.js +125 -0
  169. package/dist/runners/index.d.ts +8 -0
  170. package/dist/runners/index.js +7 -0
  171. package/dist/runners/runner-registry.d.ts +50 -0
  172. package/dist/runners/runner-registry.js +156 -0
  173. package/dist/runners/types.d.ts +59 -0
  174. package/dist/runners/types.js +7 -0
  175. package/dist/security.d.ts +51 -0
  176. package/dist/security.js +70 -0
  177. package/dist/shared.d.ts +134 -0
  178. package/dist/shared.js +284 -0
  179. package/dist/state/index.d.ts +4 -0
  180. package/dist/state/index.js +3 -0
  181. package/dist/state/schema.d.ts +16 -0
  182. package/dist/state/schema.js +264 -0
  183. package/dist/state/store.d.ts +109 -0
  184. package/dist/state/store.js +644 -0
  185. package/dist/state/types.d.ts +190 -0
  186. package/dist/state/types.js +5 -0
  187. package/dist/structured-logger.d.ts +20 -0
  188. package/dist/structured-logger.js +64 -0
  189. package/dist/task-decomposer.d.ts +61 -0
  190. package/dist/task-decomposer.js +265 -0
  191. package/dist/telemetry-extended.d.ts +24 -0
  192. package/dist/telemetry-extended.js +31 -0
  193. package/dist/types.d.ts +9 -0
  194. package/dist/types.js +7 -0
  195. package/dist/validate-agent-output.d.ts +30 -0
  196. package/dist/validate-agent-output.js +81 -0
  197. package/dist/validate-issue.d.ts +25 -0
  198. package/dist/validate-issue.js +102 -0
  199. package/dist/watch.d.ts +43 -0
  200. package/dist/watch.js +99 -0
  201. package/dist/webhook-manager.d.ts +38 -0
  202. package/dist/webhook-manager.js +66 -0
  203. package/package.json +59 -0
@@ -0,0 +1,106 @@
1
+ /**
2
+ * CostGovernancePlugin — orchestrator plugin that wires budget checks,
3
+ * circuit breaker, and cost alert evaluation into the pipeline lifecycle.
4
+ *
5
+ * Registered automatically when a Pipeline has a costPolicy.
6
+ */
7
+ /**
8
+ * Compute the start of the current budget period.
9
+ */
10
+ function periodStart(period) {
11
+ const now = new Date();
12
+ switch (period) {
13
+ case 'day':
14
+ return new Date(now.getFullYear(), now.getMonth(), now.getDate()).toISOString();
15
+ case 'week': {
16
+ const day = now.getDay();
17
+ const diff = now.getDate() - day;
18
+ return new Date(now.getFullYear(), now.getMonth(), diff).toISOString();
19
+ }
20
+ case 'month':
21
+ return new Date(now.getFullYear(), now.getMonth(), 1).toISOString();
22
+ case 'quarter': {
23
+ const quarterMonth = Math.floor(now.getMonth() / 3) * 3;
24
+ return new Date(now.getFullYear(), quarterMonth, 1).toISOString();
25
+ }
26
+ }
27
+ }
28
+ export class CostGovernancePlugin {
29
+ costPolicy;
30
+ name = 'cost-governance';
31
+ costTracker;
32
+ notificationRouter;
33
+ log;
34
+ budgetAmount;
35
+ budgetPeriod;
36
+ constructor(costPolicy) {
37
+ this.costPolicy = costPolicy;
38
+ }
39
+ initialize(ctx) {
40
+ this.costTracker = ctx.costTracker;
41
+ this.notificationRouter = ctx.notificationRouter;
42
+ this.log = ctx.log;
43
+ this.budgetAmount = this.costPolicy.budget?.amount;
44
+ this.budgetPeriod = this.costPolicy.budget?.period;
45
+ }
46
+ async beforeRun(_event) {
47
+ const since = this.budgetPeriod ? periodStart(this.budgetPeriod) : undefined;
48
+ // Circuit breaker: check hard limit against current budget status
49
+ if (this.costTracker && this.costPolicy.perExecution?.hardLimit) {
50
+ const budget = this.costTracker.getBudgetStatus(this.budgetAmount, since);
51
+ if (budget.overBudget && this.costPolicy.perExecution.hardLimit.action === 'abort') {
52
+ throw new Error(`Cost governance: budget exceeded ($${budget.spentUsd.toFixed(2)} / $${budget.budgetUsd.toFixed(2)}). Execution aborted.`);
53
+ }
54
+ if (budget.overBudget &&
55
+ this.costPolicy.perExecution.hardLimit.action === 'require-approval') {
56
+ this.log.info(`Cost governance: budget exceeded ($${budget.spentUsd.toFixed(2)} / $${budget.budgetUsd.toFixed(2)}). Approval required.`);
57
+ }
58
+ }
59
+ // Soft limit check
60
+ if (this.costTracker && this.costPolicy.perExecution?.softLimit) {
61
+ const budget = this.costTracker.getBudgetStatus(this.budgetAmount, since);
62
+ if (budget.spentUsd >= this.costPolicy.perExecution.softLimit.amount) {
63
+ this.log.info(`Cost governance: soft limit reached ($${budget.spentUsd.toFixed(2)} >= $${this.costPolicy.perExecution.softLimit.amount.toFixed(2)})`);
64
+ if (this.notificationRouter) {
65
+ await this.notificationRouter.dispatch({
66
+ type: 'cost-alert',
67
+ data: {
68
+ utilization: budget.utilizationPercent.toFixed(0),
69
+ spent: budget.spentUsd.toFixed(2),
70
+ budget: budget.budgetUsd.toFixed(2),
71
+ threshold: 'soft-limit',
72
+ action: this.costPolicy.perExecution.softLimit.action,
73
+ },
74
+ severity: 'warning',
75
+ });
76
+ }
77
+ }
78
+ }
79
+ }
80
+ async afterRun(_event) {
81
+ // Evaluate budget alerts after each run
82
+ if (this.costTracker && this.costPolicy.budget?.alerts) {
83
+ const since = this.budgetPeriod ? periodStart(this.budgetPeriod) : undefined;
84
+ const budget = this.costTracker.getBudgetStatus(this.budgetAmount, since);
85
+ for (const alert of this.costPolicy.budget.alerts) {
86
+ if (budget.utilizationPercent / 100 >= alert.threshold) {
87
+ this.log.info(`Cost alert: ${(alert.threshold * 100).toFixed(0)}% budget consumed (action: ${alert.action})`);
88
+ if (this.notificationRouter) {
89
+ await this.notificationRouter.dispatch({
90
+ type: 'cost-alert',
91
+ data: {
92
+ utilization: budget.utilizationPercent.toFixed(0),
93
+ spent: budget.spentUsd.toFixed(2),
94
+ budget: budget.budgetUsd.toFixed(2),
95
+ threshold: (alert.threshold * 100).toFixed(0),
96
+ action: alert.action,
97
+ },
98
+ severity: 'warning',
99
+ });
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=cost-governance.js.map
@@ -0,0 +1,75 @@
1
+ /**
2
+ * CostTracker — records LLM usage costs, computes summaries,
3
+ * and tracks budget status.
4
+ *
5
+ * RFC reference: Lines 618-720 (cost tracking).
6
+ */
7
+ import type { StateStore } from './state/store.js';
8
+ import type { CostLedgerEntry } from './state/types.js';
9
+ export interface CostSummary {
10
+ totalCostUsd: number;
11
+ totalTokens: number;
12
+ totalInputTokens: number;
13
+ totalOutputTokens: number;
14
+ entryCount: number;
15
+ avgCostPerRun: number;
16
+ avgTokensPerRun: number;
17
+ costByAgent: Record<string, number>;
18
+ costByModel: Record<string, number>;
19
+ period?: string;
20
+ }
21
+ export interface BudgetStatus {
22
+ budgetUsd: number;
23
+ spentUsd: number;
24
+ remainingUsd: number;
25
+ utilizationPercent: number;
26
+ overBudget: boolean;
27
+ projectedMonthlyUsd: number;
28
+ }
29
+ export interface CostTimeSeriesPoint {
30
+ date: string;
31
+ costUsd: number;
32
+ tokens: number;
33
+ runCount: number;
34
+ }
35
+ export declare class CostTracker {
36
+ private store;
37
+ constructor(store: StateStore);
38
+ /**
39
+ * Compute cost in USD from token counts and model name.
40
+ */
41
+ static computeCost(inputTokens: number, outputTokens: number, model: string, cacheReadTokens?: number): number;
42
+ /**
43
+ * Record a cost entry.
44
+ */
45
+ recordCost(entry: Omit<CostLedgerEntry, 'id' | 'createdAt'>): number;
46
+ /**
47
+ * Get a cost summary for a time range.
48
+ */
49
+ getCostSummary(since?: string): CostSummary;
50
+ /**
51
+ * Get budget status for a given budget and period.
52
+ */
53
+ getBudgetStatus(budgetUsd?: number, since?: string): BudgetStatus;
54
+ /**
55
+ * Get cost breakdown by agent.
56
+ */
57
+ getCostByAgent(since?: string): Record<string, {
58
+ costUsd: number;
59
+ tokens: number;
60
+ runs: number;
61
+ }>;
62
+ /**
63
+ * Get cost breakdown by pipeline stage.
64
+ */
65
+ getCostByStage(since?: string): Record<string, {
66
+ costUsd: number;
67
+ tokens: number;
68
+ runs: number;
69
+ }>;
70
+ /**
71
+ * Get cost time series at a given granularity.
72
+ */
73
+ getCostTimeSeries(granularity?: 'day' | 'week' | 'month', since?: string): CostTimeSeriesPoint[];
74
+ }
75
+ //# sourceMappingURL=cost-tracker.d.ts.map
@@ -0,0 +1,177 @@
1
+ /**
2
+ * CostTracker — records LLM usage costs, computes summaries,
3
+ * and tracks budget status.
4
+ *
5
+ * RFC reference: Lines 618-720 (cost tracking).
6
+ */
7
+ import { DEFAULT_MODEL_COSTS, DEFAULT_COST_BUDGET_USD } from './defaults.js';
8
+ export class CostTracker {
9
+ store;
10
+ constructor(store) {
11
+ this.store = store;
12
+ }
13
+ /**
14
+ * Compute cost in USD from token counts and model name.
15
+ */
16
+ static computeCost(inputTokens, outputTokens, model, cacheReadTokens = 0) {
17
+ const costs = DEFAULT_MODEL_COSTS[model];
18
+ if (!costs) {
19
+ // Fallback: use sonnet pricing
20
+ const fallback = DEFAULT_MODEL_COSTS['claude-sonnet-4-5-20250929'] ?? {
21
+ inputPer1M: 3,
22
+ outputPer1M: 15,
23
+ cacheReadPer1M: 0.3,
24
+ };
25
+ return ((inputTokens * fallback.inputPer1M +
26
+ outputTokens * fallback.outputPer1M +
27
+ cacheReadTokens * (fallback.cacheReadPer1M ?? 0)) /
28
+ 1_000_000);
29
+ }
30
+ return ((inputTokens * costs.inputPer1M +
31
+ outputTokens * costs.outputPer1M +
32
+ cacheReadTokens * (costs.cacheReadPer1M ?? 0)) /
33
+ 1_000_000);
34
+ }
35
+ /**
36
+ * Record a cost entry.
37
+ */
38
+ recordCost(entry) {
39
+ // Auto-compute cost if not provided
40
+ let costUsd = entry.costUsd ?? 0;
41
+ if (costUsd === 0 && entry.model && (entry.inputTokens || entry.outputTokens)) {
42
+ costUsd = CostTracker.computeCost(entry.inputTokens ?? 0, entry.outputTokens ?? 0, entry.model, entry.cacheReadTokens ?? 0);
43
+ }
44
+ return this.store.saveCostEntry({
45
+ ...entry,
46
+ costUsd,
47
+ totalTokens: entry.totalTokens ?? (entry.inputTokens ?? 0) + (entry.outputTokens ?? 0),
48
+ });
49
+ }
50
+ /**
51
+ * Get a cost summary for a time range.
52
+ */
53
+ getCostSummary(since) {
54
+ const entries = this.store.getCostEntries({ since });
55
+ const dbSummary = this.store.getCostSummary(since);
56
+ const costByAgent = {};
57
+ const costByModel = {};
58
+ let totalInputTokens = 0;
59
+ let totalOutputTokens = 0;
60
+ for (const entry of entries) {
61
+ costByAgent[entry.agentName] = (costByAgent[entry.agentName] ?? 0) + (entry.costUsd ?? 0);
62
+ if (entry.model) {
63
+ costByModel[entry.model] = (costByModel[entry.model] ?? 0) + (entry.costUsd ?? 0);
64
+ }
65
+ totalInputTokens += entry.inputTokens ?? 0;
66
+ totalOutputTokens += entry.outputTokens ?? 0;
67
+ }
68
+ const entryCount = dbSummary.entryCount;
69
+ return {
70
+ totalCostUsd: dbSummary.totalCostUsd,
71
+ totalTokens: dbSummary.totalTokens,
72
+ totalInputTokens,
73
+ totalOutputTokens,
74
+ entryCount,
75
+ avgCostPerRun: entryCount > 0 ? dbSummary.totalCostUsd / entryCount : 0,
76
+ avgTokensPerRun: entryCount > 0 ? dbSummary.totalTokens / entryCount : 0,
77
+ costByAgent,
78
+ costByModel,
79
+ period: since,
80
+ };
81
+ }
82
+ /**
83
+ * Get budget status for a given budget and period.
84
+ */
85
+ getBudgetStatus(budgetUsd, since) {
86
+ const budget = budgetUsd ?? DEFAULT_COST_BUDGET_USD;
87
+ const summary = this.getCostSummary(since);
88
+ // Project monthly cost based on daily average
89
+ const entries = this.store.getCostEntries({ since });
90
+ let projectedMonthlyUsd = 0;
91
+ if (entries.length > 0) {
92
+ const oldest = entries[entries.length - 1];
93
+ const newest = entries[0];
94
+ if (oldest.createdAt && newest.createdAt) {
95
+ const daySpan = Math.max(1, (new Date(newest.createdAt).getTime() - new Date(oldest.createdAt).getTime()) /
96
+ (24 * 60 * 60 * 1000));
97
+ const dailyRate = summary.totalCostUsd / daySpan;
98
+ projectedMonthlyUsd = dailyRate * 30;
99
+ }
100
+ }
101
+ return {
102
+ budgetUsd: budget,
103
+ spentUsd: summary.totalCostUsd,
104
+ remainingUsd: Math.max(0, budget - summary.totalCostUsd),
105
+ utilizationPercent: budget > 0 ? (summary.totalCostUsd / budget) * 100 : 0,
106
+ overBudget: summary.totalCostUsd > budget,
107
+ projectedMonthlyUsd,
108
+ };
109
+ }
110
+ /**
111
+ * Get cost breakdown by agent.
112
+ */
113
+ getCostByAgent(since) {
114
+ const entries = this.store.getCostEntries({ since });
115
+ const result = {};
116
+ for (const entry of entries) {
117
+ if (!result[entry.agentName]) {
118
+ result[entry.agentName] = { costUsd: 0, tokens: 0, runs: 0 };
119
+ }
120
+ result[entry.agentName].costUsd += entry.costUsd ?? 0;
121
+ result[entry.agentName].tokens += entry.totalTokens ?? 0;
122
+ result[entry.agentName].runs += 1;
123
+ }
124
+ return result;
125
+ }
126
+ /**
127
+ * Get cost breakdown by pipeline stage.
128
+ */
129
+ getCostByStage(since) {
130
+ const entries = this.store.getCostEntries({ since });
131
+ const result = {};
132
+ for (const entry of entries) {
133
+ const stage = entry.stageName ?? 'unknown';
134
+ if (!result[stage]) {
135
+ result[stage] = { costUsd: 0, tokens: 0, runs: 0 };
136
+ }
137
+ result[stage].costUsd += entry.costUsd ?? 0;
138
+ result[stage].tokens += entry.totalTokens ?? 0;
139
+ result[stage].runs += 1;
140
+ }
141
+ return result;
142
+ }
143
+ /**
144
+ * Get cost time series at a given granularity.
145
+ */
146
+ getCostTimeSeries(granularity = 'day', since) {
147
+ const entries = this.store.getCostEntries({ since, limit: 10000 });
148
+ const buckets = new Map();
149
+ for (const entry of entries) {
150
+ if (!entry.createdAt)
151
+ continue;
152
+ const date = new Date(entry.createdAt);
153
+ let key;
154
+ switch (granularity) {
155
+ case 'day':
156
+ key = date.toISOString().split('T')[0];
157
+ break;
158
+ case 'week': {
159
+ const weekStart = new Date(date);
160
+ weekStart.setDate(weekStart.getDate() - weekStart.getDay());
161
+ key = weekStart.toISOString().split('T')[0];
162
+ break;
163
+ }
164
+ case 'month':
165
+ key = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`;
166
+ break;
167
+ }
168
+ const existing = buckets.get(key) ?? { date: key, costUsd: 0, tokens: 0, runCount: 0 };
169
+ existing.costUsd += entry.costUsd ?? 0;
170
+ existing.tokens += entry.totalTokens ?? 0;
171
+ existing.runCount += 1;
172
+ buckets.set(key, existing);
173
+ }
174
+ return [...buckets.values()].sort((a, b) => a.date.localeCompare(b.date));
175
+ }
176
+ }
177
+ //# sourceMappingURL=cost-tracker.js.map
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Centralized default values for the AI-SDLC orchestrator.
3
+ *
4
+ * All magic numbers, fallback strings, and environment-driven defaults live
5
+ * here so they can be tuned from a single location. Every value can be
6
+ * overridden by an environment variable, a Pipeline/AgentRole YAML field,
7
+ * or an explicit function parameter — these are only the last-resort
8
+ * fallbacks.
9
+ */
10
+ import type { NetworkPolicy, SandboxConstraints } from '@ai-sdlc/reference';
11
+ /**
12
+ * Default model name (literal fallback).
13
+ * Consumers should read `AI_SDLC_MODEL` env var at call time and fall back
14
+ * to this constant, so tests that set env vars at runtime see the override.
15
+ */
16
+ export declare const DEFAULT_MODEL = "claude-sonnet-4-5-20250929";
17
+ /**
18
+ * Fallback values for GitHub org/repo — empty strings require explicit config.
19
+ * Consumers should read `GITHUB_REPOSITORY_OWNER` / `GITHUB_REPOSITORY`
20
+ * at call time and fall back to these constants.
21
+ */
22
+ export declare const DEFAULT_GITHUB_ORG = "";
23
+ export declare const DEFAULT_GITHUB_REPO = "";
24
+ export declare const DEFAULT_GITHUB_REPOSITORY = "";
25
+ export declare const DEFAULT_CONFIG_DIR_NAME: string;
26
+ export declare const DEFAULT_SANDBOX_MEMORY_MB = 512;
27
+ export declare const DEFAULT_SANDBOX_CPU_PERCENT = 80;
28
+ export declare const DEFAULT_SANDBOX_NETWORK_POLICY: NetworkPolicy;
29
+ export declare const DEFAULT_SANDBOX_TIMEOUT_MS: number;
30
+ /** Build a SandboxConstraints object from defaults, optionally overriding timeout and workDir. */
31
+ export declare function defaultSandboxConstraints(workDir: string, timeoutMs?: number): SandboxConstraints;
32
+ export declare const DEFAULT_RUNNER_TIMEOUT_MS: number;
33
+ export declare const DEFAULT_ALLOWED_TOOLS = "Edit,Write,Read,Glob,Grep,Bash";
34
+ export declare const DEFAULT_MAX_FILES_PER_CHANGE = 15;
35
+ export declare const DEFAULT_REQUIRE_TESTS = true;
36
+ export declare const DEFAULT_BLOCKED_PATHS: string[];
37
+ /**
38
+ * Lint command injected into agent prompts.
39
+ * Undefined by default — users opt in via AI_SDLC_LINT_COMMAND env var
40
+ * or by passing `lintCommand` in AgentContext.
41
+ */
42
+ export declare const DEFAULT_LINT_COMMAND: string | undefined;
43
+ /**
44
+ * Format command injected into agent prompts.
45
+ * Undefined by default — users opt in via AI_SDLC_FORMAT_COMMAND env var
46
+ * or by passing `formatCommand` in AgentContext.
47
+ */
48
+ export declare const DEFAULT_FORMAT_COMMAND: string | undefined;
49
+ export declare const DEFAULT_COMMIT_MESSAGE_TEMPLATE: string;
50
+ export declare const DEFAULT_COMMIT_CO_AUTHOR: string;
51
+ export declare const DEFAULT_OPENAI_API_URL = "https://api.openai.com/v1/chat/completions";
52
+ export declare const DEFAULT_OPENAI_MODEL = "gpt-4";
53
+ export declare const DEFAULT_ANTHROPIC_API_URL = "https://api.anthropic.com/v1/messages";
54
+ export declare const DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-4-5-20250929";
55
+ export declare const DEFAULT_GENERIC_LLM_MODEL = "default";
56
+ export declare const DEFAULT_COPILOT_MODEL: string | undefined;
57
+ export declare const DEFAULT_CURSOR_MODEL: string | undefined;
58
+ export declare const DEFAULT_CODEX_MODEL: string | undefined;
59
+ export declare const DEFAULT_LLM_TIMEOUT_MS = 120000;
60
+ export declare const DEFAULT_LLM_MAX_TOKENS = 4096;
61
+ export declare const DEFAULT_LLM_SYSTEM_PROMPT = "You are a software engineering agent. Implement code changes as instructed.";
62
+ export declare const DEFAULT_DOCKER_IMAGE = "node:20-slim";
63
+ export declare const DEFAULT_WORKFLOW_FILE = "ci.yml";
64
+ export declare const DEFAULT_LABEL_TO_SKILL_MAP: Record<string, string>;
65
+ export declare const DEFAULT_ANALYSIS_CACHE_TTL_MS: number;
66
+ export declare const DEFAULT_MAX_FIX_ATTEMPTS = 2;
67
+ export declare const DEFAULT_MAX_LOG_LINES = 150;
68
+ export declare const DEFAULT_GH_CLI_TIMEOUT_MS: number;
69
+ export declare const DEFAULT_JIT_TTL_MS: number;
70
+ export declare const DEFAULT_JIT_SCOPE: string[];
71
+ export declare const DEFAULT_BRANCH_TEMPLATE = "ai-sdlc/issue-{issueNumber}";
72
+ export declare const DEFAULT_BRANCH_PATTERN: RegExp;
73
+ export declare const DEFAULT_PR_TITLE_TEMPLATE = "fix: {issueTitle} (#{issueNumber})";
74
+ export declare const DEFAULT_PR_FOOTER = "*This PR was generated by [AI-SDLC](https://github.com/ai-sdlc-framework/ai-sdlc).*";
75
+ export declare const DEFAULT_COMPLEXITY_THRESHOLDS: {
76
+ 'fully-autonomous': {
77
+ min: number;
78
+ max: number;
79
+ strategy: "fully-autonomous";
80
+ };
81
+ 'ai-with-review': {
82
+ min: number;
83
+ max: number;
84
+ strategy: "ai-with-review";
85
+ };
86
+ 'ai-assisted': {
87
+ min: number;
88
+ max: number;
89
+ strategy: "ai-assisted";
90
+ };
91
+ 'human-led': {
92
+ min: number;
93
+ max: number;
94
+ strategy: "human-led";
95
+ };
96
+ };
97
+ export declare const DEFAULT_MAX_LINES_PER_PR: {
98
+ readonly level0: 100;
99
+ readonly level1: 300;
100
+ readonly level2: 500;
101
+ };
102
+ export declare const DEFAULT_ANALYSIS_INCLUDE: string[];
103
+ export declare const DEFAULT_ANALYSIS_EXCLUDE: string[];
104
+ export declare const DEFAULT_GIT_HISTORY_DAYS = 90;
105
+ export declare const DEFAULT_HOTSPOT_THRESHOLD = 0.3;
106
+ /** Cost per million tokens for known models (input/output/cache-read). */
107
+ export declare const DEFAULT_MODEL_COSTS: Record<string, {
108
+ inputPer1M: number;
109
+ outputPer1M: number;
110
+ cacheReadPer1M: number;
111
+ }>;
112
+ /** Default monthly cost budget in USD. */
113
+ export declare const DEFAULT_COST_BUDGET_USD = 500;
114
+ /** Dashboard refresh interval in milliseconds. */
115
+ export declare const DEFAULT_DASHBOARD_REFRESH_MS = 2000;
116
+ export type ComplexityBand = 'trivial' | 'standard' | 'complex' | 'critical';
117
+ export interface GateProfile {
118
+ band: ComplexityBand;
119
+ minScore: number;
120
+ maxScore: number;
121
+ defaultEnforcement: string;
122
+ testCoverageThreshold: number;
123
+ reviewRequired: boolean;
124
+ securityScanRequired: boolean;
125
+ documentationRequired: boolean;
126
+ }
127
+ /** Static gate profiles per complexity band (RFC 217-228). */
128
+ export declare const PROGRESSIVE_GATE_PROFILES: readonly GateProfile[];
129
+ export declare const NOTIFICATION_TITLES: {
130
+ readonly issueValidationFailed: "AI-SDLC: Issue Validation Failed";
131
+ readonly complexityTooHigh: "AI-SDLC: Complexity Too High";
132
+ readonly agentFailed: "AI-SDLC: Agent Failed";
133
+ readonly guardrailViolations: "AI-SDLC: Guardrail Violations";
134
+ readonly prCreated: "AI-SDLC: PR Created";
135
+ readonly fixCIRetryLimit: "AI-SDLC: Fix-CI Retry Limit Reached";
136
+ readonly fixCIAgentFailed: "AI-SDLC: Fix-CI Agent Failed";
137
+ readonly fixCIGuardrailViolations: "AI-SDLC: Fix-CI Guardrail Violations";
138
+ readonly fixCIApplied: "AI-SDLC: Fix-CI Applied";
139
+ };
140
+ //# sourceMappingURL=defaults.d.ts.map