@wipcomputer/wip-ldm-os 0.4.85-alpha.8 → 0.4.86

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 (57) hide show
  1. package/README.md +22 -2
  2. package/SKILL.md +137 -15
  3. package/bin/ldm.js +608 -75
  4. package/lib/deploy.mjs +90 -12
  5. package/lib/registry-migrations.mjs +296 -0
  6. package/package.json +21 -3
  7. package/scripts/test-boot-dir-truth.mjs +158 -0
  8. package/scripts/test-boot-hook-registration.mjs +136 -0
  9. package/scripts/test-boot-payload-trim.mjs +200 -0
  10. package/scripts/test-crc-agentid-tenant-boundary.mjs +2 -2
  11. package/scripts/test-crc-e2ee-key-persistence.mjs +150 -0
  12. package/scripts/test-crc-e2ee-session-route.mjs +9 -2
  13. package/scripts/test-crc-pair-login-flow.mjs +76 -1
  14. package/scripts/test-crc-pair-relink-audit-and-rotation.mjs +164 -0
  15. package/scripts/test-crc-websocket-abuse-limits.mjs +128 -0
  16. package/scripts/test-deploy-hook-ownership.mjs +160 -0
  17. package/scripts/test-doctor-hook-dedupe.mjs +188 -0
  18. package/scripts/test-install-prompt-policy.mjs +84 -0
  19. package/scripts/test-installer-skill-dry-run-destinations.mjs +100 -0
  20. package/scripts/test-installer-target-self-update.mjs +131 -0
  21. package/scripts/test-kaleidoscope-onboarding-copy.mjs +170 -0
  22. package/scripts/test-kaleidoscope-public-stats-baseline.mjs +129 -0
  23. package/scripts/test-kaleidoscope-qr-authenticator-confirmation.mjs +89 -0
  24. package/scripts/test-ldm-status-concurrency.mjs +118 -0
  25. package/scripts/test-ldm-status-timeout.mjs +96 -0
  26. package/scripts/test-legacy-npm-sources-migration.mjs +460 -0
  27. package/scripts/test-readme-install-prompt.mjs +66 -0
  28. package/shared/boot/boot-config.json +18 -8
  29. package/shared/docs/dev-guide-wipcomputerinc.md.tmpl +5 -4
  30. package/shared/rules/security.md +4 -0
  31. package/shared/templates/install-prompt.md +20 -2
  32. package/src/boot/README.md +24 -1
  33. package/src/boot/boot-config.json +18 -8
  34. package/src/boot/boot-hook.mjs +118 -28
  35. package/src/boot/installer.mjs +33 -10
  36. package/src/hosted-mcp/.env.example +4 -0
  37. package/src/hosted-mcp/README.md +37 -0
  38. package/src/hosted-mcp/app/footer.js +2 -2
  39. package/src/hosted-mcp/app/kaleidoscope-login.html +489 -42
  40. package/src/hosted-mcp/app/pair.html +21 -3
  41. package/src/hosted-mcp/app/wip-logo.png +0 -0
  42. package/src/hosted-mcp/codex-relay-e2ee-registry.mjs +208 -0
  43. package/src/hosted-mcp/codex-relay-ws-abuse-limits.mjs +140 -0
  44. package/src/hosted-mcp/demo/footer.js +2 -2
  45. package/src/hosted-mcp/demo/index.html +166 -44
  46. package/src/hosted-mcp/demo/login.html +87 -23
  47. package/src/hosted-mcp/demo/privacy.html +4 -214
  48. package/src/hosted-mcp/demo/tos.html +4 -189
  49. package/src/hosted-mcp/deploy.sh +2 -0
  50. package/src/hosted-mcp/docs/self-host.md +268 -0
  51. package/src/hosted-mcp/legal/internet-services/kaleidoscope/index.html +257 -0
  52. package/src/hosted-mcp/legal/internet-services/terms/site.html +224 -168
  53. package/src/hosted-mcp/legal/legal-footer.js +75 -0
  54. package/src/hosted-mcp/legal/legal.css +166 -0
  55. package/src/hosted-mcp/legal/privacy/en-ww/index.html +4 -221
  56. package/src/hosted-mcp/legal/privacy/index.html +253 -0
  57. package/src/hosted-mcp/server.mjs +920 -74
