@vellumai/assistant 0.8.12 → 0.9.0-staging.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (414) hide show
  1. package/AGENTS.md +0 -14
  2. package/ARCHITECTURE.md +45 -45
  3. package/README.md +1 -1
  4. package/bun.lock +200 -154
  5. package/docs/architecture/integrations.md +3 -3
  6. package/docs/architecture/memory.md +2 -2
  7. package/docs/architecture/security.md +10 -10
  8. package/docs/runbook-trusted-contacts.md +12 -12
  9. package/docs/skills.md +6 -6
  10. package/docs/workflows-testing.md +221 -0
  11. package/docs/workflows.md +510 -0
  12. package/examples/plugins/echo/README.md +5 -5
  13. package/knip.json +2 -0
  14. package/openapi.yaml +6935 -5545
  15. package/package.json +8 -4
  16. package/scripts/generate-openapi.ts +66 -114
  17. package/src/__tests__/access-request-seed-content-blocks.test.ts +213 -0
  18. package/src/__tests__/adaptive-thinking-repair.test.ts +32 -3
  19. package/src/__tests__/agent-loop-output-hooks.test.ts +183 -0
  20. package/src/__tests__/agent-loop-regrowth-guard.test.ts +506 -0
  21. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +2 -0
  22. package/src/__tests__/agent-wake-override-profile.test.ts +77 -0
  23. package/src/__tests__/app-dir-path-guard.test.ts +27 -3
  24. package/src/__tests__/approval-cascade.test.ts +0 -5
  25. package/src/__tests__/approval-routes-http.test.ts +91 -0
  26. package/src/__tests__/assistant-stream-state.test.ts +107 -0
  27. package/src/__tests__/browser-fill-credential.test.ts +3 -3
  28. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +1 -1
  29. package/src/__tests__/compaction-events.test.ts +63 -7
  30. package/src/__tests__/compaction-trail-store.test.ts +74 -1
  31. package/src/__tests__/compaction.benchmark.test.ts +63 -41
  32. package/src/__tests__/compactor-low-watermark-cut.test.ts +349 -0
  33. package/src/__tests__/context-window-manager-compact-retry.test.ts +64 -0
  34. package/src/__tests__/conversation-abort-tool-results.test.ts +0 -5
  35. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -5
  36. package/src/__tests__/conversation-history-web-search.test.ts +7 -0
  37. package/src/__tests__/conversation-process-callsite.test.ts +0 -5
  38. package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -5
  39. package/src/__tests__/conversation-queue.test.ts +0 -5
  40. package/src/__tests__/conversation-slash-queue.test.ts +0 -5
  41. package/src/__tests__/conversation-slash-unknown.test.ts +0 -5
  42. package/src/__tests__/conversation-speed-override.test.ts +0 -5
  43. package/src/__tests__/conversation-surfaces-task-progress.test.ts +67 -0
  44. package/src/__tests__/conversation-usage.test.ts +2 -0
  45. package/src/__tests__/conversation-workspace-injection.test.ts +0 -5
  46. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -5
  47. package/src/__tests__/credential-broker-browser-fill.test.ts +2 -2
  48. package/src/__tests__/credential-broker-server-use.test.ts +2 -2
  49. package/src/__tests__/credential-broker.test.ts +1 -1
  50. package/src/__tests__/credential-prompt-route.test.ts +417 -0
  51. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  52. package/src/__tests__/credential-vault.test.ts +37 -0
  53. package/src/__tests__/db-schedule-syntax-migration.test.ts +24 -0
  54. package/src/__tests__/dynamic-page-surface.test.ts +125 -0
  55. package/src/__tests__/empty-state-greeting-cache.test.ts +94 -0
  56. package/src/__tests__/gateway-flag-listener.test.ts +24 -7
  57. package/src/__tests__/guardian-action-sweep.test.ts +56 -219
  58. package/src/__tests__/guardian-routing-invariants.test.ts +138 -0
  59. package/src/__tests__/helpers/channel-test-adapter.ts +0 -2
  60. package/src/__tests__/list-messages-hidden-metadata.test.ts +99 -0
  61. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +87 -1
  62. package/src/__tests__/llm-resolver.test.ts +115 -0
  63. package/src/__tests__/managed-profile-guard.test.ts +6 -5
  64. package/src/__tests__/max-tokens-continue-hook.test.ts +184 -0
  65. package/src/__tests__/media-generate-image.test.ts +20 -9
  66. package/src/__tests__/model-intents.test.ts +1 -1
  67. package/src/__tests__/normalize-onboarding.test.ts +26 -0
  68. package/src/__tests__/notification-decision-strategy.test.ts +4 -2
  69. package/src/__tests__/notification-telegram-adapter.test.ts +21 -3
  70. package/src/__tests__/pending-interactions-resolved-event.test.ts +62 -0
  71. package/src/__tests__/post-turn-tool-result-truncation.test.ts +72 -18
  72. package/src/__tests__/require-fresh-approval.test.ts +425 -1
  73. package/src/__tests__/runtime-events-sse-parity.test.ts +2 -0
  74. package/src/__tests__/schedule-routes-workflow-validation.test.ts +408 -0
  75. package/src/__tests__/schedule-routes.test.ts +257 -4
  76. package/src/__tests__/schedule-store.test.ts +60 -0
  77. package/src/__tests__/schedule-tools.test.ts +247 -2
  78. package/src/__tests__/skill-execute-input.test.ts +85 -0
  79. package/src/__tests__/skill-secret-handling-guard.test.ts +21 -20
  80. package/src/__tests__/skills.test.ts +3 -3
  81. package/src/__tests__/slack-app-setup-skill-regression.test.ts +1 -1
  82. package/src/__tests__/subagent-tool-filtering.test.ts +50 -0
  83. package/src/__tests__/subagent-tool-gate-mode.test.ts +547 -0
  84. package/src/__tests__/system-prompt.test.ts +1 -1
  85. package/src/__tests__/task-progress-nudge-hook.test.ts +372 -0
  86. package/src/__tests__/task-scheduler.test.ts +299 -0
  87. package/src/__tests__/tool-approval-seed-content-blocks.test.ts +209 -0
  88. package/src/__tests__/tool-result-spool.test.ts +3 -1
  89. package/src/__tests__/workspace-migration-102-preserve-heartbeat-enabled-for-existing-workspaces.test.ts +181 -0
  90. package/src/__tests__/workspace-migration-103-upgrade-quality-profile-to-opus-4-8.test.ts +174 -0
  91. package/src/agent/compaction-circuit.ts +11 -0
  92. package/src/agent/loop.ts +181 -12
  93. package/src/api/constants/call-sites.ts +12 -0
  94. package/src/api/events/assistant-thinking-delta.ts +10 -0
  95. package/src/api/events/usage-update.ts +7 -0
  96. package/src/api/index.ts +4 -1
  97. package/src/api/responses/memory-v3-selection-log.ts +18 -11
  98. package/src/approvals/approval-primitive.ts +2 -2
  99. package/src/background-wake/background-wake-routes.test.ts +5 -2
  100. package/src/bundler/compiler-tools.ts +1 -1
  101. package/src/calls/call-domain.ts +1 -1
  102. package/src/calls/guardian-action-sweep.ts +16 -93
  103. package/src/cli/AGENTS.md +4 -0
  104. package/src/cli/commands/__tests__/schedules.test.ts +430 -1
  105. package/src/cli/commands/credentials.ts +28 -24
  106. package/src/cli/commands/image-generation.ts +23 -9
  107. package/src/cli/commands/notifications.ts +1 -1
  108. package/src/cli/commands/plugins.ts +89 -46
  109. package/src/cli/commands/schedules.ts +384 -11
  110. package/src/cli/lib/__tests__/inspect-plugin.test.ts +69 -5
  111. package/src/cli/lib/__tests__/install-from-github.test.ts +15 -0
  112. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +81 -4
  113. package/src/cli/lib/inspect-plugin.ts +62 -1
  114. package/src/cli/lib/install-from-github.ts +52 -5
  115. package/src/cli/lib/upgrade-plugin.ts +18 -0
  116. package/src/config/__tests__/workflows-schema.test.ts +60 -0
  117. package/src/config/bundled-skills/acp/SKILL.md +2 -2
  118. package/src/config/bundled-skills/image-studio/SKILL.md +66 -19
  119. package/src/config/bundled-skills/image-studio/TOOLS.json +1 -6
  120. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +22 -3
  121. package/src/config/bundled-skills/personal-page/SKILL.md +57 -0
  122. package/src/config/bundled-skills/personal-page/TOOLS.json +27 -0
  123. package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +17 -0
  124. package/src/config/bundled-skills/schedule/SKILL.md +7 -2
  125. package/src/config/bundled-skills/schedule/TOOLS.json +48 -4
  126. package/src/config/bundled-skills/workflows/SKILL.md +214 -0
  127. package/src/config/bundled-skills/workflows/TOOLS.json +84 -0
  128. package/src/config/bundled-skills/workflows/tools/manage-workflows.ts +12 -0
  129. package/src/config/bundled-skills/workflows/tools/run-workflow.ts +12 -0
  130. package/src/config/bundled-tool-registry.ts +14 -2
  131. package/src/config/call-site-defaults.ts +5 -0
  132. package/src/config/feature-flag-registry.json +12 -4
  133. package/src/config/llm-context-resolution.ts +8 -0
  134. package/src/config/llm-resolver.ts +30 -0
  135. package/src/config/preloaded-apps/personal-page/src/components/About.tsx +22 -0
  136. package/src/config/preloaded-apps/personal-page/src/components/App.tsx +16 -0
  137. package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +77 -0
  138. package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +57 -0
  139. package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +28 -0
  140. package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +234 -0
  141. package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +48 -0
  142. package/src/config/preloaded-apps/personal-page/src/components/media.ts +16 -0
  143. package/src/config/preloaded-apps/personal-page/src/index.html +20 -0
  144. package/src/config/preloaded-apps/personal-page/src/main.tsx +7 -0
  145. package/src/config/preloaded-apps/personal-page/src/profile-data.ts +82 -0
  146. package/src/config/preloaded-apps/personal-page/src/styles.css +759 -0
  147. package/src/config/schema.ts +2 -0
  148. package/src/config/schemas/call-site-catalog.ts +7 -0
  149. package/src/config/schemas/heartbeat.ts +4 -1
  150. package/src/config/schemas/llm.ts +33 -26
  151. package/src/config/schemas/memory-retrospective.ts +19 -0
  152. package/src/config/schemas/platform.ts +8 -0
  153. package/src/config/schemas/services.ts +5 -2
  154. package/src/config/schemas/workflows.ts +42 -0
  155. package/src/config/skills.ts +3 -3
  156. package/src/context/compactor.ts +273 -39
  157. package/src/context/post-turn-tool-result-truncation.ts +23 -6
  158. package/src/context/tool-result-spool.ts +12 -17
  159. package/src/credential-execution/executable-discovery.ts +1 -1
  160. package/src/credential-execution/process-manager.ts +37 -3
  161. package/src/credential-execution/prompted-credential.ts +205 -0
  162. package/src/daemon/conversation-agent-loop-handlers.ts +14 -0
  163. package/src/daemon/conversation-process.ts +11 -2
  164. package/src/daemon/conversation-surfaces.ts +75 -0
  165. package/src/daemon/conversation-tool-setup.ts +103 -26
  166. package/src/daemon/conversation-usage.ts +2 -0
  167. package/src/daemon/conversation.ts +115 -11
  168. package/src/daemon/handlers/shared.ts +26 -14
  169. package/src/daemon/host-cu-proxy.ts +15 -12
  170. package/src/daemon/host-file-proxy.ts +15 -12
  171. package/src/daemon/host-transfer-proxy.ts +30 -24
  172. package/src/daemon/lifecycle.ts +40 -3
  173. package/src/daemon/message-protocol.ts +3 -0
  174. package/src/daemon/message-types/messages.ts +2 -10
  175. package/src/daemon/message-types/workflows.ts +49 -0
  176. package/src/daemon/parse-actual-tokens-from-error.test.ts +62 -1
  177. package/src/daemon/parse-actual-tokens-from-error.ts +43 -4
  178. package/src/daemon/process-message.ts +6 -0
  179. package/src/daemon/tool-setup-types.ts +57 -0
  180. package/src/daemon/wake-conversation-ops.ts +18 -0
  181. package/src/heartbeat/heartbeat-run-store.ts +8 -2
  182. package/src/home/feed-types.ts +1 -1
  183. package/src/ipc/gateway-flag-listener.ts +28 -6
  184. package/src/mcp/mcp-auth-state.ts +8 -20
  185. package/src/media/__tests__/image-models.test.ts +57 -0
  186. package/src/media/image-models.ts +66 -0
  187. package/src/memory/__tests__/auto-analysis-enqueue.test.ts +38 -0
  188. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +12 -2
  189. package/src/memory/__tests__/memory-retrospective-job.test.ts +911 -34
  190. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +227 -5
  191. package/src/memory/__tests__/memory-retrospective-state.test.ts +195 -0
  192. package/src/memory/__tests__/preloaded-apps.test.ts +85 -0
  193. package/src/memory/auto-analysis-enqueue.ts +14 -1
  194. package/src/memory/compaction-log-store-clickhouse.ts +6 -4
  195. package/src/memory/conversation-crud.ts +9 -2
  196. package/src/memory/conversation-disk-view.ts +1 -1
  197. package/src/memory/conversation-queries.ts +22 -7
  198. package/src/memory/db-init.ts +20 -0
  199. package/src/memory/db-maintenance.ts +16 -0
  200. package/src/memory/embedding-runtime-manager.ts +1 -1
  201. package/src/memory/llm-request-log-source-clickhouse.ts +112 -14
  202. package/src/memory/llm-request-log-source-local.ts +19 -1
  203. package/src/memory/llm-request-log-source.ts +35 -6
  204. package/src/memory/llm-request-log-store.ts +90 -2
  205. package/src/memory/memory-retrospective-constants.ts +9 -0
  206. package/src/memory/memory-retrospective-enqueue.ts +3 -6
  207. package/src/memory/memory-retrospective-fork-boundary.ts +94 -0
  208. package/src/memory/memory-retrospective-job.ts +500 -208
  209. package/src/memory/memory-retrospective-startup-cleanup.ts +97 -19
  210. package/src/memory/memory-retrospective-state.ts +85 -2
  211. package/src/memory/migrations/281-memory-retrospective-remembered-log.ts +40 -0
  212. package/src/memory/migrations/282-schedule-inference-profile.test.ts +77 -0
  213. package/src/memory/migrations/282-schedule-inference-profile.ts +26 -0
  214. package/src/memory/migrations/283-memory-v3-selections-message-id-and-sections.test.ts +102 -0
  215. package/src/memory/migrations/283-memory-v3-selections-message-id-and-sections.ts +53 -0
  216. package/src/memory/migrations/284-workflow-runs.ts +51 -0
  217. package/src/memory/migrations/285-schedule-workflow-mode.ts +26 -0
  218. package/src/memory/migrations/286-workflow-run-trust.ts +27 -0
  219. package/src/memory/migrations/287-conversation-origin-channel-index.ts +15 -0
  220. package/src/memory/migrations/288-backfill-origin-channel-from-bindings.ts +43 -0
  221. package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +115 -0
  222. package/src/memory/migrations/290-schedule-capabilities.test.ts +77 -0
  223. package/src/memory/migrations/290-schedule-capabilities.ts +25 -0
  224. package/src/memory/migrations/__tests__/281-memory-retrospective-remembered-log.test.ts +96 -0
  225. package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +571 -0
  226. package/src/memory/migrations/index.ts +10 -0
  227. package/src/memory/preloaded-apps.ts +116 -0
  228. package/src/memory/schema/infrastructure.ts +4 -0
  229. package/src/memory/schema/memory-core.ts +4 -0
  230. package/src/memory/v2/__tests__/concept-page-frontmatter-schema.test.ts +45 -0
  231. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +11 -7
  232. package/src/memory/v2/__tests__/page-store.test.ts +13 -2
  233. package/src/memory/v2/__tests__/qdrant.test.ts +24 -0
  234. package/src/memory/v2/frontmatter-sweep.ts +7 -6
  235. package/src/memory/v2/page-store.ts +4 -3
  236. package/src/memory/v2/qdrant.ts +42 -3
  237. package/src/memory/v2/types.ts +16 -10
  238. package/src/messaging/draft-store.ts +1 -1
  239. package/src/notifications/access-request-copy.ts +200 -113
  240. package/src/notifications/adapters/slack.ts +250 -111
  241. package/src/notifications/adapters/telegram.ts +7 -44
  242. package/src/notifications/approval-card-builder.ts +93 -0
  243. package/src/notifications/broadcaster.ts +74 -0
  244. package/src/notifications/conversation-pairing.ts +8 -6
  245. package/src/notifications/copy-composer.ts +32 -26
  246. package/src/notifications/decision-engine.ts +59 -7
  247. package/src/notifications/guardian-question-mode.ts +145 -155
  248. package/src/notifications/home-feed-side-effect.ts +1 -1
  249. package/src/notifications/notification-utils.ts +66 -0
  250. package/src/notifications/signal.ts +6 -0
  251. package/src/notifications/tool-approval-copy.ts +142 -0
  252. package/src/notifications/types.ts +19 -0
  253. package/src/permissions/threshold.ts +11 -0
  254. package/src/plugin-api/types.ts +16 -4
  255. package/src/plugins/defaults/compaction/window-manager.ts +44 -0
  256. package/src/plugins/defaults/index.ts +46 -0
  257. package/src/plugins/defaults/max-tokens-continue/continue-state-store.ts +53 -0
  258. package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +80 -0
  259. package/src/plugins/defaults/max-tokens-continue/hooks/stop.ts +20 -0
  260. package/src/plugins/defaults/max-tokens-continue/package.json +14 -0
  261. package/src/plugins/defaults/memory-retrieval/hooks/__tests__/user-prompt-submit.test.ts +37 -0
  262. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +29 -1
  263. package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +8 -3
  264. package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +4 -2
  265. package/src/plugins/defaults/memory-v3-shadow/__tests__/pool-select.test.ts +28 -18
  266. package/src/plugins/defaults/memory-v3-shadow/__tests__/section-dense-store.test.ts +67 -0
  267. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +122 -22
  268. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-integration.test.ts +2 -0
  269. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +63 -1
  270. package/src/plugins/defaults/memory-v3-shadow/injector.ts +61 -18
  271. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +1 -1
  272. package/src/plugins/defaults/memory-v3-shadow/pool-select.ts +39 -10
  273. package/src/plugins/defaults/memory-v3-shadow/section-dense-store.ts +34 -1
  274. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +112 -47
  275. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +78 -15
  276. package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +206 -0
  277. package/src/plugins/defaults/task-progress-nudge/package.json +15 -0
  278. package/src/prompts/__tests__/system-prompt.test.ts +100 -1
  279. package/src/prompts/__tests__/task-progress-hint-section.test.ts +5 -7
  280. package/src/prompts/normalize-onboarding.ts +2 -0
  281. package/src/prompts/persona-resolver.ts +3 -0
  282. package/src/prompts/system-prompt.ts +51 -2
  283. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +3 -1
  284. package/src/prompts/templates/system-sections.ts +8 -3
  285. package/src/providers/call-site-routing.ts +6 -3
  286. package/src/providers/fireworks/client.ts +3 -0
  287. package/src/providers/inference/auth.ts +52 -46
  288. package/src/providers/model-intents.ts +2 -2
  289. package/src/providers/openai/__tests__/coerce-object-args.test.ts +105 -0
  290. package/src/providers/openai/chat-completions-provider.ts +47 -9
  291. package/src/providers/openai/coerce-object-args.ts +104 -0
  292. package/src/providers/retry.ts +8 -5
  293. package/src/providers/types.ts +10 -0
  294. package/src/runtime/__tests__/agent-wake.test.ts +629 -7
  295. package/src/runtime/access-request-helper.ts +16 -9
  296. package/src/runtime/agent-wake.ts +302 -51
  297. package/src/runtime/assistant-stream-state.ts +141 -8
  298. package/src/runtime/background-job-runner.ts +9 -0
  299. package/src/runtime/channel-approval-types.ts +1 -0
  300. package/src/runtime/guardian-action-message-composer.ts +0 -54
  301. package/src/runtime/http-server.ts +6 -14
  302. package/src/runtime/http-types.ts +0 -1
  303. package/src/runtime/message-composer-types.ts +0 -9
  304. package/src/runtime/middleware/__tests__/rate-limiter.test.ts +63 -0
  305. package/src/runtime/middleware/auth.ts +27 -3
  306. package/src/runtime/middleware/rate-limiter.ts +28 -1
  307. package/src/runtime/migrations/vbundle-builder.ts +6 -5
  308. package/src/runtime/pending-interactions.ts +20 -1
  309. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +232 -173
  310. package/src/runtime/routes/__tests__/plugins-routes.test.ts +18 -0
  311. package/src/runtime/routes/__tests__/retrospective-routes.test.ts +436 -0
  312. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +11 -0
  313. package/src/runtime/routes/approval-routes.ts +35 -8
  314. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -1
  315. package/src/runtime/routes/btw-routes.ts +37 -1
  316. package/src/runtime/routes/channel-route-shared.ts +3 -1
  317. package/src/runtime/routes/consolidation-routes.ts +17 -13
  318. package/src/runtime/routes/conversation-compaction-routes.ts +159 -119
  319. package/src/runtime/routes/conversation-list-routes.ts +41 -4
  320. package/src/runtime/routes/conversation-query-routes.ts +196 -11
  321. package/src/runtime/routes/conversation-routes.ts +15 -1
  322. package/src/runtime/routes/credential-prompt-routes.ts +39 -17
  323. package/src/runtime/routes/empty-state-greeting-cache.ts +65 -0
  324. package/src/runtime/routes/heartbeat-routes.ts +18 -13
  325. package/src/runtime/routes/image-generation-routes.ts +20 -2
  326. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +26 -1
  327. package/src/runtime/routes/index.ts +6 -0
  328. package/src/runtime/routes/log-export/AGENTS.md +1 -1
  329. package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
  330. package/src/runtime/routes/migration-routes.ts +5 -9
  331. package/src/runtime/routes/plugins-routes.ts +26 -0
  332. package/src/runtime/routes/ps-routes.ts +10 -8
  333. package/src/runtime/routes/retrospective-routes.ts +235 -0
  334. package/src/runtime/routes/runs-pagination.ts +75 -0
  335. package/src/runtime/routes/schedule-routes.ts +367 -59
  336. package/src/runtime/routes/sounds-config-routes.ts +239 -0
  337. package/src/runtime/routes/surface-action-routes.ts +84 -4
  338. package/src/runtime/routes/workflow-routes.test.ts +372 -0
  339. package/src/runtime/routes/workflow-routes.ts +363 -0
  340. package/src/runtime/routes/workspace-routes.test.ts +61 -1
  341. package/src/runtime/routes/workspace-routes.ts +26 -1
  342. package/src/runtime/services/__tests__/analyze-conversation.test.ts +38 -0
  343. package/src/runtime/services/analyze-conversation.ts +26 -13
  344. package/src/schedule/inference-profile.ts +28 -0
  345. package/src/schedule/schedule-store.ts +122 -4
  346. package/src/schedule/scheduler-types.ts +6 -0
  347. package/src/schedule/scheduler.ts +96 -0
  348. package/src/security/secret-allowlist.ts +1 -1
  349. package/src/skills/path-classifier.ts +1 -1
  350. package/src/tools/browser/browser-execution.ts +9 -11
  351. package/src/tools/credentials/broker.ts +4 -4
  352. package/src/tools/credentials/vault.ts +26 -137
  353. package/src/tools/executor.ts +69 -0
  354. package/src/tools/flag-gated-tools.test.ts +76 -0
  355. package/src/tools/permission-checker.ts +8 -1
  356. package/src/tools/registry.ts +51 -0
  357. package/src/tools/schedule/create.ts +77 -1
  358. package/src/tools/schedule/list.ts +1 -0
  359. package/src/tools/schedule/update.ts +73 -1
  360. package/src/tools/skills/execute.ts +56 -0
  361. package/src/tools/terminal/shell.ts +1 -1
  362. package/src/tools/ui-surface/definitions.ts +48 -2
  363. package/src/tools/workflows/manage-workflows.ts +183 -0
  364. package/src/tools/workflows/run-workflow.test.ts +442 -0
  365. package/src/tools/workflows/run-workflow.ts +88 -0
  366. package/src/types/onboarding-context.ts +2 -0
  367. package/src/usage/attribution.ts +24 -0
  368. package/src/util/canonicalize-identity.ts +12 -3
  369. package/src/util/platform.ts +17 -17
  370. package/src/watcher/__tests__/engine.test.ts +24 -0
  371. package/src/watcher/__tests__/telemetry.test.ts +135 -0
  372. package/src/watcher/engine.ts +7 -0
  373. package/src/watcher/telemetry.ts +74 -0
  374. package/src/workflows/capabilities.test.ts +365 -0
  375. package/src/workflows/capabilities.ts +359 -0
  376. package/src/workflows/deterministic-stringify.ts +27 -0
  377. package/src/workflows/engine-integration.test.ts +656 -0
  378. package/src/workflows/engine.test.ts +1144 -0
  379. package/src/workflows/engine.ts +1078 -0
  380. package/src/workflows/fanout-load.test.ts +168 -0
  381. package/src/workflows/journal-store.test.ts +369 -0
  382. package/src/workflows/journal-store.ts +470 -0
  383. package/src/workflows/leaf-runner.test.ts +704 -0
  384. package/src/workflows/leaf-runner.ts +589 -0
  385. package/src/workflows/library.test.ts +134 -0
  386. package/src/workflows/library.ts +124 -0
  387. package/src/workflows/run-manager.test.ts +711 -0
  388. package/src/workflows/run-manager.ts +593 -0
  389. package/src/workflows/sandbox-escape.test.ts +339 -0
  390. package/src/workflows/sandbox.test.ts +251 -0
  391. package/src/workflows/sandbox.ts +447 -0
  392. package/src/workspace/adaptive-thinking-repair.ts +33 -11
  393. package/src/workspace/migrations/021-move-signals-to-workspace.ts +1 -1
  394. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +1 -1
  395. package/src/workspace/migrations/026-backfill-install-meta.ts +1 -1
  396. package/src/workspace/migrations/030-seed-pkb-autoinject.ts +2 -1
  397. package/src/workspace/migrations/031-drop-user-md.ts +1 -4
  398. package/src/workspace/migrations/048-remove-workspace-hooks.ts +1 -1
  399. package/src/workspace/migrations/056-release-notes-inference-profile-reordering.ts +5 -2
  400. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +1 -1
  401. package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +8 -2
  402. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +41 -14
  403. package/src/workspace/migrations/102-preserve-heartbeat-enabled-for-existing-workspaces.ts +69 -0
  404. package/src/workspace/migrations/103-upgrade-quality-profile-to-opus-4-8.ts +83 -0
  405. package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +133 -0
  406. package/src/workspace/migrations/registry.ts +6 -0
  407. package/src/workspace/migrations/runner.ts +1 -1
  408. package/tsconfig.json +1 -1
  409. package/src/__tests__/guardian-action-copy-generator.test.ts +0 -200
  410. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -579
  411. package/src/__tests__/guardian-action-store.test.ts +0 -106
  412. package/src/daemon/guardian-action-generators.ts +0 -71
  413. package/src/memory/guardian-action-store.ts +0 -484
  414. package/src/runtime/guardian-action-grant-minter.ts +0 -150
