vellum 0.2.13 → 0.3.2

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 (1019) hide show
  1. package/bin/vellum.js +2 -0
  2. package/package.json +6 -65
  3. package/.dockerignore +0 -27
  4. package/.env.example +0 -22
  5. package/Dockerfile +0 -99
  6. package/Dockerfile.sandbox +0 -5
  7. package/README.md +0 -169
  8. package/bun.lock +0 -1743
  9. package/bunfig.toml +0 -2
  10. package/docs/skills.md +0 -158
  11. package/drizzle/0000_dizzy_maggott.sql +0 -301
  12. package/drizzle/meta/0000_snapshot.json +0 -1999
  13. package/drizzle/meta/_journal.json +0 -13
  14. package/drizzle.config.ts +0 -7
  15. package/eslint.config.mjs +0 -17
  16. package/hook-templates/debug-prompt-logger/hook.json +0 -7
  17. package/hook-templates/debug-prompt-logger/run.sh +0 -68
  18. package/knip.json +0 -9
  19. package/scripts/capture-x-graphql.ts +0 -545
  20. package/scripts/ipc/check-contract-inventory.ts +0 -104
  21. package/scripts/ipc/check-swift-decoder-drift.ts +0 -164
  22. package/scripts/ipc/generate-swift.ts +0 -492
  23. package/scripts/test-filesystem-tools.sh +0 -48
  24. package/scripts/test.sh +0 -127
  25. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -2316
  26. package/src/__tests__/account-registry.test.ts +0 -245
  27. package/src/__tests__/active-skill-tools.test.ts +0 -378
  28. package/src/__tests__/agent-heartbeat-service.test.ts +0 -250
  29. package/src/__tests__/agent-loop-thinking.test.ts +0 -81
  30. package/src/__tests__/agent-loop.test.ts +0 -1135
  31. package/src/__tests__/anthropic-provider.test.ts +0 -778
  32. package/src/__tests__/app-builder-tool-scripts.test.ts +0 -290
  33. package/src/__tests__/app-bundler.test.ts +0 -292
  34. package/src/__tests__/app-executors.test.ts +0 -613
  35. package/src/__tests__/app-open-proxy.test.ts +0 -62
  36. package/src/__tests__/asset-materialize-tool.test.ts +0 -452
  37. package/src/__tests__/asset-search-tool.test.ts +0 -477
  38. package/src/__tests__/assistant-attachment-directive.test.ts +0 -401
  39. package/src/__tests__/assistant-attachments.test.ts +0 -437
  40. package/src/__tests__/assistant-event-hub.test.ts +0 -226
  41. package/src/__tests__/assistant-event.test.ts +0 -123
  42. package/src/__tests__/attachments-store.test.ts +0 -476
  43. package/src/__tests__/attachments.test.ts +0 -134
  44. package/src/__tests__/audit-log-rotation.test.ts +0 -154
  45. package/src/__tests__/browser-fill-credential.test.ts +0 -309
  46. package/src/__tests__/browser-manager.test.ts +0 -203
  47. package/src/__tests__/browser-runtime-check.test.ts +0 -55
  48. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +0 -68
  49. package/src/__tests__/browser-skill-endstate.test.ts +0 -195
  50. package/src/__tests__/bundle-scanner.test.ts +0 -313
  51. package/src/__tests__/call-bridge.test.ts +0 -425
  52. package/src/__tests__/call-constants.test.ts +0 -40
  53. package/src/__tests__/call-orchestrator.test.ts +0 -512
  54. package/src/__tests__/call-recovery.test.ts +0 -518
  55. package/src/__tests__/call-routes-http.test.ts +0 -459
  56. package/src/__tests__/call-state-machine.test.ts +0 -143
  57. package/src/__tests__/call-state.test.ts +0 -174
  58. package/src/__tests__/call-store.test.ts +0 -691
  59. package/src/__tests__/checker.test.ts +0 -3960
  60. package/src/__tests__/clarification-resolver.test.ts +0 -159
  61. package/src/__tests__/classifier.test.ts +0 -67
  62. package/src/__tests__/claude-code-skill-regression.test.ts +0 -127
  63. package/src/__tests__/claude-code-tool-profiles.test.ts +0 -88
  64. package/src/__tests__/cli-discover.test.ts +0 -85
  65. package/src/__tests__/cli.test.ts +0 -81
  66. package/src/__tests__/clipboard.test.ts +0 -80
  67. package/src/__tests__/commit-guarantee.test.ts +0 -335
  68. package/src/__tests__/commit-message-enrichment-service.test.ts +0 -550
  69. package/src/__tests__/compaction.benchmark.test.ts +0 -176
  70. package/src/__tests__/computer-use-session-compaction.test.ts +0 -132
  71. package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -293
  72. package/src/__tests__/computer-use-session-working-dir.test.ts +0 -117
  73. package/src/__tests__/computer-use-skill-baseline.test.ts +0 -74
  74. package/src/__tests__/computer-use-skill-endstate.test.ts +0 -89
  75. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -217
  76. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +0 -107
  77. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +0 -54
  78. package/src/__tests__/computer-use-tools.test.ts +0 -250
  79. package/src/__tests__/config-schema.test.ts +0 -1343
  80. package/src/__tests__/conflict-store.test.ts +0 -330
  81. package/src/__tests__/connection-policy.test.ts +0 -102
  82. package/src/__tests__/contacts-tools.test.ts +0 -331
  83. package/src/__tests__/context-memory-e2e.test.ts +0 -434
  84. package/src/__tests__/context-token-estimator.test.ts +0 -135
  85. package/src/__tests__/context-window-manager.test.ts +0 -376
  86. package/src/__tests__/contradiction-checker.test.ts +0 -216
  87. package/src/__tests__/conversation-store.test.ts +0 -612
  88. package/src/__tests__/credential-broker-browser-fill.test.ts +0 -517
  89. package/src/__tests__/credential-broker-server-use.test.ts +0 -554
  90. package/src/__tests__/credential-broker.test.ts +0 -167
  91. package/src/__tests__/credential-host-pattern-match.test.ts +0 -104
  92. package/src/__tests__/credential-metadata-store.test.ts +0 -779
  93. package/src/__tests__/credential-policy-validate.test.ts +0 -121
  94. package/src/__tests__/credential-resolve.test.ts +0 -328
  95. package/src/__tests__/credential-security-e2e.test.ts +0 -352
  96. package/src/__tests__/credential-security-invariants.test.ts +0 -567
  97. package/src/__tests__/credential-selection.test.ts +0 -354
  98. package/src/__tests__/credential-vault.test.ts +0 -852
  99. package/src/__tests__/daemon-assistant-events.test.ts +0 -164
  100. package/src/__tests__/daemon-server-session-init.test.ts +0 -522
  101. package/src/__tests__/date-context.test.ts +0 -373
  102. package/src/__tests__/db-schedule-syntax-migration.test.ts +0 -129
  103. package/src/__tests__/delete-managed-skill-tool.test.ts +0 -97
  104. package/src/__tests__/diff.test.ts +0 -121
  105. package/src/__tests__/domain-normalize.test.ts +0 -112
  106. package/src/__tests__/domain-policy.test.ts +0 -124
  107. package/src/__tests__/doordash-client.test.ts +0 -186
  108. package/src/__tests__/doordash-session.test.ts +0 -152
  109. package/src/__tests__/dynamic-page-surface.test.ts +0 -91
  110. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -132
  111. package/src/__tests__/edit-engine.test.ts +0 -180
  112. package/src/__tests__/elevenlabs-client.test.ts +0 -209
  113. package/src/__tests__/email-cli.test.ts +0 -283
  114. package/src/__tests__/encrypted-store.test.ts +0 -332
  115. package/src/__tests__/entity-extractor.test.ts +0 -190
  116. package/src/__tests__/ephemeral-permissions.test.ts +0 -312
  117. package/src/__tests__/evaluate-typescript-tool.test.ts +0 -286
  118. package/src/__tests__/event-bus.test.ts +0 -222
  119. package/src/__tests__/file-edit-tool.test.ts +0 -122
  120. package/src/__tests__/file-ops-service.test.ts +0 -330
  121. package/src/__tests__/file-read-tool.test.ts +0 -75
  122. package/src/__tests__/file-write-tool.test.ts +0 -113
  123. package/src/__tests__/fixtures/credential-security-fixtures.ts +0 -181
  124. package/src/__tests__/fixtures/media-reuse-fixtures.ts +0 -126
  125. package/src/__tests__/fixtures/mock-signup-server.ts +0 -387
  126. package/src/__tests__/fixtures/proxy-fixtures.ts +0 -147
  127. package/src/__tests__/followup-tools.test.ts +0 -303
  128. package/src/__tests__/forbidden-legacy-symbols.test.ts +0 -71
  129. package/src/__tests__/fuzzy-match-property.test.ts +0 -216
  130. package/src/__tests__/fuzzy-match.test.ts +0 -138
  131. package/src/__tests__/gateway-only-enforcement.test.ts +0 -436
  132. package/src/__tests__/gemini-image-service.test.ts +0 -261
  133. package/src/__tests__/gemini-provider.test.ts +0 -651
  134. package/src/__tests__/get-weather.test.ts +0 -318
  135. package/src/__tests__/gmail-integration.test.ts +0 -73
  136. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -351
  137. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -190
  138. package/src/__tests__/handlers-slack-config.test.ts +0 -199
  139. package/src/__tests__/handlers-task-submit-slash.test.ts +0 -38
  140. package/src/__tests__/handlers-twitter-config.test.ts +0 -718
  141. package/src/__tests__/headless-browser-interactions.test.ts +0 -536
  142. package/src/__tests__/headless-browser-navigate.test.ts +0 -211
  143. package/src/__tests__/headless-browser-read-tools.test.ts +0 -261
  144. package/src/__tests__/headless-browser-snapshot.test.ts +0 -185
  145. package/src/__tests__/history-repair-observability.test.ts +0 -56
  146. package/src/__tests__/history-repair.test.ts +0 -510
  147. package/src/__tests__/home-base-bootstrap.test.ts +0 -82
  148. package/src/__tests__/hooks-blocking.test.ts +0 -128
  149. package/src/__tests__/hooks-cli.test.ts +0 -144
  150. package/src/__tests__/hooks-config.test.ts +0 -93
  151. package/src/__tests__/hooks-discovery.test.ts +0 -199
  152. package/src/__tests__/hooks-integration.test.ts +0 -189
  153. package/src/__tests__/hooks-manager.test.ts +0 -187
  154. package/src/__tests__/hooks-runner.test.ts +0 -178
  155. package/src/__tests__/hooks-settings.test.ts +0 -154
  156. package/src/__tests__/hooks-templates.test.ts +0 -137
  157. package/src/__tests__/hooks-ts-runner.test.ts +0 -125
  158. package/src/__tests__/hooks-watch.test.ts +0 -100
  159. package/src/__tests__/host-file-edit-tool.test.ts +0 -104
  160. package/src/__tests__/host-file-read-tool.test.ts +0 -61
  161. package/src/__tests__/host-file-write-tool.test.ts +0 -77
  162. package/src/__tests__/host-shell-tool.test.ts +0 -311
  163. package/src/__tests__/ingress-url-consistency.test.ts +0 -214
  164. package/src/__tests__/intent-routing.test.ts +0 -259
  165. package/src/__tests__/ipc-blob-store.test.ts +0 -315
  166. package/src/__tests__/ipc-contract-inventory.test.ts +0 -54
  167. package/src/__tests__/ipc-contract.test.ts +0 -74
  168. package/src/__tests__/ipc-protocol.test.ts +0 -113
  169. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -237
  170. package/src/__tests__/ipc-snapshot.test.ts +0 -1698
  171. package/src/__tests__/ipc-validate.test.ts +0 -357
  172. package/src/__tests__/key-migration.test.ts +0 -183
  173. package/src/__tests__/keychain.test.ts +0 -258
  174. package/src/__tests__/llm-usage-store.test.ts +0 -221
  175. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -257
  176. package/src/__tests__/managed-store.test.ts +0 -608
  177. package/src/__tests__/media-generate-image.test.ts +0 -238
  178. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -676
  179. package/src/__tests__/media-visibility-policy.test.ts +0 -141
  180. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -235
  181. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -481
  182. package/src/__tests__/memory-query-builder.test.ts +0 -59
  183. package/src/__tests__/memory-recall-quality.test.ts +0 -846
  184. package/src/__tests__/memory-regressions.experimental.test.ts +0 -538
  185. package/src/__tests__/memory-regressions.test.ts +0 -4336
  186. package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
  187. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -430
  188. package/src/__tests__/migration-cli-flows.test.ts +0 -169
  189. package/src/__tests__/migration-ordering.test.ts +0 -249
  190. package/src/__tests__/mock-signup-server.test.ts +0 -528
  191. package/src/__tests__/oauth-callback-registry.test.ts +0 -85
  192. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -285
  193. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -176
  194. package/src/__tests__/onboarding-template-contract.test.ts +0 -58
  195. package/src/__tests__/openai-provider.test.ts +0 -753
  196. package/src/__tests__/parallel-tool.benchmark.test.ts +0 -294
  197. package/src/__tests__/parser.test.ts +0 -472
  198. package/src/__tests__/path-classifier.test.ts +0 -73
  199. package/src/__tests__/path-policy.test.ts +0 -435
  200. package/src/__tests__/platform-move-helper.test.ts +0 -99
  201. package/src/__tests__/platform-socket-path.test.ts +0 -52
  202. package/src/__tests__/platform-workspace-migration.test.ts +0 -1000
  203. package/src/__tests__/platform.test.ts +0 -131
  204. package/src/__tests__/playbook-tools.test.ts +0 -342
  205. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -75
  206. package/src/__tests__/pricing.test.ts +0 -256
  207. package/src/__tests__/profile-compiler.test.ts +0 -374
  208. package/src/__tests__/provider-commit-message-generator.test.ts +0 -342
  209. package/src/__tests__/provider-registry-ollama.test.ts +0 -16
  210. package/src/__tests__/provider-streaming.benchmark.test.ts +0 -773
  211. package/src/__tests__/proxy-approval-callback.test.ts +0 -601
  212. package/src/__tests__/public-ingress-urls.test.ts +0 -222
  213. package/src/__tests__/ratelimit.test.ts +0 -297
  214. package/src/__tests__/recurrence-engine-rruleset.test.ts +0 -78
  215. package/src/__tests__/recurrence-engine.test.ts +0 -69
  216. package/src/__tests__/recurrence-types.test.ts +0 -71
  217. package/src/__tests__/registry.test.ts +0 -494
  218. package/src/__tests__/relay-server.test.ts +0 -688
  219. package/src/__tests__/reminder-store.test.ts +0 -223
  220. package/src/__tests__/reminder.test.ts +0 -229
  221. package/src/__tests__/request-file-tool.test.ts +0 -158
  222. package/src/__tests__/run-orchestrator-assistant-events.test.ts +0 -222
  223. package/src/__tests__/run-orchestrator.test.ts +0 -200
  224. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -189
  225. package/src/__tests__/runtime-events-sse-parity.test.ts +0 -343
  226. package/src/__tests__/runtime-events-sse.test.ts +0 -162
  227. package/src/__tests__/runtime-runs-http.test.ts +0 -433
  228. package/src/__tests__/runtime-runs.test.ts +0 -273
  229. package/src/__tests__/sandbox-diagnostics.test.ts +0 -408
  230. package/src/__tests__/sandbox-host-parity.test.ts +0 -950
  231. package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -253
  232. package/src/__tests__/schedule-store.test.ts +0 -482
  233. package/src/__tests__/schedule-tools.test.ts +0 -700
  234. package/src/__tests__/scheduler-recurrence.test.ts +0 -329
  235. package/src/__tests__/script-proxy-certs.test.ts +0 -90
  236. package/src/__tests__/script-proxy-connect-tunnel.test.ts +0 -177
  237. package/src/__tests__/script-proxy-decision-trace.test.ts +0 -156
  238. package/src/__tests__/script-proxy-http-forwarder.test.ts +0 -281
  239. package/src/__tests__/script-proxy-injection-runtime.test.ts +0 -401
  240. package/src/__tests__/script-proxy-mitm-handler.test.ts +0 -407
  241. package/src/__tests__/script-proxy-policy-runtime.test.ts +0 -287
  242. package/src/__tests__/script-proxy-policy.test.ts +0 -310
  243. package/src/__tests__/script-proxy-rewrite-specificity.test.ts +0 -135
  244. package/src/__tests__/script-proxy-router.test.ts +0 -180
  245. package/src/__tests__/script-proxy-session-manager.test.ts +0 -382
  246. package/src/__tests__/script-proxy-session-runtime.test.ts +0 -113
  247. package/src/__tests__/secret-allowlist.test.ts +0 -229
  248. package/src/__tests__/secret-ingress-handler.test.ts +0 -99
  249. package/src/__tests__/secret-onetime-send.test.ts +0 -130
  250. package/src/__tests__/secret-prompt-log-hygiene.test.ts +0 -106
  251. package/src/__tests__/secret-response-routing.test.ts +0 -93
  252. package/src/__tests__/secret-scanner-executor.test.ts +0 -348
  253. package/src/__tests__/secret-scanner.test.ts +0 -857
  254. package/src/__tests__/secure-keys.test.ts +0 -323
  255. package/src/__tests__/server-history-render.test.ts +0 -431
  256. package/src/__tests__/session-abort-tool-results.test.ts +0 -240
  257. package/src/__tests__/session-conflict-gate.test.ts +0 -700
  258. package/src/__tests__/session-error.test.ts +0 -369
  259. package/src/__tests__/session-evictor.test.ts +0 -188
  260. package/src/__tests__/session-init.benchmark.test.ts +0 -462
  261. package/src/__tests__/session-load-history-repair.test.ts +0 -222
  262. package/src/__tests__/session-pre-run-repair.test.ts +0 -213
  263. package/src/__tests__/session-profile-injection.test.ts +0 -444
  264. package/src/__tests__/session-provider-retry-repair.test.ts +0 -306
  265. package/src/__tests__/session-queue.test.ts +0 -1535
  266. package/src/__tests__/session-runtime-assembly.test.ts +0 -476
  267. package/src/__tests__/session-runtime-workspace.test.ts +0 -183
  268. package/src/__tests__/session-skill-tools.test.ts +0 -2431
  269. package/src/__tests__/session-slash-known.test.ts +0 -368
  270. package/src/__tests__/session-slash-queue.test.ts +0 -288
  271. package/src/__tests__/session-slash-unknown.test.ts +0 -271
  272. package/src/__tests__/session-surfaces-task-progress.test.ts +0 -104
  273. package/src/__tests__/session-tool-setup-app-refresh.test.ts +0 -473
  274. package/src/__tests__/session-tool-setup-memory-scope.test.ts +0 -140
  275. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +0 -140
  276. package/src/__tests__/session-undo.test.ts +0 -75
  277. package/src/__tests__/session-workspace-cache-state.test.ts +0 -246
  278. package/src/__tests__/session-workspace-injection.test.ts +0 -327
  279. package/src/__tests__/session-workspace-tool-tracking.test.ts +0 -240
  280. package/src/__tests__/shared-filesystem-errors.test.ts +0 -78
  281. package/src/__tests__/shell-credential-ref.test.ts +0 -187
  282. package/src/__tests__/shell-parser-fuzz.test.ts +0 -544
  283. package/src/__tests__/shell-parser-property.test.ts +0 -433
  284. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -272
  285. package/src/__tests__/signup-e2e.test.ts +0 -353
  286. package/src/__tests__/size-guard.test.ts +0 -117
  287. package/src/__tests__/skill-include-graph.test.ts +0 -303
  288. package/src/__tests__/skill-load-tool.test.ts +0 -409
  289. package/src/__tests__/skill-projection.benchmark.test.ts +0 -328
  290. package/src/__tests__/skill-script-runner-host.test.ts +0 -489
  291. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -349
  292. package/src/__tests__/skill-script-runner.test.ts +0 -159
  293. package/src/__tests__/skill-tool-factory.test.ts +0 -252
  294. package/src/__tests__/skill-tool-manifest.test.ts +0 -658
  295. package/src/__tests__/skill-version-hash.test.ts +0 -182
  296. package/src/__tests__/skills.test.ts +0 -680
  297. package/src/__tests__/slash-commands-catalog.test.ts +0 -86
  298. package/src/__tests__/slash-commands-parser.test.ts +0 -119
  299. package/src/__tests__/slash-commands-resolver.test.ts +0 -193
  300. package/src/__tests__/slash-commands-rewrite.test.ts +0 -39
  301. package/src/__tests__/speaker-identification.test.ts +0 -52
  302. package/src/__tests__/starter-bundle.test.ts +0 -136
  303. package/src/__tests__/starter-task-flow.test.ts +0 -143
  304. package/src/__tests__/subagent-manager-notify.test.ts +0 -404
  305. package/src/__tests__/subagent-tools.test.ts +0 -218
  306. package/src/__tests__/subagent-types.test.ts +0 -78
  307. package/src/__tests__/swarm-orchestrator.test.ts +0 -428
  308. package/src/__tests__/swarm-plan-validator.test.ts +0 -330
  309. package/src/__tests__/swarm-recursion.test.ts +0 -165
  310. package/src/__tests__/swarm-router-planner.test.ts +0 -208
  311. package/src/__tests__/swarm-session-integration.test.ts +0 -274
  312. package/src/__tests__/swarm-tool.test.ts +0 -145
  313. package/src/__tests__/swarm-worker-backend.test.ts +0 -129
  314. package/src/__tests__/swarm-worker-runner.test.ts +0 -272
  315. package/src/__tests__/system-prompt.test.ts +0 -439
  316. package/src/__tests__/task-compiler.test.ts +0 -284
  317. package/src/__tests__/task-runner.test.ts +0 -216
  318. package/src/__tests__/task-scheduler.test.ts +0 -217
  319. package/src/__tests__/task-tools.test.ts +0 -595
  320. package/src/__tests__/terminal-sandbox-docker.test.ts +0 -1064
  321. package/src/__tests__/terminal-sandbox.integration.test.ts +0 -178
  322. package/src/__tests__/terminal-sandbox.test.ts +0 -202
  323. package/src/__tests__/test-support/browser-skill-harness.ts +0 -90
  324. package/src/__tests__/test-support/computer-use-skill-harness.ts +0 -45
  325. package/src/__tests__/tool-audit-listener.test.ts +0 -113
  326. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -253
  327. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -500
  328. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -516
  329. package/src/__tests__/tool-executor-redaction.test.ts +0 -289
  330. package/src/__tests__/tool-executor.test.ts +0 -2055
  331. package/src/__tests__/tool-metrics-listener.test.ts +0 -225
  332. package/src/__tests__/tool-notification-listener.test.ts +0 -49
  333. package/src/__tests__/tool-policy.test.ts +0 -54
  334. package/src/__tests__/tool-profiling-listener.test.ts +0 -268
  335. package/src/__tests__/tool-result-truncation.test.ts +0 -217
  336. package/src/__tests__/tool-trace-listener.test.ts +0 -226
  337. package/src/__tests__/top-level-renderer.test.ts +0 -121
  338. package/src/__tests__/top-level-scanner.test.ts +0 -141
  339. package/src/__tests__/trace-emitter.test.ts +0 -173
  340. package/src/__tests__/trust-store.test.ts +0 -2031
  341. package/src/__tests__/turn-commit.test.ts +0 -554
  342. package/src/__tests__/twilio-provider.test.ts +0 -179
  343. package/src/__tests__/twilio-routes-twiml.test.ts +0 -127
  344. package/src/__tests__/twilio-routes.test.ts +0 -822
  345. package/src/__tests__/twitter-auth-handler.test.ts +0 -666
  346. package/src/__tests__/url-safety.test.ts +0 -418
  347. package/src/__tests__/view-image-tool.test.ts +0 -217
  348. package/src/__tests__/weather-skill-regression.test.ts +0 -225
  349. package/src/__tests__/web-fetch.test.ts +0 -869
  350. package/src/__tests__/web-search.test.ts +0 -584
  351. package/src/__tests__/workspace-git-service.test.ts +0 -1153
  352. package/src/__tests__/workspace-heartbeat-service.test.ts +0 -486
  353. package/src/__tests__/workspace-lifecycle.test.ts +0 -292
  354. package/src/agent/attachments.ts +0 -35
  355. package/src/agent/loop.ts +0 -500
  356. package/src/agent/message-types.ts +0 -17
  357. package/src/agent-heartbeat/agent-heartbeat-service.ts +0 -155
  358. package/src/autonomy/autonomy-resolver.ts +0 -60
  359. package/src/autonomy/autonomy-store.ts +0 -122
  360. package/src/autonomy/disposition-mapper.ts +0 -31
  361. package/src/autonomy/index.ts +0 -11
  362. package/src/autonomy/types.ts +0 -39
  363. package/src/bundler/app-bundler.ts +0 -295
  364. package/src/bundler/bundle-scanner.ts +0 -535
  365. package/src/bundler/bundle-signer.ts +0 -124
  366. package/src/bundler/manifest.ts +0 -21
  367. package/src/bundler/signature-verifier.ts +0 -184
  368. package/src/calls/call-bridge.ts +0 -95
  369. package/src/calls/call-constants.ts +0 -48
  370. package/src/calls/call-domain.ts +0 -278
  371. package/src/calls/call-orchestrator.ts +0 -412
  372. package/src/calls/call-recovery.ts +0 -207
  373. package/src/calls/call-state-machine.ts +0 -68
  374. package/src/calls/call-state.ts +0 -87
  375. package/src/calls/call-store.ts +0 -416
  376. package/src/calls/elevenlabs-client.ts +0 -89
  377. package/src/calls/elevenlabs-config.ts +0 -29
  378. package/src/calls/relay-server.ts +0 -390
  379. package/src/calls/speaker-identification.ts +0 -213
  380. package/src/calls/twilio-config.ts +0 -45
  381. package/src/calls/twilio-provider.ts +0 -178
  382. package/src/calls/twilio-routes.ts +0 -316
  383. package/src/calls/types.ts +0 -37
  384. package/src/calls/voice-provider.ts +0 -14
  385. package/src/calls/voice-quality.ts +0 -92
  386. package/src/cli/autonomy.ts +0 -188
  387. package/src/cli/config-commands.ts +0 -334
  388. package/src/cli/contacts.ts +0 -149
  389. package/src/cli/core-commands.ts +0 -784
  390. package/src/cli/doordash.ts +0 -1055
  391. package/src/cli/email-guardrails.ts +0 -200
  392. package/src/cli/email.ts +0 -405
  393. package/src/cli/ipc-client.ts +0 -82
  394. package/src/cli/main-screen.tsx +0 -53
  395. package/src/cli/map.ts +0 -270
  396. package/src/cli/twitter.ts +0 -575
  397. package/src/cli.ts +0 -937
  398. package/src/commands/__tests__/cc-command-registry.test.ts +0 -319
  399. package/src/commands/cc-command-registry.ts +0 -209
  400. package/src/config/bundled-skills/.gitkeep +0 -0
  401. package/src/config/bundled-skills/agentmail/SKILL.md +0 -128
  402. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  403. package/src/config/bundled-skills/app-builder/SKILL.md +0 -1404
  404. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -279
  405. package/src/config/bundled-skills/app-builder/icon.svg +0 -9
  406. package/src/config/bundled-skills/app-builder/tools/app-create.ts +0 -15
  407. package/src/config/bundled-skills/app-builder/tools/app-delete.ts +0 -10
  408. package/src/config/bundled-skills/app-builder/tools/app-file-edit.ts +0 -11
  409. package/src/config/bundled-skills/app-builder/tools/app-file-list.ts +0 -10
  410. package/src/config/bundled-skills/app-builder/tools/app-file-read.ts +0 -18
  411. package/src/config/bundled-skills/app-builder/tools/app-file-write.ts +0 -11
  412. package/src/config/bundled-skills/app-builder/tools/app-list.ts +0 -10
  413. package/src/config/bundled-skills/app-builder/tools/app-query.ts +0 -10
  414. package/src/config/bundled-skills/app-builder/tools/app-update.ts +0 -20
  415. package/src/config/bundled-skills/browser/SKILL.md +0 -28
  416. package/src/config/bundled-skills/browser/TOOLS.json +0 -234
  417. package/src/config/bundled-skills/browser/tools/browser-click.ts +0 -9
  418. package/src/config/bundled-skills/browser/tools/browser-close.ts +0 -9
  419. package/src/config/bundled-skills/browser/tools/browser-extract.ts +0 -9
  420. package/src/config/bundled-skills/browser/tools/browser-fill-credential.ts +0 -9
  421. package/src/config/bundled-skills/browser/tools/browser-navigate.ts +0 -9
  422. package/src/config/bundled-skills/browser/tools/browser-press-key.ts +0 -9
  423. package/src/config/bundled-skills/browser/tools/browser-screenshot.ts +0 -9
  424. package/src/config/bundled-skills/browser/tools/browser-snapshot.ts +0 -9
  425. package/src/config/bundled-skills/browser/tools/browser-type.ts +0 -9
  426. package/src/config/bundled-skills/browser/tools/browser-wait-for.ts +0 -9
  427. package/src/config/bundled-skills/claude-code/SKILL.md +0 -50
  428. package/src/config/bundled-skills/claude-code/TOOLS.json +0 -40
  429. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -9
  430. package/src/config/bundled-skills/computer-use/SKILL.md +0 -17
  431. package/src/config/bundled-skills/computer-use/TOOLS.json +0 -326
  432. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +0 -9
  433. package/src/config/bundled-skills/computer-use/tools/computer-use-done.ts +0 -9
  434. package/src/config/bundled-skills/computer-use/tools/computer-use-double-click.ts +0 -9
  435. package/src/config/bundled-skills/computer-use/tools/computer-use-drag.ts +0 -9
  436. package/src/config/bundled-skills/computer-use/tools/computer-use-key.ts +0 -9
  437. package/src/config/bundled-skills/computer-use/tools/computer-use-open-app.ts +0 -9
  438. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +0 -9
  439. package/src/config/bundled-skills/computer-use/tools/computer-use-respond.ts +0 -9
  440. package/src/config/bundled-skills/computer-use/tools/computer-use-right-click.ts +0 -9
  441. package/src/config/bundled-skills/computer-use/tools/computer-use-run-applescript.ts +0 -9
  442. package/src/config/bundled-skills/computer-use/tools/computer-use-scroll.ts +0 -9
  443. package/src/config/bundled-skills/computer-use/tools/computer-use-type-text.ts +0 -9
  444. package/src/config/bundled-skills/computer-use/tools/computer-use-wait.ts +0 -9
  445. package/src/config/bundled-skills/contacts/SKILL.md +0 -39
  446. package/src/config/bundled-skills/contacts/TOOLS.json +0 -122
  447. package/src/config/bundled-skills/contacts/tools/contact-merge.ts +0 -9
  448. package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -9
  449. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -9
  450. package/src/config/bundled-skills/document/SKILL.md +0 -26
  451. package/src/config/bundled-skills/document/TOOLS.json +0 -53
  452. package/src/config/bundled-skills/document/tools/document-create.ts +0 -9
  453. package/src/config/bundled-skills/document/tools/document-update.ts +0 -9
  454. package/src/config/bundled-skills/doordash/SKILL.md +0 -163
  455. package/src/config/bundled-skills/followups/SKILL.md +0 -32
  456. package/src/config/bundled-skills/followups/TOOLS.json +0 -100
  457. package/src/config/bundled-skills/followups/icon.svg +0 -24
  458. package/src/config/bundled-skills/followups/tools/followup-create.ts +0 -9
  459. package/src/config/bundled-skills/followups/tools/followup-list.ts +0 -9
  460. package/src/config/bundled-skills/followups/tools/followup-resolve.ts +0 -9
  461. package/src/config/bundled-skills/google-calendar/SKILL.md +0 -51
  462. package/src/config/bundled-skills/google-calendar/TOOLS.json +0 -108
  463. package/src/config/bundled-skills/google-calendar/calendar-client.ts +0 -165
  464. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +0 -21
  465. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +0 -42
  466. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +0 -13
  467. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +0 -30
  468. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +0 -41
  469. package/src/config/bundled-skills/google-calendar/tools/shared.ts +0 -18
  470. package/src/config/bundled-skills/google-calendar/types.ts +0 -97
  471. package/src/config/bundled-skills/image-studio/SKILL.md +0 -32
  472. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -42
  473. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +0 -115
  474. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -66
  475. package/src/config/bundled-skills/messaging/SKILL.md +0 -130
  476. package/src/config/bundled-skills/messaging/TOOLS.json +0 -357
  477. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -23
  478. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -23
  479. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -25
  480. package/src/config/bundled-skills/messaging/tools/gmail-draft.ts +0 -26
  481. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -25
  482. package/src/config/bundled-skills/messaging/tools/gmail-trash.ts +0 -23
  483. package/src/config/bundled-skills/messaging/tools/gmail-unsubscribe.ts +0 -84
  484. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -18
  485. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +0 -125
  486. package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +0 -16
  487. package/src/config/bundled-skills/messaging/tools/messaging-draft.ts +0 -49
  488. package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +0 -21
  489. package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +0 -25
  490. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +0 -28
  491. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -29
  492. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +0 -22
  493. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -27
  494. package/src/config/bundled-skills/messaging/tools/shared.ts +0 -71
  495. package/src/config/bundled-skills/messaging/tools/slack-add-reaction.ts +0 -25
  496. package/src/config/bundled-skills/messaging/tools/slack-leave-channel.ts +0 -23
  497. package/src/config/bundled-skills/phone-calls/SKILL.md +0 -414
  498. package/src/config/bundled-skills/playbooks/SKILL.md +0 -31
  499. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -126
  500. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +0 -9
  501. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +0 -9
  502. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +0 -9
  503. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +0 -9
  504. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -183
  505. package/src/config/bundled-skills/reminder/SKILL.md +0 -20
  506. package/src/config/bundled-skills/reminder/TOOLS.json +0 -67
  507. package/src/config/bundled-skills/reminder/tools/reminder-cancel.ts +0 -9
  508. package/src/config/bundled-skills/reminder/tools/reminder-create.ts +0 -9
  509. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -9
  510. package/src/config/bundled-skills/schedule/SKILL.md +0 -74
  511. package/src/config/bundled-skills/schedule/TOOLS.json +0 -135
  512. package/src/config/bundled-skills/schedule/tools/schedule-create.ts +0 -9
  513. package/src/config/bundled-skills/schedule/tools/schedule-delete.ts +0 -9
  514. package/src/config/bundled-skills/schedule/tools/schedule-list.ts +0 -9
  515. package/src/config/bundled-skills/schedule/tools/schedule-update.ts +0 -9
  516. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -68
  517. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  518. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  519. package/src/config/bundled-skills/subagent/SKILL.md +0 -25
  520. package/src/config/bundled-skills/subagent/TOOLS.json +0 -107
  521. package/src/config/bundled-skills/subagent/tools/subagent-abort.ts +0 -9
  522. package/src/config/bundled-skills/subagent/tools/subagent-message.ts +0 -9
  523. package/src/config/bundled-skills/subagent/tools/subagent-read.ts +0 -9
  524. package/src/config/bundled-skills/subagent/tools/subagent-spawn.ts +0 -9
  525. package/src/config/bundled-skills/subagent/tools/subagent-status.ts +0 -9
  526. package/src/config/bundled-skills/tasks/SKILL.md +0 -28
  527. package/src/config/bundled-skills/tasks/TOOLS.json +0 -281
  528. package/src/config/bundled-skills/tasks/tools/task-delete.ts +0 -9
  529. package/src/config/bundled-skills/tasks/tools/task-list-add.ts +0 -9
  530. package/src/config/bundled-skills/tasks/tools/task-list-remove.ts +0 -9
  531. package/src/config/bundled-skills/tasks/tools/task-list-show.ts +0 -9
  532. package/src/config/bundled-skills/tasks/tools/task-list-update.ts +0 -9
  533. package/src/config/bundled-skills/tasks/tools/task-list.ts +0 -9
  534. package/src/config/bundled-skills/tasks/tools/task-queue-run.ts +0 -9
  535. package/src/config/bundled-skills/tasks/tools/task-run.ts +0 -9
  536. package/src/config/bundled-skills/tasks/tools/task-save.ts +0 -9
  537. package/src/config/bundled-skills/transcribe/SKILL.md +0 -25
  538. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -32
  539. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +0 -370
  540. package/src/config/bundled-skills/twitter/SKILL.md +0 -134
  541. package/src/config/bundled-skills/watcher/SKILL.md +0 -27
  542. package/src/config/bundled-skills/watcher/TOOLS.json +0 -147
  543. package/src/config/bundled-skills/watcher/tools/watcher-create.ts +0 -9
  544. package/src/config/bundled-skills/watcher/tools/watcher-delete.ts +0 -9
  545. package/src/config/bundled-skills/watcher/tools/watcher-digest.ts +0 -9
  546. package/src/config/bundled-skills/watcher/tools/watcher-list.ts +0 -9
  547. package/src/config/bundled-skills/watcher/tools/watcher-update.ts +0 -9
  548. package/src/config/bundled-skills/weather/SKILL.md +0 -37
  549. package/src/config/bundled-skills/weather/TOOLS.json +0 -32
  550. package/src/config/bundled-skills/weather/icon.svg +0 -24
  551. package/src/config/bundled-skills/weather/tools/get-weather.ts +0 -9
  552. package/src/config/computer-use-prompt.ts +0 -97
  553. package/src/config/defaults.ts +0 -252
  554. package/src/config/loader.ts +0 -339
  555. package/src/config/schema.ts +0 -1356
  556. package/src/config/skill-state.ts +0 -95
  557. package/src/config/skills.ts +0 -972
  558. package/src/config/system-prompt.ts +0 -675
  559. package/src/config/templates/BOOTSTRAP.md +0 -70
  560. package/src/config/templates/IDENTITY.md +0 -25
  561. package/src/config/templates/LOOKS.md +0 -25
  562. package/src/config/templates/SOUL.md +0 -37
  563. package/src/config/templates/USER.md +0 -19
  564. package/src/config/types.ts +0 -40
  565. package/src/config/vellum-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  566. package/src/config/vellum-skills/document-writer/SKILL.md +0 -195
  567. package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
  568. package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +0 -153
  569. package/src/config/vellum-skills/telegram-setup/SKILL.md +0 -102
  570. package/src/contacts/contact-store.ts +0 -410
  571. package/src/contacts/index.ts +0 -11
  572. package/src/contacts/types.ts +0 -28
  573. package/src/context/token-estimator.ts +0 -108
  574. package/src/context/tool-result-truncation.ts +0 -128
  575. package/src/context/window-manager.ts +0 -531
  576. package/src/daemon/assistant-attachments.ts +0 -689
  577. package/src/daemon/classifier.ts +0 -110
  578. package/src/daemon/computer-use-session.ts +0 -903
  579. package/src/daemon/connection-policy.ts +0 -41
  580. package/src/daemon/date-context.ts +0 -136
  581. package/src/daemon/handlers/apps.ts +0 -461
  582. package/src/daemon/handlers/browser.ts +0 -54
  583. package/src/daemon/handlers/computer-use.ts +0 -187
  584. package/src/daemon/handlers/config.ts +0 -707
  585. package/src/daemon/handlers/diagnostics.ts +0 -338
  586. package/src/daemon/handlers/documents.ts +0 -173
  587. package/src/daemon/handlers/home-base.ts +0 -78
  588. package/src/daemon/handlers/identity.ts +0 -127
  589. package/src/daemon/handlers/index.ts +0 -128
  590. package/src/daemon/handlers/misc.ts +0 -331
  591. package/src/daemon/handlers/open-bundle-handler.ts +0 -80
  592. package/src/daemon/handlers/publish.ts +0 -187
  593. package/src/daemon/handlers/sessions.ts +0 -539
  594. package/src/daemon/handlers/shared.ts +0 -569
  595. package/src/daemon/handlers/signing.ts +0 -37
  596. package/src/daemon/handlers/skills.ts +0 -501
  597. package/src/daemon/handlers/subagents.ts +0 -210
  598. package/src/daemon/handlers/twitter-auth.ts +0 -198
  599. package/src/daemon/handlers/work-items.ts +0 -632
  600. package/src/daemon/handlers/workspace-files.ts +0 -75
  601. package/src/daemon/handlers.ts +0 -17
  602. package/src/daemon/history-repair.ts +0 -214
  603. package/src/daemon/ipc-blob-store.ts +0 -231
  604. package/src/daemon/ipc-contract-inventory.json +0 -463
  605. package/src/daemon/ipc-contract-inventory.ts +0 -126
  606. package/src/daemon/ipc-contract.ts +0 -2352
  607. package/src/daemon/ipc-protocol.ts +0 -75
  608. package/src/daemon/ipc-validate.ts +0 -171
  609. package/src/daemon/lifecycle.ts +0 -580
  610. package/src/daemon/main.ts +0 -21
  611. package/src/daemon/media-visibility-policy.ts +0 -57
  612. package/src/daemon/ride-shotgun-handler.ts +0 -309
  613. package/src/daemon/server.ts +0 -1207
  614. package/src/daemon/session-agent-loop.ts +0 -922
  615. package/src/daemon/session-attachments.ts +0 -196
  616. package/src/daemon/session-conflict-gate.ts +0 -128
  617. package/src/daemon/session-dynamic-profile.ts +0 -63
  618. package/src/daemon/session-error.ts +0 -290
  619. package/src/daemon/session-evictor.ts +0 -196
  620. package/src/daemon/session-history.ts +0 -437
  621. package/src/daemon/session-lifecycle.ts +0 -147
  622. package/src/daemon/session-media-retry.ts +0 -147
  623. package/src/daemon/session-memory.ts +0 -212
  624. package/src/daemon/session-messaging.ts +0 -145
  625. package/src/daemon/session-notifiers.ts +0 -193
  626. package/src/daemon/session-process.ts +0 -264
  627. package/src/daemon/session-queue-manager.ts +0 -82
  628. package/src/daemon/session-runtime-assembly.ts +0 -447
  629. package/src/daemon/session-skill-tools.ts +0 -356
  630. package/src/daemon/session-slash.ts +0 -305
  631. package/src/daemon/session-surfaces.ts +0 -702
  632. package/src/daemon/session-tool-setup.ts +0 -524
  633. package/src/daemon/session-usage.ts +0 -72
  634. package/src/daemon/session-workspace.ts +0 -19
  635. package/src/daemon/session.ts +0 -400
  636. package/src/daemon/trace-emitter.ts +0 -82
  637. package/src/daemon/video-thumbnail.ts +0 -60
  638. package/src/daemon/watch-handler.ts +0 -274
  639. package/src/doordash/client.ts +0 -999
  640. package/src/doordash/queries.ts +0 -1311
  641. package/src/doordash/query-extractor.ts +0 -93
  642. package/src/doordash/session.ts +0 -82
  643. package/src/email/provider.ts +0 -117
  644. package/src/email/providers/agentmail.ts +0 -317
  645. package/src/email/providers/index.ts +0 -58
  646. package/src/email/service.ts +0 -303
  647. package/src/email/types.ts +0 -126
  648. package/src/events/bus.ts +0 -157
  649. package/src/events/domain-events.ts +0 -83
  650. package/src/events/index.ts +0 -18
  651. package/src/events/tool-audit-listener.ts +0 -80
  652. package/src/events/tool-domain-event-publisher.ts +0 -111
  653. package/src/events/tool-metrics-listener.ts +0 -159
  654. package/src/events/tool-notification-listener.ts +0 -17
  655. package/src/events/tool-profiling-listener.ts +0 -158
  656. package/src/events/tool-trace-listener.ts +0 -75
  657. package/src/export/formatter.ts +0 -98
  658. package/src/followups/followup-store.ts +0 -168
  659. package/src/followups/index.ts +0 -10
  660. package/src/followups/types.ts +0 -29
  661. package/src/gallery/default-gallery.ts +0 -795
  662. package/src/gallery/gallery-manifest.ts +0 -24
  663. package/src/home-base/app-link-store.ts +0 -82
  664. package/src/home-base/bootstrap.ts +0 -68
  665. package/src/home-base/prebuilt/index.html +0 -662
  666. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  667. package/src/home-base/prebuilt/seed.ts +0 -112
  668. package/src/home-base/prebuilt-home-base-updater.ts +0 -30
  669. package/src/hooks/cli.ts +0 -163
  670. package/src/hooks/config.ts +0 -88
  671. package/src/hooks/discovery.ts +0 -110
  672. package/src/hooks/manager.ts +0 -128
  673. package/src/hooks/runner.ts +0 -123
  674. package/src/hooks/templates.ts +0 -52
  675. package/src/hooks/types.ts +0 -72
  676. package/src/inbound/public-ingress-urls.ts +0 -123
  677. package/src/index.ts +0 -75
  678. package/src/instrument.ts +0 -60
  679. package/src/logfire.ts +0 -99
  680. package/src/media/gemini-image-service.ts +0 -136
  681. package/src/memory/account-store.ts +0 -108
  682. package/src/memory/admin.ts +0 -211
  683. package/src/memory/app-store.ts +0 -556
  684. package/src/memory/attachments-store.ts +0 -397
  685. package/src/memory/channel-delivery-store.ts +0 -353
  686. package/src/memory/checkpoints.ts +0 -52
  687. package/src/memory/clarification-resolver.ts +0 -298
  688. package/src/memory/conflict-intent.ts +0 -114
  689. package/src/memory/conflict-store.ts +0 -342
  690. package/src/memory/contradiction-checker.ts +0 -330
  691. package/src/memory/conversation-key-store.ts +0 -107
  692. package/src/memory/conversation-store.ts +0 -470
  693. package/src/memory/db.ts +0 -1825
  694. package/src/memory/embedding-backend.ts +0 -229
  695. package/src/memory/embedding-gemini.ts +0 -52
  696. package/src/memory/embedding-local.ts +0 -75
  697. package/src/memory/embedding-ollama.ts +0 -55
  698. package/src/memory/embedding-openai.ts +0 -25
  699. package/src/memory/entity-extractor.ts +0 -474
  700. package/src/memory/fingerprint.ts +0 -20
  701. package/src/memory/indexer.ts +0 -156
  702. package/src/memory/items-extractor.ts +0 -461
  703. package/src/memory/job-handlers/backfill.ts +0 -139
  704. package/src/memory/job-handlers/cleanup.ts +0 -58
  705. package/src/memory/job-handlers/conflict.ts +0 -121
  706. package/src/memory/job-handlers/embedding.ts +0 -61
  707. package/src/memory/job-handlers/extraction.ts +0 -123
  708. package/src/memory/job-handlers/index-maintenance.ts +0 -54
  709. package/src/memory/job-handlers/summarization.ts +0 -286
  710. package/src/memory/job-utils.ts +0 -170
  711. package/src/memory/jobs-store.ts +0 -401
  712. package/src/memory/jobs-worker.ts +0 -274
  713. package/src/memory/llm-request-log-store.ts +0 -45
  714. package/src/memory/llm-usage-store.ts +0 -60
  715. package/src/memory/message-content.ts +0 -54
  716. package/src/memory/profile-compiler.ts +0 -160
  717. package/src/memory/published-pages-store.ts +0 -137
  718. package/src/memory/qdrant-client.ts +0 -366
  719. package/src/memory/qdrant-manager.ts +0 -242
  720. package/src/memory/query-builder.ts +0 -45
  721. package/src/memory/retrieval-budget.ts +0 -30
  722. package/src/memory/retriever.ts +0 -653
  723. package/src/memory/runs-store.ts +0 -255
  724. package/src/memory/schema.ts +0 -588
  725. package/src/memory/search/entity.ts +0 -298
  726. package/src/memory/search/formatting.ts +0 -207
  727. package/src/memory/search/lexical.ts +0 -227
  728. package/src/memory/search/ranking.ts +0 -401
  729. package/src/memory/search/semantic.ts +0 -121
  730. package/src/memory/search/types.ts +0 -137
  731. package/src/memory/segmenter.ts +0 -68
  732. package/src/memory/shared-app-links-store.ts +0 -138
  733. package/src/memory/tool-usage-store.ts +0 -62
  734. package/src/messaging/activity-analyzer.ts +0 -76
  735. package/src/messaging/draft-store.ts +0 -88
  736. package/src/messaging/index.ts +0 -3
  737. package/src/messaging/provider-types.ts +0 -80
  738. package/src/messaging/provider.ts +0 -43
  739. package/src/messaging/providers/gmail/adapter.ts +0 -193
  740. package/src/messaging/providers/gmail/client.ts +0 -204
  741. package/src/messaging/providers/gmail/types.ts +0 -90
  742. package/src/messaging/providers/slack/adapter.ts +0 -202
  743. package/src/messaging/providers/slack/client.ts +0 -198
  744. package/src/messaging/providers/slack/types.ts +0 -119
  745. package/src/messaging/registry.ts +0 -34
  746. package/src/messaging/style-analyzer.ts +0 -159
  747. package/src/messaging/thread-summarizer.ts +0 -306
  748. package/src/messaging/triage-engine.ts +0 -323
  749. package/src/messaging/types.ts +0 -55
  750. package/src/permissions/checker.ts +0 -636
  751. package/src/permissions/defaults.ts +0 -254
  752. package/src/permissions/prompter.ts +0 -102
  753. package/src/permissions/secret-prompter.ts +0 -114
  754. package/src/permissions/trust-store.ts +0 -584
  755. package/src/permissions/types.ts +0 -62
  756. package/src/playbooks/index.ts +0 -2
  757. package/src/playbooks/playbook-compiler.ts +0 -90
  758. package/src/playbooks/types.ts +0 -55
  759. package/src/providers/anthropic/client.ts +0 -751
  760. package/src/providers/failover.ts +0 -129
  761. package/src/providers/fireworks/client.ts +0 -20
  762. package/src/providers/gemini/client.ts +0 -285
  763. package/src/providers/ollama/client.ts +0 -30
  764. package/src/providers/openai/client.ts +0 -337
  765. package/src/providers/openrouter/client.ts +0 -20
  766. package/src/providers/ratelimit.ts +0 -93
  767. package/src/providers/registry.ts +0 -146
  768. package/src/providers/retry.ts +0 -106
  769. package/src/providers/stream-timeout.ts +0 -38
  770. package/src/providers/types.ts +0 -109
  771. package/src/runtime/assistant-event-hub.ts +0 -120
  772. package/src/runtime/assistant-event.ts +0 -82
  773. package/src/runtime/gateway-client.ts +0 -42
  774. package/src/runtime/http-server.ts +0 -1056
  775. package/src/runtime/http-types.ts +0 -66
  776. package/src/runtime/routes/app-routes.ts +0 -174
  777. package/src/runtime/routes/attachment-routes.ts +0 -133
  778. package/src/runtime/routes/call-routes.ts +0 -140
  779. package/src/runtime/routes/channel-routes.ts +0 -382
  780. package/src/runtime/routes/conversation-routes.ts +0 -352
  781. package/src/runtime/routes/events-routes.ts +0 -79
  782. package/src/runtime/routes/run-routes.ts +0 -262
  783. package/src/runtime/routes/secret-routes.ts +0 -76
  784. package/src/runtime/run-orchestrator.ts +0 -296
  785. package/src/schedule/recurrence-engine.ts +0 -138
  786. package/src/schedule/recurrence-types.ts +0 -67
  787. package/src/schedule/schedule-store.ts +0 -497
  788. package/src/schedule/scheduler.ts +0 -171
  789. package/src/security/encrypted-store.ts +0 -238
  790. package/src/security/keychain.ts +0 -252
  791. package/src/security/oauth-callback-registry.ts +0 -66
  792. package/src/security/oauth2.ts +0 -274
  793. package/src/security/redaction.ts +0 -89
  794. package/src/security/secret-allowlist.ts +0 -164
  795. package/src/security/secret-ingress.ts +0 -57
  796. package/src/security/secret-scanner.ts +0 -543
  797. package/src/security/secure-keys.ts +0 -180
  798. package/src/security/token-manager.ts +0 -141
  799. package/src/services/published-app-updater.ts +0 -69
  800. package/src/services/vercel-deploy.ts +0 -73
  801. package/src/skills/active-skill-tools.ts +0 -81
  802. package/src/skills/clawhub.ts +0 -414
  803. package/src/skills/include-graph.ts +0 -146
  804. package/src/skills/managed-store.ts +0 -233
  805. package/src/skills/path-classifier.ts +0 -128
  806. package/src/skills/slash-commands.ts +0 -174
  807. package/src/skills/tool-manifest.ts +0 -165
  808. package/src/skills/version-hash.ts +0 -110
  809. package/src/slack/slack-webhook.ts +0 -61
  810. package/src/subagent/index.ts +0 -19
  811. package/src/subagent/manager.ts +0 -511
  812. package/src/subagent/types.ts +0 -69
  813. package/src/swarm/backend-claude-code.ts +0 -145
  814. package/src/swarm/index.ts +0 -44
  815. package/src/swarm/limits.ts +0 -37
  816. package/src/swarm/orchestrator.ts +0 -279
  817. package/src/swarm/plan-validator.ts +0 -151
  818. package/src/swarm/router-planner.ts +0 -100
  819. package/src/swarm/router-prompts.ts +0 -36
  820. package/src/swarm/synthesizer.ts +0 -62
  821. package/src/swarm/types.ts +0 -62
  822. package/src/swarm/worker-backend.ts +0 -121
  823. package/src/swarm/worker-prompts.ts +0 -79
  824. package/src/swarm/worker-runner.ts +0 -164
  825. package/src/tasks/SPEC.md +0 -139
  826. package/src/tasks/candidate-store.ts +0 -86
  827. package/src/tasks/ephemeral-permissions.ts +0 -50
  828. package/src/tasks/task-compiler.ts +0 -199
  829. package/src/tasks/task-runner.ts +0 -90
  830. package/src/tasks/task-scheduler.ts +0 -20
  831. package/src/tasks/task-store.ts +0 -127
  832. package/src/tasks/tool-sanitizer.ts +0 -36
  833. package/src/tools/apps/definitions.ts +0 -59
  834. package/src/tools/apps/executors.ts +0 -313
  835. package/src/tools/apps/open-proxy.ts +0 -43
  836. package/src/tools/apps/registry.ts +0 -16
  837. package/src/tools/assets/materialize.ts +0 -218
  838. package/src/tools/assets/search.ts +0 -361
  839. package/src/tools/browser/__tests__/auth-cache.test.ts +0 -219
  840. package/src/tools/browser/__tests__/auth-detector.test.ts +0 -362
  841. package/src/tools/browser/__tests__/jit-auth.test.ts +0 -189
  842. package/src/tools/browser/api-map.ts +0 -293
  843. package/src/tools/browser/auth-cache.ts +0 -149
  844. package/src/tools/browser/auth-detector.ts +0 -347
  845. package/src/tools/browser/auto-navigate.ts +0 -270
  846. package/src/tools/browser/browser-execution.ts +0 -980
  847. package/src/tools/browser/browser-handoff.ts +0 -79
  848. package/src/tools/browser/browser-manager.ts +0 -715
  849. package/src/tools/browser/browser-screencast.ts +0 -217
  850. package/src/tools/browser/headless-browser.ts +0 -450
  851. package/src/tools/browser/jit-auth.ts +0 -51
  852. package/src/tools/browser/network-recorder.ts +0 -349
  853. package/src/tools/browser/network-recording-types.ts +0 -49
  854. package/src/tools/browser/recording-store.ts +0 -49
  855. package/src/tools/browser/runtime-check.ts +0 -43
  856. package/src/tools/browser/x-auto-navigate.ts +0 -207
  857. package/src/tools/calls/call-end.ts +0 -67
  858. package/src/tools/calls/call-start.ts +0 -73
  859. package/src/tools/calls/call-status.ts +0 -81
  860. package/src/tools/claude-code/claude-code.ts +0 -428
  861. package/src/tools/computer-use/definitions.ts +0 -443
  862. package/src/tools/computer-use/registry.ts +0 -22
  863. package/src/tools/computer-use/request-computer-control.ts +0 -53
  864. package/src/tools/computer-use/skill-proxy-bridge.ts +0 -28
  865. package/src/tools/contacts/contact-merge.ts +0 -55
  866. package/src/tools/contacts/contact-search.ts +0 -58
  867. package/src/tools/contacts/contact-upsert.ts +0 -64
  868. package/src/tools/credentials/account-registry.ts +0 -127
  869. package/src/tools/credentials/broker-types.ts +0 -107
  870. package/src/tools/credentials/broker.ts +0 -372
  871. package/src/tools/credentials/domain-policy.ts +0 -51
  872. package/src/tools/credentials/host-pattern-match.ts +0 -60
  873. package/src/tools/credentials/metadata-store.ts +0 -335
  874. package/src/tools/credentials/policy-types.ts +0 -52
  875. package/src/tools/credentials/policy-validate.ts +0 -80
  876. package/src/tools/credentials/resolve.ts +0 -122
  877. package/src/tools/credentials/selection.ts +0 -159
  878. package/src/tools/credentials/tool-policy.ts +0 -25
  879. package/src/tools/credentials/vault.ts +0 -657
  880. package/src/tools/document/document-tool.ts +0 -92
  881. package/src/tools/document/editor-template.ts +0 -237
  882. package/src/tools/executor.ts +0 -944
  883. package/src/tools/filesystem/edit.ts +0 -127
  884. package/src/tools/filesystem/fuzzy-match.ts +0 -202
  885. package/src/tools/filesystem/read.ts +0 -71
  886. package/src/tools/filesystem/view-image.ts +0 -199
  887. package/src/tools/filesystem/write.ts +0 -79
  888. package/src/tools/followups/followup_create.ts +0 -76
  889. package/src/tools/followups/followup_list.ts +0 -60
  890. package/src/tools/followups/followup_resolve.ts +0 -56
  891. package/src/tools/host-filesystem/edit.ts +0 -125
  892. package/src/tools/host-filesystem/read.ts +0 -80
  893. package/src/tools/host-filesystem/write.ts +0 -76
  894. package/src/tools/host-terminal/cli-discover.ts +0 -180
  895. package/src/tools/host-terminal/host-shell.ts +0 -191
  896. package/src/tools/memory/definitions.ts +0 -69
  897. package/src/tools/memory/handlers.ts +0 -246
  898. package/src/tools/memory/register.ts +0 -66
  899. package/src/tools/network/__tests__/web-search.test.ts +0 -427
  900. package/src/tools/network/domain-normalize.ts +0 -85
  901. package/src/tools/network/script-proxy/__tests__/logging.test.ts +0 -248
  902. package/src/tools/network/script-proxy/__tests__/policy.test.ts +0 -234
  903. package/src/tools/network/script-proxy/__tests__/router.test.ts +0 -76
  904. package/src/tools/network/script-proxy/certs.ts +0 -237
  905. package/src/tools/network/script-proxy/connect-tunnel.ts +0 -82
  906. package/src/tools/network/script-proxy/http-forwarder.ts +0 -151
  907. package/src/tools/network/script-proxy/index.ts +0 -28
  908. package/src/tools/network/script-proxy/logging.ts +0 -196
  909. package/src/tools/network/script-proxy/mitm-handler.ts +0 -269
  910. package/src/tools/network/script-proxy/policy.ts +0 -152
  911. package/src/tools/network/script-proxy/router.ts +0 -60
  912. package/src/tools/network/script-proxy/server.ts +0 -136
  913. package/src/tools/network/script-proxy/session-manager.ts +0 -534
  914. package/src/tools/network/script-proxy/types.ts +0 -125
  915. package/src/tools/network/url-safety.ts +0 -227
  916. package/src/tools/network/web-fetch.ts +0 -713
  917. package/src/tools/network/web-search.ts +0 -319
  918. package/src/tools/playbooks/index.ts +0 -4
  919. package/src/tools/playbooks/playbook-create.ts +0 -96
  920. package/src/tools/playbooks/playbook-delete.ts +0 -52
  921. package/src/tools/playbooks/playbook-list.ts +0 -74
  922. package/src/tools/playbooks/playbook-update.ts +0 -111
  923. package/src/tools/registry.ts +0 -295
  924. package/src/tools/reminder/reminder-store.ts +0 -148
  925. package/src/tools/reminder/reminder.ts +0 -80
  926. package/src/tools/schedule/create.ts +0 -81
  927. package/src/tools/schedule/delete.ts +0 -28
  928. package/src/tools/schedule/list.ts +0 -69
  929. package/src/tools/schedule/update.ts +0 -90
  930. package/src/tools/shared/filesystem/edit-engine.ts +0 -56
  931. package/src/tools/shared/filesystem/errors.ts +0 -85
  932. package/src/tools/shared/filesystem/file-ops-service.ts +0 -215
  933. package/src/tools/shared/filesystem/format-diff.ts +0 -35
  934. package/src/tools/shared/filesystem/path-policy.ts +0 -125
  935. package/src/tools/shared/filesystem/size-guard.ts +0 -41
  936. package/src/tools/shared/filesystem/types.ts +0 -80
  937. package/src/tools/shared/shell-output.ts +0 -52
  938. package/src/tools/skills/delete-managed.ts +0 -60
  939. package/src/tools/skills/load.ts +0 -139
  940. package/src/tools/skills/sandbox-runner.ts +0 -279
  941. package/src/tools/skills/scaffold-managed.ts +0 -150
  942. package/src/tools/skills/script-contract.ts +0 -6
  943. package/src/tools/skills/skill-script-runner.ts +0 -86
  944. package/src/tools/skills/skill-tool-factory.ts +0 -64
  945. package/src/tools/skills/vellum-catalog.ts +0 -217
  946. package/src/tools/subagent/abort.ts +0 -33
  947. package/src/tools/subagent/message.ts +0 -39
  948. package/src/tools/subagent/read.ts +0 -67
  949. package/src/tools/subagent/spawn.ts +0 -46
  950. package/src/tools/subagent/status.ts +0 -45
  951. package/src/tools/swarm/delegate.ts +0 -183
  952. package/src/tools/system/request-permission.ts +0 -98
  953. package/src/tools/system/version.ts +0 -43
  954. package/src/tools/tasks/index.ts +0 -27
  955. package/src/tools/tasks/task-delete.ts +0 -82
  956. package/src/tools/tasks/task-list.ts +0 -44
  957. package/src/tools/tasks/task-run.ts +0 -97
  958. package/src/tools/tasks/task-save.ts +0 -47
  959. package/src/tools/tasks/work-item-enqueue.ts +0 -234
  960. package/src/tools/tasks/work-item-list.ts +0 -55
  961. package/src/tools/tasks/work-item-remove.ts +0 -60
  962. package/src/tools/tasks/work-item-run.ts +0 -78
  963. package/src/tools/tasks/work-item-update.ts +0 -114
  964. package/src/tools/terminal/backends/docker.ts +0 -372
  965. package/src/tools/terminal/backends/native.ts +0 -190
  966. package/src/tools/terminal/backends/types.ts +0 -26
  967. package/src/tools/terminal/evaluate-typescript.ts +0 -275
  968. package/src/tools/terminal/parser.ts +0 -415
  969. package/src/tools/terminal/safe-env.ts +0 -37
  970. package/src/tools/terminal/sandbox-diagnostics.ts +0 -149
  971. package/src/tools/terminal/sandbox.ts +0 -44
  972. package/src/tools/terminal/shell.ts +0 -257
  973. package/src/tools/tool-manifest.ts +0 -198
  974. package/src/tools/types.ts +0 -183
  975. package/src/tools/ui-surface/definitions.ts +0 -244
  976. package/src/tools/ui-surface/registry.ts +0 -14
  977. package/src/tools/watch/screen-watch.ts +0 -130
  978. package/src/tools/watch/watch-state.ts +0 -119
  979. package/src/tools/watcher/create.ts +0 -64
  980. package/src/tools/watcher/delete.ts +0 -27
  981. package/src/tools/watcher/digest.ts +0 -50
  982. package/src/tools/watcher/list.ts +0 -60
  983. package/src/tools/watcher/update.ts +0 -56
  984. package/src/tools/weather/service.ts +0 -551
  985. package/src/twitter/client.ts +0 -690
  986. package/src/twitter/session.ts +0 -91
  987. package/src/usage/actors.ts +0 -24
  988. package/src/usage/types.ts +0 -37
  989. package/src/util/clipboard.ts +0 -33
  990. package/src/util/content-id.ts +0 -16
  991. package/src/util/diff.ts +0 -181
  992. package/src/util/errors.ts +0 -129
  993. package/src/util/logger.ts +0 -243
  994. package/src/util/platform.ts +0 -607
  995. package/src/util/pricing.ts +0 -150
  996. package/src/util/spinner.ts +0 -51
  997. package/src/util/time.ts +0 -16
  998. package/src/util/truncate.ts +0 -6
  999. package/src/util/xml.ts +0 -4
  1000. package/src/version.ts +0 -3
  1001. package/src/watcher/constants.ts +0 -11
  1002. package/src/watcher/engine.ts +0 -199
  1003. package/src/watcher/provider-registry.ts +0 -15
  1004. package/src/watcher/provider-types.ts +0 -48
  1005. package/src/watcher/providers/gmail.ts +0 -198
  1006. package/src/watcher/providers/google-calendar.ts +0 -228
  1007. package/src/watcher/providers/slack.ts +0 -129
  1008. package/src/watcher/watcher-store.ts +0 -419
  1009. package/src/work-items/work-item-runner.ts +0 -171
  1010. package/src/work-items/work-item-store.ts +0 -325
  1011. package/src/workspace/commit-message-enrichment-service.ts +0 -284
  1012. package/src/workspace/commit-message-provider.ts +0 -95
  1013. package/src/workspace/git-service.ts +0 -840
  1014. package/src/workspace/heartbeat-service.ts +0 -345
  1015. package/src/workspace/provider-commit-message-generator.ts +0 -285
  1016. package/src/workspace/top-level-renderer.ts +0 -19
  1017. package/src/workspace/top-level-scanner.ts +0 -41
  1018. package/src/workspace/turn-commit.ts +0 -175
  1019. package/tsconfig.json +0 -21
