sealkeep 0.8.1 → 0.11.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/ARCHITECTURE.md +163 -14
- package/CHANGELOG.md +244 -1
- package/CONTROL_PLANE.md +2 -2
- package/LICENSE +1 -1
- package/README.md +108 -22
- package/THIRD_PARTY.md +2 -2
- package/THREAT_MODEL.md +23 -4
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/chunk-access.d.ts +26 -4
- package/dist/packages/sealkeep-crypto/src/chunk-access.js +219 -0
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/envelope.d.ts +11 -1
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/envelope.js +58 -21
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/format.d.ts +2 -2
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/index.d.ts +1 -0
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/index.js +1 -0
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/recipients.js +4 -4
- package/dist/packages/sealkeep-crypto/src/squeeze.d.ts +6 -0
- package/dist/packages/sealkeep-crypto/src/squeeze.js +39 -0
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/stream.d.ts +36 -3
- package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/stream.js +196 -37
- package/dist/site/index.html +1808 -1904
- package/dist/site/llms.txt +67 -0
- package/dist/site/trust/architecture-data-flow.html +53 -0
- package/dist/site/trust/audit-roadmap.html +37 -0
- package/dist/site/trust/deployment-responsibility.html +11 -0
- package/dist/site/trust/dpa-sample.html +30 -0
- package/dist/site/trust/release-provenance.html +21 -0
- package/dist/site/trust/subprocessors.html +15 -0
- package/dist/site/trust/threat-model.html +34 -0
- package/dist/site/trust/toms.html +41 -0
- package/dist/site/trust-document.css +32 -0
- package/dist/site/trust.html +73 -0
- package/dist/site/visual/assets/index-8Nxnkc7o.js +207 -0
- package/dist/site/visual/assets/index-oxLy1bpy.css +1 -0
- package/dist/site/visual/index.html +18 -0
- package/dist/site.zip +0 -0
- package/dist/src/activity.d.ts +9 -0
- package/dist/src/activity.js +90 -1
- package/dist/src/adapters.d.ts +175 -5
- package/dist/src/adapters.js +961 -73
- package/dist/src/agent-context.d.ts +135 -0
- package/dist/src/agent-context.js +1059 -0
- package/dist/src/archive-copies.d.ts +47 -0
- package/dist/src/archive-copies.js +179 -0
- package/dist/src/audit.d.ts +1 -1
- package/dist/src/audit.js +29 -4
- package/dist/src/autopilot.d.ts +52 -7
- package/dist/src/autopilot.js +143 -25
- package/dist/src/background-bandwidth.d.ts +46 -0
- package/dist/src/background-bandwidth.js +301 -0
- package/dist/src/background-cpu.d.ts +82 -0
- package/dist/src/background-cpu.js +212 -0
- package/dist/src/background-worker-error.d.ts +12 -0
- package/dist/src/background-worker-error.js +18 -0
- package/dist/src/branding.d.ts +24 -1
- package/dist/src/branding.js +31 -1
- package/dist/src/bridge.d.ts +233 -0
- package/dist/src/bridge.js +604 -0
- package/dist/src/byte-stream.d.ts +91 -0
- package/dist/src/byte-stream.js +385 -0
- package/dist/src/chunk-store.d.ts +41 -8
- package/dist/src/chunk-store.js +161 -65
- package/dist/src/cli.js +1746 -166
- package/dist/src/cloud.d.ts +841 -31
- package/dist/src/cloud.js +3196 -277
- package/dist/src/context-background.d.ts +37 -0
- package/dist/src/context-background.js +309 -0
- package/dist/src/context-drain-child.d.ts +1 -0
- package/dist/src/context-drain-child.js +98 -0
- package/dist/src/context-reader.d.ts +118 -0
- package/dist/src/context-reader.js +447 -0
- package/dist/src/control-plane/auth.d.ts +32 -4
- package/dist/src/control-plane/auth.js +85 -24
- package/dist/src/control-plane/server.js +19 -6
- package/dist/src/control-plane.d.ts +17 -1
- package/dist/src/control-plane.js +32 -6
- package/dist/src/crypto.d.ts +1 -1
- package/dist/src/crypto.js +5 -5
- package/dist/src/daemon-lease.d.ts +70 -0
- package/dist/src/daemon-lease.js +420 -0
- package/dist/src/daemon.d.ts +94 -1
- package/dist/src/daemon.js +1082 -105
- package/dist/src/darwin-service-policy.d.ts +41 -0
- package/dist/src/darwin-service-policy.js +60 -0
- package/dist/src/dashboard-cli.js +15 -15
- package/dist/src/device-authorization.d.ts +37 -0
- package/dist/src/device-authorization.js +199 -0
- package/dist/src/device-enrollment.d.ts +91 -0
- package/dist/src/device-enrollment.js +349 -0
- package/dist/src/disk.d.ts +17 -12
- package/dist/src/disk.js +43 -17
- package/dist/src/doctor.d.ts +35 -1
- package/dist/src/doctor.js +316 -41
- package/dist/src/durable-ticket-lock.d.ts +24 -0
- package/dist/src/durable-ticket-lock.js +232 -0
- package/dist/src/enroll.d.ts +1 -1
- package/dist/src/enroll.js +13 -7
- package/dist/src/env.d.ts +10 -1
- package/dist/src/env.js +11 -3
- package/dist/src/errors.d.ts +8 -8
- package/dist/src/errors.js +6 -6
- package/dist/src/flush.d.ts +12 -0
- package/dist/src/flush.js +37 -0
- package/dist/src/heartbeat.d.ts +86 -12
- package/dist/src/heartbeat.js +415 -29
- package/dist/src/index-background-watchdog.d.ts +1 -0
- package/dist/src/index-background-watchdog.js +94 -0
- package/dist/src/index-background-work.d.ts +21 -0
- package/dist/src/index-background-work.js +25 -0
- package/dist/src/index-background.d.ts +64 -0
- package/dist/src/index-background.js +394 -0
- package/dist/src/index-build-child.d.ts +1 -0
- package/dist/src/index-build-child.js +109 -0
- package/dist/src/index-manifest.d.ts +52 -0
- package/dist/src/index-manifest.js +444 -0
- package/dist/src/index-publication-proof.d.ts +84 -0
- package/dist/src/index-publication-proof.js +380 -0
- package/dist/src/index-publication-state.d.ts +149 -0
- package/dist/src/index-publication-state.js +696 -0
- package/dist/src/index-publication-verifier.d.ts +89 -0
- package/dist/src/index-publication-verifier.js +341 -0
- package/dist/src/index-publish.d.ts +62 -0
- package/dist/src/index-publish.js +540 -0
- package/dist/src/index-scratch-cleanup.d.ts +19 -0
- package/dist/src/index-scratch-cleanup.js +166 -0
- package/dist/src/index-segment-types.d.ts +132 -0
- package/dist/src/index-segment-types.js +21 -0
- package/dist/src/index-segments.d.ts +9 -0
- package/dist/src/index-segments.js +516 -0
- package/dist/src/index-store.d.ts +123 -0
- package/dist/src/index-store.js +495 -0
- package/dist/src/index-sync.d.ts +91 -15
- package/dist/src/index-sync.js +286 -53
- package/dist/src/index-upgrade-publication.d.ts +30 -0
- package/dist/src/index-upgrade-publication.js +179 -0
- package/dist/src/integration-manager.d.ts +32 -0
- package/dist/src/integration-manager.js +394 -0
- package/dist/src/leakscan.js +1 -1
- package/dist/src/local-api.d.ts +56 -15
- package/dist/src/local-api.js +4979 -541
- package/dist/src/machine-settings.d.ts +51 -0
- package/dist/src/machine-settings.js +166 -0
- package/dist/src/managed-chunks.d.ts +5 -2
- package/dist/src/managed-chunks.js +14 -14
- package/dist/src/mcp-install.d.ts +11 -9
- package/dist/src/mcp-install.js +73 -28
- package/dist/src/mcp-workspace.d.ts +18 -0
- package/dist/src/mcp-workspace.js +50 -0
- package/dist/src/mcp.js +294 -25
- package/dist/src/migrate.d.ts +1 -0
- package/dist/src/migrate.js +33 -5
- package/dist/src/notify.d.ts +1 -1
- package/dist/src/notify.js +5 -5
- package/dist/src/offload.d.ts +201 -14
- package/dist/src/offload.js +1848 -140
- package/dist/src/onboarding.d.ts +8 -1
- package/dist/src/onboarding.js +4 -4
- package/dist/src/packages.d.ts +2 -2
- package/dist/src/packages.js +10 -2
- package/dist/src/passkey.d.ts +0 -1
- package/dist/src/passkey.js +2 -7
- package/dist/src/password-lock.d.ts +2 -2
- package/dist/src/password-lock.js +6 -6
- package/dist/src/paths.d.ts +2 -0
- package/dist/src/paths.js +2 -0
- package/dist/src/presence.d.ts +86 -0
- package/dist/src/presence.js +240 -0
- package/dist/src/progress-deadline.d.ts +21 -0
- package/dist/src/progress-deadline.js +91 -0
- package/dist/src/project-repair.d.ts +55 -0
- package/dist/src/project-repair.js +131 -0
- package/dist/src/providers/gcs.d.ts +28 -7
- package/dist/src/providers/gcs.js +35 -24
- package/dist/src/providers/gdrive.d.ts +71 -8
- package/dist/src/providers/gdrive.js +223 -50
- package/dist/src/providers/index.d.ts +11 -3
- package/dist/src/providers/index.js +30 -10
- package/dist/src/providers/s3.d.ts +30 -8
- package/dist/src/providers/s3.js +41 -30
- package/dist/src/providers/safe-storage-fetch.d.ts +12 -0
- package/dist/src/providers/safe-storage-fetch.js +72 -0
- package/dist/src/queue.d.ts +136 -19
- package/dist/src/queue.js +862 -96
- package/dist/src/reclaim-transaction.d.ts +156 -0
- package/dist/src/reclaim-transaction.js +1027 -0
- package/dist/src/recovery-codes.d.ts +32 -0
- package/dist/src/recovery-codes.js +338 -0
- package/dist/src/recovery.js +12 -9
- package/dist/src/rehydrate.d.ts +25 -22
- package/dist/src/rehydrate.js +319 -23
- package/dist/src/restore.d.ts +57 -4
- package/dist/src/restore.js +272 -36
- package/dist/src/resume-stub.d.ts +92 -0
- package/dist/src/resume-stub.js +417 -0
- package/dist/src/retention.d.ts +98 -7
- package/dist/src/retention.js +1066 -62
- package/dist/src/rotate.js +3 -3
- package/dist/src/search.d.ts +566 -8
- package/dist/src/search.js +5897 -290
- package/dist/src/secrets.d.ts +51 -7
- package/dist/src/secrets.js +316 -24
- package/dist/src/service.d.ts +49 -11
- package/dist/src/service.js +776 -35
- package/dist/src/share.js +3 -3
- package/dist/src/shared-spaces.d.ts +98 -0
- package/dist/src/shared-spaces.js +214 -0
- package/dist/src/source-reader.d.ts +73 -0
- package/dist/src/source-reader.js +715 -0
- package/dist/src/spool.d.ts +1 -1
- package/dist/src/spool.js +1 -1
- package/dist/src/start-tui.js +2 -1
- package/dist/src/start.js +2 -2
- package/dist/src/storage-endpoint.d.ts +21 -0
- package/dist/src/storage-endpoint.js +122 -0
- package/dist/src/storage-setup.js +12 -12
- package/dist/src/storage-targets.d.ts +109 -6
- package/dist/src/storage-targets.js +975 -67
- package/dist/src/stream-to-cloud.d.ts +5 -1
- package/dist/src/stream-to-cloud.js +34 -14
- package/dist/src/sync-rules.d.ts +31 -6
- package/dist/src/sync-rules.js +153 -14
- package/dist/src/team-backfill-scheduling.d.ts +8 -0
- package/dist/src/team-backfill-scheduling.js +33 -0
- package/dist/src/team-backfill.d.ts +116 -0
- package/dist/src/team-backfill.js +1429 -0
- package/dist/src/team-index-cache.d.ts +16 -0
- package/dist/src/team-index-cache.js +152 -0
- package/dist/src/team-offboarding.d.ts +38 -0
- package/dist/src/team-offboarding.js +1043 -0
- package/dist/src/team-presence.d.ts +127 -0
- package/dist/src/team-presence.js +904 -0
- package/dist/src/team-publication-policy.d.ts +20 -0
- package/dist/src/team-publication-policy.js +140 -0
- package/dist/src/team-realtime.d.ts +68 -0
- package/dist/src/team-realtime.js +816 -0
- package/dist/src/team-source-facts-cache.d.ts +23 -0
- package/dist/src/team-source-facts-cache.js +255 -0
- package/dist/src/trash.d.ts +1 -1
- package/dist/src/trash.js +2 -2
- package/dist/src/tui.js +11 -12
- package/dist/src/types.d.ts +173 -7
- package/dist/src/types.js +20 -0
- package/dist/src/ui-server.d.ts +163 -35
- package/dist/src/ui-server.js +712 -72
- package/dist/src/ui.d.ts +1 -2
- package/dist/src/ui.js +1 -2
- package/dist/src/upload.d.ts +27 -0
- package/dist/src/upload.js +383 -43
- package/dist/src/vault.d.ts +235 -29
- package/dist/src/vault.js +1783 -190
- package/dist/src/watcher.d.ts +7 -1
- package/dist/src/watcher.js +198 -55
- package/dist/src/worker.d.ts +27 -3
- package/dist/src/worker.js +274 -55
- package/package.json +33 -12
- package/scripts/native-reboot-rehearsal.mjs +90 -0
- package/web/app.js +6032 -343
- package/web/bootstrap.js +17 -0
- package/web/index.html +255 -57
- package/web/rail.js +317 -40
- package/web/retention.html +2 -2
- package/web/rules-view.js +188 -16
- package/web/sessions-view.js +485 -62
- package/web/sessions.html +2 -2
- package/web/setup-api.js +152 -29
- package/web/setup-logic.js +68 -9
- package/web/setup.html +113 -44
- package/web/setup.js +604 -71
- package/web/style.css +513 -98
- package/dist/packages/vaultline-crypto/src/chunk-access.js +0 -93
- /package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/aead.d.ts +0 -0
- /package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/aead.js +0 -0
- /package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/format.js +0 -0
- /package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/recipients.d.ts +0 -0
- /package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/sha256-stream.d.ts +0 -0
- /package/dist/packages/{vaultline-crypto → sealkeep-crypto}/src/sha256-stream.js +0 -0
package/web/bootstrap.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// A same-origin, top-level navigation has already passed the server's Fetch
|
|
2
|
+
// Metadata checks. Preserve its view fragment before replacing it with the
|
|
3
|
+
// short-lived sign-in ticket. Never put that ticket in a query string.
|
|
4
|
+
(() => {
|
|
5
|
+
const ticket = document.body.dataset.bootstrapTicket;
|
|
6
|
+
const target = new URL(document.body.dataset.bootstrapTarget, location.origin);
|
|
7
|
+
if (!ticket || target.origin !== location.origin || !['/index.html', '/setup.html'].includes(target.pathname)) return;
|
|
8
|
+
const raw = location.hash.replace(/^#/, '');
|
|
9
|
+
const previous = new URLSearchParams(raw);
|
|
10
|
+
const view = previous.has('ticket') ? previous.get('view') || '' : raw;
|
|
11
|
+
const safeView = view.length <= 1024 && /^(?:overview|sessions|queue|archives|restore|retention|rules|settings|health|live|shared(?:\?project=[A-Za-z0-9%._~-]+)?|cleanup-review|recovery-access|agent-settings|resource-settings|cleanup-settings|recovery-kit|recovery-phrase|automatic-archiving|google-drive|storage-targets)$/.test(view);
|
|
12
|
+
const fragment = new URLSearchParams({ ticket });
|
|
13
|
+
if (safeView) fragment.set('view', view);
|
|
14
|
+
target.hash = fragment.toString();
|
|
15
|
+
document.body.removeAttribute('data-bootstrap-ticket');
|
|
16
|
+
location.replace(target.href);
|
|
17
|
+
})();
|
package/web/index.html
CHANGED
|
@@ -55,7 +55,10 @@
|
|
|
55
55
|
</head>
|
|
56
56
|
<body>
|
|
57
57
|
<aside>
|
|
58
|
-
<div class="brand"
|
|
58
|
+
<div class="brand-block">
|
|
59
|
+
<div class="brand"><span>⌑</span>Sealkeep</div>
|
|
60
|
+
<div class="surface-refresh" id="rail-refresh-state" role="status" aria-live="polite" hidden><span class="surface-spinner"></span>Updating</div>
|
|
61
|
+
</div>
|
|
59
62
|
|
|
60
63
|
<!-- The identity strip is always first (design-system: components/cards.html):
|
|
61
64
|
who this vault belongs to, what they pay for, and how much of it is used —
|
|
@@ -73,6 +76,7 @@
|
|
|
73
76
|
<li id="acct-phrase"><span class="dot"></span><span class="acct-fact-text" id="acct-phrase-text">—</span></li>
|
|
74
77
|
<li id="acct-storage"><span class="dot"></span><span class="acct-fact-text" id="acct-storage-text">—</span></li>
|
|
75
78
|
<li id="acct-disk"><span class="dot"></span><span class="acct-fact-text" id="acct-disk-text">—</span></li>
|
|
79
|
+
<li id="acct-escrow" hidden><span class="dot"></span><span class="acct-fact-text" id="acct-escrow-text">—</span></li>
|
|
76
80
|
</ul>
|
|
77
81
|
<div class="acct-door-slot" id="acct-door-slot"></div>
|
|
78
82
|
</div>
|
|
@@ -83,14 +87,16 @@
|
|
|
83
87
|
between "pick what to archive" and anywhere else a full reload. The
|
|
84
88
|
list mounts on first entry and stays mounted — switching back is
|
|
85
89
|
instant. -->
|
|
86
|
-
<button data-view="sessions"><span class="glyph">◱</span>
|
|
87
|
-
<button data-view="queue"><span class="glyph">◴</span>
|
|
90
|
+
<button data-view="sessions"><span class="glyph">◱</span>Sessions</button>
|
|
91
|
+
<button data-view="queue"><span class="glyph">◴</span>Backup activity<span class="count" id="count-queue"></span></button>
|
|
88
92
|
<button data-view="archives"><span class="glyph">▣</span>My vault<span class="count" id="count-archives"></span></button>
|
|
93
|
+
<button data-view="live"><span class="glyph">◉</span>Live</button>
|
|
94
|
+
<button data-view="shared"><span class="glyph">◎</span>Shared projects</button>
|
|
95
|
+
<button data-view="health"><span class="glyph">⚙</span>Health<span class="count" id="count-health"></span></button>
|
|
89
96
|
<button data-view="settings"><span class="glyph">◧</span>Settings</button>
|
|
90
97
|
<!-- Badged like Queue and Archives. It was the one nav item without a
|
|
91
98
|
count, on a product where "if this machine is lost, so is every
|
|
92
99
|
archive on it" is a Health warning. -->
|
|
93
|
-
<button data-view="health"><span class="glyph">⚙</span>Health<span class="count" id="count-health"></span></button>
|
|
94
100
|
</nav>
|
|
95
101
|
|
|
96
102
|
<div class="privacy">
|
|
@@ -101,29 +107,35 @@
|
|
|
101
107
|
|
|
102
108
|
<main>
|
|
103
109
|
<header>
|
|
104
|
-
<
|
|
110
|
+
<div class="headline-row">
|
|
111
|
+
<h1 id="headline">Your agent history</h1>
|
|
112
|
+
<div class="surface-refresh" id="page-refresh-state" role="status" aria-live="polite" hidden><span class="surface-spinner"></span>Updating</div>
|
|
113
|
+
</div>
|
|
105
114
|
<p class="lede" id="lede">Reading live state from the Sealkeep agent on this machine.</p>
|
|
106
115
|
<p class="pill busy" id="connection">Connecting</p>
|
|
107
116
|
<p class="pill" id="daemon" hidden></p>
|
|
108
117
|
</header>
|
|
109
118
|
|
|
110
119
|
<section id="gate" class="panel gate pad" hidden>
|
|
111
|
-
<h2>
|
|
112
|
-
<p class="note">
|
|
120
|
+
<h2>Open Sealkeep securely</h2>
|
|
121
|
+
<p class="note">Confirm that you want this tab to open this computer's Sealkeep dashboard. Your recovery key stays on this computer; nothing needs to be pasted.</p>
|
|
122
|
+
<a id="gate-open-local" class="primary" href="./index.html?open_local=1">Open this computer's dashboard</a>
|
|
113
123
|
<form id="token-form">
|
|
114
|
-
<
|
|
115
|
-
<button type="submit" class="action">Connect</button>
|
|
124
|
+
<button type="submit" class="action">Ask another Sealkeep tab for access</button>
|
|
116
125
|
</form>
|
|
117
126
|
<p id="gate-error" class="error" hidden></p>
|
|
118
127
|
</section>
|
|
119
128
|
|
|
120
129
|
<div id="app" hidden>
|
|
121
130
|
<section id="view-overview" class="view">
|
|
131
|
+
<div id="home-decisions" class="home-decisions" aria-label="Backup, disk and recovery status"><p class="note">Checking backup status. Your existing files are unchanged.</p></div>
|
|
132
|
+
<details class="page-details">
|
|
133
|
+
<summary>Storage totals and technical details</summary>
|
|
122
134
|
<div class="metrics">
|
|
123
135
|
<div class="metric"><h3>Sessions preserved</h3><b id="m-archives">–</b><small id="m-bytes"></small></div>
|
|
124
136
|
<div class="metric"><h3>Waiting</h3><b id="m-queue">–</b><small id="m-queue-detail"></small></div>
|
|
125
137
|
<div class="metric"><h3>Off this machine</h3><b id="m-remote" class="small">–</b><small id="m-remote-hint"></small></div>
|
|
126
|
-
<div class="metric"><h3>
|
|
138
|
+
<div class="metric"><h3>Originals eligible for cleanup</h3><b id="m-reclaim">–</b><small id="m-policy"></small></div>
|
|
127
139
|
</div>
|
|
128
140
|
|
|
129
141
|
<!-- The signature device: the same rule the product is named after, with live numbers on both sides. -->
|
|
@@ -133,8 +145,11 @@
|
|
|
133
145
|
<span class="side sealed" id="boundary-below"></span>
|
|
134
146
|
</div>
|
|
135
147
|
<p class="note" id="boundary-note">Everything below this line is ciphertext. Nothing above it leaves this machine.</p>
|
|
148
|
+
<p class="note">Sessions are conversations. A conversation can have several archive versions. Versioned source history is not the amount currently occupying your disk.</p>
|
|
149
|
+
</details>
|
|
136
150
|
|
|
137
|
-
<h2>
|
|
151
|
+
<h2>Detected agent folders</h2>
|
|
152
|
+
<p class="note">Finding a folder does not confirm that memory capture or search is working. <a href="#health">Check agent memory connections</a>.</p>
|
|
138
153
|
<div class="panel" id="agents"></div>
|
|
139
154
|
</section>
|
|
140
155
|
|
|
@@ -149,8 +164,8 @@
|
|
|
149
164
|
<p class="note" id="retention-summary"></p>
|
|
150
165
|
</div>
|
|
151
166
|
<div class="actions">
|
|
152
|
-
<button id="upload" class="action" type="button">
|
|
153
|
-
<button id="reclaim" class="action danger" type="button" disabled>
|
|
167
|
+
<button id="upload" class="action" type="button">Send waiting archives</button>
|
|
168
|
+
<button id="reclaim" class="action danger" type="button" disabled>Free up disk</button>
|
|
154
169
|
</div>
|
|
155
170
|
</div>
|
|
156
171
|
<div id="upload-progress" hidden>
|
|
@@ -160,10 +175,19 @@
|
|
|
160
175
|
<button id="upload-cancel" class="action" type="button">Stop after this archive</button>
|
|
161
176
|
</div>
|
|
162
177
|
</div>
|
|
163
|
-
<p class="note">The button
|
|
178
|
+
<p class="note">The button permanently removes only originals whose exact remote copy and search entry are ready, grace period has passed, bytes are unchanged, and no agent is using the file. Encrypted archives remain available; Codex keeps a tiny same-session resume pointer.</p>
|
|
164
179
|
<p class="note"><a href="#rules">Edit the rules that decide what becomes eligible →</a></p>
|
|
165
180
|
</div>
|
|
166
181
|
<div class="panel pad" id="automation-panel" style="margin-top:var(--gap)" hidden></div>
|
|
182
|
+
<div class="panel pad callout warn" id="queue-attention" style="margin-top:var(--gap)" role="status" hidden>
|
|
183
|
+
<div class="row">
|
|
184
|
+
<div>
|
|
185
|
+
<h3 id="queue-attention-title">Automatic archiving needs attention</h3>
|
|
186
|
+
<p class="note" id="queue-attention-detail"></p>
|
|
187
|
+
</div>
|
|
188
|
+
<a class="action" id="queue-attention-action" href="#automatic-archiving">Fix automatic archiving</a>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
167
191
|
<div class="panel" id="queue-panel" style="margin-top:var(--gap)"></div>
|
|
168
192
|
</section>
|
|
169
193
|
|
|
@@ -171,84 +195,143 @@
|
|
|
171
195
|
<!-- The library: folders of sessions, every verb on its row. The
|
|
172
196
|
automatic side (uploads, rules-driven reclaim) lives with the Queue,
|
|
173
197
|
where work in motion belongs. -->
|
|
198
|
+
<p class="vault-refresh loading" id="archive-refresh-state" role="status" aria-live="polite" hidden></p>
|
|
174
199
|
<div class="panel" id="archives-panel"></div>
|
|
175
200
|
<div class="panel pad" style="margin-top:var(--gap)">
|
|
176
|
-
<p class="note"><b>If this machine is lost:</b> your recovery phrase
|
|
201
|
+
<p class="note"><b>If this machine is lost:</b> sign in to your Sealkeep account and unlock your vault with your recovery phrase or a usable Recovery Kit backup code. Account sign-in alone cannot decrypt your archives. Google Drive sign-in alone cannot rediscover Drive-only archives; restoring those also needs Sealkeep's local catalog from another machine or backup. Keep your Recovery Kit somewhere other than this computer. Under a <i>Keep everything</i> policy, Free up disk keeps your originals; change this machine's retention settings before reviewing cleanup.</p>
|
|
177
202
|
</div>
|
|
178
203
|
</section>
|
|
179
204
|
|
|
180
205
|
<section id="view-settings" class="view" hidden>
|
|
206
|
+
<p id="settings-load-state" class="note" role="status">Loading this computer's saved settings. Changes cannot be saved until they arrive.</p>
|
|
181
207
|
<div class="metrics">
|
|
182
208
|
<div class="metric"><h3>Waiting to encrypt</h3><b id="set-queue">–</b><small id="set-queue-detail"></small></div>
|
|
183
209
|
<div class="metric"><h3>Last checked in</h3><b id="set-sync" class="small">–</b><small id="set-sync-ago"></small></div>
|
|
184
210
|
<div class="metric"><h3>Sessions preserved</h3><b id="set-archives">–</b><small>on this machine</small></div>
|
|
185
|
-
<div class="metric"><h3>
|
|
211
|
+
<div class="metric"><h3 id="set-reclaim-label">Automatic reclaim</h3><b id="set-reclaim-window" class="small">–</b><small id="set-reclaim-detail"></small></div>
|
|
186
212
|
</div>
|
|
187
213
|
|
|
188
214
|
<form id="settings-form">
|
|
189
215
|
<div class="panel pad">
|
|
190
|
-
<h3>
|
|
216
|
+
<h3 id="machine-identity">This computer's name</h3>
|
|
191
217
|
<div class="field">
|
|
192
218
|
<label for="f-device-label">Device label</label>
|
|
193
219
|
<input id="f-device-label" type="text" maxlength="80" autocomplete="off" spellcheck="false" placeholder="this machine's name">
|
|
194
220
|
</div>
|
|
195
221
|
|
|
196
|
-
<h3>
|
|
222
|
+
<h3 id="machine-agents">Agents and excluded files</h3>
|
|
197
223
|
<div class="field">
|
|
198
224
|
<label class="opt"><input id="f-watch-codex" type="checkbox"> Codex</label>
|
|
199
225
|
<label class="opt"><input id="f-watch-claude" type="checkbox"> Claude Code</label>
|
|
200
226
|
</div>
|
|
201
227
|
<div class="field">
|
|
202
|
-
<label for="f-
|
|
203
|
-
<textarea id="f-
|
|
228
|
+
<label for="f-exclusions">Transcript storage paths to skip, one per line</label>
|
|
229
|
+
<textarea id="f-exclusions" rows="3" spellcheck="false" placeholder="~/.codex/sessions/private/**"></textarea>
|
|
230
|
+
<p class="note">A folder path skips that whole folder; <code>*</code>, <code>**</code>, and <code>?</code> patterns work too. Sealkeep currently watches only the standard Codex and Claude Code session stores shown above.</p>
|
|
231
|
+
</div>
|
|
232
|
+
|
|
233
|
+
<h3>Storage connections on this computer</h3>
|
|
234
|
+
<div class="field" id="storage-targets-panel">
|
|
235
|
+
<div id="storage-targets-rows"><p class="note">Loading destinations…</p></div>
|
|
236
|
+
<p class="note error" id="storage-targets-error" hidden></p>
|
|
237
|
+
<p class="note">This computer follows your account's storage order. Connect or disconnect this machine below. <a href="https://sealkeep.spala.ai/?view=storage#account" target="_blank" rel="noopener">Manage destinations, priorities and project rules in SealKeep Cloud</a>.</p>
|
|
204
238
|
</div>
|
|
239
|
+
|
|
205
240
|
<div class="field">
|
|
206
|
-
<label for="f-
|
|
207
|
-
<
|
|
241
|
+
<label for="f-local-archive-cache-days">Keep recent encrypted archive copies on this machine (days)</label>
|
|
242
|
+
<div class="row">
|
|
243
|
+
<input id="f-local-archive-cache-days" type="number" min="0" max="3650" step="1" inputmode="numeric" aria-describedby="f-local-archive-cache-note">
|
|
244
|
+
<label class="opt"><input id="f-local-archive-cache-all" type="checkbox"> Keep every encrypted archive copy here</label>
|
|
245
|
+
</div>
|
|
246
|
+
<p class="note" id="f-local-archive-cache-note">Seven days is recommended. After that, Sealkeep automatically removes only the local <code>.skarchive</code> duplicate once a readable cloud or bucket copy is verified. Your original Codex and Claude Code transcript files are separate and are never changed by this setting. Use 0 to remove verified duplicates immediately.</p>
|
|
208
247
|
</div>
|
|
209
248
|
|
|
210
|
-
<h3>Unlocking</h3>
|
|
249
|
+
<h3>Unlocking and recovery</h3>
|
|
211
250
|
<div class="field" id="remember-panel">
|
|
212
251
|
<p class="note" id="remember-state">Checking whether this machine holds the recovery phrase…</p>
|
|
213
252
|
<div class="row" id="remember-form" hidden>
|
|
214
|
-
<input id="f-remember-phrase" type="password" autocomplete="off" spellcheck="false" placeholder="your
|
|
253
|
+
<input id="f-remember-phrase" type="password" autocomplete="off" spellcheck="false" placeholder="your recovery phrase — all words, in order" aria-label="Recovery phrase">
|
|
215
254
|
<button type="button" class="action" id="remember-go">Remember it on this machine</button>
|
|
216
255
|
</div>
|
|
217
256
|
<p class="note error" id="remember-error" hidden></p>
|
|
218
|
-
<p class="note">
|
|
257
|
+
<p class="note">Checked against the vault, then kept only in this machine's keychain — it goes to the Sealkeep agent on 127.0.0.1 and never off this machine.</p>
|
|
258
|
+
<div class="row" id="reveal-row" hidden>
|
|
259
|
+
<button type="button" class="action" id="reveal-go">Reveal recovery phrase</button>
|
|
260
|
+
</div>
|
|
261
|
+
<textarea id="reveal-phrase" readonly rows="3" hidden spellcheck="false" aria-label="Recovery phrase"></textarea>
|
|
262
|
+
<p class="note" id="reveal-warning" hidden>Write these words down and put them somewhere safe — anyone who sees them can open every archive. They hide again in a minute, and each reveal is written to this vault's audit log.</p>
|
|
263
|
+
<div class="panel pad recovery-access" id="recovery-access-panel" style="margin-top:.8rem">
|
|
264
|
+
<b>Recovery access</b>
|
|
265
|
+
<p class="note">Check whether the recovery phrase is saved here and backup codes are registered. This does not test an archive restore. Keep your downloaded kit somewhere outside this computer; Drive-only history also needs its SealKeep catalog.</p>
|
|
266
|
+
<div class="row">
|
|
267
|
+
<button type="button" class="action primary" id="recovery-access-check">Check my recovery access</button>
|
|
268
|
+
</div>
|
|
269
|
+
<p class="note" id="recovery-access-keychain">Keychain: checking whether this machine holds its recovery phrase…</p>
|
|
270
|
+
<p class="note" id="recovery-access-cloud">Cloud Recovery Kit: checking…</p>
|
|
271
|
+
<p class="pill" id="recovery-access-status" role="status" aria-live="polite" hidden></p>
|
|
272
|
+
<div id="recovery-access-form" hidden>
|
|
273
|
+
<p class="note">Recover this machine from a saved Recovery Kit. The file stays in this tab; its candidates are checked one at a time by the local agent.</p>
|
|
274
|
+
<div class="field">
|
|
275
|
+
<label for="recovery-access-file">Choose a saved Recovery Kit (.txt)</label>
|
|
276
|
+
<input id="recovery-access-file" type="file" accept=".txt,text/plain" autocomplete="off">
|
|
277
|
+
</div>
|
|
278
|
+
<div class="row">
|
|
279
|
+
<label for="recovery-access-code">Or paste one backup code</label>
|
|
280
|
+
<input id="recovery-access-code" type="password" autocomplete="off" spellcheck="false" placeholder="SK-XXXX-XXXX-XXXX-XXXX-XXXX-XXXX-XX" aria-label="Backup recovery code">
|
|
281
|
+
<button type="button" class="action primary" id="recovery-access-go">Recover this machine</button>
|
|
282
|
+
</div>
|
|
283
|
+
<p class="note error" id="recovery-access-error" hidden></p>
|
|
284
|
+
</div>
|
|
285
|
+
</div>
|
|
286
|
+
<div class="panel pad" id="recovery-kit-panel" style="margin-top:.8rem">
|
|
287
|
+
<b>Backup Recovery Kit</b>
|
|
288
|
+
<p class="note" id="recovery-kit-state">Checking your Recovery Kit…</p>
|
|
289
|
+
<div class="row">
|
|
290
|
+
<button type="button" class="action" id="recovery-kit-create">Generate backup codes</button>
|
|
291
|
+
<button type="button" class="action" id="recovery-kit-download" hidden>Download these codes</button>
|
|
292
|
+
<a class="action" id="recovery-kit-account" href="#recovery-kit" target="_blank" rel="noopener" hidden>Reconnect account</a>
|
|
293
|
+
</div>
|
|
294
|
+
<ol class="plain" id="recovery-kit-codes" hidden></ol>
|
|
295
|
+
<p class="note error" id="recovery-kit-error" hidden></p>
|
|
296
|
+
<p class="note">Five one-time codes can restore this vault after Google sign-in when every trusted machine is gone. Creating a new set invalidates the previous set. Codes are shown once and never sent to SealKeep Cloud.</p>
|
|
297
|
+
</div>
|
|
298
|
+
</div>
|
|
299
|
+
|
|
300
|
+
<h3>Approve a new machine</h3>
|
|
301
|
+
<div class="field" id="device-enrollment-panel">
|
|
302
|
+
<p class="note" id="device-enrollment-empty">Checking for machines waiting for access…</p>
|
|
303
|
+
<div id="device-enrollment-list"></div>
|
|
304
|
+
<p class="note error" id="device-enrollment-error" hidden></p>
|
|
305
|
+
<p class="note">A new machine shows a six-digit comparison code. Type that same code here to approve it. This machine encrypts the vault identity directly to the new machine; SealKeep Cloud relays ciphertext and never receives your recovery phrase.</p>
|
|
219
306
|
</div>
|
|
220
307
|
|
|
221
308
|
<h3>Automatic archiving</h3>
|
|
222
309
|
<div class="field" id="autopilot-panel">
|
|
223
310
|
<p class="note" id="autopilot-state">Checking whether the background service is running…</p>
|
|
311
|
+
<div class="automation-checks" id="autopilot-checks" aria-live="polite"></div>
|
|
224
312
|
<div class="row" id="autopilot-form" hidden>
|
|
225
313
|
<button type="button" class="action" id="autopilot-go">Turn on automatic archiving</button>
|
|
314
|
+
<button type="button" class="action" id="autopilot-unlock" hidden>Store recovery phrase</button>
|
|
226
315
|
</div>
|
|
227
316
|
<p class="note error" id="autopilot-error" hidden></p>
|
|
228
|
-
<p class="note">When on, Sealkeep runs at login and archives new sessions on its own — no terminal, nothing to keep open. Off by default; you can always archive by hand from
|
|
317
|
+
<p class="note">When on, Sealkeep runs at login and archives new sessions on its own — no terminal, nothing to keep open. If it stops checking in, the repair action checks its installation and asks this machine to activate it again. Off by default; you can always archive by hand from <a href="#sessions">Sessions</a>.</p>
|
|
229
318
|
</div>
|
|
230
319
|
|
|
231
|
-
<h3>
|
|
320
|
+
<h3 id="machine-cleanup">Automatic disk cleanup</h3>
|
|
232
321
|
<div class="field">
|
|
233
322
|
<label class="opt"><input id="f-reclaim-enabled" type="checkbox"> Let this machine reclaim disk space on its own</label>
|
|
234
|
-
<p class="note">Off by default. When on,
|
|
235
|
-
</div>
|
|
236
|
-
<div class="field">
|
|
237
|
-
<label for="f-trash-strategy">Trash location</label>
|
|
238
|
-
<select id="f-trash-strategy">
|
|
239
|
-
<option value="auto">Automatic — this machine's own trash</option>
|
|
240
|
-
<option value="macos-trash">macOS Trash</option>
|
|
241
|
-
<option value="xdg-trash">XDG Trash</option>
|
|
242
|
-
<option value="windows-recycle-bin">Windows Recycle Bin</option>
|
|
243
|
-
<option value="vaultline-trash">Sealkeep-owned trash folder</option>
|
|
244
|
-
</select>
|
|
245
|
-
<p class="note" id="f-trash-resolved"></p>
|
|
323
|
+
<p class="note">Off by default. When on, this machine permanently frees only originals whose encrypted archive is verified in storage, searchable, unchanged, idle, and past the grace period. Codex keeps a tiny same-session resume pointer. Policy and timing stay in the <a href="#rules">Free up disk rules</a>.</p>
|
|
246
324
|
</div>
|
|
247
325
|
|
|
248
|
-
<h3>
|
|
326
|
+
<h3 id="machine-resources">Speed and resource limits</h3>
|
|
249
327
|
<div class="row">
|
|
250
328
|
<div class="field"><label for="f-interval">Check every (minutes)</label><input id="f-interval" type="number" min="1" max="1440"></div>
|
|
251
|
-
<div class="field"
|
|
329
|
+
<div class="field">
|
|
330
|
+
<label for="f-bandwidth">Background network limit, Mbps (blank for automatic)</label>
|
|
331
|
+
<input id="f-bandwidth" type="number" min="1" max="100000" step="1" inputmode="numeric" placeholder="automatic · 8 Mbps">
|
|
332
|
+
<p class="note">Automatic shares one 8 Mbps background ceiling across Sealkeep jobs so agent calls, meetings, and normal browsing keep network headroom. This applies to unattended archive and shared-memory transfers on this machine.</p>
|
|
333
|
+
<p class="note">Background sealing, indexing, and memory preparation share a low-priority CPU budget targeting 30% of one CPU core. Short bursts can exceed this target. Large index workers have a 1.5 GB RSS safety limit. Foreground MCP searches are not throttled.</p>
|
|
334
|
+
</div>
|
|
252
335
|
<div class="field">
|
|
253
336
|
<label for="f-reserve">Always keep free, MB (blank for automatic)</label>
|
|
254
337
|
<input id="f-reserve" type="number" min="200" placeholder="automatic">
|
|
@@ -258,7 +341,7 @@
|
|
|
258
341
|
|
|
259
342
|
<div class="row">
|
|
260
343
|
<p class="note" id="settings-saved"></p>
|
|
261
|
-
<div class="actions"><button type="submit" class="action">Save</button></div>
|
|
344
|
+
<div class="actions"><button type="submit" class="action" id="settings-save" disabled>Save machine settings</button></div>
|
|
262
345
|
</div>
|
|
263
346
|
</div>
|
|
264
347
|
</form>
|
|
@@ -297,15 +380,15 @@
|
|
|
297
380
|
through five dropdowns had to be assembled. Chips in the same group
|
|
298
381
|
(ages, sizes, agents) replace each other; groups stack. -->
|
|
299
382
|
<div class="chips" id="chips" role="group" aria-label="Show only">
|
|
300
|
-
<button type="button" class="chip on" data-group="state" data-value="unarchived">
|
|
301
|
-
<button type="button" class="chip" data-group="state" data-value="sealing">Queued to seal</button>
|
|
302
|
-
<button type="button" class="chip" data-group="state" data-value="archived">Already archived</button>
|
|
303
|
-
<!-- Cloud-state chips
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
<button type="button" class="chip
|
|
307
|
-
<button type="button" class="chip
|
|
308
|
-
<
|
|
383
|
+
<button type="button" class="chip on" data-group="state" data-value="unarchived" aria-pressed="true">Ready to archive</button>
|
|
384
|
+
<button type="button" class="chip" data-group="state" data-value="sealing" aria-pressed="false">Queued to seal</button>
|
|
385
|
+
<button type="button" class="chip" data-group="state" data-value="archived" aria-pressed="false">Already archived</button>
|
|
386
|
+
<!-- Cloud-state chips answer whether a session survives losing this
|
|
387
|
+
disk. Any configured storage target makes that useful, including
|
|
388
|
+
free accounts and bring-your-own storage. -->
|
|
389
|
+
<button type="button" class="chip storage-chip" data-group="state" data-value="stored" aria-pressed="false" hidden title="Sessions with a verified copy in configured storage">In storage</button>
|
|
390
|
+
<button type="button" class="chip storage-chip" data-group="state" data-value="unstored" aria-pressed="false" hidden title="Sessions that would be lost with this disk — not yet verified in configured storage">Not in storage yet</button>
|
|
391
|
+
<details class="session-more-filters"><summary>Filter by project, age, size or agent</summary><div class="session-filter-options">
|
|
309
392
|
<button type="button" class="chip" data-group="age" data-value="7">Older than 7 days</button>
|
|
310
393
|
<button type="button" class="chip" data-group="age" data-value="30">Older than 30 days</button>
|
|
311
394
|
<button type="button" class="chip" data-group="age" data-value="90">Older than 90 days</button>
|
|
@@ -315,6 +398,7 @@
|
|
|
315
398
|
<span class="chip-sep"></span>
|
|
316
399
|
<button type="button" class="chip" data-group="agent" data-value="codex">Codex</button>
|
|
317
400
|
<button type="button" class="chip" data-group="agent" data-value="claude">Claude Code</button>
|
|
401
|
+
</div></details>
|
|
318
402
|
</div>
|
|
319
403
|
<div class="filters">
|
|
320
404
|
<input type="search" id="f-search" placeholder="Search paths…" aria-label="Search session paths">
|
|
@@ -336,7 +420,7 @@
|
|
|
336
420
|
<div class="scroll">
|
|
337
421
|
<table>
|
|
338
422
|
<thead><tr>
|
|
339
|
-
<th style="width:2rem"><input type="checkbox" id="all"
|
|
423
|
+
<th style="width:2rem"><input type="checkbox" id="all" aria-label="Select every shown session ready to archive"></th>
|
|
340
424
|
<th class="n">size</th><th class="n">last touched</th><th>project</th><th>session</th><th>state</th>
|
|
341
425
|
</tr></thead>
|
|
342
426
|
<tbody id="rows"><tr><td colspan="6" class="note">Reading sessions…</td></tr></tbody>
|
|
@@ -344,6 +428,7 @@
|
|
|
344
428
|
</div>
|
|
345
429
|
<div class="bar">
|
|
346
430
|
<button type="button" id="archive" class="action primary" disabled>Archive selected</button>
|
|
431
|
+
<button type="button" id="send-archived" class="action" hidden disabled>Send complete sealed shown to storage</button>
|
|
347
432
|
<span id="chosen" class="note"></span>
|
|
348
433
|
</div>
|
|
349
434
|
<p id="result" class="note" style="margin:.8rem 0 0"></p>
|
|
@@ -365,7 +450,7 @@
|
|
|
365
450
|
<label class="opt"><input type="radio" name="policy" value="sync-only">
|
|
366
451
|
<div><b>Upload, but keep the original</b><span>Archives go to storage; nothing is removed from disk.</span></div></label>
|
|
367
452
|
<label class="opt"><input type="radio" name="policy" value="archive-and-reclaim">
|
|
368
|
-
<div><b>Reclaim once safely stored</b><span>
|
|
453
|
+
<div><b>Reclaim once safely stored</b><span>Permanently free the local original after its archive is verified and searchable, unchanged, idle, and past the grace period.</span></div></label>
|
|
369
454
|
<label class="opt"><input type="radio" name="policy" value="manual-approval">
|
|
370
455
|
<div><b>Ask me first</b><span>Sealkeep lists what it would reclaim and waits for approval.</span></div></label>
|
|
371
456
|
</fieldset>
|
|
@@ -377,7 +462,7 @@
|
|
|
377
462
|
<div><label class="f" for="grace">Then wait this long after it is verified (days)</label><input type="number" id="grace" min="0" value="7"></div>
|
|
378
463
|
</div>
|
|
379
464
|
<div class="rowgrid" style="margin-top:.75rem">
|
|
380
|
-
<div><label class="f" for="deleteAfter">
|
|
465
|
+
<div><label class="f" for="deleteAfter">Mark the backup as expired after (days)</label><input type="number" id="deleteAfter" min="0" placeholder="never"><small>Marks it for review; this does not delete it automatically.</small></div>
|
|
381
466
|
<div><label class="f"> </label><span style="font-size:.85rem;color:var(--soft)">Leave empty for never.</span></div>
|
|
382
467
|
</div>
|
|
383
468
|
</fieldset>
|
|
@@ -421,6 +506,13 @@
|
|
|
421
506
|
this view will stop and say so before anything happens.
|
|
422
507
|
</p>
|
|
423
508
|
<p id="copies-line" style="margin:0 0 .9rem">Looking at what is stored off this machine…</p>
|
|
509
|
+
<div id="copies-controls" class="row" hidden style="margin:0 0 .75rem;align-items:center">
|
|
510
|
+
<label class="sr-only" for="copies-filter">Filter stored copies</label>
|
|
511
|
+
<input id="copies-filter" type="search" autocomplete="off" spellcheck="false"
|
|
512
|
+
placeholder="Filter by archive ref or storage…" style="min-width:min(28rem,100%);flex:1">
|
|
513
|
+
<span id="copies-visible" class="note" role="status" aria-live="polite"></span>
|
|
514
|
+
<button type="button" class="action" id="copies-more" hidden>Show 100 more</button>
|
|
515
|
+
</div>
|
|
424
516
|
<div id="copies-wrap">
|
|
425
517
|
<table id="copies-table" hidden>
|
|
426
518
|
<thead><tr><th>Ref</th><th>Size</th><th>Age</th><th></th></tr></thead>
|
|
@@ -444,9 +536,9 @@
|
|
|
444
536
|
</fieldset>
|
|
445
537
|
|
|
446
538
|
<div class="note">
|
|
447
|
-
<strong>Reclaiming
|
|
448
|
-
|
|
449
|
-
|
|
539
|
+
<strong>Reclaiming deletes only the verified local original.</strong> The encrypted archive remains in storage, and a Codex
|
|
540
|
+
session keeps a tiny same-ID resume pointer. Sealkeep permanently frees the original only after remote verification,
|
|
541
|
+
search coverage, age and grace, exact-byte, and idle-file checks all pass. Otherwise it keeps the file.
|
|
450
542
|
</div>
|
|
451
543
|
|
|
452
544
|
<div class="note" id="gap">
|
|
@@ -459,6 +551,112 @@
|
|
|
459
551
|
<section id="view-health" class="view" hidden>
|
|
460
552
|
<div class="panel" id="checks"></div>
|
|
461
553
|
</section>
|
|
554
|
+
|
|
555
|
+
<section id="view-shared" class="view" hidden>
|
|
556
|
+
<div class="panel pad project-suggestions-panel">
|
|
557
|
+
<div class="row project-suggestions-head">
|
|
558
|
+
<div>
|
|
559
|
+
<h2>Suggested from this machine</h2>
|
|
560
|
+
<p class="note">Only the project name is created in SealKeep Cloud. Folder paths stay here on this machine.</p>
|
|
561
|
+
</div>
|
|
562
|
+
<span class="project-local-badge">Local folders</span>
|
|
563
|
+
</div>
|
|
564
|
+
<p class="note warn" id="team-project-plan" hidden>
|
|
565
|
+
Your personal project history is already preserved. Creating a memory pool shared with other people requires the Team plan.
|
|
566
|
+
<a id="team-project-plan-action" href="https://sealkeep.spala.ai/?view=plan#account" target="_blank" rel="noopener">See Team plan</a>
|
|
567
|
+
</p>
|
|
568
|
+
<div id="team-suggestions" class="project-suggestion-grid"><p class="note">Looking for project folders used by Codex and Claude…</p></div>
|
|
569
|
+
<div id="team-project-builder" class="project-builder" hidden>
|
|
570
|
+
<div class="project-builder-copy">
|
|
571
|
+
<strong id="team-project-builder-title">Create one project</strong>
|
|
572
|
+
<span id="team-project-builder-detail">The selected folders will search and write the same project memory.</span>
|
|
573
|
+
</div>
|
|
574
|
+
<label class="f project-name-field" for="team-project-name">
|
|
575
|
+
Project name
|
|
576
|
+
<input id="team-project-name" maxlength="120" autocomplete="off" placeholder="Checkout platform">
|
|
577
|
+
</label>
|
|
578
|
+
<button type="button" class="action" id="team-project-continue">Continue in SealKeep Cloud</button>
|
|
579
|
+
<span class="note" id="team-project-result" role="status" aria-live="polite"></span>
|
|
580
|
+
</div>
|
|
581
|
+
<div id="team-project-pending" class="project-pending-list"></div>
|
|
582
|
+
</div>
|
|
583
|
+
|
|
584
|
+
<div class="panel pad" id="team-project-repair" hidden>
|
|
585
|
+
<div class="row" style="justify-content:space-between;align-items:baseline">
|
|
586
|
+
<h2 style="margin:0">History from unavailable folders</h2>
|
|
587
|
+
<span class="project-local-badge">Review required</span>
|
|
588
|
+
</div>
|
|
589
|
+
<p class="note">Sealkeep found preserved history whose exact old folder is not detected now. Choose a current folder explicitly; names never decide which history moves.</p>
|
|
590
|
+
<div id="team-project-repair-controls" class="project-repair-controls" hidden>
|
|
591
|
+
<label class="sr-only" for="team-project-repair-filter">Filter unavailable project history</label>
|
|
592
|
+
<input id="team-project-repair-filter" type="search" autocomplete="off" spellcheck="false"
|
|
593
|
+
placeholder="Filter unavailable projects…">
|
|
594
|
+
<span id="team-project-repair-visible" class="note" role="status" aria-live="polite"></span>
|
|
595
|
+
<button id="team-project-repair-more" class="action" type="button" hidden>Show more</button>
|
|
596
|
+
</div>
|
|
597
|
+
<div id="team-project-repair-list"></div>
|
|
598
|
+
</div>
|
|
599
|
+
|
|
600
|
+
<div class="panel pad">
|
|
601
|
+
<div class="row" style="justify-content:space-between;align-items:baseline">
|
|
602
|
+
<h2 style="margin:0">Connected project memory</h2>
|
|
603
|
+
<a class="action" href="https://sealkeep.spala.ai/?view=projects#account" target="_blank" rel="noopener">Open Projects in SealKeep Cloud</a>
|
|
604
|
+
</div>
|
|
605
|
+
<div id="team-available" style="margin-top:.8rem"></div>
|
|
606
|
+
<p class="note" id="team-status">A folder is only a doorway into shared memory. Teammates' files are not copied into it; Codex and Claude receive relevant encrypted project history through Sealkeep.</p>
|
|
607
|
+
<p class="note"><b>Keys stay local.</b> The cloud coordinates account access; this machine performs the encryption before anything becomes usable.</p>
|
|
608
|
+
</div>
|
|
609
|
+
|
|
610
|
+
<div class="panel pad">
|
|
611
|
+
<h2>Live channels this machine follows</h2>
|
|
612
|
+
<div id="space-channels"><p class="note">None yet. When a teammate shares a session, follow it from the Live page — it appears here automatically.</p></div>
|
|
613
|
+
</div>
|
|
614
|
+
</section>
|
|
615
|
+
|
|
616
|
+
<section id="view-live" class="view" hidden>
|
|
617
|
+
<div class="panel pad">
|
|
618
|
+
<h3>Share a session live</h3>
|
|
619
|
+
<div class="row">
|
|
620
|
+
<select id="share-session" aria-label="Session to share"><option value="">loading sessions…</option></select>
|
|
621
|
+
<input id="share-channel" type="text" placeholder="channel id" autocomplete="off" spellcheck="false" pattern="[A-Za-z0-9-]{1,64}" aria-label="Channel id" style="max-width:200px">
|
|
622
|
+
<button type="button" class="action" id="share-start">Share live</button>
|
|
623
|
+
</div>
|
|
624
|
+
<p class="note" id="share-status">Pick the session you are working in, keep or edit the channel id, and share. Send the channel id to whoever should follow.</p>
|
|
625
|
+
<div id="share-active"></div>
|
|
626
|
+
</div>
|
|
627
|
+
|
|
628
|
+
<div class="panel pad">
|
|
629
|
+
<h3>Follow a shared session</h3>
|
|
630
|
+
<div class="row">
|
|
631
|
+
<input id="live-channel" type="text" placeholder="channel id from a teammate" autocomplete="off" spellcheck="false" pattern="[A-Za-z0-9-]{1,64}" aria-label="Channel to follow">
|
|
632
|
+
<button type="button" class="action" id="live-follow">Follow</button>
|
|
633
|
+
<button type="button" id="live-stop" hidden>Stop</button>
|
|
634
|
+
</div>
|
|
635
|
+
<p class="note" id="live-status">Enter the channel a teammate shared, then Follow. Read-only: you see their session; you cannot drive it.</p>
|
|
636
|
+
<pre id="live-mirror" class="live-mirror" hidden></pre>
|
|
637
|
+
</div>
|
|
638
|
+
|
|
639
|
+
<div class="panel pad">
|
|
640
|
+
<h3>Messages and agent approval</h3>
|
|
641
|
+
<p class="note">Choose how far teammates' words travel on a channel — and speak into it yourself. Everything is sealed on this machine before it moves.</p>
|
|
642
|
+
<div class="row">
|
|
643
|
+
<input id="coop-channel" type="text" placeholder="channel id" autocomplete="off" spellcheck="false" pattern="[A-Za-z0-9-]{1,64}" aria-label="Cooperation channel" style="max-width:180px">
|
|
644
|
+
<select id="coop-mode" aria-label="Cooperation mode">
|
|
645
|
+
<option value="suggest">Review messages before my agent receives them</option>
|
|
646
|
+
<option value="open">Allow messages directly to my agent</option>
|
|
647
|
+
<option value="observe">People only — do not send to my agent</option>
|
|
648
|
+
</select>
|
|
649
|
+
<button type="button" class="action" id="coop-apply">Set mode</button>
|
|
650
|
+
</div>
|
|
651
|
+
<div class="row">
|
|
652
|
+
<input id="coop-text" type="text" placeholder="say something to the channel…" autocomplete="off" style="flex:1;min-width:200px" aria-label="Message text">
|
|
653
|
+
<select id="coop-kind" aria-label="Message kind"><option>suggest</option><option>note</option><option>handoff</option></select>
|
|
654
|
+
<button type="button" class="action" id="coop-send">Send</button>
|
|
655
|
+
</div>
|
|
656
|
+
<p class="note" id="coop-note">suggest is the safe default: nothing reaches your agent until you approve it here or with <code>sealkeep bridge review</code>.</p>
|
|
657
|
+
<div id="coop-held"></div>
|
|
658
|
+
</div>
|
|
659
|
+
</section>
|
|
462
660
|
</div>
|
|
463
661
|
|
|
464
662
|
<footer>
|