@@ -0,0 +1,84 @@
1
+ {
2
+ "version": 1,
3
+ "tools": [
4
+ {
5
+ "name": "run_workflow",
6
+ "description": "Launch an autonomous, multi-agent workflow from a script you author (or by saved name); returns a runId immediately and notifies this conversation on completion. See SKILL.md for the full script-authoring contract.",
7
+ "category": "workflow",
8
+ "risk": "low",
9
+ "input_schema": {
10
+ "type": "object",
11
+ "properties": {
12
+ "script": {
13
+ "type": "string",
14
+ "description": "Inline workflow source (JavaScript/TypeScript) following the authoring contract. Provide this OR name, not both."
15
+ },
16
+ "name": {
17
+ "type": "string",
18
+ "description": "Name of a previously saved workflow to run. Provide this OR script, not both."
19
+ },
20
+ "args": {
21
+ "type": "object",
22
+ "description": "Verbatim input object exposed to the script as `args`. Pass timestamps/seeds here (the script may not generate them)."
23
+ },
24
+ "capabilities": {
25
+ "type": "object",
26
+ "description": "Per-run capability grant (the single consent point). Leaves get a read-only baseline by default.",
27
+ "properties": {
28
+ "tools": {
29
+ "type": "array",
30
+ "items": { "type": "string" },
31
+ "description": "Side-effecting tool names granted to leaves on top of the read-only baseline."
32
+ },
33
+ "hostFunctions": {
34
+ "type": "array",
35
+ "items": { "type": "string" },
36
+ "description": "Host-function names the run may invoke."
37
+ },
38
+ "persona": {
39
+ "type": "boolean",
40
+ "description": "Grant leaves access to persona (identity + memory) context."
41
+ }
42
+ }
43
+ },
44
+ "label": {
45
+ "type": "string",
46
+ "description": "Human-readable label for display; defaults to the script's meta.name."
47
+ }
48
+ }
49
+ },
50
+ "executor": "tools/run-workflow.ts",
51
+ "execution_target": "host"
52
+ },
53
+ {
54
+ "name": "manage_workflows",
55
+ "description": "Inspect or control workflow runs started by run_workflow: status, get_result (the full result of a finished run — the completion notification truncates large results), abort, resume, list_runs, and list_profiles. See SKILL.md for details.",
56
+ "category": "workflow",
57
+ "risk": "low",
58
+ "input_schema": {
59
+ "type": "object",
60
+ "properties": {
61
+ "action": {
62
+ "type": "string",
63
+ "enum": [
64
+ "status",
65
+ "get_result",
66
+ "abort",
67
+ "resume",
68
+ "list_runs",
69
+ "list_profiles"
70
+ ],
71
+ "description": "What to do."
72
+ },
73
+ "run_id": {
74
+ "type": "string",
75
+ "description": "Target run id (required for \"status\", \"get_result\", \"abort\", and \"resume\")."
76
+ }
77
+ },
78
+ "required": ["action"]
79
+ },
80
+ "executor": "tools/manage-workflows.ts",
81
+ "execution_target": "host"
82
+ }
83
+ ]
84
+ }
@@ -0,0 +1,12 @@
1
+ import type {
2
+ ToolContext,
3
+ ToolExecutionResult,
4
+ } from "../../../../tools/types.js";
5
+ import { executeManageWorkflows } from "../../../../tools/workflows/manage-workflows.js";
6
+
7
+ export async function run(
8
+ input: Record<string, unknown>,
9
+ context: ToolContext,
10
+ ): Promise<ToolExecutionResult> {
11
+ return executeManageWorkflows(input, context);
12
+ }
@@ -0,0 +1,12 @@
1
+ import type {
2
+ ToolContext,
3
+ ToolExecutionResult,
4
+ } from "../../../../tools/types.js";
5
+ import { executeRunWorkflow } from "../../../../tools/workflows/run-workflow.js";
6
+
7
+ export async function run(
8
+ input: Record<string, unknown>,
9
+ context: ToolContext,
10
+ ): Promise<ToolExecutionResult> {
11
+ return executeRunWorkflow(input, context);
12
+ }
@@ -24,7 +24,7 @@ import * as appCreate from "./bundled-skills/app-builder/tools/app-create.js";
24
24
  import * as appDelete from "./bundled-skills/app-builder/tools/app-delete.js";
