@hyperdreamer/pi-webui 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/client/assets/{CodeViewer-aB4ZVzEu.js → CodeViewer-6qlmWYzB.js} +1 -1
  2. package/dist/client/assets/{UnifiedDiffViewer-f8X7aTkU.js → UnifiedDiffViewer-SCHm0P_t.js} +1 -1
  3. package/dist/client/assets/{index-Cffeusjy.js → index-C9z5sr6t.js} +448 -388
  4. package/dist/client/index.html +1 -1
  5. package/dist/server/app.js +15 -1
  6. package/dist/server/app.js.map +1 -1
  7. package/dist/server/browser/browserCapabilities.js +74 -0
  8. package/dist/server/browser/browserCapabilities.js.map +1 -0
  9. package/dist/server/browser/browserCapabilityRoutes.js +34 -0
  10. package/dist/server/browser/browserCapabilityRoutes.js.map +1 -0
  11. package/dist/server/browser/browserPolicy.js +382 -0
  12. package/dist/server/browser/browserPolicy.js.map +1 -0
  13. package/dist/server/browser/browserRuntime.js +16 -0
  14. package/dist/server/browser/browserRuntime.js.map +1 -0
  15. package/dist/server/sessions/piSessionService.js +95 -10
  16. package/dist/server/sessions/piSessionService.js.map +1 -1
  17. package/dist/server/sessions/sessionCleanup.js +26 -0
  18. package/dist/server/sessions/sessionCleanup.js.map +1 -1
  19. package/dist/server/sessions/sessionCommandService.js +1 -1
  20. package/dist/server/sessions/sessionCommandService.js.map +1 -1
  21. package/dist/server/sessions/sessionRoutes.js +26 -0
  22. package/dist/server/sessions/sessionRoutes.js.map +1 -1
  23. package/dist/shared/apiTypes.d.ts +8 -0
  24. package/dist/shared/apiTypes.js +1 -0
  25. package/dist/shared/apiTypes.js.map +1 -1
  26. package/dist/shared/capabilities.js +3 -0
  27. package/dist/shared/capabilities.js.map +1 -1
  28. package/dist/shared/federatedRoutes.js +2 -0
  29. package/dist/shared/federatedRoutes.js.map +1 -1
  30. package/package.json +1 -1
@@ -53,7 +53,7 @@
53
53
  html, body { margin: 0; height: 100%; overflow: hidden; background: var(--pi-bg); color: var(--pi-text); }
54
54
  body { min-height: 100dvh; }
55
55
  </style>
56
- <script type="module" crossorigin src="./assets/index-Cffeusjy.js"></script>
56
+ <script type="module" crossorigin src="./assets/index-C9z5sr6t.js"></script>
57
57
  <link rel="modulepreload" crossorigin href="./assets/vendor-editor-core-vUi74DnD.js">
58
58
  <link rel="modulepreload" crossorigin href="./assets/vendor-editor-languages-DoaXUodB.js">
59
59
  <link rel="modulepreload" crossorigin href="./assets/vendor-terminal-D8k4UKM2.js">
@@ -33,6 +33,8 @@ import { MachineService } from "./machines/machineService.js";
33
33
  import { registerMachineRoutes } from "./machines/machineRoutes.js";
34
34
  import { registerMachineProxyRoutes } from "./machines/machineProxyRoutes.js";
35
35
  import { proxyMachinePluginAsset, registerMachinePluginProxyRoutes } from "./machines/machinePluginProxyRoutes.js";
