veryfront 0.1.791 → 0.1.795

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 (30) hide show
  1. package/README.md +38 -87
  2. package/esm/deno.js +1 -1
  3. package/esm/src/agent/hosted/chat-runtime-agent-adapter.d.ts +1 -0
  4. package/esm/src/agent/hosted/chat-runtime-agent-adapter.d.ts.map +1 -1
  5. package/esm/src/agent/hosted/chat-runtime-agent-adapter.js +1 -0
  6. package/esm/src/agent/hosted/default-chat-runtime.d.ts.map +1 -1
  7. package/esm/src/agent/hosted/default-chat-runtime.js +1 -0
  8. package/esm/src/agent/runtime/skill-policy-enforcement.d.ts.map +1 -1
  9. package/esm/src/agent/runtime/skill-policy-enforcement.js +4 -2
  10. package/esm/src/agent/service/mcp-server-config.d.ts.map +1 -1
  11. package/esm/src/agent/service/mcp-server-config.js +5 -2
  12. package/esm/src/html/hydration-script-builder/templates/router.d.ts.map +1 -1
  13. package/esm/src/html/hydration-script-builder/templates/router.js +6 -0
  14. package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts +1 -0
  15. package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
  16. package/esm/src/platform/adapters/fs/veryfront/adapter.js +38 -18
  17. package/esm/src/release-assets/build-executor.d.ts +23 -0
  18. package/esm/src/release-assets/build-executor.d.ts.map +1 -1
  19. package/esm/src/release-assets/build-executor.js +262 -8
  20. package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +1 -0
  21. package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -1
  22. package/esm/src/rendering/orchestrator/pipeline-helpers.js +4 -0
  23. package/esm/src/rendering/orchestrator/pipeline.d.ts +1 -0
  24. package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
  25. package/esm/src/rendering/orchestrator/pipeline.js +25 -5
  26. package/esm/src/rendering/orchestrator/types.d.ts +2 -0
  27. package/esm/src/rendering/orchestrator/types.d.ts.map +1 -1
  28. package/esm/src/utils/version-constant.d.ts +1 -1
  29. package/esm/src/utils/version-constant.js +1 -1
  30. package/package.json +1 -1
package/README.md CHANGED
@@ -14,6 +14,44 @@ It gives you agents, tools, workflows, and a complete React rendering stack in a
14
14
  <img src="./assets/banner.svg" alt="Veryfront" width="100%">
15
15
  </p>
16
16
 