25
25
  import * as appGenerateIcon from "./bundled-skills/app-builder/tools/app-generate-icon.js";
26
26
  import * as appList from "./bundled-skills/app-builder/tools/app-list.js";
27
- import * as appRefresh from "./bundled-skills/app-builder/tools/app-refresh.js";
27
+ import * as appBuilder_appRefresh from "./bundled-skills/app-builder/tools/app-refresh.js";
28
28
  import * as appUpdate from "./bundled-skills/app-builder/tools/app-update.js";
29
29
  // ── app-control ────────────────────────────────────────────────────────────────
30
30
  import * as appControlClick from "./bundled-skills/app-control/tools/app-control-click.js";
@@ -88,6 +88,8 @@ import * as messagingRead from "./bundled-skills/messaging/tools/messaging-read.
88
88
  import * as messagingSearch from "./bundled-skills/messaging/tools/messaging-search.js";
89
89
  import * as messagingSend from "./bundled-skills/messaging/tools/messaging-send.js";
90
90
  import * as messagingSenderDigest from "./bundled-skills/messaging/tools/messaging-sender-digest.js";
91
+ // ── personal-page ──────────────────────────────────────────────────────────────
92
+ import * as personalPage_appRefresh from "./bundled-skills/personal-page/tools/app-refresh.js";
91
93
  // ── phone-calls ────────────────────────────────────────────────────────────────
