@percher/shared 1.0.2 → 1.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.
Files changed (85) hide show
  1. package/dist/billing-test-accounts.d.ts +20 -0
  2. package/dist/billing-test-accounts.d.ts.map +1 -0
  3. package/dist/billing-test-accounts.js +32 -0
  4. package/dist/billing-test-accounts.js.map +1 -0
  5. package/dist/crash-prompt.d.ts +8 -0
  6. package/dist/crash-prompt.d.ts.map +1 -0
  7. package/dist/crash-prompt.js +10 -0
  8. package/dist/crash-prompt.js.map +1 -0
  9. package/dist/data-filter.d.ts +27 -0
  10. package/dist/data-filter.d.ts.map +1 -0
  11. package/dist/data-filter.js +288 -0
  12. package/dist/data-filter.js.map +1 -0
  13. package/dist/data-records.d.ts +359 -0
  14. package/dist/data-records.d.ts.map +1 -0
  15. package/dist/data-records.js +124 -0
  16. package/dist/data-records.js.map +1 -0
  17. package/dist/disposable-email-domains.d.ts +11 -0
  18. package/dist/disposable-email-domains.d.ts.map +1 -0
  19. package/dist/disposable-email-domains.js +112 -0
  20. package/dist/disposable-email-domains.js.map +1 -0
  21. package/dist/domain-name.d.ts +14 -0
  22. package/dist/domain-name.d.ts.map +1 -0
  23. package/dist/domain-name.js +14 -0
  24. package/dist/domain-name.js.map +1 -0
  25. package/dist/email-budget.d.ts +60 -0
  26. package/dist/email-budget.d.ts.map +1 -0
  27. package/dist/email-budget.js +135 -0
  28. package/dist/email-budget.js.map +1 -0
  29. package/dist/env-mask.d.ts +17 -0
  30. package/dist/env-mask.d.ts.map +1 -0
  31. package/dist/env-mask.js +23 -0
  32. package/dist/env-mask.js.map +1 -0
  33. package/dist/env-name.d.ts +25 -0
  34. package/dist/env-name.d.ts.map +1 -0
  35. package/dist/env-name.js +25 -0
  36. package/dist/env-name.js.map +1 -0
  37. package/dist/escape-html.d.ts +10 -0
  38. package/dist/escape-html.d.ts.map +1 -0
  39. package/dist/escape-html.js +17 -0
  40. package/dist/escape-html.js.map +1 -0
  41. package/dist/image-rejection.d.ts +45 -0
  42. package/dist/image-rejection.d.ts.map +1 -0
  43. package/dist/image-rejection.js +27 -0
  44. package/dist/image-rejection.js.map +1 -0
  45. package/dist/index.d.ts +15 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +15 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/internal-sig.d.ts +2 -2
  50. package/dist/internal-sig.js +2 -2
  51. package/dist/legal-changes.d.ts +5 -7
  52. package/dist/legal-changes.d.ts.map +1 -1
  53. package/dist/legal-changes.js +189 -6
  54. package/dist/legal-changes.js.map +1 -1
  55. package/dist/legal.d.ts +16 -16
  56. package/dist/legal.d.ts.map +1 -1
  57. package/dist/legal.js +15 -15
  58. package/dist/legal.js.map +1 -1
  59. package/dist/oauth-scopes.d.ts +8 -0
  60. package/dist/oauth-scopes.d.ts.map +1 -1
  61. package/dist/oauth-scopes.js +11 -13
  62. package/dist/oauth-scopes.js.map +1 -1
  63. package/dist/platform.d.ts +2 -2
  64. package/dist/platform.js +2 -2
  65. package/dist/secure-compare.d.ts +16 -0
  66. package/dist/secure-compare.d.ts.map +1 -0
  67. package/dist/secure-compare.js +27 -0
  68. package/dist/secure-compare.js.map +1 -0
  69. package/dist/signup-capacity.d.ts +12 -0
  70. package/dist/signup-capacity.d.ts.map +1 -0
  71. package/dist/signup-capacity.js +29 -0
  72. package/dist/signup-capacity.js.map +1 -0
  73. package/dist/signup-day.d.ts +7 -0
  74. package/dist/signup-day.d.ts.map +1 -0
  75. package/dist/signup-day.js +42 -0
  76. package/dist/signup-day.js.map +1 -0
  77. package/dist/switches.d.ts +88 -0
  78. package/dist/switches.d.ts.map +1 -0
  79. package/dist/switches.js +232 -0
  80. package/dist/switches.js.map +1 -0
  81. package/dist/waitlist-token.d.ts +49 -0
  82. package/dist/waitlist-token.d.ts.map +1 -0
  83. package/dist/waitlist-token.js +71 -0
  84. package/dist/waitlist-token.js.map +1 -0
  85. package/package.json +11 -1
