clawdex-mobile 1.0.0

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 (526) hide show
  1. package/.github/workflows/ci.yml +77 -0
  2. package/.github/workflows/npm-release.yml +67 -0
  3. package/AGENTS.md +120 -0
  4. package/LICENSE +21 -0
  5. package/README.md +648 -0
  6. package/STATUS.md +115 -0
  7. package/apps/mobile/.env.example +7 -0
  8. package/apps/mobile/App.tsx +589 -0
  9. package/apps/mobile/app.json +33 -0
  10. package/apps/mobile/assets/brand/adaptive-icon.png +0 -0
  11. package/apps/mobile/assets/brand/app-icon.png +0 -0
  12. package/apps/mobile/assets/brand/favicon.png +0 -0
  13. package/apps/mobile/assets/brand/mark.png +0 -0
  14. package/apps/mobile/assets/brand/splash-icon.png +0 -0
  15. package/apps/mobile/babel.config.js +7 -0
  16. package/apps/mobile/eslint.config.cjs +28 -0
  17. package/apps/mobile/index.js +5 -0
  18. package/apps/mobile/metro.config.js +3 -0
  19. package/apps/mobile/package.json +55 -0
  20. package/apps/mobile/src/api/__tests__/chatMapping.test.ts +132 -0
  21. package/apps/mobile/src/api/__tests__/client.test.ts +872 -0
  22. package/apps/mobile/src/api/__tests__/ws.test.ts +575 -0
  23. package/apps/mobile/src/api/chatMapping.ts +591 -0
  24. package/apps/mobile/src/api/client.ts +1087 -0
  25. package/apps/mobile/src/api/types.ts +267 -0
  26. package/apps/mobile/src/api/ws.ts +801 -0
  27. package/apps/mobile/src/components/ActivityBar.tsx +76 -0
  28. package/apps/mobile/src/components/ApprovalBanner.tsx +207 -0
  29. package/apps/mobile/src/components/BrandMark.tsx +43 -0
  30. package/apps/mobile/src/components/ChatHeader.tsx +106 -0
  31. package/apps/mobile/src/components/ChatInput.tsx +236 -0
  32. package/apps/mobile/src/components/ChatMessage.tsx +400 -0
  33. package/apps/mobile/src/components/StatusLine.tsx +52 -0
  34. package/apps/mobile/src/components/ToolBlock.tsx +65 -0
  35. package/apps/mobile/src/components/TypingIndicator.tsx +64 -0
  36. package/apps/mobile/src/config.ts +75 -0
  37. package/apps/mobile/src/navigation/DrawerContent.tsx +969 -0
  38. package/apps/mobile/src/screens/GitScreen.tsx +573 -0
  39. package/apps/mobile/src/screens/MainScreen.tsx +6905 -0
  40. package/apps/mobile/src/screens/PrivacyScreen.tsx +196 -0
  41. package/apps/mobile/src/screens/SettingsScreen.tsx +776 -0
  42. package/apps/mobile/src/screens/TerminalScreen.tsx +251 -0
  43. package/apps/mobile/src/screens/TermsScreen.tsx +192 -0
  44. package/apps/mobile/src/theme.ts +112 -0
  45. package/apps/mobile/src/types/assets.d.ts +4 -0
  46. package/apps/mobile/tsconfig.json +33 -0
  47. package/bin/clawdex.js +72 -0
  48. package/docs/app-review-notes.md +111 -0
  49. package/docs/open-source-license-requirements.md +32 -0
  50. package/docs/plans/2026-02-20-codex-desktop-style-redesign.md +190 -0
  51. package/docs/plans/2026-02-20-codex-mobile-implementation.md +1630 -0
  52. package/docs/plans/2026-02-21-codex-ui-redesign-design.md +101 -0
  53. package/docs/plans/2026-02-21-codex-ui-redesign.md +1229 -0
  54. package/docs/realtime-streaming-limitations.md +77 -0
  55. package/package.json +47 -0
  56. package/scripts/setup-secure-dev.sh +169 -0
  57. package/scripts/setup-wizard.sh +1302 -0
  58. package/scripts/start-bridge-secure.sh +38 -0
  59. package/scripts/start-expo.sh +176 -0
  60. package/scripts/stop-services.sh +61 -0
  61. package/scripts/teardown.sh +136 -0
  62. package/services/mac-bridge/.env.example +10 -0
  63. package/services/mac-bridge/codex-types/AbsolutePathBuf.ts +14 -0
  64. package/services/mac-bridge/codex-types/AddConversationListenerParams.ts +6 -0
  65. package/services/mac-bridge/codex-types/AddConversationSubscriptionResponse.ts +5 -0
  66. package/services/mac-bridge/codex-types/AgentMessageContent.ts +5 -0
  67. package/services/mac-bridge/codex-types/AgentMessageContentDeltaEvent.ts +5 -0
  68. package/services/mac-bridge/codex-types/AgentMessageDeltaEvent.ts +5 -0
  69. package/services/mac-bridge/codex-types/AgentMessageEvent.ts +5 -0
  70. package/services/mac-bridge/codex-types/AgentMessageItem.ts +21 -0
  71. package/services/mac-bridge/codex-types/AgentReasoningDeltaEvent.ts +5 -0
  72. package/services/mac-bridge/codex-types/AgentReasoningEvent.ts +5 -0
  73. package/services/mac-bridge/codex-types/AgentReasoningRawContentDeltaEvent.ts +5 -0
  74. package/services/mac-bridge/codex-types/AgentReasoningRawContentEvent.ts +5 -0
  75. package/services/mac-bridge/codex-types/AgentReasoningSectionBreakEvent.ts +5 -0
  76. package/services/mac-bridge/codex-types/AgentStatus.ts +8 -0
  77. package/services/mac-bridge/codex-types/ApplyPatchApprovalParams.ts +21 -0
  78. package/services/mac-bridge/codex-types/ApplyPatchApprovalRequestEvent.ts +23 -0
  79. package/services/mac-bridge/codex-types/ApplyPatchApprovalResponse.ts +6 -0
  80. package/services/mac-bridge/codex-types/ArchiveConversationParams.ts +6 -0
  81. package/services/mac-bridge/codex-types/ArchiveConversationResponse.ts +5 -0
  82. package/services/mac-bridge/codex-types/AskForApproval.ts +9 -0
  83. package/services/mac-bridge/codex-types/AuthMode.ts +8 -0
  84. package/services/mac-bridge/codex-types/AuthStatusChangeNotification.ts +9 -0
  85. package/services/mac-bridge/codex-types/BackgroundEventEvent.ts +5 -0
  86. package/services/mac-bridge/codex-types/ByteRange.ts +13 -0
  87. package/services/mac-bridge/codex-types/CallToolResult.ts +9 -0
  88. package/services/mac-bridge/codex-types/CancelLoginChatGptParams.ts +5 -0
  89. package/services/mac-bridge/codex-types/CancelLoginChatGptResponse.ts +5 -0
  90. package/services/mac-bridge/codex-types/ClientInfo.ts +5 -0
  91. package/services/mac-bridge/codex-types/ClientNotification.ts +5 -0
  92. package/services/mac-bridge/codex-types/ClientRequest.ts +60 -0
  93. package/services/mac-bridge/codex-types/CodexErrorInfo.ts +8 -0
  94. package/services/mac-bridge/codex-types/CollabAgentInteractionBeginEvent.ts +23 -0
  95. package/services/mac-bridge/codex-types/CollabAgentInteractionEndEvent.ts +28 -0
  96. package/services/mac-bridge/codex-types/CollabAgentSpawnBeginEvent.ts +19 -0
  97. package/services/mac-bridge/codex-types/CollabAgentSpawnEndEvent.ts +28 -0
  98. package/services/mac-bridge/codex-types/CollabCloseBeginEvent.ts +18 -0
  99. package/services/mac-bridge/codex-types/CollabCloseEndEvent.ts +24 -0
  100. package/services/mac-bridge/codex-types/CollabResumeBeginEvent.ts +18 -0
  101. package/services/mac-bridge/codex-types/CollabResumeEndEvent.ts +24 -0
  102. package/services/mac-bridge/codex-types/CollabWaitingBeginEvent.ts +18 -0
  103. package/services/mac-bridge/codex-types/CollabWaitingEndEvent.ts +19 -0
  104. package/services/mac-bridge/codex-types/CollaborationMode.ts +10 -0
  105. package/services/mac-bridge/codex-types/CollaborationModeMask.ts +11 -0
  106. package/services/mac-bridge/codex-types/ContentItem.ts +5 -0
  107. package/services/mac-bridge/codex-types/ContextCompactedEvent.ts +5 -0
  108. package/services/mac-bridge/codex-types/ContextCompactionItem.ts +5 -0
  109. package/services/mac-bridge/codex-types/ConversationGitInfo.ts +5 -0
  110. package/services/mac-bridge/codex-types/ConversationSummary.ts +8 -0
  111. package/services/mac-bridge/codex-types/CreditsSnapshot.ts +5 -0
  112. package/services/mac-bridge/codex-types/CustomPrompt.ts +5 -0
  113. package/services/mac-bridge/codex-types/DeprecationNoticeEvent.ts +13 -0
  114. package/services/mac-bridge/codex-types/DynamicToolCallRequest.ts +6 -0
  115. package/services/mac-bridge/codex-types/ElicitationRequestEvent.ts +5 -0
  116. package/services/mac-bridge/codex-types/ErrorEvent.ts +6 -0
  117. package/services/mac-bridge/codex-types/EventMsg.ts +78 -0
  118. package/services/mac-bridge/codex-types/ExecApprovalRequestEvent.ts +44 -0
  119. package/services/mac-bridge/codex-types/ExecCommandApprovalParams.ts +16 -0
  120. package/services/mac-bridge/codex-types/ExecCommandApprovalResponse.ts +6 -0
  121. package/services/mac-bridge/codex-types/ExecCommandBeginEvent.ts +35 -0
  122. package/services/mac-bridge/codex-types/ExecCommandEndEvent.ts +64 -0
  123. package/services/mac-bridge/codex-types/ExecCommandOutputDeltaEvent.ts +18 -0
  124. package/services/mac-bridge/codex-types/ExecCommandSource.ts +5 -0
  125. package/services/mac-bridge/codex-types/ExecCommandStatus.ts +5 -0
  126. package/services/mac-bridge/codex-types/ExecOneOffCommandParams.ts +6 -0
  127. package/services/mac-bridge/codex-types/ExecOneOffCommandResponse.ts +5 -0
  128. package/services/mac-bridge/codex-types/ExecOutputStream.ts +5 -0
  129. package/services/mac-bridge/codex-types/ExecPolicyAmendment.ts +12 -0
  130. package/services/mac-bridge/codex-types/ExitedReviewModeEvent.ts +6 -0
  131. package/services/mac-bridge/codex-types/FileChange.ts +5 -0
  132. package/services/mac-bridge/codex-types/ForcedLoginMethod.ts +5 -0
  133. package/services/mac-bridge/codex-types/ForkConversationParams.ts +7 -0
  134. package/services/mac-bridge/codex-types/ForkConversationResponse.ts +7 -0
  135. package/services/mac-bridge/codex-types/FunctionCallOutputBody.ts +6 -0
  136. package/services/mac-bridge/codex-types/FunctionCallOutputContentItem.ts +9 -0
  137. package/services/mac-bridge/codex-types/FunctionCallOutputPayload.ts +12 -0
  138. package/services/mac-bridge/codex-types/FuzzyFileSearchParams.ts +5 -0
  139. package/services/mac-bridge/codex-types/FuzzyFileSearchResponse.ts +6 -0
  140. package/services/mac-bridge/codex-types/FuzzyFileSearchResult.ts +8 -0
  141. package/services/mac-bridge/codex-types/FuzzyFileSearchSessionCompletedNotification.ts +5 -0
  142. package/services/mac-bridge/codex-types/FuzzyFileSearchSessionUpdatedNotification.ts +6 -0
  143. package/services/mac-bridge/codex-types/GetAuthStatusParams.ts +5 -0
  144. package/services/mac-bridge/codex-types/GetAuthStatusResponse.ts +6 -0
  145. package/services/mac-bridge/codex-types/GetConversationSummaryParams.ts +6 -0
  146. package/services/mac-bridge/codex-types/GetConversationSummaryResponse.ts +6 -0
  147. package/services/mac-bridge/codex-types/GetHistoryEntryResponseEvent.ts +10 -0
  148. package/services/mac-bridge/codex-types/GetUserAgentResponse.ts +5 -0
  149. package/services/mac-bridge/codex-types/GetUserSavedConfigResponse.ts +6 -0
  150. package/services/mac-bridge/codex-types/GhostCommit.ts +8 -0
  151. package/services/mac-bridge/codex-types/GitDiffToRemoteParams.ts +5 -0
  152. package/services/mac-bridge/codex-types/GitDiffToRemoteResponse.ts +6 -0
  153. package/services/mac-bridge/codex-types/GitSha.ts +5 -0
  154. package/services/mac-bridge/codex-types/HistoryEntry.ts +5 -0
  155. package/services/mac-bridge/codex-types/InitializeCapabilities.ts +17 -0
  156. package/services/mac-bridge/codex-types/InitializeParams.ts +7 -0
  157. package/services/mac-bridge/codex-types/InitializeResponse.ts +5 -0
  158. package/services/mac-bridge/codex-types/InputItem.ts +10 -0
  159. package/services/mac-bridge/codex-types/InputModality.ts +8 -0
  160. package/services/mac-bridge/codex-types/InterruptConversationParams.ts +6 -0
  161. package/services/mac-bridge/codex-types/InterruptConversationResponse.ts +6 -0
  162. package/services/mac-bridge/codex-types/ItemCompletedEvent.ts +7 -0
  163. package/services/mac-bridge/codex-types/ItemStartedEvent.ts +7 -0
  164. package/services/mac-bridge/codex-types/ListConversationsParams.ts +5 -0
  165. package/services/mac-bridge/codex-types/ListConversationsResponse.ts +6 -0
  166. package/services/mac-bridge/codex-types/ListCustomPromptsResponseEvent.ts +9 -0
  167. package/services/mac-bridge/codex-types/ListRemoteSkillsResponseEvent.ts +9 -0
  168. package/services/mac-bridge/codex-types/ListSkillsResponseEvent.ts +9 -0
  169. package/services/mac-bridge/codex-types/LocalShellAction.ts +6 -0
  170. package/services/mac-bridge/codex-types/LocalShellExecAction.ts +5 -0
  171. package/services/mac-bridge/codex-types/LocalShellStatus.ts +5 -0
  172. package/services/mac-bridge/codex-types/LoginApiKeyParams.ts +5 -0
  173. package/services/mac-bridge/codex-types/LoginApiKeyResponse.ts +5 -0
  174. package/services/mac-bridge/codex-types/LoginChatGptCompleteNotification.ts +8 -0
  175. package/services/mac-bridge/codex-types/LoginChatGptResponse.ts +5 -0
  176. package/services/mac-bridge/codex-types/LogoutChatGptResponse.ts +5 -0
  177. package/services/mac-bridge/codex-types/McpAuthStatus.ts +5 -0
  178. package/services/mac-bridge/codex-types/McpInvocation.ts +18 -0
  179. package/services/mac-bridge/codex-types/McpListToolsResponseEvent.ts +25 -0
  180. package/services/mac-bridge/codex-types/McpStartupCompleteEvent.ts +6 -0
  181. package/services/mac-bridge/codex-types/McpStartupFailure.ts +5 -0
  182. package/services/mac-bridge/codex-types/McpStartupStatus.ts +5 -0
  183. package/services/mac-bridge/codex-types/McpStartupUpdateEvent.ts +14 -0
  184. package/services/mac-bridge/codex-types/McpToolCallBeginEvent.ts +10 -0
  185. package/services/mac-bridge/codex-types/McpToolCallEndEvent.ts +15 -0
  186. package/services/mac-bridge/codex-types/MessagePhase.ts +11 -0
  187. package/services/mac-bridge/codex-types/ModeKind.ts +8 -0
  188. package/services/mac-bridge/codex-types/ModelRerouteEvent.ts +6 -0
  189. package/services/mac-bridge/codex-types/ModelRerouteReason.ts +5 -0
  190. package/services/mac-bridge/codex-types/NetworkAccess.ts +8 -0
  191. package/services/mac-bridge/codex-types/NetworkApprovalContext.ts +6 -0
  192. package/services/mac-bridge/codex-types/NetworkApprovalProtocol.ts +5 -0
  193. package/services/mac-bridge/codex-types/NewConversationParams.ts +8 -0
  194. package/services/mac-bridge/codex-types/NewConversationResponse.ts +7 -0
  195. package/services/mac-bridge/codex-types/ParsedCommand.ts +12 -0
  196. package/services/mac-bridge/codex-types/PatchApplyBeginEvent.ts +23 -0
  197. package/services/mac-bridge/codex-types/PatchApplyEndEvent.ts +36 -0
  198. package/services/mac-bridge/codex-types/PatchApplyStatus.ts +5 -0
  199. package/services/mac-bridge/codex-types/Personality.ts +5 -0
  200. package/services/mac-bridge/codex-types/PlanDeltaEvent.ts +5 -0
  201. package/services/mac-bridge/codex-types/PlanItem.ts +5 -0
  202. package/services/mac-bridge/codex-types/PlanItemArg.ts +6 -0
  203. package/services/mac-bridge/codex-types/PlanType.ts +5 -0
  204. package/services/mac-bridge/codex-types/Profile.ts +9 -0
  205. package/services/mac-bridge/codex-types/RateLimitSnapshot.ts +8 -0
  206. package/services/mac-bridge/codex-types/RateLimitWindow.ts +17 -0
  207. package/services/mac-bridge/codex-types/RawResponseItemEvent.ts +6 -0
  208. package/services/mac-bridge/codex-types/ReadOnlyAccess.ts +19 -0
  209. package/services/mac-bridge/codex-types/ReasoningContentDeltaEvent.ts +5 -0
  210. package/services/mac-bridge/codex-types/ReasoningEffort.ts +8 -0
  211. package/services/mac-bridge/codex-types/ReasoningItem.ts +5 -0
  212. package/services/mac-bridge/codex-types/ReasoningItemContent.ts +5 -0
  213. package/services/mac-bridge/codex-types/ReasoningItemReasoningSummary.ts +5 -0
  214. package/services/mac-bridge/codex-types/ReasoningRawContentDeltaEvent.ts +5 -0
  215. package/services/mac-bridge/codex-types/ReasoningSummary.ts +10 -0
  216. package/services/mac-bridge/codex-types/RemoteSkillDownloadedEvent.ts +8 -0
  217. package/services/mac-bridge/codex-types/RemoteSkillSummary.ts +5 -0
  218. package/services/mac-bridge/codex-types/RemoveConversationListenerParams.ts +5 -0
  219. package/services/mac-bridge/codex-types/RemoveConversationSubscriptionResponse.ts +5 -0
  220. package/services/mac-bridge/codex-types/RequestId.ts +5 -0
  221. package/services/mac-bridge/codex-types/RequestUserInputEvent.ts +15 -0
  222. package/services/mac-bridge/codex-types/RequestUserInputQuestion.ts +6 -0
  223. package/services/mac-bridge/codex-types/RequestUserInputQuestionOption.ts +5 -0
  224. package/services/mac-bridge/codex-types/Resource.ts +9 -0
  225. package/services/mac-bridge/codex-types/ResourceTemplate.ts +9 -0
  226. package/services/mac-bridge/codex-types/ResponseItem.ts +18 -0
  227. package/services/mac-bridge/codex-types/ResumeConversationParams.ts +8 -0
  228. package/services/mac-bridge/codex-types/ResumeConversationResponse.ts +7 -0
  229. package/services/mac-bridge/codex-types/ReviewCodeLocation.ts +9 -0
  230. package/services/mac-bridge/codex-types/ReviewDecision.ts +9 -0
  231. package/services/mac-bridge/codex-types/ReviewFinding.ts +9 -0
  232. package/services/mac-bridge/codex-types/ReviewLineRange.ts +8 -0
  233. package/services/mac-bridge/codex-types/ReviewOutputEvent.ts +9 -0
  234. package/services/mac-bridge/codex-types/ReviewRequest.ts +9 -0
  235. package/services/mac-bridge/codex-types/ReviewTarget.ts +9 -0
  236. package/services/mac-bridge/codex-types/SandboxMode.ts +5 -0
  237. package/services/mac-bridge/codex-types/SandboxPolicy.ts +44 -0
  238. package/services/mac-bridge/codex-types/SandboxSettings.ts +6 -0
  239. package/services/mac-bridge/codex-types/SendUserMessageParams.ts +7 -0
  240. package/services/mac-bridge/codex-types/SendUserMessageResponse.ts +5 -0
  241. package/services/mac-bridge/codex-types/SendUserTurnParams.ts +16 -0
  242. package/services/mac-bridge/codex-types/SendUserTurnResponse.ts +5 -0
  243. package/services/mac-bridge/codex-types/ServerNotification.ts +45 -0
  244. package/services/mac-bridge/codex-types/ServerRequest.ts +16 -0
  245. package/services/mac-bridge/codex-types/SessionConfiguredEvent.ts +57 -0
  246. package/services/mac-bridge/codex-types/SessionConfiguredNotification.ts +8 -0
  247. package/services/mac-bridge/codex-types/SessionNetworkProxyRuntime.ts +5 -0
  248. package/services/mac-bridge/codex-types/SessionSource.ts +6 -0
  249. package/services/mac-bridge/codex-types/SetDefaultModelParams.ts +6 -0
  250. package/services/mac-bridge/codex-types/SetDefaultModelResponse.ts +5 -0
  251. package/services/mac-bridge/codex-types/Settings.ts +9 -0
  252. package/services/mac-bridge/codex-types/SkillDependencies.ts +6 -0
  253. package/services/mac-bridge/codex-types/SkillErrorInfo.ts +5 -0
  254. package/services/mac-bridge/codex-types/SkillInterface.ts +5 -0
  255. package/services/mac-bridge/codex-types/SkillMetadata.ts +12 -0
  256. package/services/mac-bridge/codex-types/SkillScope.ts +5 -0
  257. package/services/mac-bridge/codex-types/SkillToolDependency.ts +5 -0
  258. package/services/mac-bridge/codex-types/SkillsListEntry.ts +7 -0
  259. package/services/mac-bridge/codex-types/StepStatus.ts +5 -0
  260. package/services/mac-bridge/codex-types/StreamErrorEvent.ts +12 -0
  261. package/services/mac-bridge/codex-types/SubAgentSource.ts +6 -0
  262. package/services/mac-bridge/codex-types/TerminalInteractionEvent.ts +17 -0
  263. package/services/mac-bridge/codex-types/TextElement.ts +14 -0
  264. package/services/mac-bridge/codex-types/ThreadId.ts +5 -0
  265. package/services/mac-bridge/codex-types/ThreadNameUpdatedEvent.ts +6 -0
  266. package/services/mac-bridge/codex-types/ThreadRolledBackEvent.ts +9 -0
  267. package/services/mac-bridge/codex-types/TokenCountEvent.ts +7 -0
  268. package/services/mac-bridge/codex-types/TokenUsage.ts +5 -0
  269. package/services/mac-bridge/codex-types/TokenUsageInfo.ts +6 -0
  270. package/services/mac-bridge/codex-types/Tool.ts +9 -0
  271. package/services/mac-bridge/codex-types/Tools.ts +5 -0
  272. package/services/mac-bridge/codex-types/TurnAbortReason.ts +5 -0
  273. package/services/mac-bridge/codex-types/TurnAbortedEvent.ts +6 -0
  274. package/services/mac-bridge/codex-types/TurnCompleteEvent.ts +5 -0
  275. package/services/mac-bridge/codex-types/TurnDiffEvent.ts +5 -0
  276. package/services/mac-bridge/codex-types/TurnItem.ts +11 -0
  277. package/services/mac-bridge/codex-types/TurnStartedEvent.ts +6 -0
  278. package/services/mac-bridge/codex-types/UndoCompletedEvent.ts +5 -0
  279. package/services/mac-bridge/codex-types/UndoStartedEvent.ts +5 -0
  280. package/services/mac-bridge/codex-types/UpdatePlanArgs.ts +10 -0
  281. package/services/mac-bridge/codex-types/UserInfoResponse.ts +5 -0
  282. package/services/mac-bridge/codex-types/UserInput.ts +16 -0
  283. package/services/mac-bridge/codex-types/UserMessageEvent.ts +22 -0
  284. package/services/mac-bridge/codex-types/UserMessageItem.ts +6 -0
  285. package/services/mac-bridge/codex-types/UserSavedConfig.ts +14 -0
  286. package/services/mac-bridge/codex-types/Verbosity.ts +9 -0
  287. package/services/mac-bridge/codex-types/ViewImageToolCallEvent.ts +13 -0
  288. package/services/mac-bridge/codex-types/WarningEvent.ts +5 -0
  289. package/services/mac-bridge/codex-types/WebSearchAction.ts +5 -0
  290. package/services/mac-bridge/codex-types/WebSearchBeginEvent.ts +5 -0
  291. package/services/mac-bridge/codex-types/WebSearchEndEvent.ts +6 -0
  292. package/services/mac-bridge/codex-types/WebSearchItem.ts +6 -0
  293. package/services/mac-bridge/codex-types/WebSearchMode.ts +5 -0
  294. package/services/mac-bridge/codex-types/index.ts +234 -0
  295. package/services/mac-bridge/codex-types/serde_json/JsonValue.ts +5 -0
  296. package/services/mac-bridge/codex-types/v2/Account.ts +6 -0
  297. package/services/mac-bridge/codex-types/v2/AccountLoginCompletedNotification.ts +5 -0
  298. package/services/mac-bridge/codex-types/v2/AccountRateLimitsUpdatedNotification.ts +6 -0
  299. package/services/mac-bridge/codex-types/v2/AccountUpdatedNotification.ts +6 -0
  300. package/services/mac-bridge/codex-types/v2/AgentMessageDeltaNotification.ts +5 -0
  301. package/services/mac-bridge/codex-types/v2/AnalyticsConfig.ts +6 -0
  302. package/services/mac-bridge/codex-types/v2/AppBranding.ts +8 -0
  303. package/services/mac-bridge/codex-types/v2/AppDisabledReason.ts +5 -0
  304. package/services/mac-bridge/codex-types/v2/AppInfo.ts +19 -0
  305. package/services/mac-bridge/codex-types/v2/AppListUpdatedNotification.ts +9 -0
  306. package/services/mac-bridge/codex-types/v2/AppMetadata.ts +7 -0
  307. package/services/mac-bridge/codex-types/v2/AppReview.ts +5 -0
  308. package/services/mac-bridge/codex-types/v2/AppScreenshot.ts +5 -0
  309. package/services/mac-bridge/codex-types/v2/AppsConfig.ts +6 -0
  310. package/services/mac-bridge/codex-types/v2/AppsListParams.ts +24 -0
  311. package/services/mac-bridge/codex-types/v2/AppsListResponse.ts +14 -0
  312. package/services/mac-bridge/codex-types/v2/AskForApproval.ts +5 -0
  313. package/services/mac-bridge/codex-types/v2/ByteRange.ts +5 -0
  314. package/services/mac-bridge/codex-types/v2/CancelLoginAccountParams.ts +5 -0
  315. package/services/mac-bridge/codex-types/v2/CancelLoginAccountResponse.ts +6 -0
  316. package/services/mac-bridge/codex-types/v2/CancelLoginAccountStatus.ts +5 -0
  317. package/services/mac-bridge/codex-types/v2/ChatgptAuthTokensRefreshParams.ts +16 -0
  318. package/services/mac-bridge/codex-types/v2/ChatgptAuthTokensRefreshReason.ts +5 -0
  319. package/services/mac-bridge/codex-types/v2/ChatgptAuthTokensRefreshResponse.ts +5 -0
  320. package/services/mac-bridge/codex-types/v2/CodexErrorInfo.ts +11 -0
  321. package/services/mac-bridge/codex-types/v2/CollabAgentState.ts +6 -0
  322. package/services/mac-bridge/codex-types/v2/CollabAgentStatus.ts +5 -0
  323. package/services/mac-bridge/codex-types/v2/CollabAgentTool.ts +5 -0
  324. package/services/mac-bridge/codex-types/v2/CollabAgentToolCallStatus.ts +5 -0
  325. package/services/mac-bridge/codex-types/v2/CommandAction.ts +5 -0
  326. package/services/mac-bridge/codex-types/v2/CommandExecParams.ts +6 -0
  327. package/services/mac-bridge/codex-types/v2/CommandExecResponse.ts +5 -0
  328. package/services/mac-bridge/codex-types/v2/CommandExecutionApprovalDecision.ts +6 -0
  329. package/services/mac-bridge/codex-types/v2/CommandExecutionOutputDeltaNotification.ts +5 -0
  330. package/services/mac-bridge/codex-types/v2/CommandExecutionRequestApprovalParams.ts +37 -0
  331. package/services/mac-bridge/codex-types/v2/CommandExecutionRequestApprovalResponse.ts +6 -0
  332. package/services/mac-bridge/codex-types/v2/CommandExecutionStatus.ts +5 -0
  333. package/services/mac-bridge/codex-types/v2/Config.ts +17 -0
  334. package/services/mac-bridge/codex-types/v2/ConfigBatchWriteParams.ts +10 -0
  335. package/services/mac-bridge/codex-types/v2/ConfigEdit.ts +7 -0
  336. package/services/mac-bridge/codex-types/v2/ConfigLayer.ts +7 -0
  337. package/services/mac-bridge/codex-types/v2/ConfigLayerMetadata.ts +6 -0
  338. package/services/mac-bridge/codex-types/v2/ConfigLayerSource.ts +16 -0
  339. package/services/mac-bridge/codex-types/v2/ConfigReadParams.ts +11 -0
  340. package/services/mac-bridge/codex-types/v2/ConfigReadResponse.ts +8 -0
  341. package/services/mac-bridge/codex-types/v2/ConfigRequirements.ts +9 -0
  342. package/services/mac-bridge/codex-types/v2/ConfigRequirementsReadResponse.ts +10 -0
  343. package/services/mac-bridge/codex-types/v2/ConfigValueWriteParams.ts +11 -0
  344. package/services/mac-bridge/codex-types/v2/ConfigWarningNotification.ts +22 -0
  345. package/services/mac-bridge/codex-types/v2/ConfigWriteResponse.ts +12 -0
  346. package/services/mac-bridge/codex-types/v2/ContextCompactedNotification.ts +8 -0
  347. package/services/mac-bridge/codex-types/v2/CreditsSnapshot.ts +5 -0
  348. package/services/mac-bridge/codex-types/v2/DeprecationNoticeNotification.ts +13 -0
  349. package/services/mac-bridge/codex-types/v2/DynamicToolCallOutputContentItem.ts +5 -0
  350. package/services/mac-bridge/codex-types/v2/DynamicToolCallParams.ts +6 -0
  351. package/services/mac-bridge/codex-types/v2/DynamicToolCallResponse.ts +6 -0
  352. package/services/mac-bridge/codex-types/v2/DynamicToolSpec.ts +6 -0
  353. package/services/mac-bridge/codex-types/v2/ErrorNotification.ts +6 -0
  354. package/services/mac-bridge/codex-types/v2/ExecPolicyAmendment.ts +5 -0
  355. package/services/mac-bridge/codex-types/v2/ExperimentalFeature.ts +37 -0
  356. package/services/mac-bridge/codex-types/v2/ExperimentalFeatureListParams.ts +13 -0
  357. package/services/mac-bridge/codex-types/v2/ExperimentalFeatureListResponse.ts +11 -0
  358. package/services/mac-bridge/codex-types/v2/ExperimentalFeatureStage.ts +5 -0
  359. package/services/mac-bridge/codex-types/v2/FeedbackUploadParams.ts +5 -0
  360. package/services/mac-bridge/codex-types/v2/FeedbackUploadResponse.ts +5 -0
  361. package/services/mac-bridge/codex-types/v2/FileChangeApprovalDecision.ts +5 -0
  362. package/services/mac-bridge/codex-types/v2/FileChangeOutputDeltaNotification.ts +5 -0
  363. package/services/mac-bridge/codex-types/v2/FileChangeRequestApprovalParams.ts +14 -0
  364. package/services/mac-bridge/codex-types/v2/FileChangeRequestApprovalResponse.ts +6 -0
  365. package/services/mac-bridge/codex-types/v2/FileUpdateChange.ts +6 -0
  366. package/services/mac-bridge/codex-types/v2/GetAccountParams.ts +13 -0
  367. package/services/mac-bridge/codex-types/v2/GetAccountRateLimitsResponse.ts +14 -0
  368. package/services/mac-bridge/codex-types/v2/GetAccountResponse.ts +6 -0
  369. package/services/mac-bridge/codex-types/v2/GitInfo.ts +5 -0
  370. package/services/mac-bridge/codex-types/v2/HazelnutScope.ts +5 -0
  371. package/services/mac-bridge/codex-types/v2/ItemCompletedNotification.ts +6 -0
  372. package/services/mac-bridge/codex-types/v2/ItemStartedNotification.ts +6 -0
  373. package/services/mac-bridge/codex-types/v2/ListMcpServerStatusParams.ts +13 -0
  374. package/services/mac-bridge/codex-types/v2/ListMcpServerStatusResponse.ts +11 -0
  375. package/services/mac-bridge/codex-types/v2/LoginAccountParams.ts +21 -0
  376. package/services/mac-bridge/codex-types/v2/LoginAccountResponse.ts +9 -0
  377. package/services/mac-bridge/codex-types/v2/LogoutAccountResponse.ts +5 -0
  378. package/services/mac-bridge/codex-types/v2/McpAuthStatus.ts +5 -0
  379. package/services/mac-bridge/codex-types/v2/McpServerOauthLoginCompletedNotification.ts +5 -0
  380. package/services/mac-bridge/codex-types/v2/McpServerOauthLoginParams.ts +5 -0
  381. package/services/mac-bridge/codex-types/v2/McpServerOauthLoginResponse.ts +5 -0
  382. package/services/mac-bridge/codex-types/v2/McpServerRefreshResponse.ts +5 -0
  383. package/services/mac-bridge/codex-types/v2/McpServerStatus.ts +9 -0
  384. package/services/mac-bridge/codex-types/v2/McpToolCallError.ts +5 -0
  385. package/services/mac-bridge/codex-types/v2/McpToolCallProgressNotification.ts +5 -0
  386. package/services/mac-bridge/codex-types/v2/McpToolCallResult.ts +6 -0
  387. package/services/mac-bridge/codex-types/v2/McpToolCallStatus.ts +5 -0
  388. package/services/mac-bridge/codex-types/v2/MergeStrategy.ts +5 -0
  389. package/services/mac-bridge/codex-types/v2/Model.ts +8 -0
  390. package/services/mac-bridge/codex-types/v2/ModelListParams.ts +17 -0
  391. package/services/mac-bridge/codex-types/v2/ModelListResponse.ts +11 -0
  392. package/services/mac-bridge/codex-types/v2/ModelRerouteReason.ts +5 -0
  393. package/services/mac-bridge/codex-types/v2/ModelReroutedNotification.ts +6 -0
  394. package/services/mac-bridge/codex-types/v2/NetworkAccess.ts +5 -0
  395. package/services/mac-bridge/codex-types/v2/NetworkRequirements.ts +5 -0
  396. package/services/mac-bridge/codex-types/v2/OverriddenMetadata.ts +7 -0
  397. package/services/mac-bridge/codex-types/v2/PatchApplyStatus.ts +5 -0
  398. package/services/mac-bridge/codex-types/v2/PatchChangeKind.ts +5 -0
  399. package/services/mac-bridge/codex-types/v2/PlanDeltaNotification.ts +9 -0
  400. package/services/mac-bridge/codex-types/v2/ProductSurface.ts +5 -0
  401. package/services/mac-bridge/codex-types/v2/ProfileV2.ts +11 -0
  402. package/services/mac-bridge/codex-types/v2/RateLimitSnapshot.ts +8 -0
  403. package/services/mac-bridge/codex-types/v2/RateLimitWindow.ts +5 -0
  404. package/services/mac-bridge/codex-types/v2/RawResponseItemCompletedNotification.ts +6 -0
  405. package/services/mac-bridge/codex-types/v2/ReadOnlyAccess.ts +6 -0
  406. package/services/mac-bridge/codex-types/v2/ReasoningEffortOption.ts +6 -0
  407. package/services/mac-bridge/codex-types/v2/ReasoningSummaryPartAddedNotification.ts +5 -0
  408. package/services/mac-bridge/codex-types/v2/ReasoningSummaryTextDeltaNotification.ts +5 -0
  409. package/services/mac-bridge/codex-types/v2/ReasoningTextDeltaNotification.ts +5 -0
  410. package/services/mac-bridge/codex-types/v2/RemoteSkillSummary.ts +5 -0
  411. package/services/mac-bridge/codex-types/v2/ResidencyRequirement.ts +5 -0
  412. package/services/mac-bridge/codex-types/v2/ReviewDelivery.ts +5 -0
  413. package/services/mac-bridge/codex-types/v2/ReviewStartParams.ts +12 -0
  414. package/services/mac-bridge/codex-types/v2/ReviewStartResponse.ts +13 -0
  415. package/services/mac-bridge/codex-types/v2/ReviewTarget.ts +9 -0
  416. package/services/mac-bridge/codex-types/v2/SandboxMode.ts +5 -0
  417. package/services/mac-bridge/codex-types/v2/SandboxPolicy.ts +8 -0
  418. package/services/mac-bridge/codex-types/v2/SandboxWorkspaceWrite.ts +5 -0
  419. package/services/mac-bridge/codex-types/v2/SessionSource.ts +6 -0
  420. package/services/mac-bridge/codex-types/v2/SkillDependencies.ts +6 -0
  421. package/services/mac-bridge/codex-types/v2/SkillErrorInfo.ts +5 -0
  422. package/services/mac-bridge/codex-types/v2/SkillInterface.ts +5 -0
  423. package/services/mac-bridge/codex-types/v2/SkillMetadata.ts +12 -0
  424. package/services/mac-bridge/codex-types/v2/SkillScope.ts +5 -0
  425. package/services/mac-bridge/codex-types/v2/SkillToolDependency.ts +5 -0
  426. package/services/mac-bridge/codex-types/v2/SkillsConfigWriteParams.ts +5 -0
  427. package/services/mac-bridge/codex-types/v2/SkillsConfigWriteResponse.ts +5 -0
  428. package/services/mac-bridge/codex-types/v2/SkillsListEntry.ts +7 -0
  429. package/services/mac-bridge/codex-types/v2/SkillsListExtraRootsForCwd.ts +5 -0
  430. package/services/mac-bridge/codex-types/v2/SkillsListParams.ts +18 -0
  431. package/services/mac-bridge/codex-types/v2/SkillsListResponse.ts +6 -0
  432. package/services/mac-bridge/codex-types/v2/SkillsRemoteReadParams.ts +7 -0
  433. package/services/mac-bridge/codex-types/v2/SkillsRemoteReadResponse.ts +6 -0
  434. package/services/mac-bridge/codex-types/v2/SkillsRemoteWriteParams.ts +5 -0
  435. package/services/mac-bridge/codex-types/v2/SkillsRemoteWriteResponse.ts +5 -0
  436. package/services/mac-bridge/codex-types/v2/TerminalInteractionNotification.ts +5 -0
  437. package/services/mac-bridge/codex-types/v2/TextElement.ts +14 -0
  438. package/services/mac-bridge/codex-types/v2/TextPosition.ts +13 -0
  439. package/services/mac-bridge/codex-types/v2/TextRange.ts +6 -0
  440. package/services/mac-bridge/codex-types/v2/Thread.ts +51 -0
  441. package/services/mac-bridge/codex-types/v2/ThreadArchiveParams.ts +5 -0
  442. package/services/mac-bridge/codex-types/v2/ThreadArchiveResponse.ts +5 -0
  443. package/services/mac-bridge/codex-types/v2/ThreadArchivedNotification.ts +5 -0
  444. package/services/mac-bridge/codex-types/v2/ThreadCompactStartParams.ts +5 -0
  445. package/services/mac-bridge/codex-types/v2/ThreadCompactStartResponse.ts +5 -0
  446. package/services/mac-bridge/codex-types/v2/ThreadForkParams.ts +28 -0
  447. package/services/mac-bridge/codex-types/v2/ThreadForkResponse.ts +9 -0
  448. package/services/mac-bridge/codex-types/v2/ThreadItem.ts +81 -0
  449. package/services/mac-bridge/codex-types/v2/ThreadListParams.ts +39 -0
  450. package/services/mac-bridge/codex-types/v2/ThreadListResponse.ts +11 -0
  451. package/services/mac-bridge/codex-types/v2/ThreadLoadedListParams.ts +13 -0
  452. package/services/mac-bridge/codex-types/v2/ThreadLoadedListResponse.ts +14 -0
  453. package/services/mac-bridge/codex-types/v2/ThreadNameUpdatedNotification.ts +5 -0
  454. package/services/mac-bridge/codex-types/v2/ThreadReadParams.ts +9 -0
  455. package/services/mac-bridge/codex-types/v2/ThreadReadResponse.ts +6 -0
  456. package/services/mac-bridge/codex-types/v2/ThreadResumeParams.ts +37 -0
  457. package/services/mac-bridge/codex-types/v2/ThreadResumeResponse.ts +9 -0
  458. package/services/mac-bridge/codex-types/v2/ThreadRollbackParams.ts +12 -0
  459. package/services/mac-bridge/codex-types/v2/ThreadRollbackResponse.ts +14 -0
  460. package/services/mac-bridge/codex-types/v2/ThreadSetNameParams.ts +5 -0
  461. package/services/mac-bridge/codex-types/v2/ThreadSetNameResponse.ts +5 -0
  462. package/services/mac-bridge/codex-types/v2/ThreadSortKey.ts +5 -0
  463. package/services/mac-bridge/codex-types/v2/ThreadSourceKind.ts +5 -0
  464. package/services/mac-bridge/codex-types/v2/ThreadStartParams.ts +17 -0
  465. package/services/mac-bridge/codex-types/v2/ThreadStartResponse.ts +9 -0
  466. package/services/mac-bridge/codex-types/v2/ThreadStartedNotification.ts +6 -0
  467. package/services/mac-bridge/codex-types/v2/ThreadTokenUsage.ts +6 -0
  468. package/services/mac-bridge/codex-types/v2/ThreadTokenUsageUpdatedNotification.ts +6 -0
  469. package/services/mac-bridge/codex-types/v2/ThreadUnarchiveParams.ts +5 -0
  470. package/services/mac-bridge/codex-types/v2/ThreadUnarchiveResponse.ts +6 -0
  471. package/services/mac-bridge/codex-types/v2/ThreadUnarchivedNotification.ts +5 -0
  472. package/services/mac-bridge/codex-types/v2/TokenUsageBreakdown.ts +5 -0
  473. package/services/mac-bridge/codex-types/v2/ToolRequestUserInputAnswer.ts +8 -0
  474. package/services/mac-bridge/codex-types/v2/ToolRequestUserInputOption.ts +8 -0
  475. package/services/mac-bridge/codex-types/v2/ToolRequestUserInputParams.ts +9 -0
  476. package/services/mac-bridge/codex-types/v2/ToolRequestUserInputQuestion.ts +9 -0
  477. package/services/mac-bridge/codex-types/v2/ToolRequestUserInputResponse.ts +9 -0
  478. package/services/mac-bridge/codex-types/v2/ToolsV2.ts +5 -0
  479. package/services/mac-bridge/codex-types/v2/Turn.ts +18 -0
  480. package/services/mac-bridge/codex-types/v2/TurnCompletedNotification.ts +6 -0
  481. package/services/mac-bridge/codex-types/v2/TurnDiffUpdatedNotification.ts +9 -0
  482. package/services/mac-bridge/codex-types/v2/TurnError.ts +6 -0
  483. package/services/mac-bridge/codex-types/v2/TurnInterruptParams.ts +5 -0
  484. package/services/mac-bridge/codex-types/v2/TurnInterruptResponse.ts +5 -0
  485. package/services/mac-bridge/codex-types/v2/TurnPlanStep.ts +6 -0
  486. package/services/mac-bridge/codex-types/v2/TurnPlanStepStatus.ts +5 -0
  487. package/services/mac-bridge/codex-types/v2/TurnPlanUpdatedNotification.ts +6 -0
  488. package/services/mac-bridge/codex-types/v2/TurnStartParams.ts +44 -0
  489. package/services/mac-bridge/codex-types/v2/TurnStartResponse.ts +6 -0
  490. package/services/mac-bridge/codex-types/v2/TurnStartedNotification.ts +6 -0
  491. package/services/mac-bridge/codex-types/v2/TurnStatus.ts +5 -0
  492. package/services/mac-bridge/codex-types/v2/TurnSteerParams.ts +11 -0
  493. package/services/mac-bridge/codex-types/v2/TurnSteerResponse.ts +5 -0
  494. package/services/mac-bridge/codex-types/v2/UserInput.ts +10 -0
  495. package/services/mac-bridge/codex-types/v2/WebSearchAction.ts +5 -0
  496. package/services/mac-bridge/codex-types/v2/WindowsWorldWritableWarningNotification.ts +5 -0
  497. package/services/mac-bridge/codex-types/v2/WriteStatus.ts +5 -0
  498. package/services/mac-bridge/codex-types/v2/index.ts +204 -0
  499. package/services/mac-bridge/eslint.config.cjs +22 -0
  500. package/services/mac-bridge/package.json +30 -0
  501. package/services/mac-bridge/schema.ts +0 -0
  502. package/services/mac-bridge/src/index.ts +18 -0
  503. package/services/mac-bridge/src/server.ts +426 -0
  504. package/services/mac-bridge/src/services/__tests__/gitService.test.ts +157 -0
  505. package/services/mac-bridge/src/services/__tests__/realtimeHub.test.ts +116 -0
  506. package/services/mac-bridge/src/services/__tests__/terminalService.test.ts +51 -0
  507. package/services/mac-bridge/src/services/codexAppServerClient.ts +507 -0
  508. package/services/mac-bridge/src/services/codexCliAdapter.ts +622 -0
  509. package/services/mac-bridge/src/services/gitService.ts +61 -0
  510. package/services/mac-bridge/src/services/realtimeHub.ts +25 -0
  511. package/services/mac-bridge/src/services/terminalService.ts +226 -0
  512. package/services/mac-bridge/src/types.ts +151 -0
  513. package/services/mac-bridge/src/utils/__tests__/threadMapping.test.ts +397 -0
  514. package/services/mac-bridge/src/utils/threadMapping.ts +176 -0
  515. package/services/mac-bridge/tsconfig.json +16 -0
  516. package/services/mac-bridge/vitest.config.ts +9 -0
  517. package/services/rust-bridge/.env.example +11 -0
  518. package/services/rust-bridge/Cargo.lock +1127 -0
  519. package/services/rust-bridge/Cargo.toml +14 -0
  520. package/services/rust-bridge/package.json +13 -0
  521. package/services/rust-bridge/security_best_practices_report.md +24 -0
  522. package/services/rust-bridge/src/main.rs +2713 -0
  523. package/services/rust-bridge/src/services/git.rs +271 -0
  524. package/services/rust-bridge/src/services/mod.rs +5 -0
  525. package/services/rust-bridge/src/services/terminal.rs +267 -0
  526. package/tsconfig.json +4 -0
