pi-harness-runtime 1.1.397 → 1.1.402

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 (624) hide show
  1. package/AGENTS.md +44 -2
  2. package/CHANGELOG.md +21 -0
  3. package/RULES.md +28 -0
  4. package/harness/agent-handoff.ts +2 -3
  5. package/harness/autonomous-review.ts +1 -1
  6. package/harness/blackboard.ts +2 -3
  7. package/harness/context-compact-orchestrator.ts +1 -1
  8. package/harness/context-window-manager.ts +2 -2
  9. package/harness/e2e/playwright-runner.ts +6 -4
  10. package/harness/herdr-agents.ts +1 -1
  11. package/harness/job-state-machine.ts +1 -1
  12. package/harness/langchain/daemon.ts +3 -3
  13. package/harness/langchain/graph.ts +2 -2
  14. package/harness/langchain/ping-pong-middleware.ts +2 -2
  15. package/harness/loop-code-agent.ts +6 -4
  16. package/harness/loop-controller.ts +1 -1
  17. package/harness/loop-review-agent.ts +1 -1
  18. package/harness/loop-types.ts +1 -1
  19. package/harness/master-planner.ts +1 -1
  20. package/harness/notification-events.ts +6 -6
  21. package/harness/project-detector/detector.ts +1 -2
  22. package/harness/repair-engine.ts +2 -4
  23. package/harness/service-diagnostics.ts +1 -1
  24. package/harness/skill-sync.ts +3 -3
  25. package/index.ts +276 -55
  26. package/mirror.ts +1 -1
  27. package/package.json +5 -3
  28. package/packages/a2a-adapter/dist/discovery.d.ts.map +1 -1
  29. package/packages/a2a-adapter/dist/discovery.js +0 -1
  30. package/packages/a2a-adapter/dist/discovery.js.map +1 -1
  31. package/packages/a2a-adapter/package.json +1 -1
  32. package/packages/a2a-adapter/src/discovery.ts +0 -1
  33. package/packages/agent-policy/package.json +1 -1
  34. package/packages/architecture-generator/package.json +1 -1
  35. package/packages/auth/dist/index.d.ts +9 -0
  36. package/packages/auth/dist/index.d.ts.map +1 -0
  37. package/packages/auth/dist/index.js +9 -0
  38. package/packages/auth/dist/index.js.map +1 -0
  39. package/packages/auth/package.json +1 -1
  40. package/packages/auth/src/index.ts +9 -0
  41. package/packages/autonomous-refactor/package.json +1 -1
  42. package/packages/autonomous-runtime/package.json +1 -1
  43. package/packages/cache-strategy/package.json +1 -1
  44. package/packages/capability-registry/package.json +1 -1
  45. package/packages/checkpoint/package.json +1 -1
  46. package/packages/cli-plugin-sdk/package.json +1 -1
  47. package/packages/clipboard/package.json +1 -1
  48. package/packages/clipboard-plugin/package.json +1 -1
  49. package/packages/code-generation/package.json +1 -1
  50. package/packages/code-review/package.json +1 -1
  51. package/packages/codex-adapter/package.json +1 -1
  52. package/packages/codex-watcher/package.json +1 -1
  53. package/packages/config-capture/dist/index.d.ts +52 -0
  54. package/packages/config-capture/dist/index.d.ts.map +1 -0
  55. package/packages/config-capture/dist/index.js +261 -0
  56. package/packages/config-capture/dist/index.js.map +1 -0
  57. package/packages/config-capture/package.json +1 -1
  58. package/packages/connection-runtime/package.json +1 -1
  59. package/packages/context-compiler/package.json +1 -1
  60. package/packages/context-discovery/package.json +1 -1
  61. package/packages/context-manager/package.json +1 -1
  62. package/packages/contracts/package.json +1 -1
  63. package/packages/cookie-sanitizer/package.json +1 -1
  64. package/packages/cost-optimizer/package.json +1 -1
  65. package/packages/dependency-analyzer/package.json +1 -1
  66. package/packages/django-plugin/package.json +1 -1
  67. package/packages/doc-generator/package.json +1 -1
  68. package/packages/durable-review/package.json +1 -1
  69. package/packages/e2e-tester/package.json +1 -1
  70. package/packages/evaluation-engine/package.json +1 -1
  71. package/packages/evaluation-runner/package.json +1 -1
  72. package/packages/event-bus/package.json +1 -1
  73. package/packages/event-sink/package.json +1 -1
  74. package/packages/event-store/package.json +1 -1
  75. package/packages/experience-replay/package.json +1 -1
  76. package/packages/feedback-collector/package.json +1 -1
  77. package/packages/file-copy-helper/dist/extension.d.ts +15 -0
  78. package/packages/file-copy-helper/dist/extension.d.ts.map +1 -0
  79. package/packages/file-copy-helper/dist/extension.debug.d.ts +15 -0
  80. package/packages/file-copy-helper/dist/extension.debug.d.ts.map +1 -0
  81. package/packages/file-copy-helper/dist/extension.debug.js +215 -0
  82. package/packages/file-copy-helper/dist/extension.debug.js.map +1 -0
  83. package/packages/file-copy-helper/dist/extension.js +222 -0
  84. package/packages/file-copy-helper/dist/extension.js.map +1 -0
  85. package/packages/file-copy-helper/dist/index.d.ts +3 -0
  86. package/packages/file-copy-helper/dist/index.d.ts.map +1 -0
  87. package/packages/file-copy-helper/dist/index.js +3 -0
  88. package/packages/file-copy-helper/dist/index.js.map +1 -0
  89. package/packages/file-copy-helper/dist/intent-detector.d.ts +21 -0
  90. package/packages/file-copy-helper/dist/intent-detector.d.ts.map +1 -0
  91. package/packages/file-copy-helper/dist/intent-detector.js +348 -0
  92. package/packages/file-copy-helper/dist/intent-detector.js.map +1 -0
  93. package/packages/file-copy-helper/package.json +1 -1
  94. package/packages/framework-detector/package.json +1 -1
  95. package/packages/framework-plugin-sdk/package.json +1 -1
  96. package/packages/frappe-plugin/package.json +1 -1
  97. package/packages/generic-web-plugin/package.json +1 -1
  98. package/packages/health-monitor/package.json +1 -1
  99. package/packages/intent-analyzer/package.json +1 -1
  100. package/packages/jev-judge/dist/auto-continue.d.ts +161 -2
  101. package/packages/jev-judge/dist/auto-continue.d.ts.map +1 -1
  102. package/packages/jev-judge/dist/auto-continue.js +267 -22
  103. package/packages/jev-judge/dist/auto-continue.js.map +1 -1
  104. package/packages/jev-judge/dist/index.d.ts +2 -0
  105. package/packages/jev-judge/dist/index.d.ts.map +1 -1
  106. package/packages/jev-judge/dist/index.js +2 -0
  107. package/packages/jev-judge/dist/index.js.map +1 -1
  108. package/packages/jev-judge/dist/question-risk.d.ts +50 -0
  109. package/packages/jev-judge/dist/question-risk.d.ts.map +1 -0
  110. package/packages/jev-judge/dist/question-risk.js +100 -0
  111. package/packages/jev-judge/dist/question-risk.js.map +1 -0
  112. package/packages/jev-judge/package.json +1 -1
  113. package/packages/jev-judge/src/auto-continue.ts +426 -29
  114. package/packages/jev-judge/src/index.ts +4 -0
  115. package/packages/jev-judge/src/question-risk.ts +151 -0
  116. package/packages/jev-judge/tests/auto-continue-context.test.ts +221 -0
  117. package/packages/jev-judge/tests/outcome-application.test.ts +132 -0
  118. package/packages/jev-judge/tests/question-risk.test.ts +116 -0
  119. package/packages/knowledge-graph/package.json +1 -1
  120. package/packages/knowledge-retrieval/package.json +1 -1
  121. package/packages/laravel-plugin/package.json +1 -1
  122. package/packages/learning-engine/package.json +1 -1
  123. package/packages/logging/README.md +36 -3
  124. package/packages/logging/dist/config.d.ts +7 -0
  125. package/packages/logging/dist/config.d.ts.map +1 -1
  126. package/packages/logging/dist/config.js +14 -0
  127. package/packages/logging/dist/config.js.map +1 -1
  128. package/packages/logging/dist/incidents/schema.d.ts +111 -0
  129. package/packages/logging/dist/incidents/schema.d.ts.map +1 -0
  130. package/packages/logging/dist/incidents/schema.js +0 -0
  131. package/packages/logging/dist/incidents/schema.js.map +1 -0
  132. package/packages/logging/dist/index.d.ts +2 -0
  133. package/packages/logging/dist/index.d.ts.map +1 -1
  134. package/packages/logging/dist/index.js +2 -0
  135. package/packages/logging/dist/index.js.map +1 -1
  136. package/packages/logging/dist/server/http.d.ts +4 -3
  137. package/packages/logging/dist/server/http.d.ts.map +1 -1
  138. package/packages/logging/dist/server/http.js +35 -3
  139. package/packages/logging/dist/server/http.js.map +1 -1
  140. package/packages/logging/dist/server/incident-qdrant.d.ts +83 -0
  141. package/packages/logging/dist/server/incident-qdrant.d.ts.map +1 -0
  142. package/packages/logging/dist/server/incident-qdrant.js +129 -0
  143. package/packages/logging/dist/server/incident-qdrant.js.map +1 -0
  144. package/packages/logging/dist/server/incident-store.d.ts +76 -0
  145. package/packages/logging/dist/server/incident-store.d.ts.map +1 -0
  146. package/packages/logging/dist/server/incident-store.js +157 -0
  147. package/packages/logging/dist/server/incident-store.js.map +1 -0
  148. package/packages/logging/dist/server/index.d.ts +4 -0
  149. package/packages/logging/dist/server/index.d.ts.map +1 -1
  150. package/packages/logging/dist/server/index.js +2 -0
  151. package/packages/logging/dist/server/index.js.map +1 -1
  152. package/packages/logging/dist/server/service.d.ts +33 -0
  153. package/packages/logging/dist/server/service.d.ts.map +1 -1
  154. package/packages/logging/dist/server/service.js +63 -0
  155. package/packages/logging/dist/server/service.js.map +1 -1
  156. package/packages/logging/dist/shipper.d.ts +74 -3
  157. package/packages/logging/dist/shipper.d.ts.map +1 -1
  158. package/packages/logging/dist/shipper.js +88 -5
  159. package/packages/logging/dist/shipper.js.map +1 -1
  160. package/packages/logging/dist/singleton.d.ts.map +1 -1
  161. package/packages/logging/dist/singleton.js +1 -0
  162. package/packages/logging/dist/singleton.js.map +1 -1
  163. package/packages/logging/package.json +1 -1
  164. package/packages/logging/src/config.ts +22 -0
  165. package/packages/logging/src/incidents/schema.ts +0 -0
  166. package/packages/logging/src/index.ts +17 -0
  167. package/packages/logging/src/server/http.ts +42 -3
  168. package/packages/logging/src/server/incident-qdrant.ts +177 -0
  169. package/packages/logging/src/server/incident-store.ts +192 -0
  170. package/packages/logging/src/server/index.ts +21 -0
  171. package/packages/logging/src/server/service.ts +79 -0
  172. package/packages/logging/src/shipper.ts +120 -5
  173. package/packages/logging/src/singleton.ts +1 -0
  174. package/packages/logging/test/fanout.test.ts +186 -0
  175. package/packages/logging/test/incidents.test.ts +404 -0
  176. package/packages/mcp-adapter/package.json +1 -1
  177. package/packages/memory-engine/package.json +1 -1
  178. package/packages/milestone-manager/package.json +1 -1
  179. package/packages/model-registry/package.json +1 -1
  180. package/packages/nextjs-plugin/package.json +1 -1
  181. package/packages/notification/dist/adapters/detail-format.d.ts +42 -0
  182. package/packages/notification/dist/adapters/detail-format.d.ts.map +1 -0
  183. package/packages/notification/dist/adapters/detail-format.js +94 -0
  184. package/packages/notification/dist/adapters/detail-format.js.map +1 -0
  185. package/packages/notification/dist/adapters/email-adapter.d.ts.map +1 -1
  186. package/packages/notification/dist/adapters/email-adapter.js +3 -2
  187. package/packages/notification/dist/adapters/email-adapter.js.map +1 -1
  188. package/packages/notification/dist/adapters/line-adapter.d.ts +33 -0
  189. package/packages/notification/dist/adapters/line-adapter.d.ts.map +1 -1
  190. package/packages/notification/dist/adapters/line-adapter.js +87 -9
  191. package/packages/notification/dist/adapters/line-adapter.js.map +1 -1
  192. package/packages/notification/dist/adapters/ntfy-adapter.d.ts.map +1 -1
  193. package/packages/notification/dist/adapters/ntfy-adapter.js +3 -2
  194. package/packages/notification/dist/adapters/ntfy-adapter.js.map +1 -1
  195. package/packages/notification/dist/adapters/telegram-adapter.d.ts +14 -0
  196. package/packages/notification/dist/adapters/telegram-adapter.d.ts.map +1 -1
  197. package/packages/notification/dist/adapters/telegram-adapter.js +89 -69
  198. package/packages/notification/dist/adapters/telegram-adapter.js.map +1 -1
  199. package/packages/notification/dist/notification-center.d.ts.map +1 -1
  200. package/packages/notification/dist/notification-center.js +60 -7
  201. package/packages/notification/dist/notification-center.js.map +1 -1
  202. package/packages/notification/dist/pending-question.d.ts +69 -2
  203. package/packages/notification/dist/pending-question.d.ts.map +1 -1
  204. package/packages/notification/dist/pending-question.js +88 -2
  205. package/packages/notification/dist/pending-question.js.map +1 -1
  206. package/packages/notification/dist/types.d.ts +21 -0
  207. package/packages/notification/dist/types.d.ts.map +1 -1
  208. package/packages/notification/package.json +1 -1
  209. package/packages/notification/src/adapters/detail-format.ts +114 -0
  210. package/packages/notification/src/adapters/email-adapter.ts +3 -2
  211. package/packages/notification/src/adapters/line-adapter.ts +97 -9
  212. package/packages/notification/src/adapters/ntfy-adapter.ts +3 -2
  213. package/packages/notification/src/adapters/telegram-adapter.ts +98 -76
  214. package/packages/notification/src/notification-center.ts +66 -8
  215. package/packages/notification/src/pending-question.ts +160 -8
  216. package/packages/notification/src/types.ts +21 -0
  217. package/packages/notification/test/approval-payload.test.ts +269 -0
  218. package/packages/notification/test/detail-format.test.ts +106 -0
  219. package/packages/notification/test/pending-question-lifecycle.test.ts +195 -0
  220. package/packages/observability/package.json +1 -1
  221. package/packages/okf-indexer/dist/index.d.ts +9 -0
  222. package/packages/okf-indexer/dist/index.d.ts.map +1 -0
  223. package/packages/okf-indexer/dist/index.js +9 -0
  224. package/packages/okf-indexer/dist/index.js.map +1 -0
  225. package/packages/okf-indexer/package.json +1 -1
  226. package/packages/okf-indexer/src/index.ts +9 -0
  227. package/packages/paperclip-integration/package.json +1 -1
  228. package/packages/performance-optimizer/package.json +1 -1
  229. package/packages/permission-mode/package.json +1 -1
  230. package/packages/privilege-broker/package.json +1 -1
  231. package/packages/project-analyzer/package.json +1 -1
  232. package/packages/project-bootstrap/package.json +1 -1
  233. package/packages/projection-engine/package.json +1 -1
  234. package/packages/prompt-compiler/package.json +1 -1
  235. package/packages/prompt-versioning/package.json +1 -1
  236. package/packages/provider-adapter-sdk/package.json +1 -1
  237. package/packages/provider-router/dist/provider-router.d.ts.map +1 -1
  238. package/packages/provider-router/dist/types.d.ts +2 -2
  239. package/packages/provider-router/dist/types.d.ts.map +1 -1
  240. package/packages/provider-router/dist/types.js +1 -1
  241. package/packages/provider-router/package.json +1 -1
  242. package/packages/provider-router/src/types.ts +2 -2
  243. package/packages/provider-selector/package.json +1 -1
  244. package/packages/providers/package.json +1 -1
  245. package/packages/qdrant-skills/package.json +1 -1
  246. package/packages/quota-manager/package.json +1 -1
  247. package/packages/rate-limiter/package.json +1 -1
  248. package/packages/react-vite-plugin/package.json +1 -1
  249. package/packages/relay/package.json +1 -1
  250. package/packages/release-manager/package.json +1 -1
  251. package/packages/requirement-compiler/package.json +1 -1
  252. package/packages/runtime/package.json +1 -1
  253. package/packages/scheduler/dist/index.d.ts +9 -0
  254. package/packages/scheduler/dist/index.d.ts.map +1 -0
  255. package/packages/scheduler/dist/index.js +9 -0
  256. package/packages/scheduler/dist/index.js.map +1 -0
  257. package/packages/scheduler/dist/scheduler.d.ts +17 -0
  258. package/packages/scheduler/dist/scheduler.d.ts.map +1 -0
  259. package/packages/scheduler/dist/scheduler.js +41 -0
  260. package/packages/scheduler/dist/scheduler.js.map +1 -0
  261. package/packages/scheduler/package.json +1 -1
  262. package/packages/scheduler/src/index.ts +9 -0
  263. package/packages/scheduler-adapter/package.json +1 -1
  264. package/packages/session/package.json +1 -1
  265. package/packages/session-api/package.json +1 -1
  266. package/packages/session-export/package.json +1 -1
  267. package/packages/shared-context/dist/index.d.ts +7 -0
  268. package/packages/shared-context/dist/index.d.ts.map +1 -0
  269. package/packages/shared-context/dist/index.js +7 -0
  270. package/packages/shared-context/dist/index.js.map +1 -0
  271. package/packages/shared-context/dist/shared-context.d.ts +12 -0
  272. package/packages/shared-context/dist/shared-context.d.ts.map +1 -0
  273. package/packages/shared-context/dist/shared-context.js +39 -0
  274. package/packages/shared-context/dist/shared-context.js.map +1 -0
  275. package/packages/shared-context/package.json +1 -1
  276. package/packages/skill-mcp-client/dist/client.d.ts +56 -0
  277. package/packages/skill-mcp-client/dist/client.d.ts.map +1 -0
  278. package/packages/skill-mcp-client/dist/client.js +101 -0
  279. package/packages/skill-mcp-client/dist/client.js.map +1 -0
  280. package/packages/skill-mcp-client/dist/errors.d.ts +44 -0
  281. package/packages/skill-mcp-client/dist/errors.d.ts.map +1 -0
  282. package/packages/skill-mcp-client/dist/errors.js +68 -0
  283. package/packages/skill-mcp-client/dist/errors.js.map +1 -0
  284. package/packages/skill-mcp-client/dist/index.d.ts +9 -0
  285. package/packages/skill-mcp-client/dist/index.d.ts.map +1 -0
  286. package/packages/skill-mcp-client/dist/index.js +9 -0
  287. package/packages/skill-mcp-client/dist/index.js.map +1 -0
  288. package/packages/skill-mcp-client/dist/types.d.ts +106 -0
  289. package/packages/skill-mcp-client/dist/types.d.ts.map +1 -0
  290. package/packages/skill-mcp-client/dist/types.js +14 -0
  291. package/packages/skill-mcp-client/dist/types.js.map +1 -0
  292. package/packages/skill-mcp-client/package.json +1 -1
  293. package/packages/skill-registry/package.json +1 -1
  294. package/packages/skills/package.json +1 -5
  295. package/packages/sprint-planner/package.json +1 -1
  296. package/packages/subscription-engine/package.json +1 -1
  297. package/packages/task-compiler/package.json +1 -1
  298. package/packages/telegram/package.json +1 -1
  299. package/packages/telegram/src/agent-messages.d.ts +28 -0
  300. package/packages/telegram/src/agent-messages.js +90 -0
  301. package/packages/telegram/src/bindings.d.ts +296 -0
  302. package/packages/telegram/src/bindings.js +1086 -0
  303. package/packages/telegram/src/bus.d.ts +759 -0
  304. package/packages/telegram/src/bus.js +2732 -0
  305. package/packages/telegram/src/commands.d.ts +761 -0
  306. package/packages/telegram/src/commands.js +2622 -0
  307. package/packages/telegram/src/config.d.ts +222 -0
  308. package/packages/telegram/src/config.js +844 -0
  309. package/packages/telegram/src/delivery.d.ts +161 -0
  310. package/packages/telegram/src/delivery.js +550 -0
  311. package/packages/telegram/src/extension.d.ts +7 -0
  312. package/packages/telegram/src/extension.js +2444 -0
  313. package/packages/telegram/src/inbound.d.ts +94 -0
  314. package/packages/telegram/src/inbound.js +478 -0
  315. package/packages/telegram/src/index.d.ts +6 -0
  316. package/packages/telegram/src/index.js +6 -0
  317. package/packages/telegram/src/keyboard.d.ts +21 -0
  318. package/packages/telegram/src/keyboard.js +37 -0
  319. package/packages/telegram/src/lifecycle.d.ts +210 -0
  320. package/packages/telegram/src/lifecycle.js +538 -0
  321. package/packages/telegram/src/pi.d.ts +76 -0
  322. package/packages/telegram/src/pi.js +130 -0
  323. package/packages/telegram/src/polling.d.ts +332 -0
  324. package/packages/telegram/src/polling.js +1219 -0
  325. package/packages/telegram/src/replies.d.ts +210 -0
  326. package/packages/telegram/src/replies.js +752 -0
  327. package/packages/telegram/src/routing.d.ts +388 -0
  328. package/packages/telegram/src/routing.js +7886 -0
  329. package/packages/telegram/src/runtime.d.ts +159 -0
  330. package/packages/telegram/src/runtime.js +351 -0
  331. package/packages/telegram/src/telegram-api.d.ts +564 -0
  332. package/packages/telegram/src/telegram-api.js +1332 -0
  333. package/packages/telegram/src/turns.d.ts +108 -0
  334. package/packages/telegram/src/turns.js +482 -0
  335. package/packages/telegram/src/updates.d.ts +1545 -0
  336. package/packages/telegram/src/updates.js +6420 -0
  337. package/packages/tencentdb-memory/package.json +1 -1
  338. package/packages/tencentdb-sync/package.json +1 -1
  339. package/packages/test-data-generator/package.json +1 -1
  340. package/packages/test-generator/package.json +1 -1
  341. package/packages/todo-bd-sync/dist/detector.d.ts +54 -0
  342. package/packages/todo-bd-sync/dist/detector.d.ts.map +1 -0
  343. package/packages/todo-bd-sync/dist/detector.js +132 -0
  344. package/packages/todo-bd-sync/dist/detector.js.map +1 -0
  345. package/packages/todo-bd-sync/dist/extension.d.ts +30 -0
  346. package/packages/todo-bd-sync/dist/extension.d.ts.map +1 -0
  347. package/packages/todo-bd-sync/dist/extension.js +35 -0
  348. package/packages/todo-bd-sync/dist/extension.js.map +1 -0
  349. package/packages/todo-bd-sync/dist/index.d.ts +87 -0
  350. package/packages/todo-bd-sync/dist/index.d.ts.map +1 -0
  351. package/packages/todo-bd-sync/dist/index.js +296 -0
  352. package/packages/todo-bd-sync/dist/index.js.map +1 -0
  353. package/packages/todo-bd-sync/dist/sync.d.ts +72 -0
  354. package/packages/todo-bd-sync/dist/sync.d.ts.map +1 -0
  355. package/packages/todo-bd-sync/dist/sync.js +290 -0
  356. package/packages/todo-bd-sync/dist/sync.js.map +1 -0
  357. package/packages/todo-bd-sync/dist/task-analyzer.d.ts +49 -0
  358. package/packages/todo-bd-sync/dist/task-analyzer.d.ts.map +1 -0
  359. package/packages/todo-bd-sync/dist/task-analyzer.js +240 -0
  360. package/packages/todo-bd-sync/dist/task-analyzer.js.map +1 -0
  361. package/packages/todo-bd-sync/dist/todo-reminder.d.ts +126 -0
  362. package/packages/todo-bd-sync/dist/todo-reminder.d.ts.map +1 -0
  363. package/packages/todo-bd-sync/dist/todo-reminder.js +329 -0
  364. package/packages/todo-bd-sync/dist/todo-reminder.js.map +1 -0
  365. package/packages/todo-bd-sync/dist/types.d.ts +65 -0
  366. package/packages/todo-bd-sync/dist/types.d.ts.map +1 -0
  367. package/packages/todo-bd-sync/dist/types.js +67 -0
  368. package/packages/todo-bd-sync/dist/types.js.map +1 -0
  369. package/packages/todo-bd-sync/package.json +1 -1
  370. package/packages/token-estimation/dist/index.d.ts +94 -0
  371. package/packages/token-estimation/dist/index.d.ts.map +1 -0
  372. package/packages/token-estimation/dist/index.js +115 -0
  373. package/packages/token-estimation/dist/index.js.map +1 -0
  374. package/packages/token-estimation/package.json +1 -1
  375. package/packages/token-optimizer/package.json +1 -1
  376. package/packages/trajectory/package.json +1 -1
  377. package/packages/tui/package.json +1 -1
  378. package/packages/types/dist/ai-providers.d.ts +36 -0
  379. package/packages/types/dist/ai-providers.d.ts.map +1 -0
  380. package/packages/types/dist/ai-providers.js +66 -0
  381. package/packages/types/dist/ai-providers.js.map +1 -0
  382. package/packages/types/dist/index.d.ts +12 -0
  383. package/packages/types/dist/index.d.ts.map +1 -0
  384. package/packages/types/dist/index.js +12 -0
  385. package/packages/types/dist/index.js.map +1 -0
  386. package/packages/types/package.json +5 -5
  387. package/packages/types/src/index.ts +12 -0
  388. package/packages/voice-api/package.json +1 -1
  389. package/packages/webmcp-tester/package.json +1 -1
  390. package/packages/wiki/package.json +1 -1
  391. package/packages/workflow-events/package.json +1 -1
  392. package/packages/workspace-scanner/package.json +1 -1
  393. package/packages/worktree/package.json +1 -1
  394. package/packages/worktree/worktree.ts +1 -1
  395. package/packages/write-review/package.json +1 -1
  396. package/renderer.ts +1 -1
  397. package/scripts/build-packages.ts +162 -0
  398. package/scripts/relay-client.ts +2 -2
  399. package/scripts/typecheck-packages.mjs +3 -3
  400. package/scripts/unified-webhook-server.ts +22 -10
  401. package/scripts/verify-package-contents.ts +345 -0
  402. package/scripts/ws-server.ts +1 -1
  403. package/tracker.ts +1 -1
  404. package/harness/browser-scrapers/base-browser-scraper.d.ts +0 -91
  405. package/harness/browser-scrapers/chrome-profile-manager.d.ts +0 -80
  406. package/harness/browser-scrapers/codex-browser-scraper.d.ts +0 -60
  407. package/harness/browser-scrapers/index.d.ts +0 -29
  408. package/harness/browser-scrapers/zai-browser-scraper.d.ts +0 -79
  409. package/harness/e2e/browser-scrapers/base-browser-scraper.d.ts +0 -92
  410. package/harness/e2e/browser-scrapers/chrome-profile-manager.d.ts +0 -81
  411. package/harness/e2e/browser-scrapers/codex-browser-scraper.d.ts +0 -61
  412. package/harness/e2e/browser-scrapers/index.d.ts +0 -30
  413. package/harness/e2e/browser-scrapers/zai-browser-scraper.d.ts +0 -80
  414. package/harness/langchain/agents.d.ts +0 -143
  415. package/harness/langchain/agents.test.d.ts +0 -2
  416. package/harness/langchain/checkpointer.d.ts +0 -48
  417. package/harness/langchain/checkpointer.test.d.ts +0 -8
  418. package/harness/langchain/cron-cli.d.ts +0 -12
  419. package/harness/langchain/daemon.d.ts +0 -161
  420. package/harness/langchain/daemon.test.d.ts +0 -11
  421. package/harness/langchain/file-tools.d.ts +0 -97
  422. package/harness/langchain/graph.d.ts +0 -706
  423. package/harness/langchain/model-router.d.ts +0 -63
  424. package/harness/langchain/model-router.test.d.ts +0 -2
  425. package/harness/langchain/models.d.ts +0 -72
  426. package/harness/langchain/ping-pong-middleware.d.ts +0 -28
  427. package/harness/langchain/ping-pong-middleware.test.d.ts +0 -2
  428. package/harness/langchain/run.d.ts +0 -15
  429. package/harness/langchain/scoreboard.test.d.ts +0 -13
  430. package/harness/langchain/status-line.d.ts +0 -91
  431. package/harness/langchain/status-line.test.d.ts +0 -8
  432. package/harness/langchain/surge.d.ts +0 -111
  433. package/harness/langchain/surge.test.d.ts +0 -10
  434. package/harness/langchain/widget.d.ts +0 -105
  435. package/harness/langchain/widget.test.d.ts +0 -8
  436. package/packages/autonomous-runtime/dist/worker.d.ts +0 -63
  437. package/packages/autonomous-runtime/dist/worker.js +0 -133
  438. package/packages/capability-registry/src/types.d.ts +0 -47
  439. package/packages/clipboard/dist/clipboard.d.ts +0 -11
  440. package/packages/clipboard/dist/clipboard.js +0 -40
  441. package/packages/clipboard/dist/index.d.ts +0 -2
  442. package/packages/clipboard/dist/index.js +0 -2
  443. package/packages/clipboard/dist/types.d.ts +0 -13
  444. package/packages/clipboard/dist/types.js +0 -5
  445. package/packages/context-discovery/dist/discover.d.ts +0 -3
  446. package/packages/context-discovery/dist/discover.js +0 -42
  447. package/packages/context-discovery/dist/discovery.d.ts +0 -28
  448. package/packages/context-discovery/dist/discovery.js +0 -21
  449. package/packages/context-discovery/dist/index.d.ts +0 -3
  450. package/packages/context-discovery/dist/index.js +0 -2
  451. package/packages/context-discovery/dist/types.d.ts +0 -16
  452. package/packages/context-discovery/dist/types.js +0 -2
  453. package/packages/event-bus/dist/bus.d.ts +0 -15
  454. package/packages/event-bus/dist/bus.js +0 -90
  455. package/packages/event-bus/dist/index.d.ts +0 -4
  456. package/packages/event-bus/dist/index.js +0 -3
  457. package/packages/event-bus/dist/test/bus.test.js +0 -52
  458. package/packages/event-bus/dist/types.d.ts +0 -27
  459. package/packages/event-bus/dist/types.js +0 -10
  460. package/packages/event-store/dist/index.d.ts +0 -3
  461. package/packages/event-store/dist/index.js +0 -2
  462. package/packages/event-store/dist/store.d.ts +0 -15
  463. package/packages/event-store/dist/store.js +0 -131
  464. package/packages/event-store/dist/test/store.test.js +0 -57
  465. package/packages/event-store/dist/types.d.ts +0 -48
  466. package/packages/event-store/dist/types.js +0 -5
  467. package/packages/event-store/src/types.d.ts +0 -48
  468. package/packages/file-copy-helper/dist/src/extension.js +0 -186
  469. package/packages/model-registry/src/types.d.ts +0 -63
  470. package/packages/notification/dist/src/adapters/email-adapter.d.ts +0 -17
  471. package/packages/notification/dist/src/adapters/email-adapter.d.ts.map +0 -1
  472. package/packages/notification/dist/src/adapters/email-adapter.js +0 -89
  473. package/packages/notification/dist/src/adapters/email-adapter.js.map +0 -1
  474. package/packages/notification/dist/src/adapters/line-adapter.d.ts +0 -17
  475. package/packages/notification/dist/src/adapters/line-adapter.d.ts.map +0 -1
  476. package/packages/notification/dist/src/adapters/line-adapter.js +0 -99
  477. package/packages/notification/dist/src/adapters/line-adapter.js.map +0 -1
  478. package/packages/notification/dist/src/adapters/ntfy-adapter.d.ts +0 -17
  479. package/packages/notification/dist/src/adapters/ntfy-adapter.d.ts.map +0 -1
  480. package/packages/notification/dist/src/adapters/ntfy-adapter.js +0 -84
  481. package/packages/notification/dist/src/adapters/ntfy-adapter.js.map +0 -1
  482. package/packages/notification/dist/src/adapters/telegram-adapter.d.ts +0 -56
  483. package/packages/notification/dist/src/adapters/telegram-adapter.d.ts.map +0 -1
  484. package/packages/notification/dist/src/adapters/telegram-adapter.js +0 -251
  485. package/packages/notification/dist/src/adapters/telegram-adapter.js.map +0 -1
  486. package/packages/notification/dist/src/adapters/webhook-adapter.d.ts +0 -15
  487. package/packages/notification/dist/src/adapters/webhook-adapter.d.ts.map +0 -1
  488. package/packages/notification/dist/src/adapters/webhook-adapter.js +0 -64
  489. package/packages/notification/dist/src/adapters/webhook-adapter.js.map +0 -1
  490. package/packages/notification/dist/src/base-adapter.d.ts +0 -36
  491. package/packages/notification/dist/src/base-adapter.d.ts.map +0 -1
  492. package/packages/notification/dist/src/base-adapter.js +0 -39
  493. package/packages/notification/dist/src/base-adapter.js.map +0 -1
  494. package/packages/notification/dist/src/index.d.ts +0 -12
  495. package/packages/notification/dist/src/index.d.ts.map +0 -1
  496. package/packages/notification/dist/src/index.js +0 -12
  497. package/packages/notification/dist/src/index.js.map +0 -1
  498. package/packages/notification/dist/src/notification-center.d.ts +0 -89
  499. package/packages/notification/dist/src/notification-center.d.ts.map +0 -1
  500. package/packages/notification/dist/src/notification-center.js +0 -356
  501. package/packages/notification/dist/src/notification-center.js.map +0 -1
  502. package/packages/notification/dist/src/notification-policy.d.ts +0 -66
  503. package/packages/notification/dist/src/notification-policy.d.ts.map +0 -1
  504. package/packages/notification/dist/src/notification-policy.js +0 -153
  505. package/packages/notification/dist/src/notification-policy.js.map +0 -1
  506. package/packages/notification/dist/src/telegram-webhook-handler.d.ts +0 -86
  507. package/packages/notification/dist/src/telegram-webhook-handler.d.ts.map +0 -1
  508. package/packages/notification/dist/src/telegram-webhook-handler.js +0 -149
  509. package/packages/notification/dist/src/telegram-webhook-handler.js.map +0 -1
  510. package/packages/notification/dist/src/types.d.ts +0 -106
  511. package/packages/notification/dist/src/types.d.ts.map +0 -1
  512. package/packages/notification/dist/src/types.js +0 -7
  513. package/packages/notification/dist/src/types.js.map +0 -1
  514. package/packages/projection-engine/dist/engine.d.ts +0 -61
  515. package/packages/projection-engine/dist/engine.js +0 -76
  516. package/packages/projection-engine/dist/index.d.ts +0 -2
  517. package/packages/projection-engine/dist/index.js +0 -2
  518. package/packages/projection-engine/dist/project.d.ts +0 -3
  519. package/packages/projection-engine/dist/project.js +0 -24
  520. package/packages/projection-engine/dist/types.d.ts +0 -55
  521. package/packages/projection-engine/dist/types.js +0 -5
  522. package/packages/projection-engine/src/types.d.ts +0 -55
  523. package/packages/provider-adapter-sdk/dist/src/builder.d.ts +0 -140
  524. package/packages/provider-adapter-sdk/dist/src/builder.d.ts.map +0 -1
  525. package/packages/provider-adapter-sdk/dist/src/builder.js +0 -332
  526. package/packages/provider-adapter-sdk/dist/src/builder.js.map +0 -1
  527. package/packages/provider-adapter-sdk/dist/src/errors.d.ts +0 -71
  528. package/packages/provider-adapter-sdk/dist/src/errors.d.ts.map +0 -1
  529. package/packages/provider-adapter-sdk/dist/src/errors.js +0 -111
  530. package/packages/provider-adapter-sdk/dist/src/errors.js.map +0 -1
  531. package/packages/provider-adapter-sdk/dist/src/index.d.ts +0 -15
  532. package/packages/provider-adapter-sdk/dist/src/index.d.ts.map +0 -1
  533. package/packages/provider-adapter-sdk/dist/src/index.js +0 -19
  534. package/packages/provider-adapter-sdk/dist/src/index.js.map +0 -1
  535. package/packages/provider-adapter-sdk/dist/src/registry.d.ts +0 -108
  536. package/packages/provider-adapter-sdk/dist/src/registry.d.ts.map +0 -1
  537. package/packages/provider-adapter-sdk/dist/src/registry.js +0 -301
  538. package/packages/provider-adapter-sdk/dist/src/registry.js.map +0 -1
  539. package/packages/provider-adapter-sdk/dist/src/tester.d.ts +0 -71
  540. package/packages/provider-adapter-sdk/dist/src/tester.d.ts.map +0 -1
  541. package/packages/provider-adapter-sdk/dist/src/tester.js +0 -392
  542. package/packages/provider-adapter-sdk/dist/src/tester.js.map +0 -1
  543. package/packages/provider-adapter-sdk/dist/src/types.d.ts +0 -182
  544. package/packages/provider-adapter-sdk/dist/src/types.d.ts.map +0 -1
  545. package/packages/provider-adapter-sdk/dist/src/types.js +0 -11
  546. package/packages/provider-adapter-sdk/dist/src/types.js.map +0 -1
  547. package/packages/provider-router/dist/capability-registry/src/types.d.ts +0 -47
  548. package/packages/provider-router/dist/capability-registry/src/types.d.ts.map +0 -1
  549. package/packages/provider-router/dist/capability-registry/src/types.js +0 -10
  550. package/packages/provider-router/dist/capability-registry/src/types.js.map +0 -1
  551. package/packages/provider-router/dist/provider-router/src/index.d.ts +0 -23
  552. package/packages/provider-router/dist/provider-router/src/index.d.ts.map +0 -1
  553. package/packages/provider-router/dist/provider-router/src/index.js +0 -25
  554. package/packages/provider-router/dist/provider-router/src/index.js.map +0 -1
  555. package/packages/provider-router/dist/provider-router/src/policy.d.ts +0 -10
  556. package/packages/provider-router/dist/provider-router/src/policy.d.ts.map +0 -1
  557. package/packages/provider-router/dist/provider-router/src/policy.js +0 -45
  558. package/packages/provider-router/dist/provider-router/src/policy.js.map +0 -1
  559. package/packages/provider-router/dist/provider-router/src/provider-router.d.ts +0 -56
  560. package/packages/provider-router/dist/provider-router/src/provider-router.d.ts.map +0 -1
  561. package/packages/provider-router/dist/provider-router/src/provider-router.js +0 -222
  562. package/packages/provider-router/dist/provider-router/src/provider-router.js.map +0 -1
  563. package/packages/provider-router/dist/provider-router/src/strategies.d.ts +0 -19
  564. package/packages/provider-router/dist/provider-router/src/strategies.d.ts.map +0 -1
  565. package/packages/provider-router/dist/provider-router/src/strategies.js +0 -110
  566. package/packages/provider-router/dist/provider-router/src/strategies.js.map +0 -1
  567. package/packages/provider-router/dist/provider-router/src/types.d.ts +0 -91
  568. package/packages/provider-router/dist/provider-router/src/types.d.ts.map +0 -1
  569. package/packages/provider-router/dist/provider-router/src/types.js +0 -10
  570. package/packages/provider-router/dist/provider-router/src/types.js.map +0 -1
  571. package/packages/provider-router/dist/src/index.d.ts +0 -23
  572. package/packages/provider-router/dist/src/index.d.ts.map +0 -1
  573. package/packages/provider-router/dist/src/index.js +0 -25
  574. package/packages/provider-router/dist/src/index.js.map +0 -1
  575. package/packages/provider-router/dist/src/policy.d.ts +0 -10
  576. package/packages/provider-router/dist/src/policy.d.ts.map +0 -1
  577. package/packages/provider-router/dist/src/policy.js +0 -45
  578. package/packages/provider-router/dist/src/policy.js.map +0 -1
  579. package/packages/provider-router/dist/src/provider-router.d.ts +0 -56
  580. package/packages/provider-router/dist/src/provider-router.d.ts.map +0 -1
  581. package/packages/provider-router/dist/src/provider-router.js +0 -222
  582. package/packages/provider-router/dist/src/provider-router.js.map +0 -1
  583. package/packages/provider-router/dist/src/strategies.d.ts +0 -19
  584. package/packages/provider-router/dist/src/strategies.d.ts.map +0 -1
  585. package/packages/provider-router/dist/src/strategies.js +0 -110
  586. package/packages/provider-router/dist/src/strategies.js.map +0 -1
  587. package/packages/provider-router/dist/src/types.d.ts +0 -91
  588. package/packages/provider-router/dist/src/types.d.ts.map +0 -1
  589. package/packages/provider-router/dist/src/types.js +0 -10
  590. package/packages/provider-router/dist/src/types.js.map +0 -1
  591. package/packages/provider-router/dist/types/src/runtime-types.d.ts +0 -412
  592. package/packages/provider-router/dist/types/src/runtime-types.d.ts.map +0 -1
  593. package/packages/provider-router/dist/types/src/runtime-types.js +0 -2
  594. package/packages/provider-router/dist/types/src/runtime-types.js.map +0 -1
  595. package/packages/session-api/dist/api.d.ts +0 -83
  596. package/packages/session-api/dist/api.js +0 -35
  597. package/packages/session-api/dist/index.d.ts +0 -2
  598. package/packages/session-api/dist/index.js +0 -2
  599. package/packages/session-api/dist/types.d.ts +0 -22
  600. package/packages/session-api/dist/types.js +0 -5
  601. package/packages/session-export/dist/exporter.d.ts +0 -28
  602. package/packages/session-export/dist/exporter.js +0 -38
  603. package/packages/session-export/dist/index.d.ts +0 -2
  604. package/packages/session-export/dist/index.js +0 -2
  605. package/packages/session-export/dist/types.d.ts +0 -20
  606. package/packages/session-export/dist/types.js +0 -5
  607. package/packages/subscription-engine/dist/engine.d.ts +0 -13
  608. package/packages/subscription-engine/dist/engine.js +0 -40
  609. package/packages/subscription-engine/dist/index.d.ts +0 -2
  610. package/packages/subscription-engine/dist/index.js +0 -2
  611. package/packages/subscription-engine/dist/subscriptions.d.ts +0 -19
  612. package/packages/subscription-engine/dist/subscriptions.js +0 -32
  613. package/packages/subscription-engine/dist/types.d.ts +0 -24
  614. package/packages/subscription-engine/dist/types.js +0 -5
  615. package/packages/trajectory/test/store.test.d.ts +0 -2
  616. package/packages/workflow-events/dist/events.d.ts +0 -38
  617. package/packages/workflow-events/dist/events.js +0 -46
  618. package/packages/workflow-events/dist/index.d.ts +0 -2
  619. package/packages/workflow-events/dist/index.js +0 -2
  620. package/packages/workflow-events/dist/pipeline.d.ts +0 -21
  621. package/packages/workflow-events/dist/pipeline.js +0 -27
  622. package/packages/workflow-events/dist/types.d.ts +0 -110
  623. package/packages/workflow-events/dist/types.js +0 -5
  624. package/packages/workflow-events/src/types.d.ts +0 -110
