ummaya 0.2.3 → 0.2.5

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 (534) hide show
  1. package/README.md +17 -3
  2. package/bin/ummaya +10 -1
  3. package/npm-shrinkwrap.json +253 -2
  4. package/package.json +5 -1
  5. package/prompts/manifest.yaml +2 -2
  6. package/prompts/session_guidance_v1.md +3 -1
  7. package/prompts/system_v1.md +9 -7
  8. package/pyproject.toml +26 -7
  9. package/specs/2803-document-production-hardening/contracts/document-tools.schema.json +1043 -0
  10. package/src/ummaya/_canonical/__init__.py +2 -0
  11. package/src/ummaya/context/builder.py +17 -11
  12. package/src/ummaya/engine/engine.py +30 -113
  13. package/src/ummaya/engine/query.py +20 -0
  14. package/src/ummaya/evidence/__init__.py +44 -0
  15. package/src/ummaya/evidence/__main__.py +7 -0
  16. package/src/ummaya/evidence/dataset_contract.py +193 -0
  17. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  18. package/src/ummaya/evidence/document_harness.py +313 -0
  19. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  20. package/src/ummaya/evidence/gates.py +70 -0
  21. package/src/ummaya/evidence/json_types.py +20 -0
  22. package/src/ummaya/evidence/models.py +145 -0
  23. package/src/ummaya/evidence/output_payload.py +89 -0
  24. package/src/ummaya/evidence/payload_documents.py +233 -0
  25. package/src/ummaya/evidence/route_contracts.py +224 -0
  26. package/src/ummaya/evidence/route_helpers.py +150 -0
  27. package/src/ummaya/evidence/runner.py +177 -0
  28. package/src/ummaya/evidence/source_provenance.py +246 -0
  29. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  30. package/src/ummaya/evidence/task_registry.py +264 -0
  31. package/src/ummaya/evidence/tool_layer.py +39 -0
  32. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  33. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  34. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  35. package/src/ummaya/ipc/frame_schema.py +52 -5
  36. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  37. package/src/ummaya/ipc/stdio.py +2282 -417
  38. package/src/ummaya/llm/client.py +234 -59
  39. package/src/ummaya/llm/config.py +8 -3
  40. package/src/ummaya/llm/reasoning.py +84 -0
  41. package/src/ummaya/primitives/__init__.py +6 -2
  42. package/src/ummaya/primitives/delegation.py +1 -1
  43. package/src/ummaya/primitives/document.py +28 -0
  44. package/src/ummaya/settings.py +0 -3
  45. package/src/ummaya/tools/discovery_bridge.py +34 -2
  46. package/src/ummaya/tools/documents/__init__.py +297 -0
  47. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  48. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  49. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  50. package/src/ummaya/tools/documents/authoring.py +283 -0
  51. package/src/ummaya/tools/documents/baselines.py +114 -0
  52. package/src/ummaya/tools/documents/capability.py +331 -0
  53. package/src/ummaya/tools/documents/contracts.py +112 -0
  54. package/src/ummaya/tools/documents/conversion.py +521 -0
  55. package/src/ummaya/tools/documents/diff.py +275 -0
  56. package/src/ummaya/tools/documents/engines.py +163 -0
  57. package/src/ummaya/tools/documents/evaluation.py +291 -0
  58. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  59. package/src/ummaya/tools/documents/fixtures.py +174 -0
  60. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  61. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  62. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  63. package/src/ummaya/tools/documents/formats/base.py +41 -0
  64. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  65. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  66. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  67. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  68. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  69. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  70. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  71. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  72. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  73. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  74. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  75. package/src/ummaya/tools/documents/inspection.py +289 -0
  76. package/src/ummaya/tools/documents/intake.py +1079 -0
  77. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  78. package/src/ummaya/tools/documents/models.py +1598 -0
  79. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  80. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  81. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  82. package/src/ummaya/tools/documents/patch.py +170 -0
  83. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  84. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  85. package/src/ummaya/tools/documents/permissions.py +110 -0
  86. package/src/ummaya/tools/documents/planner.py +616 -0
  87. package/src/ummaya/tools/documents/registry.py +2733 -0
  88. package/src/ummaya/tools/documents/render.py +978 -0
  89. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  90. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  91. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  92. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  93. package/src/ummaya/tools/documents/reread.py +157 -0
  94. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  95. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  96. package/src/ummaya/tools/documents/scorecard.py +184 -0
  97. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  98. package/src/ummaya/tools/documents/style.py +48 -0
  99. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  100. package/src/ummaya/tools/documents/validate.py +347 -0
  101. package/src/ummaya/tools/executor.py +61 -12
  102. package/src/ummaya/tools/geocoding/kakao_client.py +1 -2
  103. package/src/ummaya/tools/kma/apihub_catalog.py +984 -1
  104. package/src/ummaya/tools/kma/apihub_structured_adapter.py +86 -6
  105. package/src/ummaya/tools/kma/apihub_url_adapter.py +593 -0
  106. package/src/ummaya/tools/kma/apihub_url_catalog.py +296 -0
  107. package/src/ummaya/tools/live_proxy.py +0 -3
  108. package/src/ummaya/tools/location_adapters.py +8 -6
  109. package/src/ummaya/tools/manifest_metadata.py +16 -3
  110. package/src/ummaya/tools/models.py +5 -1
  111. package/src/ummaya/tools/mvp_surface.py +2 -2
  112. package/src/ummaya/tools/nmc/emergency_search.py +8 -6
  113. package/src/ummaya/tools/register_all.py +17 -0
  114. package/src/ummaya/tools/registry.py +10 -1
  115. package/src/ummaya/tools/resolve_location.py +4 -4
  116. package/src/ummaya/tools/routing/__init__.py +59 -0
  117. package/src/ummaya/tools/routing/builder.py +105 -0
  118. package/src/ummaya/tools/routing/cards.py +29 -0
  119. package/src/ummaya/tools/routing/decision_service.py +534 -0
  120. package/src/ummaya/tools/routing/decision_types.py +74 -0
  121. package/src/ummaya/tools/routing/feasibility.py +122 -0
  122. package/src/ummaya/tools/routing/intent.py +17 -0
  123. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  124. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  125. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  126. package/src/ummaya/tools/routing/intent_types.py +48 -0
  127. package/src/ummaya/tools/routing/lint.py +78 -0
  128. package/src/ummaya/tools/routing/metadata.py +174 -0
  129. package/src/ummaya/tools/routing/projection.py +340 -0
  130. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  131. package/src/ummaya/tools/routing/schema.py +81 -0
  132. package/src/ummaya/tools/routing/types.py +96 -0
  133. package/src/ummaya/tools/routing_index.py +2 -2
  134. package/src/ummaya/tools/search.py +40 -106
  135. package/src/ummaya/tools/verified_data_go_kr/_manifest.py +115 -25
  136. package/src/ummaya/tools/verified_data_go_kr/airkorea_air_quality.py +109 -4
  137. package/src/ummaya/tools/verified_data_go_kr/nmc_aed_site.py +108 -2
  138. package/src/ummaya/tools/verified_data_go_kr/pps_bid_public_info.py +174 -9
  139. package/src/ummaya/tools/verified_data_go_kr/tago_bus_arrival.py +66 -3
  140. package/src/ummaya/tools/verified_data_go_kr/tago_bus_location.py +12 -2
  141. package/src/ummaya/tools/verified_data_go_kr/tago_bus_route.py +8 -2
  142. package/src/ummaya/tools/verified_data_go_kr/tago_bus_route_station.py +114 -0
  143. package/src/ummaya/tools/verified_data_go_kr/tago_bus_station.py +14 -3
  144. package/src/ummaya/tools/verify_canonical_map.py +21 -0
  145. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  146. package/tui/package.json +1 -2
  147. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  148. package/tui/src/QueryEngine.ts +12 -4
  149. package/tui/src/bridge/inboundAttachments.ts +3 -3
  150. package/tui/src/cli/handlers/auth.ts +4 -13
  151. package/tui/src/cli/handlers/mcp.tsx +3 -3
  152. package/tui/src/cli/print.ts +69 -18
  153. package/tui/src/cli/update.ts +13 -13
  154. package/tui/src/commands/copy/index.ts +1 -1
  155. package/tui/src/commands/cost/cost.ts +2 -2
  156. package/tui/src/commands/init-verifiers.ts +5 -5
  157. package/tui/src/commands/init.ts +30 -30
  158. package/tui/src/commands/insights.ts +44 -44
  159. package/tui/src/commands/install-github-app/install-github-app.tsx +2 -2
  160. package/tui/src/commands/install-github-app/setupGitHubActions.ts +3 -3
  161. package/tui/src/commands/install-github-app/types.ts +8 -30
  162. package/tui/src/commands/install.tsx +5 -5
  163. package/tui/src/commands/mcp/addCommand.ts +5 -5
  164. package/tui/src/commands/mcp/xaaIdpCommand.ts +2 -2
  165. package/tui/src/commands/plugin/ManageMarketplaces.tsx +2 -2
  166. package/tui/src/commands/plugin/types.ts +6 -28
  167. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  168. package/tui/src/commands/reasoning/index.ts +13 -0
  169. package/tui/src/commands/reasoning/reasoning.tsx +177 -0
  170. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  171. package/tui/src/commands/thinkback/thinkback.tsx +3 -3
  172. package/tui/src/commands.ts +2 -0
  173. package/tui/src/components/Feedback.tsx +1 -1
  174. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  175. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  176. package/tui/src/components/Messages.tsx +2 -1
  177. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  178. package/tui/src/components/Spinner/types.ts +6 -28
  179. package/tui/src/components/Spinner.tsx +2 -2
  180. package/tui/src/components/agents/generateAgent.ts +1 -1
  181. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  182. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  183. package/tui/src/components/design-system/LoadingState.tsx +2 -2
  184. package/tui/src/components/mcp/types.ts +16 -38
  185. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  186. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  187. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  188. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  189. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  190. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  191. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  192. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  193. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  194. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  195. package/tui/src/components/primitive/index.tsx +43 -1
  196. package/tui/src/components/primitive/types.ts +137 -0
  197. package/tui/src/components/ui/option.ts +4 -26
  198. package/tui/src/constants/common.ts +0 -2
  199. package/tui/src/constants/prompts.ts +4 -3
  200. package/tui/src/constants/querySource.ts +4 -26
  201. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  202. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  203. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  204. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  205. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  206. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  207. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  208. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  209. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  210. package/tui/src/ink/ink.tsx +33 -14
  211. package/tui/src/ink/reconciler.ts +2 -3
  212. package/tui/src/ink/render-to-screen.ts +30 -10
  213. package/tui/src/ipc/bridge.ts +62 -15
  214. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  215. package/tui/src/ipc/codec.ts +29 -3
  216. package/tui/src/ipc/frames.generated.ts +407 -312
  217. package/tui/src/ipc/llmClient.ts +279 -76
  218. package/tui/src/ipc/llmTypes.ts +16 -1
  219. package/tui/src/ipc/schema/frame.schema.json +1 -3475
  220. package/tui/src/keybindings/defaultBindings.ts +4 -0
  221. package/tui/src/main.tsx +32 -11
  222. package/tui/src/native-ts/file-index/index.ts +33 -3
  223. package/tui/src/observability/surface.ts +2 -2
  224. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  225. package/tui/src/projectOnboardingState.ts +7 -6
  226. package/tui/src/query/chatMessageTypes.ts +18 -0
  227. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  228. package/tui/src/query/deps.ts +1 -1
  229. package/tui/src/query/messageGuards.ts +106 -0
  230. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  231. package/tui/src/query/run.ts +1075 -0
  232. package/tui/src/query/supportBoundary.ts +168 -0
  233. package/tui/src/query/toolResultErrors.ts +103 -0
  234. package/tui/src/query/toolRunner.ts +687 -0
  235. package/tui/src/query/unavailableToolRepair.ts +118 -0
  236. package/tui/src/query.ts +9 -1721
  237. package/tui/src/screens/REPL.tsx +42 -31
  238. package/tui/src/services/api/adapterManifest.ts +4 -0
  239. package/tui/src/services/api/backendChat/events.ts +117 -0
  240. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  241. package/tui/src/services/api/backendChat/frame.ts +9 -0
  242. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  243. package/tui/src/services/api/backendChat/types.ts +62 -0
  244. package/tui/src/services/api/backendChat.ts +1 -0
  245. package/tui/src/services/api/client.ts +98 -14
  246. package/tui/src/services/api/errorUtils.ts +5 -5
  247. package/tui/src/services/api/errors.ts +1 -1
  248. package/tui/src/services/api/logging.ts +1 -1
  249. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  250. package/tui/src/services/api/ummaya/messages.ts +255 -0
  251. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  252. package/tui/src/services/api/ummaya/provider.ts +200 -0
  253. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  254. package/tui/src/services/api/ummaya/request.ts +200 -0
  255. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  256. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  257. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  258. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  259. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  260. package/tui/src/services/api/ummaya/types.ts +110 -0
  261. package/tui/src/services/api/ummaya/usage.ts +30 -0
  262. package/tui/src/services/api/ummaya.ts +26 -364
  263. package/tui/src/services/api/withRetry.ts +1 -1
  264. package/tui/src/services/awaySummary.ts +2 -2
  265. package/tui/src/services/claudeAiLimits.ts +1 -1
  266. package/tui/src/services/compact/autoCompact.ts +1 -1
  267. package/tui/src/services/compact/compact.ts +1 -1
  268. package/tui/src/services/lsp/types.ts +8 -30
  269. package/tui/src/services/tips/types.ts +6 -28
  270. package/tui/src/services/tokenEstimation.ts +1 -1
  271. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  272. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  273. package/tui/src/services/tools/toolExecution.ts +94 -1
  274. package/tui/src/skills/bundled/stuck.ts +12 -12
  275. package/tui/src/state/AppStateStore.ts +7 -0
  276. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  277. package/tui/src/store/session-store.ts +10 -36
  278. package/tui/src/stubs/any-stub.ts +15 -10
  279. package/tui/src/stubs/color-diff-napi.ts +37 -23
  280. package/tui/src/stubs/globals.d.ts +3 -3
  281. package/tui/src/stubs/macro-preload.ts +23 -12
  282. package/tui/src/tools/AdapterTool/AdapterTool.ts +1239 -163
  283. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  284. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  285. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  286. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  287. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  288. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  289. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  290. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  291. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  292. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  293. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  294. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  295. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  296. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  297. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  298. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  299. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  300. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  301. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  302. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  303. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  304. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  305. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  306. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  307. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  308. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  309. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  310. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  311. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  312. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  313. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  314. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  315. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  316. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  317. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  318. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  319. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  320. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  321. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  322. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  323. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  324. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  325. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  326. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  327. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  328. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  329. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  330. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  331. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  332. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  333. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  334. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  335. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  336. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  337. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  338. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  339. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  340. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  341. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  342. package/tui/src/tools/BashTool/call.ts +202 -0
  343. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  344. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  345. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  346. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  347. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  348. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  349. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  350. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  351. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  352. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  353. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  354. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  355. package/tui/src/tools/BashTool/schemas.ts +65 -0
  356. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  357. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  358. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  359. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  360. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  361. package/tui/src/tools/BriefTool/upload.ts +1 -1
  362. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  363. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  364. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  365. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  366. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  367. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  368. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  369. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  370. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  371. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  372. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  373. package/tui/src/tools/FileEditTool/call.ts +228 -0
  374. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  375. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  376. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  377. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  378. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  379. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  380. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +48 -29
  381. package/tui/src/tools/LookupPrimitive/prompt.ts +6 -7
  382. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  383. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  384. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  385. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  386. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  387. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  388. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  389. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  390. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  391. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  392. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  393. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  394. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  395. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  396. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  397. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  398. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  399. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  400. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  401. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  402. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  403. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  404. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +30 -19
  405. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  406. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  407. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +51 -18
  408. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  409. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  410. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  411. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  412. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  413. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  414. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  415. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  416. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  417. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  418. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  419. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  420. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  421. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  422. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  423. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  424. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  425. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  426. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  427. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  428. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  429. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  430. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  431. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  432. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  433. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +27 -10
  434. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  435. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  436. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  437. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  438. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  439. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  440. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  441. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  442. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  443. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  444. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  445. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  446. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  447. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  448. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  449. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  450. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  451. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  452. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  453. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  454. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  455. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  456. package/tui/src/tools/_shared/citizenUserText.ts +49 -0
  457. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  458. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  459. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  460. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  461. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  462. package/tui/src/tools/_shared/locationInputRepair.ts +112 -0
  463. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  464. package/tui/src/tools/_shared/rootPrimitiveInput.ts +68 -0
  465. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  466. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  467. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  468. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  469. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  470. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  471. package/tui/src/tools/_shared/toolChoiceRepair.ts +61 -0
  472. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  473. package/tui/src/tools.ts +39 -190
  474. package/tui/src/types/fileSuggestion.ts +4 -26
  475. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  476. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  477. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  478. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  479. package/tui/src/types/message.ts +80 -102
  480. package/tui/src/types/messageQueueTypes.ts +6 -28
  481. package/tui/src/types/notebook.ts +16 -38
  482. package/tui/src/types/statusLine.ts +4 -26
  483. package/tui/src/types/tools.ts +24 -46
  484. package/tui/src/types/utils.ts +6 -28
  485. package/tui/src/upstreamproxy/relay.ts +7 -3
  486. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  487. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  488. package/tui/src/utils/attachments.ts +1 -1
  489. package/tui/src/utils/auth.ts +129 -139
  490. package/tui/src/utils/bash/ast.ts +23 -23
  491. package/tui/src/utils/bash/bashParser.ts +5 -5
  492. package/tui/src/utils/billing.ts +1 -1
  493. package/tui/src/utils/collapseReadSearch.ts +3 -3
  494. package/tui/src/utils/cronTasks.ts +1 -1
  495. package/tui/src/utils/execFileNoThrow.ts +1 -1
  496. package/tui/src/utils/filePersistence/types.ts +16 -38
  497. package/tui/src/utils/forkedAgent.ts +1 -1
  498. package/tui/src/utils/gracefulShutdown.ts +4 -4
  499. package/tui/src/utils/heapDumpService.ts +12 -8
  500. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  501. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  502. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  503. package/tui/src/utils/kExaoneReasoning.ts +138 -0
  504. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  505. package/tui/src/utils/messages.ts +19 -0
  506. package/tui/src/utils/migrateSessions.ts +3 -3
  507. package/tui/src/utils/model/model.ts +6 -6
  508. package/tui/src/utils/multiToolLayout.ts +13 -0
  509. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  510. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  511. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  512. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  513. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  514. package/tui/src/utils/processUserInput/processSlashCommand.tsx +2 -2
  515. package/tui/src/utils/processUserInput/processUserInput.ts +26 -0
  516. package/tui/src/utils/protectedNamespace.ts +5 -3
  517. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  518. package/tui/src/utils/ripgrep.ts +16 -7
  519. package/tui/src/utils/sessionTitle.ts +1 -1
  520. package/tui/src/utils/settings/applySettingsChange.ts +4 -0
  521. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  522. package/tui/src/utils/settings/types.ts +9 -3
  523. package/tui/src/utils/shell/prefix.ts +1 -1
  524. package/tui/src/utils/sideQuery.ts +1 -1
  525. package/tui/src/utils/stats.ts +1 -1
  526. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  527. package/tui/src/utils/teleport.tsx +1 -1
  528. package/uv.lock +394 -22
  529. package/assets/copilot-gate-logo.svg +0 -58
  530. package/assets/govon-logo.svg +0 -40
  531. package/src/ummaya/eval/__init__.py +0 -5
  532. package/src/ummaya/eval/retrieval.py +0 -713
  533. package/tui/src/services/api/claude.ts +0 -3510
  534. package/tui/src/utils/messageStream.ts +0 -186
