@tansr/serve 0.4.0 → 0.5.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.
package/dist/index.d.ts CHANGED
@@ -4207,6 +4207,7 @@ declare const CONTROL_FRAME: {
4207
4207
  readonly permissionClosed: "server.permission.closed";
4208
4208
  readonly questionRequest: "server.question.request";
4209
4209
  readonly questionClosed: "server.question.closed";
4210
+ readonly platformWarning: "server.platform.warning";
4210
4211
  };
4211
4212
  type ControlFrameName = (typeof CONTROL_FRAME)[keyof typeof CONTROL_FRAME];
4212
4213
  /** 判别一个流内条目是否控制帧(编码器/过滤器共用;gap 帧另路不经此判) */
@@ -4244,6 +4245,14 @@ interface PermissionRequestPayload {
4244
4245
  interface RequestClosedPayload {
4245
4246
  requestId: string;
4246
4247
  }
4248
+ /**
4249
+ * server.platform.warning 载荷(平台 t.warn 同形投影;恒不代表请求失败,
4250
+ * 回答照常——仅结构化告知非致命降级,呈现策略归端上)。
4251
+ */
4252
+ interface PlatformWarningPayload {
4253
+ code: string;
4254
+ message: string;
4255
+ }
4247
4256
  /** server.question.request 载荷(kernel Question 白名单拷贝) */
4248
4257
  interface QuestionRequestPayload {
4249
4258
  requestId: string;
@@ -4259,7 +4268,7 @@ interface QuestionRequestPayload {
4259
4268
  /** 仅无订阅者宽限期激活时在场(epoch_ms) */
4260
4269
  expiresAt?: number;
4261
4270
  }
4262
- type ControlFramePayload = ToolRequestPayload | ToolCancelPayload | PermissionRequestPayload | RequestClosedPayload | QuestionRequestPayload;
4271
+ type ControlFramePayload = ToolRequestPayload | ToolCancelPayload | PermissionRequestPayload | RequestClosedPayload | QuestionRequestPayload | PlatformWarningPayload;
4263
4272
  /** 出站通知 HMAC 签名头(值形 `sha256=<hex>`,对原始请求体全文签) */
4264
4273
  declare const TURN_END_NOTIFY_SIGNATURE_HEADER = "x-tansr-signature";
4265
4274
  /** 轮终局词表(KernelEvent turn.completed/turn.aborted 的投影) */
@@ -9871,6 +9880,15 @@ interface PlatformSessionAssemblerInput {
9871
9880
  sessionId: string;
9872
9881
  /** 会话请求的模型别名(bundle aliases/目录 handle;缺省 'main') */
9873
9882
  model?: string;
9883
+ /**
9884
+ * S-ARCH P2(拍板 2026-09-02)— per-会话传输沉降缝:平台提示帧除宿主
9885
+ * 承接(options.onPlatformWarning)外,同帧投递本缝(工厂接 v2 控制帧
9886
+ * server.platform.warning 下发端上)。两路并行不互斥。
9887
+ */
9888
+ onWarning?: (warning: {
9889
+ code: string;
9890
+ message: string;
9891
+ }) => void;
9874
9892
  }
9875
9893
  /**
9876
9894
  * per-endUser 平台令牌档装配缝实现(agent-session-factory
@@ -10003,6 +10021,11 @@ interface CreateAgentSessionFactoryOptions {
10003
10021
  endUserId: string;
10004
10022
  sessionId: string;
10005
10023
  model?: string;
10024
+ /** S-ARCH P2:平台提示帧 per-会话沉降缝(工厂绑 v2 控制帧下发;自实现装配器可如实忽略) */
10025
+ onWarning?: (warning: {
10026
+ code: string;
10027
+ message: string;
10028
+ }) => void;
10006
10029
  }) => Promise<SessionModelAssembler>;
10007
10030
  }
