@orangecheck/legal 0.1.0 → 0.2.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/dist/index.js CHANGED
@@ -1,13 +1,11 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
- var Link = require('next/link');
5
4
  var jsxRuntime = require('react/jsx-runtime');
6
5
 
7
6
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
7
 
9
8
  var React__default = /*#__PURE__*/_interopDefault(React);
10
- var Link__default = /*#__PURE__*/_interopDefault(Link);
11
9
 
12
10
  // src/constants.ts
13
11
  var LEGAL_ENTITY = "OrangeCheck";
@@ -1234,11 +1232,58 @@ var terms3 = {
1234
1232
  blocks: [
1235
1233
  {
1236
1234
  kind: "para",
1237
- text: "OC Vault offers a free tier and paid tiers purchased with Bitcoin over the Lightning Network. OrangeCheck **receives** payment and never sends funds to users; OC Vault holds no custodial balance for you."
1235
+ text: "OC Vault offers a free tier and paid tiers purchased with Bitcoin over the Lightning Network. OrangeCheck **receives** payment and never sends funds to users; OC Vault holds no custodial balance for you. Cloud sync is granted by the **vault Cloud Annual** (21,000 sats / year) and **vault Cloud Lifetime** (210,000 sats one-time) tiers. All paid tiers are subject to the **service limits** below."
1238
1236
  },
1239
1237
  {
1240
1238
  kind: "stub",
1241
- text: "The full commercial terms for paid tiers \u2014 current pricing, what each tier includes, billing cycle and renewal behavior, the refund and cancellation policy, proration, and the consequences of non-renewal for stored data \u2014 are being finalized for publication. Current pricing is shown on /pricing. This section will be completed following review by counsel."
1239
+ text: "The full commercial terms for paid tiers \u2014 billing cycle and renewal behavior, the refund and cancellation policy, proration, and the consequences of non-renewal for stored data \u2014 are being finalized for publication. This section will be completed following review by counsel."
1240
+ }
1241
+ ]
1242
+ },
1243
+ {
1244
+ id: "service-limits",
1245
+ heading: "service limits",
1246
+ hint: "storage \xB7 per-entry size \xB7 bandwidth",
1247
+ blocks: [
1248
+ {
1249
+ kind: "para",
1250
+ text: "Every tier \u2014 including the one-time **Lifetime** tier \u2014 is subject to the following service limits. They are deliberately set well above the needs of a personal password vault but bound the storage and bandwidth a single account may consume on the shared infrastructure. The limits are **enforced in code**; exceeding them returns an HTTP 507 (storage) or 429 (rate) response."
1251
+ },
1252
+ { kind: "subhead", text: "storage" },
1253
+ {
1254
+ kind: "bullets",
1255
+ items: [
1256
+ {
1257
+ k: "entries per personal vault",
1258
+ v: "up to **5,000** entries (envelope ids). A brand-new entry counts against this ceiling; replacing an existing entry does not."
1259
+ },
1260
+ {
1261
+ k: "entries per team vault",
1262
+ v: "up to **5,000** entries, shared across team members."
1263
+ },
1264
+ {
1265
+ k: "per-entry size",
1266
+ v: "each entry's ciphertext is capped at **1.25 MB** (\u2248 1 MB of plaintext payload \u2014 sufficient for any password, TOTP seed, API key, note, or small file)."
1267
+ },
1268
+ {
1269
+ k: "total ciphertext per personal vault",
1270
+ v: "up to **\u2248 1 GiB** (1,073,741,824 bytes) of ciphertext per identity. Typical real-world vaults are well under 50 MB."
1271
+ },
1272
+ {
1273
+ k: "total ciphertext per team vault",
1274
+ v: "up to **\u2248 2 GiB** of ciphertext per team."
1275
+ }
1276
+ ]
1277
+ },
1278
+ { kind: "subhead", text: "bandwidth & request rate" },
1279
+ {
1280
+ kind: "para",
1281
+ text: "The API is rate-limited per IP address as a fair-use measure. Current ceilings: up to **1,000 blob reads / writes per minute**, **120 manifest listings per minute**, and **30 escrow-key writes per minute**. Exceeding a limit returns HTTP 429; legitimate clients retry with backoff. There is no per-month bandwidth cap; the delta-sync protocol makes a steady-state sync fetch only the change manifest, so day-to-day bandwidth use is negligible."
1282
+ },
1283
+ { kind: "subhead", text: "adjustments" },
1284
+ {
1285
+ kind: "para",
1286
+ text: "OrangeCheck may adjust these limits with reasonable advance notice \u2014 for example, to defend the service against abuse, to keep pace with infrastructure costs, or to lift a ceiling that is constraining legitimate use. We will not lower a limit below a number that would reduce **existing** data already stored under a paid tier without offering an export and a reasonable migration window."
1242
1287
  }
1243
1288
  ]
1244
1289
  },
