sealkeep 0.5.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 (180) hide show
  1. package/ARCHITECTURE.md +201 -0
  2. package/CHANGELOG.md +218 -0
  3. package/CONTROL_PLANE.md +86 -0
  4. package/LICENSE +34 -0
  5. package/README.md +249 -0
  6. package/THIRD_PARTY.md +22 -0
  7. package/THREAT_MODEL.md +107 -0
  8. package/dist/packages/vaultline-crypto/src/aead.d.ts +12 -0
  9. package/dist/packages/vaultline-crypto/src/aead.js +24 -0
  10. package/dist/packages/vaultline-crypto/src/chunk-access.d.ts +39 -0
  11. package/dist/packages/vaultline-crypto/src/chunk-access.js +93 -0
  12. package/dist/packages/vaultline-crypto/src/envelope.d.ts +71 -0
  13. package/dist/packages/vaultline-crypto/src/envelope.js +188 -0
  14. package/dist/packages/vaultline-crypto/src/format.d.ts +106 -0
  15. package/dist/packages/vaultline-crypto/src/format.js +43 -0
  16. package/dist/packages/vaultline-crypto/src/index.d.ts +5 -0
  17. package/dist/packages/vaultline-crypto/src/index.js +5 -0
  18. package/dist/packages/vaultline-crypto/src/recipients.d.ts +42 -0
  19. package/dist/packages/vaultline-crypto/src/recipients.js +129 -0
  20. package/dist/packages/vaultline-crypto/src/sha256-stream.d.ts +41 -0
  21. package/dist/packages/vaultline-crypto/src/sha256-stream.js +206 -0
  22. package/dist/packages/vaultline-crypto/src/stream.d.ts +139 -0
  23. package/dist/packages/vaultline-crypto/src/stream.js +477 -0
  24. package/dist/site/index.html +1542 -0
  25. package/dist/site.zip +0 -0
  26. package/dist/src/activity.d.ts +22 -0
  27. package/dist/src/activity.js +52 -0
  28. package/dist/src/adapters.d.ts +212 -0
  29. package/dist/src/adapters.js +533 -0
  30. package/dist/src/audit.d.ts +24 -0
  31. package/dist/src/audit.js +41 -0
  32. package/dist/src/autopilot.d.ts +77 -0
  33. package/dist/src/autopilot.js +148 -0
  34. package/dist/src/bip39-wordlist.d.ts +15 -0
  35. package/dist/src/bip39-wordlist.js +272 -0
  36. package/dist/src/branding.d.ts +31 -0
  37. package/dist/src/branding.js +31 -0
  38. package/dist/src/chunk-store.d.ts +142 -0
  39. package/dist/src/chunk-store.js +502 -0
  40. package/dist/src/cli.d.ts +2 -0
  41. package/dist/src/cli.js +2035 -0
  42. package/dist/src/cloud.d.ts +434 -0
  43. package/dist/src/cloud.js +851 -0
  44. package/dist/src/control-plane/auth.d.ts +62 -0
  45. package/dist/src/control-plane/auth.js +123 -0
  46. package/dist/src/control-plane/server.d.ts +31 -0
  47. package/dist/src/control-plane/server.js +263 -0
  48. package/dist/src/control-plane/store.d.ts +101 -0
  49. package/dist/src/control-plane/store.js +82 -0
  50. package/dist/src/control-plane-cli.d.ts +2 -0
  51. package/dist/src/control-plane-cli.js +37 -0
  52. package/dist/src/control-plane-server.d.ts +10 -0
  53. package/dist/src/control-plane-server.js +11 -0
  54. package/dist/src/control-plane.d.ts +78 -0
  55. package/dist/src/control-plane.js +61 -0
  56. package/dist/src/crypto.d.ts +56 -0
  57. package/dist/src/crypto.js +132 -0
  58. package/dist/src/daemon.d.ts +52 -0
  59. package/dist/src/daemon.js +142 -0
  60. package/dist/src/dashboard-cli.d.ts +2 -0
  61. package/dist/src/dashboard-cli.js +20 -0
  62. package/dist/src/disk.d.ts +110 -0
  63. package/dist/src/disk.js +169 -0
  64. package/dist/src/doctor.d.ts +11 -0
  65. package/dist/src/doctor.js +198 -0
  66. package/dist/src/enroll.d.ts +27 -0
  67. package/dist/src/enroll.js +136 -0
  68. package/dist/src/errors.d.ts +26 -0
  69. package/dist/src/errors.js +23 -0
  70. package/dist/src/heartbeat.d.ts +89 -0
  71. package/dist/src/heartbeat.js +120 -0
  72. package/dist/src/index-sync.d.ts +53 -0
  73. package/dist/src/index-sync.js +147 -0
  74. package/dist/src/leakscan.d.ts +48 -0
  75. package/dist/src/leakscan.js +222 -0
  76. package/dist/src/local-api.d.ts +132 -0
  77. package/dist/src/local-api.js +1757 -0
  78. package/dist/src/managed-chunks.d.ts +55 -0
  79. package/dist/src/managed-chunks.js +108 -0
  80. package/dist/src/mcp-install.d.ts +52 -0
  81. package/dist/src/mcp-install.js +140 -0
  82. package/dist/src/mcp.d.ts +1 -0
  83. package/dist/src/mcp.js +59 -0
  84. package/dist/src/migrate.d.ts +35 -0
  85. package/dist/src/migrate.js +88 -0
  86. package/dist/src/mnemonic.d.ts +60 -0
  87. package/dist/src/mnemonic.js +134 -0
  88. package/dist/src/net.d.ts +2 -0
  89. package/dist/src/net.js +16 -0
  90. package/dist/src/notify.d.ts +46 -0
  91. package/dist/src/notify.js +84 -0
  92. package/dist/src/offload.d.ts +117 -0
  93. package/dist/src/offload.js +331 -0
  94. package/dist/src/onboarding.d.ts +10 -0
  95. package/dist/src/onboarding.js +44 -0
  96. package/dist/src/packages.d.ts +126 -0
  97. package/dist/src/packages.js +114 -0
  98. package/dist/src/passkey.d.ts +26 -0
  99. package/dist/src/passkey.js +54 -0
  100. package/dist/src/password-lock.d.ts +19 -0
  101. package/dist/src/password-lock.js +156 -0
  102. package/dist/src/paths.d.ts +9 -0
  103. package/dist/src/paths.js +24 -0
  104. package/dist/src/providers/gcs.d.ts +133 -0
  105. package/dist/src/providers/gcs.js +235 -0
  106. package/dist/src/providers/gdrive.d.ts +156 -0
  107. package/dist/src/providers/gdrive.js +335 -0
  108. package/dist/src/providers/index.d.ts +45 -0
  109. package/dist/src/providers/index.js +74 -0
  110. package/dist/src/providers/s3.d.ts +174 -0
  111. package/dist/src/providers/s3.js +345 -0
  112. package/dist/src/providers/sigv4.d.ts +78 -0
  113. package/dist/src/providers/sigv4.js +112 -0
  114. package/dist/src/queue.d.ts +185 -0
  115. package/dist/src/queue.js +286 -0
  116. package/dist/src/recovery.d.ts +40 -0
  117. package/dist/src/recovery.js +132 -0
  118. package/dist/src/rehydrate.d.ts +43 -0
  119. package/dist/src/rehydrate.js +66 -0
  120. package/dist/src/restore.d.ts +34 -0
  121. package/dist/src/restore.js +80 -0
  122. package/dist/src/retention.d.ts +251 -0
  123. package/dist/src/retention.js +446 -0
  124. package/dist/src/rotate.d.ts +47 -0
  125. package/dist/src/rotate.js +95 -0
  126. package/dist/src/search.d.ts +147 -0
  127. package/dist/src/search.js +677 -0
  128. package/dist/src/secrets.d.ts +86 -0
  129. package/dist/src/secrets.js +220 -0
  130. package/dist/src/service.d.ts +73 -0
  131. package/dist/src/service.js +197 -0
  132. package/dist/src/share.d.ts +34 -0
  133. package/dist/src/share.js +68 -0
  134. package/dist/src/spool.d.ts +97 -0
  135. package/dist/src/spool.js +213 -0
  136. package/dist/src/start-tui.d.ts +17 -0
  137. package/dist/src/start-tui.js +113 -0
  138. package/dist/src/start.d.ts +75 -0
  139. package/dist/src/start.js +101 -0
  140. package/dist/src/storage-setup.d.ts +49 -0
  141. package/dist/src/storage-setup.js +222 -0
  142. package/dist/src/storage-targets.d.ts +40 -0
  143. package/dist/src/storage-targets.js +147 -0
  144. package/dist/src/stream-to-cloud.d.ts +76 -0
  145. package/dist/src/stream-to-cloud.js +820 -0
  146. package/dist/src/sync-rules.d.ts +85 -0
  147. package/dist/src/sync-rules.js +125 -0
  148. package/dist/src/trash.d.ts +15 -0
  149. package/dist/src/trash.js +63 -0
  150. package/dist/src/tui.d.ts +18 -0
  151. package/dist/src/tui.js +179 -0
  152. package/dist/src/types.d.ts +191 -0
  153. package/dist/src/types.js +3 -0
  154. package/dist/src/ui-server.d.ts +187 -0
  155. package/dist/src/ui-server.js +293 -0
  156. package/dist/src/ui.d.ts +41 -0
  157. package/dist/src/ui.js +102 -0
  158. package/dist/src/update.d.ts +30 -0
  159. package/dist/src/update.js +56 -0
  160. package/dist/src/upload.d.ts +46 -0
  161. package/dist/src/upload.js +80 -0
  162. package/dist/src/vault.d.ts +208 -0
  163. package/dist/src/vault.js +812 -0
  164. package/dist/src/watcher.d.ts +34 -0
  165. package/dist/src/watcher.js +121 -0
  166. package/dist/src/worker.d.ts +52 -0
  167. package/dist/src/worker.js +190 -0
  168. package/package.json +65 -0
  169. package/web/app.js +1372 -0
  170. package/web/index.html +476 -0
  171. package/web/rail.js +308 -0
  172. package/web/retention.html +17 -0
  173. package/web/rules-view.js +249 -0
  174. package/web/sessions-view.js +448 -0
  175. package/web/sessions.html +17 -0
  176. package/web/setup-api.js +181 -0
  177. package/web/setup-logic.js +394 -0
  178. package/web/setup.html +419 -0
  179. package/web/setup.js +697 -0
  180. package/web/style.css +990 -0
