bitwrench 2.0.31 → 2.1.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 +210 -125
- package/dist/bitwrench-bccl.cjs.js +349 -188
- package/dist/bitwrench-bccl.cjs.min.js +2 -39
- package/dist/bitwrench-bccl.cjs.min.js.gz +0 -0
- package/dist/bitwrench-bccl.esm.js +349 -188
- package/dist/bitwrench-bccl.esm.min.js +2 -39
- package/dist/bitwrench-bccl.esm.min.js.gz +0 -0
- package/dist/bitwrench-bccl.umd.js +349 -188
- package/dist/bitwrench-bccl.umd.min.js +2 -39
- package/dist/bitwrench-bccl.umd.min.js.gz +0 -0
- package/dist/bitwrench-code-edit.cjs.js +17 -6
- package/dist/bitwrench-code-edit.cjs.min.js +2 -20
- package/dist/bitwrench-code-edit.es5.js +8 -3
- package/dist/bitwrench-code-edit.es5.min.js +2 -19
- package/dist/bitwrench-code-edit.esm.js +17 -6
- package/dist/bitwrench-code-edit.esm.min.js +2 -19
- package/dist/bitwrench-code-edit.umd.js +17 -6
- package/dist/bitwrench-code-edit.umd.min.js +2 -19
- package/dist/bitwrench-code-edit.umd.min.js.gz +0 -0
- package/dist/bitwrench-debug.js +1 -1
- package/dist/bitwrench-debug.min.js +1 -1
- package/dist/bitwrench-lean.cjs.js +2492 -1628
- package/dist/bitwrench-lean.cjs.min.js +2 -80
- package/dist/bitwrench-lean.cjs.min.js.gz +0 -0
- package/dist/bitwrench-lean.es5.js +2740 -1838
- package/dist/bitwrench-lean.es5.min.js +2 -49
- package/dist/bitwrench-lean.es5.min.js.gz +0 -0
- package/dist/bitwrench-lean.esm.js +2492 -1628
- package/dist/bitwrench-lean.esm.min.js +2 -80
- package/dist/bitwrench-lean.esm.min.js.gz +0 -0
- package/dist/bitwrench-lean.umd.js +2492 -1628
- package/dist/bitwrench-lean.umd.min.js +2 -80
- package/dist/bitwrench-lean.umd.min.js.gz +0 -0
- package/dist/bitwrench-util-color.cjs.js +251 -0
- package/dist/bitwrench-util-color.cjs.min.js +3 -0
- package/dist/bitwrench-util-color.es5.js +256 -0
- package/dist/bitwrench-util-color.es5.min.js +3 -0
- package/dist/bitwrench-util-color.esm.js +241 -0
- package/dist/bitwrench-util-color.esm.min.js +3 -0
- package/dist/bitwrench-util-color.umd.js +257 -0
- package/dist/bitwrench-util-color.umd.min.js +3 -0
- package/dist/bitwrench-util-css.cjs.js +2 -1
- package/dist/bitwrench-util-css.cjs.min.js +2 -21
- package/dist/bitwrench-util-css.es5.js +2 -1
- package/dist/bitwrench-util-css.es5.min.js +2 -20
- package/dist/bitwrench-util-css.esm.js +2 -1
- package/dist/bitwrench-util-css.esm.min.js +1 -19
- package/dist/bitwrench-util-css.umd.js +2 -1
- package/dist/bitwrench-util-css.umd.min.js +2 -20
- package/dist/bitwrench-util-css.umd.min.js.gz +0 -0
- package/dist/bitwrench.cjs.js +2826 -1801
- package/dist/bitwrench.cjs.min.js +2 -99
- package/dist/bitwrench.cjs.min.js.gz +0 -0
- package/dist/bitwrench.css +403 -479
- package/dist/bitwrench.d.ts +70 -73
- package/dist/bitwrench.es5.js +3106 -2020
- package/dist/bitwrench.es5.min.js +2 -67
- package/dist/bitwrench.es5.min.js.gz +0 -0
- package/dist/bitwrench.esm.js +2826 -1801
- package/dist/bitwrench.esm.min.js +2 -99
- package/dist/bitwrench.esm.min.js.gz +0 -0
- package/dist/bitwrench.min.css +1 -1
- package/dist/bitwrench.umd.js +2826 -1801
- package/dist/bitwrench.umd.min.js +2 -99
- package/dist/bitwrench.umd.min.js.gz +0 -0
- package/dist/builds.json +222 -134
- package/dist/bwserve.cjs.js +308 -298
- package/dist/bwserve.d.ts +157 -0
- package/dist/bwserve.esm.js +309 -299
- package/dist/sri.json +54 -46
- package/docs/README.md +6 -3
- package/docs/app-patterns.md +7 -6
- package/docs/bitwrench-for-wasm.md +53 -54
- package/docs/bitwrench-mcp.md +2 -2
- package/docs/bitwrench-northstar-principles.md +406 -0
- package/docs/bitwrench-taco-schema-discussion.md +2 -2
- package/docs/bitwrench_api.md +191 -106
- package/docs/bitwrench_typescript_usage.md +5 -5
- package/docs/bw-attach.md +29 -75
- package/docs/bwserve.md +200 -168
- package/docs/cli.md +36 -12
- package/docs/component-cheatsheet.md +2 -2
- package/docs/component-library.md +4 -4
- package/docs/component-lifecycle.md +234 -0
- package/docs/drift-lint.md +268 -0
- package/docs/framework-translation-table.md +4 -4
- package/docs/llm-bitwrench-guide.md +60 -50
- package/docs/routing.md +11 -13
- package/docs/state-management.md +110 -109
- package/docs/taco-format.md +13 -14
- package/docs/theming.md +13 -3
- package/docs/thinking-in-bitwrench.md +858 -983
- package/docs/tutorial-bwserve.md +37 -36
- package/docs/tutorial-embedded.md +10 -21
- package/docs/tutorial-website.md +2 -2
- package/package.json +38 -7
- package/readme.html +262 -160
- package/src/bitwrench-bccl-entry.js +2 -2
- package/src/bitwrench-bccl.js +346 -185
- package/src/bitwrench-code-edit.js +16 -5
- package/src/bitwrench-color-utils.js +117 -181
- package/src/bitwrench-file-ops.js +2 -2
- package/src/bitwrench-lean.js +4 -3
- package/src/bitwrench-router.js +5 -2
- package/src/bitwrench-styles.js +420 -504
- package/src/bitwrench-util-color.js +240 -0
- package/src/bitwrench-util-css.js +1 -0
- package/src/bitwrench-utils.js +4 -0
- package/src/bitwrench.d.ts +70 -73
- package/src/bitwrench.h +5 -0
- package/src/bitwrench.js +1939 -933
- package/src/bwserve/attach.js +0 -1
- package/src/bwserve/bwclient.js +172 -32
- package/src/bwserve/bwshell.js +0 -4
- package/src/bwserve/client.js +59 -220
- package/src/bwserve/index.js +78 -42
- package/src/bwserve.d.ts +157 -0
- package/src/bwserve.h +5 -0
- package/src/cli/attach.js +12 -75
- package/src/cli/convert.js +2 -2
- package/src/cli/serve.js +37 -35
- package/src/generate-css.js +1 -1
- package/src/mcp/knowledge.js +4 -4
- package/src/mcp/live.js +21 -13
- package/src/mcp/tools.js +0 -1
- package/src/version.js +3 -7
package/src/cli/serve.js
CHANGED
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
|
|
16
16
|
import { parseArgs } from 'node:util';
|
|
17
17
|
import { createServer } from 'node:http';
|
|
18
|
-
import { createReadStream } from 'node:fs';
|
|
19
18
|
import { VERSION } from '../version.js';
|
|
20
19
|
|
|
21
20
|
var SERVE_USAGE = `
|
|
@@ -34,8 +33,8 @@ Options:
|
|
|
34
33
|
--stdin Read protocol messages from stdin (newline-delimited JSON)
|
|
35
34
|
-t, --theme <name> Theme preset or hex colors ("#pri,#sec")
|
|
36
35
|
--title <string> Page title (default: "bwcli serve")
|
|
37
|
-
--allow-exec Enable exec messages (runs JS in browser, use for dev only)
|
|
38
36
|
--no-dir-list Disable directory listings
|
|
37
|
+
--allow-screenshot Enable client.screenshot() capability
|
|
39
38
|
--open Open browser on start
|
|
40
39
|
-v, --verbose Verbose output
|
|
41
40
|
-h, --help Print this help
|
|
@@ -45,8 +44,7 @@ Examples:
|
|
|
45
44
|
bwcli serve ./public --port 3000 Serve ./public on :3000
|
|
46
45
|
bwcli serve --stdin Read from pipe instead of input port
|
|
47
46
|
sensor-reader | bwcli serve --stdin Pipe sensor data to browser
|
|
48
|
-
curl -X POST :9000 -d '{"type":"
|
|
49
|
-
curl -X POST :9000 -d '{"command":"query","code":"document.title"}'
|
|
47
|
+
curl -X POST :9000 -d '{"type":"mount","ref":"#app","taco":{"t":"h1","c":"Hi"},"v":1}'
|
|
50
48
|
curl -X POST :9000 -d '{"command":"clients"}'
|
|
51
49
|
`.trim();
|
|
52
50
|
|
|
@@ -141,20 +139,19 @@ function parseRelaxedJSON(str) {
|
|
|
141
139
|
|
|
142
140
|
// Required fields per command (async commands also listed)
|
|
143
141
|
var _COMMAND_REQUIRED = {
|
|
144
|
-
query: ['code'],
|
|
145
142
|
screenshot: [],
|
|
146
143
|
tree: [],
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
render: ['
|
|
150
|
-
patch: ['
|
|
151
|
-
listen: ['
|
|
152
|
-
unlisten: ['
|
|
144
|
+
query: ['code'],
|
|
145
|
+
mount: ['ref', 'taco'],
|
|
146
|
+
render: ['ref', 'taco'], // deprecated alias for mount
|
|
147
|
+
patch: ['ref'],
|
|
148
|
+
listen: ['topic'],
|
|
149
|
+
unlisten: ['topic'],
|
|
153
150
|
clients: []
|
|
154
151
|
};
|
|
155
152
|
|
|
156
153
|
// Commands that return a result via promise
|
|
157
|
-
var _ASYNC_COMMANDS = {
|
|
154
|
+
var _ASYNC_COMMANDS = { screenshot: 1, tree: 1, query: 1 };
|
|
158
155
|
|
|
159
156
|
/**
|
|
160
157
|
* Handle an interactive command from the listen port.
|
|
@@ -177,7 +174,7 @@ function handleCommand(msg, app, verbose) {
|
|
|
177
174
|
}
|
|
178
175
|
|
|
179
176
|
// Validate command name
|
|
180
|
-
if (!
|
|
177
|
+
if (!Object.prototype.hasOwnProperty.call(_COMMAND_REQUIRED, cmd)) {
|
|
181
178
|
return Promise.resolve({ error: 'Unknown command: ' + cmd });
|
|
182
179
|
}
|
|
183
180
|
|
|
@@ -202,12 +199,11 @@ function handleCommand(msg, app, verbose) {
|
|
|
202
199
|
return Promise.resolve({ error: 'Client not found: ' + msg.clientId });
|
|
203
200
|
}
|
|
204
201
|
} else {
|
|
205
|
-
// Pick
|
|
202
|
+
// Pick most recently connected client (last non-closed in insertion order)
|
|
206
203
|
for (var pair of app._clients) {
|
|
207
204
|
if (pair[1] && pair[1].client && !pair[1].client._closed) {
|
|
208
205
|
client = pair[1].client;
|
|
209
206
|
clientId = pair[0];
|
|
210
|
-
break;
|
|
211
207
|
}
|
|
212
208
|
}
|
|
213
209
|
}
|
|
@@ -225,11 +221,6 @@ function handleCommand(msg, app, verbose) {
|
|
|
225
221
|
// Dispatch
|
|
226
222
|
try {
|
|
227
223
|
switch (cmd) {
|
|
228
|
-
case 'query':
|
|
229
|
-
return client.query(msg.code, { timeout: timeout || 5000 }).then(function(result) {
|
|
230
|
-
return { ok: true, result: result, clientId: clientId };
|
|
231
|
-
});
|
|
232
|
-
|
|
233
224
|
case 'screenshot':
|
|
234
225
|
return client.screenshot(msg.selector || 'body', { timeout: timeout || 10000 }).then(function(result) {
|
|
235
226
|
// Convert Buffer to base64 for JSON response
|
|
@@ -237,6 +228,16 @@ function handleCommand(msg, app, verbose) {
|
|
|
237
228
|
return { ok: true, result: { data: data, width: result.width, height: result.height, format: result.format }, clientId: clientId };
|
|
238
229
|
});
|
|
239
230
|
|
|
231
|
+
case 'query':
|
|
232
|
+
var qPend = client._pend(timeout || 10000);
|
|
233
|
+
client.call('_bw_query', {
|
|
234
|
+
code: msg.code,
|
|
235
|
+
requestId: qPend.requestId
|
|
236
|
+
});
|
|
237
|
+
return qPend.promise.then(function(result) {
|
|
238
|
+
return { ok: true, result: result, clientId: clientId };
|
|
239
|
+
});
|
|
240
|
+
|
|
240
241
|
case 'tree':
|
|
241
242
|
var pend = client._pend(timeout || 10000);
|
|
242
243
|
client.call('_bw_tree', {
|
|
@@ -249,28 +250,26 @@ function handleCommand(msg, app, verbose) {
|
|
|
249
250
|
});
|
|
250
251
|
|
|
251
252
|
case 'mount':
|
|
252
|
-
return client.mount(msg.selector, msg.factory, msg.props || {}, { timeout: timeout || 10000 }).then(function(result) {
|
|
253
|
-
return { ok: true, result: result, clientId: clientId };
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
case 'exec':
|
|
257
|
-
client.exec(msg.code);
|
|
258
|
-
return Promise.resolve({ ok: true, clientId: clientId });
|
|
259
|
-
|
|
260
253
|
case 'render':
|
|
261
|
-
client.
|
|
254
|
+
client.mount(msg.ref, msg.taco);
|
|
262
255
|
return Promise.resolve({ ok: true, clientId: clientId });
|
|
263
256
|
|
|
264
257
|
case 'patch':
|
|
265
|
-
|
|
258
|
+
var patchFields = {};
|
|
259
|
+
for (var pk in msg) {
|
|
260
|
+
if (pk !== 'command' && pk !== 'ref' && pk !== 'clientId' && pk !== 'timeout') {
|
|
261
|
+
patchFields[pk] = msg[pk];
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
client.patch(msg.ref, patchFields);
|
|
266
265
|
return Promise.resolve({ ok: true, clientId: clientId });
|
|
267
266
|
|
|
268
267
|
case 'listen':
|
|
269
|
-
client.
|
|
268
|
+
client.listen(msg.topic);
|
|
270
269
|
return Promise.resolve({ ok: true, clientId: clientId });
|
|
271
270
|
|
|
272
271
|
case 'unlisten':
|
|
273
|
-
client.
|
|
272
|
+
client._send({ type: 'unlisten', topic: msg.topic });
|
|
274
273
|
return Promise.resolve({ ok: true, clientId: clientId });
|
|
275
274
|
}
|
|
276
275
|
} catch (err) {
|
|
@@ -298,9 +297,9 @@ export function runServe(argv, ioOpts) {
|
|
|
298
297
|
stdin: { type: 'boolean' },
|
|
299
298
|
theme: { type: 'string', short: 't' },
|
|
300
299
|
title: { type: 'string' },
|
|
301
|
-
'allow-exec': { type: 'boolean' },
|
|
302
300
|
'no-dir-list': { type: 'boolean' },
|
|
303
301
|
open: { type: 'boolean' },
|
|
302
|
+
'allow-screenshot': { type: 'boolean' },
|
|
304
303
|
verbose: { type: 'boolean', short: 'v' },
|
|
305
304
|
help: { type: 'boolean', short: 'h' }
|
|
306
305
|
}
|
|
@@ -352,7 +351,7 @@ export function runServe(argv, ioOpts) {
|
|
|
352
351
|
dirList: dirList,
|
|
353
352
|
verbose: verbose,
|
|
354
353
|
open: !!values.open,
|
|
355
|
-
|
|
354
|
+
allowScreenshot: !!values['allow-screenshot']
|
|
356
355
|
});
|
|
357
356
|
}).catch(function(err) {
|
|
358
357
|
console.error('Failed to load bwserve: ' + err.message);
|
|
@@ -373,7 +372,7 @@ function startServer(bwserve, opts) {
|
|
|
373
372
|
static: opts.dir,
|
|
374
373
|
theme: opts.theme,
|
|
375
374
|
dirList: opts.dirList,
|
|
376
|
-
|
|
375
|
+
allowScreenshot: opts.allowScreenshot
|
|
377
376
|
});
|
|
378
377
|
|
|
379
378
|
// Register a passthrough page handler — just keeps clients alive
|
|
@@ -434,6 +433,7 @@ function startInputServer(app, listenPort, verbose) {
|
|
|
434
433
|
if (err.code === 'EADDRINUSE') {
|
|
435
434
|
console.error(' Warning: Input port ' + listenPort + ' in use, picking a free port...');
|
|
436
435
|
var retry = _createInputServer(app, verbose);
|
|
436
|
+
/* c8 ignore next 5 -- double port failure is a rare edge case */
|
|
437
437
|
retry.on('error', function(err2) {
|
|
438
438
|
console.error(' Warning: Could not bind input server (' + err2.message + '). Continuing without input port.');
|
|
439
439
|
resolve(null);
|
|
@@ -443,6 +443,7 @@ function startInputServer(app, listenPort, verbose) {
|
|
|
443
443
|
console.error(' Input port: http://localhost:' + actualPort + ' (fallback)');
|
|
444
444
|
resolve(retry);
|
|
445
445
|
});
|
|
446
|
+
/* c8 ignore next 3 -- non-EADDRINUSE errors are rare */
|
|
446
447
|
} else {
|
|
447
448
|
console.error(' Warning: Input server error (' + err.message + '). Continuing without input port.');
|
|
448
449
|
resolve(null);
|
|
@@ -480,6 +481,7 @@ function _createInputServer(app, verbose) {
|
|
|
480
481
|
// Interactive command path
|
|
481
482
|
if (msg.command) {
|
|
482
483
|
handleCommand(msg, app, verbose).then(function(result) {
|
|
484
|
+
/* c8 ignore next -- error status covered in isolation; flaky in combined */
|
|
483
485
|
var status = result.error ? 400 : 200;
|
|
484
486
|
// Unknown command and client-not-found get 400; timeout also 400
|
|
485
487
|
res.writeHead(status, { 'Content-Type': 'application/json' });
|
package/src/generate-css.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Creates class-based CSS to prevent collisions with other frameworks
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { getStructuralStyles, generateThemedCSS,
|
|
7
7
|
resolveLayout, DEFAULT_PALETTE_CONFIG } from './bitwrench-styles.js';
|
|
8
8
|
import { derivePalette } from './bitwrench-color-utils.js';
|
|
9
9
|
import fs from 'fs';
|
package/src/mcp/knowledge.js
CHANGED
|
@@ -17,7 +17,7 @@ var DOCS_DIR = resolve(__dirname, '../../docs');
|
|
|
17
17
|
// Section name -> heading prefix mapping for bitwrench_guide
|
|
18
18
|
var GUIDE_SECTIONS = {
|
|
19
19
|
'taco': 'Step 2: Understand TACO',
|
|
20
|
-
'
|
|
20
|
+
'materialization': 'Step 3: From Data to DOM',
|
|
21
21
|
'events': 'Step 4: Events',
|
|
22
22
|
'css': 'Step 5: CSS and Theming',
|
|
23
23
|
'components': 'Step 6: BCCL Components',
|
|
@@ -102,7 +102,7 @@ export var knowledgeToolDefs = [
|
|
|
102
102
|
section: {
|
|
103
103
|
type: 'string',
|
|
104
104
|
description: 'Optional: return only a specific section. Omit for full guide.',
|
|
105
|
-
enum: ['taco', '
|
|
105
|
+
enum: ['taco', 'materialization', 'events', 'css', 'components', 'bwserve', 'routing', 'api-reference', 'rules']
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
}
|
|
@@ -124,7 +124,7 @@ export var knowledgeToolDefs = [
|
|
|
124
124
|
{
|
|
125
125
|
name: 'bitwrench_server_guide',
|
|
126
126
|
title: 'Server-Driven UI Guide',
|
|
127
|
-
description: 'Tutorial for building server-driven UI with bwserve. Covers: SSE streaming,
|
|
127
|
+
description: 'Tutorial for building server-driven UI with bwserve. Covers: SSE streaming, mount/patch/append protocol, bw_act_* action buttons, live metrics, screenshots. Call this when building real-time or server-pushed interfaces.',
|
|
128
128
|
inputSchema: { type: 'object', properties: {} }
|
|
129
129
|
},
|
|
130
130
|
{
|
|
@@ -169,7 +169,7 @@ var START_HERE_TEXT = [
|
|
|
169
169
|
'- Call build_page to get a complete standalone .html file (works offline)',
|
|
170
170
|
'',
|
|
171
171
|
'OTHER KNOWLEDGE TOOLS (call as needed):',
|
|
172
|
-
'- bitwrench_guide: Full tutorial (TACO format,
|
|
172
|
+
'- bitwrench_guide: Full tutorial (TACO format, materialization, events, CSS,',
|
|
173
173
|
' components, bwserve, routing, API reference)',
|
|
174
174
|
'- bitwrench_components: Props reference for all 47+ make*() components',
|
|
175
175
|
'- bitwrench_server_guide: bwserve tutorial (SSE streaming, live UI)',
|
package/src/mcp/live.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP live rendering -- bwserve integration for render_live, screenshot,
|
|
2
|
+
* MCP live rendering -- bwserve integration for render_live, screenshot, inspect_dom.
|
|
3
3
|
*
|
|
4
4
|
* Starts a bwserve instance that serves a shell page. The MCP agent pushes
|
|
5
5
|
* TACO to the browser via SSE, captures screenshots, and queries DOM state.
|
|
@@ -34,7 +34,7 @@ export function startLive(opts) {
|
|
|
34
34
|
// Register the default page handler
|
|
35
35
|
_app.page('/', function(client) {
|
|
36
36
|
// Render an initial placeholder
|
|
37
|
-
client.
|
|
37
|
+
client.mount('#app', {
|
|
38
38
|
t: 'div',
|
|
39
39
|
a: { class: 'bw_container', style: 'padding: 2rem; text-align: center; color: #888;' },
|
|
40
40
|
c: { t: 'p', c: 'bwmcp ready -- waiting for agent to render UI...' }
|
|
@@ -50,6 +50,7 @@ export function startLive(opts) {
|
|
|
50
50
|
if (opts.open) {
|
|
51
51
|
import('child_process').then(function(cp) {
|
|
52
52
|
var url = 'http://localhost:' + port;
|
|
53
|
+
/* c8 ignore next 2 -- platform-dependent; only darwin in CI */
|
|
53
54
|
var cmd = process.platform === 'darwin' ? 'open'
|
|
54
55
|
: process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
55
56
|
cp.exec(cmd + ' ' + url);
|
|
@@ -58,6 +59,7 @@ export function startLive(opts) {
|
|
|
58
59
|
|
|
59
60
|
resolve(_app);
|
|
60
61
|
});
|
|
62
|
+
/* c8 ignore next 3 -- defensive catch for synchronous listen errors */
|
|
61
63
|
} catch (e) {
|
|
62
64
|
reject(e);
|
|
63
65
|
}
|
|
@@ -129,15 +131,15 @@ export var liveToolDefs = [
|
|
|
129
131
|
}
|
|
130
132
|
},
|
|
131
133
|
{
|
|
132
|
-
name: '
|
|
133
|
-
title: '
|
|
134
|
-
description: '
|
|
134
|
+
name: 'inspect_dom',
|
|
135
|
+
title: 'Inspect DOM Tree',
|
|
136
|
+
description: 'Inspect the DOM tree in the connected browser. Returns a structured tree with tag names, IDs, classes, and children.',
|
|
135
137
|
inputSchema: {
|
|
136
138
|
type: 'object',
|
|
137
139
|
properties: {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
140
|
+
selector: { type: 'string', description: 'CSS selector of root element to inspect (default: "body")' },
|
|
141
|
+
depth: { type: 'number', description: 'Maximum depth to traverse (default: 3)' }
|
|
142
|
+
}
|
|
141
143
|
}
|
|
142
144
|
}
|
|
143
145
|
];
|
|
@@ -149,7 +151,7 @@ export var liveHandlers = {
|
|
|
149
151
|
if (!_app) {
|
|
150
152
|
return { content: [{ type: 'text', text: 'Error: bwserve not started. Live rendering not available.' }], isError: true };
|
|
151
153
|
}
|
|
152
|
-
|
|
154
|
+
getClient();
|
|
153
155
|
var target = args.target || '#app';
|
|
154
156
|
var action = args.action || 'replace';
|
|
155
157
|
|
|
@@ -204,7 +206,7 @@ export var liveHandlers = {
|
|
|
204
206
|
});
|
|
205
207
|
},
|
|
206
208
|
|
|
207
|
-
|
|
209
|
+
inspect_dom: function(args) {
|
|
208
210
|
var client = getClient();
|
|
209
211
|
if (!client) {
|
|
210
212
|
return Promise.resolve({
|
|
@@ -213,14 +215,20 @@ export var liveHandlers = {
|
|
|
213
215
|
});
|
|
214
216
|
}
|
|
215
217
|
|
|
216
|
-
|
|
218
|
+
var pend = client._pend(5000);
|
|
219
|
+
client.call('_bw_tree', {
|
|
220
|
+
selector: args.selector || 'body',
|
|
221
|
+
depth: args.depth || 3,
|
|
222
|
+
requestId: pend.requestId
|
|
223
|
+
});
|
|
224
|
+
return pend.promise
|
|
217
225
|
.then(function(result) {
|
|
218
|
-
var text = typeof result === 'string' ? result : JSON.stringify(result);
|
|
226
|
+
var text = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
|
|
219
227
|
return { content: [{ type: 'text', text: text }] };
|
|
220
228
|
})
|
|
221
229
|
.catch(function(e) {
|
|
222
230
|
return {
|
|
223
|
-
content: [{ type: 'text', text: '
|
|
231
|
+
content: [{ type: 'text', text: 'Inspect error: ' + e.message }],
|
|
224
232
|
isError: true
|
|
225
233
|
};
|
|
226
234
|
});
|
package/src/mcp/tools.js
CHANGED
|
@@ -18,7 +18,6 @@ var BOOL = { type: 'boolean' };
|
|
|
18
18
|
var OBJ = { type: 'object' };
|
|
19
19
|
var NUM = { type: 'number' };
|
|
20
20
|
var STR_OR_OBJ = { oneOf: [{ type: 'string' }, { type: 'object' }] };
|
|
21
|
-
var STR_OR_ARRAY = { oneOf: [{ type: 'string' }, { type: 'array', items: { type: 'object' } }] };
|
|
22
21
|
var VARIANT_ENUM = {
|
|
23
22
|
type: 'string',
|
|
24
23
|
enum: ['primary', 'secondary', 'success', 'danger', 'warning', 'info'],
|
package/src/version.js
CHANGED
|
@@ -3,14 +3,10 @@
|
|
|
3
3
|
* DO NOT EDIT DIRECTLY - Use npm run generate-version
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export const VERSION = '2.0
|
|
6
|
+
export const VERSION = '2.1.0';
|
|
7
7
|
export const VERSION_INFO = {
|
|
8
|
-
version: '2.0
|
|
8
|
+
version: '2.1.0',
|
|
9
9
|
name: 'bitwrench',
|
|
10
|
-
description: 'A library for javascript UI functions.',
|
|
11
10
|
license: 'BSD-2-Clause',
|
|
12
|
-
|
|
13
|
-
repository: 'git+https://github.com/deftio/bitwrench.git',
|
|
14
|
-
author: 'manu a. chatterjee <deftio@deftio.com> (https://deftio.com/)',
|
|
15
|
-
buildDate: '2026-04-12T07:56:29.791Z'
|
|
11
|
+
buildDate: '2026-07-15T05:51:07.722Z'
|
|
16
12
|
};
|