fix(web): expose loopback policy safely
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
"types": "./lib/types/client/index.d.ts",
|
"types": "./lib/types/client/index.d.ts",
|
||||||
"default": "./lib/client.js"
|
"default": "./lib/client.js"
|
||||||
},
|
},
|
||||||
|
"./loopback-hostname": "./src/loopback-hostname.ts",
|
||||||
"./src/*": "./src/*",
|
"./src/*": "./src/*",
|
||||||
"./package.json": "./package.json"
|
"./package.json": "./package.json"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ import { ConnectionController, type ConnectionConfig, type ConnectionSinks, type
|
|||||||
import { FixtureApiClient } from './fixture.ts'
|
import { FixtureApiClient } from './fixture.ts'
|
||||||
import { WebApiClient } from './web-api-client.ts'
|
import { WebApiClient } from './web-api-client.ts'
|
||||||
|
|
||||||
export { isLoopbackHostname } from '../loopback-hostname.ts'
|
|
||||||
|
|
||||||
// ---- Contract re-exports (browser-safe apiproxy channels + core types) ----
|
// ---- Contract re-exports (browser-safe apiproxy channels + core types) ----
|
||||||
export type {
|
export type {
|
||||||
ApiProxy, SessionsApi, SessionSearchItem, SessionSummary, HostApi, EventsApi, MuxFrame, HostFrame,
|
ApiProxy, SessionsApi, SessionSearchItem, SessionSummary, HostApi, EventsApi, MuxFrame, HostFrame,
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ const CSS_VIRTUAL_SUFFIX = '.mjs'
|
|||||||
* Everything else under @deepseek-ai/* is either a module-table entry
|
* Everything else under @deepseek-ai/* is either a module-table entry
|
||||||
* (external) or a leak the purity gate rejects.
|
* (external) or a leak the purity gate rejects.
|
||||||
*/
|
*/
|
||||||
export const INLINE_SAFE = /^@deepseek-ai\/dsh-(host-apiproxy|session|llm|tools|brand)(\/|$)/
|
export const INLINE_SAFE = /^(?:@deepseek-ai\/dsh-(?:host-apiproxy|session|llm|tools|brand)(?:\/|$)|@deepseek-ai\/dsh-client-connection\/loopback-hostname$)/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Documented TEMPORARY exemption, not a platform module (hence not in
|
* Documented TEMPORARY exemption, not a platform module (hence not in
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
*/
|
*/
|
||||||
import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'
|
import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'
|
||||||
import { deferRegistration } from '@deepseek-ai/dsh-client-ui-slots'
|
import { deferRegistration } from '@deepseek-ai/dsh-client-ui-slots'
|
||||||
import { isLoopbackHostname, type ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'
|
import type { ConnectionHandle } from '@deepseek-ai/dsh-client-connection/client'
|
||||||
|
import { isLoopbackHostname } from '@deepseek-ai/dsh-client-connection/loopback-hostname'
|
||||||
import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react'
|
import { bindSnapshotSelector } from '@deepseek-ai/dsh-client-web-react'
|
||||||
// Type-only: pulls the shell's SlotMap merges (trigger/header/section/item).
|
// Type-only: pulls the shell's SlotMap merges (trigger/header/section/item).
|
||||||
import type {} from '@deepseek-ai/dsh-client-ui-settings/client'
|
import type {} from '@deepseek-ai/dsh-client-ui-settings/client'
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ describe('client bundle purity gate', () => {
|
|||||||
expect(resolveId('@deepseek-ai/dsh-host-apiproxy/api')).toBeNull()
|
expect(resolveId('@deepseek-ai/dsh-host-apiproxy/api')).toBeNull()
|
||||||
expect(resolveId('@deepseek-ai/dsh-session/surface')).toBeNull()
|
expect(resolveId('@deepseek-ai/dsh-session/surface')).toBeNull()
|
||||||
expect(resolveId('@deepseek-ai/dsh-brand')).toBeNull()
|
expect(resolveId('@deepseek-ai/dsh-brand')).toBeNull()
|
||||||
|
expect(resolveId('@deepseek-ai/dsh-client-connection/loopback-hostname')).toBeNull()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('throws on any other @deepseek-ai leak', () => {
|
it('throws on any other @deepseek-ai leak', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user