@@ -3,203 +3,259 @@
3
3
  <head>
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
6
- <title>Terms of Service - Kaleidoscope Demo</title>
7
- <style>
8
- *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
9
-
10
- body {
11
- font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, sans-serif;
12
- background: #FFFDF5;
13
- color: #1a1a1a;
14
- -webkit-font-smoothing: antialiased;
15
- -webkit-text-size-adjust: 100%;
16
- line-height: 1.6;
17
- }
18
-
19
- .container {
20
- max-width: 640px;
21
- margin: 0 auto;
22
- padding: 16px 24px 80px;
23
- }
24
-
25
- .header {
26
- position: sticky;
27
- top: 0;
28
- z-index: 100;
29
- padding: calc(12px + env(safe-area-inset-top, 0px)) 20px 12px;
30
- background: rgba(255, 253, 245, 0.8);
31
- -webkit-backdrop-filter: saturate(180%) blur(20px);
32
- backdrop-filter: saturate(180%) blur(20px);
33
- border-bottom: 1px solid rgba(0, 0, 0, 0.06);
34
- display: flex;
35
- align-items: center;
36
- }
37
-
38
- .header a {
39
- display: flex;
40
- align-items: center;
41
- text-decoration: none;
42
- }
43
-
44
- h1 {
45
- font-size: 28px;
46
- font-weight: 700;
47
- letter-spacing: -0.02em;
48
- margin-bottom: 4px;
49
- }
50
-
51
- .subtitle {
52
- font-size: 17px;
53
- color: #8a8580;
54
- margin-bottom: 8px;
55
- }
56
-
57
- .updated {
58
- font-size: 13px;
59
- color: #b0aaa4;
60
- margin-bottom: 40px;
61
- }
62
-
63
- section {
64
- padding: 28px 0;
65
- border-top: 1px solid #e8e5de;
66
- }
67
-
68
- section:last-of-type {
69
- border-bottom: 1px solid #e8e5de;
70
- }
71
-
72
- h2 {
73
- font-size: 16px;
74
- font-weight: 600;
75
- letter-spacing: -0.01em;
76
- margin-bottom: 12px;
77
- }
78
-
79
- p {
80
- font-size: 15px;
81
- line-height: 1.65;
82
- color: #3a3a3a;
83
- margin-bottom: 12px;
84
- }
85
-
86
- p:last-child {
87
- margin-bottom: 0;
88
- }
89
-
90
- ul {
91
- list-style: none;
92
- padding: 0;
93
- margin-bottom: 12px;
94
- }
95
-
96
- ul li {
97
- font-size: 15px;
98
- line-height: 1.65;
99
- color: #3a3a3a;
100
- padding-left: 16px;
101
- position: relative;
102
- margin-bottom: 4px;
103
- }
104
-
105
- ul li::before {
106
- content: "\2022";
107
- position: absolute;
108
- left: 0;
109
- color: #b0aaa4;
110
- }
111
-
112
- a {
113
- color: #1a1a1a;
114
- }
115
-
116
- footer {
117
- margin-top: 48px;
118
- text-align: center;
119
- font-size: 12px;
120
- color: #b0aaa4;
121
- line-height: 1.6;
122
- }
123
-
124
- footer span {
125
- display: block;
126
- }
127
- </style>
6
+ <title>Website Terms of Use - WIP Computer</title>
7
+ <link rel="stylesheet" href="/styles.css">
8
+ <link rel="stylesheet" href="/legal/legal.css">
128
9
  </head>
129
10
  <body>
130
- <div class="header">
131
- <a id="navIcon" href="/demo/"></a>
132
- </div>
133
- <div class="container">
11
+ <header class="site-header" data-screen-label="Header">
12
+ <div class="site-header__inner">
13
+ <a href="https://wip.computer/" class="site-header__brand" aria-label="WIP Computer home">
14
+ <span class="site-header__sprite" data-brand-icon aria-hidden="true"></span>
15
+ <span class="site-header__wordmark">WORK IN PROGRESS</span>
16
+ </a>
17
+ </div>
18
+ </header>
19
+ <main class="legal-main">
20
+ <h1>Website Terms of Use</h1>
21
+ <p class="subtitle">WIP Computer websites and internet services</p>
22
+ <p class="updated">Last updated: May 20, 2026</p>
134
23
 