@@ -0,0 +1,148 @@
1
+ import { resolveSyncRules, applySyncRules, describeSyncRules } from "./sync-rules.js";
2
+ import { detectAgents, findTranscripts } from "./adapters.js";
3
+ import { fail } from "./errors.js";
4
+ import { setupVault } from "./onboarding.js";
5
+ import { ArchiveQueue } from "./queue.js";
6
+ import { retentionSettings, setRetentionPolicy } from "./retention.js";
7
+ import { forgetRecoveryPhrase, rememberRecoveryPhrase, resolveRecoveryPhrase } from "./secrets.js";
8
+ import { daemonInvocation, installService, serviceStatus, servicePlan, serviceUnitEnvironment, uninstallService } from "./service.js";
9
+ import { readConfig } from "./vault.js";
10
+ import { liveness, readHeartbeat } from "./heartbeat.js";
11
+ const DEFAULTS = { olderThanDays: 30, graceDays: 7 };
12
+ /**
13
+ * Turns Sealkeep into something that runs itself.
14
+ *
15
+ * One call sets up the vault, teaches this machine to unlock it, picks a retention
16
+ * policy, sweeps up the sessions already on disk, and installs a login service. The
17
+ * safety gates are unchanged: reclamation still requires a verified remote copy, an
18
+ * idle file, and an elapsed grace period, so enabling it here cannot delete anything
19
+ * until a bucket is configured and an upload has been checked.
20
+ */
21
+ export async function enableAutopilot(dataDir, options = {}) {
22
+ const notes = [];
23
+ const remember = options.remember !== false;
24
+ const reclaim = options.reclaim !== false;
25
+ const setup = await setupVault(dataDir, options.phrase);
26
+ const config = await readConfig(dataDir);
27
+ const phrase = setup.recoveryPhrase ?? (await resolveRecoveryPhrase(dataDir, config.vaultId, options.phrase, process.env, options.backend));
28
+ if (!phrase) {
29
+ fail("recovery_phrase_missing", "This vault already exists and its phrase is not on this machine. Re-run with --recovery-phrase so the service can unlock it.", { dataDir });
30
+ }
31
+ let remembered = null;
32
+ if (remember && !options.dryRun) {
33
+ try {
34
+ remembered = await rememberRecoveryPhrase(dataDir, config.vaultId, phrase, options.backend);
35
+ }
36
+ catch (error) {
37
+ notes.push(`Could not use this machine's keystore (${error instanceof Error ? error.message.split("\n")[0] : "unknown"}). The service will need VAULTLINE_RECOVERY_PHRASE in its environment.`);
38
+ }
39
+ }
40
+ else if (!remember) {
41
+ notes.push("The phrase was not stored. Put VAULTLINE_RECOVERY_PHRASE in the service environment yourself, or sessions will queue up unsealed.");
42
+ }
43
+ const desired = { policy: reclaim ? "archive-and-reclaim" : "sync-only", olderThanDays: options.olderThanDays ?? DEFAULTS.olderThanDays, graceDays: options.graceDays ?? DEFAULTS.graceDays };
44
+ // A vault written before archive lifecycle existed has no deleteAfterDays; absent means never.
45
+ const stored = options.dryRun ? undefined : (await setRetentionPolicy(dataDir, desired)).retention;
46
+ const retention = retentionSettings(config, { ...desired, ...stored });
47
+ const installs = await detectAgents(options.home);
48
+ const detected = installs.filter((install) => install.detected);
49
+ const found = (await Promise.all(detected.map((install) => findTranscripts(install.agent, options.home, 500)))).flat();
50
+ // What leaves this machine is decided here, before anything is read or sealed.
51
+ const { rules, source } = await resolveSyncRules(dataDir);
52
+ const { included, heldBack } = applySyncRules(found, rules);
53
+ if (heldBack.length) {
54
+ notes.push(`Sync rules: uploading ${describeSyncRules(rules)}. ${heldBack.length} session${heldBack.length === 1 ? "" : "s"} stay local.`);
55
+ }
56
+ if (source === "cache")
57
+ notes.push("Could not reach your account, so the last known sync rules are in force.");
58
+ let queued = 0;
59
+ if (!options.dryRun) {
60
+ const queue = new ArchiveQueue(dataDir);
61
+ for (const candidate of included) {
62
+ const { deduped } = await queue.enqueue({ sourcePath: candidate.path, agent: candidate.agent, event: "autopilot" });
63
+ if (!deduped)
64
+ queued += 1;
65
+ }
66
+ }
67
+ // A managed-tier machine has no bucket of its own and does not need one, so
68
+ // telling it to run `storage configure` sends a paying customer to set up
69
+ // storage they are already paying us to run.
70
+ //
71
+ // Resolved before the service is written, because the service definition
72
+ // depends on it: a machine with somewhere to upload needs the daemon to have
73
+ // uploads enabled, and a service manager starts the daemon with a bare
74
+ // environment rather than inheriting the shell that installed it.
75
+ let managedEmail = null;
76
+ if (!config.remoteStorage) {
77
+ try {
78
+ const { accountStatus } = await import("./cloud.js");
79
+ managedEmail = (await accountStatus(dataDir))?.email ?? null;
80
+ }
81
+ catch { /* not signed in */ }
82
+ }
83
+ const hasRemoteTarget = Boolean(config.remoteStorage) || managedEmail !== null;
84
+ const invocation = daemonInvocation(dataDir, { reclaim, cliPath: options.cliPath });
85
+ const serviceOptions = {
86
+ dataDir, executable: invocation.executable, args: invocation.args,
87
+ home: options.home, platform: options.platform, exec: options.exec,
88
+ // Installing autopilot against a configured target is the opt-in. Without
89
+ // this the daemon takes the "uploads are disabled" branch on every tick,
90
+ // and since reclaiming requires a verified remote copy, it also never frees
91
+ // a byte — the one thing the user installed it to do.
92
+ environment: serviceUnitEnvironment(hasRemoteTarget ? { VAULTLINE_ENABLE_SIGNER: "1" } : {})
93
+ };
94
+ const service = options.dryRun
95
+ ? { kind: servicePlan(serviceOptions).kind, installed: false, path: servicePlan(serviceOptions).path, ranCommands: [], note: "dry run: nothing was installed" }
96
+ : await installService(serviceOptions);
97
+ if (service.note && !options.dryRun)
98
+ notes.push(service.note);
99
+ if (reclaim && !hasRemoteTarget) {
100
+ notes.push("No bucket is configured yet, so nothing will be reclaimed. Sessions are sealed and kept locally until you run `sealkeep storage configure`, or sign in with `sealkeep cloud login`.");
101
+ }
102
+ return {
103
+ vaultId: config.vaultId,
104
+ recoveryPhrase: setup.recoveryPhrase,
105
+ remembered,
106
+ retention,
107
+ service,
108
+ agents: detected.map((install) => install.agent),
109
+ found: { sessions: found.length, bytes: found.reduce((total, candidate) => total + candidate.bytes, 0) },
110
+ queued,
111
+ reclaimEnabled: reclaim,
112
+ hasRemoteTarget,
113
+ notes
114
+ };
115
+ }
116
+ export async function autopilotStatus(dataDir, options = {}) {
117
+ const config = await readConfig(dataDir);
118
+ const invocation = daemonInvocation(dataDir, { cliPath: options.cliPath });
119
+ const service = await serviceStatus({ dataDir, executable: invocation.executable, args: invocation.args, home: options.home, platform: options.platform, exec: options.exec });
120
+ return {
121
+ running: service.present,
122
+ live: liveness(await readHeartbeat(dataDir)),
123
+ service,
124
+ phraseAvailable: (await resolveRecoveryPhrase(dataDir, config.vaultId, undefined, process.env, options.backend)) !== null,
125
+ retention: retentionSettings(config),
126
+ hasRemoteTarget: Boolean(config.remoteStorage),
127
+ queue: await new ArchiveQueue(dataDir).stats()
128
+ };
129
+ }
130
+ /**
131
+ * Stops the service and forgets the stored phrase. Archives are untouched: turning
132
+ * automation off is not a way to lose data.
133
+ */
134
+ export async function disableAutopilot(dataDir, options = {}) {
135
+ const config = await readConfig(dataDir);
136
+ const invocation = daemonInvocation(dataDir, { cliPath: options.cliPath });
137
+ const service = await uninstallService({ dataDir, executable: invocation.executable, args: invocation.args, home: options.home, platform: options.platform, exec: options.exec });
138
+ let forgot = false;
139
+ if (options.remember !== false) {
140
+ try {
141
+ await forgetRecoveryPhrase(dataDir, config.vaultId, options.backend);
142
+ forgot = true;
143
+ }
144
+ catch { /* nothing stored */ }
145
+ }
146
+ const retention = (await setRetentionPolicy(dataDir, { policy: "local-only" })).retention;
147
+ return { service, forgotPhrase: forgot, retention, archivesKept: true };
148
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The BIP-39 English word list, exactly as the specification froze it.
3
+ *
4
+ * Vendored rather than depended upon: this is static data that the standard
5
+ * guarantees will never change, and a security tool people audit is better off
6
+ * without a third runtime dependency in its supply chain. It is also not
7
+ * trusted on sight - `mnemonic.test.ts` hashes this list and compares it to
8
+ * the digest published with the specification, so a single altered word fails
9
+ * the build rather than quietly producing phrases no other tool can read.
10
+ *
11
+ * Source: https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
12
+ * SHA-256 of the source file (newline separated, trailing newline):
13
+ * 2f5eed53a4727b4bf8880d8f3f199efc90e58503646d9ff8eff3a2ed3b24dbda
14
+ */
15
+ export declare const BIP39_ENGLISH: readonly string[];
@@ -0,0 +1,272 @@
1
+ /**
2
+ * The BIP-39 English word list, exactly as the specification froze it.
3
+ *
4
+ * Vendored rather than depended upon: this is static data that the standard
5
+ * guarantees will never change, and a security tool people audit is better off
6
+ * without a third runtime dependency in its supply chain. It is also not
7
+ * trusted on sight - `mnemonic.test.ts` hashes this list and compares it to
8
+ * the digest published with the specification, so a single altered word fails
9
+ * the build rather than quietly producing phrases no other tool can read.
10
+ *
11
+ * Source: https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
12
+ * SHA-256 of the source file (newline separated, trailing newline):
13
+ * 2f5eed53a4727b4bf8880d8f3f199efc90e58503646d9ff8eff3a2ed3b24dbda
14
+ */
15
+ export const BIP39_ENGLISH = [
16
+ "abandon", "ability", "able", "about", "above", "absent", "absorb", "abstract",
17
+ "absurd", "abuse", "access", "accident", "account", "accuse", "achieve", "acid",
18
+ "acoustic", "acquire", "across", "act", "action", "actor", "actress", "actual",
19
+ "adapt", "add", "addict", "address", "adjust", "admit", "adult", "advance",
20
+ "advice", "aerobic", "affair", "afford", "afraid", "again", "age", "agent",
21
+ "agree", "ahead", "aim", "air", "airport", "aisle", "alarm", "album",
22
+ "alcohol", "alert", "alien", "all", "alley", "allow", "almost", "alone",
23
+ "alpha", "already", "also", "alter", "always", "amateur", "amazing", "among",
24
+ "amount", "amused", "analyst", "anchor", "ancient", "anger", "angle", "angry",
25
+ "animal", "ankle", "announce", "annual", "another", "answer", "antenna", "antique",
26
+ "anxiety", "any", "apart", "apology", "appear", "apple", "approve", "april",
27
+ "arch", "arctic", "area", "arena", "argue", "arm", "armed", "armor",
28
+ "army", "around", "arrange", "arrest", "arrive", "arrow", "art", "artefact",
29
+ "artist", "artwork", "ask", "aspect", "assault", "asset", "assist", "assume",
30
+ "asthma", "athlete", "atom", "attack", "attend", "attitude", "attract", "auction",
31
+ "audit", "august", "aunt", "author", "auto", "autumn", "average", "avocado",
32
+ "avoid", "awake", "aware", "away", "awesome", "awful", "awkward", "axis",
33
+ "baby", "bachelor", "bacon", "badge", "bag", "balance", "balcony", "ball",
34
+ "bamboo", "banana", "banner", "bar", "barely", "bargain", "barrel", "base",
35
+ "basic", "basket", "battle", "beach", "bean", "beauty", "because", "become",
36
+ "beef", "before", "begin", "behave", "behind", "believe", "below", "belt",
37
+ "bench", "benefit", "best", "betray", "better", "between", "beyond", "bicycle",
38
+ "bid", "bike", "bind", "biology", "bird", "birth", "bitter", "black",
39
+ "blade", "blame", "blanket", "blast", "bleak", "bless", "blind", "blood",
40
+ "blossom", "blouse", "blue", "blur", "blush", "board", "boat", "body",
41
+ "boil", "bomb", "bone", "bonus", "book", "boost", "border", "boring",
42
+ "borrow", "boss", "bottom", "bounce", "box", "boy", "bracket", "brain",
43
+ "brand", "brass", "brave", "bread", "breeze", "brick", "bridge", "brief",
44
+ "bright", "bring", "brisk", "broccoli", "broken", "bronze", "broom", "brother",
45
+ "brown", "brush", "bubble", "buddy", "budget", "buffalo", "build", "bulb",
46
+ "bulk", "bullet", "bundle", "bunker", "burden", "burger", "burst", "bus",
47
+ "business", "busy", "butter", "buyer", "buzz", "cabbage", "cabin", "cable",
48
+ "cactus", "cage", "cake", "call", "calm", "camera", "camp", "can",
49
+ "canal", "cancel", "candy", "cannon", "canoe", "canvas", "canyon", "capable",
50
+ "capital", "captain", "car", "carbon", "card", "cargo", "carpet", "carry",
51
+ "cart", "case", "cash", "casino", "castle", "casual", "cat", "catalog",
52
+ "catch", "category", "cattle", "caught", "cause", "caution", "cave", "ceiling",
53
+ "celery", "cement", "census", "century", "cereal", "certain", "chair", "chalk",
54
+ "champion", "change", "chaos", "chapter", "charge", "chase", "chat", "cheap",
55
+ "check", "cheese", "chef", "cherry", "chest", "chicken", "chief", "child",
56
+ "chimney", "choice", "choose", "chronic", "chuckle", "chunk", "churn", "cigar",
57
+ "cinnamon", "circle", "citizen", "city", "civil", "claim", "clap", "clarify",
58
+ "claw", "clay", "clean", "clerk", "clever", "click", "client", "cliff",
59
+ "climb", "clinic", "clip", "clock", "clog", "close", "cloth", "cloud",
60
+ "clown", "club", "clump", "cluster", "clutch", "coach", "coast", "coconut",
61
+ "code", "coffee", "coil", "coin", "collect", "color", "column", "combine",
62
+ "come", "comfort", "comic", "common", "company", "concert", "conduct", "confirm",
63
+ "congress", "connect", "consider", "control", "convince", "cook", "cool", "copper",
64
+ "copy", "coral", "core", "corn", "correct", "cost", "cotton", "couch",
65
+ "country", "couple", "course", "cousin", "cover", "coyote", "crack", "cradle",
66
+ "craft", "cram", "crane", "crash", "crater", "crawl", "crazy", "cream",
67
+ "credit", "creek", "crew", "cricket", "crime", "crisp", "critic", "crop",
68
+ "cross", "crouch", "crowd", "crucial", "cruel", "cruise", "crumble", "crunch",
69
+ "crush", "cry", "crystal", "cube", "culture", "cup", "cupboard", "curious",
70
+ "current", "curtain", "curve", "cushion", "custom", "cute", "cycle", "dad",
71
+ "damage", "damp", "dance", "danger", "daring", "dash", "daughter", "dawn",
72
+ "day", "deal", "debate", "debris", "decade", "december", "decide", "decline",
73
+ "decorate", "decrease", "deer", "defense", "define", "defy", "degree", "delay",
74
+ "deliver", "demand", "demise", "denial", "dentist", "deny", "depart", "depend",
75
+ "deposit", "depth", "deputy", "derive", "describe", "desert", "design", "desk",
76
+ "despair", "destroy", "detail", "detect", "develop", "device", "devote", "diagram",
77
+ "dial", "diamond", "diary", "dice", "diesel", "diet", "differ", "digital",
78
+ "dignity", "dilemma", "dinner", "dinosaur", "direct", "dirt", "disagree", "discover",
79
+ "disease", "dish", "dismiss", "disorder", "display", "distance", "divert", "divide",
80
+ "divorce", "dizzy", "doctor", "document", "dog", "doll", "dolphin", "domain",
81
+ "donate", "donkey", "donor", "door", "dose", "double", "dove", "draft",
82
+ "dragon", "drama", "drastic", "draw", "dream", "dress", "drift", "drill",
83
+ "drink", "drip", "drive", "drop", "drum", "dry", "duck", "dumb",
84
+ "dune", "during", "dust", "dutch", "duty", "dwarf", "dynamic", "eager",
85
+ "eagle", "early", "earn", "earth", "easily", "east", "easy", "echo",
86
+ "ecology", "economy", "edge", "edit", "educate", "effort", "egg", "eight",
87
+ "either", "elbow", "elder", "electric", "elegant", "element", "elephant", "elevator",
88
+ "elite", "else", "embark", "embody", "embrace", "emerge", "emotion", "employ",
89
+ "empower", "empty", "enable", "enact", "end", "endless", "endorse", "enemy",
90
+ "energy", "enforce", "engage", "engine", "enhance", "enjoy", "enlist", "enough",
91
+ "enrich", "enroll", "ensure", "enter", "entire", "entry", "envelope", "episode",
92
+ "equal", "equip", "era", "erase", "erode", "erosion", "error", "erupt",
93
+ "escape", "essay", "essence", "estate", "eternal", "ethics", "evidence", "evil",
94
+ "evoke", "evolve", "exact", "example", "excess", "exchange", "excite", "exclude",
95
+ "excuse", "execute", "exercise", "exhaust", "exhibit", "exile", "exist", "exit",
96
+ "exotic", "expand", "expect", "expire", "explain", "expose", "express", "extend",
97
+ "extra", "eye", "eyebrow", "fabric", "face", "faculty", "fade", "faint",
98
+ "faith", "fall", "false", "fame", "family", "famous", "fan", "fancy",
99
+ "fantasy", "farm", "fashion", "fat", "fatal", "father", "fatigue", "fault",
100
+ "favorite", "feature", "february", "federal", "fee", "feed", "feel", "female",
101
+ "fence", "festival", "fetch", "fever", "few", "fiber", "fiction", "field",
102
+ "figure", "file", "film", "filter", "final", "find", "fine", "finger",
103
+ "finish", "fire", "firm", "first", "fiscal", "fish", "fit", "fitness",
104
+ "fix", "flag", "flame", "flash", "flat", "flavor", "flee", "flight",
105
+ "flip", "float", "flock", "floor", "flower", "fluid", "flush", "fly",
106
+ "foam", "focus", "fog", "foil", "fold", "follow", "food", "foot",
107
+ "force", "forest", "forget", "fork", "fortune", "forum", "forward", "fossil",
108
+ "foster", "found", "fox", "fragile", "frame", "frequent", "fresh", "friend",
109
+ "fringe", "frog", "front", "frost", "frown", "frozen", "fruit", "fuel",
110
+ "fun", "funny", "furnace", "fury", "future", "gadget", "gain", "galaxy",
111
+ "gallery", "game", "gap", "garage", "garbage", "garden", "garlic", "garment",
112
+ "gas", "gasp", "gate", "gather", "gauge", "gaze", "general", "genius",
113
+ "genre", "gentle", "genuine", "gesture", "ghost", "giant", "gift", "giggle",
114
+ "ginger", "giraffe", "girl", "give", "glad", "glance", "glare", "glass",
115
+ "glide", "glimpse", "globe", "gloom", "glory", "glove", "glow", "glue",
116
+ "goat", "goddess", "gold", "good", "goose", "gorilla", "gospel", "gossip",
117
+ "govern", "gown", "grab", "grace", "grain", "grant", "grape", "grass",
118
+ "gravity", "great", "green", "grid", "grief", "grit", "grocery", "group",
119
+ "grow", "grunt", "guard", "guess", "guide", "guilt", "guitar", "gun",
120
+ "gym", "habit", "hair", "half", "hammer", "hamster", "hand", "happy",
121
+ "harbor", "hard", "harsh", "harvest", "hat", "have", "hawk", "hazard",
122
+ "head", "health", "heart", "heavy", "hedgehog", "height", "hello", "helmet",
123
+ "help", "hen", "hero", "hidden", "high", "hill", "hint", "hip",
124
+ "hire", "history", "hobby", "hockey", "hold", "hole", "holiday", "hollow",
125
+ "home", "honey", "hood", "hope", "horn", "horror", "horse", "hospital",
126
+ "host", "hotel", "hour", "hover", "hub", "huge", "human", "humble",
127
+ "humor", "hundred", "hungry", "hunt", "hurdle", "hurry", "hurt", "husband",
128
+ "hybrid", "ice", "icon", "idea", "identify", "idle", "ignore", "ill",
129
+ "illegal", "illness", "image", "imitate", "immense", "immune", "impact", "impose",
130
+ "improve", "impulse", "inch", "include", "income", "increase", "index", "indicate",
131
+ "indoor", "industry", "infant", "inflict", "inform", "inhale", "inherit", "initial",
132
+ "inject", "injury", "inmate", "inner", "innocent", "input", "inquiry", "insane",
133
+ "insect", "inside", "inspire", "install", "intact", "interest", "into", "invest",
134
+ "invite", "involve", "iron", "island", "isolate", "issue", "item", "ivory",
135
+ "jacket", "jaguar", "jar", "jazz", "jealous", "jeans", "jelly", "jewel",
136
+ "job", "join", "joke", "journey", "joy", "judge", "juice", "jump",
137
+ "jungle", "junior", "junk", "just", "kangaroo", "keen", "keep", "ketchup",
138
+ "key", "kick", "kid", "kidney", "kind", "kingdom", "kiss", "kit",
139
+ "kitchen", "kite", "kitten", "kiwi", "knee", "knife", "knock", "know",
140
+ "lab", "label", "labor", "ladder", "lady", "lake", "lamp", "language",
141
+ "laptop", "large", "later", "latin", "laugh", "laundry", "lava", "law",
142
+ "lawn", "lawsuit", "layer", "lazy", "leader", "leaf", "learn", "leave",
143
+ "lecture", "left", "leg", "legal", "legend", "leisure", "lemon", "lend",
144
+ "length", "lens", "leopard", "lesson", "letter", "level", "liar", "liberty",
145
+ "library", "license", "life", "lift", "light", "like", "limb", "limit",
146
+ "link", "lion", "liquid", "list", "little", "live", "lizard", "load",
147
+ "loan", "lobster", "local", "lock", "logic", "lonely", "long", "loop",
148
+ "lottery", "loud", "lounge", "love", "loyal", "lucky", "luggage", "lumber",
149
+ "lunar", "lunch", "luxury", "lyrics", "machine", "mad", "magic", "magnet",
150
+ "maid", "mail", "main", "major", "make", "mammal", "man", "manage",
151
+ "mandate", "mango", "mansion", "manual", "maple", "marble", "march", "margin",
152
+ "marine", "market", "marriage", "mask", "mass", "master", "match", "material",
153
+ "math", "matrix", "matter", "maximum", "maze", "meadow", "mean", "measure",
154
+ "meat", "mechanic", "medal", "media", "melody", "melt", "member", "memory",
155
+ "mention", "menu", "mercy", "merge", "merit", "merry", "mesh", "message",
156
+ "metal", "method", "middle", "midnight", "milk", "million", "mimic", "mind",
157
+ "minimum", "minor", "minute", "miracle", "mirror", "misery", "miss", "mistake",
158
+ "mix", "mixed", "mixture", "mobile", "model", "modify", "mom", "moment",
159
+ "monitor", "monkey", "monster", "month", "moon", "moral", "more", "morning",
160
+ "mosquito", "mother", "motion", "motor", "mountain", "mouse", "move", "movie",
161
+ "much", "muffin", "mule", "multiply", "muscle", "museum", "mushroom", "music",
162
+ "must", "mutual", "myself", "mystery", "myth", "naive", "name", "napkin",
163
+ "narrow", "nasty", "nation", "nature", "near", "neck", "need", "negative",
164
+ "neglect", "neither", "nephew", "nerve", "nest", "net", "network", "neutral",
165
+ "never", "news", "next", "nice", "night", "noble", "noise", "nominee",
166
+ "noodle", "normal", "north", "nose", "notable", "note", "nothing", "notice",
167
+ "novel", "now", "nuclear", "number", "nurse", "nut", "oak", "obey",
168
+ "object", "oblige", "obscure", "observe", "obtain", "obvious", "occur", "ocean",
169
+ "october", "odor", "off", "offer", "office", "often", "oil", "okay",
170
+ "old", "olive", "olympic", "omit", "once", "one", "onion", "online",
171
+ "only", "open", "opera", "opinion", "oppose", "option", "orange", "orbit",
172
+ "orchard", "order", "ordinary", "organ", "orient", "original", "orphan", "ostrich",
173
+ "other", "outdoor", "outer", "output", "outside", "oval", "oven", "over",
174
+ "own", "owner", "oxygen", "oyster", "ozone", "pact", "paddle", "page",
175
+ "pair", "palace", "palm", "panda", "panel", "panic", "panther", "paper",
176
+ "parade", "parent", "park", "parrot", "party", "pass", "patch", "path",
177
+ "patient", "patrol", "pattern", "pause", "pave", "payment", "peace", "peanut",
178
+ "pear", "peasant", "pelican", "pen", "penalty", "pencil", "people", "pepper",
179
+ "perfect", "permit", "person", "pet", "phone", "photo", "phrase", "physical",
180
+ "piano", "picnic", "picture", "piece", "pig", "pigeon", "pill", "pilot",
181
+ "pink", "pioneer", "pipe", "pistol", "pitch", "pizza", "place", "planet",
182
+ "plastic", "plate", "play", "please", "pledge", "pluck", "plug", "plunge",
183
+ "poem", "poet", "point", "polar", "pole", "police", "pond", "pony",
184
+ "pool", "popular", "portion", "position", "possible", "post", "potato", "pottery",
185
+ "poverty", "powder", "power", "practice", "praise", "predict", "prefer", "prepare",
186
+ "present", "pretty", "prevent", "price", "pride", "primary", "print", "priority",
187
+ "prison", "private", "prize", "problem", "process", "produce", "profit", "program",
188
+ "project", "promote", "proof", "property", "prosper", "protect", "proud", "provide",
189
+ "public", "pudding", "pull", "pulp", "pulse", "pumpkin", "punch", "pupil",
190
+ "puppy", "purchase", "purity", "purpose", "purse", "push", "put", "puzzle",
191
+ "pyramid", "quality", "quantum", "quarter", "question", "quick", "quit", "quiz",
192
+ "quote", "rabbit", "raccoon", "race", "rack", "radar", "radio", "rail",
193
+ "rain", "raise", "rally", "ramp", "ranch", "random", "range", "rapid",
194
+ "rare", "rate", "rather", "raven", "raw", "razor", "ready", "real",
195
+ "reason", "rebel", "rebuild", "recall", "receive", "recipe", "record", "recycle",
196
+ "reduce", "reflect", "reform", "refuse", "region", "regret", "regular", "reject",
197
+ "relax", "release", "relief", "rely", "remain", "remember", "remind", "remove",
198
+ "render", "renew", "rent", "reopen", "repair", "repeat", "replace", "report",
199
+ "require", "rescue", "resemble", "resist", "resource", "response", "result", "retire",
200
+ "retreat", "return", "reunion", "reveal", "review", "reward", "rhythm", "rib",
201
+ "ribbon", "rice", "rich", "ride", "ridge", "rifle", "right", "rigid",
202
+ "ring", "riot", "ripple", "risk", "ritual", "rival", "river", "road",
203
+ "roast", "robot", "robust", "rocket", "romance", "roof", "rookie", "room",
204
+ "rose", "rotate", "rough", "round", "route", "royal", "rubber", "rude",
205
+ "rug", "rule", "run", "runway", "rural", "sad", "saddle", "sadness",
206
+ "safe", "sail", "salad", "salmon", "salon", "salt", "salute", "same",
207
+ "sample", "sand", "satisfy", "satoshi", "sauce", "sausage", "save", "say",
208
+ "scale", "scan", "scare", "scatter", "scene", "scheme", "school", "science",
209
+ "scissors", "scorpion", "scout", "scrap", "screen", "script", "scrub", "sea",
210
+ "search", "season", "seat", "second", "secret", "section", "security", "seed",
211
+ "seek", "segment", "select", "sell", "seminar", "senior", "sense", "sentence",
212
+ "series", "service", "session", "settle", "setup", "seven", "shadow", "shaft",
213
+ "shallow", "share", "shed", "shell", "sheriff", "shield", "shift", "shine",
214
+ "ship", "shiver", "shock", "shoe", "shoot", "shop", "short", "shoulder",
215
+ "shove", "shrimp", "shrug", "shuffle", "shy", "sibling", "sick", "side",
216
+ "siege", "sight", "sign", "silent", "silk", "silly", "silver", "similar",
217
+ "simple", "since", "sing", "siren", "sister", "situate", "six", "size",
218
+ "skate", "sketch", "ski", "skill", "skin", "skirt", "skull", "slab",
219
+ "slam", "sleep", "slender", "slice", "slide", "slight", "slim", "slogan",
220
+ "slot", "slow", "slush", "small", "smart", "smile", "smoke", "smooth",
221
+ "snack", "snake", "snap", "sniff", "snow", "soap", "soccer", "social",
222
+ "sock", "soda", "soft", "solar", "soldier", "solid", "solution", "solve",
223
+ "someone", "song", "soon", "sorry", "sort", "soul", "sound", "soup",
224
+ "source", "south", "space", "spare", "spatial", "spawn", "speak", "special",
225
+ "speed", "spell", "spend", "sphere", "spice", "spider", "spike", "spin",
226
+ "spirit", "split", "spoil", "sponsor", "spoon", "sport", "spot", "spray",
227
+ "spread", "spring", "spy", "square", "squeeze", "squirrel", "stable", "stadium",
228
+ "staff", "stage", "stairs", "stamp", "stand", "start", "state", "stay",
229
+ "steak", "steel", "stem", "step", "stereo", "stick", "still", "sting",
230
+ "stock", "stomach", "stone", "stool", "story", "stove", "strategy", "street",
231
+ "strike", "strong", "struggle", "student", "stuff", "stumble", "style", "subject",
232
+ "submit", "subway", "success", "such", "sudden", "suffer", "sugar", "suggest",
233
+ "suit", "summer", "sun", "sunny", "sunset", "super", "supply", "supreme",
234
+ "sure", "surface", "surge", "surprise", "surround", "survey", "suspect", "sustain",
235
+ "swallow", "swamp", "swap", "swarm", "swear", "sweet", "swift", "swim",
236
+ "swing", "switch", "sword", "symbol", "symptom", "syrup", "system", "table",
237
+ "tackle", "tag", "tail", "talent", "talk", "tank", "tape", "target",
238
+ "task", "taste", "tattoo", "taxi", "teach", "team", "tell", "ten",
239
+ "tenant", "tennis", "tent", "term", "test", "text", "thank", "that",
240
+ "theme", "then", "theory", "there", "they", "thing", "this", "thought",
241
+ "three", "thrive", "throw", "thumb", "thunder", "ticket", "tide", "tiger",
242
+ "tilt", "timber", "time", "tiny", "tip", "tired", "tissue", "title",
243
+ "toast", "tobacco", "today", "toddler", "toe", "together", "toilet", "token",
244
+ "tomato", "tomorrow", "tone", "tongue", "tonight", "tool", "tooth", "top",
245
+ "topic", "topple", "torch", "tornado", "tortoise", "toss", "total", "tourist",
246
+ "toward", "tower", "town", "toy", "track", "trade", "traffic", "tragic",
247
+ "train", "transfer", "trap", "trash", "travel", "tray", "treat", "tree",
248
+ "trend", "trial", "tribe", "trick", "trigger", "trim", "trip", "trophy",
249
+ "trouble", "truck", "true", "truly", "trumpet", "trust", "truth", "try",
250
+ "tube", "tuition", "tumble", "tuna", "tunnel", "turkey", "turn", "turtle",
251
+ "twelve", "twenty", "twice", "twin", "twist", "two", "type", "typical",
252
+ "ugly", "umbrella", "unable", "unaware", "uncle", "uncover", "under", "undo",
253
+ "unfair", "unfold", "unhappy", "uniform", "unique", "unit", "universe", "unknown",
254
+ "unlock", "until", "unusual", "unveil", "update", "upgrade", "uphold", "upon",
255
+ "upper", "upset", "urban", "urge", "usage", "use", "used", "useful",
256
+ "useless", "usual", "utility", "vacant", "vacuum", "vague", "valid", "valley",
257
+ "valve", "van", "vanish", "vapor", "various", "vast", "vault", "vehicle",
258
+ "velvet", "vendor", "venture", "venue", "verb", "verify", "version", "very",
259
+ "vessel", "veteran", "viable", "vibrant", "vicious", "victory", "video", "view",
260
+ "village", "vintage", "violin", "virtual", "virus", "visa", "visit", "visual",
261
+ "vital", "vivid", "vocal", "voice", "void", "volcano", "volume", "vote",
262
+ "voyage", "wage", "wagon", "wait", "walk", "wall", "walnut", "want",
263
+ "warfare", "warm", "warrior", "wash", "wasp", "waste", "water", "wave",
264
+ "way", "wealth", "weapon", "wear", "weasel", "weather", "web", "wedding",
265
+ "weekend", "weird", "welcome", "west", "wet", "whale", "what", "wheat",
266
+ "wheel", "when", "where", "whip", "whisper", "wide", "width", "wife",
267
+ "wild", "will", "win", "window", "wine", "wing", "wink", "winner",
268
+ "winter", "wire", "wisdom", "wise", "wish", "witness", "wolf", "woman",
269
+ "wonder", "wood", "wool", "word", "work", "world", "worry", "worth",
270
+ "wrap", "wreck", "wrestle", "wrist", "write", "wrong", "yard", "year",
271
+ "yellow", "you", "young", "youth", "zebra", "zero", "zone", "zoo",
272
+ ];
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The product's name, in exactly one place.
3
+ *
4
+ * Paul's call, 2026-08-18: "vaultline" is a crowded name — a forex-trading
5
+ * fintech, VaultLine Inc payment processing (they hold vaultline.com), an
6
+ * accounting firm, and vaultline.co all use it. A rebrand is likely before
7
+ * real marketing, so every NEW user-visible surface derives its name from
8
+ * here and rebrand day is an edit to this file plus the checklist below.
9
+ *
10
+ * What does NOT derive from here, deliberately — identity-bearing literals
11
+ * whose change breaks existing vaults and needs a migration, kept as
12
+ * literals where they live:
13
+ * - the npm package name ("vaultline") — republish + deprecate
14
+ * - the data directory (~/.vaultline) and archive/file extensions
15
+ * (.vlarchive, .vlmeta, .vlshare, .vlindex)
16
+ * - keystore service ids ("vaultline-cloud", provider credential refs)
17
+ * - managed cloud object paths (vaultline/<account>/…) and the plane URL
18
+ * - wire markers (VLA1 frame magic, AAD strings, HKDF info strings) —
19
+ * cryptographically load-bearing; never rename these
20
+ *
21
+ * Rebrand-day checklist beyond this file: package.json name, README/docs,
22
+ * site/index.html, web/ panel copy, the Spala plane's consent screen name,
23
+ * and the Google OAuth consent branding.
24
+ */
25
+ export declare const PRODUCT_NAME = "Sealkeep";
26
+ export declare const PRODUCT_SLUG = "sealkeep";
27
+ export declare const PRODUCT_MARK = "\u2311";
28
+ export declare const PRODUCT_ORG = "SPALA AI";
29
+ export declare const PRODUCT_URL = "https://sealkeep.spala.ai";
30
+ /** The visible folder a personal Drive keeps sealed archives in. */
31
+ export declare const DRIVE_FOLDER_DEFAULT = "Sealkeep";
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The product's name, in exactly one place.
3
+ *
4
+ * Paul's call, 2026-08-18: "vaultline" is a crowded name — a forex-trading
5
+ * fintech, VaultLine Inc payment processing (they hold vaultline.com), an
6
+ * accounting firm, and vaultline.co all use it. A rebrand is likely before
7
+ * real marketing, so every NEW user-visible surface derives its name from
8
+ * here and rebrand day is an edit to this file plus the checklist below.
9
+ *
10
+ * What does NOT derive from here, deliberately — identity-bearing literals
11
+ * whose change breaks existing vaults and needs a migration, kept as
12
+ * literals where they live:
13
+ * - the npm package name ("vaultline") — republish + deprecate
14
+ * - the data directory (~/.vaultline) and archive/file extensions
15
+ * (.vlarchive, .vlmeta, .vlshare, .vlindex)
16
+ * - keystore service ids ("vaultline-cloud", provider credential refs)
17
+ * - managed cloud object paths (vaultline/<account>/…) and the plane URL
18
+ * - wire markers (VLA1 frame magic, AAD strings, HKDF info strings) —
19
+ * cryptographically load-bearing; never rename these
20
+ *
21
+ * Rebrand-day checklist beyond this file: package.json name, README/docs,
22
+ * site/index.html, web/ panel copy, the Spala plane's consent screen name,
23
+ * and the Google OAuth consent branding.
24
+ */
25
+ export const PRODUCT_NAME = "Sealkeep";
26
+ export const PRODUCT_SLUG = "sealkeep";
27
+ export const PRODUCT_MARK = "⌑";
28
+ export const PRODUCT_ORG = "SPALA AI";
29
+ export const PRODUCT_URL = "https://sealkeep.spala.ai";
30
+ /** The visible folder a personal Drive keeps sealed archives in. */
31
+ export const DRIVE_FOLDER_DEFAULT = PRODUCT_NAME;