@ibgib/space-gib 0.0.20 → 0.0.22

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.
@@ -0,0 +1,288 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Privacy Policy · ibgib.space</title>
7
+ <link rel="stylesheet" type="text/css" href="/style.css">
8
+ <style>
9
+ html, body {
10
+ height: auto !important;
11
+ min-height: 100% !important;
12
+ overflow-y: auto !important;
13
+ overflow-x: hidden !important;
14
+ }
15
+ body {
16
+ background: #11111b;
17
+ color: #cdd6f4;
18
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
19
+ margin: 0;
20
+ padding: 0;
21
+ line-height: 1.6;
22
+ }
23
+ .page-container {
24
+ max-width: 860px;
25
+ margin: 0 auto;
26
+ padding: 2.5rem 1.5rem 4rem;
27
+ }
28
+ .header-bar {
29
+ display: flex;
30
+ align-items: center;
31
+ justify-content: space-between;
32
+ padding-bottom: 1.5rem;
33
+ margin-bottom: 2rem;
34
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
35
+ }
36
+ .brand-link {
37
+ color: #89b4fa;
38
+ text-decoration: none;
39
+ font-weight: 700;
40
+ font-size: 1.2rem;
41
+ display: flex;
42
+ align-items: center;
43
+ gap: 0.5rem;
44
+ }
45
+ .back-link {
46
+ color: #a6adc8;
47
+ text-decoration: none;
48
+ font-size: 0.9rem;
49
+ padding: 0.4rem 0.8rem;
50
+ border-radius: 6px;
51
+ background: rgba(255, 255, 255, 0.05);
52
+ transition: all 0.2s;
53
+ }
54
+ .back-link:hover {
55
+ color: #ffffff;
56
+ background: rgba(255, 255, 255, 0.1);
57
+ }
58
+ .policy-title {
59
+ font-size: 2.2rem;
60
+ color: #ffffff;
61
+ margin-top: 0;
62
+ margin-bottom: 0.5rem;
63
+ }
64
+ .policy-h2 {
65
+ font-size: 1.4rem;
66
+ color: #50fa7b;
67
+ margin-top: 2rem;
68
+ margin-bottom: 0.75rem;
69
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
70
+ padding-bottom: 0.3rem;
71
+ }
72
+ .policy-h3 {
73
+ font-size: 1.1rem;
74
+ color: #89b4fa;
75
+ margin-top: 1.5rem;
76
+ margin-bottom: 0.5rem;
77
+ }
78
+ p, li {
79
+ color: #cdd6f4;
80
+ font-size: 0.95rem;
81
+ }
82
+ ul, ol {
83
+ padding-left: 1.5rem;
84
+ margin: 0.5rem 0 1rem;
85
+ }
86
+ li {
87
+ margin-bottom: 0.35rem;
88
+ }
89
+ code {
90
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
91
+ font-size: 0.85em;
92
+ background: rgba(255, 255, 255, 0.08);
93
+ padding: 0.15rem 0.35rem;
94
+ border-radius: 4px;
95
+ color: #f5c2e7;
96
+ }
97
+ code.math {
98
+ color: #89dceb;
99
+ }
100
+ a {
101
+ color: #89b4fa;
102
+ text-decoration: underline;
103
+ }
104
+ a:hover {
105
+ color: #b4befe;
106
+ }
107
+ .divider {
108
+ border: 0;
109
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
110
+ margin: 2rem 0;
111
+ }
112
+ .alert-box {
113
+ display: flex;
114
+ gap: 0.75rem;
115
+ padding: 1rem 1.25rem;
116
+ border-radius: 8px;
117
+ margin: 1.25rem 0;
118
+ align-items: flex-start;
119
+ }
120
+ .alert-warning {
121
+ background: rgba(249, 226, 175, 0.08);
122
+ border: 1px solid rgba(249, 226, 175, 0.3);
123
+ color: #f9e2af;
124
+ }
125
+ .alert-important {
126
+ background: rgba(137, 180, 250, 0.08);
127
+ border: 1px solid rgba(137, 180, 250, 0.3);
128
+ color: #89b4fa;
129
+ }
130
+ .alert-note {
131
+ background: rgba(180, 190, 254, 0.08);
132
+ border: 1px solid rgba(180, 190, 254, 0.3);
133
+ color: #b4befe;
134
+ }
135
+ .alert-icon {
136
+ font-size: 1.2rem;
137
+ line-height: 1.2;
138
+ }
139
+ .alert-body {
140
+ font-size: 0.88rem;
141
+ line-height: 1.45;
142
+ color: #cdd6f4;
143
+ }
144
+ .footer-bar {
145
+ margin-top: 3.5rem;
146
+ padding-top: 1.5rem;
147
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
148
+ font-size: 0.85rem;
149
+ color: #a6adc8;
150
+ display: flex;
151
+ justify-content: space-between;
152
+ flex-wrap: wrap;
153
+ gap: 1rem;
154
+ }
155
+ </style>
156
+ </head>
157
+ <body>
158
+ <div class="page-container">
159
+ <header class="header-bar">
160
+ <a href="/" class="brand-link">
161
+ <span>◈</span>
162
+ <span>🌌 space-gib 🌌</span>
163
+ </a>
164
+ <a href="/" class="back-link">← Return to App</a>
165
+ </header>
166
+
167
+ <main>
168
+ <h1 id="privacypolicy" class="policy-title">Privacy Policy</h1>
169
+ <p><strong>Status</strong>: DRAFT (Active Development)</p>
170
+ <p><strong>Effective Date</strong>: August 21, 2026</p>
171
+ <p><strong>Last Updated</strong>: August 21, 2026</p>
172
+ <div class="alert-box alert-warning"><div class="alert-icon">⚠️</div><div class="alert-body"><strong>Draft Notice &amp; Active Development Disclaimer</strong>:<br>This Privacy Policy is currently in <strong>draft status</strong>. The <code>ibGib</code> platform, underlying cryptographic keystone engine, and decentralized data graph architecture are under <strong>active research and development</strong>. This document expresses our architectural intent, privacy commitments, and operational principles; however, as the technology is actively evolving, certain features, administrative tooling, and data workflows described herein may be experimental, partially implemented, or subject to change.</div></div>
173
+ <hr class="divider">
174
+ <h2 id="1introductionovervie" class="policy-h2">1. Introduction &amp; Overview</h2>
175
+ <p>Welcome to <strong>ibGib</strong>. We are committed to transparency, cryptographic self-sovereignty, and user privacy.</p>
176
+ <p>This Privacy Policy explains how <code>ibGib</code> (including <code>ibgib.space</code>, <code>ibgib.com</code>, and related open-source applications in this monorepo) collects, uses, stores, and protects your information when you interact with our network, services, and applications.</p>
177
+ <div class="alert-box alert-important"><div class="alert-icon">ℹ️</div><div class="alert-body"><strong>Summary for Everyone</strong>:<br>* <strong>Public Directory</strong>: Just like a public PGP key or public DNS record, your chosen <strong>username</strong>, <strong>registered email address</strong>, and <strong>identity keystone</strong> are part of the public graph so people and your devices can find and authenticate you.<br>* <strong>No Passwords on the Wire</strong>: Your master passphrase, biometric data (Touch ID / Face ID / Windows Hello), and physical security keys (YubiKeys) <strong>never</strong> leave your local device.<br>* <strong>No Data Selling</strong>: We do <strong>not</strong> sell, rent, monetize, or share your personal data with third-party advertisers or data brokers.<br>* <strong>Standard Transport Security</strong>: All communications between your devices and our servers operate over industry-standard <strong>TLS 1.3 / HTTPS</strong> encryption.</div></div>
178
+ <hr class="divider">
179
+ <h2 id="2categoriesofinforma" class="policy-h2">2. Categories of Information We Collect</h2>
180
+ <h3 id="aidentitypublicdirec" class="policy-h3">A. Identity &amp; Public Directory Data</h3>
181
+ <p>When you create an account or link authentication methods, the following information is recorded in your identity keystone:</p>
182
+ <ul>
183
+ <li><strong>Chosen Username</strong>: A human-readable identifier (e.g. <code>alice</code>).</li>
184
+ <li><strong>Registered Email Address</strong>: Provided during account creation or SSO linking to enable account discovery, verification, and recovery.</li>
185
+ <li><strong>Public Keystone DAG Addresses &amp; Challenge Hashes</strong>: Cryptographic addresses and mathematical challenge hashes (<code class="math">H = \text{Hash}(S)</code>) that define your identity's evolution timeline.</li>
186
+ <li><strong>Registered Device Delegate Tags</strong>: Public labels for devices authorized to sync on your behalf (e.g. <code>pwd-alice-desk-a9a0</code>, <code>passkey-mobile-b4c1</code>).</li>
187
+ </ul>
188
+ <h3 id="btechnicalconnection" class="policy-h3">B. Technical, Connection &amp; Log Data</h3>
189
+ <p>When accessing our hosted web nodes, standard operational connection data may be logged:</p>
190
+ <ul>
191
+ <li><strong>Internet Protocol (IP) Address</strong> and approximate geographic origin.</li>
192
+ <li><strong>HTTP/TLS Request Metadata</strong>: Date/time of request, HTTP status code, URL path, and TLS cipher suite.</li>
193
+ <li><strong>User-Agent Strings</strong>: Browser type, operating system, and client application version.</li>
194
+ <li><strong>Retention</strong>: Operational and access logs are retained for a bounded window (typically <strong>30 to 90 days</strong>) strictly for system reliability, rate limiting, intrusion detection, and security forensics, after which they are automatically rotated and deleted.</li>
195
+ </ul>
196
+ <h3 id="cworkspaceapplicatio" class="policy-h3">C. Workspace &amp; Application Data</h3>
197
+ <ul>
198
+ <li><strong>User-Created Content</strong>: Notes, comments, graph nodes, and files stored within your tenant workspace.</li>
199
+ <li><strong>Storage Status</strong>: Workspace data is stored in tenant-isolated domain spaces. Data in transit is encrypted via TLS 1.3. Data at rest on the server is currently stored unencrypted within your isolated space directory (client-side data encryption is planned as a future capability).</li>
200
+ </ul>
201
+ <hr class="divider">
202
+ <h2 id="3publicdirectorynatu" class="policy-h2">3. Public Directory Nature of Identity Keystones</h2>
203
+ <div class="alert-box alert-warning"><div class="alert-icon">⚠️</div><div class="alert-body"><strong>Experimental Architecture Notice</strong>:<br>Identity Keystones are built on an innovative Zero-Knowledge Proof (ZKP) Distributed Ledger Technology (DLT) architecture. While designed to eliminate reliance on central certificate authorities, this technology is experimental. See <a href="#7securityarchitectur">Section 7</a> for detailed security context.</div></div>
204
+ <h3 id="innovativezkpdltvsco" class="policy-h3">Innovative ZKP DLT vs. Conventional PKI</h3>
205
+ <p><code>ibGib</code> is built upon public-key cryptographic principles, but <strong>is not conventional Public Key Infrastructure (PKI)</strong>:</p>
206
+ <ul>
207
+ <li>Instead of relying on asymmetric digital signatures (RSA, ECDSA) and centralized X.509 Certificate Authorities (CAs), <code>ibGib</code> identities utilize a <strong>Zero-Knowledge Proof (ZKP) Distributed Ledger Technology (DLT)</strong> architecture with symmetric hash-reveal challenge-response pools.</li>
208
+ <li><strong>Public by Design</strong>: Identity Keystones function as public directory records. Anyone on the network who knows your username or email address can query the server to retrieve your public keystone.</li>
209
+ <li><strong>Zero Secret Exposure</strong>: Public keystones contain only public challenge hashes (<code class="math">H</code>). Revealing a challenge hash gives an observer zero ability to compute your private secret pre-image (<code class="math">S</code>) or act on your behalf.</li>
210
+ <li><strong>Biometric &amp; Password Isolation</strong>:</li>
211
+ <li>Passwords, PINs, and passphrase pre-images are processed strictly inside your local browser memory and discarded.</li>
212
+ <li>Hardware biometrics (fingerprints, facial recognition) and security keys operate exclusively within your device's hardware Secure Enclave / TPM via the W3C WebAuthn standard. Raw biometric data is never transmitted over the network or accessible to our servers.</li>
213
+ </ul>
214
+ <hr class="divider">
215
+ <h2 id="4howweuseyourinforma" class="policy-h2">4. How We Use Your Information</h2>
216
+ <p>We process personal and cryptographic data solely for the following legitimate purposes:</p>
217
+ <ol>
218
+ <li><strong>Identity Resolution &amp; Discovery</strong>: Matching incoming authentication requests and email lookups to the correct tenant domain space.</li>
219
+ <li><strong>Cryptographic Multi-Device Authorization</strong>: Permitting your devices to authorize scoped synchronization claims via local device sync delegates (<code class="math">D_{\text{device}}</code>), while the native ibGib sync engine executes graph synchronization.</li>
220
+ <li><strong>Account Verification &amp; Sign-In</strong>: Sending one-time 6-digit verification codes (OTP) to confirm email ownership and authenticate sign-ins.</li>
221
+ <li><strong>Security &amp; Abuse Prevention</strong>: Enforcing rate limits, detecting brute-force attacks, and preventing server abuse.</li>
222
+ </ol>
223
+ <p>We do <strong>not</strong> use your data for profiling, automated decision-making, or third-party targeted advertising.</p>
224
+ <hr class="divider">
225
+ <h2 id="5third-partyservicep" class="policy-h2">5. Third-Party Service Providers</h2>
226
+ <p>We utilize minimal third-party services essential to core platform functionality:</p>
227
+ <ul>
228
+ <li><strong>Single Sign-On (SSO) Authentication (Optional)</strong>:</li>
229
+ <li><strong>Google OAuth2</strong>: Currently supported for single-tap passwordless account creation and sign-in. When linking Google, we receive verified identity tokens (such as your verified email address and provider user ID) to authenticate your identity. We do not receive or store your Google password.</li>
230
+ <li><strong>Future Providers</strong>: We plan to introduce additional OAuth2 providers (such as GitHub and others) in future updates.</li>
231
+ <li><strong>Transactional Email &amp; Hosting Infrastructure</strong>:</li>
232
+ <li><strong>Transactional Email</strong>: We send emails strictly for transactional account confirmation, sign-in verification codes, and security notices. We never send marketing, newsletter, or promotional spam emails.</li>
233
+ <li><strong>Cloud Server &amp; Storage Nodes</strong>: Web nodes, domain space storage, and network routing are hosted on secure cloud infrastructure located in the United States.</li>
234
+ </ul>
235
+ <hr class="divider">
236
+ <h2 id="6immutabletimelinein" class="policy-h2">6. Immutable Timeline Integrity, Revocations &amp; Data Deletion</h2>
237
+ <h3 id="cryptographictimelin" class="policy-h3">Cryptographic Timeline Integrity</h3>
238
+ <p><code>ibGib</code> is built on an <strong>append-only, directed acyclic graph (DAG) architecture</strong>. Similar to version control systems (like Git) and cryptographic ledgers (like Bitcoin), timeline records are mathematically linked using cryptographic hashes to ensure data integrity and tamper-evidence. Just as past blocks in a blockchain cannot be modified without destroying cryptographic integrity, historical keystone frames remain part of the verifiable audit chain.</p>
239
+ <h3 id="revocationstombstone" class="policy-h3">Revocations &amp; Tombstones</h3>
240
+ <p>When you modify your identity permissions—such as unlinking a Google SSO provider or revoking a lost device passkey:</p>
241
+ <ul>
242
+ <li>The system publishes a cryptographically signed <strong>tombstone evolution frame</strong> (<code class="math">n \to n+1</code>).</li>
243
+ <li>This frame officially revokes that authority and unlinks the provider from server-side reverse lookup indices.</li>
244
+ </ul>
245
+ <h3 id="contenttakedownsfull" class="policy-h3">Content Takedowns &amp; Full Account Erasure</h3>
246
+ <ol>
247
+ <li><strong>Content &amp; Asset Takedowns</strong>: Standalone content nodes and binary file payloads can be unlinked, de-indexed, or removed from server storage upon authorized request or valid legal takedown without compromising structural timeline history.</li>
248
+ <li><strong>Complete Tenant Erasure</strong>: If you request complete account deletion, your entire tenant domain space (including all hosted keystones, delegate frames, and stored data) and reverse email index entries will be permanently purged and removed from server storage.</li>
249
+ <li><strong>Local Device Data Control</strong>: You maintain full control over all data stored locally on your physical devices. You may clear your local cryptographic tokens, delegates, and cached workspace data at any time via the application settings or by clearing your browser's IndexedDB / local storage.</li>
250
+ </ol>
251
+ <hr class="divider">
252
+ <h2 id="7securityarchitectur" class="policy-h2">7. Security Architecture &amp; Experimental Protocol Notice</h2>
253
+ <h3 id="innovativeexperiment" class="policy-h3">Innovative &amp; Experimental Nature</h3>
254
+ <p>Identity Keystones, multi-pool challenge-response mechanisms, and decentralized sync delegates represent innovative, experimental cryptographic protocols. While we apply diligent best efforts in cryptanalysis and utilize industry-standard, proven cryptographic primitives (such as SHA-256, SHA-512, AES, and WebAuthn PRF), the composite architecture is actively evolving. Users should evaluate this platform understanding its experimental research nature.</p>
255
+ <h3 id="conventionalsecurity" class="policy-h3">Conventional Security Foundations</h3>
256
+ <p>All communications, API endpoints, and authentication exchanges between your client devices and our server infrastructure operate strictly over industry-standard <strong>TLS 1.3 / HTTPS</strong> encryption. Server-side data isolation, atomic file indexing, and timing side-channel protections are implemented following standard enterprise security practices.</p>
257
+ <hr class="divider">
258
+ <h2 id="8yourprivacyrightste" class="policy-h2">8. Your Privacy Rights (Texas TDPSA &amp; US State Privacy Laws)</h2>
259
+ <p>If you are a resident of Texas (governed by the <strong>Texas Data Privacy and Security Act - TDPSA</strong>) or other jurisdictions with applicable privacy legislation, you have the following rights regarding your personal data:</p>
260
+ <ul>
261
+ <li><strong>Right to Know / Access</strong>: You have the right to confirm whether we process your personal data and to access such data.</li>
262
+ <li><strong>Right to Correct</strong>: You have the right to correct inaccuracies in your personal data.</li>
263
+ <li><strong>Right to Delete</strong>: You have the right to request deletion of personal data provided by or obtained about you.</li>
264
+ <li><strong>Right to Data Portability</strong>: You have the right to obtain a copy of your personal data in a portable and readily usable format.</li>
265
+ <li><strong>Right to Opt-Out of Sale / Targeted Advertising</strong>: We do <strong>not</strong> sell your personal data or process it for targeted advertising, so no opt-out is necessary.</li>
266
+ <li><strong>Right to Non-Discrimination</strong>: We will never discriminate against you, deny services, or alter pricing for exercising your privacy rights.</li>
267
+ </ul>
268
+ <h3 id="howtoexerciseyourrig" class="policy-h3">How to Exercise Your Rights</h3>
269
+ <p>To submit a privacy inquiry, request data export, or request permanent deletion of your tenant domain space, please contact us using the information in Section 9 below. We will verify your identity (using your registered email or cryptographic keystone proof) and respond within the statutory timeframe (typically 45 days).</p>
270
+ <hr class="divider">
271
+ <h2 id="9contactinformationp" class="policy-h2">9. Contact Information &amp; Policy Updates</h2>
272
+ <h3 id="contactus" class="policy-h3">Contact Us</h3>
273
+ <p>If you have questions, comments, or requests regarding this Privacy Policy or our data handling practices, please reach out to us:</p>
274
+ <ul>
275
+ <li><strong>Open-Source Packages</strong>: Published on <strong>npm</strong> under the <code>@ibgib</code> scope.</li>
276
+ <li><strong>Email / Privacy Inquiries</strong>: <code>ibgib.info@gmail.com</code></li>
277
+ </ul>
278
+ <h3 id="updatestothispolicy" class="policy-h3">Updates to This Policy</h3>
279
+ <p>We may update this Privacy Policy from time to time to reflect architectural advancements, legal requirements, or operational changes. When changes are made, the "Last Updated" date at the top of this document will be updated. We encourage you to review this policy periodically.</p>
280
+ </main>
281
+
282
+ <footer class="footer-bar">
283
+ <span>© ibgib contributors</span>
284
+ <span><a href="https://ibgib.space">ibgib.space</a></span>
285
+ </footer>
286
+ </div>
287
+ </body>
288
+ </html>
@@ -1 +1 @@
1
- import{p as e}from"./chunk-TVMLARYE.mjs";import"./chunk-3RNUFRNV.mjs";console.log("space-gib early script executing...");e();
1
+ import{l as e}from"./chunk-O6EUMDNJ.mjs";import"./chunk-XZM4L3U6.mjs";console.log("space-gib early script executing...");e();
@@ -7171,9 +7171,11 @@ async function getDependencyGraph({ ibGib, ibGibs, ibGibAddr, ibGibAddrs, live,
7171
7171
  timeLogName,
7172
7172
  mapTjpAddrToLatestAddrsInSpace
7173
7173
  });
