midas-mcp 3.2.0 → 3.4.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 (48) hide show
  1. package/dist/analyzer.d.ts.map +1 -1
  2. package/dist/analyzer.js +93 -49
  3. package/dist/analyzer.js.map +1 -1
  4. package/dist/docs/DEPLOYMENT.md +190 -0
  5. package/dist/index.js +4 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/monitoring.d.ts +97 -0
  8. package/dist/monitoring.d.ts.map +1 -0
  9. package/dist/monitoring.js +258 -0
  10. package/dist/monitoring.js.map +1 -0
  11. package/dist/prompts/grow.d.ts.map +1 -1
  12. package/dist/prompts/grow.js +155 -47
  13. package/dist/prompts/grow.js.map +1 -1
  14. package/dist/providers.d.ts.map +1 -1
  15. package/dist/providers.js +77 -15
  16. package/dist/providers.js.map +1 -1
  17. package/dist/server.d.ts.map +1 -1
  18. package/dist/server.js +21 -3
  19. package/dist/server.js.map +1 -1
  20. package/dist/state/phase.d.ts +19 -4
  21. package/dist/state/phase.d.ts.map +1 -1
  22. package/dist/state/phase.js +19 -10
  23. package/dist/state/phase.js.map +1 -1
  24. package/dist/tools/analyze.d.ts.map +1 -1
  25. package/dist/tools/analyze.js +21 -9
  26. package/dist/tools/analyze.js.map +1 -1
  27. package/dist/tools/completeness.d.ts +36 -0
  28. package/dist/tools/completeness.d.ts.map +1 -0
  29. package/dist/tools/completeness.js +838 -0
  30. package/dist/tools/completeness.js.map +1 -0
  31. package/dist/tools/grow.d.ts +157 -0
  32. package/dist/tools/grow.d.ts.map +1 -0
  33. package/dist/tools/grow.js +532 -0
  34. package/dist/tools/grow.js.map +1 -0
  35. package/dist/tools/index.d.ts +3 -0
  36. package/dist/tools/index.d.ts.map +1 -1
  37. package/dist/tools/index.js +6 -0
  38. package/dist/tools/index.js.map +1 -1
  39. package/dist/tools/validate.d.ts +60 -0
  40. package/dist/tools/validate.d.ts.map +1 -0
  41. package/dist/tools/validate.js +234 -0
  42. package/dist/tools/validate.js.map +1 -0
  43. package/dist/tools/verify.d.ts +4 -4
  44. package/dist/tui.d.ts.map +1 -1
  45. package/dist/tui.js +66 -12
  46. package/dist/tui.js.map +1 -1
  47. package/docs/DEPLOYMENT.md +190 -0
  48. package/package.json +1 -1
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Production Monitoring Integration
3
+ *
4
+ * Provides hooks for:
5
+ * - Error tracking (Sentry)
6
+ * - Observability (OpenTelemetry)
7
+ * - Custom metrics
8
+ *
9
+ * These are optional integrations - if the libraries aren't installed,
10
+ * the hooks gracefully degrade to no-ops.
11
+ */
12
+ import { logger } from './logger.js';
13
+ // ============================================================================
14
+ // SENTRY INTEGRATION
15
+ // ============================================================================
16
+ let sentryClient = null;
17
+ let sentryInitialized = false;
18
+ /**
19
+ * Initialize Sentry if SENTRY_DSN is set
20
+ *
21
+ * Sentry cost estimate (free tier):
22
+ * - 5,000 errors/month free
23
+ * - 10,000 performance samples/month free
24
+ * - Beyond free: ~$0.000029 per error
25
+ *
26
+ * MAX MONTHLY COST: ~$15 at 500k errors (extreme case)
27
+ * Expected: $0 (well under free tier for dev tools)
28
+ */
29
+ export function initSentry() {
30
+ if (sentryInitialized)
31
+ return !!sentryClient;
32
+ sentryInitialized = true;
33
+ const dsn = process.env.SENTRY_DSN;
34
+ if (!dsn) {
35
+ logger.debug('Sentry not configured (no SENTRY_DSN)');
36
+ return false;
37
+ }
38
+ try {
39
+ // Dynamic import to avoid requiring Sentry as a dependency
40
+ // Users can install @sentry/node if they want this feature
41
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
42
+ import('@sentry/node').then((Sentry) => {
43
+ const S = Sentry;
44
+ S.init({
45
+ dsn,
46
+ environment: process.env.NODE_ENV || 'development',
47
+ release: process.env.npm_package_version,
48
+ tracesSampleRate: 0.1,
49
+ enabled: process.env.NODE_ENV === 'production' || process.env.SENTRY_ENABLED === 'true',
50
+ maxBreadcrumbs: 50,
51
+ });
52
+ sentryClient = Sentry;
53
+ logger.info('Sentry initialized');
54
+ }).catch(() => {
55
+ logger.debug('Sentry package not installed');
56
+ });
57
+ return true;
58
+ }
59
+ catch {
60
+ logger.debug('Sentry initialization failed');
61
+ return false;
62
+ }
63
+ }
64
+ /**
65
+ * Capture an error with context
66
+ */
67
+ export function captureError(error, context) {
68
+ logger.error('Error captured', { error: error.message, ...context });
69
+ if (!sentryClient)
70
+ return;
71
+ try {
72
+ const S = sentryClient;
73
+ S.withScope((scope) => {
74
+ if (context?.phase)
75
+ scope.setTag('phase', context.phase);
76
+ if (context?.step)
77
+ scope.setTag('step', context.step);
78
+ if (context?.tool)
79
+ scope.setTag('tool', context.tool);
80
+ if (context?.projectPath)
81
+ scope.setContext('project', { path: context.projectPath });
82
+ if (context?.extra)
83
+ scope.setExtras(context.extra);
84
+ S.captureException(error);
85
+ });
86
+ }
87
+ catch {
88
+ // Silently fail - monitoring should never break the app
89
+ }
90
+ }
91
+ /**
92
+ * Add a breadcrumb for debugging context
93
+ */
94
+ export function addBreadcrumb(message, category, data) {
95
+ if (!sentryClient)
96
+ return;
97
+ try {
98
+ const S = sentryClient;
99
+ S.addBreadcrumb({
100
+ message,
101
+ category,
102
+ data,
103
+ level: 'info',
104
+ });
105
+ }
106
+ catch {
107
+ // Silently fail
108
+ }
109
+ }
110
+ // ============================================================================
111
+ // OPENTELEMETRY INTEGRATION
112
+ // ============================================================================
113
+ let otelMeter = null;
114
+ let otelInitialized = false;
115
+ // Metric counters (created lazily)
116
+ let analysisCounter = null;
117
+ let tokenCounter = null;
118
+ let latencyHistogram = null;
119
+ /**
120
+ * Initialize OpenTelemetry metrics if OTEL_EXPORTER_OTLP_ENDPOINT is set
121
+ *
122
+ * OpenTelemetry is free (self-hosted) or pay-per-use with vendors:
123
+ * - Datadog: ~$0.10 per million custom metrics
124
+ * - Grafana Cloud: 10k series free, then ~$8/1k series
125
+ * - Self-hosted: Infrastructure costs only
126
+ *
127
+ * MAX MONTHLY COST: ~$10 at typical usage
128
+ */
129
+ export function initOpenTelemetry() {
130
+ if (otelInitialized)
131
+ return !!otelMeter;
132
+ otelInitialized = true;
133
+ const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
134
+ if (!endpoint) {
135
+ logger.debug('OpenTelemetry not configured (no OTEL_EXPORTER_OTLP_ENDPOINT)');
136
+ return false;
137
+ }
138
+ try {
139
+ // Dynamic import to avoid requiring OTel as a dependency
140
+ import('@opentelemetry/api').then((api) => {
141
+ const otelApi = api;
142
+ otelMeter = otelApi.metrics.getMeter('midas-mcp');
143
+ // Create counters
144
+ const meter = otelMeter;
145
+ analysisCounter = meter.createCounter('midas.analysis.count', {
146
+ description: 'Number of project analyses',
147
+ });
148
+ tokenCounter = meter.createCounter('midas.tokens.total', {
149
+ description: 'Total tokens consumed',
150
+ });
151
+ latencyHistogram = meter.createHistogram('midas.analysis.latency', {
152
+ description: 'Analysis latency in milliseconds',
153
+ unit: 'ms',
154
+ });
155
+ logger.info('OpenTelemetry metrics initialized');
156
+ }).catch(() => {
157
+ logger.debug('OpenTelemetry package not installed');
158
+ });
159
+ return true;
160
+ }
161
+ catch {
162
+ logger.debug('OpenTelemetry initialization failed');
163
+ return false;
164
+ }
165
+ }
166
+ /**
167
+ * Record an analysis event
168
+ */
169
+ export function recordAnalysis(latencyMs, tags) {
170
+ if (!otelMeter || !analysisCounter || !latencyHistogram)
171
+ return;
172
+ try {
173
+ const counter = analysisCounter;
174
+ const histogram = latencyHistogram;
175
+ const attributes = {
176
+ provider: tags?.provider || 'unknown',
177
+ phase: tags?.phase || 'unknown',
178
+ cached: String(tags?.cached ?? false),
179
+ };
180
+ counter.add(1, attributes);
181
+ histogram.record(latencyMs, attributes);
182
+ }
183
+ catch {
184
+ // Silently fail
185
+ }
186
+ }
187
+ /**
188
+ * Record token usage
189
+ */
190
+ export function recordTokens(inputTokens, outputTokens, tags) {
191
+ if (!otelMeter || !tokenCounter)
192
+ return;
193
+ try {
194
+ const counter = tokenCounter;
195
+ const attributes = {
196
+ provider: tags?.provider || 'unknown',
197
+ type: 'input',
198
+ };
199
+ counter.add(inputTokens, attributes);
200
+ counter.add(outputTokens, { ...attributes, type: 'output' });
201
+ }
202
+ catch {
203
+ // Silently fail
204
+ }
205
+ }
206
+ // ============================================================================
207
+ // UNIFIED MONITORING INTERFACE
208
+ // ============================================================================
209
+ /**
210
+ * Initialize all monitoring integrations
211
+ * Call this once at startup
212
+ */
213
+ export function initMonitoring() {
214
+ const sentry = initSentry();
215
+ const otel = initOpenTelemetry();
216
+ if (sentry || otel) {
217
+ logger.info('Monitoring initialized', { sentry, otel });
218
+ }
219
+ return { sentry, otel };
220
+ }
221
+ /**
222
+ * Wrap an async function with error tracking
223
+ */
224
+ export function withErrorTracking(fn, context) {
225
+ return fn().catch((error) => {
226
+ captureError(error, context);
227
+ throw error;
228
+ });
229
+ }
230
+ /**
231
+ * Create a timed operation for metrics
232
+ */
233
+ export function startTimer() {
234
+ const start = Date.now();
235
+ return {
236
+ end(tags) {
237
+ const latency = Date.now() - start;
238
+ recordAnalysis(latency, tags);
239
+ return latency;
240
+ },
241
+ };
242
+ }
243
+ /**
244
+ * Health check for monitoring systems
245
+ */
246
+ export function getMonitoringHealth() {
247
+ return {
248
+ sentry: {
249
+ initialized: sentryInitialized,
250
+ configured: !!sentryClient,
251
+ },
252
+ otel: {
253
+ initialized: otelInitialized,
254
+ configured: !!otelMeter,
255
+ },
256
+ };
257
+ }
258
+ //# sourceMappingURL=monitoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitoring.js","sourceRoot":"","sources":["../src/monitoring.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"grow.d.ts","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2J3D"}
1
+ {"version":3,"file":"grow.d.ts","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyR3D"}
@@ -1,7 +1,34 @@
1
1
  import { z } from 'zod';