@@ -0,0 +1,591 @@
1
+ import type {
2
+ Chat,
3
+ ChatMessage,
4
+ ChatStatus,
5
+ ChatSummary,
6
+ } from './types';
7
+
8
+ export type RawThreadStatus =
9
+ | { type?: string }
10
+ | string
11
+ | null
12
+ | undefined;
13
+
14
+ export interface RawTurn {
15
+ id?: string;
16
+ status?: string;
17
+ error?: {
18
+ message?: string;
19
+ } | null;
20
+ items?: RawThreadItem[];
21
+ }
22
+
23
+ export type RawThreadItem =
24
+ | {
25
+ type?: 'userMessage';
26
+ id?: string;
27
+ content?: Array<{ type?: string; text?: string; path?: string; url?: string }>;
28
+ }
29
+ | {
30
+ type?: 'agentMessage';
31
+ id?: string;
32
+ text?: string;
33
+ }
34
+ | {
35
+ type?: string;
36
+ id?: string;
37
+ text?: string;
38
+ };
39
+
40
+ export interface RawThread {
41
+ id?: string;
42
+ name?: string;
43
+ title?: string;
44
+ preview?: string;
45
+ modelProvider?: string;
46
+ createdAt?: number;
47
+ updatedAt?: number;
48
+ status?: RawThreadStatus;
49
+ cwd?: string;
50
+ source?: unknown;
51
+ turns?: RawTurn[];
52
+ }
53
+
54
+ export function toRecord(value: unknown): Record<string, unknown> | null {
55
+ return typeof value === 'object' && value !== null
56
+ ? (value as Record<string, unknown>)
57
+ : null;
58
+ }
59
+
60
+ export function readString(value: unknown): string | null {
61
+ return typeof value === 'string' ? value : null;
62
+ }
63
+
64
+ function readNumber(value: unknown): number | null {
65
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
66
+ }
67
+
68
+ export function toPreview(value: string): string {
69
+ const collapsed = value.replace(/\s+/g, ' ').trim();
70
+ if (collapsed.length <= 180) {
71
+ return collapsed;
72
+ }
73
+
74
+ return `${collapsed.slice(0, 177)}...`;
75
+ }
76
+
77
+ function unixSecondsToIso(value: number | undefined): string {
78
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
79
+ return new Date().toISOString();
80
+ }
81
+
82
+ return new Date(value * 1000).toISOString();
83
+ }
84
+
85
+ function mapRawStatus(status: unknown, turns: RawTurn[] | undefined): ChatStatus {
86
+ const statusRecord = toRecord(status);
87
+ const statusType = readString(statusRecord?.type) ?? readString(status);
88
+ const hasTurns = Array.isArray(turns) && turns.length > 0;
89
+ const lastTurn = hasTurns ? turns[turns.length - 1] : null;
90
+ const lastTurnStatus = readString(lastTurn?.status);
91
+ const isIdleLikeStatus = statusType === 'idle' || statusType === 'notLoaded';
92
+
93
+ if (lastTurnStatus === 'inProgress') {
94
+ // Some thread/read payloads can return stale turn state while the thread
95
+ // itself is already idle/notLoaded. Prefer the thread lifecycle in that case.
96
+ if (isIdleLikeStatus) {
97
+ return hasTurns ? 'complete' : 'idle';
98
+ }
99
+ return 'running';
100
+ }
101
+
102
+ if (lastTurnStatus === 'failed' || lastTurnStatus === 'interrupted') {
103
+ return 'error';
104
+ }
105
+
106
+ if (lastTurnStatus === 'completed') {
107
+ return 'complete';
108
+ }
109
+
110
+ if (statusType === 'systemError') {
111
+ return 'error';
112
+ }
113
+
114
+ if (statusType === 'active') {
115
+ // Some backends keep a thread "active" while loaded in memory even when no
116
+ // turn is running. If there is no in-progress turn, avoid false "working" UI.
117
+ return hasTurns ? 'complete' : 'idle';
118
+ }
119
+
120
+ if (isIdleLikeStatus) {
121
+ return hasTurns ? 'complete' : 'idle';
122
+ }
123
+
124
+ return 'idle';
125
+ }
126
+
127
+ function extractLastError(turns: RawTurn[]): string | null {
128
+ for (let i = turns.length - 1; i >= 0; i -= 1) {
129
+ const turn = turns[i];
130
+ const turnStatus = readString(turn.status);
131
+ if (turnStatus !== 'failed' && turnStatus !== 'interrupted') {
132
+ continue;
133
+ }
134
+
135
+ const message = readString(turn.error?.message);
136
+ if (message) {
137
+ return message;
138
+ }
139
+
140
+ return `turn ${turnStatus}`;
141
+ }
142
+
143
+ return null;
144
+ }
145
+
146
+ export function toRawThread(value: unknown): RawThread {
147
+ const record = toRecord(value) ?? {};
148
+ const threadName =
149
+ readString(record.name) ??
150
+ readString(record.title) ??
151
+ readString(record.threadName) ??
152
+ readString(record.thread_name) ??
153
+ undefined;
154
+ return {
155
+ id: readString(record.id) ?? undefined,
156
+ name: threadName,
157
+ title: threadName,
158
+ preview: readString(record.preview) ?? undefined,
159
+ modelProvider: readString(record.modelProvider) ?? undefined,
160
+ createdAt: readNumber(record.createdAt) ?? undefined,
161
+ updatedAt: readNumber(record.updatedAt) ?? undefined,
162
+ status: (record.status as RawThreadStatus) ?? undefined,
163
+ cwd: readString(record.cwd) ?? undefined,
164
+ source: record.source,
165
+ turns: Array.isArray(record.turns)
166
+ ? (record.turns.map((turn) => toRawTurn(turn)).filter(Boolean) as RawTurn[])
167
+ : undefined,
168
+ };
169
+ }
170
+
171
+ function toRawTurn(value: unknown): RawTurn | null {
172
+ const record = toRecord(value);
173
+ if (!record) {
174
+ return null;
175
+ }
176
+
177
+ const items = Array.isArray(record.items)
178
+ ? (record.items
179
+ .map((item) => toRecord(item))
180
+ .filter((item): item is RawThreadItem => item !== null) as RawThreadItem[])
181
+ : undefined;
182
+
183
+ return {
184
+ id: readString(record.id) ?? undefined,
185
+ status: readString(record.status) ?? undefined,
186
+ error: toRecord(record.error) as { message?: string } | null,
187
+ items,
188
+ };
189
+ }
190
+
191
+ export function mapChatSummary(raw: RawThread): ChatSummary | null {
192
+ if (!raw.id) {
193
+ return null;
194
+ }
195
+
196
+ const createdAt = unixSecondsToIso(raw.createdAt);
197
+ const updatedAt = unixSecondsToIso(raw.updatedAt);
198
+ const turns = Array.isArray(raw.turns) ? raw.turns : [];
199
+
200
+ const lastError = extractLastError(turns);
201
+ const displayTitle = raw.name ?? raw.preview;
202
+
203
+ return {
204
+ id: raw.id,
205
+ title: toPreview(displayTitle || `Chat ${raw.id.slice(0, 8)}`),
206
+ status: mapRawStatus(raw.status, turns),
207
+ createdAt,
208
+ updatedAt,
209
+ statusUpdatedAt: updatedAt,
210
+ lastMessagePreview: toPreview(raw.preview || ''),
211
+ cwd: readString(raw.cwd) ?? undefined,
212
+ modelProvider: readString(raw.modelProvider) ?? undefined,
213
+ sourceKind: mapSourceKind(raw.source),
214
+ lastError: lastError ?? undefined,
215
+ };
216
+ }
217
+
218
+ function mapSourceKind(source: unknown): string | undefined {
219
+ if (typeof source === 'string') {
220
+ return source;
221
+ }
222
+
223
+ const sourceRecord = toRecord(source);
224
+ if (!sourceRecord) {
225
+ return undefined;
226
+ }
227
+
228
+ // Legacy shape used by older adapters.
229
+ const legacyKind = readString(sourceRecord.kind);
230
+ if (legacyKind) {
231
+ return legacyKind;
232
+ }
233
+
234
+ // Current app-server shape: { subAgent: ... } tagged union.
235
+ if ('subAgent' in sourceRecord) {
236
+ const subAgent = sourceRecord.subAgent;
237
+ if (typeof subAgent === 'string') {
238
+ if (subAgent === 'review') return 'subAgentReview';
239
+ if (subAgent === 'compact') return 'subAgentCompact';
240
+ if (subAgent === 'memory_consolidation') return 'subAgentOther';
241
+ return 'subAgent';
242
+ }
243
+
244
+ const subAgentRecord = toRecord(subAgent);
245
+ if (!subAgentRecord) {
246
+ return 'subAgent';
247
+ }
248
+
249
+ if (toRecord(subAgentRecord.thread_spawn)) {
250
+ return 'subAgentThreadSpawn';
251
+ }
252
+
253
+ if (readString(subAgentRecord.other)) {
254
+ return 'subAgentOther';
255
+ }
256
+
257
+ return 'subAgent';
258
+ }
259
+
260
+ const typeKind = readString(sourceRecord.type);
261
+ if (typeKind && typeKind.startsWith('subAgent')) {
262
+ return typeKind;
263
+ }
264
+
265
+ return undefined;
266
+ }
267
+
268
+ export function mapChat(raw: RawThread): Chat {
269
+ const summary = mapChatSummary(raw);
270
+ if (!summary) {
271
+ throw new Error('chat id missing in app-server response');
272
+ }
273
+
274
+ const messages = mapMessages(raw, summary.createdAt);
275
+
276
+ const lastPreview =
277
+ messages.length > 0
278
+ ? toPreview(messages[messages.length - 1].content)
279
+ : summary.lastMessagePreview;
280
+
281
+ return {
282
+ ...summary,
283
+ lastMessagePreview: lastPreview,
284
+ messages,
285
+ };
286
+ }
287
+
288
+ function mapMessages(raw: RawThread, fallbackCreatedAt: string): ChatMessage[] {
289
+ const turns = Array.isArray(raw.turns) ? raw.turns : [];
290
+ if (turns.length === 0) {
291
+ return [];
292
+ }
293
+
294
+ const baseTs = new Date(fallbackCreatedAt).getTime();
295
+ const messages: ChatMessage[] = [];
296
+
297
+ for (const turn of turns) {
298
+ const items = Array.isArray(turn.items) ? turn.items : [];
299
+ for (const item of items) {
300
+ const itemRecord = toRecord(item);
301
+ if (!itemRecord) {
302
+ continue;
303
+ }
304
+
305
+ const itemType = readString(itemRecord.type);
306
+
307
+ if (itemType === 'userMessage') {
308
+ const contentItems = Array.isArray(itemRecord.content) ? itemRecord.content : [];
309
+ const text = contentItems
310
+ .map((entry: unknown) => {
311
+ const entryRecord = toRecord(entry);
312
+ if (!entryRecord) {
313
+ return '';
314
+ }
315
+
316
+ const entryType = readString(entryRecord.type);
317
+ if (entryType === 'text') {
318
+ return readString(entryRecord.text) ?? '';
319
+ }
320
+
321
+ if (entryType === 'image') {
322
+ return `[image: ${readString(entryRecord.url) ?? 'unknown'}]`;
323
+ }
324
+
325
+ if (entryType === 'localImage') {
326
+ return `[local image: ${readString(entryRecord.path) ?? 'unknown'}]`;
327
+ }
328
+
329
+ if (entryType === 'mention') {
330
+ const mentionPath = readString(entryRecord.path) ?? 'unknown';
331
+ return `[file: ${mentionPath}]`;
332
+ }
333
+
334
+ return '';
335
+ })
336
+ .filter(Boolean)
337
+ .join('\n');
338
+
339
+ if (!text.trim()) {
340
+ continue;
341
+ }
342
+
343
+ messages.push({
344
+ id: readString(itemRecord.id) ?? generateLocalId(),
345
+ role: 'user',
346
+ content: text,
347
+ createdAt: new Date(baseTs + messages.length * 1000).toISOString(),
348
+ });
349
+ continue;
350
+ }
351
+
352
+ if (itemType === 'agentMessage') {
353
+ const text = readString(itemRecord.text) ?? '';
354
+ if (!text.trim()) {
355
+ continue;
356
+ }
357
+
358
+ messages.push({
359
+ id: readString(itemRecord.id) ?? generateLocalId(),
360
+ role: 'assistant',
361
+ content: text,
362
+ createdAt: new Date(baseTs + messages.length * 1000).toISOString(),
363
+ });
364
+ continue;
365
+ }
366
+
367
+ const toolLikeMessage = toToolLikeMessage(itemRecord);
368
+ if (toolLikeMessage) {
369
+ messages.push({
370
+ id: readString(itemRecord.id) ?? generateLocalId(),
371
+ role: 'system',
372
+ content: toolLikeMessage,
373
+ createdAt: new Date(baseTs + messages.length * 1000).toISOString(),
374
+ });
375
+ }
376
+ }
377
+ }
378
+
379
+ return messages;
380
+ }
381
+
382
+ function generateLocalId(): string {
383
+ return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
384
+ }
385
+
386
+ function toToolLikeMessage(item: Record<string, unknown>): string | null {
387
+ const rawType = readString(item.type);
388
+ if (!rawType) {
389
+ return null;
390
+ }
391
+
392
+ const type = normalizeType(rawType);
393
+
394
+ if (type === 'plan') {
395
+ const text = normalizeMultiline(readString(item.text), 1800);
396
+ return text || null;
397
+ }
398
+
399
+ if (type === 'commandexecution') {
400
+ const command = normalizeInline(readString(item.command), 240) ?? 'command';
401
+ const status = normalizeType(readString(item.status) ?? '');
402
+ const output =
403
+ normalizeMultiline(readString(item.aggregatedOutput), 2400) ??
404
+ normalizeMultiline(readString(item.aggregated_output), 2400);
405
+ const exitCode = readNumber(item.exitCode) ?? readNumber(item.exit_code);
406
+ const title =
407
+ status === 'failed' || status === 'error'
408
+ ? `• Command failed \`${command}\``
409
+ : `• Ran \`${command}\``;
410
+ const outputPreview = output ? toNestedOutput(output, 8, 1600) : null;
411
+ const detail = outputPreview ?? (exitCode !== null ? `exit code ${String(exitCode)}` : null);
412
+ return withNestedDetail(title, detail);
413
+ }
414
+
415
+ if (type === 'mcptoolcall') {
416
+ const server = normalizeInline(readString(item.server), 120);
417
+ const tool = normalizeInline(readString(item.tool), 120);
418
+ const label = [server, tool].filter(Boolean).join(' / ') || 'MCP tool call';
419
+ const status = normalizeType(readString(item.status) ?? '');
420
+ const errorRecord = toRecord(item.error);
421
+ const errorDetail =
422
+ normalizeInline(readString(errorRecord?.message), 240) ??
423
+ normalizeInline(readString(item.error), 240);
424
+ const resultDetail = toStructuredPreview(item.result, 240);
425
+ const detail =
426
+ status === 'failed' || status === 'error'
427
+ ? errorDetail ?? resultDetail
428
+ : resultDetail;
429
+ const title =
430
+ status === 'failed' || status === 'error'
431
+ ? `• Tool failed \`${label}\``
432
+ : `• Called tool \`${label}\``;
433
+ return withNestedDetail(title, detail);
434
+ }
435
+
436
+ if (type === 'websearch') {
437
+ const query = normalizeInline(readString(item.query), 180);
438
+ const actionRecord = toRecord(item.action);
439
+ const actionType = normalizeType(readString(actionRecord?.type) ?? '');
440
+ let detail: string | null = query;
441
+
442
+ if (actionType === 'openpage') {
443
+ detail = normalizeInline(readString(actionRecord?.url), 240) ?? detail;
444
+ } else if (actionType === 'findinpage') {
445
+ const url = normalizeInline(readString(actionRecord?.url), 180);
446
+ const pattern = normalizeInline(readString(actionRecord?.pattern), 120);
447
+ detail = [url, pattern ? `pattern: ${pattern}` : null].filter(Boolean).join(' | ') || detail;
448
+ }
449
+
450
+ const title = query ? `• Searched web for "${query}"` : '• Searched web';
451
+ return withNestedDetail(title, detail && detail !== query ? detail : null);
452
+ }
453
+
454
+ if (type === 'filechange') {
455
+ const status = normalizeType(readString(item.status) ?? '');
456
+ const changeCount = Array.isArray(item.changes) ? item.changes.length : 0;
457
+ const detail =
458
+ changeCount > 0
459
+ ? `${String(changeCount)} file${changeCount === 1 ? '' : 's'} changed`
460
+ : null;
461
+ const title =
462
+ status === 'failed' || status === 'error'
463
+ ? '• File changes failed'
464
+ : '• Applied file changes';
465
+ return withNestedDetail(title, detail);
466
+ }
467
+
468
+ if (type === 'imageview') {
469
+ const path = normalizeInline(readString(item.path), 220);
470
+ if (!path) {
471
+ return null;
472
+ }
473
+ return `• Viewed image\n └ ${path}`;
474
+ }
475
+
476
+ if (type === 'enteredreviewmode') {
477
+ return '• Entered review mode';
478
+ }
479
+
480
+ if (type === 'exitedreviewmode') {
481
+ return '• Exited review mode';
482
+ }
483
+
484
+ if (type === 'contextcompaction') {
485
+ return '• Compacted conversation context';
486
+ }
487
+
488
+ return null;
489
+ }
490
+
491
+ function normalizeType(value: string): string {
492
+ return value.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
493
+ }
494
+
495
+ function normalizeInline(value: string | null, maxChars: number): string | null {
496
+ if (!value) {
497
+ return null;
498
+ }
499
+
500
+ const cleaned = value.replace(/\s+/g, ' ').trim();
501
+ if (!cleaned) {
502
+ return null;
503
+ }
504
+
505
+ if (cleaned.length <= maxChars) {
506
+ return cleaned;
507
+ }
508
+
509
+ return `${cleaned.slice(0, Math.max(1, maxChars - 1))}…`;
510
+ }
511
+
512
+ function normalizeMultiline(value: string | null, maxChars: number): string | null {
513
+ if (!value) {
514
+ return null;
515
+ }
516
+
517
+ const cleaned = value
518
+ .replace(/\u001b\[[0-9;]*[A-Za-z]/g, '')
519
+ .replace(/\r\n/g, '\n')
520
+ .trim();
521
+ if (!cleaned) {
522
+ return null;
523
+ }
524
+
525
+ if (cleaned.length <= maxChars) {
526
+ return cleaned;
527
+ }
528
+
529
+ return `${cleaned.slice(0, Math.max(1, maxChars - 1))}…`;
530
+ }
531
+
532
+ function toNestedOutput(
533
+ value: string,
534
+ maxLines: number,
535
+ maxChars: number
536
+ ): string | null {
537
+ const normalized = normalizeMultiline(value, maxChars);
538
+ if (!normalized) {
539
+ return null;
540
+ }
541
+
542
+ const lines = normalized
543
+ .split('\n')
544
+ .map((line) => line.trimEnd())
545
+ .filter((line) => line.trim().length > 0);
546
+ if (lines.length === 0) {
547
+ return null;
548
+ }
549
+
550
+ const limited = lines.slice(0, maxLines);
551
+ return limited.join('\n');
552
+ }
553
+
554
+ function withNestedDetail(title: string, detail: string | null): string {
555
+ if (!detail) {
556
+ return title;
557
+ }
558
+
559
+ const lines = detail
560
+ .split('\n')
561
+ .map((line) => line.trimEnd())
562
+ .filter((line) => line.trim().length > 0);
563
+ if (lines.length === 0) {
564
+ return title;
565
+ }
566
+
567
+ const first = ` └ ${lines[0]}`;
568
+ if (lines.length === 1) {
569
+ return `${title}\n${first}`;
570
+ }
571
+
572
+ const rest = lines.slice(1).map((line) => ` ${line}`);
573
+ return [title, first, ...rest].join('\n');
574
+ }
575
+
576
+ function toStructuredPreview(value: unknown, maxChars: number): string | null {
577
+ if (value == null) {
578
+ return null;
579
+ }
580
+
581
+ if (typeof value === 'string') {
582
+ return normalizeInline(value, maxChars);
583
+ }
584
+
585
+ try {
586
+ const serialized = JSON.stringify(value);
587
+ return normalizeInline(serialized, maxChars);
588
+ } catch {
589
+ return null;
590
+ }
591
+ }