sealkeep 0.7.1 → 0.7.2

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 (3) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/package.json +1 -1
  3. package/web/app.js +31 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  Notable changes, by published version. Sealkeep is pre-1.0: minor versions
4
4
  may change behavior, and say so here when they do.
5
5
 
6
+ ## 0.7.2 — 2026-08-20
7
+
8
+ - Sharing is findable: the vault view offers **Share…** beside Restore. The
9
+ bundle is minted by the agent, not the browser — building one re-wraps the
10
+ archive key under a passcode, which needs the recovery phrase this API
11
+ deliberately never touches, the same reason Restore hands over a command.
12
+ - `docs/sharing-b2c-b2b.md` records the split: what the one-person hand-off
13
+ does today (verified end to end), and what a company sharing a project on its
14
+ own storage actually costs to build.
15
+
6
16
  ## 0.7.1 — 2026-08-20
7
17
 
8
18
  The dashboard and the account panel are one design system again.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sealkeep",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "type": "module",
5
5
  "description": "Sealkeep by SPALA AI \u2014 your AI coding-agent history, sealed, searchable, and shared across your machines.",
6
6
  "license": "SEE LICENSE IN LICENSE",
package/web/app.js CHANGED
@@ -410,6 +410,36 @@ function renderQueue(queue, retention) {
410
410
  * command, filled in, so "how do I get this back" is a paste instead of a
411
411
  * manual.
412
412
  */
413
+ /**
414
+ * Sharing, offered where the archives are. The bundle itself is made by the
415
+ * agent, not by this page: building one re-wraps the archive key under a
416
+ * passcode, which needs the recovery phrase, and this API deliberately never
417
+ * touches it — the same reason Restore hands over a command instead of a file.
418
+ * What the page can do is make the feature findable and get the command right,
419
+ * including the destination and the warning that the passcode travels
420
+ * separately.
421
+ */
422
+ function shareButton(archive) {
423
+ const hand = document.createElement("button");
424
+ hand.type = "button";
425
+ hand.className = "action";
426
+ hand.textContent = "Share…";
427
+ hand.title = "Copies the command that seals this session into a bundle only a passcode opens";
428
+ hand.onclick = async () => {
429
+ const name = (archive.path || archive.id).split("/").pop().replace(/\.jsonl$/, "");
430
+ const command = `sealkeep share ${archive.id} --out ~/Desktop/${name}.vlshare`;
431
+ try {
432
+ await navigator.clipboard.writeText(command);
433
+ hand.textContent = "Command copied";
434
+ setStatus("Run it in a terminal — it prints a passcode. Send the bundle and the passcode by different routes; neither opens anything alone.", "");
435
+ } catch {
436
+ hand.textContent = command;
437
+ }
438
+ setTimeout(() => { hand.textContent = "Share…"; }, 6000);
439
+ };
440
+ return hand;
441
+ }
442
+
413
443
  function restoreButton(archive) {
414
444
  const hand = document.createElement("button");
415
445
  hand.type = "button";
@@ -625,7 +655,7 @@ function renderArchives(archives, retention) {
625
655
  }
626
656
 
627
657
  const act = row.insertCell();
628
- act.append(restoreButton(archive));
658
+ act.append(restoreButton(archive), shareButton(archive));
629
659
 
630
660
  // "Is my backup really there?" — asked of the storage, right now, not of
631
661
  // our own records. The answer arrives as a sentence on the status line