@teamscala/service-boot 0.23.547 → 0.23.549

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.
package/package.json CHANGED
@@ -1,313 +1,313 @@
1
1
  {
2
- "_generated": {
3
- "system": "service-boot",
4
- "status": "generated",
5
- "edit": "edit src/ — dependencies and exports derive from imports; everything else preserved"
6
- },
7
- "files": [
8
- "src"
9
- ],
10
- "imports": {
11
- "#service-boot/*": "./src/*",
12
- "#service-boot/*.ts": "./src/*.ts"
13
- },
14
- "name": "@teamscala/service-boot",
15
- "capability": "Lower-tier boot stages composed by service-runtime — page-server SSR, asset proxy, hono pipeline, agreement gate (no-shadow-runtime-exports: only service-runtime composes them).",
16
- "peerDependencies": {
17
- "@teamscala/chat-completion": "*"
18
- },
19
- "peerDependenciesMeta": {
20
- "@teamscala/chat-completion": {
21
- "optional": true
22
- }
23
- },
24
- "publishConfig": {
25
- "registry": "https://registry.npmjs.org"
26
- },
27
- "repository": "https://github.com/teamgbg/service-boot",
28
- "sideEffects": false,
29
- "type": "module",
30
- "version": "0.23.547",
31
- "dependencies": {
32
- "@orpc/openapi": "*",
33
- "@orpc/server": "*",
34
- "@tailwindcss/oxide": "*",
35
- "@teamscala/agreement-render": "*",
36
- "@teamscala/agreement-signing": "*",
37
- "@teamscala/auth": "*",
38
- "@teamscala/auth-channel-setup": "*",
39
- "@teamscala/auth-factory": "*",
40
- "@teamscala/auth-identity-db": "*",
41
- "@teamscala/brand": "*",
42
- "@teamscala/cache": "*",
43
- "@teamscala/content-gate-token": "*",
44
- "@teamscala/data-resolvers": "*",
45
- "@teamscala/db": "*",
46
- "@teamscala/db-org-branding": "*",
47
- "@teamscala/document-signing": "*",
48
- "@teamscala/email-client": "*",
49
- "@teamscala/encryption": "*",
50
- "@teamscala/event-log": "*",
51
- "@teamscala/file-lock": "*",
52
- "@teamscala/formatters": "*",
53
- "@teamscala/hono-boundary": "*",
54
- "@teamscala/http": "*",
55
- "@teamscala/loader-config": "*",
56
- "@teamscala/logger": "*",
57
- "@teamscala/mcp-multi-session": "*",
58
- "@teamscala/object-storage": "*",
59
- "@teamscala/orpc": "*",
60
- "@teamscala/orpc-openapi": "*",
61
- "@teamscala/orpc-ws": "*",
62
- "@teamscala/os": "*",
63
- "@teamscala/process-spawn": "*",
64
- "@teamscala/publish-registry": "*",
65
- "@teamscala/puck-boundary": "*",
66
- "@teamscala/puck-tree": "*",
67
- "@teamscala/registry-schemas": "*",
68
- "@teamscala/row-validation": "*",
69
- "@teamscala/safe-fallback": "*",
70
- "@teamscala/timing": "*",
71
- "@teamscala/tool-executor": "*",
72
- "@teamscala/watchdog": "*",
73
- "hono": "*",
74
- "pg-boss": "*",
75
- "tailwindcss": "*",
76
- "valibot": "*"
77
- },
78
- "devDependencies": {
79
- "@happy-dom/global-registrator": "*",
80
- "@testing-library/react": "*",
81
- "bun-types": "*",
82
- "react": "*",
83
- "react-dom": "*"
84
- },
85
- "exports": {
86
- "./agreement-gate": "./src/agreement-gate.ts",
87
- "./agreement-gate.ts": "./src/agreement-gate.ts",
88
- "./agreement-gate/agreement-lookup": "./src/agreement-gate/agreement-lookup.ts",
89
- "./agreement-gate/agreement-lookup.ts": "./src/agreement-gate/agreement-lookup.ts",
90
- "./agreement-gate/authorized-emails": "./src/agreement-gate/authorized-emails.ts",
91
- "./agreement-gate/authorized-emails.ts": "./src/agreement-gate/authorized-emails.ts",
92
- "./agreement-gate/placeholder-strip": "./src/agreement-gate/placeholder-strip.ts",
93
- "./agreement-gate/placeholder-strip.ts": "./src/agreement-gate/placeholder-strip.ts",
94
- "./agreement-gate/resolution-caches": "./src/agreement-gate/resolution-caches.ts",
95
- "./agreement-gate/resolution-caches.ts": "./src/agreement-gate/resolution-caches.ts",
96
- "./agreement-gate/settings": "./src/agreement-gate/settings.ts",
97
- "./agreement-gate/settings.ts": "./src/agreement-gate/settings.ts",
98
- "./agreement-gate/signing-session": "./src/agreement-gate/signing-session.ts",
99
- "./agreement-gate/signing-session.ts": "./src/agreement-gate/signing-session.ts",
100
- "./agreement-gate/signing-shell": "./src/agreement-gate/signing-shell.ts",
101
- "./agreement-gate/signing-shell.ts": "./src/agreement-gate/signing-shell.ts",
102
- "./apply-logger-config": "./src/apply-logger-config.ts",
103
- "./apply-logger-config.ts": "./src/apply-logger-config.ts",
104
- "./asset-cache-key": "./src/asset-cache-key.ts",
105
- "./asset-cache-key.ts": "./src/asset-cache-key.ts",
106
- "./asset-optimize": "./src/asset-optimize.ts",
107
- "./asset-optimize.ts": "./src/asset-optimize.ts",
108
- "./asset-proxy": "./src/asset-proxy.ts",
109
- "./asset-proxy.ts": "./src/asset-proxy.ts",
110
- "./asset-social-card": "./src/asset-social-card.ts",
111
- "./asset-social-card.ts": "./src/asset-social-card.ts",
112
- "./attach-agreement-magic": "./src/attach-agreement-magic.ts",
113
- "./attach-agreement-magic.ts": "./src/attach-agreement-magic.ts",
114
- "./attach-portal-members": "./src/attach-portal-members.ts",
115
- "./attach-portal-members.ts": "./src/attach-portal-members.ts",
116
- "./attach-proposal-accept": "./src/attach-proposal-accept.ts",
117
- "./attach-proposal-accept.ts": "./src/attach-proposal-accept.ts",
118
- "./attach-proposal-magic": "./src/attach-proposal-magic.ts",
119
- "./attach-proposal-magic.ts": "./src/attach-proposal-magic.ts",
120
- "./attach-transfers-upload": "./src/attach-transfers-upload.ts",
121
- "./attach-transfers-upload.ts": "./src/attach-transfers-upload.ts",
122
- "./auth-gate": "./src/auth-gate.ts",
123
- "./auth-gate.ts": "./src/auth-gate.ts",
124
- "./auth-gate/public-paths": "./src/auth-gate/public-paths.ts",
125
- "./auth-gate/public-paths.ts": "./src/auth-gate/public-paths.ts",
126
- "./auth/sign-out": "./src/auth/sign-out.ts",
127
- "./auth/sign-out.ts": "./src/auth/sign-out.ts",
128
- "./bind-page-handler": "./src/bind-page-handler.ts",
129
- "./bind-page-handler.ts": "./src/bind-page-handler.ts",
130
- "./boot-shell": "./src/boot-shell.ts",
131
- "./boot-shell.ts": "./src/boot-shell.ts",
132
- "./build-client-assets": "./src/build-client-assets.ts",
133
- "./build-client-assets.ts": "./src/build-client-assets.ts",
134
- "./build-client-assets/build-lock": "./src/build-client-assets/build-lock.ts",
135
- "./build-client-assets/build-lock.ts": "./src/build-client-assets/build-lock.ts",
136
- "./build-client-assets/hashed-output": "./src/build-client-assets/hashed-output.ts",
137
- "./build-client-assets/hashed-output.ts": "./src/build-client-assets/hashed-output.ts",
138
- "./build-client-assets/hydrate-bundle": "./src/build-client-assets/hydrate-bundle.ts",
139
- "./build-client-assets/hydrate-bundle.ts": "./src/build-client-assets/hydrate-bundle.ts",
140
- "./build-client-assets/manifest": "./src/build-client-assets/manifest.ts",
141
- "./build-client-assets/manifest.ts": "./src/build-client-assets/manifest.ts",
142
- "./build-client-assets/sourcemaps-upload": "./src/build-client-assets/sourcemaps-upload.ts",
143
- "./build-client-assets/sourcemaps-upload.ts": "./src/build-client-assets/sourcemaps-upload.ts",
144
- "./build-client-assets/styles-build": "./src/build-client-assets/styles-build.ts",
145
- "./build-client-assets/styles-build.ts": "./src/build-client-assets/styles-build.ts",
146
- "./capability-slug": "./src/capability-slug.ts",
147
- "./capability-slug.ts": "./src/capability-slug.ts",
148
- "./compose-page-title": "./src/compose-page-title.ts",
149
- "./compose-page-title.ts": "./src/compose-page-title.ts",
150
- "./content-gate/access": "./src/content-gate/access.ts",
151
- "./content-gate/access.ts": "./src/content-gate/access.ts",
152
- "./content-gate/catalog": "./src/content-gate/catalog.ts",
153
- "./content-gate/catalog.ts": "./src/content-gate/catalog.ts",
154
- "./content-gate/config-types": "./src/content-gate/config-types.ts",
155
- "./content-gate/config-types.ts": "./src/content-gate/config-types.ts",
156
- "./content-gate/gate": "./src/content-gate/gate.ts",
157
- "./content-gate/gate.ts": "./src/content-gate/gate.ts",
158
- "./content-gate/gate-entry-clears": "./src/content-gate/gate-entry-clears.ts",
159
- "./content-gate/gate-entry-clears.ts": "./src/content-gate/gate-entry-clears.ts",
160
- "./content-gate/parse-cookie": "./src/content-gate/parse-cookie.ts",
161
- "./content-gate/parse-cookie.ts": "./src/content-gate/parse-cookie.ts",
162
- "./content-page-floor": "./src/content-page-floor.ts",
163
- "./content-page-floor.ts": "./src/content-page-floor.ts",
164
- "./csrf-protection": "./src/csrf-protection.ts",
165
- "./csrf-protection.ts": "./src/csrf-protection.ts",
166
- "./error-page-logo": "./src/error-page-logo.ts",
167
- "./error-page-logo.ts": "./src/error-page-logo.ts",
168
- "./expand-roster": "./src/expand-roster.ts",
169
- "./expand-roster.ts": "./src/expand-roster.ts",
170
- "./gate-ttls": "./src/gate-ttls.ts",
171
- "./gate-ttls.ts": "./src/gate-ttls.ts",
172
- "./gpt-gate": "./src/gpt-gate.ts",
173
- "./gpt-gate.ts": "./src/gpt-gate.ts",
174
- "./hono-error-handler": "./src/hono-error-handler.ts",
175
- "./hono-error-handler.ts": "./src/hono-error-handler.ts",
176
- "./install-harness": "./src/install-harness.ts",
177
- "./install-harness.ts": "./src/install-harness.ts",
178
- "./install-logging": "./src/install-logging.ts",
179
- "./install-logging.ts": "./src/install-logging.ts",
180
- "./load-page-manifest": "./src/load-page-manifest.ts",
181
- "./load-page-manifest.ts": "./src/load-page-manifest.ts",
182
- "./load-service-install-row": "./src/load-service-install-row.ts",
183
- "./load-service-install-row.ts": "./src/load-service-install-row.ts",
184
- "./module-not-found": "./src/module-not-found.ts",
185
- "./module-not-found.ts": "./src/module-not-found.ts",
186
- "./mount": "./src/mount.ts",
187
- "./mount.ts": "./src/mount.ts",
188
- "./mount-orpc-router": "./src/mount-orpc-router.ts",
189
- "./mount-orpc-router.ts": "./src/mount-orpc-router.ts",
190
- "./mount-server-packages": "./src/mount-server-packages.ts",
191
- "./mount-server-packages.ts": "./src/mount-server-packages.ts",
192
- "./mutable-app-ref": "./src/mutable-app-ref.ts",
193
- "./mutable-app-ref.ts": "./src/mutable-app-ref.ts",
194
- "./orpc-openapi-document": "./src/orpc-openapi-document.ts",
195
- "./orpc-openapi-document.ts": "./src/orpc-openapi-document.ts",
196
- "./orpc-openapi-gate": "./src/orpc-openapi-gate.ts",
197
- "./orpc-openapi-gate.ts": "./src/orpc-openapi-gate.ts",
198
- "./page-route-shell-types": "./src/page-route-shell-types.ts",
199
- "./page-route-shell-types.ts": "./src/page-route-shell-types.ts",
200
- "./page-server-loader-graph": "./src/page-server-loader-graph.ts",
201
- "./page-server-loader-graph.ts": "./src/page-server-loader-graph.ts",
202
- "./page-server-orpc/server-client": "./src/page-server-orpc/server-client.ts",
203
- "./page-server-orpc/server-client.ts": "./src/page-server-orpc/server-client.ts",
204
- "./pg-boss-mount": "./src/pg-boss-mount.ts",
205
- "./pg-boss-mount.ts": "./src/pg-boss-mount.ts",
206
- "./proposal-authorized-emails": "./src/proposal-authorized-emails.ts",
207
- "./proposal-authorized-emails.ts": "./src/proposal-authorized-emails.ts",
208
- "./proposal-gate": "./src/proposal-gate.ts",
209
- "./proposal-gate.ts": "./src/proposal-gate.ts",
210
- "./quiz-gate": "./src/quiz-gate.ts",
211
- "./quiz-gate.ts": "./src/quiz-gate.ts",
212
- "./read-html-template": "./src/read-html-template.ts",
213
- "./read-html-template.ts": "./src/read-html-template.ts",
214
- "./readiness-gate": "./src/readiness-gate.ts",
215
- "./readiness-gate.ts": "./src/readiness-gate.ts",
216
- "./register-api-routes": "./src/register-api-routes.ts",
217
- "./register-api-routes.ts": "./src/register-api-routes.ts",
218
- "./register-crash-handlers": "./src/register-crash-handlers.ts",
219
- "./register-crash-handlers.ts": "./src/register-crash-handlers.ts",
220
- "./register-page-routes": "./src/register-page-routes.ts",
221
- "./register-page-routes.ts": "./src/register-page-routes.ts",
222
- "./register-page-server-client": "./src/register-page-server-client.ts",
223
- "./register-page-server-client.ts": "./src/register-page-server-client.ts",
224
- "./register-registry-page-route": "./src/register-registry-page-route.ts",
225
- "./register-registry-page-route.ts": "./src/register-registry-page-route.ts",
226
- "./register-registry-page-route/ai-chat-prefetch": "./src/register-registry-page-route/ai-chat-prefetch.ts",
227
- "./register-registry-page-route/ai-chat-prefetch.ts": "./src/register-registry-page-route/ai-chat-prefetch.ts",
228
- "./register-registry-page-route/apply-page-branding": "./src/register-registry-page-route/apply-page-branding.ts",
229
- "./register-registry-page-route/apply-page-branding.ts": "./src/register-registry-page-route/apply-page-branding.ts",
230
- "./register-registry-page-route/captured-loader-config": "./src/register-registry-page-route/captured-loader-config.ts",
231
- "./register-registry-page-route/captured-loader-config.ts": "./src/register-registry-page-route/captured-loader-config.ts",
232
- "./register-registry-page-route/live-loader-config": "./src/register-registry-page-route/live-loader-config.ts",
233
- "./register-registry-page-route/live-loader-config.ts": "./src/register-registry-page-route/live-loader-config.ts",
234
- "./register-registry-page-route/meta-title": "./src/register-registry-page-route/meta-title.ts",
235
- "./register-registry-page-route/meta-title.ts": "./src/register-registry-page-route/meta-title.ts",
236
- "./register-registry-page-route/page-data-shared": "./src/register-registry-page-route/page-data-shared.ts",
237
- "./register-registry-page-route/page-data-shared.ts": "./src/register-registry-page-route/page-data-shared.ts",
238
- "./register-registry-page-route/prefetch-org-id": "./src/register-registry-page-route/prefetch-org-id.ts",
239
- "./register-registry-page-route/prefetch-org-id.ts": "./src/register-registry-page-route/prefetch-org-id.ts",
240
- "./register-registry-page-route/proposal-approval-email-token": "./src/register-registry-page-route/proposal-approval-email-token.ts",
241
- "./register-registry-page-route/proposal-approval-email-token.ts": "./src/register-registry-page-route/proposal-approval-email-token.ts",
242
- "./register-registry-page-route/proposal-brand-stamping": "./src/register-registry-page-route/proposal-brand-stamping.ts",
243
- "./register-registry-page-route/proposal-brand-stamping.ts": "./src/register-registry-page-route/proposal-brand-stamping.ts",
244
- "./register-registry-page-route/public-shell-page-data": "./src/register-registry-page-route/public-shell-page-data.ts",
245
- "./register-registry-page-route/public-shell-page-data.ts": "./src/register-registry-page-route/public-shell-page-data.ts",
246
- "./register-registry-page-route/region-slots-page-data": "./src/register-registry-page-route/region-slots-page-data.ts",
247
- "./register-registry-page-route/region-slots-page-data.ts": "./src/register-registry-page-route/region-slots-page-data.ts",
248
- "./register-registry-page-route/resolve-page-data": "./src/register-registry-page-route/resolve-page-data.ts",
249
- "./register-registry-page-route/resolve-page-data.ts": "./src/register-registry-page-route/resolve-page-data.ts",
250
- "./register-registry-page-route/resolve-panel-page": "./src/register-registry-page-route/resolve-panel-page.ts",
251
- "./register-registry-page-route/resolve-panel-page.ts": "./src/register-registry-page-route/resolve-panel-page.ts",
252
- "./register-registry-page-route/resolve-request-graph": "./src/register-registry-page-route/resolve-request-graph.ts",
253
- "./register-registry-page-route/resolve-request-graph.ts": "./src/register-registry-page-route/resolve-request-graph.ts",
254
- "./register-registry-page-route/resolve-signed-in-org": "./src/register-registry-page-route/resolve-signed-in-org.ts",
255
- "./register-registry-page-route/resolve-signed-in-org.ts": "./src/register-registry-page-route/resolve-signed-in-org.ts",
256
- "./register-registry-page-route/run-content-gates": "./src/register-registry-page-route/run-content-gates.ts",
257
- "./register-registry-page-route/run-content-gates.ts": "./src/register-registry-page-route/run-content-gates.ts",
258
- "./register-registry-page-route/single-page-data": "./src/register-registry-page-route/single-page-data.ts",
259
- "./register-registry-page-route/single-page-data.ts": "./src/register-registry-page-route/single-page-data.ts",
260
- "./register-registry-page-route/stamp-session-context": "./src/register-registry-page-route/stamp-session-context.ts",
261
- "./register-registry-page-route/stamp-session-context.ts": "./src/register-registry-page-route/stamp-session-context.ts",
262
- "./register-registry-page-route/warn-uncovered-blocks": "./src/register-registry-page-route/warn-uncovered-blocks.ts",
263
- "./register-registry-page-route/warn-uncovered-blocks.ts": "./src/register-registry-page-route/warn-uncovered-blocks.ts",
264
- "./register-static-assets": "./src/register-static-assets.ts",
265
- "./register-static-assets.ts": "./src/register-static-assets.ts",
266
- "./register-ws-routes": "./src/register-ws-routes.ts",
267
- "./register-ws-routes.ts": "./src/register-ws-routes.ts",
268
- "./resolve-brand-favicon": "./src/resolve-brand-favicon.ts",
269
- "./resolve-brand-favicon.ts": "./src/resolve-brand-favicon.ts",
270
- "./resolve-service-port": "./src/resolve-service-port.ts",
271
- "./resolve-service-port.ts": "./src/resolve-service-port.ts",
272
- "./resolve-theme-mode": "./src/resolve-theme-mode.ts",
273
- "./resolve-theme-mode.ts": "./src/resolve-theme-mode.ts",
274
- "./resolvers/app-header": "./src/resolvers/app-header.ts",
275
- "./resolvers/app-header.ts": "./src/resolvers/app-header.ts",
276
- "./resolvers/fetch-org-brand": "./src/resolvers/fetch-org-brand.ts",
277
- "./resolvers/fetch-org-brand.ts": "./src/resolvers/fetch-org-brand.ts",
278
- "./resolvers/portal-route-paths": "./src/resolvers/portal-route-paths.ts",
279
- "./resolvers/portal-route-paths.ts": "./src/resolvers/portal-route-paths.ts",
280
- "./resolvers/website-by-host-map": "./src/resolvers/website-by-host-map.ts",
281
- "./resolvers/website-by-host-map.ts": "./src/resolvers/website-by-host-map.ts",
282
- "./resource-not-found": "./src/resource-not-found.ts",
283
- "./resource-not-found.ts": "./src/resource-not-found.ts",
284
- "./run-boot-hook-list": "./src/run-boot-hook-list.ts",
285
- "./run-boot-hook-list.ts": "./src/run-boot-hook-list.ts",
286
- "./run-boot-hooks": "./src/run-boot-hooks.ts",
287
- "./run-boot-hooks.ts": "./src/run-boot-hooks.ts",
288
- "./scala-tools-currency-watchdog": "./src/scala-tools-currency-watchdog.ts",
289
- "./scala-tools-currency-watchdog.ts": "./src/scala-tools-currency-watchdog.ts",
290
- "./security-headers": "./src/security-headers.ts",
291
- "./security-headers.ts": "./src/security-headers.ts",
292
- "./select-service-routes": "./src/select-service-routes.ts",
293
- "./select-service-routes.ts": "./src/select-service-routes.ts",
294
- "./server-error-page": "./src/server-error-page.ts",
295
- "./server-error-page.ts": "./src/server-error-page.ts",
296
- "./theme-fonts-link": "./src/theme-fonts-link.ts",
297
- "./theme-fonts-link.ts": "./src/theme-fonts-link.ts",
298
- "./transfers/presigned-upload": "./src/transfers/presigned-upload.ts",
299
- "./transfers/presigned-upload.ts": "./src/transfers/presigned-upload.ts",
300
- "./two-phase-full-app": "./src/two-phase-full-app.ts",
301
- "./two-phase-full-app.ts": "./src/two-phase-full-app.ts",
302
- "./two-phase-minimal-app": "./src/two-phase-minimal-app.ts",
303
- "./two-phase-minimal-app.ts": "./src/two-phase-minimal-app.ts",
304
- "./two-phase-readiness": "./src/two-phase-readiness.ts",
305
- "./two-phase-readiness.ts": "./src/two-phase-readiness.ts",
306
- "./types": "./src/types.ts",
307
- "./types.ts": "./src/types.ts",
308
- "./ui-service": "./src/ui-service.ts",
309
- "./ui-service.ts": "./src/ui-service.ts",
310
- "./ws-boot-self-test": "./src/ws-boot-self-test.ts",
311
- "./ws-boot-self-test.ts": "./src/ws-boot-self-test.ts"
312
- }
313
- }
2
+ "_generated": {
3
+ "system": "service-boot",
4
+ "status": "generated",
5
+ "edit": "edit src/ — dependencies and exports derive from imports; everything else preserved"
6
+ },
7
+ "files": [
8
+ "src"
9
+ ],
10
+ "imports": {
11
+ "#service-boot/*": "./src/*",
12
+ "#service-boot/*.ts": "./src/*.ts"
13
+ },
14
+ "name": "@teamscala/service-boot",
15
+ "capability": "Lower-tier boot stages composed by service-runtime — page-server SSR, asset proxy, hono pipeline, agreement gate (no-shadow-runtime-exports: only service-runtime composes them).",
16
+ "peerDependencies": {
17
+ "@teamscala/chat-completion": "*"
18
+ },
19
+ "peerDependenciesMeta": {
20
+ "@teamscala/chat-completion": {
21
+ "optional": true
22
+ }
23
+ },
24
+ "publishConfig": {
25
+ "registry": "https://registry.npmjs.org"
26
+ },
27
+ "repository": "https://github.com/teamgbg/service-boot",
28
+ "sideEffects": false,
29
+ "type": "module",
30
+ "version": "0.23.549",
31
+ "dependencies": {
32
+ "@orpc/openapi": "*",
33
+ "@orpc/server": "*",
34
+ "@tailwindcss/oxide": "*",
35
+ "@teamscala/agreement-render": "*",
36
+ "@teamscala/agreement-signing": "*",
37
+ "@teamscala/auth": "*",
38
+ "@teamscala/auth-channel-setup": "*",
39
+ "@teamscala/auth-factory": "*",
40
+ "@teamscala/auth-identity-db": "*",
41
+ "@teamscala/brand": "*",
42
+ "@teamscala/cache": "*",
43
+ "@teamscala/content-gate-token": "*",
44
+ "@teamscala/data-resolvers": "*",
45
+ "@teamscala/db": "*",
46
+ "@teamscala/db-org-branding": "*",
47
+ "@teamscala/document-signing": "*",
48
+ "@teamscala/email-client": "*",
49
+ "@teamscala/encryption": "*",
50
+ "@teamscala/event-log": "*",
51
+ "@teamscala/file-lock": "*",
52
+ "@teamscala/formatters": "*",
53
+ "@teamscala/hono-boundary": "*",
54
+ "@teamscala/http": "*",
55
+ "@teamscala/loader-config": "*",
56
+ "@teamscala/logger": "*",
57
+ "@teamscala/mcp-multi-session": "*",
58
+ "@teamscala/object-storage": "*",
59
+ "@teamscala/orpc": "*",
60
+ "@teamscala/orpc-openapi": "*",
61
+ "@teamscala/orpc-ws": "*",
62
+ "@teamscala/os": "*",
63
+ "@teamscala/process-spawn": "*",
64
+ "@teamscala/publish-registry": "*",
65
+ "@teamscala/puck-boundary": "*",
66
+ "@teamscala/puck-tree": "*",
67
+ "@teamscala/registry-schemas": "*",
68
+ "@teamscala/row-validation": "*",
69
+ "@teamscala/safe-fallback": "*",
70
+ "@teamscala/timing": "*",
71
+ "valibot": "*",
72
+ "@teamscala/watchdog": "*",
73
+ "hono": "*",
74
+ "pg-boss": "*",
75
+ "tailwindcss": "*",
76
+ "@teamscala/tool-executor-substrate": "*"
77
+ },
78
+ "devDependencies": {
79
+ "@happy-dom/global-registrator": "*",
80
+ "@testing-library/react": "*",
81
+ "bun-types": "*",
82
+ "react": "*",
83
+ "react-dom": "*"
84
+ },
85
+ "exports": {
86
+ "./agreement-gate": "./src/agreement-gate.ts",
87
+ "./agreement-gate.ts": "./src/agreement-gate.ts",
88
+ "./agreement-gate/agreement-lookup": "./src/agreement-gate/agreement-lookup.ts",
89
+ "./agreement-gate/agreement-lookup.ts": "./src/agreement-gate/agreement-lookup.ts",
90
+ "./agreement-gate/authorized-emails": "./src/agreement-gate/authorized-emails.ts",
91
+ "./agreement-gate/authorized-emails.ts": "./src/agreement-gate/authorized-emails.ts",
92
+ "./agreement-gate/placeholder-strip": "./src/agreement-gate/placeholder-strip.ts",
93
+ "./agreement-gate/placeholder-strip.ts": "./src/agreement-gate/placeholder-strip.ts",
94
+ "./agreement-gate/resolution-caches": "./src/agreement-gate/resolution-caches.ts",
95
+ "./agreement-gate/resolution-caches.ts": "./src/agreement-gate/resolution-caches.ts",
96
+ "./agreement-gate/settings": "./src/agreement-gate/settings.ts",
97
+ "./agreement-gate/settings.ts": "./src/agreement-gate/settings.ts",
98
+ "./agreement-gate/signing-session": "./src/agreement-gate/signing-session.ts",
99
+ "./agreement-gate/signing-session.ts": "./src/agreement-gate/signing-session.ts",
100
+ "./agreement-gate/signing-shell": "./src/agreement-gate/signing-shell.ts",
101
+ "./agreement-gate/signing-shell.ts": "./src/agreement-gate/signing-shell.ts",
102
+ "./apply-logger-config": "./src/apply-logger-config.ts",
103
+ "./apply-logger-config.ts": "./src/apply-logger-config.ts",
104
+ "./asset-cache-key": "./src/asset-cache-key.ts",
105
+ "./asset-cache-key.ts": "./src/asset-cache-key.ts",
106
+ "./asset-optimize": "./src/asset-optimize.ts",
107
+ "./asset-optimize.ts": "./src/asset-optimize.ts",
108
+ "./asset-proxy": "./src/asset-proxy.ts",
109
+ "./asset-proxy.ts": "./src/asset-proxy.ts",
110
+ "./asset-social-card": "./src/asset-social-card.ts",
111
+ "./asset-social-card.ts": "./src/asset-social-card.ts",
112
+ "./attach-agreement-magic": "./src/attach-agreement-magic.ts",
113
+ "./attach-agreement-magic.ts": "./src/attach-agreement-magic.ts",
114
+ "./attach-portal-members": "./src/attach-portal-members.ts",
115
+ "./attach-portal-members.ts": "./src/attach-portal-members.ts",
116
+ "./attach-proposal-accept": "./src/attach-proposal-accept.ts",
117
+ "./attach-proposal-accept.ts": "./src/attach-proposal-accept.ts",
118
+ "./attach-proposal-magic": "./src/attach-proposal-magic.ts",
119
+ "./attach-proposal-magic.ts": "./src/attach-proposal-magic.ts",
120
+ "./attach-transfers-upload": "./src/attach-transfers-upload.ts",
121
+ "./attach-transfers-upload.ts": "./src/attach-transfers-upload.ts",
122
+ "./auth-gate": "./src/auth-gate.ts",
123
+ "./auth-gate.ts": "./src/auth-gate.ts",
124
+ "./auth-gate/public-paths": "./src/auth-gate/public-paths.ts",
125
+ "./auth-gate/public-paths.ts": "./src/auth-gate/public-paths.ts",
126
+ "./auth/sign-out": "./src/auth/sign-out.ts",
127
+ "./auth/sign-out.ts": "./src/auth/sign-out.ts",
128
+ "./bind-page-handler": "./src/bind-page-handler.ts",
129
+ "./bind-page-handler.ts": "./src/bind-page-handler.ts",
130
+ "./boot-shell": "./src/boot-shell.ts",
131
+ "./boot-shell.ts": "./src/boot-shell.ts",
132
+ "./build-client-assets": "./src/build-client-assets.ts",
133
+ "./build-client-assets.ts": "./src/build-client-assets.ts",
134
+ "./build-client-assets/build-lock": "./src/build-client-assets/build-lock.ts",
135
+ "./build-client-assets/build-lock.ts": "./src/build-client-assets/build-lock.ts",
136
+ "./build-client-assets/hashed-output": "./src/build-client-assets/hashed-output.ts",
137
+ "./build-client-assets/hashed-output.ts": "./src/build-client-assets/hashed-output.ts",
138
+ "./build-client-assets/hydrate-bundle": "./src/build-client-assets/hydrate-bundle.ts",
139
+ "./build-client-assets/hydrate-bundle.ts": "./src/build-client-assets/hydrate-bundle.ts",
140
+ "./build-client-assets/manifest": "./src/build-client-assets/manifest.ts",
141
+ "./build-client-assets/manifest.ts": "./src/build-client-assets/manifest.ts",
142
+ "./build-client-assets/sourcemaps-upload": "./src/build-client-assets/sourcemaps-upload.ts",
143
+ "./build-client-assets/sourcemaps-upload.ts": "./src/build-client-assets/sourcemaps-upload.ts",
144
+ "./build-client-assets/styles-build": "./src/build-client-assets/styles-build.ts",
145
+ "./build-client-assets/styles-build.ts": "./src/build-client-assets/styles-build.ts",
146
+ "./capability-slug": "./src/capability-slug.ts",
147
+ "./capability-slug.ts": "./src/capability-slug.ts",
148
+ "./compose-page-title": "./src/compose-page-title.ts",
149
+ "./compose-page-title.ts": "./src/compose-page-title.ts",
150
+ "./content-gate/access": "./src/content-gate/access.ts",
151
+ "./content-gate/access.ts": "./src/content-gate/access.ts",
152
+ "./content-gate/catalog": "./src/content-gate/catalog.ts",
153
+ "./content-gate/catalog.ts": "./src/content-gate/catalog.ts",
154
+ "./content-gate/config-types": "./src/content-gate/config-types.ts",
155
+ "./content-gate/config-types.ts": "./src/content-gate/config-types.ts",
156
+ "./content-gate/gate": "./src/content-gate/gate.ts",
157
+ "./content-gate/gate.ts": "./src/content-gate/gate.ts",
158
+ "./content-gate/gate-entry-clears": "./src/content-gate/gate-entry-clears.ts",
159
+ "./content-gate/gate-entry-clears.ts": "./src/content-gate/gate-entry-clears.ts",
160
+ "./content-gate/parse-cookie": "./src/content-gate/parse-cookie.ts",
161
+ "./content-gate/parse-cookie.ts": "./src/content-gate/parse-cookie.ts",
162
+ "./content-page-floor": "./src/content-page-floor.ts",
163
+ "./content-page-floor.ts": "./src/content-page-floor.ts",
164
+ "./csrf-protection": "./src/csrf-protection.ts",
165
+ "./csrf-protection.ts": "./src/csrf-protection.ts",
166
+ "./error-page-logo": "./src/error-page-logo.ts",
167
+ "./error-page-logo.ts": "./src/error-page-logo.ts",
168
+ "./expand-roster": "./src/expand-roster.ts",
169
+ "./expand-roster.ts": "./src/expand-roster.ts",
170
+ "./gate-ttls": "./src/gate-ttls.ts",
171
+ "./gate-ttls.ts": "./src/gate-ttls.ts",
172
+ "./gpt-gate": "./src/gpt-gate.ts",
173
+ "./gpt-gate.ts": "./src/gpt-gate.ts",
174
+ "./hono-error-handler": "./src/hono-error-handler.ts",
175
+ "./hono-error-handler.ts": "./src/hono-error-handler.ts",
176
+ "./install-harness": "./src/install-harness.ts",
177
+ "./install-harness.ts": "./src/install-harness.ts",
178
+ "./install-logging": "./src/install-logging.ts",
179
+ "./install-logging.ts": "./src/install-logging.ts",
180
+ "./load-page-manifest": "./src/load-page-manifest.ts",
181
+ "./load-page-manifest.ts": "./src/load-page-manifest.ts",
182
+ "./load-service-install-row": "./src/load-service-install-row.ts",
183
+ "./load-service-install-row.ts": "./src/load-service-install-row.ts",
184
+ "./module-not-found": "./src/module-not-found.ts",
185
+ "./module-not-found.ts": "./src/module-not-found.ts",
186
+ "./mount": "./src/mount.ts",
187
+ "./mount.ts": "./src/mount.ts",
188
+ "./mount-orpc-router": "./src/mount-orpc-router.ts",
189
+ "./mount-orpc-router.ts": "./src/mount-orpc-router.ts",
190
+ "./mount-server-packages": "./src/mount-server-packages.ts",
191
+ "./mount-server-packages.ts": "./src/mount-server-packages.ts",
192
+ "./mutable-app-ref": "./src/mutable-app-ref.ts",
193
+ "./mutable-app-ref.ts": "./src/mutable-app-ref.ts",
194
+ "./orpc-openapi-document": "./src/orpc-openapi-document.ts",
195
+ "./orpc-openapi-document.ts": "./src/orpc-openapi-document.ts",
196
+ "./orpc-openapi-gate": "./src/orpc-openapi-gate.ts",
197
+ "./orpc-openapi-gate.ts": "./src/orpc-openapi-gate.ts",
198
+ "./page-route-shell-types": "./src/page-route-shell-types.ts",
199
+ "./page-route-shell-types.ts": "./src/page-route-shell-types.ts",
200
+ "./page-server-loader-graph": "./src/page-server-loader-graph.ts",
201
+ "./page-server-loader-graph.ts": "./src/page-server-loader-graph.ts",
202
+ "./page-server-orpc/server-client": "./src/page-server-orpc/server-client.ts",
203
+ "./page-server-orpc/server-client.ts": "./src/page-server-orpc/server-client.ts",
204
+ "./pg-boss-mount": "./src/pg-boss-mount.ts",
205
+ "./pg-boss-mount.ts": "./src/pg-boss-mount.ts",
206
+ "./proposal-authorized-emails": "./src/proposal-authorized-emails.ts",
207
+ "./proposal-authorized-emails.ts": "./src/proposal-authorized-emails.ts",
208
+ "./proposal-gate": "./src/proposal-gate.ts",
209
+ "./proposal-gate.ts": "./src/proposal-gate.ts",
210
+ "./quiz-gate": "./src/quiz-gate.ts",
211
+ "./quiz-gate.ts": "./src/quiz-gate.ts",
212
+ "./read-html-template": "./src/read-html-template.ts",
213
+ "./read-html-template.ts": "./src/read-html-template.ts",
214
+ "./readiness-gate": "./src/readiness-gate.ts",
215
+ "./readiness-gate.ts": "./src/readiness-gate.ts",
216
+ "./register-api-routes": "./src/register-api-routes.ts",
217
+ "./register-api-routes.ts": "./src/register-api-routes.ts",
218
+ "./register-crash-handlers": "./src/register-crash-handlers.ts",
219
+ "./register-crash-handlers.ts": "./src/register-crash-handlers.ts",
220
+ "./register-page-routes": "./src/register-page-routes.ts",
221
+ "./register-page-routes.ts": "./src/register-page-routes.ts",
222
+ "./register-page-server-client": "./src/register-page-server-client.ts",
223
+ "./register-page-server-client.ts": "./src/register-page-server-client.ts",
224
+ "./register-registry-page-route": "./src/register-registry-page-route.ts",
225
+ "./register-registry-page-route.ts": "./src/register-registry-page-route.ts",
226
+ "./register-registry-page-route/ai-chat-prefetch": "./src/register-registry-page-route/ai-chat-prefetch.ts",
227
+ "./register-registry-page-route/ai-chat-prefetch.ts": "./src/register-registry-page-route/ai-chat-prefetch.ts",
228
+ "./register-registry-page-route/apply-page-branding": "./src/register-registry-page-route/apply-page-branding.ts",
229
+ "./register-registry-page-route/apply-page-branding.ts": "./src/register-registry-page-route/apply-page-branding.ts",
230
+ "./register-registry-page-route/captured-loader-config": "./src/register-registry-page-route/captured-loader-config.ts",
231
+ "./register-registry-page-route/captured-loader-config.ts": "./src/register-registry-page-route/captured-loader-config.ts",
232
+ "./register-registry-page-route/live-loader-config": "./src/register-registry-page-route/live-loader-config.ts",
233
+ "./register-registry-page-route/live-loader-config.ts": "./src/register-registry-page-route/live-loader-config.ts",
234
+ "./register-registry-page-route/meta-title": "./src/register-registry-page-route/meta-title.ts",
235
+ "./register-registry-page-route/meta-title.ts": "./src/register-registry-page-route/meta-title.ts",
236
+ "./register-registry-page-route/page-data-shared": "./src/register-registry-page-route/page-data-shared.ts",
237
+ "./register-registry-page-route/page-data-shared.ts": "./src/register-registry-page-route/page-data-shared.ts",
238
+ "./register-registry-page-route/prefetch-org-id": "./src/register-registry-page-route/prefetch-org-id.ts",
239
+ "./register-registry-page-route/prefetch-org-id.ts": "./src/register-registry-page-route/prefetch-org-id.ts",
240
+ "./register-registry-page-route/proposal-approval-email-token": "./src/register-registry-page-route/proposal-approval-email-token.ts",
241
+ "./register-registry-page-route/proposal-approval-email-token.ts": "./src/register-registry-page-route/proposal-approval-email-token.ts",
242
+ "./register-registry-page-route/proposal-brand-stamping": "./src/register-registry-page-route/proposal-brand-stamping.ts",
243
+ "./register-registry-page-route/proposal-brand-stamping.ts": "./src/register-registry-page-route/proposal-brand-stamping.ts",
244
+ "./register-registry-page-route/public-shell-page-data": "./src/register-registry-page-route/public-shell-page-data.ts",
245
+ "./register-registry-page-route/public-shell-page-data.ts": "./src/register-registry-page-route/public-shell-page-data.ts",
246
+ "./register-registry-page-route/region-slots-page-data": "./src/register-registry-page-route/region-slots-page-data.ts",
247
+ "./register-registry-page-route/region-slots-page-data.ts": "./src/register-registry-page-route/region-slots-page-data.ts",
248
+ "./register-registry-page-route/resolve-page-data": "./src/register-registry-page-route/resolve-page-data.ts",
249
+ "./register-registry-page-route/resolve-page-data.ts": "./src/register-registry-page-route/resolve-page-data.ts",
250
+ "./register-registry-page-route/resolve-panel-page": "./src/register-registry-page-route/resolve-panel-page.ts",
251
+ "./register-registry-page-route/resolve-panel-page.ts": "./src/register-registry-page-route/resolve-panel-page.ts",
252
+ "./register-registry-page-route/resolve-request-graph": "./src/register-registry-page-route/resolve-request-graph.ts",
253
+ "./register-registry-page-route/resolve-request-graph.ts": "./src/register-registry-page-route/resolve-request-graph.ts",
254
+ "./register-registry-page-route/resolve-signed-in-org": "./src/register-registry-page-route/resolve-signed-in-org.ts",
255
+ "./register-registry-page-route/resolve-signed-in-org.ts": "./src/register-registry-page-route/resolve-signed-in-org.ts",
256
+ "./register-registry-page-route/run-content-gates": "./src/register-registry-page-route/run-content-gates.ts",
257
+ "./register-registry-page-route/run-content-gates.ts": "./src/register-registry-page-route/run-content-gates.ts",
258
+ "./register-registry-page-route/single-page-data": "./src/register-registry-page-route/single-page-data.ts",
259
+ "./register-registry-page-route/single-page-data.ts": "./src/register-registry-page-route/single-page-data.ts",
260
+ "./register-registry-page-route/stamp-session-context": "./src/register-registry-page-route/stamp-session-context.ts",
261
+ "./register-registry-page-route/stamp-session-context.ts": "./src/register-registry-page-route/stamp-session-context.ts",
262
+ "./register-registry-page-route/warn-uncovered-blocks": "./src/register-registry-page-route/warn-uncovered-blocks.ts",
263
+ "./register-registry-page-route/warn-uncovered-blocks.ts": "./src/register-registry-page-route/warn-uncovered-blocks.ts",
264
+ "./register-static-assets": "./src/register-static-assets.ts",
265
+ "./register-static-assets.ts": "./src/register-static-assets.ts",
266
+ "./register-ws-routes": "./src/register-ws-routes.ts",
267
+ "./register-ws-routes.ts": "./src/register-ws-routes.ts",
268
+ "./resolve-brand-favicon": "./src/resolve-brand-favicon.ts",
269
+ "./resolve-brand-favicon.ts": "./src/resolve-brand-favicon.ts",
270
+ "./resolve-service-port": "./src/resolve-service-port.ts",
271
+ "./resolve-service-port.ts": "./src/resolve-service-port.ts",
272
+ "./resolve-theme-mode": "./src/resolve-theme-mode.ts",
273
+ "./resolve-theme-mode.ts": "./src/resolve-theme-mode.ts",
274
+ "./resolvers/app-header": "./src/resolvers/app-header.ts",
275
+ "./resolvers/app-header.ts": "./src/resolvers/app-header.ts",
276
+ "./resolvers/fetch-org-brand": "./src/resolvers/fetch-org-brand.ts",
277
+ "./resolvers/fetch-org-brand.ts": "./src/resolvers/fetch-org-brand.ts",
278
+ "./resolvers/portal-route-paths": "./src/resolvers/portal-route-paths.ts",
279
+ "./resolvers/portal-route-paths.ts": "./src/resolvers/portal-route-paths.ts",
280
+ "./resolvers/website-by-host-map": "./src/resolvers/website-by-host-map.ts",
281
+ "./resolvers/website-by-host-map.ts": "./src/resolvers/website-by-host-map.ts",
282
+ "./resource-not-found": "./src/resource-not-found.ts",
283
+ "./resource-not-found.ts": "./src/resource-not-found.ts",
284
+ "./run-boot-hook-list": "./src/run-boot-hook-list.ts",
285
+ "./run-boot-hook-list.ts": "./src/run-boot-hook-list.ts",
286
+ "./run-boot-hooks": "./src/run-boot-hooks.ts",
287
+ "./run-boot-hooks.ts": "./src/run-boot-hooks.ts",
288
+ "./scala-tools-currency-watchdog": "./src/scala-tools-currency-watchdog.ts",
289
+ "./scala-tools-currency-watchdog.ts": "./src/scala-tools-currency-watchdog.ts",
290
+ "./security-headers": "./src/security-headers.ts",
291
+ "./security-headers.ts": "./src/security-headers.ts",
292
+ "./select-service-routes": "./src/select-service-routes.ts",
293
+ "./select-service-routes.ts": "./src/select-service-routes.ts",
294
+ "./server-error-page": "./src/server-error-page.ts",
295
+ "./server-error-page.ts": "./src/server-error-page.ts",
296
+ "./theme-fonts-link": "./src/theme-fonts-link.ts",
297
+ "./theme-fonts-link.ts": "./src/theme-fonts-link.ts",
298
+ "./transfers/presigned-upload": "./src/transfers/presigned-upload.ts",
299
+ "./transfers/presigned-upload.ts": "./src/transfers/presigned-upload.ts",
300
+ "./two-phase-full-app": "./src/two-phase-full-app.ts",
301
+ "./two-phase-full-app.ts": "./src/two-phase-full-app.ts",
302
+ "./two-phase-minimal-app": "./src/two-phase-minimal-app.ts",
303
+ "./two-phase-minimal-app.ts": "./src/two-phase-minimal-app.ts",
304
+ "./two-phase-readiness": "./src/two-phase-readiness.ts",
305
+ "./two-phase-readiness.ts": "./src/two-phase-readiness.ts",
306
+ "./types": "./src/types.ts",
307
+ "./types.ts": "./src/types.ts",
308
+ "./ui-service": "./src/ui-service.ts",
309
+ "./ui-service.ts": "./src/ui-service.ts",
310
+ "./ws-boot-self-test": "./src/ws-boot-self-test.ts",
311
+ "./ws-boot-self-test.ts": "./src/ws-boot-self-test.ts"
312
+ }
313
+ }
package/src/auth-gate.ts CHANGED
@@ -39,6 +39,7 @@ import * as v from "valibot";
39
39
  import { configure as configureEventLog } from "@teamscala/event-log/configure";
