clawd-automaton 0.2.0 → 0.2.1

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 (175) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +129 -85
  3. package/dist/__tests__/heartbeat.test.js +7 -7
  4. package/dist/__tests__/heartbeat.test.js.map +1 -1
  5. package/dist/__tests__/loop.test.js +15 -15
  6. package/dist/__tests__/loop.test.js.map +1 -1
  7. package/dist/__tests__/mocks.d.ts +2 -2
  8. package/dist/__tests__/mocks.d.ts.map +1 -1
  9. package/dist/__tests__/mocks.js +8 -8
  10. package/dist/__tests__/mocks.js.map +1 -1
  11. package/dist/agent/injection-defense.js +1 -1
  12. package/dist/agent/injection-defense.js.map +1 -1
  13. package/dist/agent/loop.d.ts +3 -2
  14. package/dist/agent/loop.d.ts.map +1 -1
  15. package/dist/agent/loop.js +10 -9
  16. package/dist/agent/loop.js.map +1 -1
  17. package/dist/agent/system-prompt.js +6 -6
  18. package/dist/agent/tools.d.ts.map +1 -1
  19. package/dist/agent/tools.js +130 -60
  20. package/dist/agent/tools.js.map +1 -1
  21. package/dist/{conway → clawd}/backroom.d.ts +1 -1
  22. package/dist/clawd/backroom.d.ts.map +1 -0
  23. package/dist/{conway → clawd}/backroom.js +1 -1
  24. package/dist/clawd/backroom.js.map +1 -0
  25. package/dist/clawd/client.d.ts +16 -0
  26. package/dist/clawd/client.d.ts.map +1 -0
  27. package/dist/{conway → clawd}/client.js +8 -9
  28. package/dist/clawd/client.js.map +1 -0
  29. package/dist/clawd/convex-client.d.ts +130 -0
  30. package/dist/clawd/convex-client.d.ts.map +1 -0
  31. package/dist/clawd/convex-client.js +118 -0
  32. package/dist/clawd/convex-client.js.map +1 -0
  33. package/dist/{conway → clawd}/credits.d.ts +3 -3
  34. package/dist/clawd/credits.d.ts.map +1 -0
  35. package/dist/{conway → clawd}/credits.js +3 -3
  36. package/dist/clawd/credits.js.map +1 -0
  37. package/dist/{conway → clawd}/deepseek-inference.d.ts +1 -1
  38. package/dist/clawd/deepseek-inference.d.ts.map +1 -0
  39. package/dist/{conway → clawd}/deepseek-inference.js +1 -1
  40. package/dist/clawd/deepseek-inference.js.map +1 -0
  41. package/dist/{conway → clawd}/inference.d.ts +3 -3
  42. package/dist/clawd/inference.d.ts.map +1 -0
  43. package/dist/{conway → clawd}/inference.js +3 -3
  44. package/dist/clawd/inference.js.map +1 -0
  45. package/dist/{conway → clawd}/x402.d.ts +1 -1
  46. package/dist/clawd/x402.d.ts.map +1 -0
  47. package/dist/{conway → clawd}/x402.js +1 -1
  48. package/dist/clawd/x402.js.map +1 -0
  49. package/dist/config.d.ts +1 -1
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +5 -5
  52. package/dist/config.js.map +1 -1
  53. package/dist/git/state-versioning.d.ts +8 -8
  54. package/dist/git/state-versioning.d.ts.map +1 -1
  55. package/dist/git/state-versioning.js +19 -19
  56. package/dist/git/state-versioning.js.map +1 -1
  57. package/dist/git/tools.d.ts +9 -9
  58. package/dist/git/tools.d.ts.map +1 -1
  59. package/dist/git/tools.js +17 -17
  60. package/dist/git/tools.js.map +1 -1
  61. package/dist/heartbeat/config.d.ts.map +1 -1
  62. package/dist/heartbeat/config.js +6 -0
  63. package/dist/heartbeat/config.js.map +1 -1
  64. package/dist/heartbeat/daemon.d.ts +2 -2
  65. package/dist/heartbeat/daemon.d.ts.map +1 -1
  66. package/dist/heartbeat/daemon.js +4 -4
  67. package/dist/heartbeat/daemon.js.map +1 -1
  68. package/dist/heartbeat/tasks.d.ts +2 -2
  69. package/dist/heartbeat/tasks.d.ts.map +1 -1
  70. package/dist/heartbeat/tasks.js +68 -7
  71. package/dist/heartbeat/tasks.js.map +1 -1
  72. package/dist/identity/provision.d.ts +4 -3
  73. package/dist/identity/provision.d.ts.map +1 -1
  74. package/dist/identity/provision.js +10 -10
  75. package/dist/identity/provision.js.map +1 -1
  76. package/dist/identity/wallet.d.ts +1 -1
  77. package/dist/identity/wallet.js +1 -1
  78. package/dist/index.d.ts +1 -1
  79. package/dist/index.js +75 -40
  80. package/dist/index.js.map +1 -1
  81. package/dist/ooda/claude-decision.d.ts +18 -0
  82. package/dist/ooda/claude-decision.d.ts.map +1 -0
  83. package/dist/ooda/claude-decision.js +82 -0
  84. package/dist/ooda/claude-decision.js.map +1 -0
  85. package/dist/ooda/journal.d.ts +22 -0
  86. package/dist/ooda/journal.d.ts.map +1 -0
  87. package/dist/ooda/journal.js +26 -0
  88. package/dist/ooda/journal.js.map +1 -0
  89. package/dist/ooda/loop.d.ts +3 -0
  90. package/dist/ooda/loop.d.ts.map +1 -0
  91. package/dist/ooda/loop.js +210 -0
  92. package/dist/ooda/loop.js.map +1 -0
  93. package/dist/ooda/observe.d.ts +21 -0
  94. package/dist/ooda/observe.d.ts.map +1 -0
  95. package/dist/ooda/observe.js +75 -0
  96. package/dist/ooda/observe.js.map +1 -0
  97. package/dist/ooda/state.d.ts +34 -0
  98. package/dist/ooda/state.d.ts.map +1 -0
  99. package/dist/ooda/state.js +48 -0
  100. package/dist/ooda/state.js.map +1 -0
  101. package/dist/ooda/tui.d.ts +3 -0
  102. package/dist/ooda/tui.d.ts.map +1 -0
  103. package/dist/ooda/tui.js +132 -0
  104. package/dist/ooda/tui.js.map +1 -0
  105. package/dist/ooda/validate.d.ts +33 -0
  106. package/dist/ooda/validate.d.ts.map +1 -0
  107. package/dist/ooda/validate.js +91 -0
  108. package/dist/ooda/validate.js.map +1 -0
  109. package/dist/registry/agent-card.d.ts +3 -3
  110. package/dist/registry/agent-card.d.ts.map +1 -1
  111. package/dist/registry/agent-card.js +10 -10
  112. package/dist/registry/agent-card.js.map +1 -1
  113. package/dist/replication/lineage.d.ts +2 -2
  114. package/dist/replication/lineage.d.ts.map +1 -1
  115. package/dist/replication/lineage.js +2 -2
  116. package/dist/replication/lineage.js.map +1 -1
  117. package/dist/replication/spawn.d.ts +7 -7
  118. package/dist/replication/spawn.d.ts.map +1 -1
  119. package/dist/replication/spawn.js +23 -23
  120. package/dist/replication/spawn.js.map +1 -1
  121. package/dist/self-mod/code.d.ts +2 -2
  122. package/dist/self-mod/code.d.ts.map +1 -1
  123. package/dist/self-mod/code.js +5 -5
  124. package/dist/self-mod/code.js.map +1 -1
  125. package/dist/self-mod/tools-manager.d.ts +3 -3
  126. package/dist/self-mod/tools-manager.d.ts.map +1 -1
  127. package/dist/self-mod/tools-manager.js +3 -3
  128. package/dist/self-mod/tools-manager.js.map +1 -1
  129. package/dist/setup/banner.js +13 -13
  130. package/dist/setup/defaults.js +9 -9
  131. package/dist/setup/defaults.js.map +1 -1
  132. package/dist/setup/environment.js +5 -5
  133. package/dist/setup/environment.js.map +1 -1
  134. package/dist/setup/wizard.js +8 -8
  135. package/dist/setup/wizard.js.map +1 -1
  136. package/dist/skills/registry.d.ts +5 -5
  137. package/dist/skills/registry.d.ts.map +1 -1
  138. package/dist/skills/registry.js +12 -12
  139. package/dist/skills/registry.js.map +1 -1
  140. package/dist/social/client.js +3 -3
  141. package/dist/social/client.js.map +1 -1
  142. package/dist/survival/funding.d.ts +2 -2
  143. package/dist/survival/funding.d.ts.map +1 -1
  144. package/dist/survival/funding.js +3 -3
  145. package/dist/survival/funding.js.map +1 -1
  146. package/dist/survival/monitor.d.ts +2 -2
  147. package/dist/survival/monitor.d.ts.map +1 -1
  148. package/dist/survival/monitor.js +5 -5
  149. package/dist/survival/monitor.js.map +1 -1
  150. package/dist/types.d.ts +11 -7
  151. package/dist/types.d.ts.map +1 -1
  152. package/dist/types.js +4 -4
  153. package/dist/types.js.map +1 -1
  154. package/package.json +23 -31
  155. package/dist/automation/index.html +0 -828
  156. package/dist/automation/manifest.json +0 -35
  157. package/dist/conway/backroom.d.ts.map +0 -1
  158. package/dist/conway/backroom.js.map +0 -1
  159. package/dist/conway/client.d.ts +0 -16
  160. package/dist/conway/client.d.ts.map +0 -1
  161. package/dist/conway/client.js.map +0 -1
  162. package/dist/conway/credits.d.ts.map +0 -1
  163. package/dist/conway/credits.js.map +0 -1
  164. package/dist/conway/deepseek-inference.d.ts.map +0 -1
  165. package/dist/conway/deepseek-inference.js.map +0 -1
  166. package/dist/conway/inference.d.ts.map +0 -1
  167. package/dist/conway/inference.js.map +0 -1
  168. package/dist/conway/x402.d.ts.map +0 -1
  169. package/dist/conway/x402.js.map +0 -1
  170. package/dist/portal/generate.d.ts +0 -5
  171. package/dist/portal/generate.d.ts.map +0 -1
  172. package/dist/portal/generate.js +0 -940
  173. package/dist/portal/generate.js.map +0 -1
  174. package/scripts/automaton.sh +0 -26
  175. package/scripts/clawd-rules.txt +0 -32