@@ -0,0 +1,100 @@
1
+ /**
2
+ * The risk facts of a pending question.
3
+ *
4
+ * The autonomous decision is only as safe as the facts it is based on: a
5
+ * question that asks for permission for a destructive or irreversible
6
+ * action must never be approved while the user is away. The facts are
7
+ * derived deterministically from the question the agent asked and from the
8
+ * kind of the question - never from a guess.
9
+ *
10
+ * The classifier is deliberately conservative: an uncertain case is
11
+ * classified as "needs an explicit authorization", so the deterministic
12
+ * policy waits for a human instead of continuing the work.
13
+ */
14
+ /**
15
+ * Words that name an action that destroys, drops or overwrites something.
16
+ */
17
+ const DESTRUCTIVE_PATTERNS = [
18
+ { name: "delete", pattern: /\b(delete|remove|drop|truncate|wipe|purge|destroy|erase)\b/ },
19
+ { name: "reset", pattern: /\b(reset|rollback|revert)\b/ },
20
+ { name: "revoke", pattern: /\b(revoke|rotate|invalidate)\b/ },
21
+ { name: "force-push", pattern: /\b(force[\s-]?push|push\s+(--force|-f\b)|reset\s+--hard|clean\s+-\w*f)\b/ },
22
+ { name: "drop-object", pattern: /\bdrop\s+(table|database|schema|collection|index|bucket)\b/ },
23
+ { name: "delete-object", pattern: /\bdelete\s+(the\s+)?(database|table|file|folder|branch|tag|user|account|volume|key)\b/ },
24
+ { name: "terminate", pattern: /\b(terminate|kill|shutdown|stop)\b/ },
25
+ { name: "overwrite", pattern: /\boverwrite\b/ },
26
+ ];
27
+ /**
28
+ * Words that name an action that reaches the outside world.
29
+ */
30
+ const EXTERNAL_PATTERNS = [
31
+ { name: "production", pattern: /\b(production|prod|live)\b/ },
32
+ { name: "deploy", pattern: /\b(deploy|publish|release|ship)\b/ },
33
+ { name: "merge-main", pattern: /\bmerge\b.*\b(main|master|develop)\b/ },
34
+ { name: "notify-people", pattern: /\b(send|post|notify|email|message|announce)\b.*\b(users|customers|clients|everyone|subscribers|team|customer)\b/ },
35
+ { name: "money", pattern: /\b(payment|purchase|order|invoice|charge|refund|spend|billing)\b/ },
36
+ ];
37
+ /**
38
+ * Words that name a secret or a credential.
39
+ */
40
+ const SENSITIVE_PATTERNS = [
41
+ { name: "credentials", pattern: /\b(secret|credential|api[\s-]?key|token|password)\b/ },
42
+ ];
43
+ function matchPatterns(text, patterns, signals) {
44
+ let matched = false;
45
+ for (const { name, pattern } of patterns) {
46
+ if (pattern.test(text)) {
47
+ signals.push(name);
48
+ matched = true;
49
+ }
50
+ }
51
+ return matched;
52
+ }
53
+ /**
54
+ * Derive the risk facts of a pending question.
55
+ *
56
+ * The rules:
57
+ *
58
+ * - A question that asks for permission for a concrete action ("approval",
59
+ * "explicit") needs the explicit authorization of a human. Jev never
60
+ * approves it on its own.
61
+ * - A question that names a destructive action is destructive, and its
62
+ * reversibility cannot be proven - so it waits.
63
+ * - A question with an unknown kind or an empty text is uncertain, and an
64
+ * uncertain case waits for the human.
65
+ * - Only a routine question without a destructive or external signal is
66
+ * harmless enough for an autonomous decision.
67
+ */
68
+ export function classifyQuestionRisk(input) {
69
+ const text = (input.text ?? "").toLowerCase();
70
+ const kind = input.kind;
71
+ const signals = [];
72
+ const destructive = matchPatterns(text, DESTRUCTIVE_PATTERNS, signals);
73
+ const external = matchPatterns(text, EXTERNAL_PATTERNS, signals);
74
+ const sensitive = matchPatterns(text, SENSITIVE_PATTERNS, signals);
75
+ // The agent asked for permission for a concrete action.
76
+ let requiresExplicitAuthorization = kind === "approval" || kind === "explicit";
77
+ // A destructive action never gets an autonomous approval.
78
+ if (destructive) {
79
+ requiresExplicitAuthorization = true;
80
+ }
81
+ // An action that reaches the outside world or touches a secret needs a
82
+ // human as well.
83
+ if (external || sensitive) {
84
+ requiresExplicitAuthorization = true;
85
+ }
86
+ // Unknown kind or unknown text: the action cannot be judged.
87
+ if (!kind || !text.trim()) {
88
+ requiresExplicitAuthorization = true;
89
+ signals.push("unknown-question");
90
+ }
91
+ return {
92
+ requiresExplicitAuthorization,
93
+ destructive,
94
+ // A destructive action is not provably reversible.
95
+ reversible: !destructive,
96
+ external,
97
+ signals,
98
+ };
99
+ }
100
+ //# sourceMappingURL=question-risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"question-risk.js","sourceRoot":"","sources":["../src/question-risk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoCH;;GAEG;AACH,MAAM,oBAAoB,GAAkB;IAC3C,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,4DAA4D,EAAE;IACzF,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,6BAA6B,EAAE;IACzD,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gCAAgC,EAAE;IAC7D,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,0EAA0E,EAAE;IAC3G,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,4DAA4D,EAAE;IAC9F,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,uFAAuF,EAAE;IAC3H,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,oCAAoC,EAAE;IACpE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE;CAC/C,CAAC;AAEF;;GAEG;AACH,MAAM,iBAAiB,GAAkB;IACxC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,4BAA4B,EAAE;IAC7D,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mCAAmC,EAAE;IAChE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,sCAAsC,EAAE;IACvE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,iHAAiH,EAAE;IACrJ,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,kEAAkE,EAAE;CAC9F,CAAC;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAkB;IACzC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,qDAAqD,EAAE;CACvF,CAAC;AAEF,SAAS,aAAa,CACrB,IAAY,EACZ,QAAuB,EACvB,OAAiB;IAEjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,GAAG,IAAI,CAAC;QAChB,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CACnC,KAAwB;IAExB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEnE,wDAAwD;IACxD,IAAI,6BAA6B,GAChC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,UAAU,CAAC;IAE5C,0DAA0D;IAC1D,IAAI,WAAW,EAAE,CAAC;QACjB,6BAA6B,GAAG,IAAI,CAAC;IACtC,CAAC;IAED,uEAAuE;IACvE,iBAAiB;IACjB,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC3B,6BAA6B,GAAG,IAAI,CAAC;IACtC,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,6BAA6B,GAAG,IAAI,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACN,6BAA6B;QAC7B,WAAW;QACX,mDAAmD;QACnD,UAAU,EAAE,CAAC,WAAW;QACxB,QAAQ;QACR,OAAO;KACP,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-harness/jev-judge",
3
- "version": "1.1.397",
3
+ "version": "1.1.402",
4
4
  "description": "Jev Judge - Structured decision model for agent routing, E2E testing, and automated decisions",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -23,13 +23,261 @@ export interface TaskState {
23
23
  userResponded: boolean;
24
24
  lastUserActivity?: Date;
25
25
  sessionStartTime: Date;
26
+ /** The bounded decision context (question, risk, task state). */
27
+ context?: DecisionContext;
28
+ }
29
+
30
+ /**
31
+ * The typed outcome of a decision.
32
+ *
33
+ * It is not the same shape as a human answer: an autonomous decision is
34
+ * never reported as a user "yes".
35
+ */
36
+ export type DecisionOutcome =
37
+ | "approve"
38
+ | "reject"
39
+ | "wait"
40
+ | "proceed_with_caution";
41
+
42
+ /**
43
+ * The pending question Jev has to decide about.
44
+ *
45
+ * Without it Jev can only see progress, not what the agent asked permission
46
+ * to do.
47
+ */
48
+ export interface PendingQuestionContext {
49
+ /** The canonical request ID. */
50
+ requestId: string;
51
+ /** The complete question text. */
52
+ text: string;
53
+ /** The detected kind of the question. */
54
+ kind: "routine" | "approval" | "clarification" | "explicit";
55
+ /** The exact action the agent proposes. */
56
+ proposedAction?: string;
57
+ /** What happens when the question is approved. */
58
+ consequence?: string;
59
+ /** Does the action need an explicit human authorization? */
60
+ requiresExplicitAuthorization?: boolean;
61
+ /** Does the action destroy or overwrite something? */
62
+ destructive?: boolean;
63
+ /** Does the action leave the machine (network, mail, deploy)? */
64
+ external?: boolean;
65
+ /** Can the action be undone? */
66
+ reversible?: boolean;
67
+ }
68
+
69
+ /**
70
+ * The bounded context of a decision.
71
+ *
72
+ * Everything is bounded on purpose: an unbounded todo transcript makes the
73
+ * evaluation input large and expensive without making it better.
74
+ */
75
+ export interface DecisionContext {
76
+ question?: PendingQuestionContext;
77
+ /** The task the session is working on right now. */
78
+ currentTask?: string;
79
+ /** 0..1 */
80
+ completionRatio?: number;
81
+ totalTasks?: number;
82
+ completedTasks?: number;
83
+ /** What blocks the work. */
84
+ blockers?: string[];
85
+ /** The next relevant tasks. */
86
+ nextTasks?: string[];
87
+ /** The state of the last validation run. */
88
+ validationStatus?: string;
89
+ /** How long the question is already waiting. */
90
+ waitedMinutes?: number;
91
+ /** When the decision has to be made. */
92
+ deadlineMinutes?: number;
93
+ /** When the user was last active. */
94
+ lastUserActivity?: Date;
95
+ }
96
+
97
+ /** How many task titles reach the evaluation. */
98
+ export const MAX_LISTED_TASKS = 10;
99
+ /** How much of the question text reaches the evaluation. */
100
+ export const MAX_QUESTION_CHARS = 2000;
101
+
102
+ /**
103
+ * The deterministic part of a decision.
104
+ *
105
+ * Jev proposes an outcome, this function decides what is actually allowed.
106
+ * The rules live in code and not in a prompt: a clarification is never
107
+ * turned into an approval of a guessed interpretation, and an action that
108
+ * needs an explicit human authorization or that cannot be undone is never
109
+ * approved autonomously.
110
+ */
111
+ export interface DecisionPolicyResult {
112
+ outcome: DecisionOutcome;
113
+ /** The rule that changed the outcome, when one did. */
114
+ appliedRule?: string;
115
+ reason: string;
116
+ }
117
+
118
+ export interface DecisionPolicyOptions {
119
+ /** The confidence an autonomous approval needs. */
120
+ confidenceThreshold?: number;
121
+ /** The confidence of the proposed outcome. */
122
+ confidence?: number;
123
+ }
124
+
125
+ /**
126
+ * Is the value a known outcome?
127
+ *
128
+ * The evaluation returns the outcome as a free-text choice: an unknown
129
+ * value is ignored instead of being guessed.
130
+ */
131
+ export function isDecisionOutcome(value: unknown): value is DecisionOutcome {
132
+ return (
133
+ value === "approve" ||
134
+ value === "reject" ||
135
+ value === "wait" ||
136
+ value === "proceed_with_caution"
137
+ );
138
+ }
139
+
140
+ /**
141
+ * Combine the threshold outcome with the structured outcome of the
142
+ * evaluation.
143
+ *
144
+ * The evaluation may only tighten the decision: a rejection stays a
145
+ * rejection, a wait stays a wait, and an approval never beats the
146
+ * thresholds.
147
+ */
148
+ export function tightenOutcome(
149
+ thresholdOutcome: DecisionOutcome,
150
+ proposed: DecisionOutcome | undefined,
151
+ ): DecisionOutcome {
152
+ if (!proposed) return thresholdOutcome;
153
+ if (proposed === "reject") return "reject";
154
+ if (proposed === "wait") return "wait";
155
+ if (proposed === "proceed_with_caution") {
156
+ return thresholdOutcome === "approve" ? "proceed_with_caution" : thresholdOutcome;
157
+ }
158
+ // The evaluation proposed an approval: the thresholds keep their veto.
159
+ return thresholdOutcome === "wait" ? "wait" : thresholdOutcome;
160
+ }
161
+
162
+ /**
163
+ * Are the risk facts of the proposed action unknown?
164
+ *
165
+ * A question without a kind and without a single known risk fact cannot be
166
+ * judged: the policy waits for the human instead of continuing on a guess.
167
+ */
168
+ export function hasUnknownRiskFacts(question: PendingQuestionContext): boolean {
169
+ if (!question.kind) return true;
170
+ return (
171
+ question.requiresExplicitAuthorization === undefined &&
172
+ question.destructive === undefined &&
173
+ question.reversible === undefined
174
+ );
175
+ }
176
+
177
+ export function applyDecisionPolicy(
178
+ proposed: DecisionOutcome,
179
+ context: DecisionContext | undefined,
180
+ options?: DecisionPolicyOptions,
181
+ ): DecisionPolicyResult {
182
+ const question = context?.question;
183
+
184
+ if (proposed === "approve" || proposed === "proceed_with_caution") {
185
+ if (question?.kind === "clarification") {
186
+ return {
187
+ outcome: "wait",
188
+ appliedRule: "clarification-never-approved",
189
+ reason:
190
+ "A clarification asks which option is meant. Guessing it would decide for the user.",
191
+ };
192
+ }
193
+
194
+ if (question?.requiresExplicitAuthorization) {
195
+ return {
196
+ outcome: "wait",
197
+ appliedRule: "explicit-authorization-required",
198
+ reason: "The action needs an explicit human authorization.",
199
+ };
200
+ }
201
+
202
+ if (question?.destructive && question.reversible === false) {
203
+ return {
204
+ outcome: "wait",
205
+ appliedRule: "irreversible-action",
206
+ reason: "The action cannot be undone, so it waits for the user.",
207
+ };
208
+ }
209
+
210
+ if (question?.destructive) {
211
+ return {
212
+ outcome: "proceed_with_caution",
213
+ appliedRule: "destructive-action",
214
+ reason: "The action is destructive but reversible, so it proceeds with caution.",
215
+ };
216
+ }
217
+
218
+ // Nothing is known about the risk of the action: an uncertain case
219
+ // waits for the human instead of continuing on a guess.
220
+ if (question && hasUnknownRiskFacts(question)) {
221
+ return {
222
+ outcome: "wait",
223
+ appliedRule: "unknown-risk-facts",
224
+ reason:
225
+ "The risk of the proposed action is unknown, so it waits for the user.",
226
+ };
227
+ }
228
+
229
+ const threshold = options?.confidenceThreshold ?? 0.7;
230
+ const confidence = options?.confidence;
231
+ if (typeof confidence === "number" && confidence < threshold) {
232
+ return {
233
+ outcome: "wait",
234
+ appliedRule: "confidence-below-threshold",
235
+ reason: `The confidence ${confidence.toFixed(2)} is below the threshold ${threshold.toFixed(2)}.`,
236
+ };
237
+ }
238
+ }
239
+
240
+ return { outcome: proposed, reason: "No policy rule applied." };
241
+ }
242
+
243
+ /**
244
+ * What the runtime does with a Jev outcome.
245
+ *
246
+ * - `continue`: the work resumes with a steer to the agent.
247
+ * - `pause`: the work stops and waits for a human.
248
+ * - `discard`: the decision was stale and must not change anything.
249
+ * - `wait`: the question stays open for a later decision.
250
+ */
251
+ export type OutcomeApplication = "continue" | "pause" | "discard" | "wait";
252
+
253
+ /**
254
+ * Decide what a Jev outcome means for the running work.
255
+ *
256
+ * `requestClosed` tells whether the pending question was still open and
257
+ * could be closed with the Jev decision. A closed question is the only
258
+ * proof that nobody answered in the meantime: when the request was already
259
+ * answered by a human the Jev decision is stale, and a stale decision must
260
+ * never continue the work.
261
+ *
262
+ * The rule is deterministic: only a successfully closed request may continue
263
+ * or pause the work, and a rejection never continues it.
264
+ */
265
+ export function decideOutcomeApplication(
266
+ outcome: DecisionOutcome,
267
+ requestClosed: boolean,
268
+ ): OutcomeApplication {
269
+ if (outcome === "wait") return "wait";
270
+ if (!requestClosed) return "discard";
271
+ return outcome === "reject" ? "pause" : "continue";
26
272
  }