92
94
  import * as callEnd from "./bundled-skills/phone-calls/tools/call-end.js";
93
95
  import * as callStart from "./bundled-skills/phone-calls/tools/call-start.js";
@@ -127,6 +129,9 @@ import * as subagentSpawn from "./bundled-skills/subagent/tools/subagent-spawn.j
127
129
  import * as subagentStatus from "./bundled-skills/subagent/tools/subagent-status.js";
128
130
  // ── transcribe ─────────────────────────────────────────────────────────────────
129
131
  import * as transcribeMedia from "./bundled-skills/transcribe/tools/transcribe-media.js";
132
+ // ── workflows ──────────────────────────────────────────────────────────────────
133
+ import * as manageWorkflows from "./bundled-skills/workflows/tools/manage-workflows.js";
134
+ import * as runWorkflow from "./bundled-skills/workflows/tools/run-workflow.js";
130
135
 
131
136
  // ─── Registry ────────────────────────────────────────────────────────────────
132
137
 
@@ -143,7 +148,7 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
143
148
  ["app-builder:tools/app-create.ts", appCreate],
144
149
  ["app-builder:tools/app-update.ts", appUpdate],
145
150
  ["app-builder:tools/app-delete.ts", appDelete],
146
- ["app-builder:tools/app-refresh.ts", appRefresh],
151
+ ["app-builder:tools/app-refresh.ts", appBuilder_appRefresh],
147
152
  ["app-builder:tools/app-generate-icon.ts", appGenerateIcon],