17
+ ## Get started
18
+
19
+ Create a new Veryfront Code app:
20
+
21
+ ```bash
22
+ npm create veryfront
23
+ ```
24
+
25
+ <details>
26
+ <summary>Use another package manager</summary>
27
+
28
+ ```bash
29
+ pnpm create veryfront
30
+ yarn create veryfront
31
+ bun create veryfront
32
+ deno init --npm veryfront
33
+ ```
34
+
35
+ </details>
36
+
37
+ Start from a template directly:
38
+
39
+ ```bash
40
+ npx veryfront init <PROJECT_NAME> --template <TEMPLATE>
41
+ ```
42
+
43
+ Available starters: `ai-agent`, `minimal`, `agentic-workflow`.
44
+
45
+ Install the `veryfront` binary for local development commands and the TUI:
46
+
47
+ ```bash
48
+ curl -fsSL https://veryfront.com/install.sh | sh
49
+ # or
50
+ brew install veryfront/tap/veryfront
51
+ ```
52
+
53
+ Follow the [Quickstart guide](https://veryfront.com/docs/code/getting-started/quickstart) to build your first app. For project setup options and template details, see [Create a project](https://veryfront.com/docs/code/getting-started/create-a-project). For the full documentation, visit [veryfront.com/docs/code](https://veryfront.com/docs/code).
54
+
17
55
  ## Why Veryfront Code?
18
56
 
19
57
  Purpose-built for TypeScript and React, Veryfront Code gives you everything you need to build agentic full-stack applications out-of-the-box.
@@ -50,99 +88,12 @@ Purpose-built for TypeScript and React, Veryfront Code gives you everything you
50
88
 
51
89
  - [**Extensions**](https://veryfront.com/docs/code/guides/extensions) - Extend Veryfront Code with contract-based packages for LLM providers, bundling, CSS, tracing, caching, and more.
52
90
 
53
- ## Get Started
54
-
55
- Use the interactive project wizard when you want to compare templates:
56
-
57
- ```bash
58
- npm create veryfront
59
- ```
60
-
61
- Choose a starting point directly with `npx` when you already know what you want
62
- to build:
63
-
64
- ```bash
65
- # Agent app with a chat UI, tool, and AG-UI route
66
- npx veryfront init support-agent --template ai-agent
67
-
68
- # Blank full-stack app with pages and routing
69
- npx veryfront init my-app --template minimal
70
-
71
- # Durable multi-step AI pipeline
72
- npx veryfront init my-workflow --template agentic-workflow
73
- ```
74
-
75
- <details>
76
- <summary>pnpm, yarn, bun, deno</summary>
77
-
78
- ```bash
79
- pnpm create veryfront
80
- yarn create veryfront
81
- bun create veryfront
82
- deno init --npm veryfront
83
- ```
84
-
85
- Binary install (recommended for the CLI/TUI):
86
-
87
- ```bash
88
- curl -fsSL https://veryfront.com/install.sh | sh
89
- # or
90
- brew install veryfront/tap/veryfront
91
- ```
92
-
93
- </details>
94
-
95
- Follow the [Quickstart guide](https://veryfront.com/docs/code/getting-started/quickstart) to build the agent app end-to-end, or use [Create a project](https://veryfront.com/docs/code/getting-started/create-a-project) to compare templates before you scaffold. For the full documentation, visit [veryfront.com/docs/code](https://veryfront.com/docs/code).
96
-
97
- ## Project Structure
98
-
99
- ```
100
- veryfront/
101
- ├── src/ # Framework core modules
102
- │ ├── agent/ # Agent runtime, AG-UI, hosted execution
103
- │ ├── tool/ # Tool definitions and registry
104
- │ ├── workflow/ # Durable DAG workflows with crash recovery
105
- │ ├── mcp/ # Model Context Protocol server
106
- │ ├── skill/ # Agent skills system (SKILL.md)
107
- │ ├── chat/ # Chat UI components and streaming
108
- │ ├── discovery/ # Auto-discovery of tools, agents, workflows
109
- │ ├── sandbox/ # Ephemeral compute environments
110
- │ ├── runs/ # Durable runs client
111
- │ ├── task/ # Task definitions and runner
112
- │ ├── channels/ # Control-plane agent routing
113
- │ ├── integrations/ # Third-party connector metadata
114
- │ ├── provider/ # AI model provider adapters
115
- │ ├── rendering/ # SSR/RSC engine
116
- │ ├── server/ # HTTP servers (dev + production)
117
- │ ├── routing/ # File-based routing
118
- │ ├── security/ # Rate limiting, CORS, CSP, validation
119
- │ └── ... # See src/README.md for full list
120
- ├── cli/ # CLI and TUI dashboard
121
- ├── extensions/ # First-party extension packages
122
- ├── docs/ # Architecture diagrams and guides
123
- ├── tests/ # Integration and E2E tests
124
- └── scripts/ # Development and build scripts
125
- ```
126
-
127
- ## Examples
128
-
129
- You can find standalone, runnable examples in the [veryfront-examples](https://github.com/veryfront/veryfront-examples) repo.
130
-
131
91
  ## Contributing
132
92
 
133
93
  Looking to contribute? All types of help are appreciated, from coding to testing and feature specification. Read [CONTRIBUTING.md](./CONTRIBUTING.md) for more details on how to get involved.
134
94
 
135
95
  If you are a developer and would like to contribute with code, please open an issue to discuss before opening a Pull Request.
136
96
 
137
- ## Supply-Chain Hardening
138
-
139
- Veryfront Code treats dependency changes as reviewed code changes.
140
-
141
- - Workspace Deno dependencies use exact versions and are resolved through the checked-in `deno.lock`.
142
- - `deno.json` sets `minimumDependencyAge` to delay freshly published dependency versions during Deno resolution.
143
- - `.npmrc` sets `save-exact=true` so npm-compatible tooling records exact versions.
144
- - The npm package generator pins automatic `dependencies`, `optionalDependencies`, and `devDependencies`; peer ranges remain available only for opt-in compatibility constraints.
145
-
146
97
  ## Support
147
98
 
148
99
  We have an [open community Discord](https://discord.gg/xWuRjafrtV). Come say hello and let us know if you have any questions or need help getting things running.
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "veryfront",
3
- "version": "0.1.791",
3
+ "version": "0.1.795",
4
4
  "license": "Apache-2.0",
5
5
  "nodeModulesDir": "auto",
6
6
  "minimumDependencyAge": {
@@ -12,6 +12,7 @@ export type HostedChatRuntimeAgentAdapterInput = {
12
12
  runtimeAgent: Pick<Agent, "stream">;
13
13
  runId?: string;
14
14
  agentId?: string;
15
+ authToken?: string;
15
16
  runStream?: HostedChatRuntimeAgentAdapterRunner;
16
17
  warnOrphanedToolInput?: (message: string, metadata: HostedChatRuntimeAgentAdapterWarning) => void;
17
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"chat-runtime-agent-adapter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-runtime-agent-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wEAAwE;AACxE,MAAM,MAAM,mCAAmC,GAAG,CAAC,OAAO,EACxD,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,yEAAyE;AACzE,MAAM,MAAM,oCAAoC,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,kCAAkC,GAAG;IAC/C,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,mCAAmC,CAAC;IAChD,qBAAqB,CAAC,EAAE,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,oCAAoC,KAC3C,IAAI,CAAC;CACX,CAAC;AAMF,gDAAgD;AAChD,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,kCAAkC,GACxC,sBAAsB,CAwDxB"}
1
+ {"version":3,"file":"chat-runtime-agent-adapter.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/chat-runtime-agent-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,wEAAwE;AACxE,MAAM,MAAM,mCAAmC,GAAG,CAAC,OAAO,EACxD,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,yEAAyE;AACzE,MAAM,MAAM,oCAAoC,GAAG;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,kCAAkC,GAAG;IAC/C,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,mCAAmC,CAAC;IAChD,qBAAqB,CAAC,EAAE,CACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,oCAAoC,KAC3C,IAAI,CAAC;CACX,CAAC;AAMF,gDAAgD;AAChD,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,kCAAkC,GACxC,sBAAsB,CAyDxB"}
@@ -14,6 +14,7 @@ export function createHostedChatRuntimeAgentAdapter(input) {
14
14
  context: {
15
15
  ...(input.runId ? { runId: input.runId } : {}),
16
16
  ...(input.agentId ? { agentId: input.agentId } : {}),
17
+ ...(input.authToken ? { authToken: input.authToken } : {}),
17
18
  abortSignal: streamInput.abortSignal,
18
19
  publishDataEvent: (event) => publishDataEvent(event),
19
20
  },
@@ -1 +1 @@
1
- {"version":3,"file":"default-chat-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/default-chat-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default-chat-runtime.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/hosted/default-chat-runtime.ts"],"names":[],"mappings":"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"}
@@ -157,6 +157,7 @@ export async function createDefaultHostedChatRuntime(input) {
157
157
  runtimeAgent,
158
158
  runId: taskContext.runId,
159
159
  agentId: taskContext.agentId,
160
+ authToken: taskContext.authToken,
160
161
  runStream: (operation) => runWithDefaultHostedRequestContext({
161
162
  taskContext,
162
163
  cloudContext,
@@ -1 +1 @@
1
- {"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAO/C,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,8BAA8B,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACtE,CAeA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAyBxE;AAOD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAStB;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAiCtB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,EACvC,kBAAkB,EAAE,OAAO,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAsBnB"}
1
+ {"version":3,"file":"skill-policy-enforcement.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/runtime/skill-policy-enforcement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO3C,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,iCAAiC,CAAC;AAIzC,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAO/C,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,SAAS,OAAO,EAAE,GAC3B;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACxC,8BAA8B,EAAE,wBAAwB,GAAG,SAAS,CAAC;CACtE,CAeA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAyBxE;AAOD,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAQjF;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAStB;AAED,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,GACtC,MAAM,EAAE,GAAG,SAAS,CAoCtB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjB;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EAAE,GAAG,SAAS,EACvC,kBAAkB,EAAE,OAAO,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAsBnB"}
@@ -78,9 +78,11 @@ export function narrowPolicyAfterSubmittedForm(activeSkillId, activeSkillPolicy)
78
78
  "update_file",
79
79
  ].includes(allowedToolName));
80
80
  }
81
- if (activeSkillId === "plan" ||
82
- activeSkillId === "create-agent" ||
81
+ if (activeSkillId === "create-agent" ||
83
82
  activeSkillId === "create-agentic-workflow") {
83
+ return activeSkillPolicy.filter((allowedToolName) => allowedToolName !== FORM_INPUT_TOOL_ID);
84
+ }
85
+ if (activeSkillId === "plan") {
84
86
  return activeSkillPolicy.filter((allowedToolName) => [
85
87
  "studio_suggestions",
86
88
  "list_files",
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server-config.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/service/mcp-server-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,MAAM,MAAM,uCAAuC,GAAG;IACpD,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0CAA0C,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GACnC,uCAAuC,GACvC,0CAA0C,GAC1C,kCAAkC,CAAC;AAEvC,MAAM,MAAM,sCAAsC,GAAG;IACnD,MAAM,EAAE,2BAA2B,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAgB,6BAA6B,IAAI,2BAA2B,EAAE,CAE7E;AAyDD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,sCAAsC,GAC5C,yBAAyB,GAAG,IAAI,CAUlC"}
1
+ {"version":3,"file":"mcp-server-config.d.ts","sourceRoot":"","sources":["../../../../src/src/agent/service/mcp-server-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAyB,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,MAAM,MAAM,uCAAuC,GAAG;IACpD,IAAI,EAAE,eAAe,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,0CAA0C,GAAG;IACvD,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAChD,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,yBAAyB,CAAC,YAAY,CAAC,CAAC;IACrD,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,2BAA2B,GACnC,uCAAuC,GACvC,0CAA0C,GAC1C,kCAAkC,CAAC;AAEvC,MAAM,MAAM,sCAAsC,GAAG;IACnD,MAAM,EAAE,2BAA2B,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAgB,6BAA6B,IAAI,2BAA2B,EAAE,CAE7E;AA4DD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,sCAAsC,GAC5C,yBAAyB,GAAG,IAAI,CAUlC"}
@@ -23,8 +23,11 @@ function createVeryfrontApiRemoteMcpConfig(input, server) {
23
23
  return {
24
24
  id: server.id ?? input.defaultSourceId ?? "veryfront-mcp",
25
25
  endpoint: input.apiMcpUrl,
26
- headers: {
27
- Authorization: `Bearer ${input.authToken}`,
26
+ headers: (context) => {
27
+ const authToken = typeof context?.authToken === "string" && context.authToken.length > 0
28
+ ? context.authToken
29
+ : input.authToken;
30
+ return { Authorization: `Bearer ${authToken}` };
28
31
  },
29
32
  };
30
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,cAmrB3B,CAAC"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../../src/src/html/hydration-script-builder/templates/router.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,cAyrB3B,CAAC"}
@@ -444,6 +444,12 @@ export const getRouterScript = () => `
444
444
  document.head.appendChild(styleEl);
445
445
  }
446
446
  log('Injected CSS for SPA navigation', { cssLength: pageData.css.length });
447
+ } else if (pageData.cssAction === 'clear') {
448
+ const existingStyle = document.getElementById('veryfront-spa-css');
449
+ if (existingStyle) {
450
+ existingStyle.remove();
451
+ log('Cleared SPA CSS for release stylesheet navigation');
452
+ }
447
453
  }
448
454
 
449
455
  let tree = React.createElement(PageComponent, {
@@ -31,6 +31,7 @@ export declare class VeryfrontFSAdapter implements FSAdapter {
31
31
  /** Whether running in proxy mode (shared adapter with per-request OAuth tokens) */
32
32
  private proxyMode;
33
33
  private getCurrentFileListCacheKey;
34
+ private syncClientContext;
34
35
  private getCachedFileListSync;
35
36
  private getCachedFileListAsync;
36
37
  constructor(config: FSAdapterConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/src/platform/adapters/fs/veryfront/adapter.ts"],"names":[],"mappings":"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"}
@@ -61,6 +61,18 @@ export class VeryfrontFSAdapter {
61
61
  getCurrentFileListCacheKey() {
62
62
  return this.contentContext ? buildFileListCacheKey(this.contentContext) : undefined;
63
63
  }
64
+ syncClientContext() {
65
+ this.client.clearRequestBranch();
66
+ if (this.contentContext) {
67
+ this.client.setContext(toClientContext(this.contentContext));
68
+ }
69
+ else {
70
+ this.client.clearContext();
71
+ }
72
+ if (this.requestBranch) {
73
+ this.client.setRequestBranch(this.requestBranch);
74
+ }
75
+ }
64
76
  getCachedFileListSync() {
65
77
  const cacheKey = this.getCurrentFileListCacheKey();
66
78
  if (!cacheKey)
@@ -204,10 +216,11 @@ export class VeryfrontFSAdapter {
204
216
  if (!this.contentContext) {
205
217
  logger.debug("Step 3: resolveContentSource START", { projectSlug });
206
218
  const step3Start = performance.now();
207
- this.contentContext = await resolveContentContext(this.client, this.contentSource, this.projectSlug);
219
+ const resolvedContext = await resolveContentContext(this.client, this.contentSource, this.projectSlug);
220
+ this.setContentContext(resolvedContext);
208
221
  logger.debug("Step 3: resolveContentSource DONE", {
209
222
  projectSlug,
210
- sourceType: this.contentContext.sourceType,
223
+ sourceType: resolvedContext.sourceType,
211
224
  duration: `${(performance.now() - step3Start).toFixed(2)}ms`,
212
225
  });
213
226
  }
@@ -217,17 +230,24 @@ export class VeryfrontFSAdapter {
217
230
  sourceType: this.contentContext.sourceType,
218
231
  });
219
232
  }
233
+ const contentContext = this.contentContext;
234
+ if (!contentContext) {
235
+ throw toError(createError({
236
+ type: "config",
237
+ message: "Veryfront adapter content context resolution failed",
238
+ }));
239
+ }
220
240
  logger.debug("Content context resolved", {
221
- sourceType: this.contentContext.sourceType,
222
- projectSlug: this.contentContext.projectSlug,
223
- branch: this.contentContext.branch,
224
- environmentName: this.contentContext.environmentName,
225
- releaseId: this.contentContext.releaseId,
241
+ sourceType: contentContext.sourceType,
242
+ projectSlug: contentContext.projectSlug,
243
+ branch: contentContext.branch,
244
+ environmentName: contentContext.environmentName,
245
+ releaseId: contentContext.releaseId,
226
246
  });
227
- const cacheKey = buildFileListCacheKey(this.contentContext);
247
+ const cacheKey = buildFileListCacheKey(contentContext);
228
248
  logger.debug("Step 4: fetchFileList START", { projectSlug, cacheKey });
229
249
  try {
230
- const files = await fetchFileListForContext(this.client, this.contentContext);
250
+ const files = await fetchFileListForContext(this.client, contentContext);
231
251
  const fileSummary = summarizeFileList(files);
232
252
  await this.cache.setAsync(cacheKey, files);
233
253
  this.fileListReadyResolve?.();
@@ -253,11 +273,11 @@ export class VeryfrontFSAdapter {
253
273
  fileCount: files.length,
254
274
  totalDuration: `${(performance.now() - initStartTime).toFixed(2)}ms`,
255
275
  });
256
- if (this.contentContext.sourceType === "branch") {
276
+ if (contentContext.sourceType === "branch") {
257
277
  logger.debug("Initialized (branch mode)", {
258
278
  projectId: this.client.getProjectId(),
259
279
  files: files.length,
260
- branch: this.contentContext.branch,
280
+ branch: contentContext.branch,
261
281
  proxyMode: this.proxyMode,
262
282
  });
263
283
  this.wsManager.connect(projectId);
@@ -266,13 +286,13 @@ export class VeryfrontFSAdapter {
266
286
  logger.debug("Initialized (published mode)", {
267
287
  projectId: this.client.getProjectId(),
268
288
  files: files.length,
269
- sourceType: this.contentContext.sourceType,
270
- environmentName: this.contentContext.environmentName,
271
- releaseId: this.contentContext.releaseId,
289
+ sourceType: contentContext.sourceType,
290
+ environmentName: contentContext.environmentName,
291
+ releaseId: contentContext.releaseId,
272
292
  });
273
293
  // Keep a WebSocket connection in environment mode to receive deployment pokes.
274
294
  // Release mode is immutable, so no need to keep a live connection.
275
- if (this.contentContext.sourceType === "environment") {
295
+ if (contentContext.sourceType === "environment") {
276
296
  this.wsManager.connect(projectId);
277
297
  }
278
298
  }
@@ -475,14 +495,14 @@ export class VeryfrontFSAdapter {
475
495
  }
476
496
  setRequestBranch(branch) {
477
497
  this.requestBranch = branch;
478
- this.client.setRequestBranch(branch);
498
+ this.syncClientContext();
479
499
  }
480
500
  getRequestBranch() {
481
501
  return this.requestBranch;
482
502
  }
483
503
  clearRequestBranch() {
484
504
  this.requestBranch = null;
485
- this.client.clearRequestBranch();
505
+ this.syncClientContext();
486
506
  }
487
507
  setContentContext(context) {
488
508
  const oldContext = this.contentContext;
@@ -513,7 +533,7 @@ export class VeryfrontFSAdapter {
513
533
  registerManifestFetcherForRelease(nextReleaseId, buildManifestFetcher(this.client));
514
534
  }
515
535
  this.contentContext = context;
516
- this.client.setContext(toClientContext(context));
536
+ this.syncClientContext();
517
537
  if (contextChanged) {
518
538
  this.statOps.clearIndex();
519
539
  this.dirOps.clearTree();
@@ -44,6 +44,11 @@ export interface ReleaseAssetBuildInput {
44
44
  * Injectable for tests.
45
45
  */
46
46
  transform?: ReleaseAssetTransform;
47
+ /**
48
+ * Optional HTTP dependency vendor. Defaults to the existing HTTP module cache
49
+ * and is injectable so tests do not depend on live package CDN behavior.
50
+ */
51
+ vendorHttpImports?: ReleaseAssetHttpDependencyVendor;
47
52
  }
48
53
  export type ReleaseAssetTransform = (source: string, sourceFile: string, projectDir: string, adapter: any, options: {
49
54
  projectId: string;
@@ -51,6 +56,24 @@ export type ReleaseAssetTransform = (source: string, sourceFile: string, project
51
56
  ssr: boolean;
52
57
  reactVersion?: string;
53
58
  }) => Promise<string>;
59
+ export interface ReleaseAssetVendorDependency {
60
+ /** Specifier currently used by transformed code after vendoring. */
61
+ specifier: string;
62
+ /** Stable manifest key, normally the original HTTP source URL. */
63
+ manifestKey: string;
64
+ /** Absolute local cache path when the dependency came from disk. */
65
+ sourcePath?: string;
66
+ /** Browser ESM source for this dependency. */
67
+ code: string;
68
+ }
69
+ export interface ReleaseAssetVendorResult {
70
+ code: string;
71
+ dependencies: ReleaseAssetVendorDependency[];
72
+ }
73
+ export type ReleaseAssetHttpDependencyVendor = (code: string, options: {
74
+ tempDir: string;
75
+ reactVersion?: string;
76
+ }) => Promise<ReleaseAssetVendorResult>;
54
77
  /** Subset of the API client used by the builder (eases testing). */
55
78
  export interface ReleaseAssetBuildClient {
56
79
  beginReleaseAssetManifestBuild(version: string): Promise<{
@@ -1 +1 @@
1
- {"version":3,"file":"build-executor.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/build-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqBH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAe/C,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,MAAM,EAAE,uBAAuB,CAAC;IAChC,sDAAsD;IAEtD,OAAO,EAAE,GAAG,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,MAAM,qBAAqB,GAAG,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAElB,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,KAC9E,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,oEAAoE;AACpE,MAAM,WAAW,uBAAuB;IACtC,8BAA8B,CAC5B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpE,mBAAmB,CACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACtD,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClD,uBAAuB,CACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzD,+BAA+B,CAC7B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,GAAG,QAAQ,EAC3B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB;;;;;;;OAOG;IACH,iBAAiB,CAAC,CAChB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACrE;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2cD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,sBAAsB,EAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,uBAAuB,CAAC,CA2ClC"}
1
+ {"version":3,"file":"build-executor.d.ts","sourceRoot":"","sources":["../../../src/src/release-assets/build-executor.ts"],"names":[],"mappings":"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"}
@@ -17,9 +17,11 @@
17
17
  import { serverLogger } from "../utils/index.js";
18
18
  import { VERSION } from "../utils/version.js";
19
19
  import { createFileSystem } from "../platform/compat/fs.js";
20
- import { dirname, join } from "../platform/compat/path/index.js";
20
+ import { dirname, join, normalize } from "../platform/compat/path/index.js";
21
21
  import { resolveFrameworkSourcePath } from "../platform/compat/framework-source-resolver.js";
22
22
  import { transformToESM } from "../transforms/esm-transform.js";
23
+ import { cacheHttpImportsToLocal } from "../transforms/esm/http-cache.js";
24
+ import { extractSourceUrl } from "../transforms/esm/source-url-embed.js";
23
25
  import { parseImports, replaceSpecifiers } from "../transforms/esm/lexer.js";
24
26
  import { PLATFORM_UTILITIES } from "../html/utils.js";
25
27
  import { extractCandidatesFromFiles } from "../html/styles-builder/candidate-extractor.js";
@@ -191,6 +193,9 @@ async function collectProjectModuleImports(code, logicalPath, knownPaths) {
191
193
  }
192
194
  async function rewriteProjectModuleImports(code, logicalPath, moduleAssets, knownPaths, dependencyUrls) {
193
195
  function rewriteSpecifier(specifier) {
196
+ const dependencyUrl = dependencyUrls.get(specifier.replace(/[?#].*$/, ""));
197
+ if (dependencyUrl)
198
+ return dependencyUrl;
194
199
  if (specifier.startsWith("/_vf_modules/")) {
195
200
  const dependencyUrl = dependencyUrls.get(specifier.replace(/[?#].*$/, ""));
196
201
  if (dependencyUrl)
@@ -202,11 +207,210 @@ async function rewriteProjectModuleImports(code, logicalPath, moduleAssets, know
202
207
  }
203
208
  return await replaceSpecifiers(code, (specifier) => rewriteSpecifier(specifier));
204
209
  }
205
- function buildDependencyUrlMap(_dependencies) {
206
- // Framework barrels can contain their own relative import closure. Keep those
207
- // URLs on the module server until the builder rewrites and uploads the full
208
- // framework closure, otherwise the browser resolves relatives under /_vf/assets.
209
- return new Map();
210
+ function buildDependencyUrlMap(dependencies, dependencyModules) {
211
+ const urls = new Map();
212
+ for (const [manifestKey, entry] of Object.entries(dependencies)) {
213
+ const dependency = dependencyModules?.get(manifestKey);
214
+ if (!dependency)
215
+ continue;
216
+ const url = releaseAssetUrl(entry.contentHash, "js");
217
+ urls.set(manifestKey, url);
218
+ urls.set(entry.logicalPath, url);
219
+ for (const specifier of dependency.specifiers) {
220
+ urls.set(normalizeDependencySpecifier(specifier), url);
221
+ }
222
+ }
223
+ return urls;
224
+ }
225
+ function addDependencyModule(dependencies, dependency) {
226
+ const sourcePath = dependency.sourcePath ?? resolveLocalDependencyPath(dependency.specifier) ??
227
+ undefined;
228
+ const existing = dependencies.get(dependency.manifestKey);
229
+ if (existing) {
230
+ existing.specifiers.add(dependency.specifier);
231
+ existing.sourcePath ??= sourcePath;
232
+ return;
233
+ }
234
+ dependencies.set(dependency.manifestKey, {
235
+ manifestKey: dependency.manifestKey,
236
+ specifiers: new Set([dependency.specifier]),
237
+ sourcePath,
238
+ code: dependency.code,
239
+ });
240
+ }
241
+ function normalizeDependencySpecifier(specifier) {
242
+ return specifier.replace(/[?#].*$/, "");
243
+ }
244
+ function resolveLocalDependencyPath(specifier, parentFilePath) {
245
+ const normalized = normalizeDependencySpecifier(specifier);
246
+ if (normalized.startsWith("file://")) {
247
+ try {
248
+ return normalize(decodeURIComponent(new URL(normalized).pathname));
249
+ }
250
+ catch (_) {
251
+ return null;
252
+ }
253
+ }
254
+ if (!parentFilePath || (!normalized.startsWith("./") && !normalized.startsWith("../"))) {
255
+ return null;
256
+ }
257
+ return normalize(join(dirname(parentFilePath), normalized));
258
+ }
259
+ function isPathInsideRoot(filePath, rootPath) {
260
+ const file = normalize(filePath);
261
+ const root = normalize(rootPath);
262
+ return file === root || file.startsWith(`${root}/`) || file.startsWith(`${root}\\`);
263
+ }
264
+ async function collectLocalHttpDependencyModules(code, dependencies, cacheDir) {
265
+ const fs = createFileSystem();
266
+ const cacheRoot = normalize(cacheDir);
267
+ const seen = new Set();
268
+ const queue = [];
269
+ for (const imp of await parseImports(code)) {
270
+ if (imp.n)
271
+ queue.push({ specifier: imp.n });
272
+ }
273
+ while (queue.length > 0) {
274
+ const { specifier, parentFilePath } = queue.shift();
275
+ const filePath = resolveLocalDependencyPath(specifier, parentFilePath);
276
+ if (!filePath || seen.has(filePath))
277
+ continue;
278
+ if (!isPathInsideRoot(filePath, cacheRoot)) {
279
+ throw new Error(`Vendored HTTP dependency resolved outside cache root: ${specifier}`);
280
+ }
281
+ seen.add(filePath);
282
+ const depCode = await fs.readTextFile(filePath);
283
+ const manifestKey = extractSourceUrl(depCode) ?? `file://${filePath}`;
284
+ const depSpecifiers = new Set([
285
+ normalizeDependencySpecifier(specifier),
286
+ `file://${filePath}`,
287
+ ]);
288
+ const existing = dependencies.get(manifestKey);
289
+ if (existing) {
290
+ for (const depSpecifier of depSpecifiers)
291
+ existing.specifiers.add(depSpecifier);
292
+ existing.sourcePath ??= filePath;
293
+ }
294
+ else {
295
+ dependencies.set(manifestKey, {
296
+ manifestKey,
297
+ specifiers: depSpecifiers,
298
+ sourcePath: filePath,
299
+ code: depCode,
300
+ });
301
+ }
302
+ for (const imp of await parseImports(depCode)) {
303
+ if (imp.n)
304
+ queue.push({ specifier: imp.n, parentFilePath: filePath });
305
+ }
306
+ }
307
+ }
308
+ async function vendorHttpImportsWithCache(code, options) {
309
+ const imports = await parseImports(code);
310
+ if (!imports.some((imp) => imp.n &&
311
+ (imp.n.startsWith("http://") || imp.n.startsWith("https://") || imp.n.startsWith("npm:")))) {
312
+ return { code, dependencies: [] };
313
+ }
314
+ const cacheDir = join(options.tempDir, ".veryfront-http-bundle");
315
+ const result = await cacheHttpImportsToLocal(code, {
316
+ cacheDir,
317
+ importMap: { imports: {}, scopes: {} },
318
+ reactVersion: options.reactVersion,
319
+ });
320
+ const dependencies = new Map();
321
+ await collectLocalHttpDependencyModules(result.code, dependencies, cacheDir);
322
+ return {
323
+ code: result.code,
324
+ dependencies: [...dependencies.values()].flatMap((dependency) => [...dependency.specifiers].map((specifier) => ({
325
+ specifier,
326
+ manifestKey: dependency.manifestKey,
327
+ sourcePath: dependency.sourcePath,
328
+ code: dependency.code,
329
+ }))),
330
+ };
331
+ }
332
+ async function finalizeDependencyModules(dependencyModules, uploadQueue, pendingBytes) {
333
+ const bySpecifier = new Map();
334
+ const byFilePath = new Map();
335
+ for (const dependency of dependencyModules.values()) {
336
+ for (const specifier of dependency.specifiers) {
337
+ bySpecifier.set(normalizeDependencySpecifier(specifier), dependency);
338
+ const filePath = resolveLocalDependencyPath(specifier);
339
+ if (filePath)
340
+ byFilePath.set(filePath, dependency);
341
+ }
342
+ if (dependency.sourcePath)
343
+ byFilePath.set(dependency.sourcePath, dependency);
344
+ }
345
+ const finalized = new Map();
346
+ const visiting = [];
347
+ function resolveDependencyImport(specifier, parent) {
348
+ const filePath = resolveLocalDependencyPath(specifier, parent.sourcePath);
349
+ if (filePath) {
350
+ const localDependency = byFilePath.get(filePath);
351
+ if (localDependency)
352
+ return localDependency;
353
+ }
354
+ return bySpecifier.get(normalizeDependencySpecifier(specifier)) ?? null;
355
+ }
356
+ async function finalize(manifestKey) {
357
+ const existing = finalized.get(manifestKey);
358
+ if (existing)
359
+ return existing;
360
+ if (visiting.includes(manifestKey)) {
361
+ const cycle = [...visiting.slice(visiting.indexOf(manifestKey)), manifestKey].join(" -> ");
362
+ throw new Error(`Circular release asset dependency graph: ${cycle}`);
363
+ }
364
+ const dependency = dependencyModules.get(manifestKey);
365
+ if (!dependency)
366
+ return null;
367
+ visiting.push(manifestKey);
368
+ try {
369
+ const imports = await parseImports(dependency.code);
370
+ for (const imp of imports) {
371
+ if (!imp.n)
372
+ continue;
373
+ const filePath = resolveLocalDependencyPath(imp.n, dependency.sourcePath);
374
+ if (filePath && !byFilePath.has(filePath)) {
375
+ throw new Error(`Unresolved vendored file dependency: ${imp.n}`);
376
+ }
377
+ const child = resolveDependencyImport(imp.n, dependency);
378
+ if (!child)
379
+ continue;
380
+ if (child.manifestKey === manifestKey) {
381
+ throw new Error(`Circular release asset dependency graph: ${manifestKey} -> ${manifestKey}`);
382
+ }
383
+ await finalize(child.manifestKey);
384
+ }
385
+ const rewritten = await replaceSpecifiers(dependency.code, (specifier) => {
386
+ const child = resolveDependencyImport(specifier, dependency);
387
+ if (!child)
388
+ return null;
389
+ const asset = finalized.get(child.manifestKey);
390
+ return asset ? releaseAssetUrl(asset.contentHash, "js") : null;
391
+ });
392
+ const entry = await addPreparedJavaScriptAsset(`__dependencies__/${manifestKey}`, rewritten, uploadQueue, pendingBytes);
393
+ if (!entry) {
394
+ throw new Error(`Vendored dependency exceeds release asset size limit: ${manifestKey}`);
395
+ }
396
+ for (const specifier of dependency.specifiers) {
397
+ bySpecifier.set(normalizeDependencySpecifier(specifier), dependency);
398
+ }
399
+ finalized.set(manifestKey, entry);
400
+ return entry;
401
+ }
402
+ finally {
403
+ visiting.pop();
404
+ }
405
+ }
406
+ try {
407
+ for (const manifestKey of dependencyModules.keys())
408
+ await finalize(manifestKey);
409
+ }
410
+ finally {
411
+ visiting.length = 0;
412
+ }
413
+ return Object.fromEntries(finalized);
210
414
  }
211
415
  async function finalizeProjectModules(transformedModules, knownPaths, dependencyUrls, uploadQueue, pendingBytes, gaps) {
212
416
  const finalized = new Map();
@@ -446,11 +650,13 @@ async function runBuildInner(input, tempDir, client, transform) {
446
650
  // 3 + 4. Collect the browser module closure and transform each module
447
651
  // through the SAME pipeline serveModule uses (browser, non-SSR).
448
652
  const transformedModules = new Map();
653
+ const dependencyModules = new Map();
449
654
  const gaps = [];
450
655
  const uploadQueue = [];
451
656
  // Bytes are held per-hash only until uploaded, then dropped (M3).
452
657
  const pendingBytes = new Map();
453
658
  const knownPaths = new Set(sourceByPath.keys());
659
+ const vendorHttpImports = input.vendorHttpImports ?? vendorHttpImportsWithCache;
454
660
  for (const [logicalPath, source] of sourceByPath) {
455
661
  if (!isBrowserModule(logicalPath))
456
662
  continue;
@@ -484,10 +690,58 @@ async function runBuildInner(input, tempDir, client, transform) {
484
690
  error: sanitized,
485
691
  };
486
692
  }
693
+ try {
694
+ const vendored = await vendorHttpImports(code, {
695
+ tempDir,
696
+ reactVersion: input.reactVersion,
697
+ });
698
+ code = vendored.code;
699
+ for (const dependency of vendored.dependencies) {
700
+ addDependencyModule(dependencyModules, dependency);
701
+ }
702
+ }
703
+ catch (error) {
704
+ const sanitized = sanitizeError(error);
705
+ logger.warn("HTTP dependency vendoring failed during release asset build", {
706
+ path: logicalPath,
707
+ error: sanitized,
708
+ });
709
+ await client.reportReleaseAssetManifestState(input.releaseVersionRef, "failed", sanitized);
710
+ return {
711
+ success: false,
712
+ state: "failed",
713
+ moduleCount: 0,
714
+ cssCount: 0,
715
+ routeCount: 0,
716
+ gaps,
717
+ error: sanitized,
718
+ };
719
+ }
487
720
  transformedModules.set(logicalPath, { logicalPath, code });
488
721
  }
489
- const dependencies = await buildFrameworkDependencies(input, tempDir, transform, uploadQueue, pendingBytes, gaps);
490
- const dependencyUrls = buildDependencyUrlMap(dependencies);
722
+ const frameworkDependencies = await buildFrameworkDependencies(input, tempDir, transform, uploadQueue, pendingBytes, gaps);
723
+ let httpDependencies;
724
+ try {
725
+ httpDependencies = await finalizeDependencyModules(dependencyModules, uploadQueue, pendingBytes);
726
+ }
727
+ catch (error) {
728
+ const sanitized = sanitizeError(error);
729
+ logger.warn("HTTP dependency finalization failed during release asset build", {
730
+ error: sanitized,
731
+ });
732
+ await client.reportReleaseAssetManifestState(input.releaseVersionRef, "failed", sanitized);
733
+ return {
734
+ success: false,
735
+ state: "failed",
736
+ moduleCount: 0,
737
+ cssCount: 0,
738
+ routeCount: 0,
739
+ gaps,
740
+ error: sanitized,
741
+ };
742
+ }
743
+ const dependencies = { ...frameworkDependencies, ...httpDependencies };
744
+ const dependencyUrls = buildDependencyUrlMap(dependencies, dependencyModules);
491
745
  const { modules, skippedModules } = await finalizeProjectModules(transformedModules, knownPaths, dependencyUrls, uploadQueue, pendingBytes, gaps);
492
746
  for (const logicalPath of transformedModules.keys()) {
493
747
  if (modules[logicalPath])
@@ -1,5 +1,6 @@
1
1
  import type { LayoutItem } from "../../types/index.js";
2
2
  export declare function extractRenderedCssHash(html: string): string | undefined;
3
+ export declare function hasRenderedReleaseAssetCss(html: string): boolean;
3
4
  export declare function serializeLayouts(nestedLayouts: LayoutItem[], projectDir: string): Array<{
4
5
  kind: LayoutItem["kind"];
5
6
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,UAAU,EAAE,EAC3B,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUnD;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQzC"}
1
+ {"version":3,"file":"pipeline-helpers.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,wBAAgB,gBAAgB,CAC9B,aAAa,EAAE,UAAU,EAAE,EAC3B,UAAU,EAAE,MAAM,GACjB,KAAK,CAAC;IAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUnD;AAED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQzC"}
@@ -1,8 +1,12 @@
1
1
  import { extractRelativePath as extractRelativePathShared } from "../../utils/route-path-utils.js";
2
2
  const RENDERED_CSS_HASH_RE = /href="\/_vf\/css\/([a-z0-9-]{1,16})\.css"/i;
3
+ const RENDERED_RELEASE_ASSET_CSS_RE = /href="\/_vf\/assets\/([a-f0-9]{64})\.css"/i;
3
4
  export function extractRenderedCssHash(html) {
4
5
  return html.match(RENDERED_CSS_HASH_RE)?.[1];
5
6
  }
7
+ export function hasRenderedReleaseAssetCss(html) {
8
+ return RENDERED_RELEASE_ASSET_CSS_RE.test(html);
9
+ }
6
10
  export function serializeLayouts(nestedLayouts, projectDir) {
7
11
  return nestedLayouts
8
12
  .filter((layout) => layout.componentPath || layout.path)
@@ -78,6 +78,7 @@ export declare class RenderPipeline {
78
78
  private resolveAppPath;
79
79
  private resolveProjectUpdatedAt;
80
80
  private resolvePageDataCss;
81
+ private hasReadyReleaseCss;
81
82
  private generatePageCssFromHtml;
82
83
  /**
83
84
  * Build a cache key that is safe for multi-tenant + query-param aware caching.
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA2ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;AAyBD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,MAAM,EAAE,oBAAoB;IAaxC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,UAAU;YAIJ,0BAA0B;IAaxC;;;;;;;;;OASG;YACW,qBAAqB;IAyDnC;;;OAGG;YACW,mBAAmB;IAiGjC,OAAO,CAAC,uBAAuB;IAkCzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA+P9E,+EAA+E;IACzE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;YA+EzE,kBAAkB;YA2ClB,cAAc;IAW5B,OAAO,CAAC,uBAAuB;YAYjB,kBAAkB;YAmElB,uBAAuB;IAmBrC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAetB"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAsBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4ChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE1D;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxE,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,OAAO,qBAAqB,EAAE,sBAAsB,CAAC;CAC1E;AA0BD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,MAAM,EAAE,oBAAoB;IAaxC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,UAAU;YAIJ,0BAA0B;IAaxC;;;;;;;;;OASG;YACW,qBAAqB;IAyDnC;;;OAGG;YACW,mBAAmB;IAiGjC,OAAO,CAAC,uBAAuB;IAkCzB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IA+P9E,+EAA+E;IACzE,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAqFzE,kBAAkB;YA2ClB,cAAc;IAW5B,OAAO,CAAC,uBAAuB;YAYjB,kBAAkB;IA8EhC,OAAO,CAAC,kBAAkB;YAMZ,uBAAuB;IAmBrC;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;CAetB"}
@@ -22,7 +22,7 @@ import { VeryfrontError } from "../../errors/index.js";
22
22
  import { FILE_NOT_FOUND, RENDER_ERROR } from "../../errors/error-registry.js";
23
23
  import { buildQueryAwareCacheKey } from "../../cache/keys.js";
24
24
  import { extractRelativePath as extractRelativePathShared, extractRouteParams as extractRouteParamsShared, } from "../../utils/route-path-utils.js";
25
- import { extractRenderedCssHash, serializeLayoutProps, serializeLayouts, } from "./pipeline-helpers.js";
25
+ import { extractRenderedCssHash, hasRenderedReleaseAssetCss, serializeLayoutProps, serializeLayouts, } from "./pipeline-helpers.js";
26
26
  import { join } from "../../platform/compat/path/index.js";
27
27
  import { isExtendedFSAdapter } from "../../platform/adapters/fs/wrapper.js";
28
28
  import { DataFetcher } from "../../data/index.js";
@@ -32,6 +32,7 @@ import { LAYOUT_EXTENSIONS } from "../layouts/types.js";
32
32
  import { withTimeout, withTimeoutThrow } from "../utils/stream-utils.js";
33
33
  import { extractCandidates, generateTailwindCSS } from "../../html/styles-builder/index.js";
34
34
  import { getCSSByHashAsync, regenerateCSSByHash, } from "../../html/styles-builder/tailwind-compiler.js";
35
+ import { getReadyManifestForRender } from "../../release-assets/manifest-cache.js";
35
36
  import { createEsmCache, createModuleCache, loadModule } from "./module-loader/index.js";
36
37
  import { getCSSImports, runWithCSSCollector, } from "../../modules/react-loader/css-import-collector.js";
37
38
  // Extracted modules
@@ -410,7 +411,7 @@ export class RenderPipeline {
410
411
  const providers = [];
411
412
  const projectUpdatedAt = this.resolveProjectUpdatedAt();
412
413
  const appPath = await this.resolveAppPath();
413
- const { css, cssError } = await this.resolvePageDataCss(slug, options, projectUpdatedAt);
414
+ const { css, cssAction, cssError } = await this.resolvePageDataCss(slug, options, projectUpdatedAt);
414
415
  resolvePageDataLog.debug("Resolved page data", {
415
416
  slug,
416
417
  pagePath,
@@ -419,6 +420,7 @@ export class RenderPipeline {
419
420
  appPath,
420
421
  headingsCount: headings.length,
421
422
  hasCss: !!css,
423
+ cssAction,
422
424
  hasCssError: !!cssError,
423
425
  });
424
426
  return {
@@ -435,6 +437,7 @@ export class RenderPipeline {
435
437
  appPath,
436
438
  headings,
437
439
  css,
440
+ cssAction,
438
441
  cssError,
439
442
  };
440
443
  }
@@ -484,11 +487,14 @@ export class RenderPipeline {
484
487
  return wrappedAdapter.getProjectData?.()?.updated_at;
485
488
  }
486
489
  async resolvePageDataCss(slug, options, projectUpdatedAt) {
490
+ if (this.hasReadyReleaseCss(options)) {
491
+ return { css: undefined, cssAction: "clear", cssError: undefined };
492
+ }
487
493
  const cssCacheKey = getPageCssCacheKey(options?.projectId, options?.environment, slug, projectUpdatedAt);
488
494
  const cachedCss = getCachedPageCss(cssCacheKey);
489
495
  if (cachedCss) {
490
496
  resolvePageDataLog.debug("CSS cache hit", { slug, cssLength: cachedCss.length });
491
- return { css: cachedCss, cssError: undefined };
497
+ return { css: cachedCss, cssAction: undefined, cssError: undefined };
492
498
  }
493
499
  try {
494
500
  const renderResult = await withTimeout(this.renderPage(slug, {
@@ -498,8 +504,9 @@ export class RenderPipeline {
498
504
  skipCachePersist: true,
499
505
  }), CSS_SSR_TIMEOUT_MS, `CSS SSR for ${slug}`);
500
506
  if (!renderResult?.html) {
501
- return { css: undefined, cssError: undefined };
507
+ return { css: undefined, cssAction: undefined, cssError: undefined };
502
508
  }
509
+ let cssAction;
503
510
  let css = await this.resolveCssFromRenderedHtml(renderResult.html, options?.projectSlug ?? options?.projectId);
504
511
  if (css) {
505
512
  resolvePageDataLog.debug("Reused SSR CSS for page data", {
@@ -508,12 +515,18 @@ export class RenderPipeline {
508
515
  source: "rendered-html-hash",
509
516
  });
510
517
  }
518
+ else if (hasRenderedReleaseAssetCss(renderResult.html)) {
519
+ cssAction = "clear";
520
+ resolvePageDataLog.debug("Skipped SPA CSS fallback; rendered HTML uses release CSS asset", {
521
+ slug,
522
+ });
523
+ }
511
524
  else {
512
525
  css = await this.generatePageCssFromHtml(slug, renderResult.html, options);
513
526
  }
514
527
  if (css)
515
528
  cachePageCss(cssCacheKey, css);
516
- return { css, cssError: undefined };
529
+ return { css, cssAction, cssError: undefined };
517
530
  }
518
531
  catch (error) {
519
532
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -526,10 +539,17 @@ export class RenderPipeline {
526
539
  });
527
540
  return {
528
541
  css: undefined,
542
+ cssAction: undefined,
529
543
  cssError: `CSS generation failed: ${errorMessage}`,
530
544
  };
531
545
  }
532
546
  }
547
+ hasReadyReleaseCss(options) {
548
+ if (options?.environment !== "production")
549
+ return false;
550
+ const releaseManifest = getReadyManifestForRender(options?.releaseId);
551
+ return (releaseManifest?.css?.length ?? 0) > 0;
552
+ }
533
553
  async generatePageCssFromHtml(slug, html, options) {
534
554
  const candidates = extractCandidates(html);
535
555
  const generatedCss = (await generateTailwindCSS(undefined, candidates, {
@@ -86,6 +86,8 @@ export interface PageDataResponse {
86
86
  }>;
87
87
  /** JIT-compiled Tailwind CSS for this page (for SPA navigation in prod mode) */
88
88
  css?: string;
89
+ /** Client action for the SPA CSS tag when no route CSS payload is sent. */
90
+ cssAction?: "clear";
89
91
  /**
90
92
  * Error message if CSS generation failed.
91
93
  * When set, the css field will be undefined and clients should fall back
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  /** Shared version value. */
2
- export declare const VERSION = "0.1.791";
2
+ export declare const VERSION = "0.1.795";
3
3
  //# sourceMappingURL=version-constant.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // Keep in sync with deno.json version.
2
2
  // scripts/release.ts updates this constant during releases.
3
3
  /** Shared version value. */
4
- export const VERSION = "0.1.791";
4
+ export const VERSION = "0.1.795";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.791",
3
+ "version": "0.1.795",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",