@miller-tech/uap 1.145.0 → 1.146.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/.tsbuildinfo +1 -1
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +189 -0
- package/dist/dashboard/server.js.map +1 -1
- package/dist/memory/embeddings.d.ts.map +1 -1
- package/dist/memory/embeddings.js +4 -2
- package/dist/memory/embeddings.js.map +1 -1
- package/dist/policies/policy-memory.d.ts +29 -0
- package/dist/policies/policy-memory.d.ts.map +1 -1
- package/dist/policies/policy-memory.js +81 -0
- package/dist/policies/policy-memory.js.map +1 -1
- package/dist/policies/policy-order.d.ts +51 -0
- package/dist/policies/policy-order.d.ts.map +1 -0
- package/dist/policies/policy-order.js +124 -0
- package/dist/policies/policy-order.js.map +1 -0
- package/package.json +1 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/tools/agents/scripts/anthropic_proxy.py +127 -2
- package/tools/agents/tests/test_vision_passthrough.py +126 -0
- package/web/dash/styles.css +31 -0
- package/web/dash/tab-policies.js +229 -8
- package/web/dashboard.html +3 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-memory.js","sourceRoot":"","sources":["../../src/policies/policy-memory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"policy-memory.js","sourceRoot":"","sources":["../../src/policies/policy-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AASxD;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CACvB,QAAoG;IAEpG,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;gBAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;gBAAE,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;YAC1D,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;gBAAE,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,mBAAmB;IAKD;IAJrB,GAAG,GAA2B,IAAI,CAAC;IAE3C;kFAC8E;IAC9E,YAA6B,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IAEhD,IAAY,EAAE;QACZ,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,WAA4B,EAAE;QACtE,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAElE,wEAAwE;QACxE,0EAA0E;QAC1E,6EAA6E;QAC7E,oEAAoE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAqF,CAAC;QACrI,MAAM,QAAQ,GAAG,QAAQ,EAAE,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,MAAM,GAAW;YACrB,EAAE,EAAE,QAAQ;YACZ,IAAI;YACJ,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,IAAI,iBAAiB,CAAC,QAAQ,IAAI,QAAQ,CAAuB;YAC7F,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,IAAI,aAAa,CAAoB;YACtF,gBAAgB,EACd,QAAQ,CAAC,gBAAgB,IAAI,iBAAiB,CAAC,gBAAgB,IAAI,UAAU;YAC/E,WAAW;YACX,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,iBAAiB,CAAC,IAAI,IAAI,EAAE;YACnD,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,GAAG;YACrC,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,8EAA8E;YAC9E,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;YACjF,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;SAClC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAA4C,CAAC,CAAC;QACnE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAkG,CAAC;QACxI,MAAM,MAAM,GAAG,SAAS,CACtB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACf,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;YACjD,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,EAAE;SAC7B,CAAC,CAAC,CACJ,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7B,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,eAAe,CAAC,EAAU;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAE,CAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvG,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,IAAI,GAAG,GAAG,QAAQ,SAAS,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,GAAG,QAAQ,UAAU,CAAC,EAAE,GAAG,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,gFAAgF;QAChF,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;YACnB,GAAI,GAA0C;YAC9C,EAAE,EAAE,KAAK;YACT,IAAI;YACJ,WAAW;YACX,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,iBAAiB,CAAC,EAAU,EAAE,QAAgB;QAClD,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,eAAe,CAAC,UAAoB,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;YAC3B,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qFAAqF;IACrF,cAAc;QAIZ,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAA+C,CAAC;QACrF,OAAO;YACL,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;gBACpB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC;gBACxC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC;gBACpC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,IAAI,UAAU,CAAC;gBAC1D,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAClC,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC;gBACjD,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;aACzC,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED;oFACgF;IAChF,KAAK,CAAC,cAAc,CAAC,MAAqD;QACxE,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE;gBACxC,QAAQ,EAAE,CAAC,CAAC,QAAiB;gBAC7B,KAAK,EAAE,CAAC,CAAC,KAAc;gBACvB,gBAAgB,EAAE,CAAC,CAAC,gBAAyB;gBAC7C,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YACH,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;gBAAE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC3F,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK;gBAAE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IAEO,qBAAqB,CAAC,QAAgB;QAM5C,MAAM,QAAQ,GAKV,EAAE,CAAC;QAEP,wDAAwD;QACxD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAClE,IAAI,aAAa,EAAE,CAAC;YAClB,QAAQ,CAAC,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvF,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAA6C,CAAC;QAC1F,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAmD,CAAC;YAC9E,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClE,QAAQ,CAAC,gBAAgB,GAAG,KAAK,CAAC;YACpC,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;iBACzB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,QAAgB,EAChB,UAAkB,EAClB,QAAgB;QAEhB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,YAAY,CAAC,CAAC;QAE7D,kDAAkD;QAClD,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC;YAC3B,EAAE,EAAE,GAAG,QAAQ,IAAI,QAAQ,EAAE;YAC7B,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,QAAQ;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,4BAA4B;QAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,YAAY,CAClB,EAAE,EAAE,EAAE,QAAQ,EAAE,EAChB;YACE,eAAe,EAAE,KAAK;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC;SAC5B,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,kFAAkF;IAClF,KAAK,CAAC,wBAAwB;QAC5B,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,QAAgB;QAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,MAAe;QAC5C,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,EAAU,EACV,KAAqD;QAErD,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,KAA8C;QACvE,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,KAAqD;QAErD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAc;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC;QAC/C,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,MAAM,UAAU,GAAG,CAAC,CAAC,IAAgB,CAAC;YACtC,OAAO,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,OAAe,EAAE,OAAe,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3C,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACxC,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,wCAAwC;YACxC,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU;gBAAE,KAAK,IAAI,EAAE,CAAC;YAC7C,cAAc;YACd,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACtF,aAAa;YACb,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YACjE,iBAAiB;YACjB,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;YACvD,iBAAiB;YACjB,KAAK,IAAI,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC;YAC/B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM;aACV,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;aACjC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,QAAgB,EAAE,QAAgB;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,IAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAEO,iBAAiB,CAAC,QAAgB;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACrD,CAAC;CACF;AAED,2DAA2D;AAC3D,IAAI,SAAS,GAA+B,IAAI,CAAC;AACjD,MAAM,UAAU,sBAAsB;IACpC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,mBAAmB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy ordering — decide the FIRING ORDER of policies to minimize wasted agent
|
|
3
|
+
* turns and maximize compliance.
|
|
4
|
+
*
|
|
5
|
+
* Principle: a policy that will STOP or redirect an agent should fire as early
|
|
6
|
+
* and as cheaply as possible, so the agent is corrected before it burns turns on
|
|
7
|
+
* work the gate would reject anyway. Concretely we rank by, in order:
|
|
8
|
+
* 1. enforcement stage — pre-exec (gate BEFORE the action) before post-exec/review,
|
|
9
|
+
* 2. level — REQUIRED (hard blocks) before RECOMMENDED before OPTIONAL,
|
|
10
|
+
* 3. category "early-exit weight" — cheap fail-fast gates (safety/worktree/task)
|
|
11
|
+
* before expensive semantic ones (docs/quality),
|
|
12
|
+
* 4. name, for stable output.
|
|
13
|
+
*
|
|
14
|
+
* `heuristicOrder` is deterministic and always available. `buildOrderPrompt` /
|
|
15
|
+
* `parseOrderResponse` power the optional AI refinement, where a model re-ranks
|
|
16
|
+
* the same list with a written rationale (see aiRefineOrder in the dashboard).
|
|
17
|
+
*
|
|
18
|
+
* Priority is the stored sort key (higher = fires earlier); assignPriorities maps
|
|
19
|
+
* an ordered list to a descending priority ladder.
|
|
20
|
+
*/
|
|
21
|
+
export interface OrderablePolicy {
|
|
22
|
+
id?: string;
|
|
23
|
+
name: string;
|
|
24
|
+
category: string;
|
|
25
|
+
/** REQUIRED | RECOMMENDED | OPTIONAL */
|
|
26
|
+
level: string;
|
|
27
|
+
/** pre-exec | always | post-exec | review */
|
|
28
|
+
stage: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Deterministic best-first ordering (see module doc for the ranking). */
|
|
32
|
+
export declare function heuristicOrder<T extends OrderablePolicy>(policies: T[]): T[];
|
|
33
|
+
/**
|
|
34
|
+
* Map an ordered list of names to descending priorities (first = highest). The
|
|
35
|
+
* ladder leaves gaps so a single policy can be nudged between two others without
|
|
36
|
+
* renumbering everything.
|
|
37
|
+
*/
|
|
38
|
+
export declare function assignPriorities(orderedNames: string[], base?: number, step?: number): Map<string, number>;
|
|
39
|
+
/** Prompt a model to re-rank policies for the wasted-turns / compliance objective. */
|
|
40
|
+
export declare function buildOrderPrompt(policies: OrderablePolicy[]): string;
|
|
41
|
+
export interface OrderSuggestion {
|
|
42
|
+
order: string[];
|
|
43
|
+
rationale: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Parse a model ordering response. Keeps only known names, de-dupes, and appends
|
|
47
|
+
* any names the model omitted (in heuristic order) so the result is always a
|
|
48
|
+
* complete permutation. Returns null when no usable order is found.
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseOrderResponse(text: string, validNames: string[]): OrderSuggestion | null;
|
|
51
|
+
//# sourceMappingURL=policy-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-order.d.ts","sourceRoot":"","sources":["../../src/policies/policy-order.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA0BD,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,CAAC,SAAS,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAU5E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,IAAI,SAAO,EAAE,IAAI,SAAK,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAIpG;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,MAAM,CAiBpE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,eAAe,GAAG,IAAI,CA0B7F"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy ordering — decide the FIRING ORDER of policies to minimize wasted agent
|
|
3
|
+
* turns and maximize compliance.
|
|
4
|
+
*
|
|
5
|
+
* Principle: a policy that will STOP or redirect an agent should fire as early
|
|
6
|
+
* and as cheaply as possible, so the agent is corrected before it burns turns on
|
|
7
|
+
* work the gate would reject anyway. Concretely we rank by, in order:
|
|
8
|
+
* 1. enforcement stage — pre-exec (gate BEFORE the action) before post-exec/review,
|
|
9
|
+
* 2. level — REQUIRED (hard blocks) before RECOMMENDED before OPTIONAL,
|
|
10
|
+
* 3. category "early-exit weight" — cheap fail-fast gates (safety/worktree/task)
|
|
11
|
+
* before expensive semantic ones (docs/quality),
|
|
12
|
+
* 4. name, for stable output.
|
|
13
|
+
*
|
|
14
|
+
* `heuristicOrder` is deterministic and always available. `buildOrderPrompt` /
|
|
15
|
+
* `parseOrderResponse` power the optional AI refinement, where a model re-ranks
|
|
16
|
+
* the same list with a written rationale (see aiRefineOrder in the dashboard).
|
|
17
|
+
*
|
|
18
|
+
* Priority is the stored sort key (higher = fires earlier); assignPriorities maps
|
|
19
|
+
* an ordered list to a descending priority ladder.
|
|
20
|
+
*/
|
|
21
|
+
const STAGE_RANK = { 'pre-exec': 0, always: 1, 'post-exec': 2, review: 3 };
|
|
22
|
+
const LEVEL_RANK = { REQUIRED: 0, RECOMMENDED: 1, OPTIONAL: 2 };
|
|
23
|
+
// Lower weight = fires earlier. Cheap, high-hit-rate, fail-fast gates first.
|
|
24
|
+
const CATEGORY_WEIGHT = {
|
|
25
|
+
safety: 0,
|
|
26
|
+
security: 0,
|
|
27
|
+
workflow: 1,
|
|
28
|
+
process: 1,
|
|
29
|
+
routing: 2,
|
|
30
|
+
quality: 3,
|
|
31
|
+
documentation: 4,
|
|
32
|
+
custom: 5,
|
|
33
|
+
};
|
|
34
|
+
function stageRank(s) {
|
|
35
|
+
return STAGE_RANK[s?.toLowerCase()] ?? 1;
|
|
36
|
+
}
|
|
37
|
+
function levelRank(l) {
|
|
38
|
+
return LEVEL_RANK[(l ?? '').toUpperCase()] ?? 2;
|
|
39
|
+
}
|
|
40
|
+
function categoryWeight(c) {
|
|
41
|
+
return CATEGORY_WEIGHT[(c ?? '').toLowerCase()] ?? 5;
|
|
42
|
+
}
|
|
43
|
+
/** Deterministic best-first ordering (see module doc for the ranking). */
|
|
44
|
+
export function heuristicOrder(policies) {
|
|
45
|
+
return [...policies].sort((a, b) => {
|
|
46
|
+
const s = stageRank(a.stage) - stageRank(b.stage);
|
|
47
|
+
if (s)
|
|
48
|
+
return s;
|
|
49
|
+
const l = levelRank(a.level) - levelRank(b.level);
|
|
50
|
+
if (l)
|
|
51
|
+
return l;
|
|
52
|
+
const c = categoryWeight(a.category) - categoryWeight(b.category);
|
|
53
|
+
if (c)
|
|
54
|
+
return c;
|
|
55
|
+
return a.name.localeCompare(b.name);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Map an ordered list of names to descending priorities (first = highest). The
|
|
60
|
+
* ladder leaves gaps so a single policy can be nudged between two others without
|
|
61
|
+
* renumbering everything.
|
|
62
|
+
*/
|
|
63
|
+
export function assignPriorities(orderedNames, base = 1000, step = 10) {
|
|
64
|
+
const out = new Map();
|
|
65
|
+
orderedNames.forEach((name, i) => out.set(name, Math.max(0, base - i * step)));
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
/** Prompt a model to re-rank policies for the wasted-turns / compliance objective. */
|
|
69
|
+
export function buildOrderPrompt(policies) {
|
|
70
|
+
const rows = policies
|
|
71
|
+
.map((p) => `- ${p.name} [level=${p.level}, stage=${p.stage}, category=${p.category}]${p.description ? `: ${p.description}` : ''}`)
|
|
72
|
+
.join('\n');
|
|
73
|
+
return [
|
|
74
|
+
'You are ordering the FIRING ORDER of a coding agent\'s policy gates.',
|
|
75
|
+
'Goal: minimize WASTED agent turns and maximize COMPLIANCE — a policy that will',
|
|
76
|
+
'stop or redirect the agent should fire as early and cheaply as possible, so the',
|
|
77
|
+
'agent is corrected before doing work the gate would reject. Prefer: pre-exec',
|
|
78
|
+
'gates before post-exec; hard/REQUIRED blocks before advisory; cheap fail-fast',
|
|
79
|
+
'checks (worktree, task, safety) before expensive semantic ones.',
|
|
80
|
+
'',
|
|
81
|
+
'Policies:',
|
|
82
|
+
rows,
|
|
83
|
+
'',
|
|
84
|
+
'Respond with ONLY JSON: {"order": ["<policy name>", ... every policy exactly once, best-first], "rationale": "<one or two sentences>"}',
|
|
85
|
+
].join('\n');
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse a model ordering response. Keeps only known names, de-dupes, and appends
|
|
89
|
+
* any names the model omitted (in heuristic order) so the result is always a
|
|
90
|
+
* complete permutation. Returns null when no usable order is found.
|
|
91
|
+
*/
|
|
92
|
+
export function parseOrderResponse(text, validNames) {
|
|
93
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
94
|
+
if (!match)
|
|
95
|
+
return null;
|
|
96
|
+
let parsed;
|
|
97
|
+
try {
|
|
98
|
+
parsed = JSON.parse(match[0]);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const valid = new Set(validNames);
|
|
104
|
+
const seen = new Set();
|
|
105
|
+
const order = [];
|
|
106
|
+
if (Array.isArray(parsed.order)) {
|
|
107
|
+
for (const n of parsed.order) {
|
|
108
|
+
const name = String(n);
|
|
109
|
+
if (valid.has(name) && !seen.has(name)) {
|
|
110
|
+
order.push(name);
|
|
111
|
+
seen.add(name);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (order.length === 0)
|
|
116
|
+
return null;
|
|
117
|
+
// Append any omitted policies so the order stays complete.
|
|
118
|
+
for (const n of validNames)
|
|
119
|
+
if (!seen.has(n))
|
|
120
|
+
order.push(n);
|
|
121
|
+
const rationale = typeof parsed.rationale === 'string' ? parsed.rationale.slice(0, 500) : '';
|
|
122
|
+
return { order, rationale };
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=policy-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-order.js","sourceRoot":"","sources":["../../src/policies/policy-order.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAaH,MAAM,UAAU,GAA2B,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACnG,MAAM,UAAU,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AACxF,6EAA6E;AAC7E,MAAM,eAAe,GAA2B;IAC9C,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AACD,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AACD,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAA4B,QAAa;IACrE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;QAChB,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,YAAsB,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,QAA2B;IAC1D,MAAM,IAAI,GAAG,QAAQ;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SAClI,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;QACL,sEAAsE;QACtE,gFAAgF;QAChF,iFAAiF;QACjF,8EAA8E;QAC9E,+EAA+E;QAC/E,iEAAiE;QACjE,EAAE;QACF,WAAW;QACX,IAAI;QACJ,EAAE;QACF,wIAAwI;KACzI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,UAAoB;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,MAAgD,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,2DAA2D;IAC3D,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC"}
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
@@ -1960,6 +1960,60 @@ last_session_id = ""
|
|
|
1960
1960
|
_last_ctx_recheck_ts: float = 0.0
|
|
1961
1961
|
_CTX_RECHECK_INTERVAL: float = 60.0 # Re-detect context window every 60s
|
|
1962
1962
|
|
|
1963
|
+
# ── Vision (multimodal) support ──────────────────────────────────────────────
|
|
1964
|
+
# The upstream llama-server advertises image support in /props
|
|
1965
|
+
# (modalities.vision: true when launched with --mmproj). When available, the
|
|
1966
|
+
# proxy passes Anthropic `image` content blocks through to the model as
|
|
1967
|
+
# OpenAI image_url data-URI parts, so coding agents can visually check their
|
|
1968
|
+
# outputs (screenshots, rendered pages). PROXY_VISION=auto probes and
|
|
1969
|
+
# self-configures per upstream; on/off force it.
|
|
1970
|
+
PROXY_VISION = os.environ.get("PROXY_VISION", "auto").strip().lower()
|
|
1971
|
+
# Rough per-image token cost for context accounting (Qwen-VL-class encoders
|
|
1972
|
+
# land in the hundreds-to-~1k range per image at typical screenshot sizes).
|
|
1973
|
+
PROXY_IMAGE_TOKEN_ESTIMATE = int(os.environ.get("PROXY_IMAGE_TOKEN_ESTIMATE", "800"))
|
|
1974
|
+
upstream_vision: bool = False
|
|
1975
|
+
_last_vision_recheck_ts: float = 0.0
|
|
1976
|
+
_VISION_RECHECK_INTERVAL: float = 60.0
|
|
1977
|
+
|
|
1978
|
+
|
|
1979
|
+
def vision_enabled() -> bool:
|
|
1980
|
+
if PROXY_VISION == "on":
|
|
1981
|
+
return True
|
|
1982
|
+
if PROXY_VISION == "off":
|
|
1983
|
+
return False
|
|
1984
|
+
return upstream_vision
|
|
1985
|
+
|
|
1986
|
+
|
|
1987
|
+
async def _maybe_recheck_vision() -> None:
|
|
1988
|
+
"""Periodically re-probe upstream /props for vision support (auto mode).
|
|
1989
|
+
|
|
1990
|
+
Handles server restarts that add/remove --mmproj mid-session. Non-blocking:
|
|
1991
|
+
skips inside the check interval; failures keep the last known value.
|
|
1992
|
+
"""
|
|
1993
|
+
global upstream_vision, _last_vision_recheck_ts
|
|
1994
|
+
if PROXY_VISION != "auto":
|
|
1995
|
+
return
|
|
1996
|
+
now = time.time()
|
|
1997
|
+
if now - _last_vision_recheck_ts < _VISION_RECHECK_INTERVAL:
|
|
1998
|
+
return
|
|
1999
|
+
_last_vision_recheck_ts = now
|
|
2000
|
+
if http_client is None:
|
|
2001
|
+
return
|
|
2002
|
+
try:
|
|
2003
|
+
props_url = LLAMA_CPP_BASE.replace("/v1", "/props")
|
|
2004
|
+
resp = await http_client.get(props_url, timeout=2.0)
|
|
2005
|
+
if resp.status_code == 200:
|
|
2006
|
+
modalities = (resp.json() or {}).get("modalities") or {}
|
|
2007
|
+
detected = bool(modalities.get("vision"))
|
|
2008
|
+
if detected != upstream_vision:
|
|
2009
|
+
logger.warning(
|
|
2010
|
+
"VISION: upstream modalities.vision=%s — image passthrough %s",
|
|
2011
|
+
detected, "ENABLED" if detected else "DISABLED",
|
|
2012
|
+
)
|
|
2013
|
+
upstream_vision = detected
|
|
2014
|
+
except Exception:
|
|
2015
|
+
pass # Non-critical; retry next interval
|
|
2016
|
+
|
|
1963
2017
|
|
|
1964
2018
|
def _cleanup_stale_monitors(now_ts: float) -> None:
|
|
1965
2019
|
stale = [
|
|
@@ -2087,6 +2141,13 @@ def estimate_message_tokens(msg: dict) -> int:
|
|
|
2087
2141
|
tokens += estimate_tokens(json.dumps(block.get("input", {})))
|
|
2088
2142
|
elif block.get("type") == "tool_result":
|
|
2089
2143
|
tokens += estimate_tokens(_extract_text(block.get("content", "")))
|
|
2144
|
+
inner = block.get("content")
|
|
2145
|
+
if isinstance(inner, list):
|
|
2146
|
+
tokens += PROXY_IMAGE_TOKEN_ESTIMATE * sum(
|
|
2147
|
+
1 for b in inner if isinstance(b, dict) and b.get("type") == "image"
|
|
2148
|
+
)
|
|
2149
|
+
elif block.get("type") == "image":
|
|
2150
|
+
tokens += PROXY_IMAGE_TOKEN_ESTIMATE
|
|
2090
2151
|
return tokens
|
|
2091
2152
|
|
|
2092
2153
|
|
|
@@ -3387,6 +3448,29 @@ async def _shared_secret_auth(request: Request, call_next):
|
|
|
3387
3448
|
# ===========================================================================
|
|
3388
3449
|
|
|
3389
3450
|
|
|
3451
|
+
def _image_block_to_openai(block: dict) -> dict | None:
|
|
3452
|
+
"""Anthropic image block → OpenAI image_url part (data URI or URL)."""
|
|
3453
|
+
src = block.get("source") or {}
|
|
3454
|
+
if src.get("type") == "base64" and src.get("data"):
|
|
3455
|
+
media_type = src.get("media_type", "image/png")
|
|
3456
|
+
return {"type": "image_url", "image_url": {"url": f"data:{media_type};base64,{src['data']}"}}
|
|
3457
|
+
if src.get("type") == "url" and src.get("url"):
|
|
3458
|
+
return {"type": "image_url", "image_url": {"url": src["url"]}}
|
|
3459
|
+
return None
|
|
3460
|
+
|
|
3461
|
+
|
|
3462
|
+
def _extract_images(content) -> list[dict]:
|
|
3463
|
+
"""Collect OpenAI image_url parts nested in Anthropic content."""
|
|
3464
|
+
images: list[dict] = []
|
|
3465
|
+
if isinstance(content, list):
|
|
3466
|
+
for b in content:
|
|
3467
|
+
if isinstance(b, dict) and b.get("type") == "image":
|
|
3468
|
+
part = _image_block_to_openai(b)
|
|
3469
|
+
if part:
|
|
3470
|
+
images.append(part)
|
|
3471
|
+
return images
|
|
3472
|
+
|
|
3473
|
+
|
|
3390
3474
|
def anthropic_to_openai_messages(anthropic_body: dict) -> list[dict]:
|
|
3391
3475
|
"""Convert Anthropic message format to OpenAI message format.
|
|
3392
3476
|
|
|
@@ -3443,11 +3527,22 @@ def anthropic_to_openai_messages(anthropic_body: dict) -> list[dict]:
|
|
|
3443
3527
|
messages.append({"role": role, "content": content})
|
|
3444
3528
|
elif isinstance(content, list):
|
|
3445
3529
|
parts = []
|
|
3530
|
+
image_parts: list[dict] = []
|
|
3446
3531
|
for block in content:
|
|
3447
3532
|
if isinstance(block, str):
|
|
3448
3533
|
parts.append(block)
|
|
3449
3534
|
elif block.get("type") == "text":
|
|
3450
3535
|
parts.append(block.get("text", ""))
|
|
3536
|
+
elif block.get("type") == "image":
|
|
3537
|
+
# Vision passthrough: forward as an OpenAI image_url part
|
|
3538
|
+
# when the upstream model has an mmproj loaded; otherwise
|
|
3539
|
+
# leave an explicit placeholder (silent drops made agents
|
|
3540
|
+
# think the model saw the screenshot).
|
|
3541
|
+
part = _image_block_to_openai(block) if vision_enabled() else None
|
|
3542
|
+
if part:
|
|
3543
|
+
image_parts.append(part)
|
|
3544
|
+
else:
|
|
3545
|
+
parts.append("[image omitted: the serving model has no vision support]")
|
|
3451
3546
|
elif block.get("type") == "thinking":
|
|
3452
3547
|
# Drop thinking blocks from user/assistant content when
|
|
3453
3548
|
# echoed back into history — model shouldn't see them.
|
|
@@ -3480,15 +3575,44 @@ def anthropic_to_openai_messages(anthropic_body: dict) -> list[dict]:
|
|
|
3480
3575
|
tu_id = block.get("tool_use_id", "")
|
|
3481
3576
|
if isinstance(tu_id, str) and tu_id.startswith("toolu_"):
|
|
3482
3577
|
tu_id = tu_id[len("toolu_"):]
|
|
3578
|
+
tr_text = _extract_text(block.get("content", ""))
|
|
3579
|
+
tr_images = _extract_images(block.get("content", "")) if vision_enabled() else []
|
|
3580
|
+
if not vision_enabled():
|
|
3581
|
+
inner = block.get("content")
|
|
3582
|
+
n_imgs = (
|
|
3583
|
+
sum(1 for b in inner if isinstance(b, dict) and b.get("type") == "image")
|
|
3584
|
+
if isinstance(inner, list) else 0
|
|
3585
|
+
)
|
|
3586
|
+
if n_imgs:
|
|
3587
|
+
tr_text = (tr_text + f"\n[{n_imgs} image(s) omitted: the serving model has no vision support]").strip()
|
|
3483
3588
|
messages.append(
|
|
3484
3589
|
{
|
|
3485
3590
|
"role": "tool",
|
|
3486
3591
|
"tool_call_id": tu_id,
|
|
3487
|
-
"content":
|
|
3592
|
+
"content": tr_text,
|
|
3488
3593
|
}
|
|
3489
3594
|
)
|
|
3595
|
+
if tr_images:
|
|
3596
|
+
# OpenAI tool messages are text-only for llama.cpp —
|
|
3597
|
+
# deliver tool-result images as an adjacent user turn
|
|
3598
|
+
# so the model actually SEES them.
|
|
3599
|
+
messages.append(
|
|
3600
|
+
{
|
|
3601
|
+
"role": "user",
|
|
3602
|
+
"content": [
|
|
3603
|
+
{"type": "text", "text": "[image(s) attached from the preceding tool result]"},
|
|
3604
|
+
*tr_images,
|
|
3605
|
+
],
|
|
3606
|
+
}
|
|
3607
|
+
)
|
|
3490
3608
|
continue
|
|
3491
|
-
if
|
|
3609
|
+
if image_parts:
|
|
3610
|
+
typed: list[dict] = []
|
|
3611
|
+
if parts:
|
|
3612
|
+
typed.append({"type": "text", "text": "\n".join(parts)})
|
|
3613
|
+
typed.extend(image_parts)
|
|
3614
|
+
messages.append({"role": role, "content": typed})
|
|
3615
|
+
elif parts:
|
|
3492
3616
|
messages.append({"role": role, "content": "\n".join(parts)})
|
|
3493
3617
|
|
|
3494
3618
|
return messages
|
|
@@ -10175,6 +10299,7 @@ async def messages(request: Request):
|
|
|
10175
10299
|
|
|
10176
10300
|
# Periodically re-detect context window from upstream (handles server restarts)
|
|
10177
10301
|
await _maybe_recheck_context_window()
|
|
10302
|
+
await _maybe_recheck_vision()
|
|
10178
10303
|
|
|
10179
10304
|
if _should_passthrough_model(model):
|
|
10180
10305
|
logger.info("PASSTHROUGH: model=%s -> %s", model, ANTHROPIC_API_BASE)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Vision passthrough: Anthropic image blocks → OpenAI image_url parts.
|
|
3
|
+
|
|
4
|
+
The upstream llama-server advertises vision in /props (modalities.vision) when
|
|
5
|
+
launched with --mmproj; the proxy autodetects and forwards images so coding
|
|
6
|
+
agents can visually check their outputs. Without vision the proxy leaves an
|
|
7
|
+
explicit placeholder instead of silently dropping (agents believed the model
|
|
8
|
+
saw screenshots it never received).
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import importlib.util
|
|
12
|
+
import unittest
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _load_proxy_module():
|
|
17
|
+
proxy_path = Path(__file__).resolve().parents[1] / "scripts" / "anthropic_proxy.py"
|
|
18
|
+
spec = importlib.util.spec_from_file_location("anthropic_proxy", proxy_path)
|
|
19
|
+
mod = importlib.util.module_from_spec(spec)
|
|
20
|
+
spec.loader.exec_module(mod)
|
|
21
|
+
return mod
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
proxy = _load_proxy_module()
|
|
25
|
+
|
|
26
|
+
PNG_B64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _img_block():
|
|
30
|
+
return {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": PNG_B64}}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class VisionOnTests(unittest.TestCase):
|
|
34
|
+
def setUp(self):
|
|
35
|
+
self._saved = (proxy.PROXY_VISION, proxy.upstream_vision)
|
|
36
|
+
proxy.PROXY_VISION = "auto"
|
|
37
|
+
proxy.upstream_vision = True
|
|
38
|
+
|
|
39
|
+
def tearDown(self):
|
|
40
|
+
proxy.PROXY_VISION, proxy.upstream_vision = self._saved
|
|
41
|
+
|
|
42
|
+
def test_user_image_becomes_typed_multimodal_content(self):
|
|
43
|
+
body = {"messages": [{"role": "user", "content": [
|
|
44
|
+
{"type": "text", "text": "what does this screenshot show?"},
|
|
45
|
+
_img_block(),
|
|
46
|
+
]}]}
|
|
47
|
+
msgs = proxy.anthropic_to_openai_messages(body)
|
|
48
|
+
self.assertEqual(len(msgs), 1)
|
|
49
|
+
content = msgs[0]["content"]
|
|
50
|
+
self.assertIsInstance(content, list)
|
|
51
|
+
kinds = [p["type"] for p in content]
|
|
52
|
+
self.assertEqual(kinds, ["text", "image_url"])
|
|
53
|
+
self.assertTrue(content[1]["image_url"]["url"].startswith("data:image/png;base64,"))
|
|
54
|
+
|
|
55
|
+
def test_url_source_passthrough(self):
|
|
56
|
+
body = {"messages": [{"role": "user", "content": [
|
|
57
|
+
{"type": "image", "source": {"type": "url", "url": "https://x/y.png"}},
|
|
58
|
+
]}]}
|
|
59
|
+
msgs = proxy.anthropic_to_openai_messages(body)
|
|
60
|
+
self.assertEqual(msgs[0]["content"][0]["image_url"]["url"], "https://x/y.png")
|
|
61
|
+
|
|
62
|
+
def test_tool_result_images_delivered_as_adjacent_user_turn(self):
|
|
63
|
+
body = {"messages": [{"role": "user", "content": [
|
|
64
|
+
{"type": "tool_result", "tool_use_id": "toolu_abc", "content": [
|
|
65
|
+
{"type": "text", "text": "screenshot captured"},
|
|
66
|
+
_img_block(),
|
|
67
|
+
]},
|
|
68
|
+
]}]}
|
|
69
|
+
msgs = proxy.anthropic_to_openai_messages(body)
|
|
70
|
+
self.assertEqual(msgs[0]["role"], "tool")
|
|
71
|
+
self.assertIn("screenshot captured", msgs[0]["content"])
|
|
72
|
+
self.assertEqual(msgs[1]["role"], "user")
|
|
73
|
+
parts = msgs[1]["content"]
|
|
74
|
+
self.assertEqual(parts[0]["type"], "text")
|
|
75
|
+
self.assertEqual(parts[1]["type"], "image_url")
|
|
76
|
+
|
|
77
|
+
def test_text_only_messages_stay_plain_strings(self):
|
|
78
|
+
body = {"messages": [{"role": "user", "content": [{"type": "text", "text": "hi"}]}]}
|
|
79
|
+
msgs = proxy.anthropic_to_openai_messages(body)
|
|
80
|
+
self.assertEqual(msgs[0]["content"], "hi")
|
|
81
|
+
|
|
82
|
+
def test_image_token_estimate_counts(self):
|
|
83
|
+
msg = {"role": "user", "content": [_img_block(), {"type": "text", "text": "x"}]}
|
|
84
|
+
with_img = proxy.estimate_message_tokens(msg)
|
|
85
|
+
without = proxy.estimate_message_tokens({"role": "user", "content": [{"type": "text", "text": "x"}]})
|
|
86
|
+
self.assertGreaterEqual(with_img - without, proxy.PROXY_IMAGE_TOKEN_ESTIMATE)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class VisionOffTests(unittest.TestCase):
|
|
90
|
+
def setUp(self):
|
|
91
|
+
self._saved = (proxy.PROXY_VISION, proxy.upstream_vision)
|
|
92
|
+
proxy.PROXY_VISION = "auto"
|
|
93
|
+
proxy.upstream_vision = False
|
|
94
|
+
|
|
95
|
+
def tearDown(self):
|
|
96
|
+
proxy.PROXY_VISION, proxy.upstream_vision = self._saved
|
|
97
|
+
|
|
98
|
+
def test_user_image_becomes_explicit_placeholder(self):
|
|
99
|
+
body = {"messages": [{"role": "user", "content": [
|
|
100
|
+
{"type": "text", "text": "see image"}, _img_block(),
|
|
101
|
+
]}]}
|
|
102
|
+
msgs = proxy.anthropic_to_openai_messages(body)
|
|
103
|
+
content = msgs[0]["content"]
|
|
104
|
+
self.assertIsInstance(content, str)
|
|
105
|
+
self.assertIn("image omitted", content)
|
|
106
|
+
|
|
107
|
+
def test_tool_result_image_noted_in_text(self):
|
|
108
|
+
body = {"messages": [{"role": "user", "content": [
|
|
109
|
+
{"type": "tool_result", "tool_use_id": "t1", "content": [
|
|
110
|
+
{"type": "text", "text": "shot"}, _img_block(),
|
|
111
|
+
]},
|
|
112
|
+
]}]}
|
|
113
|
+
msgs = proxy.anthropic_to_openai_messages(body)
|
|
114
|
+
self.assertEqual(len(msgs), 1) # no adjacent user turn without vision
|
|
115
|
+
self.assertIn("1 image(s) omitted", msgs[0]["content"])
|
|
116
|
+
|
|
117
|
+
def test_force_on_overrides_missing_upstream(self):
|
|
118
|
+
proxy.PROXY_VISION = "on"
|
|
119
|
+
self.assertTrue(proxy.vision_enabled())
|
|
120
|
+
proxy.PROXY_VISION = "off"
|
|
121
|
+
proxy.upstream_vision = True
|
|
122
|
+
self.assertFalse(proxy.vision_enabled())
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
if __name__ == "__main__":
|
|
126
|
+
unittest.main()
|
package/web/dash/styles.css
CHANGED
|
@@ -324,3 +324,34 @@ label.field { display: flex; flex-direction: column; gap: 4px; font-size: 11px;
|
|
|
324
324
|
::-webkit-scrollbar-track { background: var(--bg); }
|
|
325
325
|
::-webkit-scrollbar-thumb { background: var(--bg3); border-radius: 3px; }
|
|
326
326
|
::-webkit-scrollbar-thumb:hover { background: var(--fg3); }
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
/* ── Policy management panel ── */
|
|
330
|
+
.pol-hint { color: var(--fg); opacity: .6; font-size: 12px; margin-bottom: 8px; }
|
|
331
|
+
.pol-toolbar { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
|
|
332
|
+
.btn-sm { padding: 2px 8px; font-size: 12px; }
|
|
333
|
+
.btn-on { border-color: var(--green); color: var(--green); }
|
|
334
|
+
.btn-off { border-color: var(--red); color: var(--red); }
|
|
335
|
+
.pol-list { display: flex; flex-direction: column; gap: 6px; }
|
|
336
|
+
.pol-row { display: flex; align-items: center; gap: 12px; padding: 8px 12px; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius); }
|
|
337
|
+
.pol-row.off { opacity: .55; }
|
|
338
|
+
.pol-row.dragging { opacity: .4; outline: 1px dashed var(--cyan); }
|
|
339
|
+
.pol-handle { cursor: grab; color: var(--fg); opacity: .4; font-size: 16px; user-select: none; }
|
|
340
|
+
.pol-main { flex: 1; min-width: 0; }
|
|
341
|
+
.pol-name { font-weight: 600; }
|
|
342
|
+
.pol-desc { font-size: 12px; opacity: .65; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
343
|
+
.pol-badges { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 4px; }
|
|
344
|
+
.pol-badge { font-size: 10px; padding: 1px 6px; border-radius: 999px; border: 1px solid var(--border); text-transform: lowercase; }
|
|
345
|
+
.pol-badge.lvl-required { border-color: var(--red); color: var(--red); }
|
|
346
|
+
.pol-badge.lvl-recommended { border-color: var(--yellow); color: var(--yellow); }
|
|
347
|
+
.pol-badge.lvl-optional { opacity: .6; }
|
|
348
|
+
.pol-badge.on { border-color: var(--green); color: var(--green); }
|
|
349
|
+
.pol-badge.off { border-color: var(--red); color: var(--red); }
|
|
350
|
+
.pol-badge.prio { border-color: var(--cyan); color: var(--cyan); }
|
|
351
|
+
.pol-actions { display: flex; gap: 6px; flex-shrink: 0; }
|
|
352
|
+
.pol-detail .field { display: block; margin: 8px 0; }
|
|
353
|
+
.pol-select { background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: var(--radius); padding: 4px; }
|
|
354
|
+
.pol-section-label { font-size: 11px; text-transform: uppercase; letter-spacing: .05em; opacity: .5; margin: 12px 0 4px; }
|
|
355
|
+
.pol-desc-full { font-size: 13px; line-height: 1.5; }
|
|
356
|
+
.pol-prompt { background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius); padding: 12px; font-size: 12px; white-space: pre-wrap; word-break: break-word; max-height: 50vh; overflow: auto; }
|
|
357
|
+
.pol-suggest-list { padding-left: 20px; font-size: 13px; line-height: 1.6; }
|