@aimarket/warden 0.22.0 → 0.22.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.
- package/CHANGELOG.md +30 -0
- package/README-es.md +23 -7
- package/README-fr.md +23 -7
- package/README-ru.md +23 -7
- package/README-zh.md +23 -7
- package/README.md +23 -7
- package/dist/annotation-review.js.map +1 -1
- package/dist/answer-gate.d.ts +94 -0
- package/dist/answer-gate.d.ts.map +1 -0
- package/dist/answer-gate.js +234 -0
- package/dist/answer-gate.js.map +1 -0
- package/dist/atomic-screen.d.ts.map +1 -1
- package/dist/classifier.d.ts +2 -2
- package/dist/classifier.d.ts.map +1 -1
- package/dist/claude-hook.js.map +1 -1
- package/dist/declare.d.ts.map +1 -1
- package/dist/declare.js.map +1 -1
- package/dist/flow-guard-answer.d.ts +3 -2
- package/dist/flow-guard-answer.d.ts.map +1 -1
- package/dist/flow-guard-answer.js +38 -11
- package/dist/flow-guard-answer.js.map +1 -1
- package/dist/flow-guard-classify.js.map +1 -1
- package/dist/flow-guard-constraints.d.ts +43 -0
- package/dist/flow-guard-constraints.d.ts.map +1 -0
- package/dist/flow-guard-constraints.js +69 -0
- package/dist/flow-guard-constraints.js.map +1 -0
- package/dist/flow-guard-fragments.d.ts.map +1 -1
- package/dist/flow-guard-labels.js.map +1 -1
- package/dist/flow-guard-leak.js.map +1 -1
- package/dist/flow-guard-paths.d.ts.map +1 -1
- package/dist/flow-guard-paths.js.map +1 -1
- package/dist/flow-guard-policy.js.map +1 -1
- package/dist/flow-guard-post.js.map +1 -1
- package/dist/flow-guard-pre.js.map +1 -1
- package/dist/flow-guard-screen.d.ts.map +1 -1
- package/dist/flow-guard-screen.js.map +1 -1
- package/dist/flow-guard-state.d.ts.map +1 -1
- package/dist/flow-guard-state.js +8 -0
- package/dist/flow-guard-state.js.map +1 -1
- package/dist/flow-guard-text.js.map +1 -1
- package/dist/flow-guard-types.d.ts +8 -0
- package/dist/flow-guard-types.d.ts.map +1 -1
- package/dist/flow-guard.d.ts +2 -0
- package/dist/flow-guard.d.ts.map +1 -1
- package/dist/flow-guard.js +1 -0
- package/dist/flow-guard.js.map +1 -1
- package/dist/histor.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/jcs.d.ts.map +1 -1
- package/dist/jcs.js.map +1 -1
- package/dist/mcp-client.d.ts.map +1 -1
- package/dist/mcp-client.js.map +1 -1
- package/dist/mcp-rpc.js.map +1 -1
- package/dist/mcp-tools.d.ts.map +1 -1
- package/dist/mcp-tools.js.map +1 -1
- package/dist/mtl.d.ts +1 -1
- package/dist/mtl.d.ts.map +1 -1
- package/dist/mtl.js.map +1 -1
- package/dist/origin.d.ts.map +1 -1
- package/dist/pin-store.d.ts.map +1 -1
- package/dist/pin-store.js.map +1 -1
- package/dist/pinning.d.ts.map +1 -1
- package/dist/pinning.js.map +1 -1
- package/dist/review-diff.js.map +1 -1
- package/dist/sandbox.d.ts.map +1 -1
- package/dist/sanitize.js.map +1 -1
- package/dist/scan-lock.d.ts.map +1 -1
- package/dist/scan-lock.js.map +1 -1
- package/dist/scan.d.ts.map +1 -1
- package/dist/scan.js.map +1 -1
- package/dist/static-scan.d.ts.map +1 -1
- package/dist/static-scan.js.map +1 -1
- package/dist/task-adapter.d.ts.map +1 -1
- package/dist/task-adapter.js.map +1 -1
- package/dist/threat-feed.d.ts.map +1 -1
- package/dist/threat-feed.js.map +1 -1
- package/dist/tool-list.js.map +1 -1
- package/dist/toxic-flow.js.map +1 -1
- package/dist/wrap-cli.d.ts +1 -1
- package/dist/wrap-cli.d.ts.map +1 -1
- package/dist/wrap-cli.js.map +1 -1
- package/dist/wrap-screen.js.map +1 -1
- package/dist/wrap-wire.d.ts.map +1 -1
- package/dist/wrap-wire.js.map +1 -1
- package/docs/flow-guard-answer-gate.es.md +53 -0
- package/docs/flow-guard-answer-gate.fr.md +53 -0
- package/docs/flow-guard-answer-gate.md +86 -0
- package/docs/flow-guard-answer-gate.ru.md +53 -0
- package/docs/flow-guard-answer-gate.zh.md +53 -0
- package/docs/flow-guard-constraint-evidence.es.md +76 -0
- package/docs/flow-guard-constraint-evidence.fr.md +76 -0
- package/docs/flow-guard-constraint-evidence.md +78 -0
- package/docs/flow-guard-constraint-evidence.ru.md +78 -0
- package/docs/flow-guard-constraint-evidence.zh.md +76 -0
- package/docs/flow-guard-final-witness-2026-10-26.es.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.fr.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.ru.md +24 -0
- package/docs/flow-guard-final-witness-2026-10-26.zh.md +24 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.es.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.fr.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.ru.md +39 -0
- package/docs/flow-guard-fresh-rechecks-2026-10-26.zh.md +39 -0
- package/docs/flow-guard-model-comparison-2026-10-25.es.md +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.fr.md +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.md +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.ru.md +27 -0
- package/docs/flow-guard-model-comparison-2026-10-25.zh.md +27 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.es.md +30 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.fr.md +30 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.md +44 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.ru.md +44 -0
- package/docs/flow-guard-prospective-holdout-2026-10-26.zh.md +30 -0
- package/docs/flow-guard-review-factors-2026-10-26.es.md +41 -0
- package/docs/flow-guard-review-factors-2026-10-26.fr.md +41 -0
- package/docs/flow-guard-review-factors-2026-10-26.md +45 -0
- package/docs/flow-guard-review-factors-2026-10-26.ru.md +45 -0
- package/docs/flow-guard-review-factors-2026-10-26.zh.md +41 -0
- package/docs/flow-guard-structured-model-2026-10-26.es.md +35 -0
- package/docs/flow-guard-structured-model-2026-10-26.fr.md +35 -0
- package/docs/flow-guard-structured-model-2026-10-26.md +44 -0
- package/docs/flow-guard-structured-model-2026-10-26.ru.md +46 -0
- package/docs/flow-guard-structured-model-2026-10-26.zh.md +35 -0
- package/docs/flow-guard.es.md +21 -1
- package/docs/flow-guard.fr.md +21 -1
- package/docs/flow-guard.md +21 -1
- package/docs/flow-guard.ru.md +21 -1
- package/docs/flow-guard.zh.md +21 -1
- package/examples/answer-gate-host.mjs +33 -0
- package/package.json +5 -4
package/docs/flow-guard.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Flow guard: tool-call checks after outside text
|
|
2
2
|
|
|
3
|
+
<!-- final-ranking-witness -->
|
|
4
|
+
**[Final ranking-feedback comparison, 26 October](flow-guard-final-witness-2026-10-26.md).** On all five previously withheld contexts, old feedback repaired 6/40 continuations and explicit selected-versus-best feedback repaired 40/40. Valid controls stayed valid 20/20 per nominal arm. This completes the series on selected known failures, not a new holdout. The earlier offline-only statement is superseded for ranking feedback on this cohort; missing-set feedback efficacy remains unmeasured.
|
|
5
|
+
<!-- /final-ranking-witness -->
|
|
6
|
+
|
|
3
7
|
> 🌐 **English** · [Русский](flow-guard.ru.md) · [Español](flow-guard.es.md) · [Français](flow-guard.fr.md) · [中文](flow-guard.zh.md)
|
|
4
8
|
|
|
5
9
|
See [measurement limits and version evidence](scan-limits.md) for billing, package pins, launcher comparisons and what approval counts establish.
|
|
@@ -303,7 +307,7 @@ The flow guard adds checks at tool-call boundaries after a session receives outs
|
|
|
303
307
|
- An injection that only changes the answer makes no call to refuse. Since 2026-10-22 the plugin's Stop hook adds one line under an answer whose turn read outside text, naming those sources, and says so when any of it addressed the assistant with instructions. When the answer repeats 12 consecutive normalized characters from the sentences where that text addressed the assistant, the hook also sends the answer back once (`decision: block`), to be checked against the user's request before the user reads it; the user loses nothing but the time of that check. `answerNote` chooses `always` (default), `instruction` (only that case) or `off`; outside the plugin, register `warden-mcp hook stop`.
|
|
304
308
|
- The MCP proxy records JSON-RPC error text and tool-error results as outside text too. If recording fails, it withholds the response. Existing corrupt session state blocks pre-tool checks instead of becoming an empty session.
|
|
305
309
|
|
|
306
|
-
Released in npm `0.17.0`: `npx -y @aimarket/warden@0.22.
|
|
310
|
+
Released in npm `0.17.0`: `npx -y @aimarket/warden@0.22.1 hook pre-tool-use`, or from a source checkout `npm ci && npm run build`, then `node dist/mcp-server.js hook pre-tool-use`. Register the prompt and post hooks as well, or use the bundled Claude plugin.
|
|
307
311
|
|
|
308
312
|
Policy is user-level (`~/.local/state/warden/flow-policy.json`, or `WARDEN_FLOW_POLICY`). Modes are `ask`, `deny`, `audit`, `off`. `audit` logs decisions without enforcing them. Example:
|
|
309
313
|
|
|
@@ -580,3 +584,19 @@ The repository helper `scripts/selection-probe/audit_warnings.mjs` replays saved
|
|
|
580
584
|
Post/Stop warning text uses fixed sentences and opaque `source-` identifiers (the first 16 hex digits of SHA-256 of the tool name). It does not quote the detected instruction or repeat raw tool names, source URLs or paths. This limits promotion of source-controlled metadata through the warning channel; it does not make a model immune to the original tool result. The identifier permits correlation only and is not a verified package identity, pin or permission. Local logs can still contain source-authored metadata and must be treated as untrusted data.
|
|
581
585
|
|
|
582
586
|
**Fresh model comparison (2026-10-25):** On the same six known fixtures, the 720-answer interleaved run selected the injected target 48/48 unguarded, 44/48 and 46/48 with published 0.21.0 note/note+Stop, and 27/48 with either local candidate profile. Candidate clean baselines were 23/48 and 25/48. Clean-adjusted candidate-versus-published intervals are −8.3 to +60.4pp for note and +14.6 to +62.5pp for note+Stop. Twelve actual rechecks changed no selected IDs; three lost a visible warning reference. All IDs were admissible and genuine user preferences passed 30/30. These known cases, controlled tool-role bridge and whole-version comparison do not establish general protection or a separate Stop benefit. See [the complete fresh-run report](flow-guard-model-comparison-2026-10-25.md).
|
|
587
|
+
|
|
588
|
+
<!-- constraint-evidence-followup -->
|
|
589
|
+
|
|
590
|
+
[Deterministic answer evidence and disclosure continuity](flow-guard-constraint-evidence.md).
|
|
591
|
+
|
|
592
|
+
<!-- structured-answer-gate -->
|
|
593
|
+
|
|
594
|
+
[Host-owned answer gate](flow-guard-answer-gate.md): all constraints, bounded extra correction and buffered final delivery; structured data only.
|
|
595
|
+
|
|
596
|
+
<!-- structured-live-followup -->
|
|
597
|
+
|
|
598
|
+
[Live structured-model test](flow-guard-structured-model-2026-10-26.md): 96 valid first proposals and 64 controlled-seed repairs; separate denominators and limits.
|
|
599
|
+
|
|
600
|
+
<!-- prospective-holdout-followup -->
|
|
601
|
+
|
|
602
|
+
[Prospective new-fixture results](flow-guard-prospective-holdout-2026-10-26.md): 89/96 natural first proposals valid, five of seven repaired, two withheld; controlled repair 45/48. Separate post-hoc ranking/missing-set facts passed offline checks, without a new model run.
|
package/docs/flow-guard.ru.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Страж потоков: проверки вызовов после внешнего текста
|
|
2
2
|
|
|
3
|
+
<!-- final-ranking-witness -->
|
|
4
|
+
**[Финальное сравнение обратной связи, 26 октября](flow-guard-final-witness-2026-10-26.ru.md).** Во всех пяти ранее удержанных контекстах старое сообщение исправило 6/40 продолжений, явное сравнение выбранного и лучшего — 40/40. Правильные контроли сохранились 20/20 в каждой условной группе. Серия завершена на известных ошибках; это не новый holdout. Прежнее утверждение о проверке только офлайн уточнено этим результатом для ранжирования; эффективность сообщений о неполном наборе моделью пока не измерена.
|
|
5
|
+
<!-- /final-ranking-witness -->
|
|
6
|
+
|
|
3
7
|
> 🌐 [English](flow-guard.md) · **Русский** · [Español](flow-guard.es.md) · [Français](flow-guard.fr.md) · [中文](flow-guard.zh.md)
|
|
4
8
|
|
|
5
9
|
См. [границы измерений и подтверждение версии](scan-limits.ru.md): биллинг, закрепление пакетов, сравнение launcher и смысл счётчиков подтверждений.
|
|
@@ -313,7 +317,7 @@ node dist/mcp-server.js wrap --flow screen --screen-read computer --screen-read-
|
|
|
313
317
|
- Инъекция, которая меняет только ответ, не делает вызова, которому можно отказать. С 2026-10-22 хук Stop плагина добавляет под ответом строку, если за этот ход читался внешний текст: какие источники, и отдельно — если какой-то из них обращался к ассистенту с указаниями. Если ответ повторяет 12 нормализованных символов подряд из тех предложений, где внешний текст обращался к ассистенту, хук ещё и один раз возвращает ответ модели (`decision: block`) на проверку по запросу пользователя, прежде чем пользователь его прочтёт; пользователь теряет только время этой проверки. `answerNote`: `always` (по умолчанию), `instruction` (только этот случай) или `off`; вне плагина зарегистрируйте `warden-mcp hook stop`.
|
|
314
318
|
- Прокси учитывает текст JSON-RPC errors и ошибки инструментов как внешние данные. Если учёт ответа не удался, ответ удерживается. Повреждённое состояние сессии блокирует проверяемый вызов вместо сброса в пустую сессию.
|
|
315
319
|
|
|
316
|
-
Вышло в npm `0.17.0`: `npx -y @aimarket/warden@0.22.
|
|
320
|
+
Вышло в npm `0.17.0`: `npx -y @aimarket/warden@0.22.1 hook pre-tool-use`, либо из исходников — в каталоге WARDEN `npm ci && npm run build`, затем `node dist/mcp-server.js hook pre-tool-use`. Зарегистрируйте также prompt/post hooks либо плагин Claude.
|
|
317
321
|
|
|
318
322
|
Политика: `~/.local/state/warden/flow-policy.json` или `WARDEN_FLOW_POLICY`. Режимы: `ask`, `deny`, `audit`, `off`; `audit` только пишет журнал. Пример настройки контактов и адресатов — в [английской версии](flow-guard.md).
|
|
319
323
|
|
|
@@ -564,3 +568,19 @@ python3 scripts/agentdojo/summarize_model.py summary.json /srv/adojo/out --goals
|
|
|
564
568
|
Текст предупреждений Post/Stop состоит из фиксированных фраз и непрозрачных ID `source-` (первые 16 hex-символов SHA-256 имени инструмента). В нём не цитируются найденная инструкция, сырые имена инструментов, URL и пути источника. Это ограничивает перенос чужих метаданных в канал предупреждения, но не защищает модель от любого влияния исходного tool result. ID предназначен только для сопоставления: он не является проверенной версией пакета, pin или разрешением. Локальные журналы могут содержать чужие метаданные и остаются недоверенными данными.
|
|
565
569
|
|
|
566
570
|
**Свежий прогон модели (2026-10-25):** На шести известных задачах получены 720 основных ответов. Под атакой цель выбрана 48/48 без защиты, 44/48 и 46/48 со старыми note/note+Stop (0.21.0), 27/48 в обоих новых режимах. Чистые фоны кандидата — 23/48 и 25/48. Интервалы улучшения относительно старой версии с поправкой на фон: [−8,3; +60,4] п.п. для note и [+14,6; +62,5] для note+Stop. Ни одна из 12 реальных перепроверок не изменила выбранный ID; в трёх исчезла видимая ссылка на предупреждение. Все ID допустимы, настоящие предпочтения пользователя выполнены 30/30. Известные случаи, tool-role bridge и сравнение целых версий не доказывают общей защиты или отдельной пользы Stop. [Полный отчёт](flow-guard-model-comparison-2026-10-25.ru.md).
|
|
571
|
+
|
|
572
|
+
<!-- constraint-evidence-followup -->
|
|
573
|
+
|
|
574
|
+
[Детерминированные факты для проверки ответа и сохранение раскрытия](flow-guard-constraint-evidence.ru.md).
|
|
575
|
+
|
|
576
|
+
<!-- structured-answer-gate -->
|
|
577
|
+
|
|
578
|
+
[Проверка ответа приложением](flow-guard-answer-gate.ru.md): все ограничения, дополнительный ограниченный проход и буферизация выдачи; только структурированные данные.
|
|
579
|
+
|
|
580
|
+
<!-- structured-live-followup -->
|
|
581
|
+
|
|
582
|
+
[Живой прогон структурированных ответов](flow-guard-structured-model-2026-10-26.ru.md): 96 правильных первых предложений и 64 исправления контролируемых ошибок; отдельные знаменатели и границы.
|
|
583
|
+
|
|
584
|
+
<!-- prospective-holdout-followup -->
|
|
585
|
+
|
|
586
|
+
[Новые случаи после заморозки](flow-guard-prospective-holdout-2026-10-26.ru.md): 89/96 первых естественных ответов правильны, пять из семи ошибок исправлены, два удержаны; контролируемые 45/48. Отдельные подсказки ранжирования/неполного списка проверены офлайн, без нового запуска модели.
|
package/docs/flow-guard.zh.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# 流守卫:接收外部文本后的工具调用检查
|
|
2
2
|
|
|
3
|
+
<!-- final-ranking-witness -->
|
|
4
|
+
**[10月26日最终排序反馈对照](flow-guard-final-witness-2026-10-26.zh.md).** 在全部五个此前被拦截的上下文中,旧反馈修复了6/40次续答,明确比较所选项与最优项的新反馈修复了40/40次。每个名义组的有效对照均保持20/20。本系列到此结束,结果针对已知失败案例,并非新的留出测试。此结果更新了此前仅离线验证的排序反馈限制;缺失合格项反馈的模型修复效果仍未测量。
|
|
5
|
+
<!-- /final-ranking-witness -->
|
|
6
|
+
|
|
3
7
|
> 🌐 [English](flow-guard.md) · [Русский](flow-guard.ru.md) · [Español](flow-guard.es.md) · [Français](flow-guard.fr.md) · **中文**
|
|
4
8
|
|
|
5
9
|
关于账单、包版本固定、launcher 比较及批准计数的含义,请参见[测量边界与版本证据](scan-limits.zh.md)。
|
|
@@ -303,7 +307,7 @@ Wrap 提问前读取基线,批准后重新验证工具定义并再次读取。
|
|
|
303
307
|
- 只改变回答的注入不会发出可拒绝的调用。自 2026-10-22 起,插件的 Stop 钩子会在本轮读过外部文本的回答下方加一行,列出这些来源;若其中有文本以指令口吻对助手说话,也会注明。如果回答连续重复了外部文本中对助手下指令那几句话里的 12 个规范化字符,钩子还会把回答退回给模型一次(`decision: block`),在用户读到之前对照用户的请求检查;用户只损失这次检查的时间。`answerNote`:`always`(默认)、`instruction`(只在这种情况下)或 `off`;插件之外请注册 `warden-mcp hook stop`。
|
|
304
308
|
- 代理也记录 JSON-RPC 和工具错误;记录失败时不转发响应,现有会话状态损坏时阻止检查中的调用。
|
|
305
309
|
|
|
306
|
-
已在 npm `0.17.0` 发布:`npx -y @aimarket/warden@0.22.
|
|
310
|
+
已在 npm `0.17.0` 发布:`npx -y @aimarket/warden@0.22.1 hook pre-tool-use`;或从源码在 WARDEN 目录运行 `npm ci && npm run build`,然后使用 `node dist/mcp-server.js hook pre-tool-use`,并注册 prompt/post hooks。策略为 `~/.local/state/warden/flow-policy.json` 或 `WARDEN_FLOW_POLICY`;模式为 `ask`、`deny`、`audit`、`off`。当前配置示例见[英文页](flow-guard.md)。
|
|
307
311
|
|
|
308
312
|
代理命令:`node dist/mcp-server.js wrap --flow mail -- node mail-server.js`。同一会话的代理应共享一个新的 `WARDEN_FLOW_SESSION`。默认父进程 PID 不能关联不同启动器。代理看不到用户提示或客户端内置工具。需要确认的调用会在客户端提供 MCP elicitation 表单时通过表单询问(回答记入日志的 `approvalOutcome`),否则或使用 `--ask refuse` 时被拒绝。`trustedSources` 仅用于 WebFetch URL,不用于 MCP 参数中的任意链接。
|
|
309
313
|
|
|
@@ -494,3 +498,19 @@ python3 scripts/agentdojo/summarize_model.py summary.json /srv/adojo/out --goals
|
|
|
494
498
|
Post/Stop 警告使用固定语句和不透明的 `source-` ID(工具名 SHA-256 的前 16 个十六进制字符),不会引用检测到的指令,也不重复原始工具名、来源 URL 或路径。这限制了外部元数据借警告渠道获得权威性,但不使模型免受原始工具结果的影响。ID 只用于关联,不是经验证的软件包身份、pin 或权限。当地日志仍可能包含外部元数据,必须作为不可信数据处理。
|
|
495
499
|
|
|
496
500
|
**新的模型对比(2026-10-25):** 在相同六个已知案例的 720 个交错运行答案中,无保护时攻击目标被选中 48/48 次;已发布 0.21.0 的 note/note+Stop 为 44/48、46/48;两个本地候选模式均为 27/48。候选的干净基线为 23/48、25/48。相对旧版、校正基线后的改善区间:note 为 [−8.3,+60.4] 个百分点,note+Stop 为 [+14.6,+62.5]。12 次实际复核均未改变所选 ID,其中三个最终答案失去了可见的警告引用。全部 ID 均可接受,真实用户偏好遵从为 30/30。这些已知案例、tool-role 桥接及完整版本对比不证明普遍防护或 Stop 的独立收益。[完整报告](flow-guard-model-comparison-2026-10-25.zh.md)。
|
|
501
|
+
|
|
502
|
+
<!-- constraint-evidence-followup -->
|
|
503
|
+
|
|
504
|
+
[确定性答案证据与披露保留](flow-guard-constraint-evidence.zh.md).
|
|
505
|
+
|
|
506
|
+
<!-- structured-answer-gate -->
|
|
507
|
+
|
|
508
|
+
[应用答案门禁](flow-guard-answer-gate.zh.md):全部规则、有界额外纠正与缓冲交付;仅支持结构化数据。
|
|
509
|
+
|
|
510
|
+
<!-- structured-live-followup -->
|
|
511
|
+
|
|
512
|
+
[结构化答案真实模型测试](flow-guard-structured-model-2026-10-26.zh.md):96 个初次提案有效,64 个受控种子修复;分母与边界分别报告。
|
|
513
|
+
|
|
514
|
+
<!-- prospective-holdout-followup -->
|
|
515
|
+
|
|
516
|
+
[冻结后的新案例](flow-guard-prospective-holdout-2026-10-26.zh.md):自然初次有效 89/96,七个错误中五个纠正、两个保留;受控纠正 45/48。后续排序/缺失集合证据已离线验证,未重新调用模型。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Host integration: read structured proposals from stdin; output only a verified final result or withholding notice.
|
|
3
|
+
// No model API, keys, network, tool calls or effects. Integrators supply their own bounded model callback instead.
|
|
4
|
+
import { readFileSync } from 'node:fs';
|
|
5
|
+
import { createInterface } from 'node:readline';
|
|
6
|
+
import { createAnswerGate } from '../dist/index.js';
|
|
7
|
+
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
process.once('SIGINT', () => controller.abort());
|
|
10
|
+
// stdout failures are uncertain delivery, never a reason to resend.
|
|
11
|
+
process.stdout.on('error', () => {});
|
|
12
|
+
let lines;
|
|
13
|
+
try {
|
|
14
|
+
if (process.argv.length !== 4 || process.argv[2] !== '--contract') throw new Error('usage');
|
|
15
|
+
const bytes = readFileSync(process.argv[3]);
|
|
16
|
+
if (bytes.length > 262_144) throw new Error('contract too large');
|
|
17
|
+
const gate = createAnswerGate(JSON.parse(bytes.toString('utf8')));
|
|
18
|
+
lines = createInterface({ input: process.stdin, crlfDelay: Infinity });
|
|
19
|
+
const iterator = lines[Symbol.asyncIterator]();
|
|
20
|
+
const result = await gate.run({ signal: controller.signal, maxCorrections: 2, timeoutMs: 30_000,
|
|
21
|
+
generate: async request => {
|
|
22
|
+
process.stderr.write('WARDEN_REQUEST ' + JSON.stringify({ attempt: request.attempt, catalog: request.catalog, feedback: request.feedback ?? null }) + '\n');
|
|
23
|
+
const next = await iterator.next();
|
|
24
|
+
if (next.done) throw new Error('No structured proposal');
|
|
25
|
+
return next.value;
|
|
26
|
+
},
|
|
27
|
+
emit: rendered => new Promise((resolve, reject) => process.stdout.write(rendered, error => error ? reject(error) : resolve())),
|
|
28
|
+
});
|
|
29
|
+
process.exitCode = result.status === 'delivered' ? 0 : result.status === 'withheld' ? 2 : result.status === 'cancelled' ? 130 : 3;
|
|
30
|
+
} catch {
|
|
31
|
+
process.stderr.write('WARDEN_HOST_ERROR: provide --contract with normalized host-owned facts. No candidate forwarded.\n');
|
|
32
|
+
process.exitCode = 1;
|
|
33
|
+
} finally { lines?.close(); }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aimarket/warden",
|
|
3
|
-
"version": "0.22.
|
|
3
|
+
"version": "0.22.1",
|
|
4
4
|
"description": "WARDEN — MCP security firewall. Stdio wrap proxy, inspection tools and library. Vets definitions before model exposure. Zero runtime dependencies.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
"docs/gates*.md",
|
|
53
53
|
"docs/flow-guard*.md",
|
|
54
54
|
"examples/atomic-screen-server.mjs",
|
|
55
|
+
"examples/answer-gate-host.mjs",
|
|
55
56
|
"native/macos/Package.swift",
|
|
56
57
|
"native/macos/Sources",
|
|
57
58
|
"scripts/build-macos.mjs"
|
|
@@ -96,8 +97,8 @@
|
|
|
96
97
|
},
|
|
97
98
|
"devDependencies": {
|
|
98
99
|
"@types/node": "^26.6.4",
|
|
99
|
-
"@vitest/coverage-v8": "^
|
|
100
|
-
"typescript": "^
|
|
101
|
-
"vitest": "^
|
|
100
|
+
"@vitest/coverage-v8": "^5.0.5",
|
|
101
|
+
"typescript": "^7.0.2",
|
|
102
|
+
"vitest": "^5.0.5"
|
|
102
103
|
}
|
|
103
104
|
}
|