斯库克
每一个地方都有一个洗涤器 SLICC的秘密 可能滑入模型的背景: 保险库的 forward 响应和模型请求,内核的执行子,和slic-agent的工具输出. 它取代了密文的值,在下面的每个编码中,在文本前进之前. 设计是第3.15节 secrets-tokens-design.md (修订版4) 在slic-agent-plan中;这个README是所建的光谱.
- 零运行时间依赖, 没有DOM和Node API,没有
eval没有生成代码 。 它以浏览器框架,工人,节点和内核的形式运行. - 决定: 相同的值和输入总是给予同样的输出.
- 一套向量,
vectors.json每个消费者都会反对它.
import { compile } from '@ai-ecoverse/slicc-scrub';
const scrubber = compile([{ name: 'GH_TOKEN', value: 'ghp_…', placeholder: 'fnox_proxy_…' }], { version: 3 });
scrubber.text('token: ghp_…');
API 密码
compile(secrets, options?) → Scrubber | secrets 实值 { name, value, placeholder }[]。一个值短于 8 字节的 UTF-8 扔出 a RangeError:除了普通的输出,它不能被告诉. options 为: idleMs (违约250)和 version (默认0),两者都只回放,和 sameLength (默认) false(见下文) |
scrubber.text(string) → { text, hits } | 清除 UTF-8 文本。 片段匹配可以剪切多字节字符;其残留解码为 U+FFFD |
scrubber.bytes(Uint8Array) → { bytes, hits } | 擦除字节 |
scrubber.stream() → Stream | 清除下方的溪流 |
scrubber.version, (中文(简体) ), scrubber.idleMs, (中文(简体) ), scrubber.size | 选项和不同模式的数量 |
FRAGMENT, (中文(简体) ), MIN_VALUE | 第16和8条 |
hits 实值 [{ name, form, count }]:每个秘密以每种形式出现的次数(raw, (中文(简体) ), fragment, (中文(简体) ), json, (中文(简体) ), percent, (中文(简体) ), html, (中文(简体) ), base64, (中文(简体) ), hex, (中文(简体) ), wrapped) (中文(简体) ). 它从来不包含一个值.
表格
每个值 页:1 以这些形式与 UTF-8 字节相匹配。 一种形式只有在与以前不同时才会被添加.
| 表单 | 什么是匹配的 |
|---|---|
raw | 页:1 本身 |
fragment | 任何运行 16 字节或更多 页:1。短于 16 字节的值没有 |
json | 内部 JSON.stringify(v); 与 / 作为 \/; 使用每个控制和非ASCII UTF-16单元作为 \uXXXX,在下方和上方 |
percent | encodeURIComponent(v); 小写十六进制相同 %20 作为 +并形成编码 A–Z a–z 0–9 * - . _ 中,空格为 +(中文(简体) ) |
html | & < > " 作为 & < > ",以及 ' 作为 ' 或者说 ' |
base64 | 标准字母和URL安全字母:整个编码、加法和不加法,以及 页:1 在更长的编码流中,每个字节相抵消 0, 1 和 2, 字符运行只取决于 页:1'字节(当它至少有8个字符). 这包括基本 user:pass 与 页:1 在两侧,JWT段和基数64'd JSON |
hex | 下与上,相接相接 |
wrapped | 页:1 base64 财务报告和审定财务报表 hex 以 CR 和 LF 形式在其中的任何地方显示(base64 -w 76总统阁下, xxd -p(中文(简体) ) |
匹配
- 1 Aho – Corasick 自动马通 在每一个图案上,在字节上。 碎片从它们的16字节窗口中找到,并沿着值被扩展出字节. 第二个自動相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相關相
base64财务报告和审定财务报表hex模式运行在已删除的 CR 和 LF 输入的视图上,映射回原字节. - 最左边,那么最长: 在每一点上,开始的比赛先取胜,然后在那些最长的比赛中取胜. 绑起来
raw,则fragment, (中文(简体) ),json, (中文(简体) ),percent, (中文(简体) ),html, (中文(简体) ),base64, (中文(简体) ),hex,然后是先前的秘密。 匹配从不重叠,替换的文本从不扫描 . - 替换: (单位:千美元)
raw匹配(覆盖整个值的碎片是一)成为密件placeholder; 任何其它东西都变成[redacted:<name>]。 。 。 . sameLength: true以匹配的字节数替换每种形式的匹配:每个字节变为*(0x2A),但不包括CR和LF,它们留在原地. 填充符是固定的字节,没有取自值、占位符或名称,所以输出有输入的长度和行间断开,并且长度前置框架围绕匹配(一个 HTTP)Content-Length,一个块大小,一个WebSocket框架)仍然坚守. 匹配,表单,hits而流出与没有流出相同;只有替换不同.- 匹配是区分大小写;六分法在大小写中匹配.
流线
stream() 返回时 { push(Uint8Array) → Uint8Array, idle() → Uint8Array, end() → Uint8Array, hits }。 。 。 .
push返回不再是匹配的一部分的每个字节、被擦除并拖住其余部分:从迄今为止的输入仍然可以成为匹配的最早点起(一个图案的适当前缀、一个沿其值仍在增长的片段,或一个覆盖整个CR和LF的包裹图案)。 因此,在任何块块之间分出一个相匹配的字段完全一样end()给出与bytes()。 。 。 .end洗干净,把一切拿回来.idle由呼叫者打电话idleMs没有输入, 所以交互提示不能拖住 。 它释放出所持有的字节,被洗涤, 只有在16人以下的情况下,否则则不返回。 16字节或以上的被扣尾可能是更长时间相匹配的开始.hits目前为止,总的溪流.
向量
vectors.json (单位:千美元)@ai-ecoverse/slicc-scrub/vectors.json)为 { format: 1, fragment, minValue, idleMs, cases }。每个案件 { name, secrets, input, output, hits },或与 inputHex 财务报告和审定财务报表 outputHex 用于不是UTF-8的字节. scripts/vectors.mjs 从每个输入的构建方式(节点的自有基数64、六进制和URL编码器)来写,从不从洗涤器来写.
消费者的测试,每个案例:
bytes(input)(和text(如果案件是文字)output财务报告和审定财务报表hits,按任何顺序;- 页:1 每个分点, (中文(简体) ),
push(first), (中文(简体) ),push(rest), (中文(简体) ),end()给output· ; - 一次给出一个字节
output。 。 。 .
开发
npm install
npm run build # dist/index.js and dist/types
npm run lint
npm test # vectors.json is fresh, the vectors at every split point, the API, a fuzz test, and CI
npm run vectors # rewrite vectors.json
单位测试在 gi上 test/unit/ (单位:千美元)npm run test:unit),而承诺前的钩子要求它们覆盖每一个被修改的行 src/。Biome、TypeScript、左上角和翻新配置来自 分页共享网络。 。 。 .
释放
.github/workflows/ci.yml 唯一的工作流程: 塑料-共享网络管道,与该版本相同 @ai-ecoverse/slicc-shared-web 德从相生. 一个拉动请求得到点缀, npm test (单位:千美元)test/integration/*.test.mjs一个硬的,因为 ci / integration和克洛德和克洛德和克洛德克斯评论(ci / review) (中文(简体) ). 推动 main 运行语义释放, 它标记了常规承诺的版本并发布 @ai-ecoverse/slicc-scrub 到 npm 有出处, 通过信任的出版来自 ci.yml. 没有其他方法可以释放. test/integration/workflows.test.mjs 留着吧.