10008
10031
  interface AgentSessionFactoryBuild {
@@ -10031,6 +10054,15 @@ declare class AgentSessionBridge {
10031
10054
  bindEmitter(emit: (type: string, payload: unknown) => void): void;
10032
10055
  /** 活跃 SSE 订阅者数通报(注册仓 → 句柄 → 本桥;提问宽限判据) */
10033
10056
  noteSubscribers(count: number): void;
10057
+ /**
10058
+ * S-ARCH P2(拍板 2026-09-02)— 平台提示帧下发:t.warn 投影为
10059
+ * server.platform.warning 控制帧(带 id 进环形缓冲,断线重放可见;旧端
10060
+ * 未知帧兜底恒安全)。emit 缝未绑定的窄窗(装配期恒无 warn)静默无害。
10061
+ */
10062
+ emitPlatformWarning(payload: {
10063
+ code: string;
10064
+ message: string;
10065
+ }): void;
10034
10066
  /** 工具调用登记(RemoteToolProxy.execute 内部调用) */
10035
10067
  registerToolCall(callId: string, name: string, args: unknown, deadlineAt: number, signal: AbortSignal): Promise<ToolResult>;
10036
10068
  /** ⑨ 回执受理(第一份有效终局;重复 409 无害) */
package/dist/index.js CHANGED
@@ -37889,7 +37889,12 @@ var CONTROL_FRAME = {
37889
37889
  permissionRequest: "server.permission.request",
37890
37890
  permissionClosed: "server.permission.closed",
37891
37891
  questionRequest: "server.question.request",
37892
- questionClosed: "server.question.closed"
37892
+ questionClosed: "server.question.closed",
37893
+ // S-ARCH P2(用户拍板 2026-09-02「同意」,doc/98 §三增笔四族七名):平台
37894
+ // 提示帧下发端上——thinking_unavailable_on_face/balance_low 等非致命降级
37895
+ // 结构化告知,端侧可渲染「为什么这次没有思考」;旧端未知帧兜底恒安全
37896
+ // (Android UnknownControlFrame / iOS 同律实证)。
37897
+ platformWarning: "server.platform.warning"
37893
37898
  };
37894
37899
  var CONTROL_FRAME_NAMES = new Set(Object.values(CONTROL_FRAME));
37895
37900
  function isControlFrameType(type) {
@@ -53944,6 +53949,14 @@ var AgentSessionBridge = class {
53944
53949
  #send(type, payload) {
53945
53950
  this.#emit?.(type, payload);
53946
53951
  }
53952
+ /**
53953
+ * S-ARCH P2(拍板 2026-09-02)— 平台提示帧下发:t.warn 投影为
53954
+ * server.platform.warning 控制帧(带 id 进环形缓冲,断线重放可见;旧端
53955
+ * 未知帧兜底恒安全)。emit 缝未绑定的窄窗(装配期恒无 warn)静默无害。
53956
+ */
53957
+ emitPlatformWarning(payload) {
53958
+ this.#send(CONTROL_FRAME.platformWarning, payload);
53959
+ }
53947
53960
  // ———— 工具桥半场(RemoteToolProxy 的登记/回执面)————
53948
53961
  /** 工具调用登记(RemoteToolProxy.execute 内部调用) */
53949
53962
  registerToolCall(callId, name, args, deadlineAt, signal) {
@@ -60739,13 +60752,17 @@ function createPlatformSessionAssembler(options) {
60739
60752
  fetchImpl: refreshingFetch,
60740
60753
  sessionId: () => platformSessionId,
60741
60754
  // S-ARCH P2:平台提示帧经 SDK onWarn 缝出线,携会话归属(serve 面
60742
- // per-会话装配,归属天然可判——CLI 进程级电台的「无从归属」不适用此径)
60743
- onWarn: (warn) => deliverWarning({
60744
- endUserId: input.endUserId,
60745
- sessionId: input.sessionId,
60746
- code: warn.code,
60747
- message: warn.message
60748
- })
60755
+ // per-会话装配,归属天然可判——CLI 进程级电台的「无从归属」不适用此径);
60756
+ // 双路投递:宿主承接(遥测/日志)+ per-会话传输沉降(v2 控制帧)。
60757
+ onWarn: (warn) => {
60758
+ deliverWarning({
60759
+ endUserId: input.endUserId,
60760
+ sessionId: input.sessionId,
60761
+ code: warn.code,
60762
+ message: warn.message
60763
+ });
60764
+ input.onWarning?.({ code: warn.code, message: warn.message });
60765
+ }
60749
60766
  });
60750
60767
  return (alias, onProviderSelected) => {
60751
60768
  const built = buildClientFromRegistry(platform.registry, alias, onProviderSelected);
@@ -61373,7 +61390,10 @@ function createAgentSessionFactory(options) {
61373
61390
  assembleOverride = await assembleEndUserModel({
61374
61391
  endUserId: init.endUserId,
61375
61392
  sessionId,
61376
- ...init.model !== void 0 ? { model: init.model } : {}
61393
+ ...init.model !== void 0 ? { model: init.model } : {},
61394
+ // S-ARCH P2(拍板 2026-09-02):平台提示帧沉降 v2 控制帧
61395
+ // server.platform.warning(桥 emit 缝绑定恒早于首轮,无丢失窗)
61396
+ onWarning: (warning) => bridge.emitPlatformWarning(warning)
61377
61397
  });
61378
61398
  }
61379
61399
  let driver;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tansr/serve",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Tansr agent session server: the bare /v2 agent-session protocol engine (REST + SSE) you embed in your own Node service. Session auth is fully yours via the authenticate seam. Published as @tansr/serve (decided 2026-09-01); the pack script stamps the publish name into the tarball.",
5
5
  "license": "MIT",
6
6
  "type": "module",