import { type RedactRulesConfig, type SensitivityDecision } from '@sofagent/core'; import { type ArmMetrics, type CanaryConfig, type RollbackOutcome, type RollbackWeightsFn, type RouteVerdict } from '@sofagent/train'; /** 传输回调(注入式传输层——收密文条目,返回是否送达) */ export type UploadTransport = (entry: { seq: number; deviceId: string; category: string; destination?: string; ciphertext: string; iv: string; tag: string; }) => boolean; /** 推送结果(结构化) */ export interface DeviceDataPushResult { /** 首行必须 [sofagent] 前缀 */ text: string; data: { isError: boolean; ok: boolean; reason?: 'not-registered' | 'revoked' | 'invalid-identity' | 'daemon-unavailable' | 'empty-policy' | 'device-not-in-policy' | 'category-not-declared' | 'destination-mismatch' | 'invalid-params' | 'no-aes-key'; message: string; /** 入队序号(ok=true 时有值) */ seq?: number; /** 本次上行送达状态:sent 已送达并 ack / queued 暂存待传 / partial 部分送达 */ delivery?: 'sent' | 'queued' | 'partial'; /** 待传条目数(冲账后仍留在 WAL 的) */ pending?: number; auditLogged: boolean; }; } /** L2 外挂 NER 端点 env(未设 → 不注册 L2,插槽退化为 L0+L1 两层) */ export declare const L2_NER_ENDPOINT_ENV = "SOFAGENT_L2_NER_ENDPOINT"; /** L2 外挂 NER 超时 env(毫秒——缺省沿用 detector-remote 的 3000) */ export declare const L2_NER_TIMEOUT_ENV = "SOFAGENT_L2_NER_TIMEOUT_MS"; /** 灰度配置文件相对路径(/config/weight-canary.json) */ export declare const WEIGHT_CANARY_FILE = "config/weight-canary.json"; /** * 读灰度配置(/config/weight-canary.json)。 * * 不存在 / 损坏 / 字段非法 → undefined(不灰度——全量旧臂,行为零变化)。 * 与 device-upload-policy 同纪律:坏配置发声不崩(`console.warn`)。 */ export declare function loadWeightCanaryConfig(dataDir: string): CanaryConfig | undefined; /** 三层检测插槽接线选项(缺省从配置面解析——装配/测试可注入覆盖) */ export interface UpstreamPipelineOptions { /** L2 外挂 NER 端点覆盖(缺省读 env `SOFAGENT_L2_NER_ENDPOINT`) */ l2Endpoint?: string; /** L2 超时覆盖(毫秒) */ l2TimeoutMs?: number; } /** 上行管线接线结果(三层检测 + 脱敏) */ export interface UpstreamPipelineResult { /** 脱敏后文本(命中项已走既有脱敏管线——可安全落盘/上行) */ text: string; /** 脱敏命中计数(替代旧 redact().totalHits 入审计计量) */ redactHits: number; /** 敏感度判定本体结果(routeReason 为判定本体原样输出) */ decision: SensitivityDecision; /** 入审计链用的 routeReason——已过 L0+L1 脱敏(见下「标签二次泄漏」注) */ routeReasonSanitized: string; /** 管道降级登记(L2 外挂不可用等——fail-closed 留痕,不静默) */ degraded: Array<{ detector: string; reason: string; }>; /** L2 预取失败原因(不可达/超时/响应不合法——真实故障因,随 evidence 入链) */ l2PrefetchError?: string; /** 参与调度的检测器清单(L0/L1/L2 接线自证) */ detectors: Array<{ name: string; layer: string; }>; /** L1 词典窄化统计(只做可见化——见 GlossaryNarrowing 注) */ glossaryNarrowed: GlossaryNarrowing; /** 审计 evidence 行(追加进既有 evidence 数组) */ evidence: string[]; } /** 灰度分流接线选项 */ export interface UpstreamCanaryOptions { /** 灰度配置覆盖(缺省读 `/config/weight-canary.json`) */ canary?: CanaryConfig; /** 两臂指标(提供时执行劣化判定 + 回退编排——daemon 装配/巡检注入) */ metrics?: { old: ArmMetrics; new: ArmMetrics; }; /** 回退执行面(复用 rollback-weights 语义——runCanaryCheck 消费) */ rollbackWeights?: RollbackWeightsFn; /** 回退留痕签名密钥(缺省无签名) */ hmacKey?: string; } /** 灰度分流接线结果 */ export interface UpstreamCanaryResult { /** 分流判定(未配置灰度时 undefined) */ canary?: RouteVerdict; /** 分流依据(人读可解释——随 evidence 入审计链) */ routeReason?: string; /** 劣化回退编排结果(注入两臂指标时给出) */ rollback?: RollbackOutcome; /** 审计 evidence 行 */ evidence: string[]; } /** 上行接线总选项(三层检测插槽 + 灰度分流——两段各取自己的字段) */ export interface UpstreamWiringOptions extends UpstreamPipelineOptions, UpstreamCanaryOptions { } /** * L1 词典窄化统计(**只做可见化,不改脱敏能力**)。 * * 插槽态下 `redact-rules.json` 的 entities 由 L1 词典承载,而 v1.4.9 词典件 * 自带两条**收窄**语义(本批不动 core,故只能让它可见): * ① 空 / 单字符词条被 `buildGlossaryFromEntityNames` 拒收(<2 字符门槛) * ② 纯 ASCII 词条在 `termToRegex` 加两侧非字母数字断言(子串匹配 → 整词匹配) * 二者都会让实际脱敏口径**比配置窄**。安全能力的收窄属最需显式披露的一类, * 故统计配置侧窄化量,并在本次文本**确实落在窄化缺口上**时逐条登记 * (词条以 sha256 前 8 位指代——与 routeReason 止损同一条「链上不留原文」纪律)。 */ export interface GlossaryNarrowing { /** 被词典拒收的词条数(当前实现 = <2 字符 / 空词条) */ droppedShort: number; /** 纯 ASCII 词条数(整词边界语义——子串匹配面收窄) */ asciiWordBoundary: number; /** 本次文本确实落入窄化缺口的词条(未脱敏即可能出盘——必须可见) */ missed: Array<{ category: 'droppedShort' | 'asciiWordBoundary'; tag: string; }>; } /** * 上行敏感检测管线(三层插槽——两条上行通道共用)。 * * ⚠️ 本函数只做**调用点接线**:`classifySensitivity` / `DetectorRegistry` / * `prefetchRemoteSpans` 的内部实现一行未改。 * * @param args.text 待检测文本(上行明文) * @param args.rules 既有脱敏规则(`loadRedactRules` 产物——插槽态下其 * entities 并入 L1 词典,格式类/结构类仍由 redact 原位处置) */ export declare function runUpstreamSensitivityPipeline(args: { text: string; rules: RedactRulesConfig; dataDir: string; opts?: UpstreamPipelineOptions; }): Promise; /** * 灰度分流接线(T9——canary hash 稳定分流 + 劣化回退编排)。 * * ⚠️ 判定本体 `canaryRouteRequest` / `runCanaryCheck` 内部实现一行未改。 * 与检测管线分列的原因:session 上行按字段逐次过检测管线,若分流内联在 * 检测管线里,一次推送会重复触发 `runCanaryCheck`(劣化回退被重复执行)。 * * @param args.routeKey 分流键(设备上行 = deviceId;session 上行 = * sessionId——同键恒定同臂,防同会话在两臂间抖动) */ export declare function resolveUpstreamCanaryRoute(args: { routeKey: string; dataDir: string; opts?: UpstreamCanaryOptions; }): Promise; /** * 数据上行(G11)。 * * @param args.identity 设备身份码(过 gateDevice 闸门) * @param args.category 数据类别(采集声明内的 category) * @param args.payload 上行内容(明文——入队前脱敏 + 加密) * @param args.destination 目的地(与声明核对) * @param args.transport 传输回调(缺省只入队不发送) * @param args.wiring 三层检测插槽 / 灰度分流接线选项(缺省从配置面解析—— * 非必填:MCP 入参面不变,装配侧可注入 L2 端点 / 灰度配置覆盖) */ export declare function deviceDataPush(args: { identity: Record; category: string; payload: string; destination?: string; transport?: UploadTransport; wiring?: UpstreamWiringOptions; }): Promise; //# sourceMappingURL=device-data-push.d.ts.map