@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.
@@ -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":"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"}
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miller-tech/uap",
3
- "version": "1.145.0",
3
+ "version": "1.146.0",
4
4
  "description": "Autonomous AI agent memory system with CLAUDE.md protocol enforcement",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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": _extract_text(block.get("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 parts:
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()
@@ -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; }