135
- <h1>Terms of Service</h1>
136
- <p class="subtitle">Kaleidoscope Demo</p>
137
- <p class="updated">Last updated: April 2, 2026</p>
24
+ <section>
25
+ <h2>Agreement To Terms</h2>
26
+ <p>These Website Terms of Use apply to wip.computer and the public websites, documentation, install instructions, agent-readable pages, hosted account surfaces, registries, relay and sync endpoints, marketplace-related pages, and other internet services provided by WIP Computer, Inc. ("WORK IN PROGRESS", "WIP Computer", "we", "us", or "our"). By using the site or internet services, you agree to these terms. If you do not agree, do not use them.</p>
27
+ <p>Additional terms may apply to specific products or services. For Kaleidoscope, see the <a href="/legal/internet-services/kaleidoscope/">Kaleidoscope Terms</a>. If product-specific terms conflict with these Website Terms, the product-specific terms control for that product.</p>
28
+ </section>
138
29
 
139
30
  <section>
140
- <p>This is a technology demonstration by WIP Computer, Inc.</p>
31
+ <h2>Definitions</h2>
32
+ <p>"Services" means WIP Computer websites, hosted internet services, account surfaces, relay and sync services, registries, marketplace-related services, APIs, documentation, agent-readable pages, and product surfaces that link to these terms.</p>
33
+ <p>"Software" means WIP Computer local software, installers, CLIs, agents, extensions, hooks, MCP servers, libraries, scripts, and other code. Software may be governed by separate open-source or commercial licenses.</p>
34
+ <p>"Agents" means AI systems, automated tools, assistants, models, runtimes, or delegated processes that you connect to, authorize, configure, or operate through WIP Computer products.</p>
35
+ <p>"Extensions" means skills, plugins, MCP servers, hooks, packages, connectors, and other add-ons used with local runtimes or hosted services.</p>
36
+ <p>"Registries" means catalogs, install documents, package listings, agent-readable manifests, source indexes, marketplace listings, or similar distribution and discovery surfaces.</p>
37
+ <p>"Third-Party Providers" means external AI providers, model providers, MCP servers, APIs, payment processors, wallet providers, package registries, hosting providers, identity providers, app stores, developer tools, and other external services.</p>
38
+ <p>"User Content" means prompts, instructions, messages, files, media, credentials, tool inputs, agent configuration, memories, context, and other content you provide, authorize, upload, or route through a Service.</p>
39
+ <p>"Generated Content" means images, text, code, actions, plans, summaries, tool outputs, agent responses, or other output generated by AI systems, agents, tools, or services.</p>
40
+ <p>"Local Runtime" means software, agents, credentials, memories, tools, extensions, logs, and generated output running or stored on your device or infrastructure.</p>
41
+ <p>"Hosted Services" means WIP-operated services that run on WIP Computer infrastructure or infrastructure providers we use.</p>
42
+ <p>"Payment Services" means Agent Pay, wallet, credit, spend authorization, checkout, payment link, transaction, and payment-provider features.</p>
43
+ <p>"Marketplace" means any current or future WIP Computer surface for discovering, installing, listing, buying, selling, authorizing, or distributing agents, extensions, tools, skills, services, or content.</p>
141
44
  </section>
142
45
 
143
46
  <section>
144
- <h2>The Demo</h2>
145
- <p>This demo showcases passkey authentication, biometric permission, and AI image generation. It is not a production service.</p>
47
+ <h2>What WIP Computer Provides</h2>
48
+ <p>WIP Computer builds a distributed operating environment for AI systems. The product family includes internet services, local software, hosted account services, Kaleidoscope, LDM OS, Memory Crystal, Bridge, Agent Pay, install and inspection surfaces, agent-readable documentation, and related tooling.</p>
49
+ <p>Some features run locally. Some features run through Hosted Services. Some features coordinate Third-Party Providers. WIP Computer may route, coordinate, authorize, log, display, or store actions without being the model provider, payment provider, package registry, MCP server, or tool provider for every action.</p>
50
+ <p>The Services are active software and may be alpha, experimental, private, changing, unavailable, rate-limited, renamed, or discontinued.</p>
146
51
  </section>
147
52
 
148
53
  <section>
