vibeman 0.0.14 → 0.0.17
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/LICENSE +201 -0
- package/NOTICE +4 -0
- package/dist/api.js +1156 -349
- package/dist/commit.txt +1 -1
- package/dist/index.js +126 -48
- package/dist/scripts/lib/test-fixtures.mjs +1 -1
- package/dist/ui/assets/{index-BCfnrf9x.js → index-B0WvXt0J.js} +1 -1
- package/dist/ui/assets/index-B1LpYbIL.css +1 -0
- package/dist/ui/assets/{index-BxqUzAmT.js → index-B9j1Z7xH.js} +1 -1
- package/dist/ui/assets/index-BGSXwEof.js +1103 -0
- package/dist/ui/assets/{index-CyH0t-7C.js → index-BMvqb2S0.js} +1 -1
- package/dist/ui/assets/{index-TlK-Z_4f.js → index-BaTjy202.js} +1 -1
- package/dist/ui/assets/{index-B6f0IvI8.js → index-Bf-sg7t1.js} +1 -1
- package/dist/ui/assets/{index-BHpxmbNr.js → index-BjP484xW.js} +1 -1
- package/dist/ui/assets/{index-R05wI85b.js → index-CHaxebS-.js} +1 -1
- package/dist/ui/assets/{index-iiYTe0B1.js → index-CM8fvy_3.js} +1 -1
- package/dist/ui/assets/{index-CUwqevMv.js → index-CgPm7uHs.js} +1 -1
- package/dist/ui/assets/{index-BcFJG3pn.js → index-CgR7ieU_.js} +1 -1
- package/dist/ui/assets/{index-Bepe4gRM.js → index-CmRfv-pq.js} +1 -1
- package/dist/ui/assets/{index-DdwbXAJq.js → index-DJPvnRwe.js} +1 -1
- package/dist/ui/assets/{index-kh7xKB6N.js → index-DVUZnv4I.js} +1 -1
- package/dist/ui/assets/{index-BRbvQP4r.js → index-DWOryZN1.js} +1 -1
- package/dist/ui/assets/{index-BkA7So3L.js → index-DhCgwoTQ.js} +1 -1
- package/dist/ui/assets/{index-GYxfKBT1.js → index-Dl7WFkDL.js} +1 -1
- package/dist/ui/assets/{index-KwWhSMUi.js → index-DxYZT2Q7.js} +1 -1
- package/dist/ui/assets/{index-ClTXL7da.js → index-JyRtNGro.js} +1 -1
- package/dist/ui/assets/{index-Dc4Up0Ir.js → index-RO6e7ud2.js} +1 -1
- package/dist/ui/assets/{index-DQJMJ04n.js → index-dZUCDdRl.js} +1 -1
- package/dist/ui/assets/{index-C86nRoc4.js → index-h0c542Uj.js} +1 -1
- package/dist/ui/assets/{index-DfsBdEGr.js → index-qhLd2sra.js} +1 -1
- package/dist/ui/assets/vibeman-logo-on-dark-GVk_1Rmr.png +0 -0
- package/dist/ui/assets/vibeman-logo-on-light-4VCHa-wB.png +0 -0
- package/dist/ui/index.html +5 -2
- package/dist/ui/vibeman-apple-touch-icon.png +0 -0
- package/dist/ui/vibeman-favicon-16.png +0 -0
- package/dist/ui/vibeman-favicon-32.png +0 -0
- package/package.json +5 -2
- package/dist/ui/assets/index-B65NvzF3.js +0 -1101
- package/dist/ui/assets/index-BlYNw2Nz.css +0 -1
package/dist/commit.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
c6c1e8d
|
package/dist/index.js
CHANGED
|
@@ -1803,7 +1803,6 @@ var require_semver2 = __commonJS((exports, module) => {
|
|
|
1803
1803
|
// src/index.ts
|
|
1804
1804
|
import { spawn } from "node:child_process";
|
|
1805
1805
|
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
|
|
1806
|
-
import { request } from "node:http";
|
|
1807
1806
|
import { basename, dirname as dirname2, resolve as resolve2 } from "node:path";
|
|
1808
1807
|
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
1809
1808
|
|
|
@@ -2060,6 +2059,106 @@ var DIST_LAYOUT = {
|
|
|
2060
2059
|
fixtureLibraryScript: "scripts/lib/test-fixtures.mjs"
|
|
2061
2060
|
};
|
|
2062
2061
|
|
|
2062
|
+
// src/startup-discovery.ts
|
|
2063
|
+
import { request } from "node:http";
|
|
2064
|
+
import { resolve as resolvePath } from "node:path";
|
|
2065
|
+
async function waitForMatchingApiReady(options) {
|
|
2066
|
+
const { startPort, expectedRoot, timeoutMs = 30000, intervalMs = 250, scanWindow = 20 } = options;
|
|
2067
|
+
const startedAt = Date.now();
|
|
2068
|
+
const normalizedExpectedRoot = resolvePath(expectedRoot);
|
|
2069
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
2070
|
+
const match = await findMatchingApiPort({
|
|
2071
|
+
startPort,
|
|
2072
|
+
expectedRoot: normalizedExpectedRoot,
|
|
2073
|
+
scanWindow
|
|
2074
|
+
});
|
|
2075
|
+
if (match) {
|
|
2076
|
+
return match;
|
|
2077
|
+
}
|
|
2078
|
+
await delay(intervalMs);
|
|
2079
|
+
}
|
|
2080
|
+
return null;
|
|
2081
|
+
}
|
|
2082
|
+
async function findMatchingApiPort(options) {
|
|
2083
|
+
const { startPort, expectedRoot, scanWindow = 20 } = options;
|
|
2084
|
+
const maxPort = Math.min(65535, startPort + Math.max(0, scanWindow));
|
|
2085
|
+
for (let port = startPort;port <= maxPort; port += 1) {
|
|
2086
|
+
const root = await readApiHealthRoot(port);
|
|
2087
|
+
if (!root) {
|
|
2088
|
+
continue;
|
|
2089
|
+
}
|
|
2090
|
+
if (resolvePath(root) === expectedRoot) {
|
|
2091
|
+
return { port };
|
|
2092
|
+
}
|
|
2093
|
+
}
|
|
2094
|
+
return null;
|
|
2095
|
+
}
|
|
2096
|
+
async function readApiHealthRoot(port) {
|
|
2097
|
+
const liveResponse = await requestJson(port, "/api/health/live");
|
|
2098
|
+
if (liveResponse?.statusCode === 200 && liveResponse.body) {
|
|
2099
|
+
const liveRoot = resolveHealthRoot(liveResponse.body);
|
|
2100
|
+
if (liveRoot) {
|
|
2101
|
+
return liveRoot;
|
|
2102
|
+
}
|
|
2103
|
+
}
|
|
2104
|
+
const response = await requestJson(port, "/api/health");
|
|
2105
|
+
if (!response || response.statusCode !== 200 || !response.body) {
|
|
2106
|
+
return null;
|
|
2107
|
+
}
|
|
2108
|
+
return resolveHealthRoot(response.body);
|
|
2109
|
+
}
|
|
2110
|
+
function resolveHealthRoot(payload) {
|
|
2111
|
+
if (typeof payload.root === "string" && payload.root.trim().length > 0) {
|
|
2112
|
+
return payload.root;
|
|
2113
|
+
}
|
|
2114
|
+
if (payload.data && typeof payload.data.root === "string" && payload.data.root.trim().length > 0) {
|
|
2115
|
+
return payload.data.root;
|
|
2116
|
+
}
|
|
2117
|
+
return null;
|
|
2118
|
+
}
|
|
2119
|
+
function requestJson(port, path) {
|
|
2120
|
+
return new Promise((resolvePromise) => {
|
|
2121
|
+
const req = request({
|
|
2122
|
+
hostname: "127.0.0.1",
|
|
2123
|
+
port,
|
|
2124
|
+
path,
|
|
2125
|
+
method: "GET",
|
|
2126
|
+
timeout: 1000
|
|
2127
|
+
}, (res) => {
|
|
2128
|
+
let raw = "";
|
|
2129
|
+
res.setEncoding("utf8");
|
|
2130
|
+
res.on("data", (chunk) => {
|
|
2131
|
+
raw += chunk;
|
|
2132
|
+
});
|
|
2133
|
+
res.on("end", () => {
|
|
2134
|
+
if (!raw) {
|
|
2135
|
+
resolvePromise({ statusCode: res.statusCode, body: null });
|
|
2136
|
+
return;
|
|
2137
|
+
}
|
|
2138
|
+
try {
|
|
2139
|
+
resolvePromise({
|
|
2140
|
+
statusCode: res.statusCode,
|
|
2141
|
+
body: JSON.parse(raw)
|
|
2142
|
+
});
|
|
2143
|
+
} catch {
|
|
2144
|
+
resolvePromise(null);
|
|
2145
|
+
}
|
|
2146
|
+
});
|
|
2147
|
+
});
|
|
2148
|
+
req.on("timeout", () => {
|
|
2149
|
+
req.destroy();
|
|
2150
|
+
resolvePromise(null);
|
|
2151
|
+
});
|
|
2152
|
+
req.on("error", () => resolvePromise(null));
|
|
2153
|
+
req.end();
|
|
2154
|
+
});
|
|
2155
|
+
}
|
|
2156
|
+
function delay(ms) {
|
|
2157
|
+
return new Promise((resolvePromise) => {
|
|
2158
|
+
setTimeout(resolvePromise, ms);
|
|
2159
|
+
});
|
|
2160
|
+
}
|
|
2161
|
+
|
|
2063
2162
|
// src/index.ts
|
|
2064
2163
|
enforceNodeRuntimeCompatibility(import.meta.url);
|
|
2065
2164
|
var args = process.argv.slice(2);
|
|
@@ -2143,16 +2242,30 @@ async function startApps(options) {
|
|
|
2143
2242
|
},
|
|
2144
2243
|
stdio: "inherit"
|
|
2145
2244
|
});
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2245
|
+
let readyPort = resolvedPort;
|
|
2246
|
+
const startupSpinner = options.open ? createStartupSpinner(resolvedPort) : null;
|
|
2247
|
+
const ready = await waitForMatchingApiReady({
|
|
2248
|
+
startPort: resolvedPort,
|
|
2249
|
+
expectedRoot: targetRoot
|
|
2250
|
+
});
|
|
2251
|
+
if (ready) {
|
|
2252
|
+
readyPort = ready.port;
|
|
2253
|
+
if (readyPort !== resolvedPort) {
|
|
2254
|
+
console.warn(`[WARN] [startup] Vibeman resolved to port ${readyPort} after a late startup conflict on ${resolvedPort}.`);
|
|
2255
|
+
}
|
|
2256
|
+
if (startupSpinner) {
|
|
2257
|
+
startupSpinner.stop("ready", `http://localhost:${readyPort}/`);
|
|
2258
|
+
}
|
|
2259
|
+
if (options.open) {
|
|
2260
|
+
await openBrowser(`http://localhost:${readyPort}/`);
|
|
2261
|
+
}
|
|
2262
|
+
} else if (startupSpinner) {
|
|
2263
|
+
startupSpinner.stop("timeout", `http://localhost:${resolvedPort}/`);
|
|
2264
|
+
console.warn(`Unable to confirm a Vibeman API for ${targetRoot} on ports ${resolvedPort}-${Math.min(65535, resolvedPort + 20)}. Skipping automatic browser open.`);
|
|
2265
|
+
} else {
|
|
2266
|
+
console.warn(`Unable to confirm a Vibeman API for ${targetRoot} on ports ${resolvedPort}-${Math.min(65535, resolvedPort + 20)}. Reporting the requested startup port until the API becomes observable.`);
|
|
2155
2267
|
}
|
|
2268
|
+
const url = new URL(`http://localhost:${readyPort}/`);
|
|
2156
2269
|
const readyLine = process.stdout.isTTY ? `
|
|
2157
2270
|
\x1B[32mReady\x1B[0m \x1B[96m${url.toString()}\x1B[0m (Ctrl+C to stop)` : `
|
|
2158
2271
|
Ready ${url.toString()} (Ctrl+C to stop)`;
|
|
@@ -2289,11 +2402,11 @@ function waitForExit(child) {
|
|
|
2289
2402
|
child.once("exit", (code) => resolvePromise(code));
|
|
2290
2403
|
});
|
|
2291
2404
|
}
|
|
2292
|
-
function createStartupSpinner(
|
|
2405
|
+
function createStartupSpinner(port) {
|
|
2293
2406
|
if (!process.stdout.isTTY) {
|
|
2294
2407
|
console.log(`[startup] Loading Vibeman... waiting for API on port ${port}`);
|
|
2295
2408
|
return {
|
|
2296
|
-
stop: (result) => {
|
|
2409
|
+
stop: (result, url) => {
|
|
2297
2410
|
if (result === "ready") {
|
|
2298
2411
|
console.log(`[startup] Vibeman API is ready: ${url}`);
|
|
2299
2412
|
return;
|
|
@@ -2312,7 +2425,7 @@ function createStartupSpinner(url, port) {
|
|
|
2312
2425
|
process.stdout.write(`\r${frames[frameIndex]} Loading Vibeman... waiting for API on port ${port} (${elapsed}s) `);
|
|
2313
2426
|
}, 120);
|
|
2314
2427
|
return {
|
|
2315
|
-
stop: (result) => {
|
|
2428
|
+
stop: (result, url) => {
|
|
2316
2429
|
clearInterval(timer);
|
|
2317
2430
|
const elapsed = ((Date.now() - startMs) / 1000).toFixed(1);
|
|
2318
2431
|
if (result === "ready") {
|
|
@@ -2325,41 +2438,6 @@ function createStartupSpinner(url, port) {
|
|
|
2325
2438
|
}
|
|
2326
2439
|
};
|
|
2327
2440
|
}
|
|
2328
|
-
async function waitForApiReady(port, timeoutMs = 30000, intervalMs = 250) {
|
|
2329
|
-
const startedAt = Date.now();
|
|
2330
|
-
while (Date.now() - startedAt < timeoutMs) {
|
|
2331
|
-
const ok = await checkApiHealth(port);
|
|
2332
|
-
if (ok)
|
|
2333
|
-
return true;
|
|
2334
|
-
await delay(intervalMs);
|
|
2335
|
-
}
|
|
2336
|
-
return false;
|
|
2337
|
-
}
|
|
2338
|
-
function checkApiHealth(port) {
|
|
2339
|
-
return new Promise((resolvePromise) => {
|
|
2340
|
-
const req = request({
|
|
2341
|
-
hostname: "127.0.0.1",
|
|
2342
|
-
port,
|
|
2343
|
-
path: "/api/health",
|
|
2344
|
-
method: "GET",
|
|
2345
|
-
timeout: 2000
|
|
2346
|
-
}, (res) => {
|
|
2347
|
-
res.resume();
|
|
2348
|
-
resolvePromise(res.statusCode === 200);
|
|
2349
|
-
});
|
|
2350
|
-
req.on("timeout", () => {
|
|
2351
|
-
req.destroy();
|
|
2352
|
-
resolvePromise(false);
|
|
2353
|
-
});
|
|
2354
|
-
req.on("error", () => resolvePromise(false));
|
|
2355
|
-
req.end();
|
|
2356
|
-
});
|
|
2357
|
-
}
|
|
2358
|
-
function delay(ms) {
|
|
2359
|
-
return new Promise((resolvePromise) => {
|
|
2360
|
-
setTimeout(resolvePromise, ms);
|
|
2361
|
-
});
|
|
2362
|
-
}
|
|
2363
2441
|
function resolvePackagedDistRoot(moduleDir) {
|
|
2364
2442
|
return moduleDir.endsWith("/dist") || moduleDir.endsWith("\\dist") ? moduleDir : resolve2(moduleDir, "..", "dist");
|
|
2365
2443
|
}
|
|
@@ -62,7 +62,7 @@ priority: medium # low, medium, high
|
|
|
62
62
|
[Auto-generated after completion: what changed + tests run.]
|
|
63
63
|
`;
|
|
64
64
|
|
|
65
|
-
const DEFAULT_CODEX_MODEL = 'gpt-5.
|
|
65
|
+
const DEFAULT_CODEX_MODEL = 'gpt-5.4';
|
|
66
66
|
const LOW_COST_GEMINI_MODEL = 'gemini-3-flash-preview';
|
|
67
67
|
const LOW_COST_CLAUDE_MODEL = 'claude-haiku';
|
|
68
68
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{L as O,a as r,i as b,f as s,s as a,g as t,j as P,t as e}from"./index-
|
|
1
|
+
import{L as O,a as r,i as b,f as s,s as a,g as t,j as P,t as e}from"./index-BGSXwEof.js";import{L as n}from"./index-DhCgwoTQ.js";const S={__proto__:null,anyref:34,dataref:34,eqref:34,externref:34,i31ref:34,funcref:34,i8:34,i16:34,i32:34,i64:34,f32:34,f64:34},i=n.deserialize({version:14,states:"!^Q]QPOOOqQPO'#CbOOQO'#Cd'#CdOOQO'#Cl'#ClOOQO'#Ch'#ChQ]QPOOOOQO,58|,58|OxQPO,58|OOQO-E6f-E6fOOQO1G.h1G.h",stateData:"!P~O_OSPOSQOS~OTPOVROXROYROZROaQO~OSUO~P]OSXO~P]O",goto:"xaPPPPPPbPbPPPhPPPrXROPTVQTOQVPTWTVXSOPTV",nodeNames:"⚠ LineComment BlockComment Module ) ( App Identifier Type Keyword Number String",maxTerm:17,nodeProps:[["isolate",-3,1,2,11,""],["openedBy",4,"("],["closedBy",5,")"],["group",-6,6,7,8,9,10,11,"Expression"]],skippedNodes:[0,1,2],repeatNodeCount:1,tokenData:"0o~R^XY}YZ}]^}pq}rs!Stu#pxy'Uyz(e{|(j}!O(j!Q!R(s!R![*p!]!^.^#T#o.{~!SO_~~!VVOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j<%lO!S~!qOZ~~!tRO;'S!S;'S;=`!};=`O!S~#QWOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j;=`<%l!S<%lO!S~#mP;=`<%l!S~#siqr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~%giV~qr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~'ZPT~!]!^'^~'aTO!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~'sVOy'^yz(Yz!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~(_OQ~~(bP;=`<%l'^~(jOS~~(mQ!Q!R(s!R![*p~(xUY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){#l#m+[~)aRY~!Q![)j!g!h){#X#Y){~)oSY~!Q![)j!g!h){#R#S*j#X#Y){~*OR{|*X}!O*X!Q![*_~*[P!Q![*_~*dQY~!Q![*_#R#S*X~*mP!Q![)j~*uTY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){~+XP!Q![*p~+_R!Q![+h!c!i+h#T#Z+h~+mVY~!O!P,S!Q![+h!c!i+h!r!s-P#R#S+[#T#Z+h#d#e-P~,XTY~!Q![,h!c!i,h!r!s-P#T#Z,h#d#e-P~,mUY~!Q![,h!c!i,h!r!s-P#R#S.Q#T#Z,h#d#e-P~-ST{|-c}!O-c!Q![-o!c!i-o#T#Z-o~-fR!Q![-o!c!i-o#T#Z-o~-tSY~!Q![-o!c!i-o#R#S-c#T#Z-o~.TR!Q![,h!c!i,h#T#Z,h~.aP!]!^.d~.iSP~OY.dZ;'S.d;'S;=`.u<%lO.d~.xP;=`<%l.d~/QiX~qr.{st.{tu.{uv.{vw.{wx.{z{.{{|.{}!O.{!O!P.{!P!Q.{!Q![.{![!].{!^!_.{!_!`.{!`!a.{!a!b.{!b!c.{!c!}.{#Q#R.{#R#S.{#S#T.{#T#o.{#p#q.{#r#s.{",tokenizers:[0],topRules:{Module:[0,3]},specialized:[{term:9,get:o=>S[o]||-1}],tokenPrec:0}),Q=O.define({name:"wast",parser:i.configure({props:[b.add({App:t({closing:")",align:!1})}),s.add({App:P,BlockComment(o){return{from:o.from+2,to:o.to-2}}}),a({Keyword:e.keyword,Type:e.typeName,Number:e.number,String:e.string,Identifier:e.variableName,LineComment:e.lineComment,BlockComment:e.blockComment,"( )":e.paren})]}),languageData:{commentTokens:{line:";;",block:{open:"(;",close:";)"}},closeBrackets:{brackets:["(",'"']}}});function l(){return new r(Q)}export{l as wast,Q as wastLanguage};
|