7174
- Object.values(graph).filter((ibGib2) => ibGib2.ib.startsWith("comment ")).forEach((ibGib2) => {
7175
- console.table(ibGib2);
7176
- });
7174
+ if (logalot11) {
7175
+ Object.values(graph).filter((ibGib2) => ibGib2.ib.startsWith("comment ")).forEach((ibGib2) => {
7176
+ console.table(ibGib2);
7177
+ });
7178
+ }
7177
7179
  if (logalot11) {
7178
7180
  console.log(`${lc2} graph size: ${Object.keys(graph).length} (I: c6cb5e7e1e2611d35b9006fac6503d22)`);
7179
7181
  const ibs = Object.values(graph).filter((ibGib2) => ibGib2.ib.startsWith("comment ") || ibGib2.ib.startsWith("pic ")).map((ibGib2) => ibGib2.ib);
@@ -18136,6 +18138,9 @@ var StaticFileHandler = class _StaticFileHandler extends ServeGibHandlerBase {
18136
18138
  if (existsSync3(filePath) && statSync(filePath).isDirectory()) {
18137
18139
  filePath = join6(filePath, "index.html");
18138
18140
  }
18141
+ if (!existsSync3(filePath) && existsSync3(filePath + ".html")) {
18142
+ filePath = filePath + ".html";
18143
+ }
18139
18144
  if (!existsSync3(filePath)) {
18140
18145
  filePath = join6(this.clientDir, "index.html");
18141
18146
  }
@@ -20960,7 +20965,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
20960
20965
  * Requires the Master Secret to authorize the change via a pool containing
20961
20966
  * the 'manage' verb.
20962
20967
  */
20963
- async addPools({ latestKeystone, masterSecret, newPools, frameDetails, dataToPatch, metaspace, space }) {
20968
+ async addPools({ latestKeystone, masterSecret, signingPoolId, newPools, frameDetails, dataToPatch, metaspace, space }) {
20964
20969
  const lc2 = `${this.lc}[${this.addPools.name}]`;
20965
20970
  try {
20966
20971
  if (logalot46) {
@@ -20978,6 +20983,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
20978
20983
  }
20979
20984
  const adminPool = resolveTargetPool({
20980
20985
  pools: prevData.challengePools,
20986
+ poolId: signingPoolId,
20981
20987
  verb: KEYSTONE_VERB_MANAGE
20982
20988
  });
20983
20989
  if (logalot46) {
@@ -21057,7 +21063,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
21057
21063
  * Requires the Master Secret to authorize the change via a pool containing
21058
21064
  * the 'manage' verb (the administrative manage pool).
21059
21065
  */
21060
- async removePools({ latestKeystone, masterSecret, poolIds, frameDetails, dataToPatch, metaspace, space }) {
21066
+ async removePools({ latestKeystone, masterSecret, signingPoolId, poolIds, frameDetails, dataToPatch, metaspace, space }) {
21061
21067
  const lc2 = `${this.lc}[${this.removePools.name}]`;
21062
21068
  try {
21063
21069
  if (logalot46) {
@@ -21075,6 +21081,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
21075
21081
  }
21076
21082
  const adminPool = resolveTargetPool({
21077
21083
  pools: prevData.challengePools,
21084
+ poolId: signingPoolId,
21078
21085
  verb: KEYSTONE_VERB_MANAGE
21079
21086
  });
21080
21087
  if (logalot46) {
@@ -21548,7 +21555,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
21548
21555
  * from aggregated detail maps/arrays.
21549
21556
  */
21550
21557
  pruneTombstoneNulls(obj) {
21551
- if (!obj || typeof obj !== "object") {
21558
+ if (obj === null || obj === void 0 || typeof obj !== "object") {
21552
21559
  return obj;
21553
21560
  }
21554
21561
  if (Array.isArray(obj)) {
@@ -21557,7 +21564,7 @@ var KeystoneService_V1 = class _KeystoneService_V1 {
21557
21564
  for (const key of Object.keys(obj)) {
21558
21565
  if (obj[key] === null) {
21559
21566
  delete obj[key];
21560
- } else if (typeof obj[key] === "object") {
21567
+ } else if (obj[key] !== null && typeof obj[key] === "object") {
21561
21568
  this.pruneTombstoneNulls(obj[key]);
21562
21569
  }
21563
21570
  }
@@ -0,0 +1,208 @@
1
+ /**
2
+ * generate-privacy-html.js
3
+ *
4
+ * Build-time script that reads canonical `docs/PRIVACY_POLICY.md` and generates
5
+ * a styled, standalone `src/client/privacy.html` page for space-gib using `@ibgib/helper-gib`.
6
+ *
7
+ * Run: node generate-privacy-html.js
8
+ */
9
+
10
+ import * as pathUtils from 'path';
11
+ import { readFile, writeFile } from 'node:fs/promises';
12
+ import { fileURLToPath } from 'node:url';
13
+
14
+ import { convertMarkdownToHtml } from '@ibgib/helper-gib/dist/helpers/markdown-helper.mjs';
15
+
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = pathUtils.dirname(__filename);
18
+
19
+ const lc = `[${import.meta.url}]`;
20
+ console.log(`${lc} starting...`);
21
+
22
+ const privacyMdPath = pathUtils.resolve(__dirname, '../../docs/PRIVACY_POLICY.md');
23
+ const outputHtmlPath = pathUtils.resolve(__dirname, './src/client/privacy.html');
24
+
25
+ const mdContent = await readFile(privacyMdPath, { encoding: 'utf8' });
26
+
27
+ const bodyHtml = convertMarkdownToHtml(mdContent, { linkTarget: '_blank', linkRel: 'noopener' });
28
+
29
+ const fullHtml = `<!DOCTYPE html>
30
+ <html lang="en-US">
31
+ <head>
32
+ <meta charset="utf-8" />
33
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
34
+ <title>Privacy Policy · ibgib.space</title>
35
+ <link rel="stylesheet" type="text/css" href="/style.css">
36
+ <style>
37
+ html, body {
38
+ height: auto !important;
39
+ min-height: 100% !important;
40
+ overflow-y: auto !important;
41
+ overflow-x: hidden !important;
42
+ }
43
+ body {
44
+ background: #11111b;
45
+ color: #cdd6f4;
46
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
47
+ margin: 0;
48
+ padding: 0;
49
+ line-height: 1.6;
50
+ }
51
+ .page-container {
52
+ max-width: 860px;
53
+ margin: 0 auto;
54
+ padding: 2.5rem 1.5rem 4rem;
55
+ }
56
+ .header-bar {
57
+ display: flex;
58
+ align-items: center;
59
+ justify-content: space-between;
60
+ padding-bottom: 1.5rem;
61
+ margin-bottom: 2rem;
62
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
63
+ }
64
+ .brand-link {
65
+ color: #89b4fa;
66
+ text-decoration: none;
67
+ font-weight: 700;
68
+ font-size: 1.2rem;
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 0.5rem;
72
+ }
73
+ .back-link {
74
+ color: #a6adc8;
75
+ text-decoration: none;
76
+ font-size: 0.9rem;
77
+ padding: 0.4rem 0.8rem;
78
+ border-radius: 6px;
79
+ background: rgba(255, 255, 255, 0.05);
80
+ transition: all 0.2s;
81
+ }
82
+ .back-link:hover {
83
+ color: #ffffff;
84
+ background: rgba(255, 255, 255, 0.1);
85
+ }
86
+ .policy-title {
87
+ font-size: 2.2rem;
88
+ color: #ffffff;
89
+ margin-top: 0;
90
+ margin-bottom: 0.5rem;
91
+ }
92
+ .policy-h2 {
93
+ font-size: 1.4rem;
94
+ color: #50fa7b;
95
+ margin-top: 2rem;
96
+ margin-bottom: 0.75rem;
97
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
98
+ padding-bottom: 0.3rem;
99
+ }
100
+ .policy-h3 {
101
+ font-size: 1.1rem;
102
+ color: #89b4fa;
103
+ margin-top: 1.5rem;
104
+ margin-bottom: 0.5rem;
105
+ }
106
+ p, li {
107
+ color: #cdd6f4;
108
+ font-size: 0.95rem;
109
+ }
110
+ ul, ol {
111
+ padding-left: 1.5rem;
112
+ margin: 0.5rem 0 1rem;
113
+ }
114
+ li {
115
+ margin-bottom: 0.35rem;
116
+ }
117
+ code {
118
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
119
+ font-size: 0.85em;
120
+ background: rgba(255, 255, 255, 0.08);
121
+ padding: 0.15rem 0.35rem;
122
+ border-radius: 4px;
123
+ color: #f5c2e7;
124
+ }
125
+ code.math {
126
+ color: #89dceb;
127
+ }
128
+ a {
129
+ color: #89b4fa;
130
+ text-decoration: underline;
131
+ }
132
+ a:hover {
133
+ color: #b4befe;
134
+ }
135
+ .divider {
136
+ border: 0;
137
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
138
+ margin: 2rem 0;
139
+ }
140
+ .alert-box {
141
+ display: flex;
142
+ gap: 0.75rem;
143
+ padding: 1rem 1.25rem;
144
+ border-radius: 8px;
145
+ margin: 1.25rem 0;
146
+ align-items: flex-start;
147
+ }
148
+ .alert-warning {
149
+ background: rgba(249, 226, 175, 0.08);
150
+ border: 1px solid rgba(249, 226, 175, 0.3);
151
+ color: #f9e2af;
152
+ }
153
+ .alert-important {
154
+ background: rgba(137, 180, 250, 0.08);
155
+ border: 1px solid rgba(137, 180, 250, 0.3);
156
+ color: #89b4fa;
157
+ }
158
+ .alert-note {
159
+ background: rgba(180, 190, 254, 0.08);
160
+ border: 1px solid rgba(180, 190, 254, 0.3);
161
+ color: #b4befe;
162
+ }
163
+ .alert-icon {
164
+ font-size: 1.2rem;
165
+ line-height: 1.2;
166
+ }
167
+ .alert-body {
168
+ font-size: 0.88rem;
169
+ line-height: 1.45;
170
+ color: #cdd6f4;
171
+ }
172
+ .footer-bar {
173
+ margin-top: 3.5rem;
174
+ padding-top: 1.5rem;
175
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
176
+ font-size: 0.85rem;
177
+ color: #a6adc8;
178
+ display: flex;
179
+ justify-content: space-between;
180
+ flex-wrap: wrap;
181
+ gap: 1rem;
182
+ }
183
+ </style>
184
+ </head>
185
+ <body>
186
+ <div class="page-container">
187
+ <header class="header-bar">
188
+ <a href="/" class="brand-link">
189
+ <span>◈</span>
190
+ <span>🌌 space-gib 🌌</span>
191
+ </a>
192
+ <a href="/" class="back-link">← Return to App</a>
193
+ </header>
194
+
195
+ <main>
196
+ ${bodyHtml}
197
+ </main>
198
+
199
+ <footer class="footer-bar">
200
+ <span>© ibgib contributors</span>
201
+ <span><a href="https://ibgib.space">ibgib.space</a></span>
202
+ </footer>
203
+ </div>
204
+ </body>
205
+ </html>`;
206
+
207
+ await writeFile(outputHtmlPath, fullHtml, { encoding: 'utf8' });
208
+ console.log(`${lc} complete. wrote ${outputHtmlPath}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibgib/space-gib",
3
- "version": "0.0.20",
3
+ "version": "0.0.22",
4
4
  "type": "module",
5
5
  "description": "ibgib storage and provider service — SaaS at ibgib.space",
6
6
  "scripts": {
@@ -12,11 +12,11 @@
12
12
  "build:test": "tsc -p tsconfig.test.json"
13
13
  },
14
14
  "dependencies": {
15
- "@ibgib/core-gib": "^0.1.76",
15
+ "@ibgib/core-gib": "^0.1.78",
16
16
  "@ibgib/helper-gib": "^0.0.37",
17
17
  "@ibgib/ts-gib": "^0.5.34",
18
- "@ibgib/web-gib": "^0.0.62",
19
- "@ibgib/node-gib": "^0.0.21"
18
+ "@ibgib/web-gib": "^0.0.64",
19
+ "@ibgib/node-gib": "^0.0.23"
20
20
  },
21
21
  "engines": {
22
22
  "node": ">=20.0.0"
@@ -8,4 +8,4 @@
8
8
  /**
9
9
  * Version of space-gib, auto-updated by the build process.
10
10
  */
11
- export const AUTO_GENERATED_VERSION = '0.0.20';
11
+ export const AUTO_GENERATED_VERSION = '0.0.22';