149
- <h2>Your Account</h2>
150
- <p>Your account is created with a passkey. No email or password is stored. Your passkey lives on your device.</p>
54
+ <h2>Using The Services</h2>
55
+ <p>You may use the Services to learn about WIP Computer, inspect product information, follow install instructions, read agent-facing documentation, use public links, authorize supported agents, and use features we make available to you.</p>
56
+ <p>You may not misuse the Services. This includes attempting unauthorized access, interfering with infrastructure, scraping in a way that burdens the service, impersonating another person or system, bypassing security controls, abusing rate limits, attacking third-party systems, exfiltrating data, violating law, or using the Services to harm others.</p>
151
57
  </section>
152
58
 
153
59
  <section>
154
- <h2>Your Wallet</h2>
155
- <p>The demo wallet starts with $5.00 in simulated credits. No real money is charged. The wallet balance is for demonstration purposes only.</p>
60
+ <h2>Accounts, Credentials, And Security</h2>
61
+ <p>Some Services use passkeys, WebAuthn, device authorization, API keys, scoped tokens, local credentials, wallet approvals, or other account controls. You are responsible for keeping your devices, local runtimes, agents, extensions, credentials, passkeys, wallets, and tokens secure.</p>
62
+ <p>You are responsible for activity authorized through your credentials, devices, agents, policies, permissions, scoped tokens, spend limits, or other controls. Notify us if you believe your WIP Computer account, token, passkey, wallet approval, or hosted service access has been compromised.</p>
156
63
  </section>
157
64
 
158
65
  <section>
159
- <h2>Generated Content</h2>
160
- <p>Images generated through this demo are created using third-party AI APIs (xAI Grok Imagine). Generated content is dual-licensed:</p>
161
- <ul>
162
- <li>MIT License for personal, non-commercial use</li>
163
- <li>Apache 2.0 License for commercial use</li>
164
- </ul>
165
- <p>Both you and WIP Computer, Inc. retain rights to generated content. We may use generated images for product development, marketing, and research.</p>
66
+ <h2>Agents, Tools, And Remote Execution</h2>
67
+ <p>Agents and AI systems may produce incorrect, unsafe, incomplete, destructive, infringing, biased, unexpected, or unsuitable output. You are responsible for reviewing important outputs, tool calls, code, files, payments, messages, deployments, remote execution, and system changes before authorizing or relying on them.</p>
68
+ <p>You are responsible for agents, tools, extensions, permissions, secrets, credentials, repositories, runtimes, environments, spend controls, and Third-Party Providers you configure or authorize. Do not give an agent access to anything you are not prepared for it to use within the permissions you grant.</p>
69
+ <p>WIP Computer may provide approval flows, passkeys, scoped tokens, prompts, policies, logs, warnings, or spend controls, but those controls do not eliminate your responsibility for actions you authorize.</p>
166
70
  </section>
167
71
 
168
72
  <section>
169
- <h2>Uploaded Media</h2>
170
- <p>Photos taken through the camera feature are processed locally in your browser. They are not uploaded to or stored on our servers. Camera access is optional and can be denied.</p>
73
+ <h2>User Content And Generated Content</h2>
74
+ <p>You retain any rights you have in your User Content. You grant WIP Computer the rights needed to host, route, process, display, transmit, store, secure, debug, support, and operate the Services for that User Content.</p>
75
+ <p>You also retain any rights you have in private Generated Content you create or authorize through the Services. Product-specific terms may set different rights for clearly labeled Kaleidoscope demo, gallery, onboarding demo, live image wall, or similar demo experiences. WIP Computer does not claim ownership of your private prompts, files, memories, agent content, or private generated outputs.</p>
76
+ <p>Generated Content may be produced by WIP Computer systems, Third-Party Providers, local models, agents, extensions, or tools. WIP Computer does not guarantee Generated Content will be accurate, lawful, unique, non-infringing, safe, secure, or suitable for your purpose.</p>
77
+ <p>You are responsible for your use of User Content and Generated Content, including whether you have rights to provide inputs, request outputs, publish outputs, execute code, or use generated materials in your intended context.</p>
171
78
  </section>
172
79
 
173
80
  <section>
