@conversionpros/aiva 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +148 -0
  2. package/auto-deploy.js +190 -0
  3. package/bin/aiva.js +81 -0
  4. package/cli-sync.js +126 -0
  5. package/d2a-prompt-template.txt +106 -0
  6. package/diagnostics-api.js +304 -0
  7. package/docs/ara-dedup-fix-scope.md +112 -0
  8. package/docs/ara-fix-round2-scope.md +61 -0
  9. package/docs/ara-greeting-fix-scope.md +70 -0
  10. package/docs/calendar-date-fix-scope.md +28 -0
  11. package/docs/getting-started.md +115 -0
  12. package/docs/network-architecture-rollout-scope.md +43 -0
  13. package/docs/scope-google-oauth-integration.md +351 -0
  14. package/docs/settings-page-scope.md +50 -0
  15. package/docs/xai-imagine-scope.md +116 -0
  16. package/docs/xai-voice-integration-scope.md +115 -0
  17. package/docs/xai-voice-tools-scope.md +165 -0
  18. package/email-router.js +512 -0
  19. package/follow-up-handler.js +606 -0
  20. package/gateway-monitor.js +158 -0
  21. package/google-email.js +379 -0
  22. package/google-oauth.js +310 -0
  23. package/grok-imagine.js +97 -0
  24. package/health-reporter.js +287 -0
  25. package/invisible-prefix-base.txt +206 -0
  26. package/invisible-prefix-owner.txt +26 -0
  27. package/invisible-prefix-slim.txt +10 -0
  28. package/invisible-prefix.txt +43 -0
  29. package/knowledge-base.js +472 -0
  30. package/lib/cli.js +19 -0
  31. package/lib/config.js +124 -0
  32. package/lib/health.js +57 -0
  33. package/lib/process.js +207 -0
  34. package/lib/server.js +42 -0
  35. package/lib/setup.js +472 -0
  36. package/meta-capi.js +206 -0
  37. package/meta-leads.js +411 -0
  38. package/notion-oauth.js +323 -0
  39. package/package.json +61 -0
  40. package/public/agent-config.html +241 -0
  41. package/public/aiva-avatar-anime.png +0 -0
  42. package/public/css/docs.css.bak +688 -0
  43. package/public/css/onboarding.css +543 -0
  44. package/public/diagrams/claude-subscription-pool.html +329 -0
  45. package/public/diagrams/claude-subscription-pool.png +0 -0
  46. package/public/docs-icon.png +0 -0
  47. package/public/escalation.html +237 -0
  48. package/public/group-config.html +300 -0
  49. package/public/icon-192.png +0 -0
  50. package/public/icon-512.png +0 -0
  51. package/public/icons/agents.svg +1 -0
  52. package/public/icons/attach.svg +1 -0
  53. package/public/icons/characters.svg +1 -0
  54. package/public/icons/chat.svg +1 -0
  55. package/public/icons/docs.svg +1 -0
  56. package/public/icons/heartbeat.svg +1 -0
  57. package/public/icons/messages.svg +1 -0
  58. package/public/icons/mic.svg +1 -0
  59. package/public/icons/notes.svg +1 -0
  60. package/public/icons/settings.svg +1 -0
  61. package/public/icons/tasks.svg +1 -0
  62. package/public/images/onboarding/p0-communication-layer.png +0 -0
  63. package/public/images/onboarding/p0-infinite-surface.png +0 -0
  64. package/public/images/onboarding/p0-learning-model.png +0 -0
  65. package/public/images/onboarding/p0-meet-aiva.png +0 -0
  66. package/public/images/onboarding/p4-contact-intelligence.png +0 -0
  67. package/public/images/onboarding/p4-context-compounds.png +0 -0
  68. package/public/images/onboarding/p4-message-router.png +0 -0
  69. package/public/images/onboarding/p4-per-contact-rules.png +0 -0
  70. package/public/images/onboarding/p4-send-messages.png +0 -0
  71. package/public/images/onboarding/p6-be-precise.png +0 -0
  72. package/public/images/onboarding/p6-review-escalations.png +0 -0
  73. package/public/images/onboarding/p6-voice-input.png +0 -0
  74. package/public/images/onboarding/p7-completion.png +0 -0
  75. package/public/index.html +11594 -0
  76. package/public/js/onboarding.js +699 -0
  77. package/public/manifest.json +24 -0
  78. package/public/messages-v2.html +2824 -0
  79. package/public/permission-approve.html.bak +107 -0
  80. package/public/permissions.html +150 -0
  81. package/public/styles/design-system.css +68 -0
  82. package/router-db.js +604 -0
  83. package/router-utils.js +28 -0
  84. package/router-v2/adapters/imessage.js +191 -0
  85. package/router-v2/adapters/quo.js +82 -0
  86. package/router-v2/adapters/whatsapp.js +192 -0
  87. package/router-v2/contact-manager.js +234 -0
  88. package/router-v2/conversation-engine.js +498 -0
  89. package/router-v2/data/knowledge-base.json +176 -0
  90. package/router-v2/data/router-v2.db +0 -0
  91. package/router-v2/data/router-v2.db-shm +0 -0
  92. package/router-v2/data/router-v2.db-wal +0 -0
  93. package/router-v2/data/router.db +0 -0
  94. package/router-v2/db.js +457 -0
  95. package/router-v2/escalation-bridge.js +540 -0
  96. package/router-v2/follow-up-engine.js +347 -0
  97. package/router-v2/index.js +441 -0
  98. package/router-v2/ingestion.js +213 -0
  99. package/router-v2/knowledge-base.js +231 -0
  100. package/router-v2/lead-qualifier.js +152 -0
  101. package/router-v2/learning-loop.js +202 -0
  102. package/router-v2/outbound-sender.js +160 -0
  103. package/router-v2/package.json +13 -0
  104. package/router-v2/permission-gate.js +86 -0
  105. package/router-v2/playbook.js +177 -0
  106. package/router-v2/prompts/base.js +52 -0
  107. package/router-v2/prompts/first-contact.js +38 -0
  108. package/router-v2/prompts/lead-qualification.js +37 -0
  109. package/router-v2/prompts/scheduling.js +72 -0
  110. package/router-v2/prompts/style-overrides.js +22 -0
  111. package/router-v2/scheduler.js +301 -0
  112. package/router-v2/scripts/migrate-v1-to-v2.js +215 -0
  113. package/router-v2/scripts/seed-faq.js +67 -0
  114. package/router-v2/seed-knowledge-base.js +39 -0
  115. package/router-v2/utils/ai.js +129 -0
  116. package/router-v2/utils/phone.js +52 -0
  117. package/router-v2/utils/response-validator.js +98 -0
  118. package/router-v2/utils/sanitize.js +222 -0
  119. package/router.js +5005 -0
  120. package/routes/google-calendar.js +186 -0
  121. package/scripts/deploy.sh +62 -0
  122. package/scripts/macos-calendar.sh +232 -0
  123. package/scripts/onboard-device.sh +466 -0
  124. package/server.js +5131 -0
  125. package/start.sh +24 -0
  126. package/templates/AGENTS.md +548 -0
  127. package/templates/IDENTITY.md +15 -0
  128. package/templates/docs-agents.html +132 -0
  129. package/templates/docs-app.html +130 -0
  130. package/templates/docs-home.html +83 -0
  131. package/templates/docs-imessage.html +121 -0
  132. package/templates/docs-tasks.html +123 -0
  133. package/templates/docs-tips.html +175 -0
  134. package/templates/getting-started.html +809 -0
  135. package/templates/invisible-prefix-base.txt +171 -0
  136. package/templates/invisible-prefix-owner.txt +282 -0
  137. package/templates/invisible-prefix.txt +338 -0
  138. package/templates/manifest.json +61 -0
  139. package/templates/memory-org/clients.md +7 -0
  140. package/templates/memory-org/credentials.md +9 -0
  141. package/templates/memory-org/devices.md +7 -0
  142. package/templates/updates.html +464 -0
  143. package/templates/workspace/AGENTS.md.tmpl +161 -0
  144. package/templates/workspace/HEARTBEAT.md.tmpl +17 -0
  145. package/templates/workspace/IDENTITY.md.tmpl +15 -0
  146. package/templates/workspace/MEMORY.md.tmpl +16 -0
  147. package/templates/workspace/SOUL.md.tmpl +51 -0
  148. package/templates/workspace/USER.md.tmpl +25 -0
  149. package/tts-proxy.js +96 -0
  150. package/voice-call-local.js +731 -0
  151. package/voice-call.js +732 -0
  152. package/wa-listener.js +354 -0