@@ -1246,9 +1291,13 @@ var terms3 = {
1246
1291
  id: "lifetime",
1247
1292
  heading: "lifetime entitlements",
1248
1293
  blocks: [
1294
+ {
1295
+ kind: "para",
1296
+ text: "The one-time **Lifetime** tier grants cloud sync for the operational life of OC Vault, subject to the service limits above. The portable export feature is always free and works offline with [`@orangecheck/vault-core`](https://www.npmjs.com/package/@orangecheck/vault-core) \u2014 even if OC Vault is discontinued, you retain a self-decryptable copy of your data."
1297
+ },
1249
1298
  {
1250
1299
  kind: "stub",
1251
- text: 'OC Vault offers a one-time "lifetime" tier. The precise meaning of "lifetime" \u2014 the entitlement\u2019s duration and scope, what happens to it on a change of ownership or discontinuation of the Service, and OrangeCheck\u2019s commitments for data export and continuity if the Service winds down \u2014 is being finalized for publication. This section will be completed following review by counsel.'
1300
+ text: 'The precise legal meaning of "lifetime" \u2014 including treatment on a change of ownership, the wind-down notice period, and the export / continuity commitments OrangeCheck offers if the Service is discontinued \u2014 is being finalized for publication. This section will be completed following review by counsel.'
1252
1301
  }
1253
1302
  ]
1254
1303
  },
@@ -1354,6 +1403,10 @@ var privacy3 = {
1354
1403
  k: "encrypted blobs",
1355
1404
  v: "opaque ciphertext keyed to your identity address \u2014 OrangeCheck cannot decrypt it"
1356
1405
  },
1406
+ {
1407
+ k: "access tokens",
1408
+ v: "for developer / CLI / CI access: an SHA-256 hash of each token, an optional label, the granted scope (read or read-write), creation / last-used / optional expiry timestamps. We never store the token itself \u2014 only its hash."
1409
+ },
1357
1410
  {
1358
1411
  k: "technical data",
1359
1412
  v: "IP address and request metadata, for security and rate limiting"
@@ -1372,11 +1425,34 @@ var privacy3 = {
1372
1425
  "The contents of any vault item",
1373
1426
  "The names, titles, or types of your items",
1374
1427
  "How many items you store or how often you use them",
1375
- "Your vault key or any recovery material"
1428
+ "Your vault key or any recovery material",
1429
+ "Your access tokens (only the SHA-256 hash is stored)",
1430
+ "Which sites the browser extension autofilled on \u2014 origin matching happens locally in your browser"
1376
1431
  ]
1377
1432
  }
1378
1433
  ]
1379
1434
  },
1435
+ {
1436
+ id: "surfaces",
1437
+ heading: "vault surfaces (web, extension, CLI, SDK)",
1438
+ hint: "same vault, same zero-knowledge guarantee",
1439
+ blocks: [
1440
+ {
1441
+ kind: "para",
1442
+ text: "The same encrypted vault is reachable from three surfaces. The zero-knowledge guarantee \u2014 that OrangeCheck only ever holds ciphertext \u2014 applies to all of them."
1443
+ },
1444
+ { kind: "subhead", text: "browser extension (OC Vault for Chromium / Firefox)" },
1445
+ {
1446
+ kind: "para",
1447
+ text: "The extension fetches the same encrypted blobs the web app does, caches them **as ciphertext** in browser-extension storage, and decrypts in the service worker only after you enter your passphrase. The vault key lives in memory and a RAM-only `storage.session` slot \u2014 it is never written to disk. The content script that offers autofill receives **one entry's field values at fill time** and nothing else; it never receives the vault key or the entry index. The extension talks only to your own `vault.ochk.io` account: no analytics, no telemetry, no remote code."
1448
+ },
1449
+ { kind: "subhead", text: "developer platform \u2014 access tokens, CLI, SDK, GitHub Action" },
1450
+ {
1451
+ kind: "para",
1452
+ text: "For headless access (`oc-vault` CLI, the `@orangecheck/vault-core` SDK, CI / GitHub Actions), you may mint **access tokens** at [vault.ochk.io/vault/developer](https://vault.ochk.io/vault/developer). A token authorizes **transport only** \u2014 it lets the caller fetch your encrypted blobs and the passphrase-wrapped escrow, and (for tokens minted with a write scope) write new ciphertext. **A token carries no key material:** a leaked token yields only ciphertext, the same thing the server already holds. The passphrase still performs decryption in your local process and is never transmitted. We store only the SHA-256 hash of each token; tokens can be revoked at any time from the same page."
1453
+ }
1454
+ ]
1455
+ },
1380
1456
  {
1381
1457
  id: "cookies",
1382
1458
  heading: "cookies & analytics",
@@ -1785,23 +1861,17 @@ function renderInline(text) {
1785
1861
  if (link) {
1786
1862
  const label = link[1] ?? "";
1787
1863
  const href = link[2] ?? "";
1788
- if (/^https?:\/\//.test(href)) {
1789
- return /* @__PURE__ */ jsxRuntime.jsx(
1790
- "a",
1791
- {
1792
- href,
1793
- target: "_blank",
1794
- rel: "noopener noreferrer",
1795
- className: "text-primary underline",
1796
- children: label
1797
- },
1798
- i
1799
- );
1800
- }
1801
- if (href.startsWith("mailto:")) {
1802
- return /* @__PURE__ */ jsxRuntime.jsx("a", { href, className: "text-primary underline", children: label }, i);
1803
- }
1804
- return /* @__PURE__ */ jsxRuntime.jsx(Link__default.default, { href, className: "text-primary underline", children: label }, i);
1864
+ const external = /^https?:\/\//.test(href);
1865
+ return /* @__PURE__ */ jsxRuntime.jsx(
1866
+ "a",
1867
+ {
1868
+ href,
1869
+ className: "text-primary underline",
1870
+ ...external ? { target: "_blank", rel: "noopener noreferrer" } : {},
1871
+ children: label
1872
+ },
1873
+ i
1874
+ );
1805
1875
  }
1806
1876
  return /* @__PURE__ */ jsxRuntime.jsx(React__default.default.Fragment, { children: part }, i);
1807
1877
  });