@miller-tech/uap 1.136.2 → 1.137.2

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.
Files changed (139) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/benchmarks/paired/report.d.ts +13 -0
  3. package/dist/benchmarks/paired/report.d.ts.map +1 -1
  4. package/dist/benchmarks/paired/report.js +29 -3
  5. package/dist/benchmarks/paired/report.js.map +1 -1
  6. package/dist/benchmarks/paired/types.d.ts +59 -0
  7. package/dist/benchmarks/paired/types.d.ts.map +1 -1
  8. package/dist/benchmarks/paired/types.js +60 -0
  9. package/dist/benchmarks/paired/types.js.map +1 -1
  10. package/dist/bin/cli.js +30 -0
  11. package/dist/bin/cli.js.map +1 -1
  12. package/dist/cli/deliver.d.ts.map +1 -1
  13. package/dist/cli/deliver.js +111 -7
  14. package/dist/cli/deliver.js.map +1 -1
  15. package/dist/cli/react.d.ts.map +1 -1
  16. package/dist/cli/react.js +18 -0
  17. package/dist/cli/react.js.map +1 -1
  18. package/dist/cli/self-tuning.d.ts +33 -0
  19. package/dist/cli/self-tuning.d.ts.map +1 -0
  20. package/dist/cli/self-tuning.js +139 -0
  21. package/dist/cli/self-tuning.js.map +1 -0
  22. package/dist/cli/tune-adapter.d.ts +8 -0
  23. package/dist/cli/tune-adapter.d.ts.map +1 -0
  24. package/dist/cli/tune-adapter.js +26 -0
  25. package/dist/cli/tune-adapter.js.map +1 -0
  26. package/dist/config/settings-registry.d.ts.map +1 -1
  27. package/dist/config/settings-registry.js +10 -0
  28. package/dist/config/settings-registry.js.map +1 -1
  29. package/dist/coordination/adaptation-signal.d.ts +19 -0
  30. package/dist/coordination/adaptation-signal.d.ts.map +1 -0
  31. package/dist/coordination/adaptation-signal.js +36 -0
  32. package/dist/coordination/adaptation-signal.js.map +1 -0
  33. package/dist/delivery/agentic-executor.d.ts +16 -1
  34. package/dist/delivery/agentic-executor.d.ts.map +1 -1
  35. package/dist/delivery/agentic-executor.js +45 -4
  36. package/dist/delivery/agentic-executor.js.map +1 -1
  37. package/dist/delivery/decompose.d.ts +27 -0
  38. package/dist/delivery/decompose.d.ts.map +1 -1
  39. package/dist/delivery/decompose.js +31 -1
  40. package/dist/delivery/decompose.js.map +1 -1
  41. package/dist/delivery/repair-escalation.d.ts +49 -0
  42. package/dist/delivery/repair-escalation.d.ts.map +1 -0
  43. package/dist/delivery/repair-escalation.js +83 -0
  44. package/dist/delivery/repair-escalation.js.map +1 -0
  45. package/dist/delivery/verifier-ladder.d.ts +47 -0
  46. package/dist/delivery/verifier-ladder.d.ts.map +1 -1
  47. package/dist/delivery/verifier-ladder.js +87 -1
  48. package/dist/delivery/verifier-ladder.js.map +1 -1
  49. package/dist/self-harness/mods.d.ts +20 -1
  50. package/dist/self-harness/mods.d.ts.map +1 -1
  51. package/dist/self-harness/mods.js +41 -0
  52. package/dist/self-harness/mods.js.map +1 -1
  53. package/dist/self-harness/orchestrator.js +4 -0
  54. package/dist/self-harness/orchestrator.js.map +1 -1
  55. package/dist/self-harness/transfer.d.ts.map +1 -1
  56. package/dist/self-harness/transfer.js +2 -0
  57. package/dist/self-harness/transfer.js.map +1 -1
  58. package/dist/self-tuning/flag-writer.d.ts +48 -0
  59. package/dist/self-tuning/flag-writer.d.ts.map +1 -0
  60. package/dist/self-tuning/flag-writer.js +102 -0
  61. package/dist/self-tuning/flag-writer.js.map +1 -0
  62. package/dist/self-tuning/flags.d.ts +88 -0
  63. package/dist/self-tuning/flags.d.ts.map +1 -0
  64. package/dist/self-tuning/flags.js +189 -0
  65. package/dist/self-tuning/flags.js.map +1 -0
  66. package/dist/self-tuning/index.d.ts +25 -0
  67. package/dist/self-tuning/index.d.ts.map +1 -0
  68. package/dist/self-tuning/index.js +25 -0
  69. package/dist/self-tuning/index.js.map +1 -0
  70. package/dist/self-tuning/judge.d.ts +66 -0
  71. package/dist/self-tuning/judge.d.ts.map +1 -0
  72. package/dist/self-tuning/judge.js +145 -0
  73. package/dist/self-tuning/judge.js.map +1 -0
  74. package/dist/self-tuning/llm-tuner.d.ts +83 -0
  75. package/dist/self-tuning/llm-tuner.d.ts.map +1 -0
  76. package/dist/self-tuning/llm-tuner.js +191 -0
  77. package/dist/self-tuning/llm-tuner.js.map +1 -0
  78. package/dist/self-tuning/orchestrator.d.ts +90 -0
  79. package/dist/self-tuning/orchestrator.d.ts.map +1 -0
  80. package/dist/self-tuning/orchestrator.js +126 -0
  81. package/dist/self-tuning/orchestrator.js.map +1 -0
  82. package/dist/self-tuning/paired-validator.d.ts +50 -0
  83. package/dist/self-tuning/paired-validator.d.ts.map +1 -0
  84. package/dist/self-tuning/paired-validator.js +78 -0
  85. package/dist/self-tuning/paired-validator.js.map +1 -0
  86. package/dist/self-tuning/profiles/index.d.ts +11 -0
  87. package/dist/self-tuning/profiles/index.d.ts.map +1 -0
  88. package/dist/self-tuning/profiles/index.js +15 -0
  89. package/dist/self-tuning/profiles/index.js.map +1 -0
  90. package/dist/self-tuning/profiles/opus48.d.ts +11 -0
  91. package/dist/self-tuning/profiles/opus48.d.ts.map +1 -0
  92. package/dist/self-tuning/profiles/opus48.js +27 -0
  93. package/dist/self-tuning/profiles/opus48.js.map +1 -0
  94. package/dist/self-tuning/profiles/qwen36.d.ts +11 -0
  95. package/dist/self-tuning/profiles/qwen36.d.ts.map +1 -0
  96. package/dist/self-tuning/profiles/qwen36.js +33 -0
  97. package/dist/self-tuning/profiles/qwen36.js.map +1 -0
  98. package/dist/self-tuning/quality-scorer.d.ts +90 -0
  99. package/dist/self-tuning/quality-scorer.d.ts.map +1 -0
  100. package/dist/self-tuning/quality-scorer.js +180 -0
  101. package/dist/self-tuning/quality-scorer.js.map +1 -0
  102. package/dist/self-tuning/realtime-adaptor.d.ts +78 -0
  103. package/dist/self-tuning/realtime-adaptor.d.ts.map +1 -0
  104. package/dist/self-tuning/realtime-adaptor.js +127 -0
  105. package/dist/self-tuning/realtime-adaptor.js.map +1 -0
  106. package/dist/self-tuning/run.d.ts +61 -0
  107. package/dist/self-tuning/run.d.ts.map +1 -0
  108. package/dist/self-tuning/run.js +122 -0
  109. package/dist/self-tuning/run.js.map +1 -0
  110. package/dist/self-tuning/search-reducer.d.ts +76 -0
  111. package/dist/self-tuning/search-reducer.d.ts.map +1 -0
  112. package/dist/self-tuning/search-reducer.js +349 -0
  113. package/dist/self-tuning/search-reducer.js.map +1 -0
  114. package/dist/self-tuning/tuning-profile.d.ts +72 -0
  115. package/dist/self-tuning/tuning-profile.d.ts.map +1 -0
  116. package/dist/self-tuning/tuning-profile.js +134 -0
  117. package/dist/self-tuning/tuning-profile.js.map +1 -0
  118. package/dist/telemetry/session-telemetry.d.ts +25 -0
  119. package/dist/telemetry/session-telemetry.d.ts.map +1 -1
  120. package/dist/telemetry/session-telemetry.js +32 -0
  121. package/dist/telemetry/session-telemetry.js.map +1 -1
  122. package/dist/types/config.d.ts +13 -0
  123. package/dist/types/config.d.ts.map +1 -1
  124. package/dist/types/config.js +3 -0
  125. package/dist/types/config.js.map +1 -1
  126. package/docs/INDEX.md +7 -4
  127. package/docs/design/LLM_SELF_TUNING_ANALYSIS.md +617 -0
  128. package/docs/guides/AUTOMATIC_FEATURES.md +8 -0
  129. package/docs/guides/DROIDS_AND_SKILLS.md +1 -1
  130. package/docs/guides/SELF_TUNING.md +137 -0
  131. package/docs/reference/CLI.md +262 -1
  132. package/docs/reference/CONFIGURATION_REFERENCE.md +24 -0
  133. package/docs/reference/FEATURES.md +20 -5
  134. package/package.json +1 -1
  135. package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
  136. package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
  137. package/tools/agents/scripts/anthropic_proxy.py +355 -29
  138. package/tools/agents/scripts/confidence_escalation.py +60 -4
  139. package/tools/agents/tests/test_confidence_escalation.py +77 -0