@@ -0,0 +1,543 @@
1
+ /* AIVA Onboarding Tutorial */
2
+
3
+ .onboarding-overlay {
4
+ position: fixed;
5
+ inset: 0;
6
+ z-index: 999990 !important;
7
+ background: rgba(5, 5, 20, 0.93);
8
+ display: flex;
9
+ flex-direction: column;
10
+ align-items: center;
11
+ justify-content: center;
12
+ opacity: 0;
13
+ transition: opacity 0.4s ease;
14
+ overflow: hidden;
15
+ }
16
+ .onboarding-overlay.visible { opacity: 1; }
17
+ .onboarding-overlay.hidden { display: none; }
18
+
19
+ /* Progress Bar */
20
+ .onboarding-progress {
21
+ position: fixed;
22
+ top: 0;
23
+ left: 0;
24
+ right: 0;
25
+ z-index: 999995 !important;
26
+ padding: 12px 20px 8px;
27
+ background: rgba(15, 15, 35, 0.95);
28
+ backdrop-filter: blur(12px);
29
+ }
30
+ .onboarding-progress-label {
31
+ display: flex;
32
+ justify-content: space-between;
33
+ align-items: center;
34
+ margin-bottom: 6px;
35
+ }
36
+ .onboarding-progress-phase {
37
+ font-size: 0.7rem;
38
+ font-weight: 600;
39
+ text-transform: uppercase;
40
+ letter-spacing: 0.08em;
41
+ color: #94a3b8;
42
+ }
43
+ .onboarding-progress-step {
44
+ font-size: 0.7rem;
45
+ color: #64748b;
46
+ }
47
+ .onboarding-progress-bar {
48
+ height: 3px;
49
+ background: rgba(255,255,255,0.08);
50
+ border-radius: 2px;
51
+ overflow: hidden;
52
+ }
53
+ .onboarding-progress-fill {
54
+ height: 100%;
55
+ background: linear-gradient(135deg, #6c63ff, #ec4899);
56
+ border-radius: 2px;
57
+ transition: width 0.5s ease;
58
+ width: 0%;
59
+ max-width: 100%;
60
+ }
61
+
62
+ /* Skip button (replay mode only) */
63
+ .onboarding-skip {
64
+ position: fixed;
65
+ top: 12px;
66
+ right: 16px;
67
+ z-index: 999996 !important;
68
+ background: rgba(255,255,255,0.08);
69
+ border: 1px solid rgba(255,255,255,0.12);
70
+ color: #94a3b8;
71
+ padding: 6px 16px;
72
+ border-radius: 20px;
73
+ font-size: 0.8rem;
74
+ cursor: pointer;
75
+ transition: all 0.2s;
76
+ }
77
+ .onboarding-skip:hover {
78
+ background: rgba(255,255,255,0.15);
79
+ color: #f1f5f9;
80
+ }
81
+
82
+ /* Educational Screen (full-screen card) */
83
+ .onboarding-screen {
84
+ position: absolute;
85
+ inset: 0;
86
+ display: flex;
87
+ flex-direction: column;
88
+ align-items: center;
89
+ justify-content: center;
90
+ padding: 80px 24px 160px;
91
+ overflow-y: auto;
92
+ -webkit-overflow-scrolling: touch;
93
+ opacity: 0;
94
+ transform: translateX(40px);
95
+ transition: opacity 0.4s ease, transform 0.4s ease;
96
+ pointer-events: none;
97
+ }
98
+ .onboarding-screen.active {
99
+ opacity: 1;
100
+ transform: translateX(0);
101
+ pointer-events: auto;
102
+ }
103
+ .onboarding-screen.exit-left {
104
+ opacity: 0;
105
+ transform: translateX(-40px);
106
+ }
107
+
108
+ .onboarding-icon {
109
+ width: 100px;
110
+ height: 100px;
111
+ border-radius: 28px;
112
+ display: flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ font-size: 3rem;
116
+ margin-bottom: 32px;
117
+ flex-shrink: 0;
118
+ color: rgba(255,255,255,0.9);
119
+ }
120
+ .onboarding-icon svg {
121
+ filter: drop-shadow(0 0 8px currentColor);
122
+ }
123
+ .onboarding-icon.purple svg { color: #818cf8; filter: drop-shadow(0 0 12px rgba(129,140,248,0.5)); }
124
+ .onboarding-icon.pink svg { color: #f472b6; filter: drop-shadow(0 0 12px rgba(244,114,182,0.5)); }
125
+ .onboarding-icon.blue svg { color: #60a5fa; filter: drop-shadow(0 0 12px rgba(96,165,250,0.5)); }
126
+ .onboarding-icon.green svg { color: #34d399; filter: drop-shadow(0 0 12px rgba(52,211,153,0.5)); }
127
+
128
+ /* SVG icon in feature cards */
129
+ .ob-svg-icon { color: #94a3b8; }
130
+ .onboarding-feature-icon .ob-svg-icon { color: #818cf8; }
131
+
132
+ /* SVG checkmark animation */
133
+ @keyframes svgDraw {
134
+ to { stroke-dashoffset: 0; }
135
+ }
136
+ .onboarding-complete-check svg { color: white; }
137
+
138
+ /* Pull-quote on completion */
139
+ .onboarding-pullquote {
140
+ font-size: 0.95rem;
141
+ font-style: italic;
142
+ color: #94a3b8;
143
+ text-align: center;
144
+ max-width: 360px;
145
+ margin-top: 24px;
146
+ padding: 16px 20px;
147
+ border-left: 2px solid rgba(99,102,241,0.4);
148
+ line-height: 1.5;
149
+ }
150
+
151
+ /* Interactive guide step indicator */
152
+ .onboarding-guide-step-indicator {
153
+ display: flex;
154
+ align-items: center;
155
+ gap: 0;
156
+ margin-bottom: 28px;
157
+ }
158
+ .guide-dot {
159
+ width: 10px;
160
+ height: 10px;
161
+ border-radius: 50%;
162
+ background: rgba(255,255,255,0.12);
163
+ border: 1.5px solid rgba(255,255,255,0.2);
164
+ transition: all 0.3s ease;
165
+ flex-shrink: 0;
166
+ }
167
+ .guide-dot.active {
168
+ background: #6c63ff;
169
+ border-color: #6c63ff;
170
+ box-shadow: 0 0 12px rgba(108,99,255,0.5);
171
+ transform: scale(1.2);
172
+ }
173
+ .guide-dot.completed {
174
+ background: #10b981;
175
+ border-color: #10b981;
176
+ }
177
+ .guide-dot-line {
178
+ width: 24px;
179
+ height: 1.5px;
180
+ background: rgba(255,255,255,0.1);
181
+ flex-shrink: 0;
182
+ }
183
+ .onboarding-icon.purple { background: rgba(99,102,241,0.15); }
184
+ .onboarding-icon.pink { background: rgba(236,72,153,0.15); }
185
+ .onboarding-icon.green { background: rgba(16,185,129,0.15); }
186
+ .onboarding-icon.amber { background: rgba(245,158,11,0.15); }
187
+ .onboarding-icon.blue { background: rgba(59,130,246,0.15); }
188
+
189
+ .onboarding-title {
190
+ font-size: 1.75rem;
191
+ font-weight: 700;
192
+ text-align: center;
193
+ margin-bottom: 12px;
194
+ color: #f1f5f9;
195
+ line-height: 1.2;
196
+ }
197
+
198
+ .onboarding-subtitle {
199
+ font-size: 1rem;
200
+ color: #94a3b8;
201
+ text-align: center;
202
+ max-width: 380px;
203
+ line-height: 1.6;
204
+ margin-bottom: 8px;
205
+ }
206
+
207
+ .onboarding-detail {
208
+ font-size: 0.85rem;
209
+ color: #64748b;
210
+ text-align: center;
211
+ max-width: 360px;
212
+ line-height: 1.5;
213
+ margin-top: 16px;
214
+ }
215
+
216
+ .onboarding-features {
217
+ display: flex;
218
+ flex-direction: column;
219
+ gap: 12px;
220
+ margin-top: 24px;
221
+ width: 100%;
222
+ max-width: 380px;
223
+ }
224
+
225
+ .onboarding-feature {
226
+ display: flex;
227
+ align-items: flex-start;
228
+ gap: 12px;
229
+ background: rgba(255,255,255,0.06);
230
+ border: 1px solid rgba(255,255,255,0.10);
231
+ border-radius: 12px;
232
+ padding: 14px 16px;
233
+ backdrop-filter: blur(4px);
234
+ }
235
+ .onboarding-feature-icon {
236
+ font-size: 1.25rem;
237
+ flex-shrink: 0;
238
+ width: 28px;
239
+ text-align: center;
240
+ }
241
+ .onboarding-feature-text {
242
+ font-size: 0.875rem;
243
+ color: #cbd5e1;
244
+ line-height: 1.4;
245
+ }
246
+ .onboarding-feature-text strong {
247
+ color: #f1f5f9;
248
+ }
249
+
250
+ /* Navigation Buttons */
251
+ .onboarding-nav {
252
+ position: fixed;
253
+ bottom: 0;
254
+ left: 0;
255
+ right: 0;
256
+ z-index: 999995 !important;
257
+ display: flex;
258
+ gap: 12px;
259
+ padding: 20px 24px;
260
+ padding-bottom: max(20px, env(safe-area-inset-bottom));
261
+ background: linear-gradient(to top, rgba(5,5,20,0.98) 60%, transparent);
262
+ }
263
+ .onboarding-btn {
264
+ flex: 1;
265
+ padding: 16px;
266
+ border-radius: 14px;
267
+ border: none;
268
+ font-weight: 600;
269
+ font-size: 1rem;
270
+ cursor: pointer;
271
+ transition: all 0.2s;
272
+ }
273
+ .onboarding-btn-back {
274
+ background: rgba(255,255,255,0.06);
275
+ color: #94a3b8;
276
+ border: 1px solid rgba(255,255,255,0.1);
277
+ max-width: 120px;
278
+ }
279
+ .onboarding-btn-back:hover { background: rgba(255,255,255,0.1); color: #f1f5f9; }
280
+ .onboarding-btn-next {
281
+ background: linear-gradient(135deg, #6c63ff, #ec4899);
282
+ color: white;
283
+ box-shadow: 0 4px 20px rgba(99,102,241,0.3);
284
+ }
285
+ .onboarding-btn-next:hover {
286
+ transform: translateY(-1px);
287
+ box-shadow: 0 6px 24px rgba(99,102,241,0.4);
288
+ }
289
+
290
+ /* Tooltip Mode */
291
+ .onboarding-tooltip-backdrop {
292
+ position: fixed;
293
+ inset: 0;
294
+ z-index: 999990 !important;
295
+ background: rgba(5,5,20,0.92);
296
+ pointer-events: auto;
297
+ }
298
+
299
+ .onboarding-highlight {
300
+ position: fixed;
301
+ z-index: 999992 !important;
302
+ box-shadow: 0 0 0 4px rgba(99,102,241,0.5);
303
+ border-radius: 12px;
304
+ transition: all 0.4s ease;
305
+ pointer-events: none;
306
+ animation: onboardingPulse 2s ease-in-out infinite;
307
+ }
308
+ @keyframes onboardingPulse {
309
+ 0%, 100% { box-shadow: 0 0 0 4px rgba(99,102,241,0.5); }
310
+ 50% { box-shadow: 0 0 0 4px rgba(99,102,241,0.5), 0 0 20px 4px rgba(99,102,241,0.3); }
311
+ }
312
+
313
+ /* Force highlighted elements to be visible */
314
+ .onboarding-highlighted,
315
+ .onboarding-highlighted * {
316
+ color: #fff !important;
317
+ opacity: 1 !important;
318
+ visibility: visible !important;
319
+ }
320
+ .onboarding-highlighted {
321
+ position: relative;
322
+ z-index: 999992 !important;
323
+ }
324
+
325
+ .onboarding-tooltip {
326
+ position: fixed;
327
+ z-index: 999995 !important;
328
+ background: #1e1e3a;
329
+ border: 1px solid rgba(99,102,241,0.3);
330
+ border-radius: 16px;
331
+ padding: 24px 20px 20px;
332
+ max-width: 320px;
333
+ width: calc(100vw - 48px);
334
+ box-shadow: 0 8px 32px rgba(0,0,0,0.5);
335
+ animation: tooltipIn 0.3s ease;
336
+ }
337
+ @keyframes tooltipIn {
338
+ from { opacity: 0; transform: translateY(8px); }
339
+ to { opacity: 1; transform: translateY(0); }
340
+ }
341
+ .onboarding-tooltip-title {
342
+ font-size: 1rem;
343
+ font-weight: 600;
344
+ color: #f1f5f9;
345
+ margin-bottom: 6px;
346
+ }
347
+ .onboarding-tooltip-text {
348
+ font-size: 0.85rem;
349
+ color: #94a3b8;
350
+ line-height: 1.5;
351
+ }
352
+ .onboarding-tooltip-nav {
353
+ display: flex;
354
+ gap: 8px;
355
+ margin-top: 16px;
356
+ }
357
+ .onboarding-tooltip-nav .onboarding-btn {
358
+ padding: 10px 16px;
359
+ font-size: 0.85rem;
360
+ }
361
+
362
+ /* Completion Screen */
363
+ .onboarding-complete-check {
364
+ width: 100px;
365
+ height: 100px;
366
+ border-radius: 50%;
367
+ background: linear-gradient(135deg, #10b981, #059669);
368
+ display: flex;
369
+ align-items: center;
370
+ justify-content: center;
371
+ font-size: 3rem;
372
+ margin-bottom: 28px;
373
+ box-shadow: 0 8px 32px rgba(16,185,129,0.3);
374
+ }
375
+
376
+ .onboarding-summary {
377
+ display: flex;
378
+ flex-wrap: wrap;
379
+ gap: 10px;
380
+ justify-content: center;
381
+ margin-top: 20px;
382
+ max-width: 380px;
383
+ }
384
+ .onboarding-summary-item {
385
+ display: flex;
386
+ align-items: center;
387
+ gap: 6px;
388
+ background: rgba(255,255,255,0.04);
389
+ border: 1px solid rgba(255,255,255,0.08);
390
+ border-radius: 20px;
391
+ padding: 6px 14px;
392
+ font-size: 0.8rem;
393
+ color: #cbd5e1;
394
+ }
395
+
396
+ /* Ensure overlay covers sidebar on desktop */
397
+ .onboarding-overlay,
398
+ .onboarding-tooltip-backdrop {
399
+ left: 0 !important;
400
+ width: 100vw !important;
401
+ }
402
+
403
+ /* Hide progress bar gradient bleed in tooltip mode */
404
+ .onboarding-overlay[style*="transparent"] .onboarding-progress-fill {
405
+ box-shadow: none;
406
+ }
407
+ .onboarding-overlay[style*="transparent"] .onboarding-progress {
408
+ border-right: none;
409
+ box-shadow: none;
410
+ }
411
+
412
+ /* Mobile-friendly tooltip sizing (JS handles all positioning) */
413
+ .onboarding-tooltip {
414
+ max-height: 50vh;
415
+ overflow-y: auto;
416
+ -webkit-overflow-scrolling: touch;
417
+ box-sizing: border-box;
418
+ }
419
+
420
+ @media (max-width: 768px) {
421
+ .onboarding-tooltip-nav .onboarding-btn {
422
+ min-height: 44px;
423
+ font-size: 0.9rem;
424
+ -webkit-tap-highlight-color: transparent;
425
+ }
426
+ }
427
+
428
+ /* Responsive */
429
+ @media (max-width: 400px) {
430
+ .onboarding-title { font-size: 1.4rem; }
431
+ .onboarding-icon { width: 80px; height: 80px; font-size: 2.5rem; border-radius: 22px; }
432
+ .onboarding-screen { padding: 70px 20px 150px; }
433
+ }
434
+
435
+ /* ═══ Animated SVG Illustrations ═══ */
436
+
437
+ .onboarding-anim-container {
438
+ width: 140px;
439
+ height: 120px;
440
+ margin-bottom: 16px;
441
+ display: flex;
442
+ align-items: center;
443
+ justify-content: center;
444
+ flex-shrink: 0;
445
+ overflow: hidden;
446
+ position: relative;
447
+ }
448
+ .onboarding-anim-container svg {
449
+ width: 100%;
450
+ height: 100%;
451
+ max-width: 140px;
452
+ max-height: 120px;
453
+ }
454
+
455
+ /* Neural network / constellation */
456
+ @keyframes obNodePulse {
457
+ 0%, 100% { r: 3; opacity: 0.7; }
458
+ 50% { r: 4.5; opacity: 1; }
459
+ }
460
+ @keyframes obNodePulse2 {
461
+ 0%, 100% { r: 2.5; opacity: 0.5; }
462
+ 50% { r: 4; opacity: 0.9; }
463
+ }
464
+ @keyframes obLineDraw {
465
+ 0% { stroke-dashoffset: 100; }
466
+ 100% { stroke-dashoffset: 0; }
467
+ }
468
+ @keyframes obLineFlow {
469
+ 0% { stroke-dashoffset: 20; }
470
+ 100% { stroke-dashoffset: 0; }
471
+ }
472
+ @keyframes obGlowPulse {
473
+ 0%, 100% { opacity: 0.15; }
474
+ 50% { opacity: 0.4; }
475
+ }
476
+ @keyframes obFloat {
477
+ 0%, 100% { transform: translateY(0); }
478
+ 50% { transform: translateY(-6px); }
479
+ }
480
+
481
+ /* Message path particles */
482
+ @keyframes obParticleFlow {
483
+ 0% { offset-distance: 0%; opacity: 0; }
484
+ 10% { opacity: 1; }
485
+ 90% { opacity: 1; }
486
+ 100% { offset-distance: 100%; opacity: 0; }
487
+ }
488
+ @keyframes obParticleFlow2 {
489
+ 0% { offset-distance: 0%; opacity: 0; }
490
+ 15% { opacity: 0.8; }
491
+ 85% { opacity: 0.8; }
492
+ 100% { offset-distance: 100%; opacity: 0; }
493
+ }
494
+
495
+ /* Pipeline flow */
496
+ @keyframes obPipeMove {
497
+ 0% { transform: translateX(-30px); opacity: 0; }
498
+ 20% { opacity: 1; }
499
+ 80% { opacity: 1; }
500
+ 100% { transform: translateX(30px); opacity: 0; }
501
+ }
502
+ @keyframes obPipeMove2 {
503
+ 0% { transform: translateX(-20px); opacity: 0; }
504
+ 25% { opacity: 0.8; }
505
+ 75% { opacity: 0.8; }
506
+ 100% { transform: translateX(20px); opacity: 0; }
507
+ }
508
+
509
+ /* Power-up rings */
510
+ @keyframes obRingExpand {
511
+ 0% { r: 8; opacity: 0.6; stroke-width: 2; }
512
+ 100% { r: 50; opacity: 0; stroke-width: 0.5; }
513
+ }
514
+ @keyframes obRingExpand2 {
515
+ 0% { r: 6; opacity: 0.5; stroke-width: 1.5; }
516
+ 100% { r: 45; opacity: 0; stroke-width: 0.3; }
517
+ }
518
+ @keyframes obEnergyPulse {
519
+ 0%, 100% { opacity: 0.4; transform: scale(1); }
520
+ 50% { opacity: 1; transform: scale(1.15); }
521
+ }
522
+
523
+ /* Completion checkmark draw */
524
+ @keyframes obCheckDraw {
525
+ 0% { stroke-dashoffset: 200; }
526
+ 100% { stroke-dashoffset: 0; }
527
+ }
528
+ @keyframes obRingsDraw {
529
+ 0% { stroke-dashoffset: 220; opacity: 0.8; }
530
+ 100% { stroke-dashoffset: 0; opacity: 0.3; }
531
+ }
532
+ @keyframes obConfetti {
533
+ 0% { transform: translateY(0) rotate(0deg); opacity: 1; }
534
+ 100% { transform: translateY(-40px) rotate(180deg); opacity: 0; }
535
+ }
536
+ @keyframes obConfettiDown {
537
+ 0% { transform: translateY(0) rotate(0deg); opacity: 1; }
538
+ 100% { transform: translateY(30px) rotate(-120deg); opacity: 0; }
539
+ }
540
+
541
+ /* Shared glow filter pulse */
542
+ .ob-anim-glow { animation: obGlowPulse 3s ease-in-out infinite; }
543
+ .ob-anim-float { animation: obFloat 4s ease-in-out infinite; }