148
153
  ["app-builder:tools/app-list.ts", appList],
149
154
 
@@ -223,6 +228,9 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
223
228
  ["messaging:tools/messaging-sender-digest.ts", messagingSenderDigest],
224
229
  ["messaging:tools/messaging-archive-by-sender.ts", messagingArchiveBySender],
225
230
 
231
+ // personal-page
232
+ ["personal-page:tools/app-refresh.ts", personalPage_appRefresh],
233
+
226
234
  // phone-calls
227
235
  ["phone-calls:tools/call-start.ts", callStart],
228
236
  ["phone-calls:tools/call-status.ts", callStatus],
@@ -269,4 +277,8 @@ export const bundledToolRegistry = new Map<string, SkillToolScript>([
269
277
 
270
278
  // transcribe
271
279
  ["transcribe:tools/transcribe-media.ts", transcribeMedia],
280
+
281
+ // workflows
282
+ ["workflows:tools/run-workflow.ts", runWorkflow],
283
+ ["workflows:tools/manage-workflows.ts", manageWorkflows],
272
284
  ]);
@@ -125,4 +125,9 @@ export const CALL_SITE_DEFAULTS: Record<LLMCallSite, CallSiteDefaultConfig> = {
125
125
  thinking: { enabled: false },
126
126
  disableCache: true,
127
127
  },