@@ -11,6 +11,9 @@ ce = importlib.util.module_from_spec(spec)
11
11
  sys.modules["confidence_escalation"] = ce
12
12
  import tempfile, os as _os2
13
13
  _os2.environ["UAP_RECIPE_SIGNAL_DIR"] = tempfile.mkdtemp(prefix="uap-sig-")
14
+ # Isolate the (now auto-on) real-time adaptation dir to an empty temp so no test
15
+ # accidentally reads a stray ~/.cache adaptation signal from the dev machine.
16
+ _os2.environ["UAP_ADAPTATION_SIGNAL_DIR"] = tempfile.mkdtemp(prefix="uap-adapt-empty-")
14
17
  spec.loader.exec_module(ce)
15
18
 
16
19
 
@@ -268,5 +271,79 @@ class JudgeGatingTest(unittest.TestCase): # #2 stronger non-self judge
268
271
  self.assertEqual(ce.select_recipe(b, S(recipe="auto", model="opus"), False), "fusion")
269
272
 
270
273
 
274
+ class AdaptationSignalTest(unittest.TestCase): # LLM-Self-Tuning real-time adaptor (P4)
275
+ def setUp(self):
276
+ import tempfile, os
277
+ self.d = tempfile.mkdtemp(prefix="uap-adapt-test-")
278
+ self.empty = tempfile.mkdtemp(prefix="uap-empty-sig-")
279
+ self._saved = {k: os.environ.get(k) for k in
280
+ ("UAP_RECIPE_SIGNAL_DIR", "UAP_ADAPTATION_SIGNAL_DIR", "PROXY_REALTIME_ADAPT")}
281
+ # Isolate the reactor-signal dir so it never pre-empts our selection, and
282
+ # point the adaptation dir at this test's dir.
283
+ os.environ["UAP_RECIPE_SIGNAL_DIR"] = self.empty
284
+ os.environ["UAP_ADAPTATION_SIGNAL_DIR"] = self.d
285
+ os.environ.pop("PROXY_REALTIME_ADAPT", None)
286
+
287
+ def tearDown(self):
288
+ import os
289
+ for k, v in self._saved.items():
290
+ if v is None:
291
+ os.environ.pop(k, None)
292
+ else:
293
+ os.environ[k] = v
294
+
295
+ def _write(self, name, sig):
296
+ import json, os
297
+ with open(os.path.join(self.d, name), "w") as f:
298
+ json.dump(sig, f)
299
+
300
+ def test_load_fresh_stale_missing(self):
301
+ import time
302
+ self._write("s1.json", {"ts": time.time(), "escalate": True})
303
+ self.assertTrue(ce.load_adaptation_signal("s1", signal_dir=self.d)["escalate"])
304
+ self._write("old.json", {"ts": 1, "escalate": True})
305
+ self.assertIsNone(ce.load_adaptation_signal("old", signal_dir=self.d, ttl=180.0))
306
+ self.assertIsNone(ce.load_adaptation_signal("nope", signal_dir=self.d))
307
+
308
+ def test_latest_fallback(self):
309
+ import time
310
+ self._write("latest.json", {"ts": time.time(), "recipe": "fusion"})
311
+ self.assertEqual(ce.load_adaptation_signal(signal_dir=self.d)["recipe"], "fusion")
312
+
313
+ def test_enabled_by_default_and_opt_out(self):
314
+ import os
315
+ self.assertTrue(ce.realtime_adapt_enabled()) # unset -> auto-on
316
+ os.environ["PROXY_REALTIME_ADAPT"] = "0"
317
+ self.assertFalse(ce.realtime_adapt_enabled())
318
+ os.environ["PROXY_REALTIME_ADAPT"] = "true"
319
+ self.assertTrue(ce.realtime_adapt_enabled())
320
+
321
+ def test_auto_on_escalation(self):
322
+ import time
323
+ self._write("latest.json", {"ts": time.time(), "escalate": True})
324
+ # Auto-on (PROXY_REALTIME_ADAPT unset): the fresh signal escalates to fusion.
325
+ self.assertEqual(ce.select_recipe(body("add a button"), S(recipe="auto"), False), "fusion")
326
+
327
+ def test_opt_out_disables_escalation(self):
328
+ import os, time
329
+ self._write("latest.json", {"ts": time.time(), "escalate": True})
330
+ os.environ["PROXY_REALTIME_ADAPT"] = "0"
331
+ # Disabled: a short prompt stays on the cheaper 'confidence' recipe.
332
+ self.assertEqual(ce.select_recipe(body("add a button"), S(recipe="auto"), False), "confidence")
333
+
334
+ def test_no_signal_no_escalation(self):
335
+ # Auto-on but no signal present → normal selection (confidence for a short prompt).
336
+ self.assertEqual(ce.select_recipe(body("add a button"), S(recipe="auto"), False), "confidence")
337
+
338
+ def test_no_escalation_without_judge(self):
339
+ import time
340
+ self._write("latest.json", {"ts": time.time(), "escalate": True})
341
+ # judge == primary model → no distinct judge → never escalate to fusion.
342
+ self.assertNotEqual(
343
+ ce.select_recipe(body("add a button"), S(recipe="auto", model="qwen"), False),
344
+ "fusion",
345
+ )
346
+
347
+
271
348
  if __name__ == "__main__":
272
349
  unittest.main()