40
40
  import { getAppLogger } from "@teamscala/logger/app-loggers";
41
41
  import type { Hono } from "hono";
42
+ import { proxy } from "hono/proxy";
42
43
 
43
44
  import {
44
45
  isStaticAssetPath,
@@ -140,29 +141,14 @@ export async function attachAuthGate(
140
141
  try {
141
142
  const headers = new Headers(c.req.raw.headers);
142
143
  headers.set("host", new URL(otpBase).host);
143
- const init: RequestInit = {
144
- method: c.req.method,
144
+ const res = await proxy(target, {
145
+ method: c.req.raw.method,
145
146
  headers,
146
- };
147
- if (c.req.method !== "GET" && c.req.method !== "HEAD") {
148
- init.body = c.req.raw.body;
149
- if (c.req.raw.headers.has("content-type")) {
150
- headers.set("content-type", c.req.raw.headers.get("content-type")!);
151
- }
152
- }
153
- const upstream = await fetch(target, init);
154
- const resHeaders = new Headers(upstream.headers);
155
- resHeaders.set("X-Auth-Forwarded", "scala-otp");
156
- resHeaders.delete("Content-Encoding");
157
- resHeaders.delete("Content-Length");
158
- for (const sc of upstream.headers.getSetCookie()) {
159
- resHeaders.append("Set-Cookie", sc);
160
- }
161
- return new Response(upstream.body, {
162
- status: upstream.status,
163
- statusText: upstream.statusText,
164
- headers: resHeaders,
165
- });
147
+ body: c.req.raw.body,
148
+ duplex: "half",
149
+ } as RequestInit);
150
+ res.headers.set("X-Auth-Forwarded", "scala-otp");
151
+ return res;
166
152
  } catch (err) {
167
153
  log.error(`[auth-forward] failed to reach scala-otp`, {
168
154
  target,
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @system service-boot
3
+ * @status handwritten
4
+ */
5
+
6
+ import type { ServiceInstallConfig } from "./load-service-install-row";
7
+
8
+ export type EnvSource = Record<string, string | undefined>;
9
+
10
+ export interface DeclaredEnvResult {
11
+ config: ServiceInstallConfig;
12
+ injected: string[];
13
+ }
14
+
15
+ export function injectDeclaredEnv(
16
+ config: ServiceInstallConfig,
17
+ source: EnvSource = process.env,
18
+ ): DeclaredEnvResult {
19
+ const declared: unknown = (config as Record<string, unknown>).env_vars;
20
+ const injected: string[] = [];
21
+ if (!Array.isArray(declared)) return { config, injected };
22
+ for (const entry of declared) {
23
+ const name = (entry as { name?: unknown } | null)?.name;
24
+ if (typeof name !== "string" || name.length === 0) continue;
25
+ const value = source[name];
26
+ if (typeof value === "string" && value.length > 0) {
27
+ (config as Record<string, unknown>)[name] = value;
28
+ injected.push(name);
29
+ }
30
+ }
31
+ return { config, injected };
32
+ }
@@ -15,6 +15,7 @@ import {
15
15
  ServiceInstallValidationError,
16
16
  } from "@teamscala/registry-schemas/registry-schemas/service-install";
17
17
  import * as v from "valibot";
18
+ import { injectDeclaredEnv } from "./inject-declared-env";
18
19
 
19
20
  const BOOT_ROW_KEYS = [
20
21
  "access",
@@ -23,6 +24,7 @@ const BOOT_ROW_KEYS = [
23
24
  "block_packages",
24
25
  "boot_hooks",
25
26
  "brand_org",
27
+ "env_vars",
26
28
  "home_path",
27
29
  "kind",
28
30
  "orpc_router",
@@ -72,7 +74,8 @@ export async function loadServiceInstallRow(
72
74
  ) as Record<string, unknown>;
73
75
  enforceExplicitRenderMode(serviceSlug, rawConfig);
74
76
  const config = v.parse(ServiceInstallBootSchema, rawConfig);
75
- return { success: true, config };
77
+ const declared = injectDeclaredEnv(config);
78
+ return { success: true, config: declared.config };
76
79
  } catch (err) {
77
80
  if (err instanceof v.ValiError) {
78
81
  const issues = err.issues
@@ -7,7 +7,7 @@
7
7
  // overwritten on the next run. The rationale each assertion carries moved
8
8
  // with it into the band.
9
9
  import * as __scalaReal_teamscala_event_log_record_event from "@teamscala/event-log/record-event";
10
- import * as __scalaReal_teamscala_tool_executor_configure from "@teamscala/tool-executor/configure";
10
+ import * as __scalaReal_teamscala_tool_executor_configure from "@teamscala/tool-executor-substrate/configure";
11
11
  import * as __scalaReal_teamscala_orpc_configure from "@teamscala/orpc/configure";
12
12
  import * as __scalaReal_teamscala_orpc_app_router from "@teamscala/orpc/app-router";
13
13
 
@@ -85,7 +85,7 @@ describe("mountOrpcRouter generated-artifact seam", () => {
85
85
  ...__scalaReal_teamscala_orpc_configure,
86
86
  getPrisma: () => ({}),
87
87
  }));
88
- mock.module("@teamscala/tool-executor/configure", () => ({
88
+ mock.module("@teamscala/tool-executor-substrate/configure", () => ({
89
89
  ...__scalaReal_teamscala_tool_executor_configure,
90
90
  configure: (opts: Record<string, unknown>) => {
91
91
  seenKeys = Object.keys(opts);
@@ -97,7 +97,7 @@ export async function mountOrpcRouter(
97
97
  );
98
98
 
99
99
  const { configure: configureToolExecutor } = await import(
100
- "@teamscala/tool-executor/configure"
100
+ "@teamscala/tool-executor-substrate/configure"
101
101
  );
102
102
  const [{ getCallerContext }, { decryptSecretConfig }] =
103
103
  await Promise.all([
@@ -314,6 +314,122 @@
314
314
  "suite_type": "function_call",
315
315
  "slug": "service-boot:absent-manifest-verdict-reserves-never-ran"
316
316
  },
317
+ {
318
+ "args": [
319
+ {
320
+ "kind": "backend",
321
+ "env_vars": [
322
+ {
323
+ "name": "ABSENT_VAR",
324
+ "required": true
325
+ }
326
+ ]
327
+ },
328
+ {}
329
+ ],
330
+ "note": "The deployed configureEnv contract says absence fails the JOB at use (required() throws, the hook answers 503), never the boot. Injection mirrors that: a declared name missing from the environment is skipped, leaving the consumer guard as the failure surface.",
331
+ "label": "a declared env var absent from the environment is not injected and boot is not fatal",
332
+ "expect": {
333
+ "config": {
334
+ "kind": "backend",
335
+ "env_vars": [
336
+ {
337
+ "name": "ABSENT_VAR",
338
+ "required": true
339
+ }
340
+ ]
341
+ },
342
+ "injected": []
343
+ },
344
+ "export": "injectDeclaredEnv",
345
+ "module": "src/inject-declared-env.ts",
346
+ "package": "@teamscala/service-boot",
347
+ "suite_type": "function_call",
348
+ "slug": "service-boot:an-absent-declared-var-is-left-to-the-consumer-guard"
349
+ },
350
+ {
351
+ "args": [
352
+ {
353
+ "kind": "backend",
354
+ "env_vars": [
355
+ {
356
+ "name": "EMPTY_VAR",
357
+ "required": true
358
+ }
359
+ ]
360
+ },
361
+ {
362
+ "EMPTY_VAR": ""
363
+ }
364
+ ],
365
+ "note": "The deployed raw() reader treats an empty string as absent. Injecting one would mask the consumer guard with a value that behaves as missing.",
366
+ "label": "an empty-string environment value is not injected",
367
+ "expect": {
368
+ "config": {
369
+ "kind": "backend",
370
+ "env_vars": [
371
+ {
372
+ "name": "EMPTY_VAR",
373
+ "required": true
374
+ }
375
+ ]
376
+ },
377
+ "injected": []
378
+ },
379
+ "export": "injectDeclaredEnv",
380
+ "module": "src/inject-declared-env.ts",
381
+ "package": "@teamscala/service-boot",
382
+ "suite_type": "function_call",
383
+ "slug": "service-boot:an-empty-env-value-is-not-injected"
384
+ },
385
+ {
386
+ "args": [
387
+ {
388
+ "kind": "backend",
389
+ "env_vars": [
390
+ {
391
+ "required": true
392
+ },
393
+ {
394
+ "name": ""
395
+ },
396
+ {
397
+ "name": "GOOD_VAR"
398
+ }
399
+ ]
400
+ },
401
+ {
402
+ "GOOD_VAR": "ok-value"
403
+ }
404
+ ],
405
+ "note": "The schema types env_vars items as v.unknown(), so the boot stage must not trust item shape: an entry carrying no name and an entry carrying an empty name are skipped and boot never throws, while the next well-formed declaration still lands on the config.",
406
+ "label": "env_vars entries without a usable name are skipped while the named one still lands",
407
+ "expect": {
408
+ "config": {
409
+ "kind": "backend",
410
+ "GOOD_VAR": "ok-value",
411
+ "env_vars": [
412
+ {
413
+ "required": true
414
+ },
415
+ {
416
+ "name": ""
417
+ },
418
+ {
419
+ "name": "GOOD_VAR"
420
+ }
421
+ ]
422
+ },
423
+ "injected": [
424
+ "GOOD_VAR"
425
+ ]
426
+ },
427
+ "export": "injectDeclaredEnv",
428
+ "module": "src/inject-declared-env.ts",
429
+ "package": "@teamscala/service-boot",
430
+ "suite_type": "function_call",
431
+ "slug": "service-boot:an-env-declaration-without-a-usable-name-is-skipped"
432
+ },
317
433
  {
318
434
  "args": [
319
435
  [
@@ -1603,6 +1719,52 @@
1603
1719
  "suite_type": "function_call",
1604
1720
  "slug": "service-boot:decide-content-page-floor-resource-type-route-is-null"
1605
1721
  },
1722
+ {
1723
+ "args": [
1724
+ {
1725
+ "kind": "backend",
1726
+ "env_vars": [
1727
+ {
1728
+ "name": "NPM_HOOK_SECRET",
1729
+ "required": true
1730
+ },
1731
+ {
1732
+ "name": "ABSENT_VAR",
1733
+ "required": false
1734
+ }
1735
+ ]
1736
+ },
1737
+ {
1738
+ "NPM_HOOK_SECRET": "s3cret-value"
1739
+ }
1740
+ ],
1741
+ "note": "Bug 01a15334 / subtask 01a153d0-f3b7. The deployed npm-registry-hook handler reads env.NPM_HOOK_SECRET through configureEnv(ctx.config), which stores the whole mount config and indexes it by bare top-level key (integration-sync-runtime/src/env.ts, read from the running scala-sync-worker container). The loader must therefore carry each declared name as a top-level string on the config it returns.",
1742
+ "label": "a declared env var present in the process environment lands on the boot config under its own name",
1743
+ "expect": {
1744
+ "config": {
1745
+ "kind": "backend",
1746
+ "env_vars": [
1747
+ {
1748
+ "name": "NPM_HOOK_SECRET",
1749
+ "required": true
1750
+ },
1751
+ {
1752
+ "name": "ABSENT_VAR",
1753
+ "required": false
1754
+ }
1755
+ ],
1756
+ "NPM_HOOK_SECRET": "s3cret-value"
1757
+ },
1758
+ "injected": [
1759
+ "NPM_HOOK_SECRET"
1760
+ ]
1761
+ },
1762
+ "export": "injectDeclaredEnv",
1763
+ "module": "src/inject-declared-env.ts",
1764
+ "package": "@teamscala/service-boot",
1765
+ "suite_type": "function_call",
1766
+ "slug": "service-boot:declared-env-vars-carry-their-process-values-into-the-mount-config"
1767
+ },
1606
1768
  {
1607
1769
  "args": [
1608
1770
  {