typebulb 0.14.6 → 0.14.7
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/agents/claude/styles.css +19 -23
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -157,7 +157,8 @@ body {
|
|
|
157
157
|
.picker, .servers-pop {
|
|
158
158
|
--menu-h: 428px; /* one height for both statusbar menus — they sit side by side, so a
|
|
159
159
|
mismatched cap reads as a glitch; .picker grows to it, .servers-pop
|
|
160
|
-
|
|
160
|
+
too (the drilled-in console is the one fixed-height exception, see
|
|
161
|
+
.log-mode). Sized to show exactly 12 rows
|
|
161
162
|
(12 × --menu-row-h + 11 gaps + filter + padding) — recognition fades
|
|
162
163
|
past ~12 and search owns the tail. Plain px: desktop-only surface,
|
|
163
164
|
every desktop window fits it. 428, not 427: at 427 the two menus land
|
|
@@ -166,6 +167,16 @@ body {
|
|
|
166
167
|
--menu-row-h: 29px; /* one row height for both menus' lists — rows must match pitch exactly
|
|
167
168
|
or the side-by-side menus read as two designs. Whole px, eyeball-tuned;
|
|
168
169
|
the row paddings are kept below it so this floor is what governs. */
|
|
170
|
+
/* ONE geometry contract for both menus — sizing policy, padding, stacking. Stating it twice is
|
|
171
|
+
how every sibling discrepancy of June '26 happened (row pitch, gaps, fixed-vs-grow). max-height,
|
|
172
|
+
not height: a menu hugs its content and caps at the 12 rows above — a fixed height left a
|
|
173
|
+
1-bulb project with a row floating atop a 400px void. Per-menu rules keep only width. */
|
|
174
|
+
max-height: var(--menu-h);
|
|
175
|
+
overflow: hidden;
|
|
176
|
+
padding: .35rem;
|
|
177
|
+
display: flex;
|
|
178
|
+
flex-direction: column;
|
|
179
|
+
gap: .15rem;
|
|
169
180
|
position: absolute;
|
|
170
181
|
bottom: calc(100% + .35rem);
|
|
171
182
|
right: 0;
|
|
@@ -220,15 +231,7 @@ body {
|
|
|
220
231
|
|
|
221
232
|
/* Session list — shares the popover chrome (.picker above); these are
|
|
222
233
|
just its own dimensions. */
|
|
223
|
-
.picker {
|
|
224
|
-
width: min(440px, calc(100vw - 2rem));
|
|
225
|
-
max-height: var(--menu-h);
|
|
226
|
-
overflow: hidden;
|
|
227
|
-
padding: .35rem;
|
|
228
|
-
display: flex;
|
|
229
|
-
flex-direction: column;
|
|
230
|
-
gap: .15rem;
|
|
231
|
-
}
|
|
234
|
+
.picker { width: min(440px, calc(100vw - 2rem)); }
|
|
232
235
|
/* The filter (.bulb-filter-control) pins at the bottom — the popover's anchored edge, so it never
|
|
233
236
|
jumps as the filtered list changes height; the row list scrolls inside the capped box, resting at
|
|
234
237
|
its end (newest-at-bottom) — same shape as the launcher's .servers-pop / .bulb-list. */
|
|
@@ -298,18 +301,8 @@ body {
|
|
|
298
301
|
and the metadata/controls form a right-aligned cluster of fixed-width columns (logs · trust ·
|
|
299
302
|
time/port) that line up row-to-row — right-anchored, so the rightmost (time/port) always aligns and
|
|
300
303
|
the rest stack inward (logs and time/port share a width; trust is wider, to fit "restricted"). The
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
scrolls inside (see .bulb-list). */
|
|
304
|
-
.servers-pop {
|
|
305
|
-
width: min(560px, calc(100vw - 2rem));
|
|
306
|
-
height: var(--menu-h);
|
|
307
|
-
overflow: hidden;
|
|
308
|
-
padding: .35rem;
|
|
309
|
-
display: flex;
|
|
310
|
-
flex-direction: column;
|
|
311
|
-
gap: .15rem;
|
|
312
|
-
}
|
|
304
|
+
filter pins at the bottom and the list scrolls inside (see .bulb-list). */
|
|
305
|
+
.servers-pop { width: min(560px, calc(100vw - 2rem)); }
|
|
313
306
|
.server-row {
|
|
314
307
|
/* Subgrid: all rows share ONE set of column tracks (defined on .bulb-list). A per-row grid sizes
|
|
315
308
|
its columns independently — which is exactly what broke alignment (a stopped row with no
|
|
@@ -457,7 +450,10 @@ a.server-port:hover { text-decoration: underline; }
|
|
|
457
450
|
body fills the popover's height. overflow:hidden lets the rounded popover border clip the
|
|
458
451
|
square head/body; the body scrolls internally. */
|
|
459
452
|
.servers-pop.log-mode {
|
|
460
|
-
padding: 0;
|
|
453
|
+
padding: 0;
|
|
454
|
+
/* The one fixed-height surface: a console wants its full frame regardless of how little it has
|
|
455
|
+
logged yet — a height that tracked the log would grow line by line. */
|
|
456
|
+
height: var(--menu-h);
|
|
461
457
|
}
|
|
462
458
|
.servers-pop.log-mode:focus { outline: none; }
|
|
463
459
|
.bulb-log-head {
|
package/dist/index.js
CHANGED
|
@@ -1085,6 +1085,6 @@ ${Iw}
|
|
|
1085
1085
|
Shutting down...`),p.close(),y?.(),t(),await Pr(process.pid),process.exit(0)};process.on("SIGINT",k),process.on("SIGTERM",k)}import*as qd from"path";import{EventEmitter as _v}from"events";async function Fd(r,e,t,n,s){let i=fe(t),o=!1,a=async()=>{let{bulb:c,config:l}=await se(r);o||(Le(i,r,c.server),o=!0),await Sr(c.server,s,n,l.dependencies)};if(console.log(`Running ${qd.basename(r)}...`),await a(),e){console.log(`Watching for changes...
|
|
1086
1086
|
`);let c=new _v;c.on("reload",async()=>{try{console.log("Re-running..."),await a()}catch(l){console.error("Error:",l)}}),Ss({bulbPath:r,emitter:c})}}import{Console as Lv}from"node:console";ye();xr();async function jd(r,e,t,n,s){Fv();try{let p=L(r),g=(await B()).find(h=>L(h.file)===p);g&&os(g.pid,ue(g.pid).offset)}catch{}let i=fe(t),{bulb:o,config:a}=await se(r);o.server||Os("This bulb has no **server.ts** block; nothing to call."),Le(i,r,o.server);let c;try{c=await Sr(o.server,s,n,a.dependencies)}catch(p){Os(p instanceof Error?p.message:String(p))}let l=bs(c,e.fn);if(!l){let p=[...Object.keys(c).filter(g=>typeof c[g]=="function"),...Object.keys(sa)];Os(`Function '${e.fn}' not found. Available: ${p.length?p.join(", "):"(none)"}.`)}let f=await $v(e),u;try{u=await l(...f)}catch(p){Os(p instanceof Error?p.stack??p.message:String(p))}let d=Bv(u);d!==void 0&&await jv(d+`
|
|
1087
1087
|
`),process.exit(0)}async function $v(r){if(r.hasArgsFlag){let e=r.argsJson??"";return e==="-"&&(e=await Uv()),Dv(e)}return Mv(r.positional)}function Mv(r){return r.map(e=>{try{return JSON.parse(e)}catch{return e}})}function Dv(r){let e;try{e=JSON.parse(r)}catch(t){throw new Error(`--args must be a JSON array: ${t instanceof Error?t.message:String(t)}`)}if(!Array.isArray(e))throw new Error(`--args must be a JSON array, got ${e===null?"null":typeof e}`);return e}function Bv(r){if(r!==void 0)return JSON.stringify(r,qv,2)}function qv(r,e){return typeof e=="bigint"?e.toString():e}function Os(r){process.stderr.write(r+`
|
|
1088
|
-
`),process.exit(1)}function Fv(){let r=new Lv(process.stderr,process.stderr);console.log=r.log.bind(r),console.info=r.info.bind(r),console.debug=r.debug.bind(r),console.dir=r.dir.bind(r)}function jv(r){return new Promise((e,t)=>{process.stdout.write(r,n=>n?t(n):e())})}async function Uv(){let r=[];for await(let e of process.stdin)r.push(e);return Buffer.concat(r).toString("utf-8")}var Ud="0.14.
|
|
1088
|
+
`),process.exit(1)}function Fv(){let r=new Lv(process.stderr,process.stderr);console.log=r.log.bind(r),console.info=r.info.bind(r),console.debug=r.debug.bind(r),console.dir=r.dir.bind(r)}function jv(r){return new Promise((e,t)=>{process.stdout.write(r,n=>n?t(n):e())})}async function Uv(){let r=[];for await(let e of process.stdin)r.push(e);return Buffer.concat(r).toString("utf-8")}var Ud="0.14.7";function Jd(r,e){r||(console.error(`This bulb runs server-side Node code (server.ts), which --trust must authorize:
|
|
1089
1089
|
${e}`),process.exit(1))}async function Jv(){let r=Pa(process.argv.slice(2));if(r.version&&(console.log(`typebulb ${Ud}`),process.exit(0)),r.help&&(Oa(),process.exit(0)),r.subcommand==="logs"){await Wf(r.file||void 0,{follow:r.follow,lines:r.lines});return}if(r.subcommand==="wait"){await Vf(r.file||void 0,{match:r.match,timeoutSec:r.timeoutSec??1800});return}if(r.subcommand==="stop"){r.stopScope?await Hf(r.stopScope):await Yf(r.file||void 0);return}if(r.subcommand==="skill"){await Uf(Ud);return}if(r.subcommand==="models"){await Ff(r.mode);return}if(r.subcommand==="agent"){if(!r.agentTarget){await Mf();return}df(r.agentTarget)||(console.error(`Unknown agent '${r.agentTarget}'. Known: ${Er().join(", ")}.`),process.exit(1));let l=await Ho(process.cwd(),r.agentTarget);if(l){console.log(`Mirror '${r.agentTarget}' is already running for this project:
|
|
1090
1090
|
${l.url}`),r.open&&await vt(l.url);return}await Bd(r);return}if(r.subcommand==="trust"||r.subcommand==="untrust"){await xf(r.file||void 0,r.subcommand==="trust");return}let e;if(!r.file||r.file==="."){let l=await cf(process.cwd());l||(console.error("No .bulb.md file found in current directory"),process.exit(1)),e=l}else e=we.resolve(r.file);await Kd.access(e).then(()=>!0,()=>!1)||(Er().includes(r.file)&&(console.error(`To open the ${r.file} agent mirror, run: npx typebulb agent:${r.file}`),process.exit(1)),console.error(`File not found: ${e}`),process.exit(1)),e.endsWith(".bulb.md")||(console.error("File must have .bulb.md extension"),process.exit(1));let n=r.file&&r.file!=="."?r.file:we.relative(process.cwd(),e)||we.basename(e),s=`npx typebulb --trust ${n.includes(" ")?`"${n}"`:n}`;if(r.subcommand==="predict"){await Sf(e,s);return}let i=!r.noTrust&&We(e);i&&!r.trust&&console.log("trust: granted from memory (run `typebulb untrust` to revoke)"),r.trust=r.noTrust?!1:r.trust||i;let o;try{o=await se(e)}catch{}let a;if(r.local){o&&!(r.local.name in(o.config.dependencies??{}))&&(console.error(`--replace: '${r.local.name}' is not a dependency in this bulb's config.json; nothing to replace.`),process.exit(1)),o&&r.subcommand!=="call"&&(!o.bulb.code||r.server)&&console.warn("warning: --replace has no effect in server mode (the override is client-only).");try{a=await Aa(r.local)}catch(l){console.error(l instanceof Error?l.message:String(l)),process.exit(1)}console.log(`replace: ${a.name} \u2192 ${we.relative(process.cwd(),a.dir)||"."}`)}if(r.subcommand==="check"){await vf(e,a);return}let c=we.dirname(e);if(r.subcommand==="call"){Jd(r.trust,s),await jd(e,{fn:r.fn,positional:r.callArgs,argsJson:r.argsJson,hasArgsFlag:r.hasArgsFlag},r.mode,a,c);return}if(o&&o.bulb.server&&(!o.bulb.code||r.server)){Jd(r.trust,s),await Fd(e,r.watch,r.mode,a,c);return}await sd(e,r,s,a,c)}Jv().catch(r=>{console.error("Error:",r.message),process.exit(1)});
|
package/package.json
CHANGED