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.
Files changed (126) hide show
  1. package/README.md +210 -125
  2. package/dist/bitwrench-bccl.cjs.js +349 -188
  3. package/dist/bitwrench-bccl.cjs.min.js +2 -39
  4. package/dist/bitwrench-bccl.cjs.min.js.gz +0 -0
  5. package/dist/bitwrench-bccl.esm.js +349 -188
  6. package/dist/bitwrench-bccl.esm.min.js +2 -39
  7. package/dist/bitwrench-bccl.esm.min.js.gz +0 -0
  8. package/dist/bitwrench-bccl.umd.js +349 -188
  9. package/dist/bitwrench-bccl.umd.min.js +2 -39
  10. package/dist/bitwrench-bccl.umd.min.js.gz +0 -0
  11. package/dist/bitwrench-code-edit.cjs.js +17 -6
  12. package/dist/bitwrench-code-edit.cjs.min.js +2 -20
  13. package/dist/bitwrench-code-edit.es5.js +8 -3
  14. package/dist/bitwrench-code-edit.es5.min.js +2 -19
  15. package/dist/bitwrench-code-edit.esm.js +17 -6
  16. package/dist/bitwrench-code-edit.esm.min.js +2 -19
  17. package/dist/bitwrench-code-edit.umd.js +17 -6
  18. package/dist/bitwrench-code-edit.umd.min.js +2 -19
  19. package/dist/bitwrench-code-edit.umd.min.js.gz +0 -0
  20. package/dist/bitwrench-debug.js +1 -1
  21. package/dist/bitwrench-debug.min.js +1 -1
  22. package/dist/bitwrench-lean.cjs.js +2492 -1628
  23. package/dist/bitwrench-lean.cjs.min.js +2 -80
  24. package/dist/bitwrench-lean.cjs.min.js.gz +0 -0
  25. package/dist/bitwrench-lean.es5.js +2740 -1838
  26. package/dist/bitwrench-lean.es5.min.js +2 -49
  27. package/dist/bitwrench-lean.es5.min.js.gz +0 -0
  28. package/dist/bitwrench-lean.esm.js +2492 -1628
  29. package/dist/bitwrench-lean.esm.min.js +2 -80
  30. package/dist/bitwrench-lean.esm.min.js.gz +0 -0
  31. package/dist/bitwrench-lean.umd.js +2492 -1628
  32. package/dist/bitwrench-lean.umd.min.js +2 -80
  33. package/dist/bitwrench-lean.umd.min.js.gz +0 -0
  34. package/dist/bitwrench-util-color.cjs.js +251 -0
  35. package/dist/bitwrench-util-color.cjs.min.js +3 -0
  36. package/dist/bitwrench-util-color.es5.js +256 -0
  37. package/dist/bitwrench-util-color.es5.min.js +3 -0
  38. package/dist/bitwrench-util-color.esm.js +241 -0
  39. package/dist/bitwrench-util-color.esm.min.js +3 -0
  40. package/dist/bitwrench-util-color.umd.js +257 -0
  41. package/dist/bitwrench-util-color.umd.min.js +3 -0
  42. package/dist/bitwrench-util-css.cjs.js +2 -1
  43. package/dist/bitwrench-util-css.cjs.min.js +2 -21
  44. package/dist/bitwrench-util-css.es5.js +2 -1
  45. package/dist/bitwrench-util-css.es5.min.js +2 -20
  46. package/dist/bitwrench-util-css.esm.js +2 -1
  47. package/dist/bitwrench-util-css.esm.min.js +1 -19
  48. package/dist/bitwrench-util-css.umd.js +2 -1
  49. package/dist/bitwrench-util-css.umd.min.js +2 -20
  50. package/dist/bitwrench-util-css.umd.min.js.gz +0 -0
  51. package/dist/bitwrench.cjs.js +2826 -1801
  52. package/dist/bitwrench.cjs.min.js +2 -99
  53. package/dist/bitwrench.cjs.min.js.gz +0 -0
  54. package/dist/bitwrench.css +403 -479
  55. package/dist/bitwrench.d.ts +70 -73
  56. package/dist/bitwrench.es5.js +3106 -2020
  57. package/dist/bitwrench.es5.min.js +2 -67
  58. package/dist/bitwrench.es5.min.js.gz +0 -0
  59. package/dist/bitwrench.esm.js +2826 -1801
  60. package/dist/bitwrench.esm.min.js +2 -99
  61. package/dist/bitwrench.esm.min.js.gz +0 -0
  62. package/dist/bitwrench.min.css +1 -1
  63. package/dist/bitwrench.umd.js +2826 -1801
  64. package/dist/bitwrench.umd.min.js +2 -99
  65. package/dist/bitwrench.umd.min.js.gz +0 -0
  66. package/dist/builds.json +222 -134
  67. package/dist/bwserve.cjs.js +308 -298
  68. package/dist/bwserve.d.ts +157 -0
  69. package/dist/bwserve.esm.js +309 -299
  70. package/dist/sri.json +54 -46
  71. package/docs/README.md +6 -3
  72. package/docs/app-patterns.md +7 -6
  73. package/docs/bitwrench-for-wasm.md +53 -54
  74. package/docs/bitwrench-mcp.md +2 -2
  75. package/docs/bitwrench-northstar-principles.md +406 -0
  76. package/docs/bitwrench-taco-schema-discussion.md +2 -2
  77. package/docs/bitwrench_api.md +191 -106
  78. package/docs/bitwrench_typescript_usage.md +5 -5
  79. package/docs/bw-attach.md +29 -75
  80. package/docs/bwserve.md +200 -168
  81. package/docs/cli.md +36 -12
  82. package/docs/component-cheatsheet.md +2 -2
  83. package/docs/component-library.md +4 -4
  84. package/docs/component-lifecycle.md +234 -0
  85. package/docs/drift-lint.md +268 -0
  86. package/docs/framework-translation-table.md +4 -4
  87. package/docs/llm-bitwrench-guide.md +60 -50
  88. package/docs/routing.md +11 -13
  89. package/docs/state-management.md +110 -109
  90. package/docs/taco-format.md +13 -14
  91. package/docs/theming.md +13 -3
  92. package/docs/thinking-in-bitwrench.md +858 -983
  93. package/docs/tutorial-bwserve.md +37 -36
  94. package/docs/tutorial-embedded.md +10 -21
  95. package/docs/tutorial-website.md +2 -2
  96. package/package.json +38 -7
  97. package/readme.html +262 -160
  98. package/src/bitwrench-bccl-entry.js +2 -2
  99. package/src/bitwrench-bccl.js +346 -185
  100. package/src/bitwrench-code-edit.js +16 -5
  101. package/src/bitwrench-color-utils.js +117 -181
  102. package/src/bitwrench-file-ops.js +2 -2
  103. package/src/bitwrench-lean.js +4 -3
  104. package/src/bitwrench-router.js +5 -2
  105. package/src/bitwrench-styles.js +420 -504
  106. package/src/bitwrench-util-color.js +240 -0
  107. package/src/bitwrench-util-css.js +1 -0
  108. package/src/bitwrench-utils.js +4 -0
  109. package/src/bitwrench.d.ts +70 -73
  110. package/src/bitwrench.h +5 -0
  111. package/src/bitwrench.js +1939 -933
  112. package/src/bwserve/attach.js +0 -1
  113. package/src/bwserve/bwclient.js +172 -32
  114. package/src/bwserve/bwshell.js +0 -4
  115. package/src/bwserve/client.js +59 -220
  116. package/src/bwserve/index.js +78 -42
  117. package/src/bwserve.d.ts +157 -0
  118. package/src/bwserve.h +5 -0
  119. package/src/cli/attach.js +12 -75
  120. package/src/cli/convert.js +2 -2
  121. package/src/cli/serve.js +37 -35
  122. package/src/generate-css.js +1 -1
  123. package/src/mcp/knowledge.js +4 -4
  124. package/src/mcp/live.js +21 -13
  125. package/src/mcp/tools.js +0 -1
  126. 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":"replace","target":"#app","node":{"t":"h1","c":"Hi"}}'
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
- mount: ['selector', 'factory'],
148
- exec: ['code'],
149
- render: ['selector', 'taco'],
150
- patch: ['id'],
151
- listen: ['selector', 'event'],
152
- unlisten: ['selector', 'event'],
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 = { query: 1, screenshot: 1, tree: 1, mount: 1 };
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 (!_COMMAND_REQUIRED.hasOwnProperty(cmd)) {
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 first connected client
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.render(msg.selector, msg.taco);
254
+ client.mount(msg.ref, msg.taco);
262
255
  return Promise.resolve({ ok: true, clientId: clientId });
263
256
 
264
257
  case 'patch':
265
- client.patch(msg.id, msg.content, msg.attr);
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.call('_bw_listen', { selector: msg.selector, event: msg.event });
268
+ client.listen(msg.topic);
270
269
  return Promise.resolve({ ok: true, clientId: clientId });
271
270
 
272
271
  case 'unlisten':
273
- client.call('_bw_unlisten', { selector: msg.selector, event: msg.event });
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
- allowExec: !!values['allow-exec']
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
- allowExec: opts.allowExec
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' });
@@ -3,7 +3,7 @@
3
3
  * Creates class-based CSS to prevent collisions with other frameworks
4
4
  */
5
5
 
6
- import { getAllStyles, getStructuralStyles, generateThemedCSS,
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';
@@ -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
- 'levels': 'Step 3: Three Levels',
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', 'levels', 'events', 'css', 'components', 'bwserve', 'routing', 'api-reference', 'rules']
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, replace/patch/append protocol, data-bw-action buttons, live metrics, screenshots. Call this when building real-time or server-pushed interfaces.',
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, 3 levels, events, CSS,',
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, query_dom.
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.render('#app', {
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: 'query_dom',
133
- title: 'Query DOM State',
134
- description: 'Execute JavaScript in the browser and return the result. Use this to inspect DOM state, read text content, count elements, etc.',
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
- code: { type: 'string', description: 'JavaScript code to evaluate in the browser. The return value is sent back.' }
139
- },
140
- required: ['code']
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
- var client = getClient();
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
- query_dom: function(args) {
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
- return client.query(args.code, { timeout: 5000 })
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: 'Query error: ' + e.message }],
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.31';
6
+ export const VERSION = '2.1.0';
7
7
  export const VERSION_INFO = {
8
- version: '2.0.31',
8
+ version: '2.1.0',
9
9
  name: 'bitwrench',
10
- description: 'A library for javascript UI functions.',
11
10
  license: 'BSD-2-Clause',
12
- homepage: 'https://deftio.github.com/bitwrench/pages',
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
  };