128
+ workflowLeaf: {
129
+ profile: "cost-optimized",
130
+ effort: "low",
131
+ thinking: { enabled: false },
132
+ },
128
133
  };
@@ -14,7 +14,7 @@
14
14
  "scope": "assistant",
15
15
  "key": "memory-retrospective-fork",
16
16
  "label": "Fork-based memory retrospective",
17
- "description": "Fork the source conversation through its latest message for memory retrospectives, instead of rendering the slice into a transcript and waking an empty background conversation. Lets the retrospective hit the provider prompt cache and read compaction summary + tail messages natively.",
17
+ "description": "Fork the source conversation through its latest message for memory retrospectives, instead of rendering the slice into a transcript and waking an empty background conversation. The retrospective reads the conversation natively, including any inherited compaction summary and tail messages. Provider prompt-cache reuse additionally requires memory.retrospective.matchConversationProfile.",
18
18
  "defaultEnabled": false
19
19
  },
20
20
  {
@@ -36,12 +36,12 @@
36
36
  },
37
37
  {
38
38
  "id": "experiment-activation-flow-2026-06-03",
39
- "scope": "client",
39
+ "scope": "both",
40
40
  "key": "experiment-activation-flow-2026-06-03",
41
41
  "label": "Activation Flow Experiment 2026-06-03",
42
- "description": "Multivariate activation-flow experiment. control = standard flow; variant-a = activation rail. Targeted via LaunchDarkly.",
42
+ "description": "Multivariate activation-flow experiment. control = standard flow; variant-a = activation rail; personal-page = preseeded personal-page app (read by the daemon, hence scope \"both\"). Targeted via LaunchDarkly.",
43
43
  "defaultEnabled": "control",
44
- "values": ["control", "variant-a"]
44
+ "values": ["control", "variant-a", "personal-page"]
45
45
  },
