@jingyi0605/codingns4dsh 0.1.7-rc.2 → 0.2.0-beta.1

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 (89) hide show
  1. package/LICENSE +695 -0
  2. package/README.en.md +23 -9
  3. package/README.md +23 -9
  4. package/data/build/dist/bootstrap/dsh-connection-adapter.d.ts +1 -1
  5. package/data/build/dist/bootstrap/index.d.ts +1 -1
  6. package/data/build/dist/client/bundle.js +1200 -170
  7. package/data/build/dist/client/context-breakdown-dom.d.ts +53 -0
  8. package/data/build/dist/client/context-breakdown-dom.js +171 -0
  9. package/data/build/dist/client/dsh-h5-bootstrap.js +7 -1
  10. package/data/build/dist/client/features/cli-adapters.js +11 -0
  11. package/data/build/dist/client/features/index.d.ts +1 -0
  12. package/data/build/dist/client/features/index.js +1 -0
  13. package/data/build/dist/client/features/subscription-usage-panel.d.ts +15 -0
  14. package/data/build/dist/client/features/subscription-usage-panel.js +117 -0
  15. package/data/build/dist/client/features/workspace-session-enhancement-panel.js +22 -5
  16. package/data/build/dist/client/features/workspace-session-enhancement.js +17 -2
  17. package/data/build/dist/client/git-management.js +80 -10
  18. package/data/build/dist/client/index.d.ts +1 -0
  19. package/data/build/dist/client/index.js +16 -49
  20. package/data/build/dist/client/locale.js +20 -2
  21. package/data/build/dist/client/remote-web-context.js +26 -2
  22. package/data/build/dist/client/settings-bridge.d.ts +20 -5
  23. package/data/build/dist/client/settings-bridge.js +30 -7
  24. package/data/build/dist/client/subscription-slot.d.ts +3 -1
  25. package/data/build/dist/client/subscription-slot.js +31 -6
  26. package/data/build/dist/client/terminal/ui.js +1 -1
  27. package/data/build/dist/client/terminal/xterm-view.js +1 -1
  28. package/data/build/dist/dsh-capabilities/client/config-forms-adapter.d.ts +10 -0
  29. package/data/build/dist/dsh-capabilities/client/config-forms-adapter.js +22 -0
  30. package/data/build/dist/dsh-capabilities/client/primitives-adapter.d.ts +5 -2
  31. package/data/build/dist/dsh-capabilities/client/primitives-adapter.js +3 -2
  32. package/data/build/dist/dsh-capabilities/client/settings-scope-adapter.d.ts +2 -2
  33. package/data/build/dist/dsh-capabilities/host/config-forms-adapter.d.ts +22 -1
  34. package/data/build/dist/dsh-capabilities/host/config-forms-adapter.js +29 -3
  35. package/data/build/dist/dsh-capabilities/host/settings-scope-adapter.d.ts +2 -2
  36. package/data/build/dist/dsh-capabilities/matrix.js +31 -1
  37. package/data/build/dist/dsh-capabilities/routes.d.ts +8 -1
  38. package/data/build/dist/dsh-capabilities/routes.js +173 -5
  39. package/data/build/dist/dsh-capabilities/types.d.ts +1 -1
  40. package/data/build/dist/features/registry.d.ts +7 -0
  41. package/data/build/dist/features/registry.js +20 -2
  42. package/data/build/dist/host/cli-adapters/feature.js +24 -2
  43. package/data/build/dist/host/cli-adapters/native-team-proxy.d.ts +36 -0
  44. package/data/build/dist/host/cli-adapters/native-team-proxy.js +108 -0
  45. package/data/build/dist/host/cli-adapters/provider-subscription.d.ts +35 -0
  46. package/data/build/dist/host/cli-adapters/provider-subscription.js +405 -5
  47. package/data/build/dist/host/cli-adapters/registry.d.ts +9 -3
  48. package/data/build/dist/host/cli-adapters/registry.js +30 -0
  49. package/data/build/dist/host/cli-adapters/session-store.d.ts +8 -2
  50. package/data/build/dist/host/cli-adapters/session-store.js +19 -0
  51. package/data/build/dist/host/features/git-management.js +41 -18
  52. package/data/build/dist/host/features/types.d.ts +6 -3
  53. package/data/build/dist/host/index-injection.d.ts +12 -5
  54. package/data/build/dist/host/index-injection.js +32 -11
  55. package/data/build/dist/host/index.js +15 -4
  56. package/data/build/dist/host/lan-access-dsh.d.ts +2 -2
  57. package/data/build/dist/host/native-session-bridge.d.ts +4 -0
  58. package/data/build/dist/host/native-session-bridge.js +53 -7
  59. package/data/build/dist/host/relay-tunnel-runtime.js +10 -1
  60. package/data/build/dist/host/remote-web-runtime.js +40 -17
  61. package/data/build/dist/host/rpc.d.ts +24 -5
  62. package/data/build/dist/host/rpc.js +38 -9
  63. package/data/build/dist/host/session-migration-repair.js +14 -0
  64. package/data/build/dist/host/settings.d.ts +2 -2
  65. package/data/build/dist/host/settings.js +11 -1
  66. package/data/build/dist/host/terminal/startup.d.ts +2 -2
  67. package/data/build/dist/shared/contracts/cli-adapter.d.ts +22 -1
  68. package/data/build/dist/shared/contracts/config.d.ts +21 -0
  69. package/data/build/dist/shared/contracts/config.js +17 -0
  70. package/data/build/dist/shared/contracts/errors.d.ts +2 -2
  71. package/data/build/dist/shared/contracts/subscription.d.ts +7 -0
  72. package/data/build/dist/shared/contracts/subscription.js +14 -1
  73. package/data/build/dist/shared/contracts/version.d.ts +4 -4
  74. package/data/build/dist/shared/contracts/version.js +3 -3
  75. package/data/build/dist/shared/index.d.ts +3 -2
  76. package/data/build/dist/shared/index.js +2 -1
  77. package/data/build/dist/transport/carrier.d.ts +11 -1
  78. package/data/build/dist/transport/carrier.js +77 -26
  79. package/data/build/dist/transport/debug.d.ts +5 -0
  80. package/data/build/dist/transport/debug.js +17 -2
  81. package/data/build/dist/transport/dsh-session.d.ts +18 -1
  82. package/data/build/dist/transport/dsh-session.js +48 -13
  83. package/data/build/dist/transport/index.d.ts +1 -1
  84. package/data/build/dist/transport/index.js +1 -1
  85. package/package.json +23 -19
  86. package/profile/README.md +2 -2
  87. package/profile/package.json +4 -3
  88. package/profile/version.json +3 -3
  89. package/version.json +3 -3