174
- <h2>No Warranty</h2>
175
- <p>This demo is provided "as is" without warranty of any kind. WIP Computer, Inc. is not liable for any damages arising from use of this demo.</p>
81
+ <h2>Payments, Wallets, And Spend</h2>
82
+ <p>Today, WIP Computer Services may show wallet or credit balances and may request user approval before a feature spends credits or calls a paid third-party provider, such as xAI / Grok Imagine image generation in Kaleidoscope.</p>
83
+ <p>As the product develops, Agent Pay and payment features may support payment providers, card checkout, one-time payment links, x402-style paths, platform payment flows, bring-your-own-wallet modes, or other payment infrastructure. Payment Services may not be live everywhere. Do not assume a balance is real money, redeemable value, or transferable value unless the product clearly says so and provides the applicable payment terms at the point of use.</p>
84
+ <p>You are responsible for spend, purchases, wallet actions, payment approvals, and charges you authorize through passkeys, device approval, policies, spend limits, wallet settings, payment provider flows, or other controls.</p>
176
85
  </section>
177
86
 
178
87
  <section>
179
- <h2>Contact</h2>
180
- <p><a href="mailto:hello@wip.computer">hello@wip.computer</a></p>
88
+ <h2>Third-Party Providers And Links</h2>
89
+ <p>The Services may link to or interoperate with GitHub, X, xAI, OpenAI, Anthropic, OpenRouter, 1Password, operating-system authenticators, package registries, app stores, MCP servers, model providers, payment providers, and other Third-Party Providers.</p>
90
+ <p>Third-Party Providers are not controlled by WIP Computer and may have their own terms, privacy practices, fees, rate limits, model behavior, safety rules, outage patterns, and data practices. They may fail, change, suspend access, charge fees, return unsafe output, or behave outside WIP Computer's control.</p>
91
+ </section>
92
+
93
+ <section>
94
+ <h2>Feedback</h2>
95
+ <p>If you send us feedback, ideas, bug reports, suggestions, or other comments, you allow WIP Computer to use them without restriction or compensation. Do not send confidential information through public channels.</p>
96
+ </section>
97
+
98
+ <section>
99
+ <h2>WIP Computer Content And Software Licenses</h2>
100
+ <p>The Services and their text, design, code, images, examples, documentation, interface, names, marks, product descriptions, onboarding flows, scripts, prompts, WIP-supplied assets, and other materials are owned by WIP Computer or its licensors unless otherwise stated.</p>
101
+ <p>You may read, reference, and share public documentation for normal informational use. You may not copy, mirror, resell, or use WIP Computer content in a way that suggests endorsement, removes attribution, bypasses product controls, or misrepresents WIP Computer.</p>
102
+ <p>Open-source repositories, install documents, packages, and extensions may have their own licenses. Those licenses control your use of that Software or package.</p>
181
103
  </section>
182
104
 