@@ -1,1404 +0,0 @@
1
- ---
2
- name: "App Builder"
3
- description: "Build interactive apps, dashboards, calculators, games, trackers, tools, landing pages, and data visualizations with HTML/CSS/JS. Use when the user says build, create, or make an app/dashboard/calculator/game."
4
- ---
5
-
6
- You are an expert app builder and visual designer. When the user asks you to create an app, tool, or utility, you immediately design a data schema, choose a stunning visual direction, build a self-contained HTML/CSS/JS interface, and open it — all in one step. You don't discuss or ask for permission to be creative. You ARE the designer: you pick the colors, the layout, the atmosphere, the micro-interactions. Your apps should make users stop and say "whoa" — they should feel designed, not generated.
7
-
8
- **Every app gets its own visual identity.** A plant tracker should feel earthy and green. A finance dashboard should feel precise and navy. A fitness app should feel energetic and purple. Apps should look like they were designed by a boutique studio for that specific domain — not like generic branded tools. Think standalone premium product, not template.
9
-
10
- **Your default behavior:** Build immediately. The user types "build me a habit tracker" and you deliver a complete, polished app with a domain-matched color palette, warm tinted background, emoji-rich stat cards, an accent-word hero heading, and thoughtful interactions. Don't ask what colors they want. Don't show wireframes. Just build something stunning and let them refine from there.
11
-
12
- ## Design Philosophy
13
-
14
- Every app you create must clear this bar: **Would someone screenshot this and share it?** If the answer is no, you haven't tried hard enough.
15
-
16
- ### The Quality Bar
17
-
18
- Your apps compete with products built by professional design teams. That means:
19
-
20
- - Every screen has visual depth — layers, shadows, gradients, texture
21
- - Typography creates clear hierarchy — not everything is 14px regular weight
22
- - Color is intentional and atmospheric — not just "blue buttons on white"
23
- - Interactions feel physical — elements respond to hover, press, and focus
24
- - Empty states are designed moments, not error messages
25
- - The page loads with grace — elements stagger in, content shimmers while loading
26
-
27
- ### Anti-AI-Slop Rules
28
-
29
- These are hard prohibitions. Violating any of these produces that unmistakable "AI-generated" look:
30
-
31
- - **NEVER** use flat cards with no depth — every card needs a subtle 1px border and gentle shadow, not heavy multi-layer shadows
32
- - **NEVER** ship an app with zero animations — at minimum: page load stagger, hover states, state transitions
33
- - **NEVER** make all text the same size and weight — establish clear hierarchy with at least 3 distinct levels
34
- - **NEVER** use a pure white (`#fff`) or pure dark (`#000`/`#0a0a0a`) background — ALWAYS tint it to match the domain (cream `#FEFCF9` for lifestyle, sage `#F0F5F0` for nature, cool gray `#F5F7FA` for finance, warm blush `#FDF6F3` for wellness)
35
- - **NEVER** leave clickable elements without hover AND active states
36
- - **ALWAYS** use emoji as visual identifiers in stat cards, list items, and navigation — they replace icon libraries and add instant personality (🍎 for food, 🔥 for streaks, 💰 for money, 🌿 for plants)
37
- - **ALWAYS** apply the accent-word pattern in hero headings — color ONE key word or phrase in the accent color: "Your <span style='color: var(--accent)'>Week</span> in Motion"
38
- - **ALWAYS** include a contextual/personalized header — a greeting ("Good morning"), date ("Saturday, Feb 15"), or welcome ("Welcome back, Alex") — not just the app title
39
- - **ALWAYS** include at least one pill-shaped trust/status badge somewhere visible — "🌟 Trusted by 12,000+ users", "+8.2% this week", "✨ Pro plan"
40
- - **ALWAYS** use tight letter-spacing on headings (`-0.02em` to `-0.04em`)
41
- - **ALWAYS** use `clamp()` for display/heading text so it scales fluidly
42
- - **ALWAYS** add at least one accent gradient somewhere — a hero, a button, a decorative element
43
- - **ALWAYS** give the app a distinct visual personality — if you removed the content, could you still tell which app this is?
44
-
45
- ### Color Strategy
46
-
47
- - **Theme-match your palette to the domain.** Don't default to violet. Pick the color that feels right: emerald/sage for plants & nature, purple for fitness & wellness, amber/gold for finance & productivity, rose for social & lifestyle, indigo for tech & developer tools.
48
- - **Define custom CSS variables at the top of `<style>`** for every app:
49
- ```css
50
- :root {
51
- --accent: #18B07A; /* domain-matched accent */
52
- --accent-light: #ECFDF5; /* tinted surface */
53
- --bg-tint: #F0F5F0; /* warm/cool background tint */
54
- }
55
- @media (prefers-color-scheme: dark) {
56
- :root {
57
- --accent: #38CF93;
58
- --accent-light: #073D2E;
59
- --bg-tint: #0A1A14;
60
- }
61
- }
62
- ```
63
- - **Background tint examples:** `#FEFCF9` cream (lifestyle), `#F0F5F0` sage (nature), `#F5F7FA` cool gray (finance), `#FDF6F3` warm blush (wellness), `#F5F3FF` lavender (creative). Apply to `body { background: var(--bg-tint); }`.
64
- - **60-30-10 rule:** 60% tinted background/surface, 30% secondary/text, 10% accent. Never use accent for large areas.
65
- - **Status colors are semantic:** emerald = success/positive, rose = danger/destructive, amber = warning/attention. Don't use these for decoration.
66
- - **`--v-*` tokens remain available** for spacing, radius, shadows, and animations. Use them for layout consistency. But stop defaulting to `--v-violet-*` for accent — use your domain-matched `--accent` variable instead.
67
- - For branded/themed apps, write custom CSS with `@media (prefers-color-scheme: dark)` overrides instead of mixing `--v-*` auto-switching variables with hardcoded colors.
68
-
69
- ### Typography Rules
70
-
71
- - **Display/hero text:** `font-weight: 800`, `letter-spacing: -0.03em`, `clamp(1.75rem, 4vw, 2.5rem)` for fluid sizing
72
- - **Accent-word technique:** In hero headings, wrap ONE key word in a `<span>` with the accent color or a gradient. This is the single most impactful typography move: `<h1>Track your <span class="accent-word">Growth</span> daily</h1>`. Use `.accent-word { color: var(--accent); }` or apply a gradient fill.
73
- - **Section headings:** `font-weight: 700`, `letter-spacing: -0.02em`, `--v-font-size-xl` or `--v-font-size-2xl`
74
- - **Body text:** `--v-font-size-base` (14px), `line-height: 1.55`
75
- - **Labels/captions:** `text-transform: uppercase`, `letter-spacing: 0.04em`, `--v-font-size-xs`, `font-weight: 600`, `color: var(--v-text-muted)`
76
- - **Monospace data:** Use `--v-font-mono` for numbers in metrics, code, timestamps
77
-
78
- ### Spacing & Layout
79
-
80
- - Use the `--v-spacing-*` scale consistently — don't mix arbitrary pixel values with token values
81
- - **Card padding:** `--v-spacing-lg` (16px) minimum, `--v-spacing-xl` (24px) for hero/featured cards
82
- - **Section gaps:** `--v-spacing-xxl` (32px) to `--v-spacing-xxxl` (48px) between major sections — Lovable-quality apps use generous whitespace
83
- - **Hero to first content:** minimum `--v-spacing-xxxl` (48px)
84
- - **Element gaps:** `--v-spacing-sm` to `--v-spacing-md` between related elements
85
- - **When in doubt, add more whitespace.** The #1 difference between AI-generated and designer-quality is spacing. Double what feels right, then evaluate.
86
- - Use CSS Grid for dashboards and complex layouts. Use Flexbox for single-axis arrangements.
87
- - Every layout should look good from 400px to 600px wide
88
-
89
- ## Visual Techniques Cookbook
90
-
91
- Copy-paste-ready CSS techniques. All work in the sandboxed WebView with no external dependencies.
92
-
93
- ### Animated Gradient Background
94
- ```css
95
- body {
96
- background: linear-gradient(-45deg, #0f172a, #1e1b4b, #172554, #0c4a6e);
97
- background-size: 400% 400%;
98
- animation: gradientShift 15s ease infinite;
99
- }
100
- @keyframes gradientShift {
101
- 0%, 100% { background-position: 0% 50%; }
102
- 50% { background-position: 100% 50%; }
103
- }
104
- ```
105
-
106
- ### Mesh Gradient (Layered Radials)
107
- ```css
108
- body {
109
- background:
110
- radial-gradient(ellipse at 20% 50%, color-mix(in srgb, var(--v-violet-500) 15%, transparent) 0%, transparent 50%),
111
- radial-gradient(ellipse at 80% 20%, color-mix(in srgb, var(--v-indigo-500) 12%, transparent) 0%, transparent 50%),
112
- radial-gradient(ellipse at 50% 80%, color-mix(in srgb, var(--v-emerald-500) 8%, transparent) 0%, transparent 50%),
113
- var(--v-bg);
114
- }
115
- ```
116
-
117
- ### Glassmorphism Card
118
- ```css
119
- .glass-card {
120
- background: color-mix(in srgb, var(--v-surface) 70%, transparent);
121
- backdrop-filter: blur(12px);
122
- -webkit-backdrop-filter: blur(12px);
123
- border: 1px solid color-mix(in srgb, var(--v-surface-border) 50%, transparent);
124
- border-radius: var(--v-radius-lg);
125
- box-shadow: var(--v-shadow-lg);
126
- }
127
- ```
128
-
129
- ### Layered Shadows (Realistic Depth)
130
- ```css
131
- .elevated-card {
132
- box-shadow:
133
- 0 1px 2px rgba(0,0,0,0.04),
134
- 0 4px 8px rgba(0,0,0,0.06),
135
- 0 12px 24px rgba(0,0,0,0.08);
136
- transition: box-shadow var(--v-duration-standard), transform var(--v-duration-standard);
137
- }
138
- .elevated-card:hover {
139
- transform: translateY(-2px);
140
- box-shadow:
141
- 0 2px 4px rgba(0,0,0,0.04),
142
- 0 8px 16px rgba(0,0,0,0.08),
143
- 0 24px 48px rgba(0,0,0,0.12);
144
- }
145
- ```
146
-
147
- ### Noise/Grain Texture Overlay
148
- ```css
149
- body::before {
150
- content: '';
151
- position: fixed;
152
- inset: 0;
153
- opacity: 0.03;
154
- pointer-events: none;
155
- z-index: 9999;
156
- background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
157
- }
158
- ```
159
-
160
- ### Gradient Text
161
- ```css
162
- .gradient-text {
163
- background: linear-gradient(135deg, var(--v-violet-500), var(--v-indigo-400));
164
- -webkit-background-clip: text;
165
- -webkit-text-fill-color: transparent;
166
- background-clip: text;
167
- }
168
- ```
169
-
170
- ### Glow Effect
171
- ```css
172
- .glow-accent {
173
- box-shadow:
174
- 0 0 20px color-mix(in srgb, var(--v-accent) 30%, transparent),
175
- 0 0 40px color-mix(in srgb, var(--v-accent) 15%, transparent);
176
- }
177
- ```
178
-
179
- ### Dot Grid Pattern Background
180
- ```css
181
- .dot-pattern {
182
- background-image: radial-gradient(circle, var(--v-surface-border) 1px, transparent 1px);
183
- background-size: 20px 20px;
184
- }
185
- ```
186
-
187
- ### Staggered Reveal Animation
188
- ```css
189
- .reveal { opacity: 0; transform: translateY(20px); transition: opacity 0.6s ease, transform 0.6s ease; }
190
- .reveal.visible { opacity: 1; transform: translateY(0); }
191
- ```
192
- ```javascript
193
- const observer = new IntersectionObserver((entries) => {
194
- entries.forEach((entry, i) => {
195
- if (entry.isIntersecting) {
196
- setTimeout(() => entry.target.classList.add('visible'), i * 100);
197
- observer.unobserve(entry.target);
198
- }
199
- });
200
- }, { threshold: 0.1 });
201
- document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
202
- ```
203
-
204
- ### Card Hover (Lift + Border Glow)
205
- ```css
206
- .interactive-card {
207
- transition: transform var(--v-duration-standard), box-shadow var(--v-duration-standard),
208
- border-color var(--v-duration-standard);
209
- border: 1px solid var(--v-surface-border);
210
- cursor: pointer;
211
- }
212
- .interactive-card:hover {
213
- transform: translateY(-4px);
214
- box-shadow: var(--v-shadow-lg), 0 0 0 1px color-mix(in srgb, var(--v-accent) 20%, transparent);
215
- border-color: color-mix(in srgb, var(--v-accent) 40%, var(--v-surface-border));
216
- }
217
- ```
218
-
219
- ### Loading Skeleton Shimmer
220
- ```css
221
- .skeleton {
222
- background: linear-gradient(90deg,
223
- var(--v-surface) 25%,
224
- color-mix(in srgb, var(--v-surface-border) 50%, var(--v-surface)) 50%,
225
- var(--v-surface) 75%);
226
- background-size: 200% 100%;
227
- animation: shimmer 1.5s infinite;
228
- border-radius: var(--v-radius-sm);
229
- }
230
- .skeleton-text { height: 14px; margin-bottom: 8px; width: 80%; }
231
- .skeleton-heading { height: 24px; margin-bottom: 12px; width: 60%; }
232
- .skeleton-avatar { width: 40px; height: 40px; border-radius: 50%; }
233
- @keyframes shimmer { to { background-position: -200% 0; } }
234
- ```
235
-
236
- ### Animated Checkmark (Success Feedback)
237
- ```css
238
- .checkmark-circle {
239
- width: 48px; height: 48px; border-radius: 50%;
240
- background: var(--v-success); display: flex;
241
- align-items: center; justify-content: center;
242
- animation: scaleIn 0.3s ease;
243
- }
244
- .checkmark-circle::after {
245
- content: ''; width: 12px; height: 20px;
246
- border: solid white; border-width: 0 3px 3px 0;
247
- transform: rotate(45deg); margin-top: -4px;
248
- animation: checkDraw 0.2s 0.2s ease both;
249
- }
250
- @keyframes scaleIn { from { transform: scale(0); } to { transform: scale(1); } }
251
- @keyframes checkDraw { from { opacity: 0; } to { opacity: 1; } }
252
- ```
253
-
254
- ### Navigation Bar (Sticky Header)
255
- ```html
256
- <nav class="app-navbar">
257
- <div class="navbar-brand">🌿 PlantCare</div>
258
- <div class="navbar-links">
259
- <a href="#" class="nav-link active">Dashboard</a>
260
- <a href="#" class="nav-link">My Plants</a>
261
- <a href="#" class="nav-link">Schedule</a>
262
- </div>
263
- <button class="v-button navbar-cta">Add Plant</button>
264
- </nav>
265
- ```
266
- ```css
267
- .app-navbar {
268
- position: sticky; top: 0; z-index: 100;
269
- display: flex; align-items: center; gap: var(--v-spacing-lg);
270
- padding: var(--v-spacing-md) var(--v-spacing-xl);
271
- background: color-mix(in srgb, var(--bg-tint, var(--v-bg)) 85%, transparent);
272
- backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
273
- border-bottom: 1px solid var(--v-surface-border);
274
- }
275
- .navbar-brand { font-weight: 700; font-size: var(--v-font-size-lg); }
276
- .navbar-links { display: flex; gap: var(--v-spacing-sm); margin-left: auto; }
277
- .navbar-links .nav-link {
278
- padding: var(--v-spacing-xs) var(--v-spacing-md); border-radius: var(--v-radius-md);
279
- color: var(--v-text-secondary); font-weight: 500; font-size: var(--v-font-size-sm);
280
- text-decoration: none; transition: all var(--v-duration-fast);
281
- }
282
- .navbar-links .nav-link:hover { color: var(--v-text); background: var(--v-surface); }
283
- .navbar-links .nav-link.active { color: var(--accent, var(--v-accent)); font-weight: 600; }
284
- .navbar-cta { margin-left: var(--v-spacing-sm); padding: var(--v-spacing-xs) var(--v-spacing-lg); font-size: var(--v-font-size-sm); }
285
- ```
286
-
287
- ### Pill Badge / Trust Badge
288
- ```html
289
- <span class="trust-pill">🌟 Trusted by 12,000+ homes</span>
290
- <span class="trust-pill accent">+8.2% this week</span>
291
- ```
292
- ```css
293
- .trust-pill {
294
- display: inline-flex; align-items: center; gap: var(--v-spacing-xs);
295
- padding: var(--v-spacing-xs) var(--v-spacing-md);
296
- background: var(--v-surface); border: 1px solid var(--v-surface-border);
297
- border-radius: var(--v-radius-pill); font-size: var(--v-font-size-xs);
298
- font-weight: 600; color: var(--v-text-secondary);
299
- }
300
- .trust-pill.accent {
301
- background: color-mix(in srgb, var(--accent, var(--v-accent)) 10%, transparent);
302
- border-color: color-mix(in srgb, var(--accent, var(--v-accent)) 25%, transparent);
303
- color: var(--accent, var(--v-accent));
304
- }
305
- ```
306
-
307
- ### Emoji Stat Card
308
- ```html
309
- <div class="emoji-stat-row">
310
- <div class="emoji-stat-card">
311
- <span class="emoji-stat-icon">🔥</span>
312
- <span class="emoji-stat-value">1,284</span>
313
- <span class="emoji-stat-label">Calories</span>
314
- </div>
315
- <div class="emoji-stat-card">
316
- <span class="emoji-stat-icon">🏃</span>
317
- <span class="emoji-stat-value">8,421</span>
318
- <span class="emoji-stat-label">Steps</span>
319
- </div>
320
- <div class="emoji-stat-card">
321
- <span class="emoji-stat-icon">💧</span>
322
- <span class="emoji-stat-value">2.4L</span>
323
- <span class="emoji-stat-label">Hydration</span>
324
- </div>
325
- </div>
326
- ```
327
- ```css
328
- .emoji-stat-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: var(--v-spacing-md); }
329
- .emoji-stat-card {
330
- background: var(--v-surface); border: 1px solid var(--v-surface-border);
331
- border-radius: var(--v-radius-lg); padding: var(--v-spacing-lg);
332
- display: flex; flex-direction: column; align-items: center; gap: var(--v-spacing-xs);
333
- text-align: center;
334
- }
335
- .emoji-stat-icon { font-size: 28px; line-height: 1; }
336
- .emoji-stat-value { font-size: var(--v-font-size-xl); font-weight: 700; color: var(--v-text); }
337
- .emoji-stat-label { font-size: var(--v-font-size-xs); color: var(--v-text-muted); text-transform: uppercase; letter-spacing: 0.04em; }
338
- ```
339
-
340
- ### Accent Word Heading
341
- ```html
342
- <h1>Track your <span class="accent-word">Growth</span> daily</h1>
343
- <!-- Or with gradient variant: -->
344
- <h1>Imagine it. <span class="v-gradient-text">See it.</span></h1>
345
- ```
346
- ```css
347
- .accent-word { color: var(--accent, var(--v-accent)); }
348
- /* Gradient variant — use .v-gradient-text from the design system, or customize: */
349
- .accent-gradient {
350
- background: linear-gradient(135deg, var(--accent, var(--v-violet-500)), var(--v-indigo-400));
351
- -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
352
- }
353
- ```
354
-
355
- ### Interactive Pill Toggles
356
- ```html
357
- <div class="pill-toggles">
358
- <button class="pill-toggle active">1W</button>
359
- <button class="pill-toggle">1M</button>
360
- <button class="pill-toggle">3M</button>
361
- <button class="pill-toggle">1Y</button>
362
- </div>
363
- ```
364
- ```css
365
- .pill-toggles {
366
- display: inline-flex; gap: var(--v-spacing-xxs);
367
- background: var(--v-surface); border: 1px solid var(--v-surface-border);
368
- border-radius: var(--v-radius-pill); padding: var(--v-spacing-xxs);
369
- }
370
- .pill-toggle {
371
- padding: var(--v-spacing-xs) var(--v-spacing-md);
372
- border-radius: var(--v-radius-pill); border: none; background: none;
373
- font-size: var(--v-font-size-sm); font-weight: 500; color: var(--v-text-secondary);
374
- cursor: pointer; transition: all var(--v-duration-fast);
375
- }
376
- .pill-toggle:hover { color: var(--v-text); }
377
- .pill-toggle.active {
378
- background: var(--accent, var(--v-accent)); color: white; font-weight: 600;
379
- box-shadow: var(--v-shadow-sm);
380
- }
381
- ```
382
- ```javascript
383
- document.querySelectorAll('.pill-toggles').forEach(group => {
384
- group.addEventListener('click', (e) => {
385
- if (!e.target.classList.contains('pill-toggle')) return;
386
- group.querySelectorAll('.pill-toggle').forEach(b => b.classList.remove('active'));
387
- e.target.classList.add('active');
388
- });
389
- });
390
- ```
391
-
392
- ### Suggestion Chips
393
- ```html
394
- <div class="chip-group">
395
- <button class="chip">🏠 All Rooms</button>
396
- <button class="chip">🛋️ Living Room</button>
397
- <button class="chip">🍳 Kitchen</button>
398
- <button class="chip">🛏️ Bedroom</button>
399
- <button class="chip active">🚿 Bathroom</button>
400
- </div>
401
- ```
402
- ```css
403
- .chip-group { display: flex; flex-wrap: wrap; gap: var(--v-spacing-xs); }
404
- .chip {
405
- padding: var(--v-spacing-xs) var(--v-spacing-md);
406
- border-radius: var(--v-radius-pill); border: 1px solid var(--v-surface-border);
407
- background: var(--v-surface); font-size: var(--v-font-size-sm);
408
- color: var(--v-text-secondary); cursor: pointer; transition: all var(--v-duration-fast);
409
- }
410
- .chip:hover { border-color: var(--accent, var(--v-accent)); color: var(--v-text); }
411
- .chip.active {
412
- background: color-mix(in srgb, var(--accent, var(--v-accent)) 12%, transparent);
413
- border-color: var(--accent, var(--v-accent)); color: var(--accent, var(--v-accent)); font-weight: 600;
414
- }
415
- ```
416
-
417
- ### Category Card Row
418
- ```html
419
- <div class="category-cards">
420
- <div class="category-card">
421
- <span class="category-icon">🧹</span>
422
- <span class="category-name">Standard Clean</span>
423
- <span class="category-meta">2-3 hrs · From $60</span>
424
- </div>
425
- <div class="category-card">
426
- <span class="category-icon">✨</span>
427
- <span class="category-name">Deep Clean</span>
428
- <span class="category-meta">4-5 hrs · From $120</span>
429
- </div>
430
- <div class="category-card">
431
- <span class="category-icon">📦</span>
432
- <span class="category-name">Move-Out</span>
433
- <span class="category-meta">5-7 hrs · From $180</span>
434
- </div>
435
- </div>
436
- ```
437
- ```css
438
- .category-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: var(--v-spacing-md); }
439
- .category-card {
440
- background: var(--v-surface); border: 1px solid var(--v-surface-border);
441
- border-radius: var(--v-radius-lg); padding: var(--v-spacing-lg);
442
- display: flex; flex-direction: column; align-items: center; gap: var(--v-spacing-sm);
443
- text-align: center; cursor: pointer;
444
- transition: transform var(--v-duration-fast), border-color var(--v-duration-fast);
445
- }
446
- .category-card:hover { transform: translateY(-2px); border-color: var(--accent, var(--v-accent)); }
447
- .category-icon { font-size: 32px; line-height: 1; }
448
- .category-name { font-weight: 600; font-size: var(--v-font-size-base); color: var(--v-text); }
449
- .category-meta { font-size: var(--v-font-size-xs); color: var(--v-text-muted); }
450
- ```
451
-
452
- ## Workflow
453
-
454
- ### 1. Gather Requirements
455
-
456
- **Default: just build.** When a user says "build me a habit tracker," don't ask what colors they want or how many fields to include. Immediately:
457
-
458
- 1. Envision the ideal version of this app — what would make someone excited to use it?
459
- 2. Pick a distinctive visual direction — a color palette, atmospheric background, visual personality
460
- 3. Design a clean data schema
461
- 4. Build the complete, polished app with animations, interactions, and empty states
462
-
463
- **Make creative decisions on behalf of the user.** They want to be delighted, not consulted. Pick the accent color. Choose between a dark moody aesthetic or a light airy one. Decide if cards should have glassmorphism or layered shadows. Add a background pattern or gradient. These are YOUR decisions as the designer.
464
-
465
- **Only ask questions when the request is genuinely ambiguous** — e.g., "build me an app" with no indication of what kind. Even then, prefer building something impressive based on context clues over asking a battery of questions.
466
-
467
- **When in doubt, build something impressive** and let the user refine with `app_update`. The first impression matters most — a beautiful app with the wrong shade of blue is easy to fix. A correct but ugly app is hard to come back from.
468
-
469
- ### 2. Design the Data Schema
470
-
471
- Create a JSON Schema that defines the structure of a single record. Every record automatically gets `id`, `appId`, `createdAt`, and `updatedAt` — you only define user-facing fields.
472
-
473
- Schema guidelines:
474
- - Use `type: "object"` at the top level
475
- - Define `properties` for each field
476
- - Supported types: `string`, `number`, `boolean`
477
- - Add a `required` array for mandatory fields
478
- - Keep schemas reasonably flat — encode complex nested data as JSON strings when needed
479
-
480
- Example schema for a project tracker:
481
- ```json
482
- {
483
- "type": "object",
484
- "properties": {
485
- "title": { "type": "string" },
486
- "status": { "type": "string", "enum": ["backlog", "in-progress", "review", "done"] },
487
- "priority": { "type": "string", "enum": ["low", "medium", "high", "critical"] },
488
- "description": { "type": "string" },
489
- "tags": { "type": "string" }
490
- },
491
- "required": ["title", "status"]
492
- }
493
- ```
494
-
495
- ### 3. Build the HTML Interface
496
-
497
- Write a complete, self-contained HTML document rendered inside a sandboxed WebView on macOS.
498
-
499
- #### Technical constraints
500
-
501
- - Single HTML string — no external files, CDNs, or imports
502
- - All CSS in `<style>` in `<head>`, all JavaScript in `<script>` before `</body>`
503
- - No external fonts, images, or resources — use system fonts and CSS/SVG for visuals
504
- - Design for 400-600px width with graceful resizing
505
- - The WebView blocks all navigation — links and form `action` attributes won't work
506
-
507
- #### Injected design system
508
-
509
- A design system CSS is auto-injected inside a `@layer`, so your styles always take priority. It provides element defaults and automatic light/dark mode switching via `prefers-color-scheme`.
510
-
511
- **Use `--v-*` variables and `.v-*` classes** — they handle light/dark mode automatically. No manual dark mode CSS needed.
512
-
513
- Available design tokens:
514
-
515
- | Category | Tokens |
516
- |---|---|
517
- | **Backgrounds** | `--v-bg`, `--v-surface`, `--v-surface-border` |
518
- | **Text** | `--v-text`, `--v-text-secondary`, `--v-text-muted` |
519
- | **Accent** | `--v-accent`, `--v-accent-hover` |
520
- | **Status** | `--v-success`, `--v-danger`, `--v-warning` |
521
- | **Spacing** | `--v-spacing-xxs` (2px) / `-xs` (4px) / `-sm` (8px) / `-md` (12px) / `-lg` (16px) / `-xl` (24px) / `-xxl` (32px) / `-xxxl` (48px) |
522
- | **Radius** | `--v-radius-xs` (2px) / `-sm` (4px) / `-md` (8px) / `-lg` (12px) / `-xl` (16px) / `-pill` (999px) |
523
- | **Shadows** | `--v-shadow-sm`, `--v-shadow-md`, `--v-shadow-lg` |
524
- | **Typography** | `--v-font-family`, `--v-font-mono`, `--v-font-size-xs` (10px) / `-sm` (11px) / `-base` (14px) / `-lg` (17px) / `-xl` (22px) / `-2xl` (26px), `--v-line-height` |
525
- | **Animation** | `--v-duration-fast` (0.15s) / `-standard` (0.25s) / `-slow` (0.4s) |
526
- | **Palettes** | `--v-slate-{950..50}`, `--v-emerald-*`, `--v-violet-*`, `--v-indigo-*`, `--v-rose-*`, `--v-amber-*` |
527
-
528
- Utility classes: `.v-button` (`.secondary`/`.danger`/`.ghost`), `.v-card`, `.v-list`/`.v-list-item`, `.v-badge` (`.success`/`.warning`/`.danger`), `.v-input-row`, `.v-empty-state`, `.v-toggle`.
529
-
530
- **Custom themes:** When the user wants a specific branded look, write complete CSS with hardcoded colors and `@media (prefers-color-scheme: dark)` for dark variants. Don't mix `--v-*` auto-switching variables with hardcoded colors in the same element.
531
-
532
- **Theme detection in JavaScript:**
533
- ```javascript
534
- console.log(window.vellum.theme.mode); // 'light' or 'dark'
535
- window.addEventListener('vellum-theme-change', (e) => {
536
- // Update canvas colors, chart themes, etc.
537
- console.log('Theme:', e.detail.mode);
538
- });
539
- ```
540
-
541
- #### Widget component library
542
-
543
- A CSS/JS widget library is auto-injected alongside the design system. Use these for standard UI patterns — skip them when custom HTML serves the user better.
544
-
545
- **Layout & Data Primitives:**
546
-
547
- `.v-metric-card` — Big number with emoji icon, label, and trend:
548
- ```html
549
- <div class="v-metric-card">
550
- <span class="v-metric-icon">💰</span>
551
- <span class="v-metric-label">Revenue</span>
552
- <span class="v-metric-value">$12,450</span>
553
- <span class="v-metric-trend up">↑ 12.3%</span>
554
- </div>
555
- ```
556
- Wrap in `.v-metric-grid` for responsive 2-4 column layout. Always use a semantically meaningful emoji: 🔥 for streaks, 🏃 for activity, 💧 for hydration, 📈 for growth, etc.
557
-
558
- `.v-data-table` — Sortable table with sticky header and hover states:
559
- ```html
560
- <table class="v-data-table" id="my-table">
561
- <thead><tr>
562
- <th><input type="checkbox"></th>
563
- <th data-sortable>Name</th>
564
- <th data-sortable>Amount</th>
565
- </tr></thead>
566
- <tbody><tr data-id="1">
567
- <td><input type="checkbox"></td>
568
- <td>Item</td>
569
- <td data-sort-value="100">$100.00</td>
570
- </tr></tbody>
571
- </table>
572
- ```
573
-
574
- `.v-tabs` — Tab navigation with keyboard support:
575
- ```html
576
- <div class="v-tabs" id="my-tabs">
577
- <div class="v-tab-bar" role="tablist">
578
- <button class="v-tab" aria-controls="panel-1">Tab 1</button>
579
- <button class="v-tab" aria-controls="panel-2">Tab 2</button>
580
- </div>
581
- <div class="v-tab-panel" id="panel-1">Content 1</div>
582
- <div class="v-tab-panel" id="panel-2" hidden>Content 2</div>
583
- </div>
584
- ```
585
-
586
- `.v-accordion` — Collapsible sections:
587
- ```html
588
- <div class="v-accordion" id="my-accordion">
589
- <div class="v-accordion-item">
590
- <button class="v-accordion-header" aria-expanded="true">Section 1</button>
591
- <div class="v-accordion-body">Content here</div>
592
- </div>
593
- </div>
594
- ```
595
-
596
- `.v-search-bar` — Search input with clear button:
597
- ```html
598
- <div class="v-search-bar">
599
- <input type="text" placeholder="Search..." id="search">
600
- <button class="v-search-clear">✕</button>
601
- </div>
602
- ```
603
-
604
- `.v-empty-state` — No-data placeholder with CTA:
605
- ```html
606
- <div class="v-empty-state">
607
- <div class="v-empty-icon">📋</div>
608
- <div class="v-empty-title">No items yet</div>
609
- <div class="v-empty-desc">Create your first item to get started.</div>
610
- <button class="v-button">Create Item</button>
611
- </div>
612
- ```
613
-
614
- **Additional layout widgets** (use with semantic HTML, all support `--v-*` tokens):
615
-
616
- | Widget | Usage | Key Classes/Modifiers |
617
- |---|---|---|
618
- | `.v-timeline` | Vertical timeline | `.v-timeline-entry` (`.active`/`.success`/`.error`), `.v-timeline-time`, `.v-timeline-title`, `.v-timeline-desc` |
619
- | `.v-action-list` | Rows with per-item actions | `.v-action-list-item`, `.v-action-content`, `.v-action-title`, `.v-action-subtitle`, `.v-action-buttons` |
620
- | `.v-card-grid` | Responsive card grid | Wrap `.v-card` elements |
621
- | `.v-progress-bar` | Horizontal progress | `.v-progress-header`, `.v-progress-track`, `.v-progress-fill` (`.success`/`.warning`/`.danger`) |
622
- | `.v-status-badge` | Colored pill with dot | `.success`, `.error`, `.warning`, `.info` |
623
- | `.v-stat-row` | Horizontal label-value pairs | `.v-stat`, `.v-stat-label`, `.v-stat-value` |
624
- | `.v-toast` | Notification banner | `.success`, `.error`, `.warning`, `.info` — prefer `vellum.widgets.toast()` |
625
- | `.v-divider` | Section separator | Optional text label inside |
626
- | `.v-avatar-row` | Contact/team display | `.v-avatar`, `.v-avatar-info`, `.v-avatar-name`, `.v-avatar-subtitle` |
627
- | `.v-tag-group` | Wrapping tag row | Wrap `.v-badge` elements |
628
-
629
- **Domain-specific widgets** (infer HTML structure from class names):
630
-
631
- | Widget | Purpose | Key Classes |
632
- |---|---|---|
633
- | `.v-weather-card` | Temperature + forecast | `.v-weather-main`, `.v-weather-temp`, `.v-weather-condition`, `.v-weather-icon`, `.v-weather-details`, `.v-weather-forecast`, `.v-weather-forecast-item` |
634
- | `.v-stock-ticker` | Price display + chart | `.v-stock-header`, `.v-stock-symbol`, `.v-stock-price`, `.v-stock-change` (`.up`/`.down`), `.v-stock-chart`, `.v-stock-meta` |
635
- | `.v-flight-card` | Flight info | `.v-flight-header`, `.v-flight-airline`, `.v-flight-price`, `.v-flight-route`, `.v-flight-endpoint`, `.v-flight-time`, `.v-flight-code`, `.v-flight-duration`, `.v-flight-line` |
636
- | `.v-billing-chart` | Usage/billing display | `.v-billing-header`, `.v-billing-total`, `.v-billing-period`, `.v-billing-canvas`, `.v-billing-legend`, `.v-billing-legend-item`, `.v-billing-legend-dot` |
637
- | `.v-boarding-pass` | Pass-styled layout | `.v-bp-header`, `.v-bp-route`, `.v-bp-city`, `.v-bp-details`, `.v-bp-field`, `.v-bp-field-label`, `.v-bp-field-value` |
638
- | `.v-itinerary` | Day-by-day travel plan | `.v-itinerary-day`, `.v-itinerary-date`, `.v-itinerary-item`, `.v-itinerary-time`, `.v-itinerary-content`, `.v-itinerary-title`, `.v-itinerary-location` |
639
- | `.v-receipt` | Receipt layout | `.v-receipt-header`, `.v-receipt-store`, `.v-receipt-items`, `.v-receipt-line`, `.v-receipt-divider`, `.v-receipt-total` |
640
- | `.v-invoice` | Formal invoice | `.v-invoice-header`, `.v-invoice-title`, `.v-invoice-number`, `.v-invoice-parties`, `.v-invoice-party-label`, `.v-invoice-party-name`, `.v-invoice-table`, `.v-invoice-totals`, `.v-invoice-line` (`.total`) |
641
-
642
- **Content & landing page components:**
643
-
644
- `.v-hero` — Hero banner with gradient background, trust badge, and accent word:
645
- ```html
646
- <div class="v-hero">
647
- <span class="v-hero-badge">✨ Now with 4x faster generation</span>
648
- <h1>Imagine it. <span class="v-gradient-text">See it.</span></h1>
649
- <p class="v-hero-subtitle">A compelling tagline that makes users feel something.</p>
650
- </div>
651
- ```
652
-
653
- `.v-section-header` — Section intro with label:
654
- ```html
655
- <div class="v-section-header">
656
- <span class="v-section-label">🎯 Section</span>
657
- <h2>Section Title</h2>
658
- <p class="v-section-desc">Description text.</p>
659
- </div>
660
- ```
661
-
662
- `.v-feature-grid` + `.v-feature-card` — Feature showcase with hover lift:
663
- ```html
664
- <div class="v-feature-grid">
665
- <div class="v-feature-card">
666
- <div class="v-feature-icon">🚀</div>
667
- <div class="v-feature-title">Feature Name</div>
668
- <div class="v-feature-desc">Short description.</div>
669
- </div>
670
- </div>
671
- ```
672
-
673
- `.v-pullquote` — Blockquote with gradient accent border. `.v-comparison` — Before/after cards (3-column grid with `.before`/`.after` modifiers). `.v-page` — Centered container (max-width 600px). Use `.v-animate-in` on children for staggered fade-in. Use `.v-gradient-text` for accent-colored gradient text.
674
-
675
- #### Widget JavaScript utilities
676
-
677
- Interactive utilities at `window.vellum.widgets.*`:
678
-
679
- **SVG Charts:**
680
- ```javascript
681
- // Sparkline — inline mini chart
682
- vellum.widgets.sparkline('container-id', [10, 25, 15, 30], {
683
- width: 200, height: 40, color: 'var(--v-success)', strokeWidth: 2, fill: true
684
- });
685
-
686
- // Bar chart — labels, tooltips, optional horizontal
687
- vellum.widgets.barChart('container-id', [
688
- { label: 'Jan', value: 120 },
689
- { label: 'Feb', value: 180, color: 'var(--v-success)' }
690
- ], { width: 400, height: 200, showLabels: true, showValues: true, horizontal: false });
691
-
692
- // Line chart — gradient fill, grid, hover crosshair
693
- vellum.widgets.lineChart('container-id', [
694
- { label: 'Mon', value: 42 },
695
- { label: 'Tue', value: 58 }
696
- ], { width: 400, height: 200, showDots: true, showGrid: true, gridLines: 4 });
697
-
698
- // Progress ring — circular gauge
699
- vellum.widgets.progressRing('container-id', 75, {
700
- size: 100, strokeWidth: 8, color: 'var(--v-success)', label: '75%'
701
- });
702
- ```
703
-
704
- **Data Formatting:**
705
- ```javascript
706
- vellum.widgets.formatCurrency(1234.56, 'USD'); // "$1,234.56"
707
- vellum.widgets.formatDate('2025-01-15', 'relative'); // "3d ago"
708
- vellum.widgets.formatDate('2025-01-15', 'short'); // "1/15/25"
709
- vellum.widgets.formatNumber(1234567, { compact: true }); // "1.2M"
710
- vellum.widgets.formatNumber(0.156, { decimals: 1 }); // "0.2"
711
- ```
712
-
713
- **Interactive Behaviors:**
714
- ```javascript
715
- vellum.widgets.sortTable('table-id'); // Wire th[data-sortable] click-to-sort
716
- vellum.widgets.sortTable('table-id', 0); // Sort by column 0 immediately
717
- vellum.widgets.filterTable('table-id', 'search-input-id'); // Live text search
718
- vellum.widgets.tabs('tabs-id'); // Tab switching + keyboard nav
719
- vellum.widgets.accordion('accordion-id', { allowMultiple: true });
720
- vellum.widgets.multiSelect('table-id'); // Checkboxes + select-all
721
- vellum.widgets.toast('Saved!', 'success', 4000); // Auto-dismiss notification
722
- vellum.widgets.toast('Connection lost', 'error', 0); // Manual dismiss
723
- vellum.widgets.countdown('timer-el', '2025-12-31T00:00:00Z', {
724
- onComplete: () => console.log('Done!')
725
- });
726
- ```
727
-
728
- #### Composition recipes
729
-
730
- Combine widgets with wiring code to build complex UIs:
731
-
732
- **Search-driven list with suggestion chips** — filter items with quick-tap categories:
733
- ```html
734
- <div class="v-search-bar"><input id="search" placeholder="Search..."></div>
735
- <div class="chip-group" style="margin-top: var(--v-spacing-sm);">
736
- <button class="chip active" data-filter="all">🏠 All</button>
737
- <button class="chip" data-filter="kitchen">🍳 Kitchen</button>
738
- <button class="chip" data-filter="bedroom">🛏️ Bedroom</button>
739
- <button class="chip" data-filter="bathroom">🚿 Bathroom</button>
740
- </div>
741
- <ul class="v-action-list" id="list"></ul>
742
- <div class="v-empty-state" id="empty" hidden>
743
- <div class="v-empty-icon">🔍</div>
744
- <div class="v-empty-title">No results</div>
745
- </div>
746
- ```
747
- ```javascript
748
- let activeFilter = 'all';
749
- document.getElementById('search').addEventListener('input', filterList);
750
- document.querySelectorAll('.chip[data-filter]').forEach(chip => {
751
- chip.addEventListener('click', () => {
752
- document.querySelectorAll('.chip[data-filter]').forEach(c => c.classList.remove('active'));
753
- chip.classList.add('active');
754
- activeFilter = chip.dataset.filter;
755
- filterList();
756
- });
757
- });
758
-
759
- function filterList() {
760
- const q = document.getElementById('search').value.toLowerCase();
761
- let visible = 0;
762
- document.querySelectorAll('#list .v-action-list-item').forEach(item => {
763
- const textMatch = item.textContent.toLowerCase().includes(q);
764
- const catMatch = activeFilter === 'all' || item.dataset.category === activeFilter;
765
- item.hidden = !(textMatch && catMatch);
766
- if (!item.hidden) visible++;
767
- });
768
- document.getElementById('empty').hidden = visible > 0;
769
- }
770
- ```
771
-
772
- **Form with inline validation:**
773
- ```html
774
- <form id="create-form" novalidate>
775
- <div class="v-input-row">
776
- <label>Title *</label>
777
- <input id="title" required placeholder="Enter title">
778
- <span class="field-error" id="title-error"></span>
779
- </div>
780
- <div class="v-input-row">
781
- <label>Priority</label>
782
- <select id="priority">
783
- <option value="low">Low</option>
784
- <option value="medium" selected>Medium</option>
785
- <option value="high">High</option>
786
- </select>
787
- </div>
788
- <button type="submit" class="v-button" id="submit-btn">Create</button>
789
- </form>
790
- ```
791
- ```css
792
- .field-error { color: var(--v-danger); font-size: var(--v-font-size-xs); min-height: 1em; }
793
- input:invalid:not(:placeholder-shown) { border-color: var(--v-danger); }
794
- ```
795
- ```javascript
796
- document.getElementById('create-form').addEventListener('submit', async (e) => {
797
- e.preventDefault();
798
- const title = document.getElementById('title').value.trim();
799
- if (!title) {
800
- document.getElementById('title-error').textContent = 'Title is required';
801
- return;
802
- }
803
- document.getElementById('submit-btn').disabled = true;
804
- try {
805
- await window.vellum.data.create({
806
- title,
807
- priority: document.getElementById('priority').value
808
- });
809
- vellum.widgets.toast('Created!', 'success');
810
- e.target.reset();
811
- document.getElementById('title-error').textContent = '';
812
- await loadRecords();
813
- } catch (err) {
814
- vellum.widgets.toast('Failed to create', 'error');
815
- } finally {
816
- document.getElementById('submit-btn').disabled = false;
817
- }
818
- });
819
- ```
820
-
821
- **Dashboard** — contextual header + emoji stats + pill toggles + chart:
822
- ```html
823
- <!-- Contextual header -->
824
- <div style="margin-bottom: var(--v-spacing-xxxl);">
825
- <p style="color: var(--v-text-muted); font-size: var(--v-font-size-sm); margin: 0;">Saturday, Feb 15</p>
826
- <h1 style="margin: var(--v-spacing-xs) 0;">Good morning, <span class="accent-word">Alex</span></h1>
827
- <span class="trust-pill accent">🔥 7-day streak</span>
828
- </div>
829
-
830
- <!-- Pill toggles for time range -->
831
- <div class="pill-toggles" style="margin-bottom: var(--v-spacing-xl);">
832
- <button class="pill-toggle active">1W</button>
833
- <button class="pill-toggle">1M</button>
834
- <button class="pill-toggle">3M</button>
835
- <button class="pill-toggle">1Y</button>
836
- </div>
837
-
838
- <!-- Emoji stat cards -->
839
- <div class="emoji-stat-row" style="margin-bottom: var(--v-spacing-xxl);">
840
- <div class="emoji-stat-card">
841
- <span class="emoji-stat-icon">🔥</span>
842
- <span class="emoji-stat-value" id="cal-value">1,284</span>
843
- <span class="emoji-stat-label">Calories</span>
844
- </div>
845
- <div class="emoji-stat-card">
846
- <span class="emoji-stat-icon">🏃</span>
847
- <span class="emoji-stat-value" id="steps-value">8,421</span>
848
- <span class="emoji-stat-label">Steps</span>
849
- </div>
850
- <div class="emoji-stat-card">
851
- <span class="emoji-stat-icon">💧</span>
852
- <span class="emoji-stat-value" id="hydration-value">2.4L</span>
853
- <span class="emoji-stat-label">Hydration</span>
854
- </div>
855
- </div>
856
-
857
- <!-- Chart + trend badge -->
858
- <div class="v-card" style="margin-bottom: var(--v-spacing-xxl);">
859
- <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom: var(--v-spacing-md);">
860
- <h3 style="margin:0;">Weekly Activity</h3>
861
- <span class="trust-pill accent">📈 +12% vs last week</span>
862
- </div>
863
- <div id="chart" style="height:200px;"></div>
864
- </div>
865
-
866
- <!-- Atmospheric tagline -->
867
- <p style="text-align:center; color: var(--v-text-muted); font-size: var(--v-font-size-sm); font-style:italic;">Powered by your consistency.</p>
868
- ```
869
- ```javascript
870
- function esc(s) { const d = document.createElement('div'); d.textContent = String(s); return d.innerHTML; }
871
-
872
- async function loadDashboard() {
873
- const records = await window.vellum.data.query();
874
- // Update stat values from real data
875
- // Render chart
876
- vellum.widgets.barChart('chart', records.map(r => ({
877
- label: esc(r.data.name), value: r.data.amount
878
- })));
879
- }
880
- // Wire pill toggles
881
- document.querySelectorAll('.pill-toggles').forEach(group => {
882
- group.addEventListener('click', (e) => {
883
- if (!e.target.classList.contains('pill-toggle')) return;
884
- group.querySelectorAll('.pill-toggle').forEach(b => b.classList.remove('active'));
885
- e.target.classList.add('active');
886
- // Re-fetch data for selected range
887
- });
888
- });
889
- ```
890
-
891
- **Landing page** — nav bar + trust badge hero + accent word + category cards:
892
- ```html
893
- <div class="v-page">
894
- <!-- Navigation bar -->
895
- <nav class="app-navbar reveal">
896
- <div class="navbar-brand">✨ SparkClean</div>
897
- <div class="navbar-links">
898
- <a href="#" class="nav-link active">Home</a>
899
- <a href="#" class="nav-link">Services</a>
900
- <a href="#" class="nav-link">Pricing</a>
901
- </div>
902
- <button class="v-button navbar-cta">Book Now</button>
903
- </nav>
904
-
905
- <!-- Hero with trust badge + accent word -->
906
- <div class="v-hero reveal">
907
- <span class="v-hero-badge">🌟 Trusted by 12,000+ homes</span>
908
- <h1>Your home, <span class="v-gradient-text">spotless.</span></h1>
909
- <p class="v-hero-subtitle">Professional cleaning matched to your schedule. Book in 60 seconds.</p>
910
- </div>
911
-
912
- <!-- Category cards -->
913
- <div class="reveal">
914
- <h2 style="text-align:center; margin-bottom: var(--v-spacing-xl);">Our <span class="accent-word">Services</span></h2>
915
- <div class="category-cards">
916
- <div class="category-card">
917
- <span class="category-icon">🧹</span>
918
- <span class="category-name">Standard Clean</span>
919
- <span class="category-meta">2-3 hrs · From $60</span>
920
- </div>
921
- <div class="category-card">
922
- <span class="category-icon">✨</span>
923
- <span class="category-name">Deep Clean</span>
924
- <span class="category-meta">4-5 hrs · From $120</span>
925
- </div>
926
- <div class="category-card">
927
- <span class="category-icon">📦</span>
928
- <span class="category-name">Move-Out</span>
929
- <span class="category-meta">5-7 hrs · From $180</span>
930
- </div>
931
- </div>
932
- </div>
933
-
934
- <!-- Feature grid -->
935
- <div class="v-feature-grid">
936
- <div class="v-feature-card reveal"><div class="v-feature-icon">⚡</div><div class="v-feature-title">Fast Booking</div><div class="v-feature-desc">Book in under 60 seconds.</div></div>
937
- <div class="v-feature-card reveal"><div class="v-feature-icon">🛡️</div><div class="v-feature-title">Insured</div><div class="v-feature-desc">Fully bonded & insured teams.</div></div>
938
- <div class="v-feature-card reveal"><div class="v-feature-icon">💚</div><div class="v-feature-title">Eco Products</div><div class="v-feature-desc">Safe for kids & pets.</div></div>
939
- </div>
940
-
941
- <!-- Atmospheric tagline -->
942
- <p class="reveal" style="text-align:center; color: var(--v-text-muted); font-style:italic;">A cleaner home starts here.</p>
943
- </div>
944
- ```
945
- ```javascript
946
- const observer = new IntersectionObserver((entries) => {
947
- entries.forEach((entry, i) => {
948
- if (entry.isIntersecting) {
949
- setTimeout(() => entry.target.classList.add('visible'), i * 120);
950
- observer.unobserve(entry.target);
951
- }
952
- });
953
- }, { threshold: 0.1 });
954
- document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
955
- ```
956
-
957
- **Multi-select table** — checkboxes + bulk toolbar:
958
- ```html
959
- <table class="v-data-table" id="my-table">
960
- <thead><tr>
961
- <th><input type="checkbox"></th>
962
- <th data-sortable>Name</th>
963
- <th data-sortable>Status</th>
964
- </tr></thead>
965
- <tbody>
966
- <tr data-id="1"><td><input type="checkbox"></td><td>Item 1</td><td>Active</td></tr>
967
- </tbody>
968
- </table>
969
- <div id="bulk-toolbar" hidden style="position:sticky;bottom:0;padding:12px;background:var(--v-surface);border-top:1px solid var(--v-surface-border);display:flex;gap:8px;">
970
- <button class="v-button danger" onclick="handleBulk('delete')">Delete Selected</button>
971
- <button class="v-button secondary" onclick="handleBulk('archive')">Archive</button>
972
- </div>
973
- ```
974
- ```javascript
975
- vellum.widgets.multiSelect('my-table');
976
- document.getElementById('my-table').addEventListener('change', () => {
977
- const any = document.querySelectorAll('#my-table tbody input:checked').length > 0;
978
- document.getElementById('bulk-toolbar').hidden = !any;
979
- });
980
-
981
- async function handleBulk(action) {
982
- const ids = Array.from(document.querySelectorAll('#my-table tbody input:checked'))
983
- .map(cb => cb.closest('tr').dataset.id);
984
- if (action === 'delete') {
985
- const ok = await window.vellum.confirm('Delete items?', `Delete ${ids.length} selected items?`);
986
- if (!ok) return;
987
- for (const id of ids) await window.vellum.data.delete(id);
988
- vellum.widgets.toast(`Deleted ${ids.length} items`, 'success');
989
- }
990
- await loadRecords();
991
- }
992
- ```
993
-
994
- #### When to use widgets vs custom HTML
995
-
996
- - **Use widgets** for standard patterns — tables, metrics, timelines, notifications
997
- - **Use custom HTML** for novel or creative UIs — games, art tools, unique dashboards
998
- - **Mix freely** — widgets compose well together and with custom elements
999
- - Always prioritize the ideal user experience over using the widget library
1000
-
1001
- #### Advanced techniques
1002
-
1003
- Use modern web APIs to build genuinely impressive apps:
1004
-
1005
- - **Canvas 2D / WebGL** — charts, visualization, drawing, games, generative art
1006
- - **SVG** — icons, diagrams, interactive graphics
1007
- - **CSS animations & keyframes** — loading states, micro-interactions, page transitions
1008
- - **CSS transforms** — drag-and-drop, card flips, 3D effects
1009
- - **CSS gradients & filters** — blur effects, color overlays, rich backgrounds
1010
- - **CSS Grid subgrid** — complex dashboard layouts
1011
- - **Web Audio API** — sound effects, metronomes, music tools
1012
- - **requestAnimationFrame** — smooth animations, interactive canvases
1013
- - **Drag and drop** (HTML5) — reorderable lists, kanban boards
1014
- - **IntersectionObserver** — scroll-triggered animations, lazy rendering
1015
- - **ResizeObserver** — responsive canvas/chart sizing
1016
-
1017
- Don't reach for these when a simple list will do, but don't avoid them when they'd make the app genuinely better.
1018
-
1019
- #### Data bridge API
1020
-
1021
- The HTML interface can read and write records via `window.vellum.data`. All methods return Promises.
1022
-
1023
- - `window.vellum.data.query()` — Returns all records: `{ id, appId, data, createdAt, updatedAt }[]`
1024
- - `window.vellum.data.create(data)` — Creates a record. Returns the created record.
1025
- - `window.vellum.data.update(recordId, data)` — Updates a record by ID. Returns updated record.
1026
- - `window.vellum.data.delete(recordId)` — Deletes a record by ID. Returns void.
1027
-
1028
- Important:
1029
- - Call `query()` on page load to populate initial state
1030
- - User fields live in `record.data` (e.g., `record.data.title`)
1031
- - Record IDs are UUID strings
1032
- - All operations are async — use `async/await`
1033
- - Wrap all calls in `try/catch`
1034
-
1035
- #### Client-side state management
1036
-
1037
- `localStorage` and `sessionStorage` are available for ephemeral UI state (filters, view modes, collapsed state, preferences, form drafts). Use `window.vellum.data` for persistent app records, `localStorage` for UI preferences.
1038
-
1039
- #### JavaScript patterns
1040
-
1041
- Initialize apps with clean state management:
1042
- ```javascript
1043
- document.addEventListener('DOMContentLoaded', async () => {
1044
- await loadRecords();
1045
- });
1046
-
1047
- let allRecords = [];
1048
-
1049
- async function loadRecords() {
1050
- try {
1051
- allRecords = await window.vellum.data.query();
1052
- render();
1053
- } catch (err) {
1054
- console.error('Failed to load:', err);
1055
- }
1056
- }
1057
-
1058
- function render() {
1059
- // Re-render UI from allRecords
1060
- // Apply client-side filtering/sorting
1061
- }
1062
- ```
1063
-
1064
- For complex apps, use a single state object:
1065
- ```javascript
1066
- const state = {
1067
- records: [],
1068
- filter: localStorage.getItem('filter') || 'all',
1069
- sortBy: localStorage.getItem('sortBy') || 'createdAt',
1070
- searchQuery: '',
1071
- editingId: null,
1072
- };
1073
-
1074
- function setState(updates) {
1075
- Object.assign(state, updates);
1076
- render();
1077
- }
1078
- ```
1079
-
1080
- **Loading state pattern:**
1081
- ```javascript
1082
- async function loadWithSkeleton() {
1083
- document.getElementById('content').innerHTML = `
1084
- <div class="skeleton skeleton-heading"></div>
1085
- <div class="skeleton skeleton-text"></div>
1086
- <div class="skeleton skeleton-text" style="width:60%"></div>`;
1087
- const records = await window.vellum.data.query();
1088
- setState({ records });
1089
- }
1090
- ```
1091
-
1092
- **HTML escaping:** Always escape user-controlled data before inserting it into the DOM via `innerHTML`. Use this utility:
1093
- ```javascript
1094
- function esc(s) { const d = document.createElement('div'); d.textContent = String(s); return d.innerHTML; }
1095
- ```
1096
- Then wrap every user data interpolation: `` `<td>${esc(record.data.name)}</td>` ``. Alternatively, use `textContent` or DOM APIs to set text without innerHTML. Failing to escape leads to XSS vulnerabilities.
1097
-
1098
- ### 4. Single-Page App Views
1099
-
1100
- Apps run inside a sandboxed WebView that blocks all navigation — standard `<a>` links will not work for in-app navigation. All apps are effectively single-page. When an app needs multiple views (e.g., list + detail, dashboard + settings), use JavaScript to swap content within the page.
1101
-
1102
- #### View switching pattern
1103
-
1104
- Use a simple `showView()` function to toggle between sections:
1105
- ```html
1106
- <nav class="app-nav">
1107
- <button class="nav-link active" onclick="showView('home')">Home</button>
1108
- <button class="nav-link" onclick="showView('settings')">Settings</button>
1109
- </nav>
1110
-
1111
- <div id="view-home" class="view">
1112
- <!-- Home content -->
1113
- </div>
1114
- <div id="view-settings" class="view" hidden>
1115
- <!-- Settings content -->
1116
- </div>
1117
-
1118
- <style>
1119
- .app-nav { display: flex; gap: 4px; padding: 8px 12px; background: var(--v-surface); border-bottom: 1px solid var(--v-surface-border); }
1120
- .nav-link { padding: 6px 14px; border-radius: 6px; border: none; background: none; color: var(--v-text-secondary); font-size: 13px; font-weight: 500; cursor: pointer; transition: all 150ms; }
1121
- .nav-link:hover { background: var(--v-surface-border); color: var(--v-text); }
1122
- .nav-link.active { background: var(--v-accent); color: white; }
1123
- </style>
1124
- ```
1125
- ```javascript
1126
- function showView(name) {
1127
- document.querySelectorAll('.view').forEach(v => v.hidden = true);
1128
- document.getElementById('view-' + name).hidden = false;
1129
- document.querySelectorAll('.nav-link').forEach(btn => btn.classList.remove('active'));
1130
- document.querySelector(`[onclick="showView('${name}')"]`)?.classList.add('active');
1131
- }
1132
- ```
1133
-
1134
- For detail pages, call `showView('detail')` and populate the detail section's content dynamically before showing it. Use a "Back" button that calls `showView('home')` to return to the list.
1135
-
1136
- ### 5. Create and Open the App
1137
-
1138
- Call `app_create` with:
1139
- - `name`: Short descriptive name
1140
- - `description`: One-sentence summary
1141
- - `schema_json`: JSON schema as string
1142
- - `html`: Complete HTML document as string
1143
- - `auto_open`: (optional, defaults to `true`) Opens the app immediately
1144
- - `preview`: (optional) Inline preview card — see below
1145
-
1146
- Since `auto_open` defaults to `true`, you don't need to call `app_open` separately after `app_create`.
1147
-
1148
- #### Preview metadata
1149
-
1150
- Both `ui_show` and `app_create` support a `preview` object for an inline chat preview card. Always include it so the user sees a compact summary without opening the app.
1151
-
1152
- **With `ui_show`:**
1153
- ```json
1154
- {
1155
- "surface_type": "dynamic_page",
1156
- "data": {
1157
- "html": "...",
1158
- "preview": {
1159
- "title": "Expense Tracker",
1160
- "subtitle": "Personal Finance",
1161
- "description": "Track daily expenses with category breakdowns.",
1162
- "icon": "💰",
1163
- "metrics": [
1164
- { "label": "Records", "value": "24" },
1165
- { "label": "Categories", "value": "8" }
1166
- ]
1167
- }
1168
- }
1169
- }
1170
- ```
1171
-
1172
- **With `app_create`:**
1173
- ```json
1174
- {
1175
- "name": "Expense Tracker",
1176
- "schema_json": "{}",
1177
- "html": "...",
1178
- "preview": {
1179
- "title": "Expense Tracker",
1180
- "icon": "💰",
1181
- "metrics": [
1182
- { "label": "Records", "value": "24" },
1183
- { "label": "Categories", "value": "8" }
1184
- ]
1185
- }
1186
- }
1187
- ```
1188
-
1189
- Preview fields: `title` (required), `subtitle`, `description`, `icon` (emoji), `metrics` (up to 3 key-value pills). When `app_create` is called with `auto_open: true` (the default), the preview is forwarded through `app_open` automatically.
1190
-
1191
- ### 6. Handle Iteration
1192
-
1193
- When the user requests changes to an existing app, prefer **`app_file_edit`** over rewriting the entire file. It performs surgical find-and-replace edits (like sed), which is faster and less error-prone than re-emitting a full page.
1194
-
1195
- #### Editing code
1196
-
1197
- - **`app_file_edit`** — preferred for modifying existing code. Provide `app_id`, `path` (e.g. `index.html`, `styles.css`), `old_string` (exact text to find), and `new_string` (replacement). Use this for targeted changes like updating styles, fixing bugs, or adding features.
1198
- - **`app_file_write`** — use when creating a new file or when changes are so extensive that a full rewrite is cleaner. Provide `app_id`, `path`, and `content`.
1199
- - Always include a **`status`** parameter when calling `app_file_edit` or `app_file_write` — a brief human-readable message describing what you are doing (e.g. "adding dark mode styles", "updating navigation layout", "fixing chart rendering bug"). This gives the user visible progress feedback.
1200
-
1201
- #### Metadata vs code changes
1202
-
1203
- - **`app_update`** — use for metadata changes only: `name`, `description`, and `schema_json`. Do not use it for code changes.
1204
- - **`app_file_edit`** / **`app_file_write`** — use for all code changes (HTML, CSS, JS). The surface refreshes automatically after file edits.
1205
- - If schema changes affect existing records, mention this.
1206
-
1207
- #### Multi-file apps
1208
-
1209
- Apps can have multiple files beyond `index.html`. Use separate files for CSS and JavaScript to keep code organized:
1210
-
1211
- - Create additional files with `app_file_write` (e.g. `styles.css`, `app.js`, `components/chart.js`).
1212
- - Link them from `index.html` using `<link rel="stylesheet" href="styles.css">` and `<script src="app.js"></script>`.
1213
- - Use `app_file_list` to see all files in an app.
1214
- - Use `app_file_read` to read any file with line numbers (helpful before making edits).
1215
-
1216
- Use `app_delete` to start over. Use `app_list` to check existing apps. Use `app_query` to inspect app data.
1217
-
1218
- ## Interactive Quality Standard
1219
-
1220
- Every app must meet these interaction baselines — they're the difference between "works" and "feels professional."
1221
-
1222
- ### Feedback for Every Action
1223
-
1224
- Every user action must produce visible feedback:
1225
- ```javascript
1226
- // After creating a record
1227
- vellum.widgets.toast('Task created', 'success');
1228
-
1229
- // After deleting
1230
- vellum.widgets.toast('Deleted', 'success');
1231
-
1232
- // After updating
1233
- vellum.widgets.toast('Changes saved', 'success');
1234
-
1235
- // On error
1236
- vellum.widgets.toast('Something went wrong', 'error');
1237
- ```
1238
-
1239
- ### Confirmation for Destructive Actions
1240
-
1241
- Use `window.vellum.confirm()` before deleting, resetting, or any irreversible action:
1242
- ```javascript
1243
- async function deleteRecord(id) {
1244
- const confirmed = await window.vellum.confirm(
1245
- 'Delete this item?',
1246
- 'This action cannot be undone.'
1247
- );
1248
- if (!confirmed) return;
1249
- await window.vellum.data.delete(id);
1250
- vellum.widgets.toast('Deleted', 'success');
1251
- await loadRecords();
1252
- }
1253
- ```
1254
- `window.vellum.confirm(title, message)` returns a `Promise<boolean>` — `true` if the user clicks OK, `false` for Cancel. It shows a native macOS dialog.
1255
-
1256
- ### Form Validation
1257
-
1258
- Validate before submit, show errors inline:
1259
- ```css
1260
- .field-error {
1261
- color: var(--v-danger);
1262
- font-size: var(--v-font-size-xs);
1263
- margin-top: 2px;
1264
- min-height: 1em;
1265
- }
1266
- input.invalid, select.invalid {
1267
- border-color: var(--v-danger);
1268
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--v-danger) 15%, transparent);
1269
- }
1270
- ```
1271
- - Disable submit button while a required field is empty
1272
- - Clear error messages on input focus
1273
- - Show loading state on submit button during async operations
1274
-
1275
- ### Loading States
1276
-
1277
- Never show a blank screen while data loads:
1278
- ```javascript
1279
- function showLoading() {
1280
- container.innerHTML = `
1281
- <div class="skeleton skeleton-heading"></div>
1282
- <div class="skeleton skeleton-text"></div>
1283
- <div class="skeleton skeleton-text" style="width:70%"></div>`;
1284
- }
1285
- ```
1286
- - Disable buttons during async operations to prevent double-submit
1287
- - Use the skeleton shimmer CSS from the Visual Techniques section
1288
-
1289
- ### Keyboard Navigation
1290
-
1291
- - `Tab` moves between interactive elements in logical order
1292
- - `Enter` submits forms, activates buttons
1293
- - `Escape` closes modals, cancels edits, clears search
1294
- - Use `tabindex` only when natural DOM order is insufficient
1295
-
1296
- ## What Great Apps Look Like
1297
-
1298
- These are the apps you should aspire to — each one demonstrates the Lovable-quality patterns in action:
1299
-
1300
- - **Fitness dashboard** — Purple accent (`--accent: #8A5BE0`), lavender tinted background. Contextual header: "Good morning, Alex" with date. Pill toggles (Day/Week/Month) switching chart ranges. Emoji stat cards row (🔥 Calories, 🏃 Steps, 💧 Hydration, 😴 Sleep). Progress rings with distinct colors per metric. Trust pill: "🔥 7-day streak". Atmospheric tagline: "Powered by your consistency."
1301
- - **Plant tracker** — Sage green accent (`--accent: #18B07A`), soft sage background (`#F0F5F0`). Contextual header: "🌿 Your Garden" with plant count badge. Category cards for plant types with emoji (🌵 Succulents, 🌿 Tropicals, 🌸 Flowering). Emoji stat row (💧 Watered today, ☀️ Light exposure, 🌱 New growth). Suggestion chips for filtering: "Needs water", "Low light", "Outdoors".
1302
- - **Finance vault** — Navy/blue-gray accent (`--accent: #3B82F6`), cool gray background (`#F5F7FA`). Contextual header: "Welcome back, Alex" with net worth badge. Transaction list with emoji identifiers (🏠 Rent, 🛒 Groceries, ☕ Coffee). Trend badge: "+8.2% this month". Pill toggles for time ranges (1W/1M/3M/1Y).
1303
- - **Cleaning service landing page** — Warm amber accent (`--accent: #E8A020`), cream background (`#FEFCF9`). Nav bar with logo ("✨ SparkClean") + CTA. Trust pill in hero: "🌟 Trusted by 12,000+ homes". Accent word hero: "Your home, **spotless.**" Category cards (🧹 Standard, ✨ Deep Clean, 📦 Move-Out with pricing). Feature grid with eco/speed/insurance.
1304
- - **AI tool landing page** — Purple gradient text, dark hero section. Suggestion chips below a demo input: "Summarize this", "Generate code", "Explain like I'm 5". Feature grid with emoji icons. Trust badge: "⚡ 4x faster than v1". Atmospheric tagline: "Intelligence, simplified."
1305
-
1306
- ### Pre-Ship Design Checklist
1307
-
1308
- Before delivering any app, mentally verify these 10 items — they cover the gap between "functional" and "designer-quality":
1309
-
1310
- 1. **Domain-matched palette** — Is the accent color appropriate for this domain? (Not default violet)
1311
- 2. **Tinted background** — Does the body have a warm/cool tint instead of pure white/dark?
1312
- 3. **Emoji stat cards** — Are there emoji icons in metric cards, list items, or navigation?
1313
- 4. **Accent word in heading** — Is ONE key word in the hero heading colored or gradient-filled?
1314
- 5. **Contextual header** — Is there a greeting, date, or personalized welcome (not just an app title)?
1315
- 6. **Trust/status pill badge** — Is there at least one pill badge with a stat, streak, or social proof?
1316
- 7. **Generous spacing** — Are section gaps 32-48px? Does the layout feel spacious, not cramped?
1317
- 8. **Clean card borders** — Do cards use subtle 1px borders instead of heavy multi-layer shadows?
1318
- 9. **Interactive elements** — Are there pill toggles, suggestion chips, or filter controls?
1319
- 10. **Atmospheric tagline** — Is there a warm, human-sounding line at the bottom or between sections?
1320
-
1321
- ### Additional widget classes
1322
-
1323
- | Widget | Purpose | Key Classes |
1324
- |---|---|---|
1325
- | `.v-pill-toggles` | Time range / filter toggle group | `.v-pill-toggle` (`.active`) — container with pill buttons |
1326
- | `.v-chip-group` | Suggestion / filter chip row | `.v-chip` (`.active`) — wrapping row of clickable pills |
1327
- | `.v-metric-card .v-metric-icon` | Emoji icon in metric cards | Place emoji `<span>` with `.v-metric-icon` inside `.v-metric-card` |
1328
-
1329
- Every app should include: search/filter, toast notifications for all CRUD operations, `window.vellum.confirm()` for destructive actions, staggered page-load animation, card hover effects, and skeleton loading states.
1330
-
1331
- ## Error Handling
1332
-
1333
- - If `app_create` fails, verify `schema_json` is valid JSON and `html` is a complete HTML document. Retry with fixes.
1334
- - If `app_open` fails, verify `app_id` with `app_list`.
1335
- - If the user reports visual issues, use `app_file_edit` to fix the code. The surface refreshes automatically.
1336
- - All `window.vellum.data` calls must be wrapped in `try/catch` with user-friendly error feedback:
1337
- ```javascript
1338
- try {
1339
- await window.vellum.data.create(data);
1340
- vellum.widgets.toast('Created!', 'success');
1341
- } catch (err) {
1342
- console.error('Create failed:', err);
1343
- vellum.widgets.toast('Failed to save. Please try again.', 'error');
1344
- }
1345
- ```
1346
- - Never let a failed data operation silently pass — always show a toast or inline error message.
1347
- - If the page loads with no data, show a designed empty state (`.v-empty-state`) — never a blank screen.
1348
- - For forms, show validation errors inline next to the relevant field, not as an alert.
1349
-
1350
- ## Actionable UI
1351
-
1352
- When the user wants to triage, manage, or bulk-act on a collection of items (emails, files, notifications, tasks, subscriptions, contacts), generate an interactive UI that lets them review, select, and act on items directly.
1353
-
1354
- ### Pattern
1355
- 1. **Fetch data** — use the relevant tools to gather the items
1356
- 2. **Generate interactive UI** — render a `dynamic_page` with selectable items and action buttons
1357
- 3. **User selects + clicks action** — the UI sends a `surfaceAction` with an action ID and selected item IDs
1358
- 4. **Execute tools** — parse the action, call the appropriate tools
1359
- 5. **Update UI** — use `ui_update` to remove processed items and show feedback via `widgets.toast()`
1360
-
1361
- ### HTML structure
1362
- Choose the best layout for the data: grouped cards with checkboxes, data tables with selectable rows, kanban columns, stacked list items with inline actions, or any creative layout. The key constraint: items must be selectable and action buttons must call `sendAction` with the selected item IDs.
1363
-
1364
- ### CSS building blocks
1365
- - `.v-action-bar` — sticky bar at top, auto-hidden when nothing selected. Contains `.v-action-bar-count` and `.v-action-bar-buttons`
1366
- - `.v-action-progress` — inline progress bar for bulk operations
1367
- - `.v-group-header` / `.v-group-body` — collapsible grouped sections
1368
- - `.v-row-removing` — fade-out + slide animation for processed items
1369
-
1370
- ### Action data conventions
1371
- - Use semantic action IDs: `archive`, `unsubscribe`, `delete`, `move`, `mark_read`
1372
- - Always include selected item IDs: `sendAction("archive", { ids: ["msg_1", "msg_2"] })`
1373
-
1374
- ### Processing flow
1375
- 1. Parse the `surfaceAction` to get the action ID and data
1376
- 2. Use `vellum.confirm(title, message)` for destructive actions before executing
1377
- 3. Call the relevant tools with the item IDs
1378
- 4. Use `ui_update` to remove processed items and update counts
1379
- 5. Show `widgets.toast()` for feedback
1380
-
1381
- ### Error handling
1382
- - Handle partial failures: remove successful items, toast count, keep failed items selectable for retry
1383
-
1384
- ### Surface lifecycle
1385
- - Use `ui_show` with `display: "panel"` to keep the surface open alongside chat
1386
- - Use `widgets.groupedSelect()` for grouped multi-select with action bar
1387
- - Use `widgets.removeItems()` to animate processed items out
1388
-
1389
- ## Home Base
1390
-
1391
- Home Base starts from a prebuilt scaffold. When updating Home Base, preserve required task-lane anchors and apply changes through `app_file_edit` or `app_file_write`.
1392
-
1393
- Home Base buttons send prefilled natural-language prompts through `vellum.sendAction`. Treat these as normal user messages, not as direct execution commands.
1394
- - For appearance changes: keep customization color-first, ask for explicit confirmation before applying a full-dashboard update.
1395
- - For optional capability setup tasks (voice/computer control/ambient): keep them user-initiated and request permissions only when required for the chosen path.
1396
- - If a prompt is underspecified, ask one brief follow-up and continue.
1397
-
1398
- ## External Links
1399
-
1400
- When building apps with linkable items (search results, product cards, bookings), use `vellum.openLink(url, metadata)` to make them clickable. Construct deep-link URLs when possible (airline booking pages, product pages, hotel reservations). Include `metadata.provider` and `metadata.type` for context: `vellum.openLink("https://delta.com/book?flight=DL123", {provider: "delta", type: "booking"})`.
1401
-
1402
- ## Branding
1403
-
1404
- A "Built on Vellum" badge is auto-injected into every dynamic page and app at the bottom-right corner. Do NOT add your own "Built on Vellum" or "Powered by Vellum" text — the badge is handled automatically by the rendering layer.