@@ -36,7 +36,7 @@ export type ConnectionErrorDetails = {
36
36
 
37
37
  /**
38
38
  * Extracts connection error details from the error cause chain.
39
- * The Anthropic SDK wraps underlying errors in the `cause` property.
39
+ * The legacy SDK wraps underlying errors in the `cause` property.
40
40
  * This function walks the cause chain to find the root error code/message.
41
41
  */
42
42
  export function extractConnectionErrorDetails(
@@ -96,7 +96,7 @@ export function getSSLErrorHint(error: unknown): string | null {
96
96
  if (!details?.isSSLError) {
97
97
  return null
98
98
  }
99
- return `SSL certificate error (${details.code}). If you are behind a corporate proxy or TLS-intercepting firewall, set NODE_EXTRA_CA_CERTS to your CA bundle path, or ask IT to allowlist *.anthropic.com. Run /doctor for details.`
99
+ return `SSL certificate error (${details.code}). If you are behind a corporate proxy or TLS-intercepting firewall, set NODE_EXTRA_CA_CERTS to your CA bundle path, or ask IT to allowlist the configured UMMAYA provider endpoint. Run /doctor for details.`
100
100
  }
101
101
 
102
102
  /**
@@ -136,7 +136,7 @@ export function sanitizeAPIError(apiError: APIError): string {
136
136
  * The actual message lives at different nesting levels depending on the provider:
137
137
  *
138
138
  * - Bedrock/proxy: `{ error: { message: "..." } }`
139
- * - Standard Anthropic API: `{ error: { error: { message: "..." } } }`
139
+ * - Provider API: `{ error: { error: { message: "..." } } }`
140
140
  * (the outer `.error` is the response body, the inner `.error` is the API error)
141
141
  *
142
142
  * See also: `getErrorMessage` in `logging.ts` which handles the same shapes.
@@ -163,7 +163,7 @@ function hasNestedError(value: unknown): value is NestedAPIError {
163
163
  * a top-level `.message`.
164
164
  *
165
165
  * Checks two nesting levels (deeper first for specificity):
166
- * 1. `error.error.error.message` — standard Anthropic API shape
166
+ * 1. `error.error.error.message` — provider API shape
167
167
  * 2. `error.error.message` — Bedrock shape
168
168
  */
169
169
  function extractNestedErrorMessage(error: APIError): string | null {
@@ -176,7 +176,7 @@ function extractNestedErrorMessage(error: APIError): string | null {
176
176
  const narrowed: NestedAPIError = error
177
177
  const nested = narrowed.error
178
178
 
179
- // Standard Anthropic API shape: { error: { error: { message } } }
179
+ // Provider API shape: { error: { error: { message } } }
180
180
  const deepMsg = nested?.error?.message
181
181
  if (typeof deepMsg === 'string' && deepMsg.length > 0) {
182
182
  const sanitized = sanitizeMessageHTML(deepMsg)
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // SWAP/anti-anthropic-1p(2521): minimal stub for the byte-copied
3
- // services/api/claude.ts which references CC's Anthropic-API error envelopes.
3
+ // services/api/ummaya.ts which references CC's Anthropic-API error envelopes.
4
4
  // UMMAYA surfaces errors via the IPC ErrorFrame (Spec 032) and never reaches
5
5
  // these helpers. Stubs preserve the import shape only.
6
6
 
@@ -1,6 +1,6 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  // SWAP/anti-anthropic-1p(2521): minimal stub for the byte-copied
3
- // services/api/claude.ts which references CC's Anthropic-API request/response
3
+ // services/api/ummaya.ts which references CC's Anthropic-API request/response
4
4
  // telemetry. UMMAYA uses OTEL spans (Spec 021) and audit ledger (Spec 024)
5
5
  // instead. Stubs preserve the import shape; functions are no-ops because the
6
6
  // byte-copy has zero callers in UMMAYA.
@@ -0,0 +1,194 @@
1
+ import { createHash, randomUUID } from 'node:crypto'
2
+ import { appendFileSync, mkdirSync } from 'node:fs'
3
+ import { join } from 'node:path'
4
+ import { getSessionId } from '../../../bootstrap/state.js'
5
+ import {
6
+ appendRouteDiagnostic,
7
+ hashRouteDiagnosticText,
8
+ } from '../../../tools/AdapterTool/routeDiagnostics.js'
9
+ import { getUmmayaUserTierRoot } from '../../../utils/ummayaPaths.js'
10
+ import { logForDebugging } from '../../../utils/debug.js'
11
+ import { latestUserText } from './messages.js'
12
+ import type { QueryModelParams } from './types.js'
13
+
14
+ export type ProviderTurnEvidenceContext = {
15
+ readonly session_id: string
16
+ readonly correlation_id: string
17
+ readonly frame_hash: string
18
+ readonly query_hash: string
19
+ readonly query_source: string
20
+ readonly model: string
21
+ }
22
+
23
+ type ProviderTurnEvidenceEvent = 'provider_turn_start' | 'provider_turn_complete'
24
+
25
+ type ProviderTurnEvidenceRecord = ProviderTurnEvidenceContext & {
26
+ readonly schema_version: 'ummaya.tui.turn_evidence.v1'
27
+ readonly ts: string
28
+ readonly event: ProviderTurnEvidenceEvent
29
+ readonly source: 'provider_direct'
30
+ readonly sanitized: true
31
+ }
32
+
33
+ export function createProviderTurnEvidenceContext(
34
+ params: QueryModelParams,
35
+ ): ProviderTurnEvidenceContext {
36
+ const sessionId = getSessionId()
37
+ const correlationId = randomUUID()
38
+ const queryHash = hashRouteDiagnosticText(latestUserText(params.messages))
39
+ const querySource = params.options.querySource
40
+ const model = params.options.model
41
+ return {
42
+ session_id: sessionId,
43
+ correlation_id: correlationId,
44
+ frame_hash: hashFrame({
45
+ sessionId,
46
+ correlationId,
47
+ queryHash,
48
+ querySource,
49
+ model,
50
+ }),
51
+ query_hash: queryHash,
52
+ query_source: querySource,
53
+ model,
54
+ }
55
+ }
56
+
57
+ export function appendProviderTurnEvidence(
58
+ event: ProviderTurnEvidenceEvent,
59
+ context: ProviderTurnEvidenceContext,
60
+ ): void {
61
+ appendRouteDiagnostic(event, {
62
+ session_id: context.session_id,
63
+ correlation_id: context.correlation_id,
64
+ frame_hash: context.frame_hash,
65
+ query_hash: context.query_hash,
66
+ query_source: context.query_source,
67
+ model: context.model,
68
+ })
69
+
70
+ const memdirFile = evidenceFilePath(context.session_id)
71
+ if (memdirFile === null) return
72
+ const record: ProviderTurnEvidenceRecord = {
73
+ schema_version: 'ummaya.tui.turn_evidence.v1',
74
+ ts: new Date().toISOString(),
75
+ event,
76
+ source: 'provider_direct',
77
+ sanitized: true,
78
+ ...context,
79
+ }
80
+ try {
81
+ mkdirSync(join(getUmmayaUserTierRoot(), 'evidence', 'tui-turns'), {
82
+ recursive: true,
83
+ })
84
+ appendFileSync(memdirFile, `${JSON.stringify(record)}\n`, {
85
+ encoding: 'utf8',
86
+ mode: 0o600,
87
+ })
88
+ } catch (error) {
89
+ if (error instanceof Error) {
90
+ logForDebugging(`provider turn evidence write failed: ${error.message}`)
91
+ return
92
+ }
93
+ throw error
94
+ }
95
+ }
96
+
97
+ export function appendProviderOutputEvidence(
98
+ event: unknown,
99
+ context: ProviderTurnEvidenceContext,
100
+ ): void {
101
+ const summary = providerOutputSummary(event)
102
+ appendRouteDiagnostic('provider_output', {
103
+ session_id: context.session_id,
104
+ correlation_id: context.correlation_id,
105
+ frame_hash: context.frame_hash,
106
+ query_hash: context.query_hash,
107
+ query_source: context.query_source,
108
+ model: context.model,
109
+ output_type: summary.outputType,
110
+ stream_event_type: summary.streamEventType,
111
+ assistant_text_chars: summary.assistantTextChars,
112
+ assistant_tool_use_count: summary.assistantToolUseCount,
113
+ assistant_content_block_count: summary.assistantContentBlockCount,
114
+ is_api_error_message: summary.isApiErrorMessage,
115
+ })
116
+ }
117
+
118
+ function evidenceFilePath(sessionId: string): string | null {
119
+ if (!process.env.UMMAYA_MEMDIR_USER) return null
120
+ return join(getUmmayaUserTierRoot(), 'evidence', 'tui-turns', `${sessionId}.jsonl`)
121
+ }
122
+
123
+ function providerOutputSummary(event: unknown): {
124
+ readonly outputType: string
125
+ readonly streamEventType: string | null
126
+ readonly assistantTextChars: number
127
+ readonly assistantToolUseCount: number
128
+ readonly assistantContentBlockCount: number
129
+ readonly isApiErrorMessage: boolean
130
+ } {
131
+ if (!isRecord(event)) {
132
+ return emptyProviderOutputSummary('unknown')
133
+ }
134
+ const type = typeof event.type === 'string' ? event.type : 'unknown'
135
+ if (type === 'stream_event') {
136
+ const streamEvent = isRecord(event.event) ? event.event : {}
137
+ return {
138
+ ...emptyProviderOutputSummary(type),
139
+ streamEventType:
140
+ typeof streamEvent.type === 'string' ? streamEvent.type : null,
141
+ }
142
+ }
143
+ if (type !== 'assistant') {
144
+ return emptyProviderOutputSummary(type)
145
+ }
146
+ const message = isRecord(event.message) ? event.message : {}
147
+ const content = Array.isArray(message.content) ? message.content : []
148
+ let assistantTextChars = 0
149
+ let assistantToolUseCount = 0
150
+ for (const block of content) {
151
+ if (!isRecord(block)) continue
152
+ if (block.type === 'text' && typeof block.text === 'string') {
153
+ assistantTextChars += block.text.length
154
+ }
155
+ if (block.type === 'tool_use') {
156
+ assistantToolUseCount += 1
157
+ }
158
+ }
159
+ return {
160
+ outputType: type,
161
+ streamEventType: null,
162
+ assistantTextChars,
163
+ assistantToolUseCount,
164
+ assistantContentBlockCount: content.length,
165
+ isApiErrorMessage: event.isApiErrorMessage === true,
166
+ }
167
+ }
168
+
169
+ function emptyProviderOutputSummary(outputType: string) {
170
+ return {
171
+ outputType,
172
+ streamEventType: null,
173
+ assistantTextChars: 0,
174
+ assistantToolUseCount: 0,
175
+ assistantContentBlockCount: 0,
176
+ isApiErrorMessage: false,
177
+ }
178
+ }
179
+
180
+ function isRecord(value: unknown): value is Record<string, unknown> {
181
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
182
+ }
183
+
184
+ function hashFrame(payload: {
185
+ readonly sessionId: string
186
+ readonly correlationId: string
187
+ readonly queryHash: string
188
+ readonly querySource: string
189
+ readonly model: string
190
+ }): string {
191
+ return createHash('sha256')
192
+ .update(JSON.stringify(payload), 'utf8')
193
+ .digest('hex')
194
+ }
@@ -0,0 +1,255 @@
1
+ import type { Message } from '../../../types/message.js'
2
+ import type { SystemPrompt } from '../../../utils/systemPromptType.js'
3
+ import type { OpenAIMessage, OpenAIToolCall } from './types.js'
4
+
5
+ type CacheControl = {
6
+ readonly type: 'ephemeral'
7
+ readonly scope?: 'global' | 'org'
8
+ readonly ttl?: '5m' | '1h'
9
+ }
10
+
11
+ function isRecord(value: unknown): value is Record<string, unknown> {
12
+ return typeof value === 'object' && value !== null && !Array.isArray(value)
13
+ }
14
+
15
+ function textFromContent(content: unknown): string {
16
+ if (typeof content === 'string') return content
17
+ if (!Array.isArray(content)) return ''
18
+ return content
19
+ .filter(isRecord)
20
+ .filter(block => block.type === 'text' && typeof block.text === 'string')
21
+ .map(block => String(block.text))
22
+ .join('')
23
+ }
24
+
25
+ type ToolUseBlock = {
26
+ readonly type: 'tool_use'
27
+ readonly id: string
28
+ readonly name: string
29
+ readonly input?: unknown
30
+ }
31
+
32
+ type ToolResultBlock = {
33
+ readonly type: 'tool_result'
34
+ readonly tool_use_id: string
35
+ readonly content?: unknown
36
+ }
37
+
38
+ function asToolUseBlock(value: unknown): ToolUseBlock | undefined {
39
+ if (!isRecord(value)) return undefined
40
+ if (value.type !== 'tool_use') return undefined
41
+ if (typeof value.id !== 'string' || value.id.length === 0) return undefined
42
+ if (typeof value.name !== 'string' || value.name.length === 0) return undefined
43
+ return {
44
+ type: 'tool_use',
45
+ id: value.id,
46
+ name: value.name,
47
+ input: value.input,
48
+ }
49
+ }
50
+
51
+ function asToolResultBlock(value: unknown): ToolResultBlock | undefined {
52
+ if (!isRecord(value)) return undefined
53
+ if (value.type !== 'tool_result') return undefined
54
+ if (typeof value.tool_use_id !== 'string' || value.tool_use_id.length === 0) {
55
+ return undefined
56
+ }
57
+ return {
58
+ type: 'tool_result',
59
+ tool_use_id: value.tool_use_id,
60
+ content: value.content,
61
+ }
62
+ }
63
+
64
+ function serializeToolUseInput(input: unknown): string {
65
+ if (typeof input === 'string') return input
66
+ if (input === undefined || input === null) return '{}'
67
+ try {
68
+ return JSON.stringify(input)
69
+ } catch {
70
+ return '{}'
71
+ }
72
+ }
73
+
74
+ function serializeToolResultContent(content: unknown): string {
75
+ if (typeof content === 'string') return content
76
+ if (content === undefined || content === null) return ''
77
+ try {
78
+ return JSON.stringify(content)
79
+ } catch {
80
+ return String(content)
81
+ }
82
+ }
83
+
84
+ function findToolNameForResult(
85
+ toolUseId: string,
86
+ emittedMessages: readonly OpenAIMessage[],
87
+ ): string | undefined {
88
+ for (let index = emittedMessages.length - 1; index >= 0; index -= 1) {
89
+ const message = emittedMessages[index]
90
+ if (message?.role !== 'assistant') continue
91
+ for (const toolCall of message.tool_calls ?? []) {
92
+ if (toolCall.id === toolUseId) return toolCall.function.name
93
+ }
94
+ }
95
+ return undefined
96
+ }
97
+
98
+ function collectToolResultIds(messages: readonly Message[]): ReadonlySet<string> {
99
+ const toolResultIds = new Set<string>()
100
+ for (const message of messages) {
101
+ if (message.type !== 'user') continue
102
+ const content = message.message.content
103
+ if (!Array.isArray(content)) continue
104
+ for (const block of content) {
105
+ const toolResult = asToolResultBlock(block)
106
+ if (toolResult !== undefined) toolResultIds.add(toolResult.tool_use_id)
107
+ }
108
+ }
109
+ return toolResultIds
110
+ }
111
+
112
+ function transcriptMessageToOpenAIMessages(
113
+ message: Message,
114
+ emittedMessages: readonly OpenAIMessage[],
115
+ matchedToolResultIds: ReadonlySet<string>,
116
+ ): readonly OpenAIMessage[] {
117
+ if (message.type !== 'user' && message.type !== 'assistant') return []
118
+ const content = message.message.content
119
+ if (typeof content === 'string') {
120
+ return content.length > 0 ? [{ role: message.type, content }] : []
121
+ }
122
+ if (!Array.isArray(content)) return []
123
+
124
+ if (message.type === 'user') {
125
+ const out: OpenAIMessage[] = []
126
+ const textContent = textFromContent(content)
127
+ for (const block of content) {
128
+ const toolResult = asToolResultBlock(block)
129
+ if (toolResult === undefined) continue
130
+ const toolName = findToolNameForResult(toolResult.tool_use_id, emittedMessages)
131
+ if (toolName === undefined) continue
132
+ out.push({
133
+ role: 'tool',
134
+ name: toolName,
135
+ tool_call_id: toolResult.tool_use_id,
136
+ content: serializeToolResultContent(toolResult.content),
137
+ })
138
+ }
139
+ if (textContent.length > 0) {
140
+ out.push({ role: 'user', content: textContent })
141
+ }
142
+ return out
143
+ }
144
+
145
+ const toolCalls: OpenAIToolCall[] = []
146
+ for (const block of content) {
147
+ const toolUse = asToolUseBlock(block)
148
+ if (toolUse === undefined) continue
149
+ if (!matchedToolResultIds.has(toolUse.id)) continue
150
+ toolCalls.push({
151
+ id: toolUse.id,
152
+ type: 'function',
153
+ function: {
154
+ name: toolUse.name,
155
+ arguments: serializeToolUseInput(toolUse.input),
156
+ },
157
+ })
158
+ }
159
+
160
+ const textContent = textFromContent(content)
161
+ if (toolCalls.length > 0) {
162
+ return [{ role: 'assistant', content: textContent, tool_calls: toolCalls }]
163
+ }
164
+ return textContent.length > 0 ? [{ role: 'assistant', content: textContent }] : []
165
+ }
166
+
167
+ export function systemPromptText(systemPrompt: SystemPrompt): string {
168
+ return Array.from(systemPrompt).join('\n')
169
+ }
170
+
171
+ export function latestUserText(messages: readonly Message[]): string {
172
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
173
+ const message = messages[index]
174
+ if (message?.type === 'user' && message.isMeta !== true) {
175
+ const text = textFromContent(message.message.content).trim()
176
+ if (text.length > 0) return text
177
+ }
178
+ }
179
+ return ''
180
+ }
181
+
182
+ export function transcriptToOpenAIMessages(
183
+ messages: readonly Message[],
184
+ systemPrompt: SystemPrompt,
185
+ extraSystemInstruction?: string,
186
+ ): readonly OpenAIMessage[] {
187
+ const out: OpenAIMessage[] = [
188
+ {
189
+ role: 'system',
190
+ content: [systemPromptText(systemPrompt), extraSystemInstruction]
191
+ .filter(Boolean)
192
+ .join('\n\n'),
193
+ },
194
+ ]
195
+ const matchedToolResultIds = collectToolResultIds(messages)
196
+ for (const message of messages) {
197
+ out.push(...transcriptMessageToOpenAIMessages(message, out, matchedToolResultIds))
198
+ }
199
+ return out
200
+ }
201
+
202
+ export function getPromptCachingEnabled(_model: string): boolean {
203
+ return false
204
+ }
205
+
206
+ export function getCacheControl(
207
+ _params: { readonly scope?: 'global' | 'org'; readonly querySource?: string } = {},
208
+ ): CacheControl {
209
+ return { type: 'ephemeral' }
210
+ }
211
+
212
+ export function userMessageToMessageParam(
213
+ message: Message,
214
+ _addCache = false,
215
+ _enablePromptCaching = false,
216
+ _querySource?: string,
217
+ ): OpenAIMessage {
218
+ return { role: 'user', content: textFromContent(message.message.content) }
219
+ }
220
+
221
+ export function assistantMessageToMessageParam(
222
+ message: Message,
223
+ _addCache = false,
224
+ _enablePromptCaching = false,
225
+ _querySource?: string,
226
+ ): OpenAIMessage {
227
+ return { role: 'assistant', content: textFromContent(message.message.content) }
228
+ }
229
+
230
+ export function stripExcessMediaItems<T>(
231
+ messages: readonly T[],
232
+ _limit: number,
233
+ ): readonly T[] {
234
+ return messages
235
+ }
236
+
237
+ export function addCacheBreakpoints<T>(
238
+ messages: readonly T[],
239
+ _enablePromptCaching: boolean,
240
+ _querySource?: string,
241
+ _useCachedMC = false,
242
+ _newCacheEdits?: unknown,
243
+ _pinnedEdits?: unknown,
244
+ _skipCacheWrite = false,
245
+ ): readonly T[] {
246
+ return messages
247
+ }
248
+
249
+ export function buildSystemPromptBlocks(
250
+ systemPrompt: SystemPrompt,
251
+ _enablePromptCaching: boolean,
252
+ _options?: unknown,
253
+ ): readonly { readonly text: string }[] {
254
+ return [{ text: systemPromptText(systemPrompt) }]
255
+ }
@@ -0,0 +1,66 @@
1
+ import { createAssistantMessage } from '../../../utils/messages.js'
2
+ import { createUserMessage } from '../../../utils/userMessageFactories.js'
3
+ import { asSystemPrompt } from '../../../utils/systemPromptType.js'
4
+ import { EMPTY_USAGE } from './types.js'
5
+ import type { QueryModelParams } from './types.js'
6
+
7
+ export const MAX_NON_STREAMING_TOKENS = 64_000
8
+
9
+ export function adjustParamsForNonStreaming<T>(
10
+ params: T,
11
+ _maxTokensCap: number,
12
+ ): T {
13
+ return params
14
+ }
15
+
16
+ export async function* executeNonStreamingRequest(
17
+ _clientOptions: unknown,
18
+ _retryOptions: unknown,
19
+ _paramsFromContext: unknown,
20
+ _onAttempt?: unknown,
21
+ _captureRequest?: unknown,
22
+ ): AsyncGenerator<unknown> {
23
+ yield createAssistantMessage({ content: '' })
24
+ }
25
+
26
+ export async function queryModelWithoutStreaming(
27
+ params: QueryModelParams,
28
+ ): Promise<unknown> {
29
+ const events: unknown[] = []
30
+ const { queryModelWithStreaming } = await import('./provider.js')
31
+ for await (const event of queryModelWithStreaming(params)) {
32
+ events.push(event)
33
+ }
34
+ return events.find(
35
+ event =>
36
+ typeof event === 'object' &&
37
+ event !== null &&
38
+ 'type' in event &&
39
+ event.type === 'assistant',
40
+ )
41
+ }
42
+
43
+ export async function queryHaiku(params: {
44
+ readonly systemPrompt?: ReturnType<typeof asSystemPrompt>
45
+ readonly userPrompt: string
46
+ readonly outputFormat?: unknown
47
+ readonly signal?: AbortSignal
48
+ readonly options: QueryModelParams['options']
49
+ }): Promise<unknown> {
50
+ return queryModelWithoutStreaming({
51
+ messages: [createUserMessage({ content: params.userPrompt })],
52
+ systemPrompt: params.systemPrompt ?? asSystemPrompt([]),
53
+ thinkingConfig: { type: 'disabled' },
54
+ tools: [],
55
+ signal: params.signal ?? new AbortController().signal,
56
+ options: params.options,
57
+ })
58
+ }
59
+
60
+ export async function queryWithModel(params: Parameters<typeof queryHaiku>[0]): Promise<unknown> {
61
+ return queryHaiku(params)
62
+ }
63
+
64
+ export function getMaxOutputTokensForModel(_model: string): number {
65
+ return EMPTY_USAGE.output_tokens + MAX_NON_STREAMING_TOKENS
66
+ }