46
46
  {
47
47
  "id": "local-docker-enabled",
@@ -410,6 +410,14 @@
410
410
  "label": "Self-intro first message",
411
411
  "description": "On the first conversation, send a natural self-introduction (e.g. \"Hi Vela, I'm alex. Nice to meet you.\") on the user's behalf and route it through real LLM inference, instead of serving the canned first greeting. Names come from the onboarding context; falls back to the canned greeting when no name is known. Exposed to clients so pre-hatch onboarding can compute the source-of-truth initial message, and to the assistant so older clients can still be gated server-side. See assistant/src/daemon/first-greeting.ts (buildSelfIntroMessage).",
412
412
  "defaultEnabled": false
413
+ },
414
+ {
415
+ "id": "workflows",
416
+ "scope": "assistant",
417
+ "key": "workflows",
418
+ "label": "Assistant Workflows",
419
+ "description": "Enable the sandboxed workflow orchestration engine (script-driven parallel leaf agents).",
420
+ "defaultEnabled": false
413
421
  }
414
422
  ]
415
423
  }
@@ -27,11 +27,18 @@ export function resolveEffectiveContextWindow({
27
27
  llm,
28
28
  callSite,
29
29
  overrideProfile,
30
+ forceOverrideProfile,
30
31
  selectionSeed,
31
32
  }: {
32
33
  llm: LLMConfig;
33
34
  callSite: LLMCallSite;
34
35
  overrideProfile?: string;
36
+ /**
37
+ * Float `overrideProfile` above the call-site layers (see
38
+ * `ResolveCallSiteOpts.forceOverrideProfile`). Threaded so context-window
39
+ * sizing reflects the same profile the dispatch path resolves.
40
+ */
41
+ forceOverrideProfile?: boolean;
35
42
  /**
36
43
  * Per-conversation mix seed (the conversation id). Threaded so context-window
37
44
  * sizing for a mix profile reflects the same arm the dispatch path picks.
@@ -40,6 +47,7 @@ export function resolveEffectiveContextWindow({
40
47
  }): EffectiveContextWindow {
41
48
  const resolved = resolveCallSiteConfig(callSite, llm, {
42
49
  overrideProfile,
50
+ forceOverrideProfile,
43
51
  selectionSeed,
44
52
  });
45
53
  const catalogModel = PROVIDER_CATALOG.find(
@@ -32,6 +32,19 @@ import {
32
32
  * 4. `llm.profiles[llm.activeProfile]`
33
33
  * 5. `llm.profiles[opts.overrideProfile]`
34
34
  *
35
+ * `opts.forceOverrideProfile` is an explicit escape hatch for non-main-agent
36
+ * call sites: when true (and `opts.overrideProfile` resolves to a defined
37
+ * profile), the override profile floats ABOVE the call-site layers — the
38
+ * non-main ordering becomes default → activeProfile → site profile →
39
+ * call-site override → overrideProfile. This mirrors how `mainAgent` treats
40
+ * the user's chat-model selection as authoritative, and exists for callers
41
+ * that must run a background call site under a specific conversation's
42
+ * inference profile (e.g. fork-based memory retrospectives matching the
43
+ * source conversation for provider prompt-cache reuse). When the referenced
44
+ * profile is missing, the flag is inert and the normal precedence applies
45
+ * (same silent fall-through as any `overrideProfile` reference); for
46
+ * `mainAgent` the flag is a no-op because the override already sits on top.
47
+ *
35
48
  * Nested objects (`thinking`, `contextWindow`, and
36
49
  * `contextWindow.overflowRecovery`) are deep-merged so partial overrides at
37
50
  * any nesting level merge into — rather than replace — the corresponding
@@ -54,6 +67,14 @@ import {
54
67
  */
55
68
  export interface ResolveCallSiteOpts {
56
69
  overrideProfile?: string;
70
+ /**
71
+ * Float `overrideProfile` above the call-site layers (named site profile +
72
+ * call-site override) for non-main-agent call sites. See the
73
+ * `resolveCallSiteConfig` docstring for the resulting precedence and the
74
+ * use case. Inert when `overrideProfile` is absent or references a missing
75
+ * profile, and a no-op for `mainAgent`.
76
+ */
77
+ forceOverrideProfile?: boolean;
57
78
  /**
58
79
  * Per-conversation seed for expanding `mix` profiles. The chosen constituent
59
80
  * is a deterministic function of `selectionSeed` + the mix profile's own
@@ -101,6 +122,15 @@ export function resolveCallSiteConfig(
101
122
  appendCallSiteLayers(layers, callSite, llm, site, opts, biasRef);
102
123
  appendProfileLayer(layers, activeFragment, biasRef);
103
124
  appendProfileLayer(layers, overrideFragment, biasRef);
125
+ } else if (opts.forceOverrideProfile === true && overrideFragment != null) {
126
+ // Escape hatch: float the override profile above the call-site layers,
127
+ // mirroring mainAgent's treatment of the user's chat-model selection.
128
+ // Guarded on a resolved fragment so a missing profile reference degrades
129
+ // to the normal precedence below instead of silently dropping the
130
+ // call-site layers' standing.
131
+ appendProfileLayer(layers, activeFragment, biasRef);
132
+ appendCallSiteLayers(layers, callSite, llm, site, opts, biasRef);
133
+ appendProfileLayer(layers, overrideFragment, biasRef);
104
134
  } else {
105
135
  appendProfileLayer(layers, activeFragment, biasRef);
106
136
  appendProfileLayer(layers, overrideFragment, biasRef);
@@ -0,0 +1,22 @@
1
+ import { profile } from "../profile-data";
2
+ import { AnimatedParagraph, WordsPullUpMultiStyle } from "./animations";
3
+
4
+ export function About() {
5
+ const { about } = profile;
6
+ return (
7
+ <section class="about" id="about">
8
+ <div class="about-card">
9
+ <div class="about-label">{about.label}</div>
10
+ <h2 class="about-heading">
11
+ <WordsPullUpMultiStyle
12
+ segments={about.heading.map((seg) => ({
13
+ text: seg.text,
14
+ className: seg.italic ? "serif-italic" : undefined,
15
+ }))}
16
+ />
17
+ </h2>
18
+ <AnimatedParagraph className="about-body" text={about.body} />
19
+ </div>
20
+ </section>
21
+ );
22
+ }
@@ -0,0 +1,16 @@
1
+ import { profile } from "../profile-data";
2
+ import { About } from "./About";
3
+ import { Features } from "./Features";
4
+ import { Hero } from "./Hero";
5
+ import { Pending } from "./Pending";
6
+
7
+ export function App() {
8
+ if (profile.status !== "ready") return <Pending />;
9
+ return (
10
+ <main>
11
+ <Hero />
12
+ <About />
13
+ <Features />
14
+ </main>
15
+ );
16
+ }
@@ -0,0 +1,77 @@
1
+ import type { ComponentChildren } from "preact";
2
+
3
+ import { profile } from "../profile-data";
4
+ import { StaggerCard, WordsPullUpMultiStyle } from "./animations";
5
+ import { ArrowRight, Check } from "./icons";
6
+ import { CARD_ICONS } from "./media";
7
+
8
+ function CheckLine({ children }: { children: ComponentChildren }) {
9
+ return (
10
+ <li>
11
+ <Check className="check" />
12
+ <span>{children}</span>
13
+ </li>
14
+ );
15
+ }
16
+
17
+ function LearnMore() {
18
+ return (
19
+ <a class="learn-more">
20
+ Learn more
21
+ <ArrowRight size={14} />
22
+ </a>
23
+ );
24
+ }
25
+
26
+ export function Features() {
27
+ const { features } = profile;
28
+ return (
29
+ <section class="features">
30
+ <div class="features-inner">
31
+ <div class="features-header">
32
+ <div>
33
+ <WordsPullUpMultiStyle
34
+ segments={[{ text: features.headingLine1, className: "line1" }]}
35
+ />
36
+ </div>
37
+ <div style={{ marginTop: "0.3em" }}>
38
+ <WordsPullUpMultiStyle
39
+ segments={[{ text: features.headingLine2, className: "line2" }]}
40
+ delayBase={0.2}
41
+ />
42
+ </div>
43
+ </div>
44
+
45
+ <div class="feature-grid">
46
+ <StaggerCard index={0} className="feature-card visual">
47
+ <div class="card-backdrop" />
48
+ <div class="vlabel">{features.statusLabel}</div>
49
+ </StaggerCard>
50
+
51
+ {features.cards.slice(0, 3).map((card, i) => (
52
+ <StaggerCard
53
+ index={i + 1}
54
+ className="feature-card"
55
+ id={`feature-${i}`}
56
+ key={card.title}
57
+ >
58
+ <img
59
+ class="feature-icon"
60
+ src={CARD_ICONS[i % CARD_ICONS.length]}
61
+ alt=""
62
+ />
63
+ <div class="feature-num">{`0${i + 1}`}</div>
64
+ <div class="feature-title">{card.title}</div>
65
+ <ul class="feature-list">
66
+ {card.bullets.map((b) => (
67
+ <CheckLine key={b}>{b}</CheckLine>
68
+ ))}
69
+ </ul>
70
+ <LearnMore />
71
+ </StaggerCard>
72
+ ))}
73
+ </div>
74
+ </div>
75
+ </section>
76
+ );
77
+ }
@@ -0,0 +1,57 @@
1
+ import { profile } from "../profile-data";
2
+ import { FadeIn, WordsPullUp } from "./animations";
3
+
4
+ function scrollToSection(id: string) {
5
+ document.getElementById(id)?.scrollIntoView({ behavior: "smooth" });
6
+ }
7
+
8
+ export function Hero() {
9
+ const { hero, features } = profile;
10
+ // Nav entries map to the page's real sections: the about card plus one
11
+ // entry per feature card. Labels come from the content itself, so every
12
+ // tab has a guaranteed scroll target.
13
+ const navItems = [
14
+ { label: "About", target: "about" },
15
+ ...features.cards.slice(0, 3).map((card, i) => ({
16
+ label: card.title.replace(/\.+$/, ""),
17
+ target: `feature-${i}`,
18
+ })),
19
+ ];
20
+ return (
21
+ <section class="hero">
22
+ <div class="hero-frame">
23
+ <div class="hero-backdrop" />
24
+ <div class="noise-overlay" />
25
+ <div class="hero-gradient" />
26
+
27
+ <nav class="navbar">
28
+ {navItems.map((item) => (
29
+ <a
30
+ href={`#${item.target}`}
31
+ key={item.target}
32
+ onClick={(e) => {
33
+ e.preventDefault();
34
+ scrollToSection(item.target);
35
+ }}
36
+ >
37
+ {item.label}
38
+ </a>
39
+ ))}
40
+ </nav>
41
+
42
+ <div class="hero-content">
43
+ <div class="hero-title-col">
44
+ <h1 class="hero-title">
45
+ <WordsPullUp text={hero.title} showAsterisk />
46
+ </h1>
47
+ </div>
48
+ <div class="hero-desc-col">
49
+ <FadeIn as="p" className="hero-desc" delay={0.5}>
50
+ {hero.description}
51
+ </FadeIn>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </section>
56
+ );
57
+ }
@@ -0,0 +1,28 @@
1
+ import { FadeIn, WordsPullUpMultiStyle } from "./animations";
2
+
3
+ export function Pending() {
4
+ return (
5
+ <section class="pending">
6
+ <div class="noise-overlay" />
7
+ <div class="pending-content">
8
+ <FadeIn as="div" className="pending-label">
9
+ YOUR PAGE
10
+ </FadeIn>
11
+ <h1 class="pending-heading">
12
+ <WordsPullUpMultiStyle
13
+ segments={[
14
+ { text: "Being" },
15
+ { text: "researched", className: "serif-italic" },
16
+ { text: "right now." },
17
+ ]}
18
+ delayBase={0.2}
19
+ />
20
+ </h1>
21
+ <FadeIn as="p" className="pending-sub" delay={0.9}>
22
+ Your assistant is out on the open web learning about you. Check back
23
+ in a minute.
24
+ </FadeIn>
25
+ </div>
26
+ </section>
27
+ );
28
+ }