rivet-design 0.5.7 → 0.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -16
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -5
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +20 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/routes/agent.d.ts +8 -0
- package/dist/routes/agent.d.ts.map +1 -0
- package/dist/routes/agent.js +79 -0
- package/dist/routes/agent.js.map +1 -0
- package/dist/routes/comments.d.ts +2 -0
- package/dist/routes/comments.d.ts.map +1 -0
- package/dist/routes/comments.js +92 -0
- package/dist/routes/comments.js.map +1 -0
- package/dist/routes/onboarding.d.ts +6 -0
- package/dist/routes/onboarding.d.ts.map +1 -0
- package/dist/routes/onboarding.js +206 -0
- package/dist/routes/onboarding.js.map +1 -0
- package/dist/routes/selection.d.ts +2 -0
- package/dist/routes/selection.d.ts.map +1 -0
- package/dist/routes/selection.js +38 -0
- package/dist/routes/selection.js.map +1 -0
- package/dist/scripts/react-instrumentation.js +300 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -1
- package/dist/server.js.map +1 -1
- package/dist/services/AgentBridgeService.d.ts +89 -0
- package/dist/services/AgentBridgeService.d.ts.map +1 -0
- package/dist/services/AgentBridgeService.js +413 -0
- package/dist/services/AgentBridgeService.js.map +1 -0
- package/dist/services/AgentModService.d.ts +76 -0
- package/dist/services/AgentModService.d.ts.map +1 -0
- package/dist/services/AgentModService.js +494 -0
- package/dist/services/AgentModService.js.map +1 -0
- package/dist/services/CommentSessionManager.d.ts +94 -0
- package/dist/services/CommentSessionManager.d.ts.map +1 -0
- package/dist/services/CommentSessionManager.js +260 -0
- package/dist/services/CommentSessionManager.js.map +1 -0
- package/dist/services/ImportResolverService.d.ts +30 -0
- package/dist/services/ImportResolverService.d.ts.map +1 -0
- package/dist/services/ImportResolverService.js +136 -0
- package/dist/services/ImportResolverService.js.map +1 -0
- package/dist/services/ReactComponentPlugin.d.ts +44 -0
- package/dist/services/ReactComponentPlugin.d.ts.map +1 -0
- package/dist/services/ReactComponentPlugin.js +100 -0
- package/dist/services/ReactComponentPlugin.js.map +1 -0
- package/dist/types/agent-protocol.d.ts +55 -0
- package/dist/types/agent-protocol.d.ts.map +1 -0
- package/dist/types/agent-protocol.js +6 -0
- package/dist/types/agent-protocol.js.map +1 -0
- package/dist/types/agent-tools.d.ts +78 -0
- package/dist/types/agent-tools.d.ts.map +1 -0
- package/dist/types/agent-tools.js +7 -0
- package/dist/types/agent-tools.js.map +1 -0
- package/dist/types/types.d.ts +15 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +3 -0
- package/dist/types/types.js.map +1 -0
- package/dist/utils/skillWriter.d.ts +10 -7
- package/dist/utils/skillWriter.d.ts.map +1 -1
- package/dist/utils/skillWriter.js +51 -53
- package/dist/utils/skillWriter.js.map +1 -1
- package/dist/utils/skills/claude-skill.d.ts +6 -0
- package/dist/utils/skills/claude-skill.d.ts.map +1 -0
- package/dist/utils/skills/claude-skill.js +49 -0
- package/dist/utils/skills/claude-skill.js.map +1 -0
- package/dist/utils/skills/cursor-rules.d.ts +5 -0
- package/dist/utils/skills/cursor-rules.d.ts.map +1 -0
- package/dist/utils/skills/cursor-rules.js +49 -0
- package/dist/utils/skills/cursor-rules.js.map +1 -0
- package/package.json +1 -1
- package/src/ui/dist/assets/{main-DAIpACRO.js → main-Ckx6ZPoZ.js} +26 -26
- package/src/ui/dist/index.html +1 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.createOnboardingRouter = void 0;
|
|
37
|
+
const express_1 = require("express");
|
|
38
|
+
const logger_1 = require("../utils/logger");
|
|
39
|
+
const agent_1 = require("../services/agent");
|
|
40
|
+
const ProjectConfigService_1 = require("../services/ProjectConfigService");
|
|
41
|
+
const log = (0, logger_1.createLogger)('OnboardingRoutes');
|
|
42
|
+
/**
|
|
43
|
+
* Create router for onboarding API endpoints.
|
|
44
|
+
* Handles project setup via agent and cached config management.
|
|
45
|
+
*/
|
|
46
|
+
const createOnboardingRouter = (projectPath) => {
|
|
47
|
+
const router = (0, express_1.Router)();
|
|
48
|
+
const configService = new ProjectConfigService_1.ProjectConfigService();
|
|
49
|
+
/**
|
|
50
|
+
* POST /api/onboarding/start
|
|
51
|
+
* Start the onboarding agent to analyze and start the dev server.
|
|
52
|
+
* Returns SSE stream of agent progress.
|
|
53
|
+
*/
|
|
54
|
+
router.post('/start', async (req, res) => {
|
|
55
|
+
log.info(`Starting onboarding for project: ${projectPath}`);
|
|
56
|
+
// Setup SSE headers
|
|
57
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
58
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
59
|
+
res.setHeader('Connection', 'keep-alive');
|
|
60
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
61
|
+
const agent = new agent_1.OnboardingAgent(projectPath);
|
|
62
|
+
try {
|
|
63
|
+
const result = await agent.execute((event) => {
|
|
64
|
+
if (event.type === 'step' && event.step) {
|
|
65
|
+
const step = event.step;
|
|
66
|
+
if (step.type === 'reasoning') {
|
|
67
|
+
const text = step.data.text;
|
|
68
|
+
res.write(`data: ${JSON.stringify({ type: 'thinking', content: text })}\n\n`);
|
|
69
|
+
}
|
|
70
|
+
else if (step.type === 'tool_call') {
|
|
71
|
+
const data = step.data;
|
|
72
|
+
res.write(`data: ${JSON.stringify({ type: 'tool_call', tool: data.name, input: data.input })}\n\n`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (event.type === 'error') {
|
|
76
|
+
res.write(`data: ${JSON.stringify({ type: 'error', content: event.error })}\n\n`);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Send final result
|
|
80
|
+
res.write(`data: ${JSON.stringify({ type: 'complete', result })}\n\n`);
|
|
81
|
+
res.end();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
85
|
+
log.error('Onboarding failed:', errorMsg);
|
|
86
|
+
res.write(`data: ${JSON.stringify({ type: 'error', content: errorMsg })}\n\n`);
|
|
87
|
+
res.end();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* GET /api/onboarding/status
|
|
92
|
+
* Check if project has a cached config.
|
|
93
|
+
*/
|
|
94
|
+
router.get('/status', async (req, res) => {
|
|
95
|
+
try {
|
|
96
|
+
const config = await configService.getProjectConfig(projectPath);
|
|
97
|
+
res.json({
|
|
98
|
+
hasCachedConfig: !!config,
|
|
99
|
+
config,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
log.error('Failed to get onboarding status:', error);
|
|
104
|
+
res.status(500).json({
|
|
105
|
+
error: 'Failed to get status',
|
|
106
|
+
details: error instanceof Error ? error.message : 'Unknown error',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
/**
|
|
111
|
+
* POST /api/onboarding/run-cached
|
|
112
|
+
* Run the cached start command to start the dev server.
|
|
113
|
+
* Returns SSE stream of progress.
|
|
114
|
+
*/
|
|
115
|
+
router.post('/run-cached', async (req, res) => {
|
|
116
|
+
const config = await configService.getProjectConfig(projectPath);
|
|
117
|
+
if (!config) {
|
|
118
|
+
return res.status(404).json({ error: 'No cached config found' });
|
|
119
|
+
}
|
|
120
|
+
log.info(`Running cached start command: ${config.startCommand}`);
|
|
121
|
+
// Setup SSE headers
|
|
122
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
123
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
124
|
+
res.setHeader('Connection', 'keep-alive');
|
|
125
|
+
try {
|
|
126
|
+
const { spawn } = await Promise.resolve().then(() => __importStar(require('child_process')));
|
|
127
|
+
res.write(`data: ${JSON.stringify({ type: 'status', content: `Running: ${config.startCommand}` })}\n\n`);
|
|
128
|
+
// Parse the start command
|
|
129
|
+
const parts = config.startCommand.split(' ');
|
|
130
|
+
const cmd = parts[0];
|
|
131
|
+
const args = parts.slice(1);
|
|
132
|
+
// Start the dev server in background
|
|
133
|
+
const child = spawn(cmd, args, {
|
|
134
|
+
cwd: projectPath,
|
|
135
|
+
detached: true,
|
|
136
|
+
stdio: 'ignore',
|
|
137
|
+
});
|
|
138
|
+
child.unref();
|
|
139
|
+
// Wait for server to be ready
|
|
140
|
+
res.write(`data: ${JSON.stringify({ type: 'status', content: 'Waiting for server to start...' })}\n\n`);
|
|
141
|
+
// Poll for server to be ready
|
|
142
|
+
const port = config.devServerPort;
|
|
143
|
+
let attempts = 0;
|
|
144
|
+
const maxAttempts = 30; // 30 seconds max
|
|
145
|
+
const checkServer = async () => {
|
|
146
|
+
try {
|
|
147
|
+
const response = await fetch(`http://localhost:${port}`, {
|
|
148
|
+
method: 'HEAD',
|
|
149
|
+
});
|
|
150
|
+
return response.ok || response.status < 500;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
while (attempts < maxAttempts) {
|
|
157
|
+
if (await checkServer()) {
|
|
158
|
+
res.write(`data: ${JSON.stringify({
|
|
159
|
+
type: 'complete',
|
|
160
|
+
result: {
|
|
161
|
+
success: true,
|
|
162
|
+
devServerPort: port,
|
|
163
|
+
startCommand: config.startCommand,
|
|
164
|
+
},
|
|
165
|
+
})}\n\n`);
|
|
166
|
+
res.end();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
170
|
+
attempts++;
|
|
171
|
+
}
|
|
172
|
+
// Timeout
|
|
173
|
+
res.write(`data: ${JSON.stringify({
|
|
174
|
+
type: 'error',
|
|
175
|
+
content: `Server did not start within ${maxAttempts} seconds`,
|
|
176
|
+
})}\n\n`);
|
|
177
|
+
res.end();
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
|
|
181
|
+
log.error('Failed to run cached command:', errorMsg);
|
|
182
|
+
res.write(`data: ${JSON.stringify({ type: 'error', content: errorMsg })}\n\n`);
|
|
183
|
+
res.end();
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
/**
|
|
187
|
+
* DELETE /api/onboarding/config
|
|
188
|
+
* Clear cached config for the project.
|
|
189
|
+
*/
|
|
190
|
+
router.delete('/config', async (req, res) => {
|
|
191
|
+
try {
|
|
192
|
+
await configService.clearProjectConfig(projectPath);
|
|
193
|
+
res.json({ success: true });
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
log.error('Failed to clear config:', error);
|
|
197
|
+
res.status(500).json({
|
|
198
|
+
error: 'Failed to clear config',
|
|
199
|
+
details: error instanceof Error ? error.message : 'Unknown error',
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
return router;
|
|
204
|
+
};
|
|
205
|
+
exports.createOnboardingRouter = createOnboardingRouter;
|
|
206
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/routes/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../src/routes/selection.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,qBAAqB,GAAI,mBAAmB,MAAM,+CAwB9D,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ABOUTME: Selection script and configuration API routes
|
|
3
|
+
// ABOUTME: Handles serving the element selection script and runtime configuration
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.createSelectionRouter = void 0;
|
|
9
|
+
const express_1 = require("express");
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const logger_1 = require("../utils/logger");
|
|
13
|
+
const log = (0, logger_1.createLogger)('SelectionRoutes');
|
|
14
|
+
const createSelectionRouter = (userDevServerPort) => {
|
|
15
|
+
const router = (0, express_1.Router)();
|
|
16
|
+
// Configuration endpoint
|
|
17
|
+
router.get('/config', (req, res) => {
|
|
18
|
+
res.json({
|
|
19
|
+
userPort: userDevServerPort
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
// Serve selection script
|
|
23
|
+
router.get('/selection-script', (req, res) => {
|
|
24
|
+
try {
|
|
25
|
+
const scriptPath = path_1.default.join(__dirname, '../scripts/selection-script.js');
|
|
26
|
+
const scriptContent = fs_1.default.readFileSync(scriptPath, 'utf8');
|
|
27
|
+
res.setHeader('Content-Type', 'application/javascript');
|
|
28
|
+
res.send(scriptContent);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
log.error('Failed to serve selection script:', error);
|
|
32
|
+
res.status(500).send('// Selection script not found');
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return router;
|
|
36
|
+
};
|
|
37
|
+
exports.createSelectionRouter = createSelectionRouter;
|
|
38
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/routes/selection.ts"],"names":[],"mappings":";AAAA,yDAAyD;AACzD,kFAAkF;;;;;;AAElF,qCAAiC;AACjC,4CAAoB;AACpB,gDAAwB;AACxB,4CAA+C;AAE/C,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,iBAAiB,CAAC,CAAC;AAErC,MAAM,qBAAqB,GAAG,CAAC,iBAAyB,EAAE,EAAE;IACjE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,yBAAyB;IACzB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACjC,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,iBAAiB;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,yBAAyB;IACzB,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gCAAgC,CAAC,CAAC;YAC1E,MAAM,aAAa,GAAG,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC1D,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,wBAAwB,CAAC,CAAC;YACxD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAxBW,QAAA,qBAAqB,yBAwBhC"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
// React DevTools instrumentation for Rivet
|
|
2
|
+
// Uses bippy library for reliable React Fiber tree access
|
|
3
|
+
(function () {
|
|
4
|
+
'use strict';
|
|
5
|
+
|
|
6
|
+
console.log('[Rivet] React instrumentation loaded');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Check if React is present on the page by looking for React fiber on any element
|
|
10
|
+
*/
|
|
11
|
+
function detectReact() {
|
|
12
|
+
// Check if any DOM element has React fiber attached
|
|
13
|
+
const elements = document.querySelectorAll('*');
|
|
14
|
+
for (let i = 0; i < elements.length; i++) {
|
|
15
|
+
const element = elements[i];
|
|
16
|
+
const hasFiber = Object.keys(element).some(
|
|
17
|
+
(key) =>
|
|
18
|
+
key.startsWith('__reactFiber$') ||
|
|
19
|
+
key.startsWith('__reactInternalInstance$'),
|
|
20
|
+
);
|
|
21
|
+
if (hasFiber) {
|
|
22
|
+
console.log('[Rivet] React detected on page');
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Load bippy library dynamically
|
|
31
|
+
*/
|
|
32
|
+
let bippyLoading = null;
|
|
33
|
+
async function loadBippy() {
|
|
34
|
+
if (window.Bippy) {
|
|
35
|
+
return window.Bippy;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// If already loading, wait for it
|
|
39
|
+
if (bippyLoading) {
|
|
40
|
+
return bippyLoading;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
bippyLoading = new Promise((resolve, reject) => {
|
|
44
|
+
try {
|
|
45
|
+
// Load bippy from CDN (exposes window.Bippy)
|
|
46
|
+
const script = document.createElement('script');
|
|
47
|
+
script.src = 'https://unpkg.com/bippy';
|
|
48
|
+
|
|
49
|
+
script.onload = () => {
|
|
50
|
+
console.log('[Rivet] Bippy library loaded');
|
|
51
|
+
resolve(window.Bippy);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
script.onerror = () => {
|
|
55
|
+
console.error('[Rivet] Failed to load bippy');
|
|
56
|
+
reject(new Error('Failed to load bippy'));
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
document.head.appendChild(script);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error('[Rivet] Error loading bippy:', error);
|
|
62
|
+
reject(error);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
return bippyLoading;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Find the React Fiber node for a DOM element using bippy
|
|
71
|
+
*/
|
|
72
|
+
async function getFiberFromElement(element) {
|
|
73
|
+
if (!element) return null;
|
|
74
|
+
|
|
75
|
+
try {
|
|
76
|
+
const Bippy = await loadBippy();
|
|
77
|
+
|
|
78
|
+
if (Bippy && Bippy.getNearestHostFiber) {
|
|
79
|
+
const fiber = Bippy.getNearestHostFiber(element);
|
|
80
|
+
if (fiber) {
|
|
81
|
+
console.log('[Rivet] Got fiber from bippy');
|
|
82
|
+
return fiber;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
} catch (error) {
|
|
86
|
+
console.warn('[Rivet] Error using bippy, falling back to manual:', error);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Fallback to manual method
|
|
90
|
+
console.log('[Rivet] Using manual fiber extraction');
|
|
91
|
+
const fiberKey = Object.keys(element).find(
|
|
92
|
+
(key) =>
|
|
93
|
+
key.startsWith('__reactFiber$') ||
|
|
94
|
+
key.startsWith('__reactInternalInstance$') ||
|
|
95
|
+
key.startsWith('__reactProps$'),
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
if (fiberKey && fiberKey.startsWith('__reactFiber')) {
|
|
99
|
+
return element[fiberKey];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (fiberKey && fiberKey.startsWith('__reactProps')) {
|
|
103
|
+
const fiberId = fiberKey.replace('__reactProps$', '__reactFiber$');
|
|
104
|
+
if (element[fiberId]) {
|
|
105
|
+
return element[fiberId];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Walk up the Fiber tree to collect ALL parent components with source locations
|
|
114
|
+
*/
|
|
115
|
+
async function findAllComponentsInTree(fiber) {
|
|
116
|
+
if (!fiber) return [];
|
|
117
|
+
|
|
118
|
+
const components = [];
|
|
119
|
+
let current = fiber;
|
|
120
|
+
const seenFiles = new Set(); // Avoid duplicates
|
|
121
|
+
let nodeCount = 0;
|
|
122
|
+
let debugInfo = { nodesChecked: 0, nodesWithSource: 0, nodesWithType: 0 };
|
|
123
|
+
|
|
124
|
+
console.log('[Rivet] Walking React Fiber tree...');
|
|
125
|
+
|
|
126
|
+
// Try to load bippy for better component names
|
|
127
|
+
let Bippy = null;
|
|
128
|
+
try {
|
|
129
|
+
Bippy = await loadBippy();
|
|
130
|
+
} catch (e) {
|
|
131
|
+
console.log('[Rivet] Bippy not available, using manual names');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
while (current && nodeCount < 50) {
|
|
135
|
+
// Limit to prevent infinite loops
|
|
136
|
+
nodeCount++;
|
|
137
|
+
debugInfo.nodesChecked++;
|
|
138
|
+
|
|
139
|
+
// Log fiber node properties for debugging
|
|
140
|
+
if (nodeCount <= 5) {
|
|
141
|
+
console.log(`[Rivet] Fiber node ${nodeCount}:`, {
|
|
142
|
+
type:
|
|
143
|
+
current.type?.name ||
|
|
144
|
+
current.type?.displayName ||
|
|
145
|
+
typeof current.type,
|
|
146
|
+
tag: current.tag,
|
|
147
|
+
hasDebugSource: !!current._debugSource,
|
|
148
|
+
hasDebugOwner: !!current._debugOwner,
|
|
149
|
+
debugSourceFile: current._debugSource?.fileName,
|
|
150
|
+
debugOwnerSourceFile: current._debugOwner?._debugSource?.fileName,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Check if this fiber has debug source (component source location)
|
|
155
|
+
const source = current._debugSource || current._debugOwner?._debugSource;
|
|
156
|
+
|
|
157
|
+
if (source && source.fileName) {
|
|
158
|
+
debugInfo.nodesWithSource++;
|
|
159
|
+
|
|
160
|
+
// Get component name - try bippy first for better names
|
|
161
|
+
let componentName = null;
|
|
162
|
+
if (Bippy && Bippy.getDisplayName) {
|
|
163
|
+
try {
|
|
164
|
+
componentName = Bippy.getDisplayName(current);
|
|
165
|
+
} catch (e) {
|
|
166
|
+
// Bippy failed, fall through to manual
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Fallback to manual name extraction
|
|
171
|
+
if (!componentName) {
|
|
172
|
+
if (current.type) {
|
|
173
|
+
debugInfo.nodesWithType++;
|
|
174
|
+
componentName = current.type.name || current.type.displayName;
|
|
175
|
+
} else if (current._debugOwner?.type) {
|
|
176
|
+
componentName =
|
|
177
|
+
current._debugOwner.type.name ||
|
|
178
|
+
current._debugOwner.type.displayName;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Only add if we haven't seen this file yet
|
|
183
|
+
const fileKey = `${source.fileName}:${source.lineNumber}`;
|
|
184
|
+
if (!seenFiles.has(fileKey)) {
|
|
185
|
+
seenFiles.add(fileKey);
|
|
186
|
+
components.push({
|
|
187
|
+
filePath: source.fileName,
|
|
188
|
+
line: source.lineNumber,
|
|
189
|
+
column: source.columnNumber,
|
|
190
|
+
componentName: componentName || 'Unknown',
|
|
191
|
+
});
|
|
192
|
+
console.log(
|
|
193
|
+
`[Rivet] Found component: ${componentName || 'Unknown'} at ${source.fileName}:${source.lineNumber}`,
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Move up the tree (return fiber -> parent fiber)
|
|
199
|
+
current = current.return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
console.log('[Rivet] Fiber tree walk complete:', debugInfo);
|
|
203
|
+
|
|
204
|
+
return components;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Extract component information from a DOM element
|
|
209
|
+
* Returns ALL parent components in the tree hierarchy
|
|
210
|
+
*/
|
|
211
|
+
async function getComponentInfo(element) {
|
|
212
|
+
if (!element || !(element instanceof HTMLElement)) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
try {
|
|
217
|
+
// Find the fiber node for this element (async with bippy)
|
|
218
|
+
const fiber = await getFiberFromElement(element);
|
|
219
|
+
if (!fiber) {
|
|
220
|
+
console.warn('[Rivet] No fiber found for element:', element);
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Find ALL components in the fiber tree (async with bippy)
|
|
225
|
+
const components = await findAllComponentsInTree(fiber);
|
|
226
|
+
if (components.length === 0) {
|
|
227
|
+
console.warn('[Rivet] No component source found for element:', element);
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Clean file paths for all components
|
|
232
|
+
const cleanedComponents = components.map((comp) => {
|
|
233
|
+
let filePath = comp.filePath;
|
|
234
|
+
|
|
235
|
+
// Remove webpack prefixes like "webpack://" or "webpack-internal:///"
|
|
236
|
+
filePath = filePath.replace(/^webpack(-internal)?:\/\/\//, '');
|
|
237
|
+
filePath = filePath.replace(/^\.\//, '');
|
|
238
|
+
|
|
239
|
+
// For Create React App and similar, remove the leading dot-slash
|
|
240
|
+
if (filePath.startsWith('./')) {
|
|
241
|
+
filePath = filePath.substring(2);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
filePath,
|
|
246
|
+
line: comp.line,
|
|
247
|
+
column: comp.column,
|
|
248
|
+
componentName: comp.componentName,
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
console.log(
|
|
253
|
+
`[Rivet] Found ${cleanedComponents.length} components in tree:`,
|
|
254
|
+
cleanedComponents,
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
// Return the component hierarchy
|
|
258
|
+
return {
|
|
259
|
+
components: cleanedComponents,
|
|
260
|
+
// Primary component is the first (closest to selected element)
|
|
261
|
+
primaryComponent: cleanedComponents[0],
|
|
262
|
+
};
|
|
263
|
+
} catch (error) {
|
|
264
|
+
console.error('[Rivet] Error extracting component info:', error);
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Check if React is available
|
|
271
|
+
*/
|
|
272
|
+
function isReactAvailable() {
|
|
273
|
+
return detectReact();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Try to detect React on page load
|
|
277
|
+
if (document.readyState === 'loading') {
|
|
278
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
279
|
+
if (detectReact()) {
|
|
280
|
+
console.log('[Rivet] React instrumentation ready');
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
} else {
|
|
284
|
+
// Page already loaded, check now
|
|
285
|
+
if (detectReact()) {
|
|
286
|
+
console.log('[Rivet] React instrumentation ready');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Expose API on window
|
|
291
|
+
window.__RIVET_REACT__ = {
|
|
292
|
+
getComponentInfo,
|
|
293
|
+
isReactAvailable,
|
|
294
|
+
version: '1.0.0',
|
|
295
|
+
};
|
|
296
|
+
|
|
297
|
+
console.log(
|
|
298
|
+
'[Rivet] React instrumentation API exposed on window.__RIVET_REACT__',
|
|
299
|
+
);
|
|
300
|
+
})();
|
package/dist/server.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export type ServerOptions = Omit<CLIOptions, 'help' | 'version' | 'debug'> & {
|
|
|
11
11
|
styleFramework?: 'tailwind';
|
|
12
12
|
tailwindConfig?: string;
|
|
13
13
|
sessionBridge?: SessionBridgeService;
|
|
14
|
+
/** The editor running the MCP session (e.g. 'claude', 'cursor', 'codex'). Shown in the UI button. */
|
|
15
|
+
mcpEditor?: string;
|
|
14
16
|
/** Skip registering process-level exit/signal handlers. Set true when embedded in another process (e.g. MCP server). */
|
|
15
17
|
skipProcessHandlers?: boolean;
|
|
16
18
|
/** Explicit port for the Rivet Express server. Defaults to DEFAULT_PORT (4000). */
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAmC,MAAM,GAAG,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAK/D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAgCvE,eAAO,MAAM,YAAY,QAAkB,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,GAAG;IAC3E,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,wHAAwH;IACxH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,SAAS,aAAa,KACrB,OAAO,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAmC,MAAM,GAAG,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAK/D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAgCvE,eAAO,MAAM,YAAY,QAAkB,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,GAAG;IAC3E,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,UAAU,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,qGAAqG;IACrG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wHAAwH;IACxH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,WAAW,GACtB,SAAS,aAAa,KACrB,OAAO,CAAC,YAAY,CA2RtB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -77,7 +77,7 @@ const resolveUiPath = () => {
|
|
|
77
77
|
};
|
|
78
78
|
exports.DIST_UI_PATH = resolveUiPath();
|
|
79
79
|
const startServer = async (options) => {
|
|
80
|
-
const { userPort, telemetry, projectPath, framework, staticEntry, styleFramework, tailwindConfig, sessionBridge, skipProcessHandlers, } = options;
|
|
80
|
+
const { userPort, telemetry, projectPath, framework, staticEntry, styleFramework, tailwindConfig, sessionBridge, mcpEditor, skipProcessHandlers, } = options;
|
|
81
81
|
const userPortWithFallback = userPort ?? _1.DEFAULT_USER_PORT;
|
|
82
82
|
if (process.env.SENTRY_DSN) {
|
|
83
83
|
Sentry.init({
|
|
@@ -194,6 +194,7 @@ const startServer = async (options) => {
|
|
|
194
194
|
agentModeAvailable: configManager.isAuthenticated(),
|
|
195
195
|
email: configManager.getEmail(),
|
|
196
196
|
isMCPSession: sessionBridge?.isActive() ?? false,
|
|
197
|
+
mcpEditor: mcpEditor ?? null,
|
|
197
198
|
});
|
|
198
199
|
});
|
|
199
200
|
// Store auth credentials locally after browser-based OAuth completion.
|
|
@@ -251,6 +252,7 @@ const startServer = async (options) => {
|
|
|
251
252
|
}
|
|
252
253
|
});
|
|
253
254
|
// Start server
|
|
255
|
+
const activeSockets = new Set();
|
|
254
256
|
const httpServer = await new Promise((resolve, reject) => {
|
|
255
257
|
const server = app.listen(listenPort, () => {
|
|
256
258
|
log.info(`🎨 Rivet server running on http://localhost:${listenPort}`);
|
|
@@ -259,6 +261,11 @@ const startServer = async (options) => {
|
|
|
259
261
|
server.on('error', (err) => {
|
|
260
262
|
reject(err);
|
|
261
263
|
});
|
|
264
|
+
// Track connections so we can destroy them on close (prevents keep-alive hang)
|
|
265
|
+
server.on('connection', (socket) => {
|
|
266
|
+
activeSockets.add(socket);
|
|
267
|
+
socket.on('close', () => activeSockets.delete(socket));
|
|
268
|
+
});
|
|
262
269
|
// Handle WebSocket upgrade requests
|
|
263
270
|
server.on('upgrade', (req, socket, head) => {
|
|
264
271
|
const pathname = req.url;
|
|
@@ -282,6 +289,10 @@ const startServer = async (options) => {
|
|
|
282
289
|
else
|
|
283
290
|
resolve();
|
|
284
291
|
});
|
|
292
|
+
// Destroy all active connections so close() resolves immediately
|
|
293
|
+
for (const socket of activeSockets) {
|
|
294
|
+
socket.destroy();
|
|
295
|
+
}
|
|
285
296
|
}),
|
|
286
297
|
};
|
|
287
298
|
};
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAuC;AACvC,sDAA8B;AAC9B,gDAAwB;AACxB,gDAAwB;AACxB,4CAAoB;AAEpB,6CAA4D;AAC5D,wBAAgE;AAEhE,oDAA4D;AAC5D,0DAAkE;AAClE,sCAA+C;AAC/C,4CAAoD;AAEpD,kEAA2E;AAC3E,oEAAiE;AACjE,4CAAqD;AACrD,4DAA4D;AAE5D,sCAA+C;AAE/C,MAAM,GAAG,GAAG,IAAA,yBAAY,EAAC,aAAa,CAAC,CAAC;AAExC;;GAEG;AACH,MAAM,aAAa,GAAG,GAAW,EAAE;IACjC,mEAAmE;IACnE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEpD,uEAAuE;IACvE,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAE1D,2CAA2C;IAC3C,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAEvD,qDAAqD;IACrD,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,oDAAoD;IACpD,IAAI,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,gCAAgC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qDAAuC;AACvC,sDAA8B;AAC9B,gDAAwB;AACxB,gDAAwB;AACxB,4CAAoB;AAEpB,6CAA4D;AAC5D,wBAAgE;AAEhE,oDAA4D;AAC5D,0DAAkE;AAClE,sCAA+C;AAC/C,4CAAoD;AAEpD,kEAA2E;AAC3E,oEAAiE;AACjE,4CAAqD;AACrD,4DAA4D;AAE5D,sCAA+C;AAE/C,MAAM,GAAG,GAAG,IAAA,yBAAY,EAAC,aAAa,CAAC,CAAC;AAExC;;GAEG;AACH,MAAM,aAAa,GAAG,GAAW,EAAE;IACjC,mEAAmE;IACnE,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEpD,uEAAuE;IACvE,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAE1D,2CAA2C;IAC3C,MAAM,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAEvD,qDAAqD;IACrD,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,oDAAoD;IACpD,IAAI,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,gCAAgC;IAChC,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEW,QAAA,YAAY,GAAG,aAAa,EAAE,CAAC;AAsBrC,MAAM,WAAW,GAAG,KAAK,EAC9B,OAAsB,EACC,EAAE;IACzB,MAAM,EACJ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,cAAc,EACd,cAAc,EACd,aAAa,EACb,SAAS,EACT,mBAAmB,GACpB,GAAG,OAAO,CAAC;IAEZ,MAAM,oBAAoB,GAAG,QAAQ,IAAI,oBAAiB,CAAC;IAE3D,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YAC3B,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;SACnD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,2BAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAE7D,yBAAyB;IACzB,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,iBAAiB,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CACN,oEAAoE,EACpE,KAAK,CACN,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,aAAa,GAA6B,IAAI,CAAC;IACnD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,WAAW,IAAI,YAAY,CAAC;QAC/C,aAAa,GAAG,IAAI,qCAAiB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACjE,CAAC;IAED,0FAA0F;IAC1F,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,GAAG,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACjD,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC7B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE5B,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,SAAS,EAAE,CAAC;gBACd,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;YACtC,GAAG,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YACtC,SAAS,EAAE,gBAAgB,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;YACvD,cAAc,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1C,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAC1C,SAAS,EAAE,gBAAgB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YAC3D,cAAc,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,eAAY,CAAC;IAErD,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;IAEtB,2CAA2C;IAC3C,GAAG,CAAC,GAAG,CACL,IAAA,cAAI,EAAC;QACH,MAAM,EAAE;YACN,oBAAoB,UAAU,EAAE;YAChC,oBAAoB,UAAU,EAAE;SACjC;QACD,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC;QACpD,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;KAClD,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAEzC,6BAA6B;IAC7B,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,iBAAO,CAAC,MAAM,CAAC,oBAAY,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,IAAI,CAAC,2BAA2B,oBAAY,EAAE,CAAC,CAAC;IAEpD,oEAAoE;IACpE,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxB,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,+BAA+B,CAAC,CAAC;YACvD,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,+FAA+F;IAE/F,qCAAqC;IACrC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAA,kCAAqB,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/D,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAA,wCAAwB,EAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAClE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAA,qBAAe,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC;IAC9D,GAAG,CAAC,GAAG,CACL,MAAM,EACN,IAAA,0BAAiB,EAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,CAC/D,CAAC;IAEF,2CAA2C;IAC3C,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,IAAA,2BAAkB,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC/C,CAAC;IAED,wBAAwB;IACxB,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAClC,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS;YACT,KAAK,EAAE;gBACL,KAAK,EAAE,eAAY;gBACnB,aAAa,EAAE,oBAAoB;aACpC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAClC,MAAM,aAAa,GAAG,IAAA,gCAAgB,GAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC;YACP,kBAAkB,EAAE,aAAa,CAAC,eAAe,EAAE;YACnD,KAAK,EAAE,aAAa,CAAC,QAAQ,EAAE;YAC/B,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,KAAK;YAChD,SAAS,EAAE,SAAS,IAAI,IAAI;SAC7B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,yEAAyE;IACzE,sEAAsE;IACtE,0DAA0D;IAC1D,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACtD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,aAAa,GAAG,IAAA,gCAAgB,GAAE,CAAC;QACzC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAClD,SAAS,EAAE,YAAY,EAAE,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,oBAAoB,CAAC,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,2DAA2D;IAC3D,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,IAAA,qBAAe,EAAC,aAAa,CAAC,CAAC,CAAC;QACpD,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACpD,CAAC;IAED,0DAA0D;IAC1D,iDAAiD;IACjD,mCAAmC;IACnC,IAAI,YAAY,GAAuD,IAAI,CAAC;IAE5E,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,YAAY,GAAG,IAAA,uCAAwB,EAAC,oBAAoB,CAAC,CAAC;QAE9D,wDAAwD;QACxD,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC5B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC9B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE7B,GAAG,CAAC,IAAI,CACN,iEAAiE,oBAAoB,EAAE,CACxF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,8BAA8B,CAAC,CAAC;IACvD,CAAC;IAED,yFAAyF;IACzF,0FAA0F;IAC1F,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,+EAA+E;IAC/E,GAAG,CAAC,GAAG,CACL,CACE,GAAU,EACV,GAAoB,EACpB,GAAqB,EAErB,KAA2B,EAC3B,EAAE;QACF,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QACzC,SAAS,EAAE,gBAAgB,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CACF,CAAC;IAEF,eAAe;IACf,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,CAClC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,EAAE;YACzC,GAAG,CAAC,IAAI,CAAC,+CAA+C,UAAU,EAAE,CAAC,CAAC;YACtE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA8B,EAAE,EAAE;YACpD,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,+EAA+E;QAC/E,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAc,EAAE,EAAE;YACzC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC;YAEzB,GAAG,CAAC,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;YAExD,qCAAqC;YACrC,IAAI,SAAS,KAAK,QAAQ,IAAI,YAAY,EAAE,OAAO,EAAE,CAAC;gBACpD,GAAG,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACzD,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,MAAgB,EAAE,IAAI,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,oCAAoC;YACpC,GAAG,CAAC,IAAI,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvB,IAAI,GAAG;oBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;oBAChB,OAAO,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;YACH,iEAAiE;YACjE,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;KACL,CAAC;AACJ,CAAC,CAAC;AA7RW,QAAA,WAAW,eA6RtB"}
|