@@ -1 +1 @@
1
- {"version":3,"file":"legal-changes.d.ts","sourceRoot":"","sources":["../src/legal-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAElD;;;;;;;;;;;;;;;;;GAiBG;AAEH,sFAAsF;AACtF,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,UAAU,GACV,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,eAAe,CAAC;AAEpB;;;;;;;;;;GAUG;AACH,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;AAEjG,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,uBAAuB,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,2FAA2F;IAC3F,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,WAAW,EAAE,UAAU,GAAG,WAAW,CAAC;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,sBAAsB,CAAC;IACpC,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C;;;OAGG;IACH,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,oFAAoF;IACpF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAAO,CAAC;AAExD;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;AAEtE,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,QAA2B,CAAC;AAElE,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,QAAiD,CAAC;AAEtF,2FAA2F;AAC3F,eAAO,MAAM,qBAAqB,QAAyB,CAAC;AAE5D;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAgBpE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,SAAS,WAAW,EAAkB,GAC9C,WAAW,EAAE,CAIf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,SAAS,WAAW,EAAkB,GAC9C,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA6BnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,SAAS,WAAW,EAAkB,GAC9C,WAAW,GAAG,IAAI,CAiBpB"}
1
+ {"version":3,"file":"legal-changes.d.ts","sourceRoot":"","sources":["../src/legal-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAElD;;;;;;;;;;;;;;;;;GAiBG;AAEH,sFAAsF;AACtF,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,UAAU,GACV,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,eAAe,CAAC;AAEpB;;;;;;;;;;GAUG;AACH,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG,sBAAsB,GAAG,kBAAkB,CAAC;AAEjG,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,uBAAuB,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,gBAAgB,CAAC;IACtB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,2FAA2F;IAC3F,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,WAAW,EAAE,UAAU,GAAG,WAAW,CAAC;IACtC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,sBAAsB,CAAC;IACpC,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,yGAAyG;IACzG,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,SAAS,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC1C;;;OAGG;IACH,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpC,oFAAoF;IACpF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sFAAsF;IACtF,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,gFAAgF;AAChF,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EA0L/C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,gCAAgC,CAAC;AAEtE,gEAAgE;AAChE,eAAO,MAAM,yBAAyB,QAA2B,CAAC;AAElE,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,QAAiD,CAAC;AAEtF,2FAA2F;AAC3F,eAAO,MAAM,qBAAqB,QAAyB,CAAC;AAE5D;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAiBpE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,SAAS,WAAW,EAAkB,GAC9C,WAAW,EAAE,CAIf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,gBAAgB,EACrB,OAAO,GAAE,SAAS,WAAW,EAAkB,GAC9C,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CA6BnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACpC,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,SAAS,WAAW,EAAkB,GAC9C,WAAW,GAAG,IAAI,CAiBpB"}
@@ -1,10 +1,192 @@
1
1
  import { LEGAL_DOCUMENT_VERSIONS } from "./legal.js";
2
- /**
3
- * Newest last. Empty because version 1.0 is the first publication under
4
- * Kaizensu AB: there is no earlier version to have changed from, so the chain
5
- * starts here rather than being backfilled with a notice nobody was owed.
6
- */
7
- export const LEGAL_CHANGES = [];
2
+ /** Newest last. Editorial corrections record the published document history. */
3
+ export const LEGAL_CHANGES = [
4
+ {
5
+ id: "2026-09-21-cookie-inventory-correction",
6
+ materiality: "editorial",
7
+ reason: "clarification",
8
+ enforcement: "notice_only",
9
+ announceAt: "2026-09-21T00:00:00.000Z",
10
+ effectiveAt: "2026-09-21T00:00:00.000Z",
11
+ documents: [{ key: "cookies", from: "1.0", to: "1.0.1" }],
12
+ summary: {
13
+ en: "Removed an unused social sign-in cookie from the cookie inventory. Percher accounts use email and password; the GitHub App connection cookie remains listed.",
14
+ sv: "Tog bort en oanvänd cookie för social inloggning från cookieförteckningen. Percher-konton använder e-post och lösenord; cookien för anslutning av GitHub App finns kvar.",
15
+ },
16
+ },
17
+ {
18
+ id: "2026-09-21-badge-storage-removal",
19
+ materiality: "editorial",
20
+ reason: "clarification",
21
+ enforcement: "notice_only",
22
+ announceAt: "2026-09-21T00:00:00.000Z",
23
+ effectiveAt: "2026-09-21T00:00:00.000Z",
24
+ documents: [{ key: "cookies", from: "1.0.1", to: "1.0.2" }],
25
+ summary: {
26
+ en: "Removed the badge preference from the storage inventory. The Percher badge is now an icon link and no longer stores a collapse preference.",
27
+ sv: "Tog bort emblemets inställning från lagringsförteckningen. Percher-emblemet är nu en ikonlänk och sparar inte längre om det är hopfällt.",
28
+ },
29
+ },
30
+ {
31
+ id: "2026-09-22-precision-corrections",
32
+ materiality: "editorial",
33
+ reason: "clarification",
34
+ enforcement: "notice_only",
35
+ announceAt: "2026-09-22T00:00:00.000Z",
36
+ effectiveAt: "2026-09-22T00:00:00.000Z",
37
+ documents: [
38
+ { key: "terms", from: "1.0", to: "1.0.1" },
39
+ { key: "aup", from: "1.0", to: "1.0.1" },
40
+ { key: "privacy", from: "1.0", to: "1.0.1" },
41
+ { key: "cookies", from: "1.0.2", to: "1.0.3" },
42
+ { key: "subprocessors", from: "1.0", to: "1.0.1" },
43
+ ],
44
+ summary: {
45
+ en: "Corrections and shortening, no change to rights or obligations. The Privacy Policy now states the retention periods the Service applies to abuse reports and support cases. The Cookie Policy names the app-access cookies as set (__Host- prefix) and drops text repeated from the Privacy Policy. The AUP and Terms drop rules stated twice, the ARN filing fee and the AUP contact section; the language rule now sits in each document's header. The AUP keeps the rule against scraping the Service and restates the sanctions and export-control law that already applies.",
46
+ sv: "Rättelser och förkortning, utan ändring av rättigheter eller skyldigheter. Integritetspolicyn anger nu de lagringstider som Tjänsten tillämpar för missbruksanmälningar och supportärenden. Cookiepolicyn anger appåtkomstcookierna som de sätts (prefixet __Host-) och tar bort text som upprepas från Integritetspolicyn. AUP:n och Villkoren tar bort regler som angavs två gånger, ARN:s anmälningsavgift och AUP:ns kontaktavsnitt; språkregeln finns nu i varje dokuments sidhuvud. AUP:n behåller regeln mot att skrapa Tjänsten och återger den sanktions- och exportkontrollagstiftning som redan gäller.",
47
+ },
48
+ },
49
+ {
50
+ id: "2026-09-24-crash-diagnostics-without-external-ai",
51
+ materiality: "editorial",
52
+ reason: "provider_change",
53
+ enforcement: "notice_only",
54
+ announceAt: "2026-09-24T00:00:00.000Z",
55
+ effectiveAt: "2026-09-24T00:00:00.000Z",
56
+ documents: [
57
+ { key: "terms", from: "1.0.1", to: "1.0.2" },
58
+ { key: "privacy", from: "1.0.1", to: "1.0.2" },
59
+ { key: "subprocessors", from: "1.0.1", to: "1.0.2" },
60
+ ],
61
+ summary: {
62
+ en: "Crash Diagnostics now come from fixed rules within Percher, and crash logs are not sent to an external AI provider. The option of external AI crash analysis, which was switched off, is removed, and its provider is no longer listed. Section 3.3 explicitly refers to Section 9 and mandatory law for liability. No new processing and no change to your rights or obligations.",
63
+ sv: "Kraschdiagnostik tas nu fram med fasta regler inom Percher, och kraschloggar skickas inte till någon extern AI-leverantör. Möjligheten till extern AI-kraschanalys, som var avstängd, tas bort och dess leverantör listas inte längre. Avsnitt 3.3 hänvisar uttryckligen till avsnitt 9 och tvingande lag för ansvar. Ingen ny behandling och ingen ändring av dina rättigheter eller skyldigheter.",
64
+ },
65
+ },
66
+ {
67
+ // Agent recommendation: inventory correction only; ship with the export implementation.
68
+ id: "2026-10-11-portability-export-inventory",
69
+ materiality: "editorial",
70
+ reason: "clarification",
71
+ enforcement: "notice_only",
72
+ announceAt: "2026-10-11T00:00:00.000Z",
73
+ effectiveAt: "2026-10-11T00:00:00.000Z",
74
+ documents: [{ key: "dataPortability", from: "1.0", to: "1.0.1" }],
75
+ summary: {
76
+ en: "The Data Portability Register lists the exported source, retained deployment history, visitor statistics, build and runtime logs, and crash reports. It explains archive link exclusions, log masking and unavailable data. This updates the technical inventory without changing switching rights or obligations.",
77
+ sv: "Dataportabilitetsregistret listar exporterad källkod, bevarad driftsättningshistorik, besöksstatistik, bygg- och körningsloggar samt kraschrapporter. Det förklarar undantagna arkivlänkar, maskering av loggar och otillgängliga data. Den tekniska förteckningen uppdateras utan ändring av rättigheter eller skyldigheter vid byte.",
78
+ },
79
+ },
80
+ {
81
+ // Editorial inventory only (ops declaration 2026-10-11, no mail): storage keys, exported fields, dates.
82
+ id: "2026-10-11-browser-storage-inventory",
83
+ materiality: "editorial",
84
+ reason: "clarification",
85
+ enforcement: "notice_only",
86
+ announceAt: "2026-10-11T00:00:00.000Z",
87
+ effectiveAt: "2026-10-11T00:00:00.000Z",
88
+ documents: [
89
+ { key: "cookies", from: "1.0.3", to: "1.0.4" },
90
+ { key: "terms", from: "1.0.2", to: "1.0.3" },
91
+ { key: "dataPortability", from: "1.0.1", to: "1.0.2" },
92
+ ],
93
+ summary: {
94
+ en: "The Cookie Policy lists existing rollback and admin interface storage, corrects the theme-key description and identifies application/deployment identifiers. The Register lists exported moderation codes and preview orientations. The Terms last-updated dates are aligned. No change to processing, rights or obligations.",
95
+ sv: "Cookiepolicyn listar befintlig lagring för återställning och administratörsgränssnittet, rättar beskrivningen av temanycklar och anger applikations- och publiceringsidentifierare. Registret listar exporterade modereringskoder och förhandsbildsorienteringar. Villkorens uppdateringsdatum samordnas. Ingen ändring av behandling, rättigheter eller skyldigheter.",
96
+ },
97
+ },
98
+ {
99
+ // Editorial (owner decision 2026-10-11: current facts go live at merge, no waiting date; no mail).
100
+ id: "2026-10-11-privacy-portability-current-facts",
101
+ materiality: "editorial",
102
+ reason: "legal_compliance",
103
+ enforcement: "notice_only",
104
+ announceAt: "2026-10-11T00:00:00.000Z",
105
+ effectiveAt: "2026-10-11T00:00:00.000Z",
106
+ documents: [
107
+ { key: "privacy", from: "1.0.2", to: "1.0.3" },
108
+ { key: "dataPortability", from: "1.0.2", to: "1.0.3" },
109
+ ],
110
+ summary: {
111
+ en: "Clarifies existing encryption, account password storage, log retention and beta invitation-use records. No processing or rights change.",
112
+ sv: "Förtydligar befintlig kryptering, lagring av kontolösenord, loggarnas lagringstider och uppgifter om användning av betainbjudningar. Ingen ändring av behandling eller rättigheter.",
113
+ },
114
+ },
115
+ {
116
+ // Editorial inventory (owner decision 2026-10-11: current facts go live at merge; no mail).
117
+ id: "2026-10-11-portability-image-exports",
118
+ materiality: "editorial",
119
+ reason: "clarification",
120
+ enforcement: "notice_only",
121
+ announceAt: "2026-10-11T00:00:00.000Z",
122
+ effectiveAt: "2026-10-11T00:00:00.000Z",
123
+ documents: [{ key: "dataPortability", from: "1.0.3", to: "1.0.4" }],
124
+ summary: {
125
+ en: "The Data Portability Register lists image downloads and source-less app bundles.",
126
+ sv: "Dataportabilitetsregistret listar nedladdning av bilder och appaket utan källkod.",
127
+ },
128
+ },
129
+ {
130
+ // Editorial (owner decision 2026-10-12: CLI/MCP usage telemetry is opt-in; no mail).
131
+ id: "2026-10-12-telemetry-opt-in",
132
+ materiality: "editorial",
133
+ reason: "clarification",
134
+ enforcement: "notice_only",
135
+ announceAt: "2026-10-12T00:00:00.000Z",
136
+ effectiveAt: "2026-10-12T00:00:00.000Z",
137
+ documents: [{ key: "privacy", from: "1.0.3", to: "1.0.4" }],
138
+ summary: {
139
+ en: "CLI and MCP usage statistics are sent only after the user turns them on, by answering yes to the CLI's one-time question or running percher telemetry on, and can be turned off at any time. The legal basis for these statistics is consent.",
140
+ sv: "Användningsstatistik från CLI och MCP skickas först när användaren slagit på den, genom att svara ja på CLI:ns engångsfråga eller köra percher telemetry on, och kan stängas av när som helst. Den rättsliga grunden för statistiken är samtycke.",
141
+ },
142
+ },
143
+ {
144
+ // No mail: every pre-publication account is the controller's own (owner decision 2026-10-07).
145
+ id: "2026-11-07-beta-dashboard-app-data",
146
+ materiality: "material",
147
+ reason: "service_change",
148
+ enforcement: "notice_only",
149
+ announceAt: "2026-10-07T10:00:00.000Z",
150
+ effectiveAt: "2026-11-07T00:00:00.000Z",
151
+ appliesToNewAccountsFromSignup: true,
152
+ documents: [{ key: "subprocessors", from: "1.0.2", to: "1.1" }],
153
+ summary: {
154
+ en: "During the beta, App Data (logs, files, database content and diagnostics) for ordinary support goes through dashboard cases, including public support access. For accounts created on or after publication, this applies from signup. For earlier accounts, it applies from the effective date; until then, cases are requested but not required and emailed App Data is handled under current terms. The abuse@, security@ and legal@ reporting channels are unchanged. Percher's own support emails contain notifications and links, never case content.",
155
+ sv: "Under betan lämnas Appdata (loggar, filer, databasinnehåll och diagnostik) för vanlig support via ärenden i dashboarden, inklusive publik supportåtkomst. För konton skapade på eller efter publiceringen gäller detta från registreringen. För äldre konton gäller det från ikraftträdandedatumet; tills dess önskas men krävs inte ärenden, och Appdata via e-post hanteras enligt nuvarande villkor. Rapporteringskanalerna abuse@, security@ och legal@ är oförändrade. Perchers egna e-postmeddelanden om support innehåller aviseringar och länkar, aldrig ärendeinnehåll.",
156
+ },
157
+ },
158
+ {
159
+ // No mail while every pre-publication account is the controller's own (owner decision 2026-10-11).
160
+ id: "2026-11-16-subprocessor-spacemail",
161
+ materiality: "material",
162
+ reason: "legal_compliance",
163
+ enforcement: "notice_only",
164
+ announceAt: "2026-10-11T14:30:00.000Z",
165
+ effectiveAt: "2026-11-16T00:00:00.000Z",
166
+ appliesToNewAccountsFromSignup: true,
167
+ documents: [{ key: "subprocessors", from: "1.1", to: "1.2" }],
168
+ summary: {
169
+ en: "Spaceship, Inc. (Spacemail) is listed as a sub-processor. It hosts the support@, abuse@, security@ and legal@percher.app mailboxes in the United States, including addresses and message content, which may include App Data. Transfers rely on the Standard Contractual Clauses (Module Two) in Spaceship's Data Processing Addendum. Spaceship may use OpenAI's Moderation tool, with OpenAI as its sub-processor, to scan parts of emails for spam and phishing.",
170
+ sv: "Spaceship, Inc. (Spacemail) anges som underbiträde. Spaceship driver e-postlådorna support@, abuse@, security@ och legal@percher.app och behandlar adresser och meddelandeinnehåll, som kan innehålla Appdata, i USA. Överföringarna sker med stöd av standardavtalsklausulerna (modul två) i Spaceships personuppgiftsbiträdesavtal. Spaceship kan använda OpenAI:s Moderation-verktyg, med OpenAI som underbiträde, för att skanna delar av e-post efter skräppost och nätfiske.",
171
+ },
172
+ },
173
+ {
174
+ // No mail while every pre-publication account is the controller's own (owner decision 2026-10-11:
175
+ // the DPA clause is the only material item; the Terms promise 30 days' notice, so it keeps its date).
176
+ id: "2026-11-16-dpa-prior-subprocessor-notice",
177
+ materiality: "material",
178
+ reason: "legal_compliance",
179
+ enforcement: "notice_only",
180
+ announceAt: "2026-10-11T17:45:00.000Z",
181
+ effectiveAt: "2026-11-16T00:00:00.000Z",
182
+ appliesToNewAccountsFromSignup: true,
183
+ documents: [{ key: "dpa", from: "1.0", to: "1.1" }],
184
+ summary: {
185
+ en: "The DPA requires notice before a subprocessor is added or replaced, including urgent changes. The existing right to object on reasonable data-protection grounds remains.",
186
+ sv: "DPA:n kräver information innan ett underbiträde läggs till eller byts ut, även vid brådskande ändringar. Den befintliga rätten att invända på skäliga dataskyddsgrunder kvarstår.",
187
+ },
188
+ },
189
+ ];
8
190
  /**
9
191
  * Header carrying the change ids the signup form actually rendered.
10
192
  *
@@ -29,6 +211,7 @@ export const LEGAL_VERSION_PATTERN = /^\d+\.\d+(?:\.\d+)?$/;
29
211
  export function canonicalLegalChangeJson(change) {
30
212
  return JSON.stringify({
31
213
  announceAt: change.announceAt,
214
+ ...(change.appliesToNewAccountsFromSignup ? { appliesToNewAccountsFromSignup: true } : {}),
32
215
  documents: change.documents.map((document) => ({
33
216
  from: document.from,
34
217
  key: document.key,
@@ -1 +1 @@
1
- {"version":3,"file":"legal-changes.js","sourceRoot":"","sources":["../src/legal-changes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"legal-changes.js","sourceRoot":"","sources":["../src/legal-changes.ts"],"names":[],"mappings":"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"}
package/dist/legal.d.ts CHANGED
@@ -12,13 +12,13 @@
12
12
  * re-acceptance.
13
13
  */
14
14
  export declare const LEGAL_DOCUMENT_VERSIONS: {
15
- readonly terms: "1.0";
16
- readonly aup: "1.0";
17
- readonly privacy: "1.0";
18
- readonly cookies: "1.0";
19
- readonly dpa: "1.0";
20
- readonly subprocessors: "1.0";
21
- readonly dataPortability: "1.0";
15
+ readonly terms: "1.0.3";
16
+ readonly aup: "1.0.1";
17
+ readonly privacy: "1.0.4";
18
+ readonly cookies: "1.0.4";
19
+ readonly dpa: "1.1";
20
+ readonly subprocessors: "1.2";
21
+ readonly dataPortability: "1.0.4";
22
22
  };
23
23
  /**
24
24
  * What each published document said at the version above.
@@ -39,18 +39,18 @@ export declare const LEGAL_DOCUMENT_VERSIONS: {
39
39
  * belongs to.
40
40
  */
41
41
  export declare const LEGAL_DOCUMENT_HASHES: {
42
- readonly terms: "d412c9e85d7fefa5e3595b47aaea67a5d9f495955e458b2d0b4f43c9215317ce";
43
- readonly aup: "138ce3bdd9d244a4f31c98955b3c9d59920f32c056608f1135dc8393769a761f";
44
- readonly privacy: "186910f4f4825d3ac3bbc3340e7bf4babccea33f8b4166a10c892a7012cff175";
45
- readonly cookies: "9c8250a4ea2fbf701d04cfb145d466ff8ba410e6da92433950f119952ba16bf0";
46
- readonly dpa: "4c97fd36c886a113477f3eb2c2c0a9b5e03820ec624439906c938bbd40f7a0fb";
47
- readonly subprocessors: "e7380f2d604814e1f06f44d8c4afcb34143c1c7994dfecdcec4cf1bbc8810363";
48
- readonly dataPortability: "27a7d3ec0175af8f3f1c67db1a65bf01f74d5139b44d9134caef5dd8a924d775";
42
+ readonly terms: "3c4dc48737355c08d5377a734822708498c6be804dcc26691ebef5b149f16529";
43
+ readonly aup: "355feaa5c38bc2fb84ef66de73f16f2c7fcd25216b30399c451c263aa5c16597";
44
+ readonly privacy: "a2465b91198da6a8efe497670b78cd2d49cc8a80358e11dcf1b6cb3830a2746a";
45
+ readonly cookies: "a753071132bb9e29153a8dbf7be3ff267e518af6d1911095a878281f34e6bf07";
46
+ readonly dpa: "551ada1a43712a1a44b495dfd96be403162b8034a8f39b8537283c1976329ca4";
47
+ readonly subprocessors: "d795eef4af2bb8c2c182c748007b6d06c6a7c4dbf6babb4ca6c3758bf2e00d26";
48
+ readonly dataPortability: "76de68d4fe2cb09e2a597a1238b5e9d9299c4633d0ae70572fb7c5d02fbc2876";
49
49
  };
50
50
  /** Version of the canonical English Terms presented during account acceptance. */
51
- export declare const CURRENT_TERMS_VERSION: "1.0";
51
+ export declare const CURRENT_TERMS_VERSION: "1.0.3";
52
52
  /** The "Last updated" date shared by the current revision of the documents. */
53
- export declare const LEGAL_DOCUMENT_LAST_UPDATED = "10 September 2026";
53
+ export declare const LEGAL_DOCUMENT_LAST_UPDATED = "11 October 2026";
54
54
  export interface TermsAcceptanceEvidence {
55
55
  version?: string;
56
56
  language?: "en" | "sv";
@@ -1 +1 @@
1
- {"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB;aAClC,KAAK,EAAE,KAAK;aACZ,GAAG,EAAE,KAAK;aACV,OAAO,EAAE,KAAK;aACd,OAAO,EAAE,KAAK;aACd,GAAG,EAAE,KAAK;aACV,aAAa,EAAE,KAAK;aACpB,eAAe,EAAE,KAAK;CACd,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB;aAChC,KAAK,EAAE,kEAAkE;aACzE,GAAG,EAAE,kEAAkE;aACvE,OAAO,EAAE,kEAAkE;aAC3E,OAAO,EAAE,kEAAkE;aAC3E,GAAG,EAAE,kEAAkE;aACvE,aAAa,EAAE,kEAAkE;aACjF,eAAe,EAAE,kEAAkE;CAC3E,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,OAAgC,CAAC;AAEnE,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAE/D,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB"}
1
+ {"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB;aAClC,KAAK,EAAE,OAAO;aACd,GAAG,EAAE,OAAO;aACZ,OAAO,EAAE,OAAO;aAChB,OAAO,EAAE,OAAO;aAChB,GAAG,EAAE,KAAK;aACV,aAAa,EAAE,KAAK;aACpB,eAAe,EAAE,OAAO;CAChB,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB;aAChC,KAAK,EAAE,kEAAkE;aACzE,GAAG,EAAE,kEAAkE;aACvE,OAAO,EAAE,kEAAkE;aAC3E,OAAO,EAAE,kEAAkE;aAC3E,GAAG,EAAE,kEAAkE;aACvE,aAAa,EAAE,kEAAkE;aACjF,eAAe,EAAE,kEAAkE;CAC3E,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,SAAgC,CAAC;AAEnE,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAE7D,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB"}
package/dist/legal.js CHANGED
@@ -12,13 +12,13 @@
12
12
  * re-acceptance.
13
13
  */
14
14
  export const LEGAL_DOCUMENT_VERSIONS = {
15
- terms: "1.0",
16
- aup: "1.0",
17
- privacy: "1.0",
18
- cookies: "1.0",
19
- dpa: "1.0",
20
- subprocessors: "1.0",
21
- dataPortability: "1.0",
15
+ terms: "1.0.3",
16
+ aup: "1.0.1",
17
+ privacy: "1.0.4",
18
+ cookies: "1.0.4",
19
+ dpa: "1.1",
20
+ subprocessors: "1.2",
21
+ dataPortability: "1.0.4",
22
22
  };
23
23
  /**
24
24
  * What each published document said at the version above.
@@ -39,16 +39,16 @@ export const LEGAL_DOCUMENT_VERSIONS = {
39
39
  * belongs to.
40
40
  */
41
41
  export const LEGAL_DOCUMENT_HASHES = {
42
- terms: "d412c9e85d7fefa5e3595b47aaea67a5d9f495955e458b2d0b4f43c9215317ce",
43
- aup: "138ce3bdd9d244a4f31c98955b3c9d59920f32c056608f1135dc8393769a761f",
44
- privacy: "186910f4f4825d3ac3bbc3340e7bf4babccea33f8b4166a10c892a7012cff175",
45
- cookies: "9c8250a4ea2fbf701d04cfb145d466ff8ba410e6da92433950f119952ba16bf0",
46
- dpa: "4c97fd36c886a113477f3eb2c2c0a9b5e03820ec624439906c938bbd40f7a0fb",
47
- subprocessors: "e7380f2d604814e1f06f44d8c4afcb34143c1c7994dfecdcec4cf1bbc8810363",
48
- dataPortability: "27a7d3ec0175af8f3f1c67db1a65bf01f74d5139b44d9134caef5dd8a924d775",
42
+ terms: "3c4dc48737355c08d5377a734822708498c6be804dcc26691ebef5b149f16529",
43
+ aup: "355feaa5c38bc2fb84ef66de73f16f2c7fcd25216b30399c451c263aa5c16597",
44
+ privacy: "a2465b91198da6a8efe497670b78cd2d49cc8a80358e11dcf1b6cb3830a2746a",
45
+ cookies: "a753071132bb9e29153a8dbf7be3ff267e518af6d1911095a878281f34e6bf07",
46
+ dpa: "551ada1a43712a1a44b495dfd96be403162b8034a8f39b8537283c1976329ca4",
47
+ subprocessors: "d795eef4af2bb8c2c182c748007b6d06c6a7c4dbf6babb4ca6c3758bf2e00d26",
48
+ dataPortability: "76de68d4fe2cb09e2a597a1238b5e9d9299c4633d0ae70572fb7c5d02fbc2876",
49
49
  };
50
50
  /** Version of the canonical English Terms presented during account acceptance. */
51
51
  export const CURRENT_TERMS_VERSION = LEGAL_DOCUMENT_VERSIONS.terms;
52
52
  /** The "Last updated" date shared by the current revision of the documents. */
53
- export const LEGAL_DOCUMENT_LAST_UPDATED = "10 September 2026";
53
+ export const LEGAL_DOCUMENT_LAST_UPDATED = "11 October 2026";
54
54
  //# sourceMappingURL=legal.js.map
package/dist/legal.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"legal.js","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,KAAK;IACZ,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,GAAG,EAAE,KAAK;IACV,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,KAAK;CACd,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,kEAAkE;IACzE,GAAG,EAAE,kEAAkE;IACvE,OAAO,EAAE,kEAAkE;IAC3E,OAAO,EAAE,kEAAkE;IAC3E,GAAG,EAAE,kEAAkE;IACvE,aAAa,EAAE,kEAAkE;IACjF,eAAe,EAAE,kEAAkE;CAC3E,CAAC;AAEX,kFAAkF;AAClF,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,KAAK,CAAC;AAEnE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,mBAAmB,CAAC"}
1
+ {"version":3,"file":"legal.js","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,OAAO;IACZ,OAAO,EAAE,OAAO;IAChB,OAAO,EAAE,OAAO;IAChB,GAAG,EAAE,KAAK;IACV,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,OAAO;CAChB,CAAC;AAEX;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,kEAAkE;IACzE,GAAG,EAAE,kEAAkE;IACvE,OAAO,EAAE,kEAAkE;IAC3E,OAAO,EAAE,kEAAkE;IAC3E,GAAG,EAAE,kEAAkE;IACvE,aAAa,EAAE,kEAAkE;IACjF,eAAe,EAAE,kEAAkE;CAC3E,CAAC;AAEX,kFAAkF;AAClF,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC,KAAK,CAAC;AAEnE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,iBAAiB,CAAC"}
@@ -11,7 +11,15 @@
11
11
  * An unknown scope falls through to its raw token — nothing is ever silently
12
12
  * hidden from the reader.
13
13
  */
14
+ import type { DataAccessMode } from "./data-records.js";
14
15
  export declare const OAUTH_SCOPE_LABELS: Readonly<Record<string, string>>;
16
+ /**
17
+ * A grant's database-tool access, for the Connections editor and the
18
+ * security email. Not a scope: data access is a grant attribute, so these
19
+ * labels stay out of {@link OAUTH_SCOPE_LABELS}. Per-app identities have
20
+ * their own text (`DATA_IDENTITY_LABELS`, spec §10.7).
21
+ */
22
+ export declare const DATA_ACCESS_MODE_LABELS: Readonly<Record<DataAccessMode, string>>;
15
23
  /** Map a raw scope token to its human label, or the token itself if unknown. */
16
24
  export declare function describeOAuthScope(scope: string): string;
17
25
  /** Split a space-delimited OAuth scope string into individual tokens. */
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-scopes.d.ts","sourceRoot":"","sources":["../src/oauth-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK/D,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD"}
1
+ {"version":3,"file":"oauth-scopes.d.ts","sourceRoot":"","sources":["../src/oauth-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK/D,CAAC;AAKF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAG5E,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKxD"}
@@ -1,22 +1,20 @@
1
- /**
2
- * Hosted-MCP OAuth scope copy — the permission text a user reads on the
3
- * consent screen, and again in the email telling them a client was connected.
4
- *
5
- * It lives here because those two surfaces must not drift: the email has to
6
- * describe the access in the words the user actually consented to, and they
7
- * are rendered by different processes (Next.js dashboard, API mailer). Two
8
- * copies of security-relevant permission text is exactly the kind of drift
9
- * that ends with an email under-describing what a grant can do.
10
- *
11
- * An unknown scope falls through to its raw token — nothing is ever silently
12
- * hidden from the reader.
13
- */
14
1
  export const OAUTH_SCOPE_LABELS = {
15
2
  "mcp:apps": "View and operate your apps (deploy, env, domains, logs)",
16
3
  "mcp:apps.read": "View your apps and their status",
17
4
  "mcp:account": "View your account",
18
5
  mcp: "Use the hosted Percher MCP tools",
19
6
  };
7
+ const DATA_ACCESS_SUFFIX = "records in your apps' databases, including data your app's users entered. Every record the assistant reads is sent to it and may be processed by its provider under the provider's terms. Revoke in Settings → Connections; copies already sent are not recalled.";
8
+ /**
9
+ * A grant's database-tool access, for the Connections editor and the
10
+ * security email. Not a scope: data access is a grant attribute, so these
11
+ * labels stay out of {@link OAUTH_SCOPE_LABELS}. Per-app identities have
12
+ * their own text (`DATA_IDENTITY_LABELS`, spec §10.7).
13
+ */
14
+ export const DATA_ACCESS_MODE_LABELS = {
15
+ readwrite: `Read, create, change and delete ${DATA_ACCESS_SUFFIX}`,
16
+ read: `Read ${DATA_ACCESS_SUFFIX}`,
17
+ };
20
18
  /** Map a raw scope token to its human label, or the token itself if unknown. */
21
19
  export function describeOAuthScope(scope) {
22
20
  return OAUTH_SCOPE_LABELS[scope] ?? scope;
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-scopes.js","sourceRoot":"","sources":["../src/oauth-scopes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,UAAU,EAAE,yDAAyD;IACrE,eAAe,EAAE,iCAAiC;IAClD,aAAa,EAAE,mBAAmB;IAClC,GAAG,EAAE,kCAAkC;CACxC,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAC5C,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"oauth-scopes.js","sourceRoot":"","sources":["../src/oauth-scopes.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,MAAM,kBAAkB,GAAqC;IAClE,UAAU,EAAE,yDAAyD;IACrE,eAAe,EAAE,iCAAiC;IAClD,aAAa,EAAE,mBAAmB;IAClC,GAAG,EAAE,kCAAkC;CACxC,CAAC;AAEF,MAAM,kBAAkB,GACtB,mQAAmQ,CAAC;AAEtQ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA6C;IAC/E,SAAS,EAAE,mCAAmC,kBAAkB,EAAE;IAClE,IAAI,EAAE,QAAQ,kBAAkB,EAAE;CACnC,CAAC;AAEF,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAC5C,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,KAAK;SACT,KAAK,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC"}
@@ -26,6 +26,6 @@ export declare const DEFAULT_MCP_HTTP_PORT = 8787;
26
26
  * drifted to three different values (51/52/53), and one shipped artifact
27
27
  * disagreed with itself on two lines.
28
28
  */
29
- export declare const MCP_TOOL_COUNT_LOCAL = 54;
30
- export declare const MCP_TOOL_COUNT_HOSTED = 23;
29
+ export declare const MCP_TOOL_COUNT_LOCAL = 60;
30
+ export declare const MCP_TOOL_COUNT_HOSTED = 29;
31
31
  //# sourceMappingURL=platform.d.ts.map
package/dist/platform.js CHANGED
@@ -26,6 +26,6 @@ export const DEFAULT_MCP_HTTP_PORT = 8787;
26
26
  * drifted to three different values (51/52/53), and one shipped artifact
27
27
  * disagreed with itself on two lines.
28
28
  */
29
- export const MCP_TOOL_COUNT_LOCAL = 54;
30
- export const MCP_TOOL_COUNT_HOSTED = 23;
29
+ export const MCP_TOOL_COUNT_LOCAL = 60;
30
+ export const MCP_TOOL_COUNT_HOSTED = 29;
31
31
  //# sourceMappingURL=platform.js.map
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Constant-time equality for secrets, tokens and signatures that arrive as
3
+ * text. A subpath export (`@percher/shared/secure-compare`), never the
4
+ * barrel: the barrel is bundled into dashboard client components, and
5
+ * `node:crypto` there fails the web build. `timingSafeEqual` throws on buffers of different length, so callers
6
+ * guarded the length first, and most compared STRING length. A UTF-8 header
7
+ * with the same number of characters but more bytes ("é" vs "a") passed that
8
+ * guard and made the compare throw: a 500 where a 401 belonged. This compares
9
+ * byte length, and on a mismatch still runs one compare so the mismatch path
10
+ * does comparable work; it does not fully hide the length class (allocation
11
+ * and the branch remain), which is the same residual every caller had.
12
+ * Empty input never matches, including an empty expected value: two empty
13
+ * strings are not a shared secret.
14
+ */
15
+ export declare function secretEquals(provided: string | null | undefined, expected: string): boolean;
16
+ //# sourceMappingURL=secure-compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-compare.d.ts","sourceRoot":"","sources":["../src/secure-compare.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAS3F"}
@@ -0,0 +1,27 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+ /**
3
+ * Constant-time equality for secrets, tokens and signatures that arrive as
4
+ * text. A subpath export (`@percher/shared/secure-compare`), never the
5
+ * barrel: the barrel is bundled into dashboard client components, and
6
+ * `node:crypto` there fails the web build. `timingSafeEqual` throws on buffers of different length, so callers
7
+ * guarded the length first, and most compared STRING length. A UTF-8 header
8
+ * with the same number of characters but more bytes ("é" vs "a") passed that
9
+ * guard and made the compare throw: a 500 where a 401 belonged. This compares
10
+ * byte length, and on a mismatch still runs one compare so the mismatch path
11
+ * does comparable work; it does not fully hide the length class (allocation
12
+ * and the branch remain), which is the same residual every caller had.
13
+ * Empty input never matches, including an empty expected value: two empty
14
+ * strings are not a shared secret.
15
+ */
16
+ export function secretEquals(provided, expected) {
17
+ if (!provided || !expected)
18
+ return false;
19
+ const a = Buffer.from(provided, "utf8");
20
+ const b = Buffer.from(expected, "utf8");
21
+ if (a.length !== b.length) {
22
+ timingSafeEqual(b, b);
23
+ return false;
24
+ }
25
+ return timingSafeEqual(a, b);
26
+ }
27
+ //# sourceMappingURL=secure-compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-compare.js","sourceRoot":"","sources":["../src/secure-compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,QAAmC,EAAE,QAAgB;IAChF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare const SIGNUP_CAPACITY_MAX_AGE_MS = 120000;
2
+ export declare const SIGNUP_CAPACITY_MESSAGE = "Sorry, registrations are temporarily paused until enough capacity is available. Visit the signup page to request an email when places are available.";
3
+ export type SignupCapacityReason = "ready" | "unknown" | "cpu" | "memory" | "disk" | "recovering";
4
+ export interface SignupCapacityState {
5
+ paused: boolean;
6
+ reason: SignupCapacityReason;
7
+ checkedAt: number;
8
+ healthySince: number | null;
9
+ }
10
+ /** Shared by both admission hops. A missing/malformed/stale sample is closed. */
11
+ export declare function parseSignupCapacity(raw: string | null | undefined, now?: number): SignupCapacityState;
12
+ //# sourceMappingURL=signup-capacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup-capacity.d.ts","sourceRoot":"","sources":["../src/signup-capacity.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,SAAU,CAAC;AAClD,eAAO,MAAM,uBAAuB,yJACoH,CAAC;AACzJ,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;AAClG,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC9B,GAAG,SAAa,GACf,mBAAmB,CAyBrB"}
@@ -0,0 +1,29 @@
1
+ export const SIGNUP_CAPACITY_MAX_AGE_MS = 120_000;
2
+ export const SIGNUP_CAPACITY_MESSAGE = "Sorry, registrations are temporarily paused until enough capacity is available. Visit the signup page to request an email when places are available.";
3
+ /** Shared by both admission hops. A missing/malformed/stale sample is closed. */
4
+ export function parseSignupCapacity(raw, now = Date.now()) {
5
+ const unknown = {
6
+ paused: true,
7
+ reason: "unknown",
8
+ checkedAt: 0,
9
+ healthySince: null,
10
+ };
11
+ try {
12
+ const value = JSON.parse(raw ?? "null");
13
+ if (!value ||
14
+ typeof value.paused !== "boolean" ||
15
+ !["ready", "unknown", "cpu", "memory", "disk", "recovering"].includes(value.reason) ||
16
+ value.paused !== (value.reason !== "ready") ||
17
+ !Number.isFinite(value.checkedAt) ||
18
+ value.checkedAt > now + 5000 ||
19
+ now - value.checkedAt > SIGNUP_CAPACITY_MAX_AGE_MS ||
20
+ (value.healthySince !== null &&
21
+ (!Number.isFinite(value.healthySince) || value.healthySince > now)))
22
+ return unknown;
23
+ return value;
24
+ }
25
+ catch {
26
+ return unknown;
27
+ }
28
+ }
29
+ //# sourceMappingURL=signup-capacity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup-capacity.js","sourceRoot":"","sources":["../src/signup-capacity.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,OAAO,CAAC;AAClD,MAAM,CAAC,MAAM,uBAAuB,GAClC,sJAAsJ,CAAC;AASzJ,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CACjC,GAA8B,EAC9B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,OAAO,GAAwB;QACnC,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,IAAI;KACnB,CAAC;IACF,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC;QACxC,IACE,CAAC,KAAK;YACN,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS;YACjC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;YACnF,KAAK,CAAC,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC;YAC3C,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;YACjC,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI;YAC5B,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,0BAA0B;YAClD,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI;gBAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC;YAErE,OAAO,OAAO,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Registration quotas use the Stockholm calendar day, including 23/25-hour days. */
2
+ export declare function signupDayWindow(now: Date): {
3
+ day: string;
4
+ startMs: number;
5
+ endMs: number;
6
+ };
7
+ //# sourceMappingURL=signup-day.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup-day.d.ts","sourceRoot":"","sources":["../src/signup-day.ts"],"names":[],"mappings":"AAuCA,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,GAAG,EAAE,IAAI,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAU1F"}
@@ -0,0 +1,42 @@
1
+ const stockholmDate = new Intl.DateTimeFormat("sv-SE", {
2
+ timeZone: "Europe/Stockholm",
3
+ year: "numeric",
4
+ month: "2-digit",
5
+ day: "2-digit",
6
+ });
7
+ const stockholmClock = new Intl.DateTimeFormat("en-GB", {
8
+ timeZone: "Europe/Stockholm",
9
+ year: "numeric",
10
+ month: "2-digit",
11
+ day: "2-digit",
12
+ hour: "2-digit",
13
+ minute: "2-digit",
14
+ second: "2-digit",
15
+ hourCycle: "h23",
16
+ });
17
+ /** Convert a local calendar midnight to UTC without assuming a fixed DST offset. */
18
+ function midnightUtc(localMidnight) {
19
+ let instant = localMidnight;
20
+ for (let i = 0; i < 3; i++) {
21
+ const parts = Object.fromEntries(stockholmClock.formatToParts(instant).map(({ type, value }) => [type, value]));
22
+ const represented = Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day), Number(parts.hour), Number(parts.minute), Number(parts.second));
23
+ const correction = localMidnight - represented;
24
+ if (correction === 0)
25
+ return instant;
26
+ instant += correction;
27
+ }
28
+ return instant;
29
+ }
30
+ /** Registration quotas use the Stockholm calendar day, including 23/25-hour days. */
31
+ export function signupDayWindow(now) {
32
+ const day = stockholmDate.format(now);
33
+ const year = Number(day.slice(0, 4));
34
+ const month = Number(day.slice(5, 7));
35
+ const date = Number(day.slice(8, 10));
36
+ return {
37
+ day,
38
+ startMs: midnightUtc(Date.UTC(year, month - 1, date)),
39
+ endMs: midnightUtc(Date.UTC(year, month - 1, date + 1)),
40
+ };
41
+ }
42
+ //# sourceMappingURL=signup-day.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signup-day.js","sourceRoot":"","sources":["../src/signup-day.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;IACrD,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;CACf,CAAC,CAAC;AACH,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;IACtD,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,KAAK;CACjB,CAAC,CAAC;AAEH,oFAAoF;AACpF,SAAS,WAAW,CAAC,aAAqB;IACxC,IAAI,OAAO,GAAG,aAAa,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,cAAc,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAC9E,CAAC;QACF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAClB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EACvB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAClB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EACpB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CACrB,CAAC;QACF,MAAM,UAAU,GAAG,aAAa,GAAG,WAAW,CAAC;QAC/C,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC;QACrC,OAAO,IAAI,UAAU,CAAC;IACxB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAAC,GAAS;IACvC,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,OAAO;QACL,GAAG;QACH,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACrD,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;KACxD,CAAC;AACJ,CAAC"}