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