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.
Files changed (39) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +4 -0
  3. package/dist/api.js +1156 -349
  4. package/dist/commit.txt +1 -1
  5. package/dist/index.js +126 -48
  6. package/dist/scripts/lib/test-fixtures.mjs +1 -1
  7. package/dist/ui/assets/{index-BCfnrf9x.js → index-B0WvXt0J.js} +1 -1
  8. package/dist/ui/assets/index-B1LpYbIL.css +1 -0
  9. package/dist/ui/assets/{index-BxqUzAmT.js → index-B9j1Z7xH.js} +1 -1
  10. package/dist/ui/assets/index-BGSXwEof.js +1103 -0
  11. package/dist/ui/assets/{index-CyH0t-7C.js → index-BMvqb2S0.js} +1 -1
  12. package/dist/ui/assets/{index-TlK-Z_4f.js → index-BaTjy202.js} +1 -1
  13. package/dist/ui/assets/{index-B6f0IvI8.js → index-Bf-sg7t1.js} +1 -1
  14. package/dist/ui/assets/{index-BHpxmbNr.js → index-BjP484xW.js} +1 -1
  15. package/dist/ui/assets/{index-R05wI85b.js → index-CHaxebS-.js} +1 -1
  16. package/dist/ui/assets/{index-iiYTe0B1.js → index-CM8fvy_3.js} +1 -1
  17. package/dist/ui/assets/{index-CUwqevMv.js → index-CgPm7uHs.js} +1 -1
  18. package/dist/ui/assets/{index-BcFJG3pn.js → index-CgR7ieU_.js} +1 -1
  19. package/dist/ui/assets/{index-Bepe4gRM.js → index-CmRfv-pq.js} +1 -1
  20. package/dist/ui/assets/{index-DdwbXAJq.js → index-DJPvnRwe.js} +1 -1
  21. package/dist/ui/assets/{index-kh7xKB6N.js → index-DVUZnv4I.js} +1 -1
  22. package/dist/ui/assets/{index-BRbvQP4r.js → index-DWOryZN1.js} +1 -1
  23. package/dist/ui/assets/{index-BkA7So3L.js → index-DhCgwoTQ.js} +1 -1
  24. package/dist/ui/assets/{index-GYxfKBT1.js → index-Dl7WFkDL.js} +1 -1
  25. package/dist/ui/assets/{index-KwWhSMUi.js → index-DxYZT2Q7.js} +1 -1
  26. package/dist/ui/assets/{index-ClTXL7da.js → index-JyRtNGro.js} +1 -1
  27. package/dist/ui/assets/{index-Dc4Up0Ir.js → index-RO6e7ud2.js} +1 -1
  28. package/dist/ui/assets/{index-DQJMJ04n.js → index-dZUCDdRl.js} +1 -1
  29. package/dist/ui/assets/{index-C86nRoc4.js → index-h0c542Uj.js} +1 -1
  30. package/dist/ui/assets/{index-DfsBdEGr.js → index-qhLd2sra.js} +1 -1
  31. package/dist/ui/assets/vibeman-logo-on-dark-GVk_1Rmr.png +0 -0
  32. package/dist/ui/assets/vibeman-logo-on-light-4VCHa-wB.png +0 -0
  33. package/dist/ui/index.html +5 -2
  34. package/dist/ui/vibeman-apple-touch-icon.png +0 -0
  35. package/dist/ui/vibeman-favicon-16.png +0 -0
  36. package/dist/ui/vibeman-favicon-32.png +0 -0
  37. package/package.json +5 -2
  38. package/dist/ui/assets/index-B65NvzF3.js +0 -1101
  39. package/dist/ui/assets/index-BlYNw2Nz.css +0 -1
package/dist/commit.txt CHANGED
@@ -1 +1 @@
1
- 0842e29
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
- const url = new URL(`http://localhost:${resolvedPort}/`);
2147
- if (options.open) {
2148
- const startupSpinner = createStartupSpinner(url.toString(), resolvedPort);
2149
- const ready = await waitForApiReady(resolvedPort);
2150
- startupSpinner.stop(ready ? "ready" : "timeout");
2151
- if (!ready) {
2152
- console.warn("API not ready yet; opening the browser anyway.");
2153
- }
2154
- await openBrowser(url.toString());
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(url, port) {
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.3-codex';
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-B65NvzF3.js";import{L as n}from"./index-BkA7So3L.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};
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};