2
2
  export function registerGrowPrompts(server) {
3
- // User feedback analysis
4
- server.prompt('analyze_feedback', 'Analyze user feedback to identify patterns and priorities', { feedback: z.string().describe('User feedback to analyze (paste reviews, comments, tickets)') }, (args) => ({
3
+ // MONITOR step - Production health tracking
4
+ server.prompt('production_health', 'Review production health metrics and error rates', { errorLogs: z.string().optional().describe('Paste recent error logs or metrics') }, (args) => ({
5
+ messages: [
6
+ {
7
+ role: 'user',
8
+ content: {
9
+ type: 'text',
10
+ text: `Analyze production health:
11
+
12
+ ${args.errorLogs ? `Recent data:\n${args.errorLogs}\n\n---` : ''}
13
+
14
+ Check:
15
+ 1. **Error rates** - What's breaking? Frequency? Patterns?
16
+ 2. **Latency** - p50, p95, p99 response times
17
+ 3. **Uptime** - Any outages? Duration?
18
+ 4. **Resources** - CPU, memory, disk usage trends
19
+
20
+ For each issue:
21
+ - Severity (critical/high/medium/low)
22
+ - Affected users/requests
23
+ - Recommended action
24
+
25
+ Output a health report with priorities.`,
26
+ },
27
+ },
28
+ ],
29
+ }));
30
+ // COLLECT step - Gather feedback
31
+ server.prompt('collect_feedback', 'Analyze user feedback to identify patterns', { feedback: z.string().describe('User feedback to analyze (paste reviews, comments, tickets)') }, (args) => ({
5
32
  messages: [
6
33
  {
7
34
  role: 'user',
@@ -13,90 +40,171 @@ ${args.feedback}
13
40
 
14
41
  ---
15
42
 
16
- 1. **Categorize** each piece of feedback:
43
+ 1. **Categorize** each piece:
17
44
  - Bug report
18
45
  - Feature request
19
- - UX issue
46
+ - UX friction
20
47
  - Performance complaint
21
48
  - Praise
22
49
 
23
- 2. **Identify patterns** - What themes appear multiple times?
50
+ 2. **Identify patterns** - Themes appearing multiple times
24
51
 
25
- 3. **Prioritize** using impact vs effort matrix:
26
- - Quick wins (low effort, high impact)
27
- - Major projects (high effort, high impact)
28
- - Nice to haves (low effort, low impact)
29
- - Avoid (high effort, low impact)
52
+ 3. **Extract quotes** - Most impactful user statements
30
53
 
31
- 4. **Recommend** top 3 actions for next iteration.`,
54
+ 4. **Sentiment** - Overall positive/negative/neutral breakdown
55
+
56
+ Output a feedback summary with key insights.`,
32
57
  },
33
58
  },
34
59
  ],
35
60
  }));
36
- // Metrics review
37
- server.prompt('metrics_review', 'Review product metrics to identify opportunities', { metrics: z.string().optional().describe('Key metrics data if available') }, (args) => ({
61
+ // TRIAGE step - Prioritize issues
62
+ server.prompt('triage_bugs', 'Prioritize bugs and issues by impact and effort', { issues: z.string().describe('List of bugs/issues to triage') }, (args) => ({
38
63
  messages: [
39
64
  {
40
65
  role: 'user',
41
66
  content: {
42
67
  type: 'text',
43
- text: `Review product metrics and health:
68
+ text: `Triage these issues:
44
69
 
45
- ${args.metrics ? `Data:\n${args.metrics}\n\n---` : ''}
70
+ ${args.issues}
46
71
 
47
- Analyze (or help me set up tracking for):
72
+ ---
48
73
 
49
- 1. **Acquisition** - How users find us
50
- 2. **Activation** - First value moment
51
- 3. **Retention** - Users coming back
52
- 4. **Revenue** - Monetization health
53
- 5. **Referral** - Viral coefficient
74
+ For each issue, determine:
75
+ 1. **Impact** (1-5): Users affected, severity, revenue impact
76
+ 2. **Effort** (1-5): Complexity, risk, dependencies
77
+ 3. **Urgency**: Is it getting worse?
54
78
 
55
- For each stage:
56
- - What's the current state?
57
- - What's the bottleneck?
58
- - What's one experiment to try?
79
+ Then categorize:
80
+ - **P0 Critical**: Fix immediately (blocking users, security, data loss)
81
+ - **P1 High**: Fix this sprint (major functionality broken)
82
+ - **P2 Medium**: Schedule soon (degraded experience)
83
+ - **P3 Low**: Backlog (minor annoyance)
59
84
 
60
- Provide specific, actionable recommendations.`,
85
+ Output a prioritized list with recommended order.`,
61
86
  },
62
87
  },
63
88
  ],
64
89
  }));
65
- // Iteration planning
66
- server.prompt('plan_iteration', 'Plan the next development iteration based on learnings', {}, () => ({
90
+ // RETROSPECT step - Review the cycle
91
+ server.prompt('sprint_retro', 'Conduct a sprint/cycle retrospective', {
92
+ accomplishments: z.string().optional().describe('What was shipped'),
93
+ issues: z.string().optional().describe('Problems encountered'),
94
+ }, (args) => ({
67
95
  messages: [
68
96
  {
69
97
  role: 'user',
70
98
  content: {
71
99
  type: 'text',
72
- text: `Plan the next iteration:
100
+ text: `Sprint retrospective:
101
+
102
+ ${args.accomplishments ? `Shipped:\n${args.accomplishments}\n` : ''}
103
+ ${args.issues ? `Issues:\n${args.issues}\n` : ''}
104
+ ---
105
+
106
+ Guide me through:
107
+
108
+ 1. **What worked well?**
109
+ - Processes that helped
110
+ - Tools that saved time
111
+ - Team dynamics that clicked
112
+
113
+ 2. **What didn't work?**
114
+ - Blockers we hit
115
+ - Time wasted on
116
+ - Communication gaps
117
+
118
+ 3. **What surprised us?**
119
+ - Unexpected wins
120
+ - Hidden complexity
121
+ - User behavior we didn't expect
122
+
123
+ 4. **Action items**
124
+ - One thing to START doing
125
+ - One thing to STOP doing
126
+ - One thing to CONTINUE doing
127
+
128
+ Output concrete action items for next cycle.`,
129
+ },
130
+ },
131
+ ],
132
+ }));
133
+ // PLAN_NEXT step - Scope next iteration
134
+ server.prompt('plan_next_cycle', 'Plan the next development cycle with clear scope', { learnings: z.string().optional().describe('Key learnings from retro') }, (args) => ({
135
+ messages: [
136
+ {
137
+ role: 'user',
138
+ content: {
139
+ type: 'text',
140
+ text: `Plan next cycle:
141
+
142
+ ${args.learnings ? `Learnings:\n${args.learnings}\n\n---` : ''}
143
+
144
+ Define:
145
+
146
+ 1. **Hypothesis**
147
+ - What are we testing?
148
+ - What do we believe will happen?
149
+ - How will we validate?
150
+
151
+ 2. **Scope**
152
+ - Single most important thing to build
153
+ - Explicit non-goals (what we WON'T do)
154
+ - Minimum viable version
155
+
156
+ 3. **Success metrics**
157
+ - How do we measure success?
158
+ - Target numbers
159
+ - Timeline
160
+
161
+ 4. **Risks**
162
+ - What could go wrong?
163
+ - Mitigation strategies
164
+ - Kill criteria (when to pivot)
165
+
166
+ Output a one-page cycle plan.`,
167
+ },
168
+ },
169
+ ],
170
+ }));
171
+ // LOOP step - Return to PLAN with context
172
+ server.prompt('cycle_handoff', 'Prepare context for next PLAN phase', {}, () => ({
173
+ messages: [
174
+ {
175
+ role: 'user',
176
+ content: {
177
+ type: 'text',
178
+ text: `Prepare for next PLAN phase:
179
+
180
+ Create handoff document:
73
181
 
74
- 1. **Retrospective**
75
- - What worked well last iteration?
76
- - What didn't work?
77
- - What did we learn?
182
+ 1. **Context summary**
183
+ - What was built this cycle
184
+ - Current state of the product
185
+ - Active users/usage metrics
78
186
 
79
- 2. **Scope Definition**
80
- - What's the single most important thing to build next?
81
- - What's explicitly OUT of scope?
82
- - What's the hypothesis we're testing?
187
+ 2. **Lessons learned**
188
+ - Technical decisions that worked/didn't
189
+ - Process improvements needed
190
+ - Knowledge to preserve
83
191
 
84
- 3. **Success Criteria**
85
- - How will we know this succeeded?
86
- - What metrics will we track?
87
- - What's the minimum viable version?
192
+ 3. **Carry forward**
193
+ - Unresolved bugs (prioritized)
194
+ - Feature requests (prioritized)
195
+ - Technical debt to address
88
196
 
89
- 4. **Return to Plan Phase**
90
- - Update brainlift with new learnings
91
- - Revise PRD for next feature
92
- - Create new gameplan
197
+ 4. **Brainlift updates**
198
+ - New edge knowledge gained
199
+ - Updated constraints
200
+ - Revised assumptions
93
201
 
94
- Output a clear plan I can execute.`,
202
+ Output a handoff doc ready to inform the next PLAN phase.`,
95
203
  },
96
204
  },
97
205
  ],
98
206
  }));
99
- // Performance optimization
207
+ // Performance optimization (keep existing)
100
208
  server.prompt('optimize_performance', 'Identify and fix performance bottlenecks', { area: z.string().optional().describe('Specific area to optimize (frontend/backend/db)') }, (args) => ({
101
209
  messages: [
102
210
  {
@@ -1 +1 @@
1
- {"version":3,"file":"grow.js","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,mBAAmB,CAAC,MAAiB;IACnD,yBAAyB;IACzB,MAAM,CAAC,MAAM,CACX,kBAAkB,EAClB,2DAA2D,EAC3D,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC,EAAE,EAChG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACT,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;;EAEhB,IAAI,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;mDAmBoC;iBACxC;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,MAAM,CACX,gBAAgB,EAChB,kDAAkD,EAClD,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,EAC5E,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACT,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;;EAEhB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;8CAeP;iBACnC;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,qBAAqB;IACrB,MAAM,CAAC,MAAM,CACX,gBAAgB,EAChB,wDAAwD,EACxD,EAAE,EACF,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;mCAsBiB;iBACxB;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,2BAA2B;IAC3B,MAAM,CAAC,MAAM,CACX,sBAAsB,EACtB,0CAA0C,EAC1C,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC,EAAE,EAC3F,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACT,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,uBAAuB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;yDAuBnB;iBAC9C;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"grow.js","sourceRoot":"","sources":["../../src/prompts/grow.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGpF,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAkCD;;GAEG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4B3F;AA0PD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,UAAU,GAAG;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAaA"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAwC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAKpF,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAkCD;;GAEG;AACH,wBAAsB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CA4B3F;AAyTD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,UAAU,GAAG;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAaA"}