@@ -1,6 +1,9 @@
1
1
  import { CODINGNS_SETTINGS_NAMESPACE, isCodingNsSettingsEntryId } from '../shared/contracts/config.js';
2
2
  import { debugInfo, debugWarn } from '../shared/debug.js';
3
3
  import { CodingNsRpcError } from './rpc-table.js';
4
+ function invokeConnectionRpcHandler(handler, endpoint, payload, signal, peer) {
5
+ return handler(endpoint, payload, signal, peer);
6
+ }
4
7
  /**
5
8
  * 创建 Codingns4DSH Host RPC 主处理器。
6
9
  *
@@ -10,7 +13,9 @@ import { CodingNsRpcError } from './rpc-table.js';
10
13
  * 凭据存储。
11
14
  */
12
15
  export function createCodingNsRpcHandler(table) {
13
- return async (endpoint, payload, signal) => {
16
+ // `peer` 是 DSH 0.2 Connection 注入的调用方作用域;0.1 carrier 没有该参数,
17
+ // 因此保留可选形态,让同一处理器可被旧版 HTTP 回退入口复用。
18
+ return async (endpoint, payload, signal, peer) => {
14
19
  debugInfo('codingns4dsh: host rpc request', { endpoint });
15
20
  const target = table.resolve(endpoint);
16
21
  if (target === null) {
@@ -18,7 +23,7 @@ export function createCodingNsRpcHandler(table) {
18
23
  return failure('CODINGNS_RPC_NOT_FOUND', `未知 Codingns4DSH RPC: ${endpoint}`);
19
24
  }
20
25
  try {
21
- const value = await target.handler(target.action, payload, { signal });
26
+ const value = await target.handler(target.action, payload, { signal, peer });
22
27
  debugInfo('codingns4dsh: host rpc success', { endpoint });
23
28
  return success(value);
24
29
  }
@@ -71,7 +76,7 @@ export function registerCodingNsRpc(ctx, table, settingsProvider) {
71
76
  path: `/api/codingns/${endpoint}`,
72
77
  methods: ['POST'],
73
78
  requestBody: 'buffered',
74
- fetch: async (request) => handleFetchRpc(request, endpoint, handler),
79
+ fetch: async (request) => handleFetchRpc(request, endpoint, connection, handler),
75
80
  }));
76
81
  debugInfo('codingns4dsh: host rpc fetch routes registered', {
77
82
  prefix: '/api/codingns/',
@@ -132,7 +137,8 @@ async function handleChannelRequest(request, response, connection, handler) {
132
137
  return;
133
138
  }
134
139
  try {
135
- writeRpcResponse(response, body.rpcId, await handler(endpoint, body.payload, abortController.signal));
140
+ const peer = connection.operator;
141
+ writeRpcResponse(response, body.rpcId, await invokeConnectionRpcHandler(handler, endpoint, body.payload, abortController.signal, peer));
136
142
  }
137
143
  catch (error) {
138
144
  response.statusCode = 500;
@@ -182,7 +188,7 @@ const CODINGNS_RPC_ENDPOINTS = [
182
188
  'fileManagement/session-changes', 'fileManagement/read', 'fileManagement/download', 'fileManagement/write', 'fileManagement/create-file', 'fileManagement/create-directory', 'fileManagement/rename', 'fileManagement/copy', 'fileManagement/move', 'fileManagement/delete', 'fileManagement/git-ignore',
183
189
  'lanAccessDsh/addresses', 'lanAccessDsh/detect', 'lanAccessDsh/get', 'lanAccessDsh/settings/get', 'lanAccessDsh/settings/set', 'lanAccessDsh/login/get', 'lanAccessDsh/login/set', 'lanAccessDsh/login/session/open', 'lanAccessDsh/login/session/refresh', 'lanAccessDsh/start', 'lanAccessDsh/stop',
184
190
  'peerHost/list', 'peerHost/diagnostics', 'peerHost/create', 'peerHost/update', 'peerHost/remove', 'peerHost/check', 'peerHost/reconnect', 'peerHost/login', 'peerHost/logout', 'peerHost/request', 'peerHost/wsEndpoint', 'peerHost/aggregate',
185
- 'cli/catalog', 'cli/models', 'cli/adapter/set', 'cli/session/get', 'cli/session/set', 'cli/session/list', 'cli/session/adapter-map', 'cli/session/archive', 'cli/session/steer', 'cli/session/follow-up', 'cli/session/interrupt', 'cli/subscription',
191
+ 'cli/catalog', 'cli/models', 'cli/adapter/set', 'cli/session/get', 'cli/session/set', 'cli/session/list', 'cli/session/adapter-map', 'cli/session/archive', 'cli/session/steer', 'cli/session/follow-up', 'cli/session/interrupt', 'cli/subscription', 'cli/team/status', 'cli/team/members', 'cli/team/tasks', 'cli/team/task', 'cli/team/spawn', 'cli/team/message', 'cli/team/task/create', 'cli/team/task/update', 'cli/team/wait', 'cli/team/interrupt',
186
192
  ];
187
193
  /** 创建远程设置处理器;只允许 Codingns4DSH 自己的 namespace 和路径编辑。 */
188
194
  export function createCodingNsSettingsRpcHandler(provider) {
@@ -193,7 +199,15 @@ export function createCodingNsSettingsRpcHandler(provider) {
193
199
  if (!provider.writable)
194
200
  throw new CodingNsRpcError('CODINGNS_SETTINGS_READ_ONLY', 'Host 设置提供器当前只读');
195
201
  const input = parseSettingsMutation(payload);
196
- await provider.mutate(resolveCodingNsSettingsNamespace(provider), input.ops, input.expectedRevision);
202
+ if (typeof provider.mutate === 'function') {
203
+ await provider.mutate(resolveCodingNsSettingsNamespace(provider), input.ops, input.expectedRevision);
204
+ }
205
+ else if (typeof provider.update === 'function') {
206
+ await provider.update(resolveCodingNsSettingsNamespace(provider), operationsToPatch(input.ops), input.expectedRevision);
207
+ }
208
+ else {
209
+ throw new CodingNsRpcError('CODINGNS_SETTINGS_UNAVAILABLE', 'Codingns4DSH 设置提供器不支持写入');
210
+ }
197
211
  return readCodingNsSettings(provider);
198
212
  }
199
213
  throw new CodingNsRpcError('CODINGNS_RPC_NOT_FOUND', `未知 Codingns4DSH RPC: settings/${action}`);
@@ -247,14 +261,28 @@ function parseSettingsOp(value) {
247
261
  throw new TypeError('set 操作缺少 value');
248
262
  return { op: 'set', path, value: value.value };
249
263
  }
264
+ /** 兼容仅暴露 update 的旧设置提供器;0.2 SettingsForms 优先走 mutate。 */
265
+ function operationsToPatch(operations) {
266
+ const patch = {};
267
+ for (const operation of operations) {
268
+ if (operation.path.length !== 1)
269
+ throw new TypeError('设置提供器 update 回退只支持一级字段');
270
+ if (operation.op === 'set')
271
+ patch[operation.path[0]] = operation.value;
272
+ }
273
+ return patch;
274
+ }
250
275
  function isAllowedSettingsPath(path) {
251
276
  if (path.length === 1)
252
- return ['controlBaseUrl', 'controlBaseUrls', 'terminalEnhancement', 'workspaceSessionEnhancement'].includes(path[0] ?? '');
277
+ return ['controlBaseUrl', 'controlBaseUrls', 'terminalEnhancement', 'workspaceSessionEnhancement', 'subscriptionUsage'].includes(path[0] ?? '');
253
278
  if (path[0] === 'modules')
254
279
  return path.length === 2 && ['lanAccess', 'reverseProxy', 'cliAdapters', 'terminalEnhancement', 'workspaceSessionEnhancement', 'debug', 'gitManagement', 'fileManagement', 'peerHost'].includes(path[1] ?? '');
255
280
  if (path[0] === 'workspaceSessionEnhancement') {
256
281
  return path.length === 2 && ['showAdapterLogo', 'showArchivedSessions', 'showWorkspaceHiding', 'hiddenWorkspaceIds', 'showSubscriptionUsage', 'showQuickPhrases', 'rememberConversationRightbarRatio', 'quickPhrases', 'quickPhrasesSeeded'].includes(path[1] ?? '');
257
282
  }
283
+ if (path[0] === 'subscriptionUsage') {
284
+ return path.length === 2 && ['timeoutSecs', 'refreshIntervalMins'].includes(path[1] ?? '');
285
+ }
258
286
  if (path[0] === 'fileManagement') {
259
287
  return path.length === 2 && ['menuEnhancement', 'fileEditor', 'sessionChangedFiles'].includes(path[1] ?? '');
260
288
  }
@@ -263,7 +291,7 @@ function isAllowedSettingsPath(path) {
263
291
  function isRecord(value) {
264
292
  return typeof value === 'object' && value !== null && !Array.isArray(value);
265
293
  }
266
- async function handleFetchRpc(request, endpoint, handler) {
294
+ async function handleFetchRpc(request, endpoint, connection, handler) {
267
295
  debugInfo('codingns4dsh: host fetch rpc request', {
268
296
  endpoint,
269
297
  method: request.method,
@@ -283,7 +311,8 @@ async function handleFetchRpc(request, endpoint, handler) {
283
311
  if (typeof envelope.rpcId !== 'string' || (method !== endpoint && method !== `codingns/${endpoint}`)) {
284
312
  return new Response('invalid RPC envelope', { status: 400 });
285
313
  }
286
- const result = await handler(endpoint, envelope.payload, request.signal);
314
+ const peer = connection.operator;
315
+ const result = await invokeConnectionRpcHandler(handler, endpoint, envelope.payload, request.signal, peer);
287
316
  debugInfo('codingns4dsh: host fetch rpc response', { endpoint, ok: result.ok });
288
317
  return Response.json({ type: 'server-response', rpcId: envelope.rpcId, result });
289
318
  }
@@ -46,6 +46,11 @@ export async function repairLegacySessionLog(path, signal) {
46
46
  const source = await readFileBytes(path);
47
47
  throwIfAborted(signal);
48
48
  const parsed = decodeLog(path, source);
49
+ // 0.2 使用 V4;未知的更高 generation 必须交给官方迁移器,插件不能重排
50
+ // 它的 event envelope,否则 repair 会把新 projection 引用改写成旧语义。
51
+ const generation = sessionHeaderVersion(parsed.header);
52
+ if (generation !== undefined && generation > 4)
53
+ return false;
49
54
  const repaired = repairEvents(parsed.events, isV4Log(path, parsed.header));
50
55
  if (repaired === null)
51
56
  return false;
@@ -186,6 +191,15 @@ function repairEvents(events, canonicalizeV4Results = false) {
186
191
  function isV4Log(path, header) {
187
192
  return header.version === 4 || /\.v4\.jsonl(?:\.zstd)?$/u.test(path);
188
193
  }
194
+ function sessionHeaderVersion(header) {
195
+ const direct = header.version;
196
+ if (typeof direct === 'number' && Number.isSafeInteger(direct) && direct >= 0)
197
+ return direct;
198
+ const data = header.data;
199
+ if (isRecord(data) && typeof data.version === 'number' && Number.isSafeInteger(data.version) && data.version >= 0)
200
+ return data.version;
201
+ return undefined;
202
+ }
189
203
  /** 将插件旧版在 V4 文件中留下的 V3 tool-result wrapper 提升为 tool-role 消息。 */
190
204
  function canonicalizeV4ToolResult(event) {
191
205
  if (event.type !== 'tool/result')
@@ -1,6 +1,6 @@
1
1
  import type { Context } from '@deepseek-ai/cordis';
2
2
  import z from '@deepseek-ai/schemastery';
3
- import type { SettingsScope } from '@deepseek-ai/dsh-settings';
3
+ import type { DshHostSettingsScope } from '../dsh-capabilities/host/config-forms-adapter.js';
4
4
  import { type CodingNsConfig, type CodingNsSettings } from '../shared/contracts/config.js';
5
5
  /**
6
6
  * DSH 设置服务使用的 Codingns4DSH namespace schema。
@@ -22,5 +22,5 @@ export declare const CodingNsConfigSchema: z<CodingNsConfig>;
22
22
  * 必须在已经注入 `settings` 的上下文里调用。返回的 scope 既用于读取当前值,
23
23
  * 也通过 watch 驱动功能模块启停。
24
24
  */
25
- export declare function registerCodingNsSettings(ctx: Context): SettingsScope<CodingNsSettings>;
25
+ export declare function registerCodingNsSettings(ctx: Context): DshHostSettingsScope<CodingNsSettings>;
26
26
  //# sourceMappingURL=settings.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import z from '@deepseek-ai/schemastery';
2
- import { CODINGNS_SETTINGS_NAMESPACE, isCodingNsSettingsEntryId, DEFAULT_CODINGNS_SETTINGS, } from '../shared/contracts/config.js';
2
+ import { CODINGNS_SETTINGS_NAMESPACE, isCodingNsSettingsEntryId, DEFAULT_CODINGNS_SETTINGS, SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS, SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS, } from '../shared/contracts/config.js';
3
3
  import { debugInfo } from '../shared/debug.js';
4
4
  /**
5
5
  * DSH 设置服务使用的 Codingns4DSH namespace schema。
@@ -73,6 +73,16 @@ export const CodingNsSettingsSchema = z.object({
73
73
  fileEditor: z.boolean().default(DEFAULT_CODINGNS_SETTINGS.fileManagement.fileEditor),
74
74
  sessionChangedFiles: z.boolean().default(DEFAULT_CODINGNS_SETTINGS.fileManagement.sessionChangedFiles),
75
75
  }).default(DEFAULT_CODINGNS_SETTINGS.fileManagement),
76
+ subscriptionUsage: z.object({
77
+ timeoutSecs: z.number().step(1)
78
+ .min(SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS.min)
79
+ .max(SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS.max)
80
+ .default(DEFAULT_CODINGNS_SETTINGS.subscriptionUsage.timeoutSecs),
81
+ refreshIntervalMins: z.number().step(1)
82
+ .min(SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS.min)
83
+ .max(SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS.max)
84
+ .default(DEFAULT_CODINGNS_SETTINGS.subscriptionUsage.refreshIntervalMins),
85
+ }).default(DEFAULT_CODINGNS_SETTINGS.subscriptionUsage),
76
86
  });
77
87
  /**
78
88
  * DSH 0.1.7 只会把 `volatile` 配置投影成可编辑 ConfigForm。
@@ -1,7 +1,7 @@
1
1
  import type { Context } from '@deepseek-ai/cordis';
2
- import type { SettingsProvider, SettingsScope } from '@deepseek-ai/dsh-settings';
3
2
  import type { CodingNsSettings } from '../../shared/contracts/config.js';
4
3
  import { createTerminalController, type TerminalControllerFactoryResult } from './controller-factory.js';
4
+ import type { DshHostSettingsProvider, DshHostSettingsScope } from '../../dsh-capabilities/host/config-forms-adapter.js';
5
5
  export interface TerminalStartupIdentity {
6
6
  readonly hostId: string;
7
7
  readonly storeFilename: string;
@@ -31,5 +31,5 @@ export declare function terminalWorkspaceId(cwd: string): string;
31
31
  * 在 Host 启动时读取一次启用快照并安装唯一 controller。
32
32
  * 设置后续变化不会热切同名 Cordis service,必须重启 DSH 才会重新选择模式。
33
33
  */
34
- export declare function installTerminalController(ctx: Context, settings: SettingsScope<CodingNsSettings>, provider: Pick<SettingsProvider, 'documentPath'>, options?: InstallTerminalControllerOptions): Promise<TerminalControllerFactoryResult>;
34
+ export declare function installTerminalController(ctx: Context, settings: DshHostSettingsScope<CodingNsSettings>, provider: Pick<DshHostSettingsProvider, 'documentPath'>, options?: InstallTerminalControllerOptions): Promise<TerminalControllerFactoryResult>;
35
35
  //# sourceMappingURL=startup.d.ts.map
@@ -13,7 +13,11 @@ export interface CodingNsCliAdapterDescriptor {
13
13
  readonly version: string | null;
14
14
  readonly command: string | null;
15
15
  }
16
- export type CodingNsCliCapability = 'models' | 'stream' | 'resume' | 'interrupt' | 'tool-events' | 'reasoning' | 'usage' | 'permission' | 'questions' | 'steer';
16
+ export type CodingNsCliCapability = 'models' | 'stream' | 'resume'
17
+ /** DSH 0.2 continuable child 生命周期;声明不代表已接入原生 Team。 */
18
+ | 'continuable'
19
+ /** DSH 0.2 Agent Team proxy 边界;当前插件未声明此能力。 */
20
+ | 'team-proxy' | 'interrupt' | 'tool-events' | 'reasoning' | 'usage' | 'permission' | 'questions' | 'steer';
17
21
  /** 适配器模型及其可用思考强度。 */
18
22
  export interface CodingNsCliModel {
19
23
  readonly id: string;
@@ -31,6 +35,12 @@ export interface CodingNsCliModelCatalog {
31
35
  readonly currentModel: string | null;
32
36
  readonly currentEffort: string | null;
33
37
  }
38
+ /** DSH 0.2 Agent Team 能力诊断;明确区分“未接入”与“可用”。 */
39
+ export interface CodingNsCliTeamDiagnostic {
40
+ readonly supported: boolean;
41
+ readonly code: 'DSH_TEAM_NATIVE_UNAVAILABLE' | 'DSH_TEAM_PROXY_READY';
42
+ readonly message: string;
43
+ }
34
44
  /** 每个 DSH 会话绑定的 CLI 选择;不包含凭据。 */
35
45
  export interface CodingNsCliSessionConfig {
36
46
  readonly adapterId: CodingNsCliAdapterId;
@@ -41,6 +51,17 @@ export interface CodingNsCliSessionConfig {
41
51
  /** 外部运行时会话标识,只保存在 Host 会话表中。 */
42
52
  readonly providerSessionId?: string;
43
53
  readonly rawStoreRef?: string;
54
+ /** DSH 0.2 Session V4 的父会话关系;外部 Provider 不得自行伪造。 */
55
+ readonly parentSessionId?: string;
56
+ /** 会话来源,供 V4 projection 区分 subagent 与普通用户会话。 */
57
+ readonly origin?: 'user' | 'subagent' | 'plugin';
58
+ /** 子 Agent 委托深度;仅由 Host/Team adapter 写入。 */
59
+ readonly delegationDepth?: number;
60
+ /** Continuable child 的稳定标识。 */
61
+ readonly continuationId?: string;
62
+ /** 原生 Team 投影中的 Team 和成员标识。 */
63
+ readonly teamId?: string;
64
+ readonly teamMemberId?: string;
44
65
  }
45
66
  /** Client 展示会话 Agent 时使用的最小脱敏绑定。 */
46
67
  export interface CodingNsSessionAdapterBinding {
@@ -19,6 +19,8 @@ export interface CodingNsSettings {
19
19
  workspaceSessionEnhancement: WorkspaceSessionEnhancementSettings;
20
20
  /** DSH 文件管理侧栏的独立增强选项。 */
21
21
  fileManagement: FileManagementSettings;
22
+ /** 用量查询设置:超时控制单次网络查询,间隔控制自动刷新。 */
23
+ subscriptionUsage: SubscriptionUsageSettings;
22
24
  /**
23
25
  * 功能模块启用意图:模块名 -> 是否启用。
24
26
  *
@@ -32,6 +34,24 @@ export interface CodingNsSettings {
32
34
  /** 适配器级最近选择;新建会话时作为默认模型和思考强度。 */
33
35
  agentAdapterPreferences?: Record<string, CodingNsCliAdapterPreference>;
34
36
  }
37
+ /** 用量查询设置:超时控制单次网络查询,间隔控制自动刷新。 */
38
+ export interface SubscriptionUsageSettings {
39
+ /** 单次用量查询的网络超时(秒)。 */
40
+ timeoutSecs: number;
41
+ /** 自动查询间隔(分钟);0 表示不自动查询。 */
42
+ refreshIntervalMins: number;
43
+ }
44
+ export declare const DEFAULT_SUBSCRIPTION_USAGE_SETTINGS: SubscriptionUsageSettings;
45
+ export declare const SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS: {
46
+ readonly min: 3;
47
+ readonly max: 120;
48
+ };
49
+ export declare const SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS: {
50
+ readonly min: 0;
51
+ readonly max: 1440;
52
+ };
53
+ /** 归一化用量查询设置:缺省字段回填默认值,越界值收敛到允许范围。 */
54
+ export declare function normalizeSubscriptionUsageSettings(value: unknown): SubscriptionUsageSettings;
35
55
  /** 0.1.7 ConfigForm 面向用户的持久化配置;Host-only 会话索引不在其中。 */
36
56
  export type CodingNsConfig = Omit<CodingNsSettings, 'cliSessions'>;
37
57
  /** Host 运行时状态,与可编辑配置分离,避免泄露到 Client 配置表单。 */
@@ -132,6 +152,7 @@ export declare const CODINGNS_LAN_ACCESS_DSH_FIELD = "lanAccessDsh";
132
152
  export declare const CODINGNS_TERMINAL_ENHANCEMENT_FIELD = "terminalEnhancement";
133
153
  export declare const CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD = "workspaceSessionEnhancement";
134
154
  export declare const CODINGNS_FILE_MANAGEMENT_FIELD = "fileManagement";
155
+ export declare const CODINGNS_SUBSCRIPTION_USAGE_FIELD = "subscriptionUsage";
135
156
  export declare const DEFAULT_CODINGNS_CONTROL_BASE_URL = "https://channel.codingns.com:1443";
136
157
  export declare const DEFAULT_CODINGNS_CONTROL_BASE_URLS: string[];
137
158
  /** 控制站的网页登录地址,用于注册 Codingns4DSH 账号。 */
@@ -1,4 +1,19 @@
1
1
  import { isDshVersionAtLeast } from './version.js';
2
+ export const DEFAULT_SUBSCRIPTION_USAGE_SETTINGS = { timeoutSecs: 10, refreshIntervalMins: 5 };
3
+ export const SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS = { min: 3, max: 120 };
4
+ export const SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS = { min: 0, max: 1440 };
5
+ /** 归一化用量查询设置:缺省字段回填默认值,越界值收敛到允许范围。 */
6
+ export function normalizeSubscriptionUsageSettings(value) {
7
+ const record = typeof value === 'object' && value !== null && !Array.isArray(value) ? value : {};
8
+ return {
9
+ timeoutSecs: clampSettingsInteger(record.timeoutSecs, SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS.timeoutSecs),
10
+ refreshIntervalMins: clampSettingsInteger(record.refreshIntervalMins, SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS.refreshIntervalMins),
11
+ };
12
+ }
13
+ function clampSettingsInteger(value, limits, fallback) {
14
+ const numeric = typeof value === 'number' && Number.isFinite(value) ? Math.round(value) : fallback;
15
+ return Math.min(limits.max, Math.max(limits.min, numeric));
16
+ }
2
17
  export const DEFAULT_FILE_MANAGEMENT_SETTINGS = {
3
18
  menuEnhancement: true,
4
19
  fileEditor: true,
@@ -28,6 +43,7 @@ export const CODINGNS_LAN_ACCESS_DSH_FIELD = 'lanAccessDsh';
28
43
  export const CODINGNS_TERMINAL_ENHANCEMENT_FIELD = 'terminalEnhancement';
29
44
  export const CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD = 'workspaceSessionEnhancement';
30
45
  export const CODINGNS_FILE_MANAGEMENT_FIELD = 'fileManagement';
46
+ export const CODINGNS_SUBSCRIPTION_USAGE_FIELD = 'subscriptionUsage';
31
47
  export const DEFAULT_CODINGNS_CONTROL_BASE_URL = 'https://channel.codingns.com:1443';
32
48
  export const DEFAULT_CODINGNS_CONTROL_BASE_URLS = [DEFAULT_CODINGNS_CONTROL_BASE_URL];
33
49
  /** 控制站的网页登录地址,用于注册 Codingns4DSH 账号。 */
@@ -70,6 +86,7 @@ export const DEFAULT_CODINGNS_SETTINGS = {
70
86
  terminalEnhancement: DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS,
71
87
  workspaceSessionEnhancement: DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS,
72
88
  fileManagement: DEFAULT_FILE_MANAGEMENT_SETTINGS,
89
+ subscriptionUsage: DEFAULT_SUBSCRIPTION_USAGE_SETTINGS,
73
90
  lanAccessDsh: {
74
91
  autoStart: false,
75
92
  listenHost: '0.0.0.0',
@@ -34,8 +34,8 @@ export declare const CODINGNS_DSH_ERROR_CODES: {
34
34
  readonly PEER_HOST_AGGREGATE_UNAVAILABLE: "PEER_HOST_AGGREGATE_UNAVAILABLE";
35
35
  readonly PEER_HOST_STALE_GENERATION: "PEER_HOST_STALE_GENERATION";
36
36
  };
37
- export declare const SUPPORTED_DSH_VERSION: "0.1.6-alpha.2";
38
- export declare const SUPPORTED_DSH_COMPATIBILITY: ">=0.1.5-rc.3 <=0.1.7-rc.2";
37
+ export declare const SUPPORTED_DSH_VERSION: "0.2.0-rc.1";
38
+ export declare const SUPPORTED_DSH_COMPATIBILITY: ">=0.2.0-rc.1 <=0.2.0-rc.1";
39
39
  export type CodingNsDshErrorCode = typeof CODINGNS_DSH_ERROR_CODES[keyof typeof CODINGNS_DSH_ERROR_CODES];
40
40
  /** 统一错误形状;阶段 0 只定义,不主动产生这些业务错误。 */
41
41
  export declare class CodingNsDshError extends Error {
@@ -112,4 +112,11 @@ export interface Sub2ApiUsage {
112
112
  readonly tpm: number | null;
113
113
  readonly averageDurationMs: number | null;
114
114
  }
115
+ /**
116
+ * 判断上一次用量查询结果是否仍在可复用窗口内。
117
+ *
118
+ * 间隔 ≤ 0 表示不自动查询:此时不复用旧结果,每次挂载都重新查询一次。
119
+ * 该判定由 Client 侧底部用量入口使用,避免每次进入会话都请求上游。
120
+ */
121
+ export declare function isSubscriptionUsageFresh(capturedAtMs: number, nowMs: number, refreshIntervalMins: number): boolean;
115
122
  //# sourceMappingURL=subscription.d.ts.map
@@ -1,2 +1,15 @@
1
- export {};
1
+ /**
2
+ * 判断上一次用量查询结果是否仍在可复用窗口内。
3
+ *
4
+ * 间隔 ≤ 0 表示不自动查询:此时不复用旧结果,每次挂载都重新查询一次。
5
+ * 该判定由 Client 侧底部用量入口使用,避免每次进入会话都请求上游。
6
+ */
7
+ export function isSubscriptionUsageFresh(capturedAtMs, nowMs, refreshIntervalMins) {
8
+ if (!Number.isFinite(refreshIntervalMins) || refreshIntervalMins <= 0)
9
+ return false;
10
+ if (!Number.isFinite(capturedAtMs) || !Number.isFinite(nowMs))
11
+ return false;
12
+ const age = nowMs - capturedAtMs;
13
+ return age >= 0 && age < refreshIntervalMins * 60_000;
14
+ }
2
15
  //# sourceMappingURL=subscription.js.map
@@ -1,9 +1,9 @@
1
1
  /** 当前经过完整验证的 DSH 版本;源文件由根目录 version.json 同步。 */
2
- export declare const DSH_VERSION: "0.1.6-alpha.2";
2
+ export declare const DSH_VERSION: "0.2.0-rc.1";
3
3
  /** DSH 测试版本别名,供新代码表达语义,保留 DSH_VERSION 兼容旧调用方。 */
4
- export declare const DSH_TESTED_VERSION: "0.1.6-alpha.2";
4
+ export declare const DSH_TESTED_VERSION: "0.2.0-rc.1";
5
5
  /** 插件支持的 DSH 版本范围;插件版本与宿主版本独立发布。 */
6
- export declare const DSH_COMPATIBILITY: ">=0.1.5-rc.3 <=0.1.7-rc.2";
6
+ export declare const DSH_COMPATIBILITY: ">=0.2.0-rc.1 <=0.2.0-rc.1";
7
7
  /** DSH Envelope/Tunnel 协议主版本。 */
8
8
  export declare const DSH_PROTOCOL_VERSION: 1;
9
9
  /** Host 注入到浏览器页面的真实 DSH 版本全局字段。 */
@@ -11,7 +11,7 @@ export declare const CODINGNS_DSH_VERSION_GLOBAL: "__CODINGNS_DSH_VERSION__";
11
11
  /** 识别没有 alpha2 Sidebar 扩展 API 的 DSH 旧版运行时。 */
12
12
  export declare function isLegacyDshVersion(version: string): boolean;
13
13
  /** Codingns4DSH 插件自身的 npm 版本。 */
14
- export declare const CODINGNS_VERSION: "0.1.7-rc.2";
14
+ export declare const CODINGNS_VERSION: "0.2.0-beta.1";
15
15
  /** 判断宿主版本是否落在当前插件声明的 DSH 兼容范围内。 */
16
16
  export declare function isDshVersionCompatible(version: string): boolean;
17
17
  /** 判断 DSH 版本是否达到某个功能模块要求的最低版本。 */
@@ -1,9 +1,9 @@
1
1
  /** 当前经过完整验证的 DSH 版本;源文件由根目录 version.json 同步。 */
2
- export const DSH_VERSION = '0.1.6-alpha.2';
2
+ export const DSH_VERSION = '0.2.0-rc.1';
3
3
  /** DSH 测试版本别名,供新代码表达语义,保留 DSH_VERSION 兼容旧调用方。 */
4
4
  export const DSH_TESTED_VERSION = DSH_VERSION;
5
5
  /** 插件支持的 DSH 版本范围;插件版本与宿主版本独立发布。 */
6
- export const DSH_COMPATIBILITY = '>=0.1.5-rc.3 <=0.1.7-rc.2';
6
+ export const DSH_COMPATIBILITY = '>=0.2.0-rc.1 <=0.2.0-rc.1';
7
7
  /** DSH Envelope/Tunnel 协议主版本。 */
8
8
  export const DSH_PROTOCOL_VERSION = 1;
9
9
  /** Host 注入到浏览器页面的真实 DSH 版本全局字段。 */
@@ -13,7 +13,7 @@ export function isLegacyDshVersion(version) {
13
13
  return /^0\.1\.5(?:-|$)/u.test(version);
14
14
  }
15
15
  /** Codingns4DSH 插件自身的 npm 版本。 */
16
- export const CODINGNS_VERSION = '0.1.7-rc.2';
16
+ export const CODINGNS_VERSION = '0.2.0-beta.1';
17
17
  /** 判断宿主版本是否落在当前插件声明的 DSH 兼容范围内。 */
18
18
  export function isDshVersionCompatible(version) {
19
19
  const match = /^>=([^ ]+) <=([^ ]+)$/u.exec(DSH_COMPATIBILITY);
@@ -1,4 +1,4 @@
1
- export { CODINGNS_CONTROL_BASE_URL_FIELD, CODINGNS_CONTROL_BASE_URLS_FIELD, CODINGNS_CONTROL_STATION_URL, CODINGNS_H5_LOGIN_URL, CODINGNS_LAN_ACCESS_DSH_FIELD, CODINGNS_TERMINAL_ENHANCEMENT_FIELD, CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD, CODINGNS_FILE_MANAGEMENT_FIELD, CODINGNS_MODULES_FIELD, CODINGNS_SETTINGS_NAMESPACE, CODINGNS_SETTINGS_ENTRY_IDS, DEFAULT_CODINGNS_CONTROL_BASE_URL, DEFAULT_CODINGNS_CONTROL_BASE_URLS, DEFAULT_CODINGNS_SETTINGS, DEFAULT_QUICK_PHRASES, DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS, DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS, DEFAULT_FILE_MANAGEMENT_SETTINGS, captureRestartFeatureStates, enabledFeatureNames, isFeatureDshVersionCompatible, isFeatureEnabled, isCodingNsSettingsEntryId, type CodingNsSettings, type CodingNsConfig, type CodingNsRuntimeState, type CodingNsCliAdapterPreference, type LanAccessDshSettings, type LanAccessDshLoginSettings, type LoginProtectionScopes, type RestartFeatureStates, type TerminalAppearanceSettings, type TerminalAppearanceTheme, type TerminalBindingScope, type TerminalCursorStyle, type TerminalEnhancementSettings, type TerminalProfileId, type QuickPhrase, type WorkspaceSessionEnhancementSettings, type FileManagementSettings, } from './contracts/config.js';
1
+ export { CODINGNS_CONTROL_BASE_URL_FIELD, CODINGNS_CONTROL_BASE_URLS_FIELD, CODINGNS_CONTROL_STATION_URL, CODINGNS_H5_LOGIN_URL, CODINGNS_LAN_ACCESS_DSH_FIELD, CODINGNS_TERMINAL_ENHANCEMENT_FIELD, CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD, CODINGNS_FILE_MANAGEMENT_FIELD, CODINGNS_SUBSCRIPTION_USAGE_FIELD, CODINGNS_MODULES_FIELD, CODINGNS_SETTINGS_NAMESPACE, CODINGNS_SETTINGS_ENTRY_IDS, DEFAULT_CODINGNS_CONTROL_BASE_URL, DEFAULT_CODINGNS_CONTROL_BASE_URLS, DEFAULT_CODINGNS_SETTINGS, DEFAULT_QUICK_PHRASES, DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS, DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS, DEFAULT_FILE_MANAGEMENT_SETTINGS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS, SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS, SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS, normalizeSubscriptionUsageSettings, captureRestartFeatureStates, enabledFeatureNames, isFeatureDshVersionCompatible, isFeatureEnabled, isCodingNsSettingsEntryId, type CodingNsSettings, type CodingNsConfig, type CodingNsRuntimeState, type CodingNsCliAdapterPreference, type LanAccessDshSettings, type LanAccessDshLoginSettings, type LoginProtectionScopes, type RestartFeatureStates, type TerminalAppearanceSettings, type TerminalAppearanceTheme, type TerminalBindingScope, type TerminalCursorStyle, type TerminalEnhancementSettings, type TerminalProfileId, type QuickPhrase, type WorkspaceSessionEnhancementSettings, type FileManagementSettings, type SubscriptionUsageSettings, } from './contracts/config.js';
2
2
  export type { FeatureContext, FeatureActivation, FeatureDescriptor, FeatureCapabilityRequirement, FeatureDisposer, FeatureModule, FeatureResourceScope, FeatureRuntime, FeatureState, FeatureUiDescriptor, } from './contracts/feature.js';
3
3
  export type { DshCapabilityDiagnostic, DshCapabilityId, DshCapabilityProfile, DshCapabilityResolution, DshCapabilityResolutionStatus, DshCapabilityRoute, DshCapabilityRouteStatus, DshCapabilityRuntime, } from '../dsh-capabilities/types.js';
4
4
  export { CODINGNS_DSH_ERROR_CODES, CodingNsDshError, SUPPORTED_DSH_COMPATIBILITY, SUPPORTED_DSH_VERSION, assertSupportedDshVersion, type CodingNsDshErrorCode, } from './contracts/errors.js';
@@ -6,11 +6,12 @@ export { CODINGNS_VERSION, DSH_COMPATIBILITY, DSH_PROTOCOL_VERSION, CODINGNS_DSH
6
6
  export type { CodingNsRpcRequest, CodingNsStreamRequest, CodingNsTransport, CodingNsTransportErrorShape, CodingNsTransportGeneration, CodingNsTransportHooks, } from './contracts/transport.js';
7
7
  export { DSH_ENVELOPE_PROTOCOL, DSH_ENVELOPE_VERSION, DEFAULT_MAX_DSH_ENVELOPE_BYTES, DEFAULT_MAX_DSH_META_BYTES, decodeDshEnvelope, encodeDshEnvelope, validateDshEnvelope, type DshChannel, type DshEnvelope, type DshEnvelopeCodecOptions, type DshEnvelopeFlags, type DshHostScope, } from '../transport/dsh-envelope.js';
8
8
  export { CODINGNS_RPC_CHANNEL } from './contracts/transport.js';
9
- export type { CodingNsCliAdapterDescriptor, CodingNsCliAdapterId, CodingNsCliCapability, CodingNsAgentEvent, CodingNsAgentQuestion, CodingNsAgentQuestionResponse, CodingNsAgentToolEvent, CodingNsCliMessage, CodingNsCliModel, CodingNsCliModelCatalog, CodingNsCliModelGroup, CodingNsAgentPermissionResponse, CodingNsCliSessionConfig, CodingNsCliSessionRecord, CodingNsCliProviderSessionState, CodingNsCliSessionStatus, CodingNsSessionAdapterBinding, CodingNsCliTurnInput, } from './contracts/cli-adapter.js';
9
+ export type { CodingNsCliAdapterDescriptor, CodingNsCliAdapterId, CodingNsCliCapability, CodingNsAgentEvent, CodingNsAgentQuestion, CodingNsAgentQuestionResponse, CodingNsAgentToolEvent, CodingNsCliMessage, CodingNsCliModel, CodingNsCliModelCatalog, CodingNsCliModelGroup, CodingNsCliTeamDiagnostic, CodingNsAgentPermissionResponse, CodingNsCliSessionConfig, CodingNsCliSessionRecord, CodingNsCliProviderSessionState, CodingNsCliSessionStatus, CodingNsSessionAdapterBinding, CodingNsCliTurnInput, } from './contracts/cli-adapter.js';
10
10
  export type { CommandCodeSubscriptionUsage, CommandCodeSubscriptionWindow, } from './contracts/command-code.js';
11
11
  export type { GitBranchItem, GitBranchSnapshot, GitChangeItem, GitCommitResult, GitDiff, GitHistoryItem, GitHistoryPage, GitHistoryRef, GitRepoSnapshot, GitStatus, } from './contracts/git.js';
12
12
  export type { SessionChangedFiles } from './contracts/file-management.js';
13
13
  export type { CliSubscriptionProvider, CliSubscriptionUsage, CliSubscriptionWindow, DeepseekBalance, DeepseekUsage, ProviderBalanceUsage, Sub2ApiDailyUsage, Sub2ApiModelUsage, Sub2ApiUsage, Sub2ApiUsagePoint, } from './contracts/subscription.js';
14
+ export { isSubscriptionUsageFresh } from './contracts/subscription.js';
14
15
  export type { AggregateWorkspaceSummary, AggregateHostResult, HostScope, PeerHostErrorCode, PeerHostErrorShape, PeerHostRoute, PeerHostRecord, PeerHostClientRoute, PeerHostClientRecord, PeerHostSessionRecord, PeerHostWebSocketEndpoint, PeerHostStatus, ResourceScopeDisposer, ResourceScopeInput, ResourceScopeRef, ResourceScopeSnapshot, } from './contracts/peer-host.js';
15
16
  export { PEER_HOST_ERROR_CODES, ResourceScopeStaleError } from './contracts/peer-host.js';
16
17
  export { DEBUG_ERROR_CODES, DEBUG_RPC_ENDPOINTS, parseDebugMutationScope, parseDebugPtyLaunchRequest, parseDebugRpcScope, type DebugAiFallbackState, type DebugCompatibilityLevel, type DebugErrorCode, type DebugMutationScope, type DebugPortState, type DebugProcessInstance, type DebugProcessOwnership, type DebugPlanState, type DebugProxyProtocol, type DebugPtyLaunchRequest, type DebugRpcEndpoint, type DebugRpcScope, type DebugRuntimeMode, type DebugRuntimeState, } from './contracts/debug.js';
@@ -1,8 +1,9 @@
1
- export { CODINGNS_CONTROL_BASE_URL_FIELD, CODINGNS_CONTROL_BASE_URLS_FIELD, CODINGNS_CONTROL_STATION_URL, CODINGNS_H5_LOGIN_URL, CODINGNS_LAN_ACCESS_DSH_FIELD, CODINGNS_TERMINAL_ENHANCEMENT_FIELD, CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD, CODINGNS_FILE_MANAGEMENT_FIELD, CODINGNS_MODULES_FIELD, CODINGNS_SETTINGS_NAMESPACE, CODINGNS_SETTINGS_ENTRY_IDS, DEFAULT_CODINGNS_CONTROL_BASE_URL, DEFAULT_CODINGNS_CONTROL_BASE_URLS, DEFAULT_CODINGNS_SETTINGS, DEFAULT_QUICK_PHRASES, DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS, DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS, DEFAULT_FILE_MANAGEMENT_SETTINGS, captureRestartFeatureStates, enabledFeatureNames, isFeatureDshVersionCompatible, isFeatureEnabled, isCodingNsSettingsEntryId, } from './contracts/config.js';
1
+ export { CODINGNS_CONTROL_BASE_URL_FIELD, CODINGNS_CONTROL_BASE_URLS_FIELD, CODINGNS_CONTROL_STATION_URL, CODINGNS_H5_LOGIN_URL, CODINGNS_LAN_ACCESS_DSH_FIELD, CODINGNS_TERMINAL_ENHANCEMENT_FIELD, CODINGNS_WORKSPACE_SESSION_ENHANCEMENT_FIELD, CODINGNS_FILE_MANAGEMENT_FIELD, CODINGNS_SUBSCRIPTION_USAGE_FIELD, CODINGNS_MODULES_FIELD, CODINGNS_SETTINGS_NAMESPACE, CODINGNS_SETTINGS_ENTRY_IDS, DEFAULT_CODINGNS_CONTROL_BASE_URL, DEFAULT_CODINGNS_CONTROL_BASE_URLS, DEFAULT_CODINGNS_SETTINGS, DEFAULT_QUICK_PHRASES, DEFAULT_TERMINAL_ENHANCEMENT_SETTINGS, DEFAULT_WORKSPACE_SESSION_ENHANCEMENT_SETTINGS, DEFAULT_FILE_MANAGEMENT_SETTINGS, DEFAULT_SUBSCRIPTION_USAGE_SETTINGS, SUBSCRIPTION_USAGE_REFRESH_INTERVAL_MINS_LIMITS, SUBSCRIPTION_USAGE_TIMEOUT_SECS_LIMITS, normalizeSubscriptionUsageSettings, captureRestartFeatureStates, enabledFeatureNames, isFeatureDshVersionCompatible, isFeatureEnabled, isCodingNsSettingsEntryId, } from './contracts/config.js';
2
2
  export { CODINGNS_DSH_ERROR_CODES, CodingNsDshError, SUPPORTED_DSH_COMPATIBILITY, SUPPORTED_DSH_VERSION, assertSupportedDshVersion, } from './contracts/errors.js';
3
3
  export { CODINGNS_VERSION, DSH_COMPATIBILITY, DSH_PROTOCOL_VERSION, CODINGNS_DSH_VERSION_GLOBAL, DSH_TESTED_VERSION, DSH_VERSION, isDshVersionAtLeast, isLegacyDshVersion, isDshVersionCompatible, } from './contracts/version.js';
4
4
  export { DSH_ENVELOPE_PROTOCOL, DSH_ENVELOPE_VERSION, DEFAULT_MAX_DSH_ENVELOPE_BYTES, DEFAULT_MAX_DSH_META_BYTES, decodeDshEnvelope, encodeDshEnvelope, validateDshEnvelope, } from '../transport/dsh-envelope.js';
5
5
  export { CODINGNS_RPC_CHANNEL } from './contracts/transport.js';
6
+ export { isSubscriptionUsageFresh } from './contracts/subscription.js';
6
7
  export { PEER_HOST_ERROR_CODES, ResourceScopeStaleError } from './contracts/peer-host.js';
7
8
  export { DEBUG_ERROR_CODES, DEBUG_RPC_ENDPOINTS, parseDebugMutationScope, parseDebugPtyLaunchRequest, parseDebugRpcScope, } from './contracts/debug.js';
8
9
  export { EMPTY_DEBUG_CONFIG, parseDebugConfig, } from './contracts/debug-config.js';
@@ -1,9 +1,19 @@
1
1
  import { type DshTransportDebugLogger } from './debug.js';
2
2
  export declare const TUNNEL_DATA_CHANNEL_LABEL = "codingns-tunnel";
3
- /** DataChannel 单消息保守上限;实际对端协商值可能只有 256 KiB。 */
3
+ /** 单个分片的正文上限;整帧为正文加上分片头。 */
4
4
  export declare const DATA_CHANNEL_FRAGMENT_PAYLOAD_BYTES: number;
5
5
  export declare const DATA_CHANNEL_FRAGMENT_HEADER_BYTES = 20;
6
6
  export declare const DATA_CHANNEL_MAX_REASSEMBLY_BYTES: number;
7
+ /**
8
+ * Host 侧向浏览器宣告的 SCTP max-message-size(256 KiB)。
9
+ *
10
+ * 浏览器按对端 SDP 里的 max-message-size 限制 `RTCDataChannel.send()`;werift 默认
11
+ * 只宣告 64 KiB,而 Carrier 的整分片是 64 KiB 正文加 20 字节头,因此浏览器侧只要
12
+ * 发送超过 64 KiB 的消息就会抛 `Trying to send message larger than max-message-size`。
13
+ * 中继下的设置写入、附件和大字段都属于这一类,必须把上限抬到浏览器自身
14
+ * (Chrome/Firefox 为 256 KiB)能接受的水平。
15
+ */
16
+ export declare const DATA_CHANNEL_MAX_MESSAGE_BYTES: number;
7
17
  export interface CodingNsCarrier {
8
18
  readonly state: 'connecting' | 'open' | 'closed';
9
19
  send(data: Uint8Array): Promise<void>;