27
273
 
28
274
  /**
29
275
  * Auto-continue decision
30
276
  */
31
277
  export interface AutoContinueDecision {
32
- action: "proceed" | "wait" | "proceed_with_caution";
278
+ action: "proceed" | "wait" | "proceed_with_caution" | "reject";
279
+ /** The typed outcome after the policy was applied. */
280
+ outcome: DecisionOutcome;
33
281
  probability: number; // 0-1 confidence to proceed
34
282
  riskLevel: "minimal" | "low" | "medium" | "high" | "critical";
35
283
  reasoning: string;
@@ -37,6 +285,8 @@ export interface AutoContinueDecision {
37
285
  estimatedImpact: "minimal" | "moderate" | "significant" | "major";
38
286
  confidence: "high" | "medium" | "low";
39
287
  waitRecommendation?: number; // minutes to wait if action is "wait"
288
+ /** The policy rule that changed the outcome, when one did. */
289
+ policyApplied?: string;
40
290
  }
41
291
 
42
292
  /**
@@ -92,6 +342,19 @@ export class AutoContinueJudge {
92
342
 
93
343
  try {
94
344
  const result = await this.jev.evaluate(state, {
345
+ outcome: {
346
+ type: "choice",
347
+ instructions:
348
+ "The decision for the pending question. Reject it when the proposed action must not happen.",
349
+ options: ["approve", "proceed_with_caution", "wait", "reject"],
350
+ optionDescriptions: {
351
+ approve: "the agent may continue with the planned work",
352
+ proceed_with_caution:
353
+ "the agent may continue, but reports every significant step",
354
+ wait: "keep waiting for the user, the question stays open",
355
+ reject: "the proposed action must not happen, the work pauses",
356
+ },
357
+ },
95
358
  shouldProceed: {
96
359
  type: "noul",
97
360
  instructions:
@@ -153,11 +416,52 @@ export class AutoContinueJudge {
153
416
  },
154
417
  });
155
418
 
156
- return this.buildDecision(result, taskState);
419
+ return this.applyPolicy(this.buildDecision(result, taskState), taskState);
157
420
  } catch (error) {
158
421
  logError("[AutoContinueJudge]", `Jev call failed: ${error}`);
159
- return this.fallbackDecision(taskState);
422
+ return this.applyPolicy(this.fallbackDecision(taskState), taskState);
423
+ }
424
+ }
425
+
426
+ /**
427
+ * Apply the deterministic policy to a proposed decision.
428
+ *
429
+ * The policy is code, not a prompt: it decides what is actually allowed,
430
+ * and it records which rule changed the outcome.
431
+ */
432
+ private applyPolicy(
433
+ decision: AutoContinueDecision,
434
+ taskState: TaskState,
435
+ ): AutoContinueDecision {
436
+ const policy = applyDecisionPolicy(decision.outcome, taskState.context, {
437
+ confidenceThreshold: this.config.proceedThreshold,
438
+ confidence: decision.probability,
439
+ });
440
+
441
+ decision.outcome = policy.outcome;
442
+
443
+ if (policy.appliedRule) {
444
+ decision.policyApplied = policy.appliedRule;
445
+ decision.reasoning = `${decision.reasoning} - ${policy.reason}`;
160
446
  }
447
+
448
+ if (policy.outcome === "wait" && decision.action !== "wait") {
449
+ decision.action = "wait";
450
+ decision.waitRecommendation =
451
+ decision.waitRecommendation ?? this.config.maxWaitMinutes;
452
+ }
453
+
454
+ if (policy.outcome === "proceed_with_caution" && decision.action === "proceed") {
455
+ decision.action = "proceed_with_caution";
456
+ }
457
+
458
+ // A rejection is never downgraded: the work pauses and waits for a
459
+ // human.
460
+ if (policy.outcome === "reject") {
461
+ decision.action = "reject";
462
+ }
463
+
464
+ return decision;
161
465
  }
162
466
 
163
467
  /**
@@ -169,7 +473,8 @@ export class AutoContinueJudge {
169
473
  const result = await this.decide(taskState);
170
474
 
171
475
  return {
172
- shouldContinue: result.action !== "wait",
476
+ shouldContinue:
477
+ result.action === "proceed" || result.action === "proceed_with_caution",
173
478
  probability: result.probability,
174
479
  confidence: result.confidence,
175
480
  };
@@ -179,30 +484,7 @@ export class AutoContinueJudge {
179
484
  * Build state for Jev
180
485
  */
181
486
  private buildState(taskState: TaskState): string {
182
- const completionPercent = Math.round(
183
- (taskState.completedTasks.length / taskState.totalTasks) * 100
184
- );
185
-
186
- const state = {
187
- task_summary: {
188
- completed: taskState.completedTasks.length,
189
- remaining: taskState.remainingTasks.length,
190
- total: taskState.totalTasks,
191
- completion_percent: completionPercent,
192
- completed_list: taskState.completedTasks,
193
- remaining_list: taskState.remainingTasks,
194
- },
195
- user_status: {
196
- responded: taskState.userResponded,
197
- wait_time_minutes: taskState.waitTimeMinutes,
198
- last_activity: taskState.lastUserActivity?.toISOString() ?? "unknown",
199
- session_duration_minutes: Math.round(
200
- (Date.now() - taskState.sessionStartTime.getTime()) / 60000
201
- ),
202
- },
203
- };
204
-
205
- return JSON.stringify(state, null, 2);
487
+ return JSON.stringify(buildDecisionState(taskState), null, 2);
206
488
  }
207
489
 
208
490
  /**
@@ -231,6 +513,15 @@ export class AutoContinueJudge {
231
513
 
232
514
  const waitBenefit = (result.decisions.waitBenefit?.response as { noul: number })?.noul ?? 0.5;
233
515
 
516
+ // The structured outcome of the evaluation. It can make the decision
517
+ // stricter (reject, wait) but never looser than the thresholds allow.
518
+ const outcomeChoice = (
519
+ result.decisions.outcome?.response as { choice?: string } | undefined
520
+ )?.choice;
521
+ const proposedOutcome = isDecisionOutcome(outcomeChoice)
522
+ ? outcomeChoice
523
+ : undefined;
524
+
234
525
  // Determine action based on thresholds
235
526
  let action: AutoContinueDecision["action"];
236
527
  let confidence: AutoContinueDecision["confidence"];
@@ -254,6 +545,31 @@ export class AutoContinueJudge {
254
545
  reasoning = `Waiting recommended (${((1 - probability) * 100).toFixed(0)}% confidence to wait)`;
255
546
  }
256
547
 
548
+ let outcome: DecisionOutcome =
549
+ action === "proceed"
550
+ ? "approve"
551
+ : action === "proceed_with_caution"
552
+ ? "proceed_with_caution"
553
+ : "wait";
554
+
555
+ // The outcome of the evaluation may only tighten the decision: a
556
+ // rejection stays a rejection, a wait stays a wait, and an approval
557
+ // never beats the thresholds.
558
+ outcome = tightenOutcome(outcome, proposedOutcome);
559
+ if (outcome === "reject") {
560
+ action = "reject";
561
+ confidence = probability > 0.85 ? "high" : "medium";
562
+ reasoning = `Jev rejected the proposed action (${(probability * 100).toFixed(0)}% confidence to proceed)`;
563
+ } else if (outcome === "wait" && proposedOutcome === "wait") {
564
+ action = "wait";
565
+ reasoning = "Jev decided to wait for the user";
566
+ } else if (outcome === "proceed_with_caution" && proposedOutcome === "proceed_with_caution") {
567
+ action = "proceed_with_caution";
568
+ } else if (proposedOutcome === "approve" && outcome === "wait") {
569
+ // The thresholds keep their veto: a low confidence stays a wait.
570
+ reasoning = `${reasoning} - Jev proposed an approval, the confidence stays below the threshold`;
571
+ }
572
+
257
573
  // Calculate recommended wait time
258
574
  let waitRecommendation: number | undefined;
259
575
  if (action === "wait") {
@@ -265,6 +581,7 @@ export class AutoContinueJudge {
265
581
 
266
582
  return {
267
583
  action,
584
+ outcome,
268
585
  probability,
269
586
  riskLevel,
270
587
  reasoning,
@@ -296,6 +613,7 @@ export class AutoContinueJudge {
296
613
  if (completionPercent >= 0.8 && taskState.waitTimeMinutes >= 15) {
297
614
  return {
298
615
  action: "proceed_with_caution",
616
+ outcome: "proceed_with_caution",
299
617
  probability: 0.6,
300
618
  riskLevel: "medium",
301
619
  reasoning: "Fallback: high completion, waited long time",
@@ -308,6 +626,7 @@ export class AutoContinueJudge {
308
626
 
309
627
  return {
310
628
  action: this.config.fallbackAction,
629
+ outcome: "wait",
311
630
  probability: 0.5,
312
631
  riskLevel: "medium",
313
632
  reasoning: "Fallback: Jev unavailable, using default behavior",
@@ -319,6 +638,82 @@ export class AutoContinueJudge {
319
638
  }
320
639
  }
321
640
 
641
+ /**
642
+ * Is the question old enough for an autonomous decision?
643
+ *
644
+ * The threshold belongs to the caller: the judge is only asked once the
645
+ * question waited long enough.
646
+ */
647
+ export function isEligibleForDecision(
648
+ waitedMinutes: number,
649
+ minWaitMinutes: number
650
+ ): boolean {
651
+ return waitedMinutes >= minWaitMinutes;
652
+ }
653
+
654
+ /**
655
+ * The bounded evaluation input of a decision.
656
+ *
657
+ * It carries the question Jev has to decide about, the risk of the proposed
658
+ * action and the relevant task state - and nothing that grows without a
659
+ * bound.
660
+ */
661
+ export function buildDecisionState(taskState: TaskState): Record<string, unknown> {
662
+ const completionPercent = Math.round(
663
+ (taskState.completedTasks.length / taskState.totalTasks) * 100
664
+ );
665
+
666
+ const context = taskState.context;
667
+ const question = context?.question;
668
+
669
+ return {
670
+ task_summary: {
671
+ completed: taskState.completedTasks.length,
672
+ remaining: taskState.remainingTasks.length,
673
+ total: taskState.totalTasks,
674
+ completion_percent: completionPercent,
675
+ // Bounded: the evaluation input stays small, the most recent
676
+ // completions and the first remaining tasks are the relevant ones.
677
+ completed_list: taskState.completedTasks.slice(-MAX_LISTED_TASKS),
678
+ remaining_list: taskState.remainingTasks.slice(0, MAX_LISTED_TASKS),
679
+ },
680
+ user_status: {
681
+ responded: taskState.userResponded,
682
+ wait_time_minutes: taskState.waitTimeMinutes,
683
+ last_activity: taskState.lastUserActivity?.toISOString() ?? "unknown",
684
+ session_duration_minutes: Math.round(
685
+ (Date.now() - taskState.sessionStartTime.getTime()) / 60000
686
+ ),
687
+ },
688
+ // The question Jev decides about. Without it Jev only sees progress.
689
+ pending_question: question
690
+ ? {
691
+ request_id: question.requestId,
692
+ kind: question.kind,
693
+ text: question.text.slice(0, MAX_QUESTION_CHARS),
694
+ proposed_action: question.proposedAction ?? "unknown",
695
+ consequence_of_approval: question.consequence ?? "unknown",
696
+ // The risk facts are unknown when they were not determined: an
697
+ // unknown fact is reported as unknown and never as "harmless".
698
+ requires_explicit_authorization:
699
+ question.requiresExplicitAuthorization ?? "unknown",
700
+ destructive: question.destructive ?? "unknown",
701
+ external_effect: question.external ?? "unknown",
702
+ reversible: question.reversible ?? "unknown",
703
+ }
704
+ : null,
705
+ decision_context: {
706
+ current_task: context?.currentTask ?? "unknown",
707
+ completion_ratio: context?.completionRatio ?? completionPercent / 100,
708
+ blockers: (context?.blockers ?? []).slice(0, MAX_LISTED_TASKS),
709
+ next_tasks: (context?.nextTasks ?? []).slice(0, MAX_LISTED_TASKS),
710
+ validation_status: context?.validationStatus ?? "unknown",
711
+ waited_minutes: context?.waitedMinutes ?? taskState.waitTimeMinutes,
712
+ deadline_minutes: context?.deadlineMinutes ?? null,
713
+ },
714
+ };
715
+ }
716
+
322
717
  /**
323
718
  * Helper: Create task state from todo list
324
719
  */
@@ -326,7 +721,8 @@ export function createTaskState(
326
721
  completedTasks: string[],
327
722
  remainingTasks: string[],
328
723
  lastUserActivity?: Date,
329
- sessionStartTime?: Date
724
+ sessionStartTime?: Date,
725
+ context?: DecisionContext
330
726
  ): TaskState {
331
727
  const totalTasks = completedTasks.length + remainingTasks.length;
332
728
 
@@ -340,5 +736,6 @@ export function createTaskState(
340
736
  userResponded: false,
341
737
  lastUserActivity,
342
738
  sessionStartTime: sessionStartTime ?? new Date(),
739
+ context,
343
740
  };
344
741
  }
@@ -697,6 +697,10 @@ export { DecisionEngine } from "./decision-engine.js";
697
697
  export { AutoContinueJudge, createTaskState } from "./auto-continue.js";
698
698
  export type { TaskState, AutoContinueDecision, AutoContinueConfig } from "./auto-continue.js";
699
699
 
700
+ // Export the deterministic risk classifier of a pending question
701
+ export { classifyQuestionRisk } from "./question-risk.js";
702
+ export type { QuestionRiskFacts, QuestionRiskInput } from "./question-risk.js";
703
+
700
704
  // Export WrapUpJudge
701
705
  export { checkWrapUp, getTodoSummary } from "./wrap-up-judge.js";
702
706
  export type { WrapUpResult } from "./wrap-up-judge.js";