36
+ import { registerLocalBrowserCapabilityRoutes } from "./browser/browserCapabilityRoutes.js";
37
+ import { unavailableBrowserRuntime } from "./browser/browserRuntime.js";
36
38
  function registerLocalProjectRoutes(app, projects, workspaces, prefix, options = {}) {
37
39
  app.get(`${prefix}/projects`, async () => projects.list());
38
40
  app.post(`${prefix}/projects`, async (request, reply) => {
@@ -121,6 +123,9 @@ async function withProfileDependency(reply, operation) {
121
123
  return reply.code(503).send({ error: error.message });
122
124
  }
123
125
  }
126
+ function isApiPath(requestUrl) {
127
+ return requestUrl === "/api" || requestUrl.startsWith("/api/") || requestUrl.startsWith("/api?");
128
+ }
124
129
  export async function buildApp(deps = {}) {
125
130
  const app = Fastify({ logger: deps.logger ?? true, ...(deps.bodyLimit === undefined ? {} : { bodyLimit: deps.bodyLimit }) });
126
131
  // Vite proxies development API requests here, while production and machine-scoped
@@ -135,6 +140,7 @@ export async function buildApp(deps = {}) {
135
140
  const workspaces = deps.workspaces ?? new WorkspaceService();
136
141
  const configService = deps.config ?? createFilePiWebUiConfigService();
137
142
  const readConfig = () => readEffectiveConfig(configService);
143
+ const browserRuntime = deps.browserRuntime ?? unavailableBrowserRuntime();
138
144
  const sessionDaemon = deps.sessionDaemon ?? new SessionDaemonClient();
139
145
  const agentProfileProvider = deps.agentProfileProvider ?? new SessionDaemonActiveAgentProfileProvider(sessionDaemon);
140
146
  const piWebUiPlugins = deps.piWebUiPlugins ?? new PiWebUiPluginService({
@@ -183,6 +189,10 @@ export async function buildApp(deps = {}) {
183
189
  registerLocalMachineConfigRoutes(app, invalidatingConfigService);
184
190
  registerMachineRoutes(app, machines);
185
191
  registerMachinePluginProxyRoutes(app, machines);
192
+ registerLocalBrowserCapabilityRoutes(app, {
193
+ runtime: browserRuntime,
194
+ ...(deps.browserPrincipalProvider === undefined ? {} : { principalProvider: deps.browserPrincipalProvider }),
195
+ });
186
196
  registerLocalProjectRoutes(app, projects, workspaces, "/api", { config: configService });
187
197
  registerLocalProjectRoutes(app, projects, workspaces, "/api/machines/local", { config: configService });
188
198
  registerSessionProxyRoutes(app, sessionDaemon);
@@ -204,7 +214,11 @@ export async function buildApp(deps = {}) {
204
214
  const clientDist = deps.clientDist ?? (existsSync(packagedClientDist) ? packagedClientDist : join(process.cwd(), "dist", "client"));
205
215
  if (clientDist !== false && existsSync(clientDist)) {
206
216
  await app.register(fastifyStatic, { root: clientDist });
207
- app.setNotFoundHandler((_request, reply) => reply.sendFile("index.html"));
217
+ app.setNotFoundHandler((request, reply) => {
218
+ if (isApiPath(request.url))
219
+ return reply.code(404).send({ error: "API route not found" });
220
+ return reply.sendFile("index.html");
221
+ });
208
222
  }
209
223
  return app;
210
224
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,OAA+E,MAAM,SAAS,CAAC;AACtG,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,iCAAiC,EAAE,MAAM,sCAAsC,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAA2B,MAAM,kCAAkC,CAAC;AACvG,OAAO,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,+BAA+B,EAAE,MAAM,yCAAyC,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,gCAAgC,EAA6B,MAAM,mBAAmB,CAAC;AACtJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mCAAmC,EAAyB,MAAM,uBAAuB,CAAC;AACnG,OAAO,EAAE,gDAAgD,EAAsC,MAAM,oCAAoC,CAAC;AAC1I,OAAO,EAAE,oCAAoC,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAA2B,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,EACzB,uCAAuC,GAExC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,gCAAgC,EAAE,MAAM,wCAAwC,CAAC;AACnH,OAAO,EAAE,oCAAoC,EAAiC,MAAM,sCAAsC,CAAC;AAC3H,OAAO,EAAE,yBAAyB,EAA6B,MAAM,6BAA6B,CAAC;AA4BnG,SAAS,0BAA0B,CAAC,GAAoB,EAAE,QAAwB,EAAE,UAA4B,EAAE,MAAc,EAAE,UAAoC,EAAE;IACtK,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3D,GAAG,CAAC,IAAI,CAA8D,GAAG,MAAM,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACnH,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAoC,GAAG,MAAM,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACtG,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAkC,GAAG,MAAM,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACjG,IAAI,CAAC;YACH,OAAO,MAAM,wBAAwB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAoC,GAAG,MAAM,iCAAiC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9G,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxE,OAAO,MAAM,iCAAiC,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,iCAAiC,CAAC,OAAgB,EAAE,UAA4B,EAAE,MAA2C;IAC1I,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QACxB,wBAAwB,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;KAC/C,CAAC,CAAC;IACH,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,WAAmB,EAAE,MAA2C;IACtG,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,CAAC;IACvF,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;AACzF,CAAC;AAMD,SAAS,iCAAiC,CAAC,GAAoB,EAAE,QAAwB,EAAE,UAA4B,EAAE,MAAc,EAAE,UAA2C,EAAE;IACpL,GAAG,CAAC,GAAG,CAA6I,GAAG,MAAM,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC9L,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAC;QAC3I,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,gCAAgC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3I,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,MAAM,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;YAC5F,OAAO,MAAM,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACrH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,MAA0C;IAC3E,OAAO,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,eAAe,CAAC;AAC/C,CAAC;AAED,SAAS,8BAA8B,CAAC,MAA4B,EAAE,WAAmD;IACvH,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAC1B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAChD,WAAW,CAAC,UAAU,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAI,KAAmB,EAAE,SAA2B;IACtF,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,6BAA6B,CAAC;YAAE,MAAM,KAAK,CAAC;QACnE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,UAAkB;IACnC,OAAO,UAAU,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACnG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB,EAAE;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7H,kFAAkF;IAClF,gFAAgF;IAChF,MAAM,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE;QAClC,iBAAiB,EAAE,IAAI;QACvB,mBAAmB,EAAE,KAAK;QAC1B,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAErC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,cAAc,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,IAAI,8BAA8B,EAAE,CAAC;IACtE,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,yBAAyB,EAAE,CAAC;IAC1E,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,mBAAmB,EAAE,CAAC;IACtE,MAAM,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI,uCAAuC,CAAC,aAAa,CAAC,CAAC;IACrH,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,oBAAoB,CAAC;QACrE,cAAc,EAAE,UAAU;QAC1B,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,yBAAyB,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG;KAC1F,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,mCAAmC,CAAC,oBAAoB,CAAC,CAAC;IAChG,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,gDAAgD,CAAC,oBAAoB,CAAC,CAAC;IACzH,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,IAAI,wBAAwB,CAC5E,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,MAAM,kBAAkB,GAAG,MAAM,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;QAC9E,OAAO,gBAAgB,CAAC,aAAa,EAAE;YACrC,iBAAiB,EAAE,KAAK;YACxB,GAAG,CAAC,kBAAkB,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzG,CAAC,CAAC;IACL,CAAC,EACD,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,yCAAyC,CAAC,CAAC,CAAC,CAAC,EAAE,CACrG,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,cAAc,CAAC,SAAS,EAAE;QAC9D,YAAY,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC;KACrD,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAErI,GAAG,CAAC,GAAG,CAAgD,+BAA+B,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC/G,IAAI,MAAM,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO;QAEtH,OAAO,qBAAqB,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3F,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAC1F,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAwC,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,GAAG;QACrH,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC7C,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,kBAAkB,GAAG,MAAM,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;QAC9E,OAAO,uBAAuB,CAAC,aAAa,EAAE,kBAAkB,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrJ,CAAC,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/E,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACjH,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChI,uBAAuB,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACzC,uBAAuB,CAAC,GAAG,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;IAChE,oCAAoC,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC5D,oCAAoC,CAAC,GAAG,EAAE,gBAAgB,EAAE,qBAAqB,CAAC,CAAC;IACnF,MAAM,yBAAyB,GAAG,8BAA8B,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;IACpG,oBAAoB,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IACrD,gCAAgC,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IAEjE,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,gCAAgC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAChD,oCAAoC,CAAC,GAAG,EAAE;QACxC,OAAO,EAAE,cAAc;QACvB,GAAG,CAAC,IAAI,CAAC,wBAAwB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC;KAC7G,CAAC,CAAC;IAEH,0BAA0B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IACzF,0BAA0B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAExG,0BAA0B,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC/C,0BAA0B,CAAC,GAAG,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;IACtE,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9F,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7G,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC7C,iBAAiB,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACpE,2BAA2B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACtE,2BAA2B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;IAC7F,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IAC1E,+BAA+B,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,qBAAqB,CAAC,CAAC;IAEjG,wBAAwB,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC3G,wBAAwB,CAAC,GAAG,EAAE,8BAA8B,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAE1H,iCAAiC,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAChG,iCAAiC,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,qBAAqB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAE/G,0BAA0B,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpI,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QACxD,GAAG,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;YACxC,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;YAC1F,OAAO,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,74 @@
1
+ const BROWSER_PROTOCOL_VERSION = 1;
2
+ const MAX_TABS_PER_SESSION = 10;
3
+ const MAX_SESSIONS_PER_PRINCIPAL = 2;
4
+ /**
5
+ * Pure feature gate for the browser capability. The runtime adapter must prove
6
+ * every isolation property; partial readiness never becomes browser access.
7
+ */
8
+ export function evaluateBrowserRemoteCapability(principal, readiness) {
9
+ if (!hasTrustedPrincipal(principal))
10
+ return unavailable("BROWSER_AUTH_REQUIRED", false);
11
+ if (!principal.permissions.includes("browser.use"))
12
+ return unavailable("BROWSER_FORBIDDEN", false);
13
+ if (!hasSafeRuntime(readiness))
14
+ return unavailableBrowserRemoteCapability();
15
+ return {
16
+ available: true,
17
+ protocolVersions: [BROWSER_PROTOCOL_VERSION],
18
+ profileModes: ["ephemeral"],
19
+ limits: {
20
+ maxTabsPerSession: readiness.limits.maxTabsPerSession,
21
+ maxSessionsPerPrincipal: readiness.limits.maxSessionsPerPrincipal,
22
+ },
23
+ egress: {
24
+ mode: readiness.egress.mode,
25
+ privateNetworksBlocked: true,
26
+ },
27
+ };
28
+ }
29
+ function hasTrustedPrincipal(principal) {
30
+ if (!isRecord(principal) || typeof principal["subject"] !== "string" || !Array.isArray(principal["permissions"]))
31
+ return false;
32
+ return principal["subject"].trim() !== "" && principal["permissions"].every(isBrowserPermission);
33
+ }
34
+ function isBrowserPermission(value) {
35
+ return value === "browser.use" || value === "browser.admin" || value === "browser.persistent-profile";
36
+ }
37
+ function hasSafeRuntime(readiness) {
38
+ if (!isRecord(readiness) || !isRecord(readiness["egress"]) || !Array.isArray(readiness["protocolVersions"]))
39
+ return false;
40
+ const egress = readiness["egress"];
41
+ return readiness["controlChannel"] === "authenticated-private"
42
+ && readiness["chromiumSandbox"] === "enforced"
43
+ && readiness["profileIsolation"] === "ephemeral-per-principal"
44
+ && readiness["hostIsolation"] === "enforced"
45
+ && readiness["debuggingTransport"] === "pipe-private"
46
+ && egress["state"] === "enforced"
47
+ && (egress["mode"] === "public-web" || egress["mode"] === "domain-allowlist")
48
+ && egress["privateNetworksBlocked"] === true
49
+ && readiness["protocolVersions"].includes(BROWSER_PROTOCOL_VERSION)
50
+ && hasBoundedLimits(readiness["limits"]);
51
+ }
52
+ function hasBoundedLimits(limits) {
53
+ if (!isRecord(limits))
54
+ return false;
55
+ const maxTabsPerSession = limits["maxTabsPerSession"];
56
+ const maxSessionsPerPrincipal = limits["maxSessionsPerPrincipal"];
57
+ return typeof maxTabsPerSession === "number"
58
+ && typeof maxSessionsPerPrincipal === "number"
59
+ && isPositiveIntegerAtMost(maxTabsPerSession, MAX_TABS_PER_SESSION)
60
+ && isPositiveIntegerAtMost(maxSessionsPerPrincipal, MAX_SESSIONS_PER_PRINCIPAL);
61
+ }
62
+ function isPositiveIntegerAtMost(value, maximum) {
63
+ return Number.isSafeInteger(value) && value > 0 && value <= maximum;
64
+ }
65
+ export function unavailableBrowserRemoteCapability() {
66
+ return unavailable("BROWSER_UNAVAILABLE", true);
67
+ }
68
+ function unavailable(code, retryable) {
69
+ return { available: false, code, retryable };
70
+ }
71
+ function isRecord(value) {
72
+ return typeof value === "object" && value !== null && !Array.isArray(value);
73
+ }
74
+ //# sourceMappingURL=browserCapabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserCapabilities.js","sourceRoot":"","sources":["../../../src/server/browser/browserCapabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { evaluateBrowserRemoteCapability, unavailableBrowserRemoteCapability } from "./browserCapabilities.js";
2
+ import { unavailableBrowserRuntimeReadiness } from "./browserRuntime.js";
3
+ /**
4
+ * This foundation intentionally registers capability discovery only. Browser
5
+ * controls and remote federation wait for the required runtime/delegation work.
6
+ */
7
+ export function registerLocalBrowserCapabilityRoutes(app, deps) {
8
+ app.get("/api/machines/local/browser/capabilities", async (request) => {
9
+ const principal = await resolveBrowserPrincipal(request, deps.principalProvider);
10
+ if (principal.status === "unavailable")
11
+ return unavailableBrowserRemoteCapability();
12
+ if (principal.status === "absent")
13
+ return evaluateBrowserRemoteCapability(undefined, unavailableBrowserRuntimeReadiness());
14
+ try {
15
+ return evaluateBrowserRemoteCapability(principal.value, await deps.runtime.readiness());
16
+ }
17
+ catch {
18
+ return evaluateBrowserRemoteCapability(principal.value, unavailableBrowserRuntimeReadiness());
19
+ }
20
+ });
21
+ }
22
+ async function resolveBrowserPrincipal(request, provider) {
23
+ if (provider === undefined)
24
+ return { status: "absent" };
25
+ try {
26
+ const principal = await provider.principalFor(request);
27
+ return principal === undefined ? { status: "absent" } : { status: "available", value: principal };
28
+ }
29
+ catch {
30
+ request.log.warn({ dependency: "browser-principal-provider" }, "browser principal provider unavailable");
31
+ return { status: "unavailable" };
32
+ }
33
+ }
34
+ //# sourceMappingURL=browserCapabilityRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browserCapabilityRoutes.js","sourceRoot":"","sources":["../../../src/server/browser/browserCapabilityRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAAE,kCAAkC,EAAyB,MAAM,0BAA0B,CAAC;AACtI,OAAO,EAAE,kCAAkC,EAA6B,MAAM,qBAAqB,CAAC;AAgBpG;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAAC,GAAoB,EAAE,IAAwC;IACjH,GAAG,CAAC,GAAG,CAAC,0CAA0C,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjF,IAAI,SAAS,CAAC,MAAM,KAAK,aAAa;YAAE,OAAO,kCAAkC,EAAE,CAAC;QACpF,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,+BAA+B,CAAC,SAAS,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAE3H,IAAI,CAAC;YACH,OAAO,+BAA+B,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,+BAA+B,CAAC,SAAS,CAAC,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAOD,KAAK,UAAU,uBAAuB,CAAC,OAAuB,EAAE,QAA8C;IAC5G,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,EAAE,wCAAwC,CAAC,CAAC;QACzG,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,382 @@
1
+ import { isIP } from "node:net";
2
+ const MAX_BROWSER_URL_LENGTH = 8_192;
3
+ const MAX_ALLOWED_DOMAIN_COUNT = 64;
4
+ const MAX_ALLOWED_PORT_COUNT = 16;
5
+ const MAX_DNS_ANSWER_COUNT = 16;
6
+ const DEFAULT_RESOLVER_DEADLINE_MS = 2_000;
7
+ const MAX_RESOLVER_DEADLINE_MS = 10_000;
8
+ const BROWSER_EGRESS_MODES = new Set(["public-web", "domain-allowlist"]);
9
+ const NON_PUBLIC_HOSTS = new Set([
10
+ "localhost",
11
+ "metadata",
12
+ "metadata.google.internal",
13
+ "instance-data",
14
+ "instance-data.ec2.internal",
15
+ ]);
16
+ const VALIDATED_BROWSER_EGRESS_POLICIES = new WeakSet();
17
+ const SYSTEM_BROWSER_POLICY_CLOCK = { now: () => Date.now() };
18
+ const SYSTEM_BROWSER_POLICY_TIMER = {
19
+ setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
20
+ clearTimeout: (handle) => {
21
+ clearTimeout(handle);
22
+ },
23
+ };
24
+ /**
25
+ * Compile trusted machine configuration once at browser-runtime load/reload.
26
+ * Invalid configuration must keep the runtime unavailable; navigation checks
27
+ * only accept this immutable compiled output and never re-normalize list data.
28
+ */
29
+ export function compileBrowserEgressPolicy(config) {
30
+ if (!isRecord(config))
31
+ return undefined;
32
+ const mode = config["mode"];
33
+ const allowedDomains = config["allowedDomains"];
34
+ const allowedPorts = config["allowedPorts"];
35
+ if (!isBrowserEgressMode(mode))
36
+ return undefined;
37
+ if (!Array.isArray(allowedDomains) || allowedDomains.length > MAX_ALLOWED_DOMAIN_COUNT)
38
+ return undefined;
39
+ if (!Array.isArray(allowedPorts) || allowedPorts.length > MAX_ALLOWED_PORT_COUNT)
40
+ return undefined;
41
+ const normalizedDomains = [];
42
+ for (const entry of allowedDomains) {
43
+ const normalized = normalizeAllowedDomain(entry);
44
+ if (normalized === undefined)
45
+ return undefined;
46
+ if (!normalizedDomains.includes(normalized))
47
+ normalizedDomains.push(normalized);
48
+ }
49
+ const normalizedPorts = [];
50
+ for (const entry of allowedPorts) {
51
+ if (!isAllowedPort(entry))
52
+ return undefined;
53
+ if (!normalizedPorts.includes(entry))
54
+ normalizedPorts.push(entry);
55
+ }
56
+ if (mode === "domain-allowlist" && normalizedDomains.length === 0)
57
+ return undefined;
58
+ const policy = Object.freeze({
59
+ mode,
60
+ allowedDomains: Object.freeze(normalizedDomains),
61
+ allowedPorts: Object.freeze(normalizedPorts),
62
+ });
63
+ VALIDATED_BROWSER_EGRESS_POLICIES.add(policy);
64
+ return policy;
65
+ }
66
+ /**
67
+ * Parse and constrain an initial browser navigation without making a network
68
+ * request. This module never fetches or proxies a destination; Chromium must
69
+ * invoke the companion egress check for every request.
70
+ */
71
+ export function evaluateBrowserNavigation(input, policy) {
72
+ if (!isCompiledBrowserEgressPolicy(policy))
73
+ return blocked("policy-invalid");
74
+ if (!isValidUrlInput(input))
75
+ return blocked("invalid-url");
76
+ let url;
77
+ try {
78
+ url = new URL(input);
79
+ }
80
+ catch {
81
+ return blocked("invalid-url");
82
+ }
83
+ if (url.protocol !== "http:" && url.protocol !== "https:")
84
+ return blocked("unsupported-scheme");
85
+ if (url.username !== "" || url.password !== "")
86
+ return blocked("userinfo-not-allowed");
87
+ const host = normalizeHostname(url.hostname);
88
+ if (host === undefined)
89
+ return blocked("invalid-url");
90
+ if (isNonPublicHostname(host))
91
+ return blocked("non-public-host");
92
+ const port = effectivePort(url);
93
+ if (!policy.allowedPorts.includes(port))
94
+ return blocked("port-not-allowed");
95
+ const hostAddressKind = isIP(host);
96
+ if (policy.mode === "domain-allowlist") {
97
+ if (hostAddressKind !== 0)
98
+ return blocked("literal-ip-not-allowed");
99
+ if (!isAllowedDomain(host, policy.allowedDomains))
100
+ return blocked("domain-not-allowed");
101
+ }
102
+ else if (hostAddressKind !== 0 && !isPublicInternetAddress(host)) {
103
+ return blocked("non-public-host");
104
+ }
105
+ url.hostname = host;
106
+ return { allowed: true, url: url.href, host, port, auditOrigin: url.origin };
107
+ }
108
+ /**
109
+ * Resolve a permitted hostname through an injected controlled resolver. This
110
+ * bounded preflight is defense in depth only: a future runtime still needs
111
+ * connection-time interception, a network boundary, and a concurrency budget
112
+ * to defeat rebinding and renderer paths.
113
+ */
114
+ export async function evaluateBrowserEgress(input, policy, resolver, evaluationOptions) {
115
+ const navigation = evaluateBrowserNavigation(input, policy);
116
+ if (!navigation.allowed)
117
+ return navigation;
118
+ if (isIP(navigation.host) !== 0)
119
+ return navigation;
120
+ const options = resolveEgressEvaluationOptions(evaluationOptions);
121
+ if (options === undefined)
122
+ return blockedWithOrigin("dns-unavailable", navigation.auditOrigin);
123
+ const addresses = await resolveDnsWithDeadline(navigation.host, resolver, options);
124
+ if (!Array.isArray(addresses))
125
+ return blockedWithOrigin("dns-unavailable", navigation.auditOrigin);
126
+ if (addresses.length === 0)
127
+ return blockedWithOrigin("dns-no-addresses", navigation.auditOrigin);
128
+ if (addresses.length > MAX_DNS_ANSWER_COUNT)
129
+ return blockedWithOrigin("dns-answer-limit-exceeded", navigation.auditOrigin);
130
+ for (const address of addresses) {
131
+ if (typeof address !== "string" || !isPublicInternetAddress(address))
132
+ return blockedWithOrigin("non-public-address", navigation.auditOrigin);
133
+ }
134
+ return navigation;
135
+ }
136
+ /** Classify a DNS result or literal destination without exposing it to callers. */
137
+ export function isPublicInternetAddress(address) {
138
+ const normalized = stripIpv6Brackets(address);
139
+ const version = isIP(normalized);
140
+ if (version === 4)
141
+ return isPublicIpv4(normalized);
142
+ if (version !== 6)
143
+ return false;
144
+ const value = parseIpv6(normalized);
145
+ return value !== undefined && isPublicIpv6(value);
146
+ }
147
+ function isCompiledBrowserEgressPolicy(policy) {
148
+ return typeof policy === "object" && policy !== null && VALIDATED_BROWSER_EGRESS_POLICIES.has(policy);
149
+ }
150
+ function isBrowserEgressMode(value) {
151
+ return typeof value === "string" && BROWSER_EGRESS_MODES.has(value);
152
+ }
153
+ function resolveEgressEvaluationOptions(evaluationOptions) {
154
+ const clock = evaluationOptions?.clock ?? SYSTEM_BROWSER_POLICY_CLOCK;
155
+ const timer = evaluationOptions?.timer ?? SYSTEM_BROWSER_POLICY_TIMER;
156
+ const resolverDeadlineMs = evaluationOptions?.resolverDeadlineMs ?? DEFAULT_RESOLVER_DEADLINE_MS;
157
+ if (typeof clock.now !== "function" || typeof timer.setTimeout !== "function" || typeof timer.clearTimeout !== "function")
158
+ return undefined;
159
+ if (!Number.isSafeInteger(resolverDeadlineMs) || resolverDeadlineMs < 1 || resolverDeadlineMs > MAX_RESOLVER_DEADLINE_MS)
160
+ return undefined;
161
+ return { clock, timer, resolverDeadlineMs };
162
+ }
163
+ async function resolveDnsWithDeadline(host, resolver, options) {
164
+ const controller = new AbortController();
165
+ let timerHandle;
166
+ try {
167
+ const startedAtMs = options.clock.now();
168
+ const deadlineAtMs = startedAtMs + options.resolverDeadlineMs;
169
+ if (!Number.isSafeInteger(startedAtMs) || !Number.isSafeInteger(deadlineAtMs))
170
+ return undefined;
171
+ const timeout = new Promise((resolve) => {
172
+ timerHandle = options.timer.setTimeout(() => {
173
+ controller.abort();
174
+ resolve(undefined);
175
+ }, options.resolverDeadlineMs);
176
+ });
177
+ // The race remains bounded even when a resolver ignores the abort signal.
178
+ const resolution = Promise.resolve()
179
+ .then(() => resolver.resolve(host, { signal: controller.signal, deadlineAtMs }))
180
+ .catch(() => undefined);
181
+ return await Promise.race([resolution, timeout]);
182
+ }
183
+ catch {
184
+ return undefined;
185
+ }
186
+ finally {
187
+ controller.abort();
188
+ if (timerHandle !== undefined) {
189
+ try {
190
+ options.timer.clearTimeout(timerHandle);
191
+ }
192
+ catch {
193
+ // The resolver is already aborted and the bounded timer can no longer affect the decision.
194
+ }
195
+ }
196
+ }
197
+ }
198
+ function isAllowedPort(value) {
199
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 1 && value <= 65_535;
200
+ }
201
+ function isRecord(value) {
202
+ return typeof value === "object" && value !== null && !Array.isArray(value);
203
+ }
204
+ function isValidUrlInput(input) {
205
+ return input.length > 0
206
+ && input.length <= MAX_BROWSER_URL_LENGTH
207
+ && input === input.trim()
208
+ && !hasControlCharacter(input);
209
+ }
210
+ function hasControlCharacter(value) {
211
+ for (const character of value) {
212
+ const code = character.charCodeAt(0);
213
+ if (code < 32 || code === 127)
214
+ return true;
215
+ }
216
+ return false;
217
+ }
218
+ function normalizeHostname(value) {
219
+ const host = stripIpv6Brackets(value).toLowerCase().replace(/\.+$/u, "");
220
+ if (host === "")
221
+ return undefined;
222
+ if (isIP(host) !== 0)
223
+ return host;
224
+ if (host.length > 253)
225
+ return undefined;
226
+ const labels = host.split(".");
227
+ if (labels.some((label) => label.length === 0 || label.length > 63 || !/^[a-z\d](?:[a-z\d-]*[a-z\d])?$/u.test(label)))
228
+ return undefined;
229
+ return host;
230
+ }
231
+ function stripIpv6Brackets(value) {
232
+ return value.startsWith("[") && value.endsWith("]") ? value.slice(1, -1) : value;
233
+ }
234
+ function isNonPublicHostname(host) {
235
+ return isIP(host) === 0 && (!host.includes(".")
236
+ || NON_PUBLIC_HOSTS.has(host)
237
+ || host.endsWith(".localhost")
238
+ || host.endsWith(".local")
239
+ || host.endsWith(".internal"));
240
+ }
241
+ function effectivePort(url) {
242
+ if (url.port !== "")
243
+ return Number(url.port);
244
+ return url.protocol === "http:" ? 80 : 443;
245
+ }
246
+ function normalizeAllowedDomain(value) {
247
+ if (typeof value !== "string" || value.trim() !== value || value === "")
248
+ return undefined;
249
+ const wildcard = value.startsWith("*.");
250
+ const rawHost = wildcard ? value.slice(2) : value;
251
+ const host = normalizeHostname(rawHost);
252
+ if (host === undefined || !host.includes(".") || isIP(host) !== 0)
253
+ return undefined;
254
+ return wildcard ? `*.${host}` : host;
255
+ }
256
+ function isAllowedDomain(host, allowedDomains) {
257
+ return allowedDomains.some((normalized) => {
258
+ if (!normalized.startsWith("*."))
259
+ return host === normalized;
260
+ const suffix = normalized.slice(2);
261
+ return host !== suffix && host.endsWith(`.${suffix}`);
262
+ });
263
+ }
264
+ function blocked(reason) {
265
+ return { allowed: false, reason };
266
+ }
267
+ function blockedWithOrigin(reason, auditOrigin) {
268
+ return { allowed: false, reason, auditOrigin };
269
+ }
270
+ function isPublicIpv4(address) {
271
+ const octets = parseIpv4Octets(address);
272
+ if (octets === undefined)
273
+ return false;
274
+ const [first, second, third, fourth] = octets;
275
+ const value = ((first << 24) | (second << 16) | (third << 8) | fourth) >>> 0;
276
+ return !NON_PUBLIC_IPV4_PREFIXES.some(([prefix, bits]) => isIpv4Prefix(value, prefix, bits));
277
+ }
278
+ const NON_PUBLIC_IPV4_PREFIXES = [
279
+ [0x0000_0000, 8], // unspecified and "this" network
280
+ [0x0a00_0000, 8], // RFC1918
281
+ [0x6440_0000, 10], // carrier-grade NAT
282
+ [0x7f00_0000, 8], // loopback
283
+ [0xa9fe_0000, 16], // link-local / cloud metadata
284
+ [0xac10_0000, 12], // RFC1918
285
+ [0xc000_0000, 24], // IETF protocol assignments
286
+ [0xc000_0200, 24], // documentation
287
+ [0xc0a8_0000, 16], // RFC1918
288
+ [0xc612_0000, 15], // benchmarking
289
+ [0xc633_6400, 24], // documentation
290
+ [0xcb00_7100, 24], // documentation
291
+ [0xe000_0000, 4], // multicast and reserved
292
+ ];
293
+ function isIpv4Prefix(value, prefix, bits) {
294
+ const mask = (0xffff_ffff << (32 - bits)) >>> 0;
295
+ return (value & mask) === (prefix & mask);
296
+ }
297
+ function isPublicIpv6(value) {
298
+ const embeddedIpv4 = embeddedIpv4Address(value);
299
+ if (embeddedIpv4 !== undefined)
300
+ return isPublicIpv4(integerToIpv4(embeddedIpv4));
301
+ if (isIpv6Prefix(value, IPV4_IPV6_TRANSLATION_ALLOCATION.prefix, IPV4_IPV6_TRANSLATION_ALLOCATION.bits))
302
+ return false;
303
+ if (!isIpv6Prefix(value, PUBLIC_NATIVE_IPV6_GLOBAL_UNICAST.prefix, PUBLIC_NATIVE_IPV6_GLOBAL_UNICAST.bits))
304
+ return false;
305
+ return !UNSUPPORTED_NATIVE_IPV6_PREFIXES.some(({ prefix, bits }) => isIpv6Prefix(value, prefix, bits));
306
+ }
307
+ function embeddedIpv4Address(value) {
308
+ if (!IPV4_EMBEDDED_IPV6_PREFIXES.some(({ prefix, bits }) => isIpv6Prefix(value, prefix, bits)))
309
+ return undefined;
310
+ return Number(value & 0xffffffffn);
311
+ }
312
+ function integerToIpv4(value) {
313
+ return [value >>> 24, (value >>> 16) & 255, (value >>> 8) & 255, value & 255].join(".");
314
+ }
315
+ function isIpv6Prefix(value, prefix, bits) {
316
+ return value >> BigInt(128 - bits) === prefix >> BigInt(128 - bits);
317
+ }
318
+ function parseIpv6(address) {
319
+ let normalized = address.toLowerCase();
320
+ const ipv4 = /\d+\.\d+\.\d+\.\d+$/u.exec(normalized)?.[0];
321
+ if (ipv4 !== undefined) {
322
+ const octets = parseIpv4Octets(ipv4);
323
+ if (octets === undefined)
324
+ return undefined;
325
+ const [first, second, third, fourth] = octets;
326
+ const highGroup = ((first << 8) | second).toString(16);
327
+ const lowGroup = ((third << 8) | fourth).toString(16);
328
+ normalized = `${normalized.slice(0, -ipv4.length)}${highGroup}:${lowGroup}`;
329
+ }
330
+ const halves = normalized.split("::");
331
+ if (halves.length > 2)
332
+ return undefined;
333
+ const [leftHalf, rightHalf] = halves;
334
+ if (leftHalf === undefined)
335
+ return undefined;
336
+ const left = leftHalf === "" ? [] : leftHalf.split(":");
337
+ const right = rightHalf === undefined || rightHalf === "" ? [] : rightHalf.split(":");
338
+ const missing = 8 - left.length - right.length;
339
+ if ((rightHalf === undefined && missing !== 0) || (rightHalf !== undefined && missing < 1))
340
+ return undefined;
341
+ const groups = [...left, ...Array.from({ length: missing }, () => "0"), ...right];
342
+ if (groups.length !== 8 || groups.some((group) => !/^[\da-f]{1,4}$/u.test(group)))
343
+ return undefined;
344
+ return groups.reduce((result, group) => (result << 16n) | BigInt(`0x${group}`), 0n);
345
+ }
346
+ function parseIpv4Octets(address) {
347
+ const parts = address.split(".").map(Number);
348
+ const [first, second, third, fourth] = parts;
349
+ if (parts.length !== 4 || first === undefined || second === undefined || third === undefined || fourth === undefined)
350
+ return undefined;
351
+ if (![first, second, third, fourth].every((part) => Number.isInteger(part) && part >= 0 && part <= 255))
352
+ return undefined;
353
+ return [first, second, third, fourth];
354
+ }
355
+ const IPV4_EMBEDDED_IPV6_PREFIXES = [
356
+ ipv6Prefix("::", 96), // IPv4-compatible
357
+ ipv6Prefix("::ffff:0:0", 96), // IPv4-mapped
358
+ ipv6Prefix("::ffff:0:0:0", 96), // IPv4-translated
359
+ ipv6Prefix("64:ff9b::", 96), // well-known NAT64
360
+ ];
361
+ // Only the well-known /96 translation prefix is understood by this pure
362
+ // classifier. Other addresses in the IANA translation allocation fail closed.
363
+ const IPV4_IPV6_TRANSLATION_ALLOCATION = ipv6Prefix("64:ff9b::", 32);
364
+ // Native IPv6 is public only in the ordinary global-unicast /3. This rejects
365
+ // site-local, ULA, link-local, multicast, and non-GUA/unallocated 4000::/3.
366
+ const PUBLIC_NATIVE_IPV6_GLOBAL_UNICAST = ipv6Prefix("2000::", 3);
367
+ const UNSUPPORTED_NATIVE_IPV6_PREFIXES = [
368
+ // IETF protocol assignments include Teredo (2001::/32) and ORCHIDv2
369
+ // (2001:20::/28). Do not decode or permit any Teredo endpoint fields.
370
+ ipv6Prefix("2001::", 23),
371
+ ipv6Prefix("2001:db8::", 32), // documentation
372
+ ipv6Prefix("2002::", 16), // 6to4 transition addresses
373
+ ipv6Prefix("2620:4f:8000::", 48), // AS112 direct delegation
374
+ ipv6Prefix("3fff::", 20), // documentation
375
+ ];
376
+ function ipv6Prefix(address, bits) {
377
+ const prefix = parseIpv6(address);
378
+ if (prefix === undefined)
379
+ throw new Error(`Invalid built-in IPv6 prefix: ${address}`);
380
+ return { prefix, bits };
381
+ }
382
+ //# sourceMappingURL=browserPolicy.js.map