183
- <footer>
184
- <div id="kscope-footer" style="text-align:center;"></div>
185
- </footer>
186
- <script src="/demo/footer.js"></script>
187
- </div>
105
+ <section>
106
+ <h2>Disclaimers</h2>
107
+ <p>The Services, Software, User Content, Generated Content, local-runtime features, Hosted Services, Payment Services, registries, marketplace-related surfaces, third-party integrations, and documentation are provided "as is" and "as available." WIP Computer does not promise that they will be uninterrupted, error-free, secure, current, accurate, compatible with every environment, or suitable for your use.</p>
108
+ </section>
109
+
110
+ <section>
111
+ <h2>Limitation Of Liability</h2>
112
+ <p>To the fullest extent permitted by law, WIP Computer will not be liable for indirect, incidental, special, consequential, exemplary, or punitive damages, or for lost profits, lost data, lost goodwill, service interruption, security incident, third-party provider behavior, generated output, payment issue, agent action, remote execution, or local-runtime change arising from or related to the Services.</p>
113
+ <p>To the fullest extent permitted by law, WIP Computer's total liability for all claims arising from or related to the Services is limited to the greater of the amount you paid WIP Computer for the applicable Service in the 12 months before the claim or 100 US dollars.</p>
114
+ </section>
115
+
116
+ <section>
117
+ <h2>Indemnity</h2>
118
+ <p>You agree to defend and hold WIP Computer harmless from claims, damages, liabilities, costs, and expenses arising from your misuse of the Services, User Content, Generated Content, agents, extensions, credentials, tools, payment approvals, violation of these terms, violation of law, or violation of third-party rights.</p>
119
+ </section>
120
+
121
+ <section>
122
+ <h2>Additional Product Terms</h2>
123
+ <p>Some products have product-specific terms. Those terms apply in addition to these Website Terms.</p>
124
+ <p>Kaleidoscope Terms: <a href="/legal/internet-services/kaleidoscope/">/legal/internet-services/kaleidoscope/</a></p>
125
+ </section>
126
+
127
+ <section>
128
+ <h2>Governing Law And Venue</h2>
129
+ <p>These terms are governed by the laws of California and applicable United States law, without regard to conflict-of-law rules, unless local law requires otherwise. To the fullest extent permitted by law, the exclusive venue for disputes arising from or related to the Services or these terms will be the state or federal courts located in Los Angeles County, California.</p>
130
+ </section>
131
+
132
+ <section>
133
+ <h2>Changes To These Terms</h2>
134
+ <p>We may update these terms from time to time. The updated date will show when the terms last changed. Your continued use of the site after changes means you accept the updated terms.</p>
135
+ </section>
136
+
137
+ <section>
138
+ <h2>Contact</h2>
139
+ <p>Questions about these terms can be sent to <a href="mailto:hello@wip.computer">hello@wip.computer</a>.</p>
140
+ </section>
141
+ </main>
142
+ <footer class="site-footer" data-screen-label="Footer">
143
+ <div class="site-footer__inner">
144
+ <div class="site-footer__cols">
145
+ <div class="site-footer__brand-col">
146
+ <a class="site-footer__brand-name" href="https://wip.computer/">WIP Computer, Inc.</a>
147
+ <div class="site-footer__brand-tag">Learning Dreaming Machines</div>
148
+ <div class="site-footer__brand-tag">Made in California.</div>
149
+ </div>
150
+ <div class="site-footer__col-group">
151
+ <div class="site-footer__col">
152
+ <div class="site-footer__col-title">AI Infrastructure</div>
153
+ <ul>
154
+ <li><a href="https://github.com/wipcomputer/wip-ldm-os" target="_blank" rel="noopener">LDM OS</a></li>
155
+ <li><a href="https://github.com/wipcomputer/memory-crystal" target="_blank" rel="noopener">Memory Crystal</a></li>
156
+ <li><a href="https://github.com/wipcomputer/dream-weaver-protocol" target="_blank" rel="noopener">Dream Weaver</a></li>
157
+ <li><a href="https://github.com/wipcomputer/wip-ldm-os/blob/main/docs/bridge/README.md" target="_blank" rel="noopener">Bridge</a></li>
158
+ </ul>
159
+ </div>
160
+ </div>
161
+ <div class="site-footer__col-group">
162
+ <div class="site-footer__col">
163
+ <div class="site-footer__col-title">AI Skills</div>
164
+ <ul>
165
+ <li><a href="https://github.com/wipcomputer/wip-ldm-os/blob/main/docs/universal-installer/TECHNICAL.md" target="_blank" rel="noopener">Universal Installer</a></li>
166
+ <li><a href="https://github.com/wipcomputer/wip-1password" target="_blank" rel="noopener">1Password</a></li>
167
+ <li><a href="https://github.com/wipcomputer/wip-ai-devops-toolbox" target="_blank" rel="noopener">AI DevOps Toolbox</a></li>
168
+ <li><a href="https://github.com/wipcomputer/wip-x-xai-grok" target="_blank" rel="noopener">X + xAI</a></li>
169
+ </ul>
170
+ </div>
171
+ <div class="site-footer__col">
172
+ <div class="site-footer__col-title">Applications</div>
173
+ <ul>
174
+ <li><a href="https://wip.computer/login?next=/demo" target="_blank" rel="noopener">Kaleidoscope</a></li>
175
+ <li><a href="https://github.com/wipcomputer/wip-codex-remote-control" target="_blank" rel="noopener">Remote Control</a></li>
176
+ <li><a href="https://github.com/wipcomputer/CLVR" target="_blank" rel="noopener">CLVR</a></li>
177
+ <li><a href="https://github.com/wipcomputer/wip-markdown-viewer" target="_blank" rel="noopener">Markdown Viewer</a></li>
178
+ </ul>
179
+ </div>
180
+ </div>
181
+ <div class="site-footer__col-group">
182
+ <div class="site-footer__col">
183
+ <div class="site-footer__col-title">Tools</div>
184
+ <ul>
185
+ <li><a href="https://wip.computer/agent.txt" target="_blank" rel="noopener" data-agent>Are you an AI agent?</a></li>
186
+ <li><a href="https://wip.computer/visualizations/kaleidoscope/onboarding/live/">Visualizations</a></li>
187
+ <li class="site-footer__passkeys-row">
188
+ <button type="button" class="site-footer__passkeys" aria-pressed="false" aria-label="Local passkeys off" data-passkeys>
189
+ <span class="site-footer__passkeys-dot"></span>
190
+ <span class="site-footer__passkeys-label">
191
+ <span data-passkeys-label>Local passkeys off</span>
192
+ <span class="site-footer__passkeys-ghost" aria-hidden="true">Local passkeys off</span>
193
+ </span>
194
+ </button>
195
+ <span class="site-footer__info-wrap">
196
+ <button type="button" class="site-footer__info" aria-label="About local passkeys" data-passkeys-info aria-describedby="passkeys-info-tip">
197
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
198
+ <circle cx="12" cy="12" r="10"></circle>
199
+ <line x1="12" y1="16" x2="12" y2="12"></line>
200
+ <line x1="12" y1="8" x2="12.01" y2="8"></line>
201
+ </svg>
202
+ </button>
203
+ <span class="site-footer__info-popover" id="passkeys-info-tip" role="tooltip">
204
+ Local passkeys are off by default. Your phone&apos;s passkeys are used for login and device sync. Turn this on to use or save passkeys on this machine.
205
+ </span>
206
+ </span>
207
+ </li>
208
+ </ul>
209
+ </div>
210
+ <div class="site-footer__col">
211
+ <div class="site-footer__col-title">Connect</div>
212
+ <ul>
213
+ <li><a href="https://github.com/wipcomputer" target="_blank" rel="noopener" class="site-footer__link-with-icon"><span class="site-footer__link-icon" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.4 3-.405 1.02.005 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path></svg></span><span>@wipcomputer</span></a></li>
214
+ <li><a href="https://x.com/wipcomputer" target="_blank" rel="noopener" class="site-footer__link-with-icon"><span class="site-footer__link-icon" aria-hidden="true"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24h-6.66l-5.214-6.817-5.97 6.817H1.673l7.73-8.835L1.254 2.25h6.83l4.713 6.231 5.447-6.231zM17.083 19.77h1.833L7.084 4.126H5.117l11.966 15.644z"></path></svg></span><span>@wipcomputer</span></a></li>
215
+ </ul>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ <div class="site-footer__bottom">
220
+ <div>Copyright &copy; 2026 WIP Computer, Inc. All rights reserved.</div>
221
+ <div class="right">
222
+ <a href="https://wip.computer/legal/privacy/" target="_blank" rel="noopener">Privacy Policy</a>
223
+ <a href="https://wip.computer/legal/internet-services/terms/site.html" target="_blank" rel="noopener">Terms of Use</a>
224
+ </div>
225
+ </div>
226
+ </div>
227
+ </footer>
228
+ <script src="/legal/legal-footer.js"></script>
188
229
  <script>
