clawpad 0.4.1 → 0.4.3

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 (135) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +8 -8
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  17. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/standalone/.next/server/app/api/ai/write/route_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/api/changes/[id]/route_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/api/changes/record/route_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/api/changes/revert/route_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/changes/run/route_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/api/chat/abort/route_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/api/chat/route_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/api/files/pages/[...path]/route_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/api/files/recent/route_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/api/files/search/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/files/spaces/[space]/pages/route_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/api/files/spaces/route_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/api/files/watch/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/gateway/detect/route_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/api/gateway/events/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/gateway/features/route_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/api/gateway/history/route_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/api/gateway/resolve/route_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/api/gateway/sessions/route_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/api/gateway/status/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/openclaw/commands/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/settings/search-status/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/setup/bootstrap/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/setup/bootstrap-workspace/route_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/api/setup/status/route_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/api/setup/trigger-onboarding/route_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/index.html +1 -1
  53. package/.next/standalone/.next/server/app/index.rsc +1 -1
  54. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  55. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  56. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  57. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  58. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  59. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/settings/connection/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/settings/connection.html +1 -1
  62. package/.next/standalone/.next/server/app/settings/connection.rsc +1 -1
  63. package/.next/standalone/.next/server/app/settings/connection.segments/_full.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/settings/connection.segments/_head.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/settings/connection.segments/_index.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/settings/connection.segments/_tree.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/app/settings/connection.segments/settings/connection/__PAGE__.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/settings/connection.segments/settings/connection.segment.rsc +1 -1
  69. package/.next/standalone/.next/server/app/settings/connection.segments/settings.segment.rsc +1 -1
  70. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/settings/relay/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/settings/relay.html +1 -1
  73. package/.next/standalone/.next/server/app/settings/relay.rsc +1 -1
  74. package/.next/standalone/.next/server/app/settings/relay.segments/_full.segment.rsc +1 -1
  75. package/.next/standalone/.next/server/app/settings/relay.segments/_head.segment.rsc +1 -1
  76. package/.next/standalone/.next/server/app/settings/relay.segments/_index.segment.rsc +1 -1
  77. package/.next/standalone/.next/server/app/settings/relay.segments/_tree.segment.rsc +1 -1
  78. package/.next/standalone/.next/server/app/settings/relay.segments/settings/relay/__PAGE__.segment.rsc +1 -1
  79. package/.next/standalone/.next/server/app/settings/relay.segments/settings/relay.segment.rsc +1 -1
  80. package/.next/standalone/.next/server/app/settings/relay.segments/settings.segment.rsc +1 -1
  81. package/.next/standalone/.next/server/app/settings.html +1 -1
  82. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  83. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +1 -1
  84. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
  85. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +1 -1
  86. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  87. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
  88. package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +1 -1
  89. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/setup.html +1 -1
  91. package/.next/standalone/.next/server/app/setup.rsc +1 -1
  92. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +1 -1
  93. package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  94. package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +1 -1
  95. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +1 -1
  96. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
  97. package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  98. package/.next/standalone/.next/server/app/waitlist/page_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/waitlist.html +1 -1
  100. package/.next/standalone/.next/server/app/waitlist.rsc +1 -1
  101. package/.next/standalone/.next/server/app/waitlist.segments/_full.segment.rsc +1 -1
  102. package/.next/standalone/.next/server/app/waitlist.segments/_head.segment.rsc +1 -1
  103. package/.next/standalone/.next/server/app/waitlist.segments/_index.segment.rsc +1 -1
  104. package/.next/standalone/.next/server/app/waitlist.segments/_tree.segment.rsc +1 -1
  105. package/.next/standalone/.next/server/app/waitlist.segments/waitlist/__PAGE__.segment.rsc +1 -1
  106. package/.next/standalone/.next/server/app/waitlist.segments/waitlist.segment.rsc +1 -1
  107. package/.next/standalone/.next/server/app/workspace/[...path]/page_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/workspace/page_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/workspace/search/page_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/workspace/search.html +2 -2
  111. package/.next/standalone/.next/server/app/workspace/search.rsc +1 -1
  112. package/.next/standalone/.next/server/app/workspace/search.segments/_full.segment.rsc +1 -1
  113. package/.next/standalone/.next/server/app/workspace/search.segments/_head.segment.rsc +1 -1
  114. package/.next/standalone/.next/server/app/workspace/search.segments/_index.segment.rsc +1 -1
  115. package/.next/standalone/.next/server/app/workspace/search.segments/_tree.segment.rsc +1 -1
  116. package/.next/standalone/.next/server/app/workspace/search.segments/workspace/search/__PAGE__.segment.rsc +1 -1
  117. package/.next/standalone/.next/server/app/workspace/search.segments/workspace/search.segment.rsc +1 -1
  118. package/.next/standalone/.next/server/app/workspace/search.segments/workspace.segment.rsc +1 -1
  119. package/.next/standalone/.next/server/app/workspace.html +2 -2
  120. package/.next/standalone/.next/server/app/workspace.rsc +1 -1
  121. package/.next/standalone/.next/server/app/workspace.segments/_full.segment.rsc +1 -1
  122. package/.next/standalone/.next/server/app/workspace.segments/_head.segment.rsc +1 -1
  123. package/.next/standalone/.next/server/app/workspace.segments/_index.segment.rsc +1 -1
  124. package/.next/standalone/.next/server/app/workspace.segments/_tree.segment.rsc +1 -1
  125. package/.next/standalone/.next/server/app/workspace.segments/workspace/__PAGE__.segment.rsc +1 -1
  126. package/.next/standalone/.next/server/app/workspace.segments/workspace.segment.rsc +1 -1
  127. package/.next/standalone/.next/server/app-paths-manifest.json +8 -8
  128. package/.next/standalone/.next/server/pages/404.html +1 -1
  129. package/.next/standalone/.next/server/pages/500.html +2 -2
  130. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  131. package/.next/standalone/package.json +1 -1
  132. package/bin/clawpad.js +198 -28
  133. package/package.json +1 -1
  134. /package/.next/static/{6EwCvP9EKUvJxIMHYw3Dj → _I2Jr5gNqlCtio_q1S9ts}/_buildManifest.js +0 -0
  135. /package/.next/static/{6EwCvP9EKUvJxIMHYw3Dj → _I2Jr5gNqlCtio_q1S9ts}/_ssgManifest.js +0 -0
