@straiffi/archon 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +224 -0
- package/dist/cli.js +216 -0
- package/dist/client/assets/index-8_-boBBA.css +2 -0
- package/dist/client/assets/index-s_jjeqha.js +176 -0
- package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/dist/client/favicon.svg +62 -0
- package/dist/client/icons.svg +24 -0
- package/dist/client/index.html +14 -0
- package/dist/server/db.js +764 -0
- package/dist/server/db.js.map +1 -0
- package/dist/server/index.js +5134 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lib/agent.js +1302 -0
- package/dist/server/lib/agent.js.map +1 -0
- package/dist/server/lib/buildChains.js +2 -0
- package/dist/server/lib/buildChains.js.map +1 -0
- package/dist/server/lib/buildFlow.js +59 -0
- package/dist/server/lib/buildFlow.js.map +1 -0
- package/dist/server/lib/buildSequences.js +599 -0
- package/dist/server/lib/buildSequences.js.map +1 -0
- package/dist/server/lib/bundleActivity.js +95 -0
- package/dist/server/lib/bundleActivity.js.map +1 -0
- package/dist/server/lib/bundlePullRequests.js +126 -0
- package/dist/server/lib/bundlePullRequests.js.map +1 -0
- package/dist/server/lib/chatMessages.js +60 -0
- package/dist/server/lib/chatMessages.js.map +1 -0
- package/dist/server/lib/chatTargets.js +123 -0
- package/dist/server/lib/chatTargets.js.map +1 -0
- package/dist/server/lib/chatTicketProposals.js +180 -0
- package/dist/server/lib/chatTicketProposals.js.map +1 -0
- package/dist/server/lib/chats.js +279 -0
- package/dist/server/lib/chats.js.map +1 -0
- package/dist/server/lib/config.js +3 -0
- package/dist/server/lib/config.js.map +1 -0
- package/dist/server/lib/cors.js +30 -0
- package/dist/server/lib/cors.js.map +1 -0
- package/dist/server/lib/directoryPicker.js +174 -0
- package/dist/server/lib/directoryPicker.js.map +1 -0
- package/dist/server/lib/git.js +1284 -0
- package/dist/server/lib/git.js.map +1 -0
- package/dist/server/lib/integrations/github.js +511 -0
- package/dist/server/lib/integrations/github.js.map +1 -0
- package/dist/server/lib/integrations/index.js +162 -0
- package/dist/server/lib/integrations/index.js.map +1 -0
- package/dist/server/lib/integrations/jira.js +283 -0
- package/dist/server/lib/integrations/jira.js.map +1 -0
- package/dist/server/lib/integrations/planning.js +27 -0
- package/dist/server/lib/integrations/planning.js.map +1 -0
- package/dist/server/lib/integrations/types.js +2 -0
- package/dist/server/lib/integrations/types.js.map +1 -0
- package/dist/server/lib/lightweightPrompt.js +88 -0
- package/dist/server/lib/lightweightPrompt.js.map +1 -0
- package/dist/server/lib/models.js +219 -0
- package/dist/server/lib/models.js.map +1 -0
- package/dist/server/lib/preview.js +377 -0
- package/dist/server/lib/preview.js.map +1 -0
- package/dist/server/lib/previewProxy.js +659 -0
- package/dist/server/lib/previewProxy.js.map +1 -0
- package/dist/server/lib/projectAutoConfig.js +682 -0
- package/dist/server/lib/projectAutoConfig.js.map +1 -0
- package/dist/server/lib/projectFileSuggestions.js +133 -0
- package/dist/server/lib/projectFileSuggestions.js.map +1 -0
- package/dist/server/lib/projectMemory.js +1519 -0
- package/dist/server/lib/projectMemory.js.map +1 -0
- package/dist/server/lib/projectMemoryPrompt.js +390 -0
- package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
- package/dist/server/lib/projectMemoryScan.js +681 -0
- package/dist/server/lib/projectMemoryScan.js.map +1 -0
- package/dist/server/lib/projectMemorySuggestions.js +166 -0
- package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
- package/dist/server/lib/projectMemoryTransfer.js +958 -0
- package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
- package/dist/server/lib/projects.js +569 -0
- package/dist/server/lib/projects.js.map +1 -0
- package/dist/server/lib/promptSkills.js +28 -0
- package/dist/server/lib/promptSkills.js.map +1 -0
- package/dist/server/lib/queue.js +15 -0
- package/dist/server/lib/queue.js.map +1 -0
- package/dist/server/lib/reviewFindings.js +390 -0
- package/dist/server/lib/reviewFindings.js.map +1 -0
- package/dist/server/lib/run.js +416 -0
- package/dist/server/lib/run.js.map +1 -0
- package/dist/server/lib/runtimePaths.js +93 -0
- package/dist/server/lib/runtimePaths.js.map +1 -0
- package/dist/server/lib/shell.js +27 -0
- package/dist/server/lib/shell.js.map +1 -0
- package/dist/server/lib/skills.js +124 -0
- package/dist/server/lib/skills.js.map +1 -0
- package/dist/server/lib/startDev.js +18 -0
- package/dist/server/lib/startDev.js.map +1 -0
- package/dist/server/lib/staticClient.js +80 -0
- package/dist/server/lib/staticClient.js.map +1 -0
- package/dist/server/lib/terminal.js +366 -0
- package/dist/server/lib/terminal.js.map +1 -0
- package/dist/server/lib/ticketDependencies.js +174 -0
- package/dist/server/lib/ticketDependencies.js.map +1 -0
- package/dist/server/lib/ticketMessages.js +65 -0
- package/dist/server/lib/ticketMessages.js.map +1 -0
- package/dist/server/lib/ticketOpenQuestions.js +128 -0
- package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
- package/dist/server/lib/ticketUndo.js +549 -0
- package/dist/server/lib/ticketUndo.js.map +1 -0
- package/dist/server/lib/tickets.js +981 -0
- package/dist/server/lib/tickets.js.map +1 -0
- package/dist/server/lib/types.js +2 -0
- package/dist/server/lib/types.js.map +1 -0
- package/dist/server/package.json +3 -0
- package/dist/server/workers/build.js +229 -0
- package/dist/server/workers/build.js.map +1 -0
- package/dist/server/workers/chat.js +190 -0
- package/dist/server/workers/chat.js.map +1 -0
- package/dist/server/workers/followUp.js +204 -0
- package/dist/server/workers/followUp.js.map +1 -0
- package/dist/server/workers/plan.js +1130 -0
- package/dist/server/workers/plan.js.map +1 -0
- package/dist/server/workers/planFollowUp.js +360 -0
- package/dist/server/workers/planFollowUp.js.map +1 -0
- package/dist/server/workers/review.js +167 -0
- package/dist/server/workers/review.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
const CACHE_TTL_MS = 30_000;
|
|
3
|
+
const modelCache = new Map();
|
|
4
|
+
const inFlightModelDiscovery = new Map();
|
|
5
|
+
const ANSI_ESCAPE_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
|
|
6
|
+
const toProviderSummary = (models) => {
|
|
7
|
+
return Array.from(new Set(models.map(model => model.provider).filter(Boolean))).sort();
|
|
8
|
+
};
|
|
9
|
+
const getMissingProviders = (previousModels, nextModels) => {
|
|
10
|
+
const nextProviders = new Set(nextModels.map(model => model.provider).filter(Boolean));
|
|
11
|
+
return toProviderSummary(previousModels).filter(provider => !nextProviders.has(provider));
|
|
12
|
+
};
|
|
13
|
+
const shouldPreserveCachedModels = (cachedModels, discoveredModels) => {
|
|
14
|
+
if (cachedModels.length === 0) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
if (discoveredModels.length === 0) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return getMissingProviders(cachedModels, discoveredModels).length > 0;
|
|
21
|
+
};
|
|
22
|
+
const logPreservedCache = (reason, cachedModels, discoveredModels) => {
|
|
23
|
+
const missingProviders = getMissingProviders(cachedModels, discoveredModels);
|
|
24
|
+
const details = [
|
|
25
|
+
`reason=${reason}`,
|
|
26
|
+
`cached=${cachedModels.length}`,
|
|
27
|
+
`discovered=${discoveredModels.length}`,
|
|
28
|
+
];
|
|
29
|
+
if (missingProviders.length > 0) {
|
|
30
|
+
details.push(`missing_providers=${missingProviders.join(',')}`);
|
|
31
|
+
}
|
|
32
|
+
console.warn(`[models] preserving cached OpenCode models (${details.join(' ')})`);
|
|
33
|
+
};
|
|
34
|
+
const stripFormatting = (value) => {
|
|
35
|
+
return String(value ?? '')
|
|
36
|
+
.replace(ANSI_ESCAPE_RE, '')
|
|
37
|
+
.replace(/^["'`\s[({]+|[\])}"'`.,:;]+$/g, '')
|
|
38
|
+
.trim();
|
|
39
|
+
};
|
|
40
|
+
export const isValidModelId = (value) => {
|
|
41
|
+
if (typeof value !== 'string') {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
const normalized = value.trim();
|
|
45
|
+
const delimiter = normalized.indexOf('/');
|
|
46
|
+
if (normalized.startsWith('http://') || normalized.startsWith('https://')) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
if (delimiter <= 0 || delimiter === normalized.length - 1) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const provider = normalized.slice(0, delimiter);
|
|
53
|
+
const model = normalized.slice(delimiter + 1);
|
|
54
|
+
if (!provider || !model) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
59
|
+
export const normalizeModelId = (value) => {
|
|
60
|
+
const trimmed = stripFormatting(value);
|
|
61
|
+
if (!trimmed || !trimmed.includes('/')) {
|
|
62
|
+
return '';
|
|
63
|
+
}
|
|
64
|
+
if (trimmed.startsWith('opencode/')) {
|
|
65
|
+
const withoutPrefix = trimmed.slice('opencode/'.length);
|
|
66
|
+
if (withoutPrefix.includes('/')) {
|
|
67
|
+
if (isValidModelId(withoutPrefix)) {
|
|
68
|
+
return withoutPrefix;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (isValidModelId(trimmed)) {
|
|
73
|
+
return trimmed;
|
|
74
|
+
}
|
|
75
|
+
return '';
|
|
76
|
+
};
|
|
77
|
+
const toModelLabel = (modelId) => {
|
|
78
|
+
const slashIndex = modelId.indexOf('/');
|
|
79
|
+
return slashIndex === -1 ? modelId : modelId.slice(slashIndex + 1);
|
|
80
|
+
};
|
|
81
|
+
const toProvider = (modelId) => {
|
|
82
|
+
const slashIndex = modelId.indexOf('/');
|
|
83
|
+
return slashIndex === -1 ? '' : modelId.slice(0, slashIndex);
|
|
84
|
+
};
|
|
85
|
+
const normalizeVariants = (value) => {
|
|
86
|
+
if (!value || typeof value !== 'object') {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
return Object.keys(value);
|
|
90
|
+
};
|
|
91
|
+
const toNullableNumber = (value) => {
|
|
92
|
+
return typeof value === 'number' && Number.isFinite(value)
|
|
93
|
+
? value
|
|
94
|
+
: null;
|
|
95
|
+
};
|
|
96
|
+
const parseVerboseModels = (rawOutput) => {
|
|
97
|
+
if (!rawOutput.trim()) {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
const lines = rawOutput.split(/\r?\n/);
|
|
101
|
+
const models = [];
|
|
102
|
+
let currentModelId = '';
|
|
103
|
+
let currentJsonLines = [];
|
|
104
|
+
const flushCurrentModel = () => {
|
|
105
|
+
if (!currentModelId || currentJsonLines.length === 0) {
|
|
106
|
+
currentModelId = '';
|
|
107
|
+
currentJsonLines = [];
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const parsed = JSON.parse(currentJsonLines.join('\n'));
|
|
112
|
+
const normalizedId = normalizeModelId(currentModelId);
|
|
113
|
+
if (!normalizedId) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
models.push({
|
|
117
|
+
id: normalizedId,
|
|
118
|
+
label: toModelLabel(normalizedId),
|
|
119
|
+
provider: typeof parsed.providerID === 'string' && parsed.providerID.trim()
|
|
120
|
+
? parsed.providerID
|
|
121
|
+
: toProvider(normalizedId),
|
|
122
|
+
supports_reasoning: Boolean(parsed.capabilities?.reasoning),
|
|
123
|
+
variants: normalizeVariants(parsed.variants),
|
|
124
|
+
context_window: toNullableNumber(parsed.limit?.context),
|
|
125
|
+
max_input_tokens: toNullableNumber(parsed.limit?.input),
|
|
126
|
+
max_output_tokens: toNullableNumber(parsed.limit?.output),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Ignore malformed entries and keep the remaining discovered models.
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
currentModelId = '';
|
|
134
|
+
currentJsonLines = [];
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
for (const line of lines) {
|
|
138
|
+
const trimmedLine = line.trim();
|
|
139
|
+
const normalizedModelId = normalizeModelId(trimmedLine);
|
|
140
|
+
if (normalizedModelId && !trimmedLine.startsWith('{') && !trimmedLine.startsWith('"')) {
|
|
141
|
+
flushCurrentModel();
|
|
142
|
+
currentModelId = normalizedModelId;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (!currentModelId || !line.trim()) {
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
currentJsonLines.push(line);
|
|
149
|
+
}
|
|
150
|
+
flushCurrentModel();
|
|
151
|
+
return models;
|
|
152
|
+
};
|
|
153
|
+
const runModelDiscovery = () => new Promise((resolve, reject) => {
|
|
154
|
+
execFile('opencode', ['models', '--verbose'], { encoding: 'utf8' }, (err, stdout) => {
|
|
155
|
+
if (err) {
|
|
156
|
+
reject(err);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
resolve(parseVerboseModels(stdout));
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
const discoverModelsWithCacheFallback = async (cachedModels) => {
|
|
163
|
+
const discoveredModels = await runModelDiscovery();
|
|
164
|
+
if (!cachedModels || !shouldPreserveCachedModels(cachedModels, discoveredModels)) {
|
|
165
|
+
return discoveredModels;
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
const retriedModels = await runModelDiscovery();
|
|
169
|
+
if (!shouldPreserveCachedModels(cachedModels, retriedModels)) {
|
|
170
|
+
return retriedModels;
|
|
171
|
+
}
|
|
172
|
+
logPreservedCache('provider-regression', cachedModels, retriedModels);
|
|
173
|
+
return cachedModels;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
console.warn('[models] retrying OpenCode model discovery failed; preserving cached models', error);
|
|
177
|
+
return cachedModels;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
export const getDiscoveredModels = async (tool) => {
|
|
181
|
+
if (tool !== 'opencode') {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
const cached = modelCache.get(tool);
|
|
185
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {
|
|
186
|
+
return cached.models;
|
|
187
|
+
}
|
|
188
|
+
const inFlightDiscovery = inFlightModelDiscovery.get(tool);
|
|
189
|
+
if (inFlightDiscovery) {
|
|
190
|
+
return await inFlightDiscovery;
|
|
191
|
+
}
|
|
192
|
+
const discoveryPromise = (async () => {
|
|
193
|
+
try {
|
|
194
|
+
const models = await discoverModelsWithCacheFallback(cached?.models ?? null);
|
|
195
|
+
modelCache.set(tool, {
|
|
196
|
+
models,
|
|
197
|
+
timestamp: Date.now(),
|
|
198
|
+
});
|
|
199
|
+
return models;
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
console.warn('[models] OpenCode model discovery failed; falling back to cached models', error);
|
|
203
|
+
if (!cached) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
return cached.models;
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
inFlightModelDiscovery.delete(tool);
|
|
210
|
+
}
|
|
211
|
+
})();
|
|
212
|
+
inFlightModelDiscovery.set(tool, discoveryPromise);
|
|
213
|
+
return await discoveryPromise;
|
|
214
|
+
};
|
|
215
|
+
export const clearModelCache = () => {
|
|
216
|
+
modelCache.clear();
|
|
217
|
+
inFlightModelDiscovery.clear();
|
|
218
|
+
};
|
|
219
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../server/lib/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
const PREVIEW_PROBE_TIMEOUT_MS = 1500;
|
|
4
|
+
const PREVIEW_PROBE_RETRY_DELAY_MS = 250;
|
|
5
|
+
const PREVIEW_PROBE_RETRY_ATTEMPTS = 20;
|
|
6
|
+
const wait = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
7
|
+
const LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '[::1]']);
|
|
8
|
+
const HTTP_URL_PATTERN = /https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\])(?::\d{2,5})?(?:\/[^\s'"`<]*)?/gi;
|
|
9
|
+
const LOOPBACK_HOST_PORT_PATTERN = /(?:localhost|127\.0\.0\.1|0\.0\.0\.0|\[::1\])\s*:\s*(\d{2,5})(?:([^\s'"`<]*))?/gi;
|
|
10
|
+
const LISTENING_PORT_PATTERN = /(?:local|listening|running|started|available|ready)[^\n\r]{0,80}?port\s+(\d{2,5})/gi;
|
|
11
|
+
const STATIC_WEB_MARKERS = [
|
|
12
|
+
'vite',
|
|
13
|
+
'next',
|
|
14
|
+
'astro',
|
|
15
|
+
'nuxt',
|
|
16
|
+
'remix',
|
|
17
|
+
'@sveltejs/kit',
|
|
18
|
+
'sveltekit',
|
|
19
|
+
'webpack-dev-server',
|
|
20
|
+
'webpack serve',
|
|
21
|
+
'parcel',
|
|
22
|
+
];
|
|
23
|
+
const HYBRID_MARKERS = ['expo', 'capacitor', '@capacitor', 'ionic'];
|
|
24
|
+
const NATIVE_MOBILE_MARKERS = ['react-native run-ios', 'react-native run-android', 'xcodebuild', 'gradlew install', 'gradlew assemble'];
|
|
25
|
+
const IGNORED_PREVIEW_PATH_PREFIXES = ['/json', '/inspector', '/_expo', '/logs'];
|
|
26
|
+
const WEBPACK_DEV_SERVER_MARKERS = ['webpack-dev-server', 'webpack serve'];
|
|
27
|
+
const WEBPACK_READY_PATTERN = /compiled (?:successfully|with warnings)\b/i;
|
|
28
|
+
const ANSI_ESCAPE_PATTERN = /\u001B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g;
|
|
29
|
+
const escapeRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
30
|
+
const signalsIncludeToken = (signals, marker) => {
|
|
31
|
+
return new RegExp(`(^|[^a-z0-9])${escapeRegex(marker)}($|[^a-z0-9])`, 'i').test(signals);
|
|
32
|
+
};
|
|
33
|
+
export const normalizePreviewLogText = (value) => {
|
|
34
|
+
return value
|
|
35
|
+
.replace(ANSI_ESCAPE_PATTERN, '')
|
|
36
|
+
.replace(/\r/g, '');
|
|
37
|
+
};
|
|
38
|
+
const normalizeProjectPreviewMode = (value) => {
|
|
39
|
+
if (value === 'force_web' || value === 'force_disabled') {
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
return 'auto';
|
|
43
|
+
};
|
|
44
|
+
const getCapabilityMessage = (capability, mode, serviceName) => {
|
|
45
|
+
if (!serviceName) {
|
|
46
|
+
return 'No preview service configured';
|
|
47
|
+
}
|
|
48
|
+
if (mode === 'force_disabled') {
|
|
49
|
+
return 'Preview is disabled for this project';
|
|
50
|
+
}
|
|
51
|
+
if (capability === 'native_mobile') {
|
|
52
|
+
return 'This project is classified as native mobile and cannot be embedded';
|
|
53
|
+
}
|
|
54
|
+
return 'Waiting for preview service to report a browser URL';
|
|
55
|
+
};
|
|
56
|
+
const normalizeLoopbackHost = (url) => {
|
|
57
|
+
if (url.hostname === '0.0.0.0') {
|
|
58
|
+
url.hostname = 'localhost';
|
|
59
|
+
}
|
|
60
|
+
return url;
|
|
61
|
+
};
|
|
62
|
+
const normalizeLoopbackUrl = (value) => {
|
|
63
|
+
const url = new URL(value);
|
|
64
|
+
return normalizeLoopbackHost(url).toString();
|
|
65
|
+
};
|
|
66
|
+
const isLoopbackPreviewUrl = (value) => {
|
|
67
|
+
try {
|
|
68
|
+
const url = new URL(normalizeLoopbackUrl(value));
|
|
69
|
+
return (url.protocol === 'http:' || url.protocol === 'https:') && LOOPBACK_HOSTS.has(url.hostname);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const isEmbeddablePreviewPath = (value) => {
|
|
76
|
+
try {
|
|
77
|
+
const url = new URL(value);
|
|
78
|
+
const pathname = url.pathname || '/';
|
|
79
|
+
return !IGNORED_PREVIEW_PATH_PREFIXES.some(prefix => pathname === prefix || pathname.startsWith(`${prefix}/`));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const readPackageJsonText = (project) => {
|
|
86
|
+
if (typeof project.repo_path !== 'string' || project.repo_path.trim() === '') {
|
|
87
|
+
return '';
|
|
88
|
+
}
|
|
89
|
+
const packageJsonPath = join(project.repo_path, 'package.json');
|
|
90
|
+
if (!existsSync(packageJsonPath)) {
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
return readFileSync(packageJsonPath, 'utf8').toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return '';
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const readPackageJson = (project) => {
|
|
101
|
+
if (typeof project.repo_path !== 'string' || project.repo_path.trim() === '') {
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
const packageJsonPath = join(project.repo_path, 'package.json');
|
|
105
|
+
if (!existsSync(packageJsonPath)) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
return JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const getServiceSignals = (services) => {
|
|
116
|
+
return services.map(service => `${service.name ?? ''} ${service.cmd}`.toLowerCase()).join('\n');
|
|
117
|
+
};
|
|
118
|
+
const resolveServiceScriptCommand = (serviceCmd, packageJson) => {
|
|
119
|
+
const trimmed = serviceCmd.trim();
|
|
120
|
+
if (trimmed === '' || !packageJson?.scripts) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const directRunMatch = trimmed.match(/^(?:npm|pnpm|bun)\s+run\s+([\w:-]+)/i);
|
|
124
|
+
const shorthandRunMatch = trimmed.match(/^(?:npm|pnpm|yarn|bun)\s+([\w:-]+)/i);
|
|
125
|
+
const scriptName = directRunMatch?.[1] ?? shorthandRunMatch?.[1] ?? null;
|
|
126
|
+
if (!scriptName) {
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const script = packageJson.scripts[scriptName];
|
|
130
|
+
return typeof script === 'string' && script.trim() !== '' ? script : null;
|
|
131
|
+
};
|
|
132
|
+
const inferWebpackDevServerPort = (value) => {
|
|
133
|
+
const patterns = [
|
|
134
|
+
/(?:^|\s)--port(?:=|\s+)(\d{2,5})\b/i,
|
|
135
|
+
/(?:^|\s)-p\s+(\d{2,5})\b/i,
|
|
136
|
+
/(?:^|\s)PORT=(\d{2,5})\b/i,
|
|
137
|
+
];
|
|
138
|
+
for (const pattern of patterns) {
|
|
139
|
+
const match = value.match(pattern);
|
|
140
|
+
if (match?.[1]) {
|
|
141
|
+
return match[1];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return '8080';
|
|
145
|
+
};
|
|
146
|
+
export const classifyProjectPreviewCapability = (project, runConfig) => {
|
|
147
|
+
const mode = normalizeProjectPreviewMode(project.preview_capability_mode);
|
|
148
|
+
if (mode === 'force_disabled') {
|
|
149
|
+
return 'native_mobile';
|
|
150
|
+
}
|
|
151
|
+
if (mode === 'force_web') {
|
|
152
|
+
return 'web';
|
|
153
|
+
}
|
|
154
|
+
const packageJsonText = readPackageJsonText(project);
|
|
155
|
+
const serviceSignals = getServiceSignals(runConfig?.services ?? []);
|
|
156
|
+
const signals = `${packageJsonText}\n${serviceSignals}`;
|
|
157
|
+
const hasWebMarkers = STATIC_WEB_MARKERS.some(marker => signals.includes(marker))
|
|
158
|
+
|| /flutter run\s+.*(?:-d\s+chrome|--web-renderer|web-server)/.test(serviceSignals)
|
|
159
|
+
|| /expo start\s+.*--web/.test(serviceSignals);
|
|
160
|
+
const hasHybridMarkers = HYBRID_MARKERS.some(marker => signalsIncludeToken(signals, marker));
|
|
161
|
+
const hasNativeMarkers = NATIVE_MOBILE_MARKERS.some(marker => signals.includes(marker))
|
|
162
|
+
|| (/flutter run/.test(serviceSignals) && !/flutter run\s+.*(?:-d\s+chrome|--web-renderer|web-server)/.test(serviceSignals));
|
|
163
|
+
if ((hasWebMarkers && hasNativeMarkers) || (hasWebMarkers && hasHybridMarkers)) {
|
|
164
|
+
return 'hybrid';
|
|
165
|
+
}
|
|
166
|
+
if (hasWebMarkers) {
|
|
167
|
+
return 'web';
|
|
168
|
+
}
|
|
169
|
+
if (hasNativeMarkers) {
|
|
170
|
+
return 'native_mobile';
|
|
171
|
+
}
|
|
172
|
+
if (hasHybridMarkers) {
|
|
173
|
+
return 'hybrid';
|
|
174
|
+
}
|
|
175
|
+
return 'unknown';
|
|
176
|
+
};
|
|
177
|
+
export const createIdlePreviewStatus = (project, runConfig) => {
|
|
178
|
+
const capability = classifyProjectPreviewCapability(project, runConfig);
|
|
179
|
+
const mode = normalizeProjectPreviewMode(project.preview_capability_mode);
|
|
180
|
+
const serviceName = project.preview_service_name ?? null;
|
|
181
|
+
return {
|
|
182
|
+
state: capability === 'native_mobile' || mode === 'force_disabled' ? 'unsupported' : 'idle',
|
|
183
|
+
capability,
|
|
184
|
+
service_name: serviceName,
|
|
185
|
+
proxy_url: null,
|
|
186
|
+
detected_url: null,
|
|
187
|
+
detected_origin: null,
|
|
188
|
+
detected_path: null,
|
|
189
|
+
message: getCapabilityMessage(capability, mode, serviceName),
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
export const createRunPreviewStatus = (project, runConfig) => {
|
|
193
|
+
const baseStatus = createIdlePreviewStatus(project, runConfig);
|
|
194
|
+
if (baseStatus.state === 'unsupported' || !baseStatus.service_name) {
|
|
195
|
+
return baseStatus;
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
...baseStatus,
|
|
199
|
+
state: 'detecting',
|
|
200
|
+
};
|
|
201
|
+
};
|
|
202
|
+
const normalizeDetectedTarget = (value) => {
|
|
203
|
+
if (!isLoopbackPreviewUrl(value) || !isEmbeddablePreviewPath(value)) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const url = new URL(normalizeLoopbackUrl(value));
|
|
208
|
+
return {
|
|
209
|
+
url: url.toString(),
|
|
210
|
+
origin: url.origin,
|
|
211
|
+
path: url.pathname || '/',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const getPreviewPathOverride = (previewPath) => {
|
|
219
|
+
if (typeof previewPath !== 'string') {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
const trimmed = previewPath.trim();
|
|
223
|
+
if (!trimmed) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
227
|
+
};
|
|
228
|
+
const applyPreviewPathOverride = (target, previewPath) => {
|
|
229
|
+
const overridePath = getPreviewPathOverride(previewPath);
|
|
230
|
+
if (!overridePath) {
|
|
231
|
+
return target.url;
|
|
232
|
+
}
|
|
233
|
+
return new URL(overridePath, target.origin).toString();
|
|
234
|
+
};
|
|
235
|
+
const getPreviewProbeUrls = (target, previewPath) => {
|
|
236
|
+
const overrideUrl = applyPreviewPathOverride(target, previewPath);
|
|
237
|
+
if (overrideUrl === target.url) {
|
|
238
|
+
return [target.url];
|
|
239
|
+
}
|
|
240
|
+
return [overrideUrl, target.url];
|
|
241
|
+
};
|
|
242
|
+
export const resolveReachablePreviewTarget = async (target, previewPath) => {
|
|
243
|
+
const probeUrls = getPreviewProbeUrls(target, previewPath);
|
|
244
|
+
for (let attempt = 0; attempt <= PREVIEW_PROBE_RETRY_ATTEMPTS; attempt += 1) {
|
|
245
|
+
for (const probeUrl of probeUrls) {
|
|
246
|
+
const controller = new AbortController();
|
|
247
|
+
const timeout = setTimeout(() => {
|
|
248
|
+
controller.abort();
|
|
249
|
+
}, PREVIEW_PROBE_TIMEOUT_MS);
|
|
250
|
+
try {
|
|
251
|
+
const response = await fetch(probeUrl, {
|
|
252
|
+
method: 'GET',
|
|
253
|
+
redirect: 'follow',
|
|
254
|
+
signal: controller.signal,
|
|
255
|
+
});
|
|
256
|
+
const contentType = response.headers.get('content-type')?.toLowerCase() ?? '';
|
|
257
|
+
if (!response.ok) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (contentType !== '' && !contentType.includes('text/html') && !contentType.includes('application/xhtml+xml')) {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
return normalizeDetectedTarget(probeUrl);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
clearTimeout(timeout);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (attempt === PREVIEW_PROBE_RETRY_ATTEMPTS) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
await wait(PREVIEW_PROBE_RETRY_DELAY_MS);
|
|
276
|
+
}
|
|
277
|
+
return null;
|
|
278
|
+
};
|
|
279
|
+
const collectDetectedTargets = (logChunk) => {
|
|
280
|
+
const matches = [];
|
|
281
|
+
for (const match of logChunk.matchAll(HTTP_URL_PATTERN)) {
|
|
282
|
+
const normalized = normalizeDetectedTarget(match[0]);
|
|
283
|
+
if (normalized) {
|
|
284
|
+
matches.push(normalized);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
for (const match of logChunk.matchAll(LOOPBACK_HOST_PORT_PATTERN)) {
|
|
288
|
+
const port = match[1];
|
|
289
|
+
const path = match[2] && match[2].startsWith('/') ? match[2] : '/';
|
|
290
|
+
const normalized = normalizeDetectedTarget(`http://localhost:${port}${path}`);
|
|
291
|
+
if (normalized) {
|
|
292
|
+
matches.push(normalized);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
for (const match of logChunk.matchAll(LISTENING_PORT_PATTERN)) {
|
|
296
|
+
const normalized = normalizeDetectedTarget(`http://localhost:${match[1]}/`);
|
|
297
|
+
if (normalized) {
|
|
298
|
+
matches.push(normalized);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return matches;
|
|
302
|
+
};
|
|
303
|
+
export const detectPreviewTargets = (logChunk, capability) => {
|
|
304
|
+
if (capability === 'native_mobile') {
|
|
305
|
+
return [];
|
|
306
|
+
}
|
|
307
|
+
const matches = collectDetectedTargets(logChunk);
|
|
308
|
+
if (matches.length === 0) {
|
|
309
|
+
return [];
|
|
310
|
+
}
|
|
311
|
+
const seen = new Set();
|
|
312
|
+
return matches.filter(match => {
|
|
313
|
+
if (seen.has(match.url)) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
seen.add(match.url);
|
|
317
|
+
return true;
|
|
318
|
+
});
|
|
319
|
+
};
|
|
320
|
+
export const inferPreviewTargetsFromLogChunk = (logChunk, project, service, capability) => {
|
|
321
|
+
if (capability === 'native_mobile' || !WEBPACK_READY_PATTERN.test(logChunk)) {
|
|
322
|
+
return [];
|
|
323
|
+
}
|
|
324
|
+
const packageJson = readPackageJson(project);
|
|
325
|
+
const scriptCommand = resolveServiceScriptCommand(service.cmd, packageJson);
|
|
326
|
+
const serviceSignals = `${service.name ?? ''}\n${service.cmd}\n${scriptCommand ?? ''}`.toLowerCase();
|
|
327
|
+
const usesWebpackDevServer = WEBPACK_DEV_SERVER_MARKERS.some(marker => serviceSignals.includes(marker));
|
|
328
|
+
if (!usesWebpackDevServer) {
|
|
329
|
+
return [];
|
|
330
|
+
}
|
|
331
|
+
const inferredPort = inferWebpackDevServerPort(`${service.cmd}\n${scriptCommand ?? ''}`);
|
|
332
|
+
const inferredTarget = normalizeDetectedTarget(`http://localhost:${inferredPort}/`);
|
|
333
|
+
return inferredTarget ? [inferredTarget] : [];
|
|
334
|
+
};
|
|
335
|
+
export const detectPreviewTarget = (logChunk, capability) => {
|
|
336
|
+
const matches = detectPreviewTargets(logChunk, capability);
|
|
337
|
+
if (matches.length === 0) {
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
return matches[matches.length - 1] ?? null;
|
|
341
|
+
};
|
|
342
|
+
export const applyDetectedPreviewTarget = (status, target) => {
|
|
343
|
+
return {
|
|
344
|
+
...status,
|
|
345
|
+
state: 'ready',
|
|
346
|
+
proxy_url: null,
|
|
347
|
+
detected_url: target.url,
|
|
348
|
+
detected_origin: target.origin,
|
|
349
|
+
detected_path: target.path,
|
|
350
|
+
message: null,
|
|
351
|
+
};
|
|
352
|
+
};
|
|
353
|
+
export const buildPreviewProxyUrl = (proxyOrigin, detectedUrl) => {
|
|
354
|
+
const proxyUrl = new URL(proxyOrigin);
|
|
355
|
+
const targetUrl = new URL(detectedUrl);
|
|
356
|
+
proxyUrl.pathname = targetUrl.pathname || '/';
|
|
357
|
+
proxyUrl.search = targetUrl.search;
|
|
358
|
+
proxyUrl.hash = targetUrl.hash;
|
|
359
|
+
return proxyUrl.toString();
|
|
360
|
+
};
|
|
361
|
+
export const isPreviewService = (service, previewStatus) => {
|
|
362
|
+
if (previewStatus.state === 'unsupported' || !previewStatus.service_name) {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
return service.name === previewStatus.service_name;
|
|
366
|
+
};
|
|
367
|
+
export const buildPreviewProxyTargetUrl = (detectedUrl, requestPath, search) => {
|
|
368
|
+
const target = new URL(detectedUrl);
|
|
369
|
+
const normalizedRequestPath = requestPath === '' ? '/' : requestPath;
|
|
370
|
+
const nextPath = normalizedRequestPath === '/'
|
|
371
|
+
? target.pathname || '/'
|
|
372
|
+
: normalizedRequestPath;
|
|
373
|
+
target.pathname = nextPath;
|
|
374
|
+
target.search = search;
|
|
375
|
+
return target;
|
|
376
|
+
};
|
|
377
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../server/lib/preview.ts"],"names":[],"mappings":"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"}
|