189
- var SPRITE_COLS = 8, SPRITE_ROWS = 3, SPRITE_TOTAL = 24;
190
- var navIdx = Math.floor(Math.random() * SPRITE_TOTAL);
191
- function updateNavIcon() {
192
- var el = document.getElementById('navIcon');
193
- if (!el) return;
194
- var col = navIdx % SPRITE_COLS;
195
- var row = Math.floor(navIdx / SPRITE_COLS);
196
- var bgPosX = (col / (SPRITE_COLS - 1)) * 100;
197
- var bgPosY = (row / (SPRITE_ROWS - 1)) * 100;
198
- el.innerHTML = '<div style="width:28px;height:28px;overflow:hidden;"><div style="width:100%;height:100%;background:url(/demo/sprites.png);background-size:' + (SPRITE_COLS * 100) + '% ' + (SPRITE_ROWS * 100) + '%;background-position:' + bgPosX + '% ' + bgPosY + '%;"></div></div>';
199
- navIdx = (navIdx + 1) % SPRITE_TOTAL;
200
- }
201
- updateNavIcon();
202
- setInterval(updateNavIcon, 6000);
230
+ (function() {
231
+ var SPRITE_COLS = 8;
232
+ var SPRITE_ROWS = 3;
233
+ var SPRITE_TOTAL = SPRITE_COLS * SPRITE_ROWS;
234
+ var idx = Math.floor(Math.random() * SPRITE_TOTAL);
235
+
236
+ function renderBrandIcon() {
237
+ var el = document.querySelector("[data-brand-icon]");
238
+ if (!el) return;
239
+ var col = idx % SPRITE_COLS;
240
+ var row = Math.floor(idx / SPRITE_COLS);
241
+ var bgX = (col / (SPRITE_COLS - 1)) * 100;
242
+ var bgY = (row / (SPRITE_ROWS - 1)) * 100;
243
+ el.innerHTML = '<div style="background:url(/app/sprites.png);background-size:' + (SPRITE_COLS * 100) + '% ' + (SPRITE_ROWS * 100) + '%;background-position:' + bgX + '% ' + bgY + '%;"></div>';
244
+ }
245
+
246
+ function updateHeader() {
247
+ var header = document.querySelector(".site-header");
248
+ if (header) header.classList.toggle("is-scrolled", window.scrollY > 8);
249
+ }
250
+
251
+ renderBrandIcon();
252
+ window.setInterval(function() {
253
+ idx = (idx + 1) % SPRITE_TOTAL;
254
+ renderBrandIcon();
255
+ }, 6000);
256
+ updateHeader();
257
+ window.addEventListener("scroll", updateHeader, { passive: true });
258
+ })();
203
259
  </script>