package/bin/clawpad.js CHANGED
@@ -354,15 +354,110 @@ async function startShare(shareArgs) {
354
354
  console.log(` 🔑 Token: ${token.slice(0, 8)}...`);
355
355
  console.log();
356
356
 
357
- connectRelay(relayUrl, token, gateway.url, agentName);
357
+ connectRelay(relayUrl, token, gateway.url, gateway.token, agentName);
358
358
  }
359
359
 
360
- function connectRelay(relayUrl, token, gatewayWsUrl, agentName = "unknown") {
360
+ // Handle local RPC methods for cloud UI
361
+ async function handleLocalRpc(msg) {
362
+ const { id, method, params } = msg;
363
+
364
+ try {
365
+ switch (method) {
366
+ case "files.list": {
367
+ const targetPath = resolvePath(params?.path || "~/.openclaw/pages");
368
+ const files = await listFilesRecursive(targetPath);
369
+ return { type: "res", id, ok: true, payload: { files } };
370
+ }
371
+
372
+ case "files.read": {
373
+ const targetPath = resolvePath(params?.path);
374
+ if (!targetPath) {
375
+ return { type: "res", id, ok: false, error: { code: "INVALID_PATH", message: "Path required" } };
376
+ }
377
+ const content = fs.readFileSync(targetPath, "utf-8");
378
+ return { type: "res", id, ok: true, payload: { content } };
379
+ }
380
+
381
+ case "files.write": {
382
+ const targetPath = resolvePath(params?.path);
383
+ if (!targetPath || !params?.content) {
384
+ return { type: "res", id, ok: false, error: { code: "INVALID_PARAMS", message: "Path and content required" } };
385
+ }
386
+ fs.writeFileSync(targetPath, params.content, "utf-8");
387
+ return { type: "res", id, ok: true, payload: { success: true } };
388
+ }
389
+
390
+ default:
391
+ // Not a local method, let gateway handle it
392
+ return null;
393
+ }
394
+ } catch (err) {
395
+ return {
396
+ type: "res",
397
+ id,
398
+ ok: false,
399
+ error: { code: "ERROR", message: err.message || "Unknown error" }
400
+ };
401
+ }
402
+ }
403
+
404
+ function resolvePath(p) {
405
+ if (!p) return null;
406
+ if (p.startsWith("~/")) {
407
+ return path.join(os.homedir(), p.slice(2));
408
+ }
409
+ return path.resolve(p);
410
+ }
411
+
412
+ async function listFilesRecursive(dirPath, basePath = dirPath) {
413
+ const items = [];
414
+
415
+ try {
416
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
417
+
418
+ for (const entry of entries) {
419
+ // Skip hidden files and node_modules
420
+ if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
421
+
422
+ const fullPath = path.join(dirPath, entry.name);
423
+ const relativePath = path.relative(basePath, fullPath);
424
+
425
+ if (entry.isDirectory()) {
426
+ const children = await listFilesRecursive(fullPath, basePath);
427
+ items.push({
428
+ name: entry.name,
429
+ path: relativePath,
430
+ type: "folder",
431
+ children,
432
+ });
433
+ } else if (entry.name.endsWith(".md") || entry.name.endsWith(".txt")) {
434
+ items.push({
435
+ name: entry.name,
436
+ path: relativePath,
437
+ type: "file",
438
+ });
439
+ }
440
+ }
441
+ } catch (err) {
442
+ console.error(` ⚠️ Error listing ${dirPath}:`, err.message);
443
+ }
444
+
445
+ // Sort: folders first, then files, alphabetically
446
+ items.sort((a, b) => {
447
+ if (a.type !== b.type) return a.type === "folder" ? -1 : 1;
448
+ return a.name.localeCompare(b.name);
449
+ });
450
+
451
+ return items;
452
+ }
453
+
454
+ function connectRelay(relayUrl, token, gatewayWsUrl, gatewayToken, agentName = "unknown") {
361
455
  console.log(` ☁️ Connecting to Relay...`);
362
456
 
363
457
  const tunnelUrl = `${relayUrl}?type=agent&token=${encodeURIComponent(token)}&name=${encodeURIComponent(agentName)}&version=${encodeURIComponent(CURRENT_VERSION)}&platform=${encodeURIComponent(process.platform)}`;
364
458
  const ws = new WebSocket(tunnelUrl);
365
459
  let gatewayWs = null;
460
+ let gatewayConnected = false;
366
461
  let reconnectTimer = null;
367
462
 
368
463
  const cleanup = () => {
@@ -370,29 +465,75 @@ function connectRelay(relayUrl, token, gatewayWsUrl, agentName = "unknown") {
370
465
  gatewayWs.terminate();
371
466
  gatewayWs = null;
372
467
  }
468
+ gatewayConnected = false;
373
469
  if (reconnectTimer) {
374
470
  clearTimeout(reconnectTimer);
375
471
  reconnectTimer = null;
376
472
  }
377
473
  };
378
474
 
379
- ws.on("open", () => {
380
- console.log(" ✅ Connected to Cloud Relay.");
381
- console.log(" Your agent is now accessible via app.clawpad.io");
382
-
383
- // Connect to Local Gateway
475
+ const connectToGateway = () => {
384
476
  gatewayWs = new WebSocket(gatewayWsUrl);
385
477
 
386
478
  gatewayWs.on("open", () => {
387
- console.log(" 🔗 Connected to Local Gateway.");
479
+ // Gateway is open but we need to wait for connect.challenge
388
480
  });
389
481
 
390
482
  gatewayWs.on("message", (data) => {
391
- // Forward Gateway -> Relay
392
- // SECURITY: Here we could inspect 'data' if needed, but it's encrypted JSON-RPC usually.
393
- // We rely on 'tools.allow' policy for security.
394
- if (ws.readyState === WebSocket.OPEN) {
395
- ws.send(data);
483
+ try {
484
+ const msg = JSON.parse(data.toString());
485
+
486
+ // Handle gateway connect.challenge - authenticate before forwarding
487
+ if (msg.type === "event" && msg.event === "connect.challenge") {
488
+ const connectReq = {
489
+ type: "req",
490
+ id: `connect-${Date.now()}`,
491
+ method: "connect",
492
+ params: {
493
+ minProtocol: 3,
494
+ maxProtocol: 3,
495
+ client: {
496
+ id: "cli",
497
+ version: CURRENT_VERSION,
498
+ platform: process.platform,
499
+ mode: "cli"
500
+ },
501
+ role: "operator",
502
+ scopes: ["operator.read", "operator.write"],
503
+ caps: [],
504
+ commands: [],
505
+ permissions: {},
506
+ auth: gatewayToken ? { token: gatewayToken } : {},
507
+ locale: "en-US",
508
+ userAgent: `clawpad-relay/${CURRENT_VERSION}`
509
+ }
510
+ };
511
+ gatewayWs.send(JSON.stringify(connectReq));
512
+ return;
513
+ }
514
+
515
+ // Handle connect response
516
+ if (msg.type === "res" && msg.ok && msg.payload?.type === "hello-ok") {
517
+ console.log(" 🔗 Connected to Local Gateway.");
518
+ gatewayConnected = true;
519
+ return;
520
+ }
521
+
522
+ // Handle connect error
523
+ if (msg.type === "res" && !msg.ok) {
524
+ console.error(" ❌ Gateway auth failed:", msg.error?.message || "unknown error");
525
+ return;
526
+ }
527
+
528
+ // Forward other messages Gateway -> Relay
529
+ if (gatewayConnected && ws.readyState === WebSocket.OPEN) {
530
+ ws.send(data);
531
+ }
532
+ } catch {
533
+ // Non-JSON or parse error, forward anyway if connected
534
+ if (gatewayConnected && ws.readyState === WebSocket.OPEN) {
535
+ ws.send(data);
536
+ }
396
537
  }
397
538
  });
398
539
 
@@ -400,23 +541,52 @@ function connectRelay(relayUrl, token, gatewayWsUrl, agentName = "unknown") {
400
541
  console.error(" ⚠️ Local Gateway Error:", err.message);
401
542
  });
402
543
 
403
- gatewayWs.on("close", () => {
404
- console.log(" ⚠️ Local Gateway Disconnected. Reconnecting in 5s...");
405
- setTimeout(() => {
406
- if (ws.readyState === WebSocket.OPEN) {
407
- // Re-establish local connection logic could go here or just let it fail until next message
408
- // Ideally we close the tunnel or try to reconnect local
409
- ws.close(); // Force full reconnect cycle
410
- }
411
- }, 5000);
544
+ gatewayWs.on("close", (code, reason) => {
545
+ console.log(` ⚠️ Local Gateway Disconnected (${code}). Will reconnect on relay reconnect.`);
546
+ gatewayConnected = false;
547
+ // Don't reconnect gateway independently - let relay reconnect handle it
412
548
  });
549
+ };
550
+
551
+ ws.on("open", () => {
552
+ console.log(" ✅ Connected to Cloud Relay.");
553
+ console.log(" Your agent is now accessible via app.clawpad.io");
554
+ connectToGateway();
555
+
556
+ // Keep connection alive with pings every 25s
557
+ const pingInterval = setInterval(() => {
558
+ if (ws.readyState === WebSocket.OPEN) {
559
+ ws.ping();
560
+ } else {
561
+ clearInterval(pingInterval);
562
+ }
563
+ }, 25000);
564
+
565
+ ws.on("close", () => clearInterval(pingInterval));
413
566
  });
414
567
 
415
- ws.on("message", (data) => {
416
- // Forward Relay -> Gateway
417
- // SECURITY: Intercept dangerous calls here if we parse JSON-RPC
418
- if (gatewayWs && gatewayWs.readyState === WebSocket.OPEN) {
419
- gatewayWs.send(data);
568
+ ws.on("message", async (data) => {
569
+ try {
570
+ const msg = JSON.parse(data.toString());
571
+
572
+ // Handle local RPC methods (files, etc.)
573
+ if (msg.type === "req" && msg.method) {
574
+ const response = await handleLocalRpc(msg);
575
+ if (response) {
576
+ ws.send(JSON.stringify(response));
577
+ return;
578
+ }
579
+ }
580
+
581
+ // Forward other messages Relay -> Gateway
582
+ if (gatewayWs && gatewayWs.readyState === WebSocket.OPEN && gatewayConnected) {
583
+ gatewayWs.send(data);
584
+ }
585
+ } catch {
586
+ // Non-JSON, forward to gateway
587
+ if (gatewayWs && gatewayWs.readyState === WebSocket.OPEN && gatewayConnected) {
588
+ gatewayWs.send(data);
589
+ }
420
590
  }
421
591
  });
422
592
 
@@ -427,7 +597,7 @@ function connectRelay(relayUrl, token, gatewayWsUrl, agentName = "unknown") {
427
597
  ws.on("close", () => {
428
598
  console.log(" ❌ Disconnected from Relay. Reconnecting in 5s...");
429
599
  cleanup();
430
- reconnectTimer = setTimeout(() => connectRelay(relayUrl, token, gatewayWsUrl), 5000);
600
+ reconnectTimer = setTimeout(() => connectRelay(relayUrl, token, gatewayWsUrl, gatewayToken, agentName), 5000);
431
601
  });
432
602
  }
433
603
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clawpad",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "A file-based, Notion-style document workspace for OpenClaw",
5
5
  "keywords": [
6
6
  "openclaw",