@@ -19,6 +19,7 @@
"types": "./lib/types/client/index.d.ts",
"default": "./lib/client.js"
},
+ "./loopback-hostname": "./src/loopback-hostname.ts",
"./src/*": "./src/*",
"./package.json": "./package.json"
@@ -9,8 +9,6 @@ import { ConnectionController, type ConnectionConfig, type ConnectionSinks, type
import { FixtureApiClient } from './fixture.ts'
import { WebApiClient } from './web-api-client.ts'
-export { isLoopbackHostname } from '../loopback-hostname.ts'
-
// ---- Contract re-exports (browser-safe apiproxy channels + core types) ----
export type {
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
* (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
@@ -7,7 +7,8 @@
import type { ClientContext } from '@deepseek-ai/dsh-client-runtime/client'
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'
// Type-only: pulls the shell's SlotMap merges (trigger/header/section/item).
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-session/surface')).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', () => {