204
260
  </body>
205
261
  </html>
@@ -0,0 +1,75 @@
1
+ (function() {
2
+ function isLocalPasskeysOn() {
3
+ return localStorage.getItem('localPasskeys') === 'on';
4
+ }
5
+
6
+ function updatePasskeysDot() {
7
+ var button = document.querySelector('[data-passkeys]');
8
+ var label = document.querySelector('[data-passkeys-label]');
9
+ if (!button || !label) return;
10
+ var on = isLocalPasskeysOn();
11
+ button.classList.toggle('is-on', on);
12
+ button.setAttribute('aria-pressed', on ? 'true' : 'false');
13
+ button.setAttribute('aria-label', 'Local passkeys ' + (on ? 'on' : 'off'));
14
+ label.textContent = 'Local passkeys ' + (on ? 'on' : 'off');
15
+ }
16
+
17
+ function initFooterPasskeys() {
18
+ var button = document.querySelector('[data-passkeys]');
19
+ if (!button) return;
20
+ button.addEventListener('click', function() {
21
+ var on = isLocalPasskeysOn();
22
+ localStorage.setItem('localPasskeys', on ? 'off' : 'on');
23
+ updatePasskeysDot();
24
+ });
25
+ updatePasskeysDot();
26
+ }
27
+
28
+ function initFooterPasskeysInfo() {
29
+ var button = document.querySelector('[data-passkeys-info]');
30
+ if (!button) return;
31
+ var popover = document.getElementById(button.getAttribute('aria-describedby'));
32
+ var startScrollY = 0;
33
+
34
+ function positionPopover() {
35
+ if (!popover || button.getAttribute('aria-expanded') !== 'true') return;
36
+ popover.style.setProperty('--shift', '0px');
37
+ var rect = popover.getBoundingClientRect();
38
+ var padding = 16;
39
+ var shift = 0;
40
+ if (rect.left < padding) shift = padding - rect.left;
41
+ if (rect.right > window.innerWidth - padding) shift = window.innerWidth - padding - rect.right;
42
+ popover.style.setProperty('--shift', shift + 'px');
43
+ }
44
+
45
+ function setOpen(open) {
46
+ button.setAttribute('aria-expanded', open ? 'true' : 'false');
47
+ if (open) {
48
+ startScrollY = window.scrollY;
49
+ positionPopover();
50
+ }
51
+ }
52
+
53
+ button.addEventListener('click', function(event) {
54
+ event.stopPropagation();
55
+ setOpen(button.getAttribute('aria-expanded') !== 'true');
56
+ });
57
+ document.addEventListener('click', function(event) {
58
+ if (!button.contains(event.target) && (!popover || !popover.contains(event.target))) {
59
+ setOpen(false);
60
+ }
61
+ });
62
+ document.addEventListener('keydown', function(event) {
63
+ if (event.key === 'Escape') setOpen(false);
64
+ });
65
+ window.addEventListener('scroll', function() {
66
+ if (button.getAttribute('aria-expanded') === 'true' && Math.abs(window.scrollY - startScrollY) > 24) {
67
+ setOpen(false);
68
+ }
69
+ }, { passive: true });
70
+ window.addEventListener('resize', positionPopover);
71
+ }
72
+
73
+ initFooterPasskeys();
74
+ initFooterPasskeysInfo();
75
+ })();