ummaya 0.2.4 → 0.2.6

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 (482) hide show
  1. package/README.md +15 -2
  2. package/bin/ummaya +10 -1
  3. package/bun.lock +180 -244
  4. package/npm-shrinkwrap.json +760 -1760
  5. package/package.json +39 -22
  6. package/prompts/manifest.yaml +1 -1
  7. package/prompts/system_v1.md +1 -0
  8. package/pyproject.toml +27 -2
  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/_canonical/baselines.yaml +113 -0
  12. package/src/ummaya/engine/engine.py +29 -132
  13. package/src/ummaya/evidence/__init__.py +21 -2
  14. package/src/ummaya/evidence/dataset_contract.py +193 -0
  15. package/src/ummaya/evidence/document_authoring_cases.py +33 -0
  16. package/src/ummaya/evidence/document_harness.py +313 -0
  17. package/src/ummaya/evidence/document_viewer_ux.py +391 -0
  18. package/src/ummaya/evidence/gates.py +70 -0
  19. package/src/ummaya/evidence/json_types.py +20 -0
  20. package/src/ummaya/evidence/models.py +88 -1
  21. package/src/ummaya/evidence/output_payload.py +89 -0
  22. package/src/ummaya/evidence/payload_documents.py +233 -0
  23. package/src/ummaya/evidence/route_contracts.py +224 -0
  24. package/src/ummaya/evidence/route_helpers.py +150 -0
  25. package/src/ummaya/evidence/runner.py +81 -212
  26. package/src/ummaya/evidence/source_provenance.py +246 -0
  27. package/src/ummaya/evidence/source_provenance_redaction.py +176 -0
  28. package/src/ummaya/evidence/tool_layer.py +39 -0
  29. package/src/ummaya/evidence/tool_layer_models.py +151 -0
  30. package/src/ummaya/ipc/adapter_manifest_emitter.py +26 -10
  31. package/src/ummaya/ipc/document_intent_normalization.py +185 -0
  32. package/src/ummaya/ipc/frame_schema.py +5 -5
  33. package/src/ummaya/ipc/route_diagnostics.py +73 -0
  34. package/src/ummaya/ipc/stdio.py +1109 -477
  35. package/src/ummaya/llm/client.py +102 -3
  36. package/src/ummaya/llm/config.py +8 -3
  37. package/src/ummaya/primitives/__init__.py +6 -2
  38. package/src/ummaya/primitives/delegation.py +1 -1
  39. package/src/ummaya/primitives/document.py +28 -0
  40. package/src/ummaya/settings.py +0 -3
  41. package/src/ummaya/tools/discovery_bridge.py +17 -1
  42. package/src/ummaya/tools/documents/__init__.py +297 -0
  43. package/src/ummaya/tools/documents/adapter_registry.py +487 -0
  44. package/src/ummaya/tools/documents/archive_container_probe.py +167 -0
  45. package/src/ummaya/tools/documents/artifact_store.py +454 -0
  46. package/src/ummaya/tools/documents/authoring.py +283 -0
  47. package/src/ummaya/tools/documents/baselines.py +132 -0
  48. package/src/ummaya/tools/documents/capability.py +331 -0
  49. package/src/ummaya/tools/documents/contracts.py +112 -0
  50. package/src/ummaya/tools/documents/conversion.py +521 -0
  51. package/src/ummaya/tools/documents/diff.py +275 -0
  52. package/src/ummaya/tools/documents/engines.py +163 -0
  53. package/src/ummaya/tools/documents/evaluation.py +291 -0
  54. package/src/ummaya/tools/documents/explicit_values.py +108 -0
  55. package/src/ummaya/tools/documents/fixtures.py +174 -0
  56. package/src/ummaya/tools/documents/format_completion_audit.py +471 -0
  57. package/src/ummaya/tools/documents/formats/__init__.py +2 -0
  58. package/src/ummaya/tools/documents/formats/archive.py +528 -0
  59. package/src/ummaya/tools/documents/formats/base.py +41 -0
  60. package/src/ummaya/tools/documents/formats/code_file.py +211 -0
  61. package/src/ummaya/tools/documents/formats/data_file.py +272 -0
  62. package/src/ummaya/tools/documents/formats/hwp.py +284 -0
  63. package/src/ummaya/tools/documents/formats/hwpx.py +1837 -0
  64. package/src/ummaya/tools/documents/formats/odf.py +435 -0
  65. package/src/ummaya/tools/documents/formats/ooxml.py +1030 -0
  66. package/src/ummaya/tools/documents/formats/passive.py +766 -0
  67. package/src/ummaya/tools/documents/formats/pdf.py +702 -0
  68. package/src/ummaya/tools/documents/formats/text_web.py +268 -0
  69. package/src/ummaya/tools/documents/hwp_conversion_probe.py +178 -0
  70. package/src/ummaya/tools/documents/hwp_direct_candidate.py +141 -0
  71. package/src/ummaya/tools/documents/inspection.py +289 -0
  72. package/src/ummaya/tools/documents/intake.py +1079 -0
  73. package/src/ummaya/tools/documents/legacy_office_promotion_probe.py +366 -0
  74. package/src/ummaya/tools/documents/models.py +1598 -0
  75. package/src/ummaya/tools/documents/odf_promotion_probe.py +167 -0
  76. package/src/ummaya/tools/documents/orchestrator.py +96 -0
  77. package/src/ummaya/tools/documents/passive_capability_probe.py +251 -0
  78. package/src/ummaya/tools/documents/patch.py +170 -0
  79. package/src/ummaya/tools/documents/pdfa_conformance.py +284 -0
  80. package/src/ummaya/tools/documents/pdfa_promotion_probe.py +198 -0
  81. package/src/ummaya/tools/documents/permissions.py +110 -0
  82. package/src/ummaya/tools/documents/planner.py +616 -0
  83. package/src/ummaya/tools/documents/registry.py +2733 -0
  84. package/src/ummaya/tools/documents/render.py +978 -0
  85. package/src/ummaya/tools/documents/render_comparison.py +113 -0
  86. package/src/ummaya/tools/documents/render_comparison_models.py +74 -0
  87. package/src/ummaya/tools/documents/render_comparison_regions.py +73 -0
  88. package/src/ummaya/tools/documents/render_comparison_style.py +161 -0
  89. package/src/ummaya/tools/documents/reread.py +157 -0
  90. package/src/ummaya/tools/documents/runtime_authoring.py +244 -0
  91. package/src/ummaya/tools/documents/runtime_authoring_bundle.py +76 -0
  92. package/src/ummaya/tools/documents/scorecard.py +184 -0
  93. package/src/ummaya/tools/documents/socratic_planner.py +193 -0
  94. package/src/ummaya/tools/documents/style.py +48 -0
  95. package/src/ummaya/tools/documents/tool_defs.py +523 -0
  96. package/src/ummaya/tools/documents/validate.py +347 -0
  97. package/src/ummaya/tools/executor.py +29 -0
  98. package/src/ummaya/tools/live_proxy.py +0 -3
  99. package/src/ummaya/tools/models.py +5 -1
  100. package/src/ummaya/tools/register_all.py +8 -0
  101. package/src/ummaya/tools/registry.py +10 -1
  102. package/src/ummaya/tools/routing/__init__.py +59 -0
  103. package/src/ummaya/tools/routing/builder.py +105 -0
  104. package/src/ummaya/tools/routing/cards.py +29 -0
  105. package/src/ummaya/tools/routing/decision_service.py +534 -0
  106. package/src/ummaya/tools/routing/decision_types.py +74 -0
  107. package/src/ummaya/tools/routing/feasibility.py +122 -0
  108. package/src/ummaya/tools/routing/intent.py +17 -0
  109. package/src/ummaya/tools/routing/intent_extractor.py +207 -0
  110. package/src/ummaya/tools/routing/intent_patterns.py +160 -0
  111. package/src/ummaya/tools/routing/intent_public_data.py +150 -0
  112. package/src/ummaya/tools/routing/intent_types.py +48 -0
  113. package/src/ummaya/tools/routing/lint.py +78 -0
  114. package/src/ummaya/tools/routing/metadata.py +174 -0
  115. package/src/ummaya/tools/routing/projection.py +340 -0
  116. package/src/ummaya/tools/routing/retrieval_policy.py +629 -0
  117. package/src/ummaya/tools/routing/schema.py +81 -0
  118. package/src/ummaya/tools/routing/types.py +96 -0
  119. package/src/ummaya/tools/routing_index.py +2 -2
  120. package/src/ummaya/tools/search.py +34 -746
  121. package/tests/fixtures/documents/public_forms/baselines.yaml +113 -0
  122. package/tui/bun.lock +126 -305
  123. package/tui/package.json +35 -22
  124. package/tui/src/.cc-byte-identical-whitelist.yaml +266 -0
  125. package/tui/src/QueryEngine.ts +12 -8
  126. package/tui/src/bridge/inboundAttachments.ts +3 -3
  127. package/tui/src/cli/handlers/auth.ts +3 -12
  128. package/tui/src/cli/handlers/mcp.tsx +0 -1
  129. package/tui/src/cli/print.ts +8 -9
  130. package/tui/src/commands/insights.ts +1 -1
  131. package/tui/src/commands/install-github-app/types.ts +8 -30
  132. package/tui/src/commands/plugin/types.ts +6 -28
  133. package/tui/src/commands/plugin/unifiedTypes.ts +4 -26
  134. package/tui/src/commands/rename/generateSessionName.ts +1 -1
  135. package/tui/src/components/Feedback.tsx +1 -1
  136. package/tui/src/components/LogoV2/EmergencyTip.tsx +11 -2
  137. package/tui/src/components/LogoV2/WelcomeV2.tsx +1 -3
  138. package/tui/src/components/ScrollKeybindingHandler.tsx +6 -6
  139. package/tui/src/components/Spinner/types.ts +6 -28
  140. package/tui/src/components/agents/generateAgent.ts +1 -1
  141. package/tui/src/components/agents/new-agent-creation/types.ts +4 -26
  142. package/tui/src/components/config/EnvSecretIsolatedEditor.tsx +1 -1
  143. package/tui/src/components/mcp/types.ts +16 -38
  144. package/tui/src/components/messages/AssistantToolUseMessage.tsx +3 -2
  145. package/tui/src/components/messages/UserCrossSessionMessage.ts +16 -4
  146. package/tui/src/components/messages/UserForkBoilerplateMessage.ts +16 -4
  147. package/tui/src/components/messages/UserGitHubWebhookMessage.ts +16 -4
  148. package/tui/src/components/messages/UserToolResultMessage/utils.tsx +3 -2
  149. package/tui/src/components/permissions/MonitorPermissionRequest/MonitorPermissionRequest.ts +9 -4
  150. package/tui/src/components/permissions/ReviewArtifactPermissionRequest/ReviewArtifactPermissionRequest.ts +9 -4
  151. package/tui/src/components/primitive/DocumentSocraticReviewBlock.tsx +129 -0
  152. package/tui/src/components/primitive/DocumentToolResultCard.tsx +224 -0
  153. package/tui/src/components/primitive/documentSocraticReview.ts +215 -0
  154. package/tui/src/components/primitive/index.tsx +43 -1
  155. package/tui/src/components/primitive/types.ts +137 -0
  156. package/tui/src/components/ui/option.ts +4 -26
  157. package/tui/src/constants/common.ts +0 -2
  158. package/tui/src/constants/prompts.ts +4 -3
  159. package/tui/src/constants/querySource.ts +4 -26
  160. package/tui/src/entrypoints/sdk/controlTypes.ts +26 -48
  161. package/tui/src/entrypoints/sdk/coreTypes.generated.ts +3 -25
  162. package/tui/src/entrypoints/sdk/runtimeTypes.ts +38 -60
  163. package/tui/src/entrypoints/sdk/sdkUtilityTypes.ts +4 -26
  164. package/tui/src/entrypoints/sdk/settingsTypes.generated.ts +3 -25
  165. package/tui/src/entrypoints/sdk/toolTypes.ts +3 -25
  166. package/tui/src/hooks/toolPermission/handlers/interactiveHandler.ts +10 -0
  167. package/tui/src/hooks/useApiKeyVerification.ts +1 -1
  168. package/tui/src/hooks/useVirtualScroll.ts +1 -1
  169. package/tui/src/ink/ink.tsx +33 -14
  170. package/tui/src/ink/reconciler.ts +2 -3
  171. package/tui/src/ink/render-to-screen.ts +30 -10
  172. package/tui/src/ipc/bridge.ts +62 -15
  173. package/tui/src/ipc/bridgeSingleton.ts +5 -1
  174. package/tui/src/ipc/codec.ts +3 -3
  175. package/tui/src/ipc/frames.generated.ts +12 -12
  176. package/tui/src/ipc/llmClient.ts +151 -27
  177. package/tui/src/ipc/schema/frame.schema.json +1 -1
  178. package/tui/src/keybindings/defaultBindings.ts +4 -0
  179. package/tui/src/main.tsx +32 -15
  180. package/tui/src/native-ts/file-index/index.ts +33 -3
  181. package/tui/src/observability/surface.ts +2 -2
  182. package/tui/src/probes/toolRegistryProbe.tsx +3 -1
  183. package/tui/src/projectOnboardingState.ts +7 -6
  184. package/tui/src/query/chatMessageTypes.ts +18 -0
  185. package/tui/src/query/chatMessagesBuilder.ts +1 -1
  186. package/tui/src/query/deps.ts +1 -1
  187. package/tui/src/query/messageGuards.ts +106 -0
  188. package/tui/src/query/publicDataTerminalRepair.ts +384 -0
  189. package/tui/src/query/run.ts +1075 -0
  190. package/tui/src/query/supportBoundary.ts +168 -0
  191. package/tui/src/query/toolResultErrors.ts +103 -0
  192. package/tui/src/query/toolRunner.ts +687 -0
  193. package/tui/src/query/unavailableToolRepair.ts +118 -0
  194. package/tui/src/query.ts +9 -2186
  195. package/tui/src/screens/REPL.tsx +40 -29
  196. package/tui/src/services/api/adapterManifest.ts +4 -0
  197. package/tui/src/services/api/backendChat/events.ts +117 -0
  198. package/tui/src/services/api/backendChat/finalMessage.ts +40 -0
  199. package/tui/src/services/api/backendChat/frame.ts +9 -0
  200. package/tui/src/services/api/backendChat/streaming.ts +430 -0
  201. package/tui/src/services/api/backendChat/types.ts +62 -0
  202. package/tui/src/services/api/backendChat.ts +1 -0
  203. package/tui/src/services/api/client.ts +65 -2
  204. package/tui/src/services/api/errorUtils.ts +5 -5
  205. package/tui/src/services/api/errors.ts +1 -1
  206. package/tui/src/services/api/logging.ts +1 -1
  207. package/tui/src/services/api/ummaya/evidence.ts +194 -0
  208. package/tui/src/services/api/ummaya/messages.ts +255 -0
  209. package/tui/src/services/api/ummaya/nonStreaming.ts +66 -0
  210. package/tui/src/services/api/ummaya/provider.ts +200 -0
  211. package/tui/src/services/api/ummaya/reasoning.ts +24 -0
  212. package/tui/src/services/api/ummaya/request.ts +200 -0
  213. package/tui/src/services/api/ummaya/selectionContext.ts +240 -0
  214. package/tui/src/services/api/ummaya/streaming.ts +365 -0
  215. package/tui/src/services/api/ummaya/streamingPayload.ts +129 -0
  216. package/tui/src/services/api/ummaya/streamingReader.ts +40 -0
  217. package/tui/src/services/api/ummaya/toolSelection.ts +217 -0
  218. package/tui/src/services/api/ummaya/types.ts +110 -0
  219. package/tui/src/services/api/ummaya/usage.ts +30 -0
  220. package/tui/src/services/api/ummaya.ts +26 -418
  221. package/tui/src/services/api/withRetry.ts +1 -1
  222. package/tui/src/services/awaySummary.ts +2 -2
  223. package/tui/src/services/claudeAiLimits.ts +1 -1
  224. package/tui/src/services/compact/autoCompact.ts +1 -1
  225. package/tui/src/services/compact/compact.ts +1 -1
  226. package/tui/src/services/lsp/types.ts +8 -30
  227. package/tui/src/services/tips/types.ts +6 -28
  228. package/tui/src/services/tokenEstimation.ts +1 -1
  229. package/tui/src/services/toolRegistry/bootGuard.ts +5 -5
  230. package/tui/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -1
  231. package/tui/src/services/tools/toolExecution.ts +94 -1
  232. package/tui/src/store/pendingPermissionSlot.ts +1 -1
  233. package/tui/src/store/session-store.ts +10 -36
  234. package/tui/src/stubs/any-stub.ts +15 -10
  235. package/tui/src/stubs/color-diff-napi.ts +37 -23
  236. package/tui/src/stubs/globals.d.ts +3 -3
  237. package/tui/src/stubs/macro-preload.ts +23 -12
  238. package/tui/src/tools/AdapterTool/AdapterTool.ts +1207 -714
  239. package/tui/src/tools/AdapterTool/routeDiagnostics.ts +75 -0
  240. package/tui/src/tools/AgentTool/AgentTool.tsx +84 -1371
  241. package/tui/src/tools/AgentTool/agentToolHandoff.ts +114 -0
  242. package/tui/src/tools/AgentTool/agentToolPartialResult.ts +16 -0
  243. package/tui/src/tools/AgentTool/agentToolProgress.ts +32 -0
  244. package/tui/src/tools/AgentTool/agentToolResolver.ts +161 -0
  245. package/tui/src/tools/AgentTool/agentToolResult.ts +163 -0
  246. package/tui/src/tools/AgentTool/agentToolUtils.ts +14 -686
  247. package/tui/src/tools/AgentTool/asyncAgentLifecycle.ts +208 -0
  248. package/tui/src/tools/AgentTool/asyncLifecycle.ts +153 -0
  249. package/tui/src/tools/AgentTool/backgroundedCompletion.ts +126 -0
  250. package/tui/src/tools/AgentTool/backgroundedLifecycle.ts +174 -0
  251. package/tui/src/tools/AgentTool/foregroundBackground.ts +83 -0
  252. package/tui/src/tools/AgentTool/foregroundDrain.tsx +133 -0
  253. package/tui/src/tools/AgentTool/foregroundFinalize.ts +98 -0
  254. package/tui/src/tools/AgentTool/foregroundLifecycle.tsx +237 -0
  255. package/tui/src/tools/AgentTool/foregroundProgress.tsx +169 -0
  256. package/tui/src/tools/AgentTool/foregroundTask.ts +89 -0
  257. package/tui/src/tools/AgentTool/forkSubagent.ts +1 -12
  258. package/tui/src/tools/AgentTool/forkSubagentGate.ts +34 -0
  259. package/tui/src/tools/AgentTool/launchRouting.ts +203 -0
  260. package/tui/src/tools/AgentTool/lifecycle.ts +244 -0
  261. package/tui/src/tools/AgentTool/mcpRouting.ts +73 -0
  262. package/tui/src/tools/AgentTool/orchestrationSupport.ts +70 -0
  263. package/tui/src/tools/AgentTool/permissions.ts +39 -0
  264. package/tui/src/tools/AgentTool/promptSetup.ts +181 -0
  265. package/tui/src/tools/AgentTool/remoteRouting.ts +62 -0
  266. package/tui/src/tools/AgentTool/resultMapping.ts +116 -0
  267. package/tui/src/tools/AgentTool/resumeAgent.ts +39 -107
  268. package/tui/src/tools/AgentTool/resumeAgentHelpers.ts +140 -0
  269. package/tui/src/tools/AgentTool/runAgent.ts +1 -1
  270. package/tui/src/tools/AgentTool/runtimeConfig.ts +57 -0
  271. package/tui/src/tools/AgentTool/schemas.ts +196 -0
  272. package/tui/src/tools/AgentTool/sourceVerificationPropagation.ts +263 -0
  273. package/tui/src/tools/AgentTool/worktreeLifecycle.ts +105 -0
  274. package/tui/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +174 -202
  275. package/tui/src/tools/BashTool/BashTool.tsx +71 -1072
  276. package/tui/src/tools/BashTool/bashCommandHelpers.ts +12 -12
  277. package/tui/src/tools/BashTool/bashPermissions/astPreflight.ts +173 -0
  278. package/tui/src/tools/BashTool/bashPermissions/classifierChecks.ts +199 -0
  279. package/tui/src/tools/BashTool/bashPermissions/compoundGuards.ts +53 -0
  280. package/tui/src/tools/BashTool/bashPermissions/constants.ts +99 -0
  281. package/tui/src/tools/BashTool/bashPermissions/index.ts +38 -0
  282. package/tui/src/tools/BashTool/bashPermissions/legacyMisparsing.ts +62 -0
  283. package/tui/src/tools/BashTool/bashPermissions/main.ts +135 -0
  284. package/tui/src/tools/BashTool/bashPermissions/normalizedCommands.ts +33 -0
  285. package/tui/src/tools/BashTool/bashPermissions/operatorFlow.ts +98 -0
  286. package/tui/src/tools/BashTool/bashPermissions/permissionChecks.ts +200 -0
  287. package/tui/src/tools/BashTool/bashPermissions/prefixSuggestions.ts +88 -0
  288. package/tui/src/tools/BashTool/bashPermissions/promptClassifierRules.ts +125 -0
  289. package/tui/src/tools/BashTool/bashPermissions/ruleDelegates.ts +19 -0
  290. package/tui/src/tools/BashTool/bashPermissions/ruleMatching.ts +145 -0
  291. package/tui/src/tools/BashTool/bashPermissions/sandboxAutoAllow.ts +75 -0
  292. package/tui/src/tools/BashTool/bashPermissions/subcommandFlow.ts +205 -0
  293. package/tui/src/tools/BashTool/bashPermissions/subcommandGuards.ts +73 -0
  294. package/tui/src/tools/BashTool/bashPermissions/subcommandResultHelpers.ts +116 -0
  295. package/tui/src/tools/BashTool/bashPermissions/types.ts +26 -0
  296. package/tui/src/tools/BashTool/bashPermissions/wrapperStripping.ts +139 -0
  297. package/tui/src/tools/BashTool/bashPermissions.ts +26 -2621
  298. package/tui/src/tools/BashTool/call.ts +202 -0
  299. package/tui/src/tools/BashTool/callLoader.ts +35 -0
  300. package/tui/src/tools/BashTool/commandClassification.ts +151 -0
  301. package/tui/src/tools/BashTool/commandClassificationLoader.ts +40 -0
  302. package/tui/src/tools/BashTool/cwdReset.ts +33 -0
  303. package/tui/src/tools/BashTool/lineTruncation.ts +11 -0
  304. package/tui/src/tools/BashTool/modeValidation.ts +13 -1
  305. package/tui/src/tools/BashTool/outputPersistence.ts +42 -0
  306. package/tui/src/tools/BashTool/permissionClassification.ts +66 -0
  307. package/tui/src/tools/BashTool/permissionLoader.ts +44 -0
  308. package/tui/src/tools/BashTool/resultLoader.ts +29 -0
  309. package/tui/src/tools/BashTool/resultMapping.ts +83 -0
  310. package/tui/src/tools/BashTool/sandboxPolicy.ts +79 -0
  311. package/tui/src/tools/BashTool/schemas.ts +65 -0
  312. package/tui/src/tools/BashTool/sedEditExecution.ts +59 -0
  313. package/tui/src/tools/BashTool/shellExecution.tsx +245 -0
  314. package/tui/src/tools/BashTool/shellOutputUtils.ts +85 -0
  315. package/tui/src/tools/BashTool/shellPermissionGauntlet.ts +97 -0
  316. package/tui/src/tools/BashTool/uiLoader.ts +37 -0
  317. package/tui/src/tools/BriefTool/upload.ts +1 -1
  318. package/tui/src/tools/CalculatorTool/parser.ts +2 -2
  319. package/tui/src/tools/DocumentPrimitive/DocumentPrimitive.ts +262 -0
  320. package/tui/src/tools/DocumentPrimitive/dispatchNormalization.ts +270 -0
  321. package/tui/src/tools/DocumentPrimitive/documentDestinationPath.ts +18 -0
  322. package/tui/src/tools/DocumentPrimitive/documentMutationGuard.ts +22 -0
  323. package/tui/src/tools/DocumentPrimitive/documentPatchNormalization.ts +248 -0
  324. package/tui/src/tools/DocumentPrimitive/documentSourceVerification.ts +245 -0
  325. package/tui/src/tools/DocumentPrimitive/documentSourceVerificationFields.ts +103 -0
  326. package/tui/src/tools/DocumentPrimitive/modelVisibleOutput.ts +40 -0
  327. package/tui/src/tools/DocumentPrimitive/prompt.ts +35 -0
  328. package/tui/src/tools/FileEditTool/FileEditTool.ts +9 -507
  329. package/tui/src/tools/FileEditTool/call.ts +228 -0
  330. package/tui/src/tools/FileEditTool/validateInput.ts +196 -0
  331. package/tui/src/tools/FileReadTool/imageProcessor.ts +13 -0
  332. package/tui/src/tools/FileWriteTool/FileWriteTool.ts +7 -300
  333. package/tui/src/tools/FileWriteTool/call.ts +223 -0
  334. package/tui/src/tools/FileWriteTool/validateInput.ts +80 -0
  335. package/tui/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +19 -3
  336. package/tui/src/tools/LookupPrimitive/LookupPrimitive.ts +25 -32
  337. package/tui/src/tools/LookupPrimitive/prompt.ts +0 -2
  338. package/tui/src/tools/MCPTool/trustPolicy.ts +118 -0
  339. package/tui/src/tools/McpAuthTool/McpAuthTool.ts +21 -3
  340. package/tui/src/tools/NotebookEditTool/NotebookEditTool.ts +7 -326
  341. package/tui/src/tools/NotebookEditTool/call.ts +254 -0
  342. package/tui/src/tools/NotebookEditTool/notebookModel.ts +51 -0
  343. package/tui/src/tools/NotebookEditTool/validateInput.ts +142 -0
  344. package/tui/src/tools/PowerShellTool/PowerShellTool.tsx +46 -937
  345. package/tui/src/tools/PowerShellTool/acceptEditsCommandValidation.ts +162 -0
  346. package/tui/src/tools/PowerShellTool/call.ts +179 -0
  347. package/tui/src/tools/PowerShellTool/callLoader.ts +37 -0
  348. package/tui/src/tools/PowerShellTool/commandClassification.ts +86 -0
  349. package/tui/src/tools/PowerShellTool/modeValidation.ts +25 -332
  350. package/tui/src/tools/PowerShellTool/outputPersistence.ts +42 -0
  351. package/tui/src/tools/PowerShellTool/permissionClassification.ts +28 -0
  352. package/tui/src/tools/PowerShellTool/resultLoader.ts +31 -0
  353. package/tui/src/tools/PowerShellTool/resultMapping.ts +75 -0
  354. package/tui/src/tools/PowerShellTool/schemas.ts +40 -0
  355. package/tui/src/tools/PowerShellTool/shellExecution.tsx +258 -0
  356. package/tui/src/tools/PowerShellTool/symlinkModeValidation.ts +44 -0
  357. package/tui/src/tools/PowerShellTool/uiLoader.ts +37 -0
  358. package/tui/src/tools/PowerShellTool/validation.ts +39 -0
  359. package/tui/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +19 -3
  360. package/tui/src/tools/ResolveLocationPrimitive/ResolveLocationPrimitive.ts +1 -11
  361. package/tui/src/tools/ResolveLocationPrimitive/prompt.ts +2 -6
  362. package/tui/src/tools/SkillTool/SkillTool.ts +2 -2
  363. package/tui/src/tools/SubmitPrimitive/SubmitPrimitive.ts +27 -10
  364. package/tui/src/tools/TaskCreateTool/TaskCreateTool.ts +16 -2
  365. package/tui/src/tools/TaskGetTool/TaskGetTool.ts +23 -3
  366. package/tui/src/tools/TaskListTool/TaskListTool.ts +22 -4
  367. package/tui/src/tools/TaskOutputTool/TaskOutputTool.tsx +46 -547
  368. package/tui/src/tools/TaskOutputTool/lookup.ts +216 -0
  369. package/tui/src/tools/TaskOutputTool/render.tsx +257 -0
  370. package/tui/src/tools/TaskOutputTool/schemas.ts +55 -0
  371. package/tui/src/tools/TaskOutputTool/serialization.ts +36 -0
  372. package/tui/src/tools/TaskStopTool/TaskStopTool.ts +10 -0
  373. package/tui/src/tools/TaskUpdateTool/TaskUpdateTool.ts +14 -364
  374. package/tui/src/tools/TaskUpdateTool/completion.ts +62 -0
  375. package/tui/src/tools/TaskUpdateTool/schemas.ts +62 -0
  376. package/tui/src/tools/TaskUpdateTool/serialization.ts +46 -0
  377. package/tui/src/tools/TaskUpdateTool/statusUpdate.ts +247 -0
  378. package/tui/src/tools/TodoWriteTool/TodoWriteTool.ts +21 -2
  379. package/tui/src/tools/ToolSearchTool/ToolSearchTool.ts +21 -302
  380. package/tui/src/tools/ToolSearchTool/ccSupportTools.ts +223 -0
  381. package/tui/src/tools/ToolSearchTool/descriptionCache.ts +50 -0
  382. package/tui/src/tools/ToolSearchTool/keywordSearch.ts +216 -0
  383. package/tui/src/tools/ToolSearchTool/prompt.ts +10 -4
  384. package/tui/src/tools/ToolSearchTool/resultMapping.ts +30 -0
  385. package/tui/src/tools/ToolSearchTool/schemas.ts +30 -0
  386. package/tui/src/tools/ToolSearchTool/searchPool.ts +47 -0
  387. package/tui/src/tools/ToolSearchTool/supportIntentHints.ts +140 -0
  388. package/tui/src/tools/TranslateTool/TranslateTool.ts +1 -1
  389. package/tui/src/tools/VerifyPrimitive/VerifyPrimitive.ts +2 -1
  390. package/tui/src/tools/WebFetchTool/WebFetchTool.ts +43 -138
  391. package/tui/src/tools/WebFetchTool/call.ts +227 -0
  392. package/tui/src/tools/WebFetchTool/resolvedAddressSafety.ts +78 -0
  393. package/tui/src/tools/WebFetchTool/sourceVerification.ts +204 -0
  394. package/tui/src/tools/WebFetchTool/types.ts +23 -0
  395. package/tui/src/tools/WebFetchTool/urlSafety.ts +181 -0
  396. package/tui/src/tools/WebFetchTool/utils.ts +1 -1
  397. package/tui/src/tools/WebSearchTool/UI.tsx +0 -1
  398. package/tui/src/tools/WebSearchTool/WebSearchTool.ts +9 -313
  399. package/tui/src/tools/WebSearchTool/call.ts +33 -0
  400. package/tui/src/tools/WebSearchTool/responseMapping.ts +190 -0
  401. package/tui/src/tools/WebSearchTool/resultBlock.ts +47 -0
  402. package/tui/src/tools/WebSearchTool/schemas.ts +47 -0
  403. package/tui/src/tools/WebSearchTool/toolSchema.ts +12 -0
  404. package/tui/src/tools/WorkspaceToolAdapter/WorkspaceToolAdapter.ts +79 -0
  405. package/tui/src/tools/WorkspaceToolAdapter/allowedRootPolicy.ts +85 -0
  406. package/tui/src/tools/WorkspaceToolAdapter/documentFormatGuards.ts +73 -0
  407. package/tui/src/tools/WorkspaceToolAdapter/inputNormalization.ts +105 -0
  408. package/tui/src/tools/WorkspaceToolAdapter/mcpExposurePolicy.ts +64 -0
  409. package/tui/src/tools/WorkspaceToolAdapter/toolDefFactory.ts +215 -0
  410. package/tui/src/tools/WorkspaceToolAdapter/toolNames.ts +6 -0
  411. package/tui/src/tools/WorkspaceToolAdapter/workspacePolicy.ts +15 -0
  412. package/tui/src/tools/_shared/dispatchPrimitive.ts +6 -6
  413. package/tui/src/tools/_shared/documentChangeToPatch.ts +125 -0
  414. package/tui/src/tools/_shared/documentDispatchArguments.ts +87 -0
  415. package/tui/src/tools/_shared/documentPrimitiveTimeout.ts +13 -0
  416. package/tui/src/tools/_shared/documentToolResultRender.ts +98 -0
  417. package/tui/src/tools/_shared/pendingCallRegistry.ts +1 -6
  418. package/tui/src/tools/_shared/rootPrimitiveInput.ts +1 -0
  419. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPatterns.ts +58 -0
  420. package/tui/src/tools/_shared/toolChoiceRepair/documentCompletionPrompt.ts +271 -0
  421. package/tui/src/tools/_shared/toolChoiceRepair/documentRepair.ts +452 -0
  422. package/tui/src/tools/_shared/toolChoiceRepair/messageAccess.ts +80 -0
  423. package/tui/src/tools/_shared/toolChoiceRepair/publicDataRepair.ts +92 -0
  424. package/tui/src/tools/_shared/toolChoiceRepair/supportRepair.ts +135 -0
  425. package/tui/src/tools/_shared/toolChoiceRepair.ts +55 -860
  426. package/tui/src/tools/shared/mockDisclaimer.ts +1 -1
  427. package/tui/src/tools.ts +39 -190
  428. package/tui/src/types/fileSuggestion.ts +4 -26
  429. package/tui/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +186 -148
  430. package/tui/src/types/generated/events_mono/common/v1/auth.ts +25 -11
  431. package/tui/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +47 -30
  432. package/tui/src/types/generated/google/protobuf/timestamp.ts +21 -7
  433. package/tui/src/types/message.ts +80 -102
  434. package/tui/src/types/messageQueueTypes.ts +6 -28
  435. package/tui/src/types/notebook.ts +16 -38
  436. package/tui/src/types/statusLine.ts +4 -26
  437. package/tui/src/types/tools.ts +24 -46
  438. package/tui/src/types/utils.ts +6 -28
  439. package/tui/src/upstreamproxy/relay.ts +7 -3
  440. package/tui/src/upstreamproxy/upstreamproxy.ts +1 -1
  441. package/tui/src/utils/assistantMessageFactories.ts +9 -3
  442. package/tui/src/utils/auth.ts +129 -139
  443. package/tui/src/utils/bash/ast.ts +23 -23
  444. package/tui/src/utils/bash/bashParser.ts +5 -5
  445. package/tui/src/utils/billing.ts +1 -1
  446. package/tui/src/utils/claudeDesktop.ts +4 -4
  447. package/tui/src/utils/collapseReadSearch.ts +3 -3
  448. package/tui/src/utils/cronTasks.ts +1 -1
  449. package/tui/src/utils/execFileNoThrow.ts +1 -1
  450. package/tui/src/utils/filePersistence/types.ts +16 -38
  451. package/tui/src/utils/forkedAgent.ts +1 -1
  452. package/tui/src/utils/gracefulShutdown.ts +4 -4
  453. package/tui/src/utils/heapDumpService.ts +12 -8
  454. package/tui/src/utils/hooks/apiQueryHookHelper.ts +1 -1
  455. package/tui/src/utils/hooks/execPromptHook.ts +1 -1
  456. package/tui/src/utils/hooks/skillImprovement.ts +1 -1
  457. package/tui/src/utils/mcp/dateTimeParser.ts +1 -1
  458. package/tui/src/utils/messages.ts +18 -0
  459. package/tui/src/utils/migrateSessions.ts +3 -3
  460. package/tui/src/utils/model/model.ts +6 -6
  461. package/tui/src/utils/permissions/yoloClassifier.ts +1 -1
  462. package/tui/src/utils/plugins/headlessPluginInstall.ts +1 -1
  463. package/tui/src/utils/plugins/mcpPluginIntegration.ts +1 -1
  464. package/tui/src/utils/plugins/mcpbHandler.ts +1 -1
  465. package/tui/src/utils/plugins/pluginLoader.ts +8 -8
  466. package/tui/src/utils/protectedNamespace.ts +5 -3
  467. package/tui/src/utils/rawJsonToolCall.ts +242 -0
  468. package/tui/src/utils/ripgrep.ts +16 -7
  469. package/tui/src/utils/sessionTitle.ts +1 -1
  470. package/tui/src/utils/settings/permissionValidation.ts +14 -2
  471. package/tui/src/utils/shell/prefix.ts +1 -1
  472. package/tui/src/utils/sideQuery.ts +1 -1
  473. package/tui/src/utils/systemThemeWatcher.ts +13 -3
  474. package/tui/src/utils/teleport.tsx +1 -1
  475. package/uv.lock +426 -45
  476. package/tui/src/services/api/claude.ts +0 -3540
  477. package/tui/src/tools/_shared/directPublicDataGuard.ts +0 -362
  478. package/tui/src/tools/_shared/kmaAnalysisGuard.ts +0 -197
  479. package/tui/src/tools/_shared/kmaAviationGuard.ts +0 -70
  480. package/tui/src/tools/_shared/nmcAedGuard.ts +0 -234
  481. package/tui/src/tools/_shared/protectedCheckGuard.ts +0 -207
  482. package/tui/src/tools/_shared/textToolCallGuard.ts +0 -91
@@ -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
+ }