@@ -1,940 +0,0 @@
1
- import fs from "fs";
2
- import path from "path";
3
- const DEFAULT_OUTPUT_DIR = path.resolve(process.cwd(), "dist/automation");
4
- function normalizeBaseUrl(value) {
5
- return value.endsWith("/") ? value.slice(0, -1) : value;
6
- }
7
- function resolvePortalConfig() {
8
- const publicBaseUrl = normalizeBaseUrl(process.env.AUTOMATON_PUBLIC_BASE_URL ||
9
- process.env.PUBLIC_APP_URL ||
10
- "https://solanaclawd.com/automation");
11
- const loginUrl = process.env.AUTOMATON_LOGIN_URL || `${publicBaseUrl}/login`;
12
- const inferenceUrl = process.env.AUTOMATON_INFERENCE_URL || `${publicBaseUrl}/inference`;
13
- const sandboxUrl = process.env.AUTOMATON_SANDBOX_URL || `${publicBaseUrl}/sandboxes/new`;
14
- const agentChatUrl = process.env.AUTOMATON_AGENT_CHAT_URL || `${publicBaseUrl}/agents/chat`;
15
- const x402CheckoutUrl = process.env.AUTOMATON_X402_CHECKOUT_URL || `${publicBaseUrl}/checkout/x402`;
16
- const x402CurlUrl = process.env.AUTOMATON_X402_CURL_URL || "https://pay.sh";
17
- const clawdCheckoutUrl = process.env.AUTOMATON_CLAWD_CHECKOUT_URL || `${publicBaseUrl}/checkout/clawd`;
18
- return {
19
- appName: process.env.AUTOMATON_PORTAL_NAME || "Clawd Automaton Access",
20
- headline: process.env.AUTOMATON_PORTAL_HEADLINE ||
21
- "Public automation access for inference, sandboxes, and agent chat.",
22
- subheadline: process.env.AUTOMATON_PORTAL_SUBHEADLINE ||
23
- "Sign in, pick a lane, and pay per action. This portal exposes Clawd Cloud inference, sandbox deployment, and live agent chat behind x402 or 1,000 $CLAWD.",
24
- publicBaseUrl,
25
- loginUrl,
26
- inferenceUrl,
27
- sandboxUrl,
28
- agentChatUrl,
29
- x402CheckoutUrl,
30
- x402CurlUrl,
31
- clawdCheckoutUrl,
32
- supportUrl: process.env.AUTOMATON_SUPPORT_URL || "https://x.com/openclawd",
33
- supportLabel: process.env.AUTOMATON_SUPPORT_LABEL || "@openclawd",
34
- payAmountUsd: process.env.AUTOMATON_PAY_AMOUNT_USD || "0.69420",
35
- clawdAmount: process.env.AUTOMATON_CLAWD_AMOUNT || "1000",
36
- networkLabel: process.env.AUTOMATON_PAYMENT_NETWORK || "Base / x402",
37
- };
38
- }
39
- function escapeHtml(value) {
40
- return value
41
- .replaceAll("&", "&")
42
- .replaceAll("<", "&lt;")
43
- .replaceAll(">", "&gt;")
44
- .replaceAll('"', "&quot;")
45
- .replaceAll("'", "&#39;");
46
- }
47
- function renderPortalHtml(config) {
48
- const x402Snippet = `curl -X POST "${config.x402CheckoutUrl}" \\
49
- -H "Content-Type: application/json" \\
50
- -H "Accept: application/json" \\
51
- -H "X-PAYMENT-RAIL: x402" \\
52
- -d '{"product":"inference","amountUsd":"${config.payAmountUsd}"}'`;
53
- const clawdSnippet = `{
54
- "product": "agent-chat",
55
- "rail": "clawd",
56
- "amountClawd": "${config.clawdAmount}",
57
- "checkoutUrl": "${config.clawdCheckoutUrl}"
58
- }`;
59
- return `<!doctype html>
60
- <html lang="en">
61
- <head>
62
- <meta charset="utf-8" />
63
- <meta name="viewport" content="width=device-width, initial-scale=1" />
64
- <title>${escapeHtml(config.appName)}</title>
65
- <meta
66
- name="description"
67
- content="${escapeHtml(config.subheadline)}"
68
- />
69
- <style>
70
- :root {
71
- --bg: #05060b;
72
- --panel: rgba(10, 11, 20, 0.96);
73
- --panel-soft: rgba(14, 16, 26, 0.9);
74
- --panel-elevated: rgba(16, 18, 31, 0.94);
75
- --line: rgba(128, 123, 255, 0.12);
76
- --line-strong: rgba(128, 123, 255, 0.22);
77
- --text: #f3f2ff;
78
- --muted: #8d8aa8;
79
- --soft: #b7b4d1;
80
- --primary: #8b80ff;
81
- --primary-strong: #6d5dfc;
82
- --danger: #8b2432;
83
- --danger-line: #af3345;
84
- --warning: #af6d21;
85
- --shadow: 0 28px 90px rgba(0, 0, 0, 0.45);
86
- }
87
- * { box-sizing: border-box; }
88
- body {
89
- margin: 0;
90
- min-height: 100vh;
91
- font-family: "Geist", "IBM Plex Sans", "Avenir Next", "Segoe UI", sans-serif;
92
- color: var(--text);
93
- background:
94
- linear-gradient(180deg, rgba(85, 35, 69, 0.32) 0, rgba(5, 6, 11, 0) 160px),
95
- radial-gradient(circle at top center, rgba(87, 65, 153, 0.12), transparent 28%),
96
- linear-gradient(180deg, #070810 0%, #05060b 100%);
97
- }
98
- a { color: inherit; text-decoration: none; }
99
- .app {
100
- display: grid;
101
- grid-template-columns: 340px 1fr;
102
- min-height: 100vh;
103
- }
104
- .sidebar {
105
- background: linear-gradient(180deg, #08080f 0%, #04050a 100%);
106
- border-right: 1px solid rgba(255, 255, 255, 0.04);
107
- padding: 18px 0;
108
- position: sticky;
109
- top: 0;
110
- height: 100vh;
111
- display: flex;
112
- flex-direction: column;
113
- }
114
- .sidebar-title {
115
- padding: 0 18px 18px;
116
- display: flex;
117
- gap: 12px;
118
- align-items: center;
119
- font-size: 1.05rem;
120
- font-weight: 700;
121
- }
122
- .brand-mark,
123
- .nav-icon,
124
- .page-icon {
125
- width: 30px;
126
- height: 30px;
127
- border-radius: 9px;
128
- display: inline-flex;
129
- align-items: center;
130
- justify-content: center;
131
- }
132
- .brand-mark {
133
- border: 1px solid rgba(255, 255, 255, 0.08);
134
- color: var(--soft);
135
- }
136
- nav {
137
- display: grid;
138
- gap: 2px;
139
- padding: 0 10px;
140
- }
141
- .nav-link {
142
- display: flex;
143
- align-items: center;
144
- gap: 12px;
145
- min-height: 52px;
146
- padding: 0 14px;
147
- border-radius: 10px;
148
- color: var(--soft);
149
- }
150
- .nav-link.active {
151
- background: rgba(139, 128, 255, 0.12);
152
- color: #b9b1ff;
153
- }
154
- .nav-icon {
155
- font-size: 0.95rem;
156
- color: inherit;
157
- }
158
- .wallet {
159
- margin-top: auto;
160
- padding: 14px 18px 0;
161
- display: flex;
162
- align-items: center;
163
- gap: 12px;
164
- color: var(--soft);
165
- }
166
- .wallet-badge {
167
- width: 38px;
168
- height: 38px;
169
- border-radius: 999px;
170
- background: rgba(255, 255, 255, 0.06);
171
- display: inline-flex;
172
- align-items: center;
173
- justify-content: center;
174
- }
175
- .content {
176
- min-width: 0;
177
- }
178
- .notice {
179
- padding: 12px 28px 18px;
180
- background: linear-gradient(90deg, rgba(75, 13, 23, 0.88), rgba(62, 13, 19, 0.88));
181
- border-bottom: 1px solid var(--danger-line);
182
- color: #f8dde0;
183
- line-height: 1.55;
184
- font-size: 0.95rem;
185
- }
186
- .shell {
187
- position: relative;
188
- padding: 22px 22px 42px;
189
- }
190
- .shell::before {
191
- content: "";
192
- position: absolute;
193
- inset: 0;
194
- pointer-events: none;
195
- opacity: 0.35;
196
- background-image:
197
- radial-gradient(square, rgba(139, 128, 255, 0.24) 0 1px, transparent 1px),
198
- radial-gradient(square, rgba(34, 49, 111, 0.18) 0 1px, transparent 1px);
199
- background-size: 128px 128px, 176px 176px;
200
- background-position: 24px 18px, 80px 60px;
201
- mask-image: linear-gradient(180deg, rgba(0,0,0,0.95), rgba(0,0,0,0.35));
202
- }
203
- .page,
204
- .stat,
205
- .panel,
206
- .table,
207
- .console {
208
- border: 1px solid var(--line);
209
- background: var(--panel);
210
- backdrop-filter: blur(18px);
211
- box-shadow: var(--shadow);
212
- }
213
- .page {
214
- position: relative;
215
- z-index: 1;
216
- border-radius: 24px;
217
- padding: 18px 20px 20px;
218
- margin-bottom: 16px;
219
- }
220
- .page-header {
221
- display: flex;
222
- justify-content: space-between;
223
- align-items: center;
224
- gap: 16px;
225
- padding: 18px 8px 24px;
226
- border-bottom: 1px solid rgba(255, 255, 255, 0.04);
227
- margin-bottom: 24px;
228
- }
229
- .page-title {
230
- display: flex;
231
- align-items: center;
232
- gap: 14px;
233
- }
234
- .page-icon {
235
- background: linear-gradient(180deg, #8a7dff, #796bff);
236
- color: white;
237
- }
238
- .page h1,
239
- .page h2 {
240
- margin: 0;
241
- }
242
- .page h1 {
243
- font-size: 1.02rem;
244
- }
245
- .subtitle {
246
- color: var(--muted);
247
- margin-top: 4px;
248
- }
249
- .actions,
250
- .inline-actions {
251
- display: inline-flex;
252
- gap: 12px;
253
- flex-wrap: wrap;
254
- }
255
- .button {
256
- min-height: 46px;
257
- padding: 0 18px;
258
- border-radius: 12px;
259
- border: 1px solid rgba(255, 255, 255, 0.06);
260
- background: rgba(255, 255, 255, 0.02);
261
- color: var(--text);
262
- font-weight: 700;
263
- display: inline-flex;
264
- align-items: center;
265
- justify-content: center;
266
- }
267
- .button.primary {
268
- background: linear-gradient(180deg, #8c82ff, #7466f6);
269
- }
270
- .button.secondary {
271
- background: transparent;
272
- }
273
- .button.warning {
274
- background: rgba(175, 109, 33, 0.12);
275
- border-color: rgba(175, 109, 33, 0.25);
276
- color: #ffc789;
277
- }
278
- .stats {
279
- display: grid;
280
- grid-template-columns: repeat(4, minmax(0, 1fr));
281
- gap: 16px;
282
- }
283
- .stat {
284
- padding: 20px;
285
- border-radius: 18px;
286
- }
287
- .stat strong {
288
- display: block;
289
- font-size: 1.05rem;
290
- color: var(--muted);
291
- font-weight: 500;
292
- margin-bottom: 18px;
293
- }
294
- .stat b {
295
- display: block;
296
- font-size: 2.35rem;
297
- margin-bottom: 6px;
298
- }
299
- .page-grid,
300
- .double,
301
- .billing-grid {
302
- display: grid;
303
- gap: 16px;
304
- }
305
- .page-grid {
306
- grid-template-columns: 360px 1fr;
307
- }
308
- .double,
309
- .billing-grid {
310
- grid-template-columns: 1fr 1fr;
311
- }
312
- .panel,
313
- .table,
314
- .console {
315
- border-radius: 18px;
316
- padding: 24px;
317
- position: relative;
318
- z-index: 1;
319
- }
320
- .panel-title {
321
- margin: 0 0 18px;
322
- font-size: 1.05rem;
323
- }
324
- .field {
325
- display: grid;
326
- gap: 8px;
327
- margin-bottom: 18px;
328
- }
329
- label {
330
- color: var(--soft);
331
- font-weight: 600;
332
- }
333
- input,
334
- textarea,
335
- select {
336
- width: 100%;
337
- min-height: 44px;
338
- padding: 0 14px;
339
- border-radius: 10px;
340
- border: 1px solid rgba(255, 255, 255, 0.05);
341
- background: rgba(255, 255, 255, 0.02);
342
- color: var(--text);
343
- outline: none;
344
- }
345
- textarea {
346
- min-height: 104px;
347
- padding: 12px 14px;
348
- resize: vertical;
349
- }
350
- .hint,
351
- .muted {
352
- color: var(--muted);
353
- }
354
- .range-row,
355
- .toggle-row,
356
- .card-row {
357
- display: flex;
358
- justify-content: space-between;
359
- align-items: center;
360
- gap: 12px;
361
- }
362
- input[type="range"] {
363
- padding: 0;
364
- }
365
- .toggle {
366
- width: 42px;
367
- height: 24px;
368
- border-radius: 999px;
369
- background: linear-gradient(180deg, #8c82ff, #7668fb);
370
- position: relative;
371
- }
372
- .toggle::after {
373
- content: "";
374
- position: absolute;
375
- top: 3px;
376
- right: 3px;
377
- width: 18px;
378
- height: 18px;
379
- border-radius: 999px;
380
- background: white;
381
- }
382
- .chat-shell {
383
- min-height: 536px;
384
- display: grid;
385
- grid-template-rows: 1fr auto;
386
- padding: 0;
387
- overflow: hidden;
388
- }
389
- .chat-stage {
390
- display: grid;
391
- place-items: center;
392
- color: rgba(255, 255, 255, 0.34);
393
- text-align: center;
394
- padding: 24px;
395
- }
396
- .chat-input {
397
- display: grid;
398
- grid-template-columns: 1fr auto;
399
- gap: 10px;
400
- padding: 16px;
401
- border-top: 1px solid rgba(255, 255, 255, 0.04);
402
- }
403
- .chat-input input {
404
- min-height: 54px;
405
- }
406
- .send {
407
- min-width: 56px;
408
- min-height: 54px;
409
- border-radius: 12px;
410
- background: linear-gradient(180deg, #8c82ff, #6b5df8);
411
- border: 0;
412
- color: white;
413
- font-size: 1.1rem;
414
- }
415
- .section-title {
416
- margin: 30px 0 16px;
417
- font-size: 1.2rem;
418
- position: relative;
419
- z-index: 1;
420
- }
421
- .walkthrough {
422
- display: grid;
423
- gap: 16px;
424
- }
425
- .step {
426
- padding: 18px;
427
- border-radius: 14px;
428
- border: 1px solid rgba(255, 255, 255, 0.06);
429
- background: rgba(255, 255, 255, 0.02);
430
- }
431
- .step strong {
432
- display: block;
433
- margin-bottom: 4px;
434
- }
435
- .table table {
436
- width: 100%;
437
- border-collapse: collapse;
438
- }
439
- .table th,
440
- .table td {
441
- text-align: left;
442
- padding: 14px 10px;
443
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
444
- }
445
- .billing-grid {
446
- align-items: start;
447
- }
448
- .balance {
449
- min-height: 180px;
450
- }
451
- .balance .value {
452
- font-size: 2.8rem;
453
- font-weight: 800;
454
- margin: 10px 0 6px;
455
- }
456
- .credit-options {
457
- display: grid;
458
- grid-template-columns: 1fr 1fr;
459
- gap: 16px;
460
- margin-top: 18px;
461
- }
462
- .credit-option {
463
- padding: 18px;
464
- border-radius: 14px;
465
- border: 1px solid rgba(255, 255, 255, 0.06);
466
- background: rgba(255, 255, 255, 0.02);
467
- }
468
- .warning-box {
469
- margin: 18px 0;
470
- padding: 16px 18px;
471
- border-radius: 14px;
472
- border: 1px solid rgba(175, 109, 33, 0.28);
473
- background: rgba(175, 109, 33, 0.12);
474
- color: #f2b66a;
475
- }
476
- pre {
477
- margin: 0;
478
- padding: 18px;
479
- overflow-x: auto;
480
- border-radius: 14px;
481
- background: rgba(0, 0, 0, 0.28);
482
- border: 1px solid rgba(139, 128, 255, 0.08);
483
- color: #d9d3ff;
484
- font-family: "IBM Plex Mono", "SFMono-Regular", monospace;
485
- font-size: 0.88rem;
486
- line-height: 1.55;
487
- }
488
- .api-list {
489
- display: grid;
490
- gap: 14px;
491
- }
492
- .api-key {
493
- display: flex;
494
- justify-content: space-between;
495
- gap: 12px;
496
- padding: 16px 18px;
497
- border-radius: 14px;
498
- border: 1px solid rgba(255, 255, 255, 0.06);
499
- background: rgba(255, 255, 255, 0.02);
500
- }
501
- .api-key code {
502
- color: #c4bcff;
503
- }
504
- .hidden {
505
- display: none;
506
- }
507
- button.copy {
508
- cursor: pointer;
509
- }
510
- @media (max-width: 1180px) {
511
- .app {
512
- grid-template-columns: 1fr;
513
- }
514
- .sidebar {
515
- position: static;
516
- height: auto;
517
- }
518
- .wallet {
519
- margin-top: 14px;
520
- }
521
- }
522
- @media (max-width: 960px) {
523
- .page-grid,
524
- .double,
525
- .billing-grid,
526
- .credit-options,
527
- .stats {
528
- grid-template-columns: 1fr;
529
- }
530
- }
531
- </style>
532
- </head>
533
- <body>
534
- <div class="app">
535
- <aside class="sidebar">
536
- <div class="sidebar-title">
537
- <span class="brand-mark">◫</span>
538
- <span>Navigation</span>
539
- </div>
540
- <nav>
541
- <a class="nav-link active" href="#sandboxes" data-nav-target="sandboxes"><span class="nav-icon">◫</span><span>Sandboxes</span></a>
542
- <a class="nav-link" href="#inference" data-nav-target="inference"><span class="nav-icon">⬚</span><span>Inference</span></a>
543
- <a class="nav-link" href="#billing" data-nav-target="billing"><span class="nav-icon">▤</span><span>Billing</span></a>
544
- <a class="nav-link" href="#spawn" data-nav-target="spawn"><span class="nav-icon">✦</span><span>Spawn Automatons</span></a>
545
- <a class="nav-link" href="#keys" data-nav-target="keys"><span class="nav-icon">⌘</span><span>API Keys</span></a>
546
- </nav>
547
- <div class="wallet">
548
- <span class="wallet-badge">31</span>
549
- <div>
550
- <div>0x31e8 ... 99A8</div>
551
- </div>
552
- </div>
553
- </aside>
554
- <section class="content">
555
- <div class="notice">
556
- <strong>Heads up:</strong> We are shipping a major public access surface for Clawd Cloud Automation, Clawd Cloud, and Sandbox infrastructure. Users will be able to sign in, pay for inference, deploy a sandbox, or chat with an agent. For payment issues or launch coordination, contact <a href="${escapeHtml(config.supportUrl)}" style="text-decoration: underline;">${escapeHtml(config.supportLabel)}</a>.
557
- </div>
558
- <main class="shell">
559
- <section class="page" id="sandboxes" data-page="sandboxes">
560
- <div class="page-header">
561
- <div class="page-title">
562
- <span class="page-icon">◫</span>
563
- <div>
564
- <h1>Clawd Cloud</h1>
565
- <div class="subtitle">Cloud infrastructure for autonomous AI</div>
566
- </div>
567
- </div>
568
- <div class="actions">
569
- <a class="button secondary" href="#sandboxes">Refresh</a>
570
- <a class="button primary" href="${escapeHtml(config.sandboxUrl)}">+ New Sandbox</a>
571
- </div>
572
- </div>
573
- <div class="stats">
574
- <div class="stat"><strong>Total Sandboxes</strong><b>3</b><span class="muted">2 running</span></div>
575
- <div class="stat"><strong>Total vCPU</strong><b>8</b><span class="muted">cores allocated</span></div>
576
- <div class="stat"><strong>Total Memory</strong><b>16 GB</b><span class="muted">allocated</span></div>
577
- <div class="stat"><strong>Total Disk</strong><b>180 GB</b><span class="muted">storage</span></div>
578
- </div>
579
- <h2 class="section-title">Spawn Your Automaton</h2>
580
- <div class="console walkthrough">
581
- <div class="step">
582
- <strong>1. Fund your account</strong>
583
- <span class="muted">Pay <code>$${escapeHtml(config.payAmountUsd)}</code> through pay.sh / x402 or use <code>${escapeHtml(config.clawdAmount)} $CLAWD</code> on the community rail.</span>
584
- </div>
585
- <div class="double">
586
- <div class="step">
587
- <strong>2. Create a sandbox</strong>
588
- <span class="muted">Provision a sandbox directly from this dashboard once payment clears.</span>
589
- </div>
590
- <div class="step">
591
- <strong>3. Launch the runtime</strong>
592
- <span class="muted">Pipe the bootstrap script into the sandbox to hatch the automaton.</span>
593
- </div>
594
- </div>
595
- <pre>curl -fsSL https://x402.wtf/api/install/automation | sh</pre>
596
- <div class="step">
597
- <strong>4. Verify / monitor</strong>
598
- <span class="muted">Use the runtime repo and logs to confirm the agent is alive after deploy.</span>
599
- </div>
600
- </div>
601
- </section>
602
-
603
- <section class="page hidden" id="inference" data-page="inference">
604
- <div class="page-header">
605
- <div class="page-title">
606
- <span class="page-icon">⬚</span>
607
- <div>
608
- <h1>Inference</h1>
609
- <div class="subtitle">AI playground powered by Clawd Cloud Inference API</div>
610
- </div>
611
- </div>
612
- <div class="actions">
613
- <a class="button secondary" href="#inference">Refresh</a>
614
- </div>
615
- </div>
616
- <div class="page-grid">
617
- <div class="panel">
618
- <h2 class="panel-title">Session Controls</h2>
619
- <div class="field">
620
- <label for="model">Model</label>
621
- <select id="model">
622
- <option>claude-sonnet-4.5</option>
623
- <option>gpt-4o</option>
624
- <option>gpt-4.1</option>
625
- <option>deepseek-chat</option>
626
- </select>
627
- <div class="hint">$3.9/M in, $19.5/M out</div>
628
- </div>
629
- <div class="field">
630
- <label for="system-prompt">System Prompt</label>
631
- <textarea id="system-prompt">You are a helpful automation operator that routes users into paid inference, sandbox deploys, and agent chat.</textarea>
632
- </div>
633
- <div class="field">
634
- <div class="range-row">
635
- <label for="temperature">Temperature</label>
636
- <span class="muted">1.0</span>
637
- </div>
638
- <input id="temperature" type="range" min="0" max="2" step="0.1" value="1" />
639
- </div>
640
- <div class="field">
641
- <label for="max-tokens">Max Tokens</label>
642
- <input id="max-tokens" type="text" value="4096" />
643
- </div>
644
- <div class="toggle-row">
645
- <div>
646
- <label>Stream</label>
647
- <div class="hint">Keep the public console live while tokens arrive.</div>
648
- </div>
649
- <span class="toggle"></span>
650
- </div>
651
- <div class="inline-actions" style="margin-top:18px;">
652
- <a class="button secondary" href="${escapeHtml(config.inferenceUrl)}">Open Inference Route</a>
653
- <button class="button secondary" type="button">Clear</button>
654
- </div>
655
- </div>
656
- <div class="panel chat-shell">
657
- <div class="chat-stage">
658
- <div>
659
- <div style="font-size:56px; margin-bottom: 10px;">🤖</div>
660
- <div style="font-size:1.5rem; color: rgba(255,255,255,0.5);">Send a message to start a conversation</div>
661
- <div class="muted" style="margin-top:8px;">Public paid access with 13 models available</div>
662
- </div>
663
- </div>
664
- <div class="chat-input">
665
- <input type="text" placeholder="Type a message... (Enter to send, Shift+Enter for newline)" />
666
- <button class="send" type="button">➤</button>
667
- </div>
668
- </div>
669
- </div>
670
- </section>
671
-
672
- <section class="page hidden" id="billing" data-page="billing">
673
- <div class="page-header">
674
- <div class="page-title">
675
- <span class="page-icon">▤</span>
676
- <div>
677
- <h1>Billing</h1>
678
- <div class="subtitle">Manage credits & payments</div>
679
- </div>
680
- </div>
681
- <div class="actions">
682
- <a class="button secondary" href="#billing">Refresh</a>
683
- </div>
684
- </div>
685
- <div class="billing-grid">
686
- <div class="panel balance">
687
- <div class="muted">Credit Balance</div>
688
- <div class="value">$0.00</div>
689
- <div class="muted">0x31e8 ... 99A8</div>
690
- </div>
691
- <div class="panel balance">
692
- <div class="muted">Wallet USDC</div>
693
- <div class="value">$0.00</div>
694
- <div class="muted">${escapeHtml(config.networkLabel)}</div>
695
- </div>
696
- </div>
697
- <div class="billing-grid" style="margin-top: 16px;">
698
- <div class="table">
699
- <h2 class="panel-title">VM Pricing</h2>
700
- <table>
701
- <thead>
702
- <tr><th>Tier</th><th>Resources</th><th>Price</th></tr>
703
- </thead>
704
- <tbody>
705
- <tr><td>Inference starter</td><td>Single paid invocation</td><td>$${escapeHtml(config.payAmountUsd)}</td></tr>
706
- <tr><td>Community holder</td><td>Agent chat or deploy credit</td><td>${escapeHtml(config.clawdAmount)} $CLAWD</td></tr>
707
- <tr><td>Small</td><td>1 vCPU · 512 MB · 5 GB</td><td>$5.00/mo</td></tr>
708
- <tr><td>Medium</td><td>1 vCPU · 1 GB · 10 GB</td><td>$8.00/mo</td></tr>
709
- <tr><td>Large</td><td>2 vCPU · 2 GB · 20 GB</td><td>$15.00/mo</td></tr>
710
- </tbody>
711
- </table>
712
- </div>
713
- <div class="panel">
714
- <h2 class="panel-title">Buy Credits</h2>
715
- <div class="muted">Pay with USDC on Base or settle directly with the $CLAWD holder rail.</div>
716
- <div class="warning-box">Your wallet has 0.00 USDC on Base. Use x402 for the public charge or switch to the community token rail.</div>
717
- <div class="credit-options">
718
- <div class="credit-option">
719
- <strong>x402 / pay.sh</strong>
720
- <div class="muted" style="margin: 8px 0 14px;">Public checkout for inference and API-native customers.</div>
721
- <a class="button primary" href="${escapeHtml(config.x402CheckoutUrl)}">Pay $${escapeHtml(config.payAmountUsd)}</a>
722
- </div>
723
- <div class="credit-option">
724
- <strong>$CLAWD rail</strong>
725
- <div class="muted" style="margin: 8px 0 14px;">Token-settled access for community users.</div>
726
- <a class="button warning" href="${escapeHtml(config.clawdCheckoutUrl)}">Use ${escapeHtml(config.clawdAmount)} $CLAWD</a>
727
- </div>
728
- </div>
729
- <div class="double" style="margin-top: 16px;">
730
- <div>
731
- <div class="muted" style="margin-bottom:8px;">x402 request</div>
732
- <pre id="x402-snippet">${escapeHtml(x402Snippet)}</pre>
733
- </div>
734
- <div>
735
- <div class="muted" style="margin-bottom:8px;">$CLAWD payload</div>
736
- <pre id="clawd-snippet">${escapeHtml(clawdSnippet)}</pre>
737
- </div>
738
- </div>
739
- <div class="inline-actions" style="margin-top: 16px;">
740
- <button class="button secondary copy" type="button" data-copy-target="x402-snippet">Copy x402</button>
741
- <button class="button secondary copy" type="button" data-copy-target="clawd-snippet">Copy $CLAWD</button>
742
- <a class="button secondary" href="${escapeHtml(config.x402CurlUrl)}">pay.sh</a>
743
- </div>
744
- </div>
745
- </div>
746
- </section>
747
-
748
- <section class="page hidden" id="spawn" data-page="spawn">
749
- <div class="page-header">
750
- <div class="page-title">
751
- <span class="page-icon">✦</span>
752
- <div>
753
- <h1>Spawn Automatons</h1>
754
- <div class="subtitle">Public onboarding flow for sovereign runtime deployment</div>
755
- </div>
756
- </div>
757
- <div class="actions">
758
- <a class="button primary" href="${escapeHtml(config.sandboxUrl)}">Create Spawn Sandbox</a>
759
- </div>
760
- </div>
761
- <div class="double">
762
- <div class="panel">
763
- <h2 class="panel-title">Operator flow</h2>
764
- <div class="walkthrough">
765
- <div class="step"><strong>Login first</strong><span class="muted">Route the user through <code>${escapeHtml(config.loginUrl)}</code> before exposing paid actions.</span></div>
766
- <div class="step"><strong>Choose payment rail</strong><span class="muted">Use x402 for programmable checkout or 1,000 $CLAWD for community access.</span></div>
767
- <div class="step"><strong>Redirect into product</strong><span class="muted">After settlement, land the buyer in inference, agent chat, or sandbox creation.</span></div>
768
- </div>
769
- </div>
770
- <div class="console">
771
- <h2 class="panel-title">Bootstrap</h2>
772
- <pre>automation --page
773
- automation --setup
774
- automation --provision
775
- automation --run</pre>
776
- </div>
777
- </div>
778
- </section>
779
-
780
- <section class="page hidden" id="keys" data-page="keys">
781
- <div class="page-header">
782
- <div class="page-title">
783
- <span class="page-icon">⌘</span>
784
- <div>
785
- <h1>API Keys</h1>
786
- <div class="subtitle">Route paid buyers into the correct action endpoints</div>
787
- </div>
788
- </div>
789
- <div class="actions">
790
- <a class="button primary" href="${escapeHtml(config.loginUrl)}">Generate Session</a>
791
- </div>
792
- </div>
793
- <div class="api-list">
794
- <div class="api-key">
795
- <div>
796
- <strong>Inference route</strong>
797
- <div class="muted"><code>${escapeHtml(config.inferenceUrl)}</code></div>
798
- </div>
799
- <button class="button secondary copy" type="button" data-copy-text="${escapeHtml(config.inferenceUrl)}">Copy URL</button>
800
- </div>
801
- <div class="api-key">
802
- <div>
803
- <strong>Sandbox route</strong>
804
- <div class="muted"><code>${escapeHtml(config.sandboxUrl)}</code></div>
805
- </div>
806
- <button class="button secondary copy" type="button" data-copy-text="${escapeHtml(config.sandboxUrl)}">Copy URL</button>
807
- </div>
808
- <div class="api-key">
809
- <div>
810
- <strong>Agent chat route</strong>
811
- <div class="muted"><code>${escapeHtml(config.agentChatUrl)}</code></div>
812
- </div>
813
- <button class="button secondary copy" type="button" data-copy-text="${escapeHtml(config.agentChatUrl)}">Copy URL</button>
814
- </div>
815
- <div class="api-key">
816
- <div>
817
- <strong>Login route</strong>
818
- <div class="muted"><code>${escapeHtml(config.loginUrl)}</code></div>
819
- </div>
820
- <button class="button secondary copy" type="button" data-copy-text="${escapeHtml(config.loginUrl)}">Copy URL</button>
821
- </div>
822
- </div>
823
- </section>
824
- </main>
825
- </section>
826
- </div>
827
- <script>
828
- const links = Array.from(document.querySelectorAll("[data-nav-target]"));
829
- const pages = Array.from(document.querySelectorAll("[data-page]"));
830
- function activatePage(pageId) {
831
- for (const page of pages) {
832
- page.classList.toggle("hidden", page.getAttribute("data-page") !== pageId);
833
- }
834
- for (const link of links) {
835
- link.classList.toggle("active", link.getAttribute("data-nav-target") === pageId);
836
- }
837
- }
838
- function syncPageFromHash() {
839
- const pageId = (window.location.hash || "#sandboxes").replace("#", "");
840
- const matched = pages.some((page) => page.getAttribute("data-page") === pageId);
841
- activatePage(matched ? pageId : "sandboxes");
842
- }
843
- window.addEventListener("hashchange", syncPageFromHash);
844
- syncPageFromHash();
845
-
846
- for (const button of document.querySelectorAll("[data-copy-target]")) {
847
- button.addEventListener("click", async () => {
848
- const targetId = button.getAttribute("data-copy-target");
849
- const el = targetId ? document.getElementById(targetId) : null;
850
- if (!el) return;
851
- const text = el.textContent || "";
852
- try {
853
- await navigator.clipboard.writeText(text);
854
- const original = button.textContent;
855
- button.textContent = "Copied";
856
- setTimeout(() => { button.textContent = original; }, 1200);
857
- } catch {
858
- button.textContent = "Copy failed";
859
- }
860
- });
861
- }
862
- for (const button of document.querySelectorAll("[data-copy-text]")) {
863
- button.addEventListener("click", async () => {
864
- const text = button.getAttribute("data-copy-text") || "";
865
- try {
866
- await navigator.clipboard.writeText(text);
867
- const original = button.textContent;
868
- button.textContent = "Copied";
869
- setTimeout(() => { button.textContent = original; }, 1200);
870
- } catch {
871
- button.textContent = "Copy failed";
872
- }
873
- });
874
- }
875
- </script>
876
- </body>
877
- </html>`;
878
- }
879
- function renderManifest(config) {
880
- return {
881
- generatedAt: new Date().toISOString(),
882
- appName: config.appName,
883
- publicBaseUrl: config.publicBaseUrl,
884
- lanes: [
885
- {
886
- id: "inference",
887
- label: "Inference Access",
888
- href: config.inferenceUrl,
889
- paymentRail: "x402_or_clawd",
890
- },
891
- {
892
- id: "sandbox",
893
- label: "Deploy Sandbox",
894
- href: config.sandboxUrl,
895
- paymentRail: "x402_or_clawd",
896
- },
897
- {
898
- id: "agent-chat",
899
- label: "Chat With an Agent",
900
- href: config.agentChatUrl,
901
- paymentRail: "x402_or_clawd",
902
- },
903
- ],
904
- payments: {
905
- x402: {
906
- amountUsd: config.payAmountUsd,
907
- checkoutUrl: config.x402CheckoutUrl,
908
- },
909
- clawd: {
910
- amount: config.clawdAmount,
911
- checkoutUrl: config.clawdCheckoutUrl,
912
- },
913
- },
914
- };
915
- }
916
- export function generatePortal(outputDir = DEFAULT_OUTPUT_DIR) {
917
- const config = resolvePortalConfig();
918
- fs.mkdirSync(outputDir, { recursive: true });
919
- fs.writeFileSync(path.join(outputDir, "index.html"), renderPortalHtml(config), "utf8");
920
- fs.writeFileSync(path.join(outputDir, "manifest.json"), JSON.stringify(renderManifest(config), null, 2), "utf8");
921
- return {
922
- outputDir,
923
- files: [
924
- path.join(outputDir, "index.html"),
925
- path.join(outputDir, "manifest.json"),
926
- ],
927
- };
928
- }
929
- function isDirectRun() {
930
- return process.argv[1] && import.meta.url === new URL(`file://${process.argv[1]}`).href;
931
- }
932
- if (isDirectRun()) {
933
- const args = process.argv.slice(2);
934
- const outputArg = args.find((arg) => !arg.startsWith("--"));
935
- if (args.includes("--write")) {
936
- const result = generatePortal(outputArg ? path.resolve(outputArg) : DEFAULT_OUTPUT_DIR);
937
- console.log(JSON.stringify(result, null, 2));
938
- }
939
- }
940
- //# sourceMappingURL=generate.js.map