@threadbase-sh/streamer 1.62.0 → 1.64.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 (300) hide show
  1. package/dist/agent/agent-client.d.ts +14 -0
  2. package/dist/agent/agent-client.d.ts.map +1 -0
  3. package/dist/agent/agent-config.d.ts +24 -0
  4. package/dist/agent/agent-config.d.ts.map +1 -0
  5. package/dist/agent/conversation-writer.d.ts +13 -0
  6. package/dist/agent/conversation-writer.d.ts.map +1 -0
  7. package/dist/agent/dedupe.d.ts +6 -0
  8. package/dist/agent/dedupe.d.ts.map +1 -0
  9. package/dist/agent/errors.d.ts +23 -0
  10. package/dist/agent/errors.d.ts.map +1 -0
  11. package/dist/agent/handle-send-agent-input.d.ts +21 -0
  12. package/dist/agent/handle-send-agent-input.d.ts.map +1 -0
  13. package/dist/agent/handle-start-agent-session.d.ts +21 -0
  14. package/dist/agent/handle-start-agent-session.d.ts.map +1 -0
  15. package/dist/agent/history-mapper.d.ts +4 -0
  16. package/dist/agent/history-mapper.d.ts.map +1 -0
  17. package/dist/agent/payload-guard.d.ts +29 -0
  18. package/dist/agent/payload-guard.d.ts.map +1 -0
  19. package/dist/api/app.d.ts +28 -0
  20. package/dist/api/app.d.ts.map +1 -0
  21. package/dist/api/handlers/conversations.handlers.d.ts +69 -0
  22. package/dist/api/handlers/conversations.handlers.d.ts.map +1 -0
  23. package/dist/api/handlers/http-helpers.d.ts +50 -0
  24. package/dist/api/handlers/http-helpers.d.ts.map +1 -0
  25. package/dist/api/handlers/sessions.handlers.d.ts +230 -0
  26. package/dist/api/handlers/sessions.handlers.d.ts.map +1 -0
  27. package/dist/api/middleware/auth.middleware.d.ts +5 -0
  28. package/dist/api/middleware/auth.middleware.d.ts.map +1 -0
  29. package/dist/api/middleware/cors.middleware.d.ts +5 -0
  30. package/dist/api/middleware/cors.middleware.d.ts.map +1 -0
  31. package/dist/api/middleware/error.middleware.d.ts +4 -0
  32. package/dist/api/middleware/error.middleware.d.ts.map +1 -0
  33. package/dist/api/routes/backup.routes.d.ts +5 -0
  34. package/dist/api/routes/backup.routes.d.ts.map +1 -0
  35. package/dist/api/routes/browse.routes.d.ts +5 -0
  36. package/dist/api/routes/browse.routes.d.ts.map +1 -0
  37. package/dist/api/routes/cacheAlert.routes.d.ts +5 -0
  38. package/dist/api/routes/cacheAlert.routes.d.ts.map +1 -0
  39. package/dist/api/routes/config.routes.d.ts +5 -0
  40. package/dist/api/routes/config.routes.d.ts.map +1 -0
  41. package/dist/api/routes/conversations.routes.d.ts +5 -0
  42. package/dist/api/routes/conversations.routes.d.ts.map +1 -0
  43. package/dist/api/routes/devices.routes.d.ts +17 -0
  44. package/dist/api/routes/devices.routes.d.ts.map +1 -0
  45. package/dist/api/routes/diagnostics.routes.d.ts +5 -0
  46. package/dist/api/routes/diagnostics.routes.d.ts.map +1 -0
  47. package/dist/api/routes/health.routes.d.ts +5 -0
  48. package/dist/api/routes/health.routes.d.ts.map +1 -0
  49. package/dist/api/routes/logs.routes.d.ts +3 -0
  50. package/dist/api/routes/logs.routes.d.ts.map +1 -0
  51. package/dist/api/routes/misc.routes.d.ts +77 -0
  52. package/dist/api/routes/misc.routes.d.ts.map +1 -0
  53. package/dist/api/routes/pair.routes.d.ts +5 -0
  54. package/dist/api/routes/pair.routes.d.ts.map +1 -0
  55. package/dist/api/routes/progress.routes.d.ts +39 -0
  56. package/dist/api/routes/progress.routes.d.ts.map +1 -0
  57. package/dist/api/routes/projects.routes.d.ts +5 -0
  58. package/dist/api/routes/projects.routes.d.ts.map +1 -0
  59. package/dist/api/routes/providers.routes.d.ts +19 -0
  60. package/dist/api/routes/providers.routes.d.ts.map +1 -0
  61. package/dist/api/routes/scanner.routes.d.ts +5 -0
  62. package/dist/api/routes/scanner.routes.d.ts.map +1 -0
  63. package/dist/api/routes/sessions.routes.d.ts +6 -0
  64. package/dist/api/routes/sessions.routes.d.ts.map +1 -0
  65. package/dist/api/routes/ws.routes.d.ts +7 -0
  66. package/dist/api/routes/ws.routes.d.ts.map +1 -0
  67. package/dist/api/types/api-deps.d.ts +114 -0
  68. package/dist/api/types/api-deps.d.ts.map +1 -0
  69. package/dist/auth.d.ts +81 -0
  70. package/dist/auth.d.ts.map +1 -0
  71. package/dist/browse.d.ts +17 -0
  72. package/dist/browse.d.ts.map +1 -0
  73. package/dist/claude-flags.d.ts +76 -0
  74. package/dist/claude-flags.d.ts.map +1 -0
  75. package/dist/cli.cjs +1917 -1795
  76. package/dist/cli.cjs.map +1 -1
  77. package/dist/codex-pty-runner.d.ts +90 -0
  78. package/dist/codex-pty-runner.d.ts.map +1 -0
  79. package/dist/config/update-config.d.ts +13 -0
  80. package/dist/config/update-config.d.ts.map +1 -0
  81. package/dist/conversation-cache.d.ts +336 -0
  82. package/dist/conversation-cache.d.ts.map +1 -0
  83. package/dist/db/config.d.ts +11 -0
  84. package/dist/db/config.d.ts.map +1 -0
  85. package/dist/db/index.d.ts +5 -0
  86. package/dist/db/index.d.ts.map +1 -0
  87. package/dist/db/migrations.d.ts +3 -0
  88. package/dist/db/migrations.d.ts.map +1 -0
  89. package/dist/db/pool.d.ts +5 -0
  90. package/dist/db/pool.d.ts.map +1 -0
  91. package/dist/db/query-timing.d.ts +52 -0
  92. package/dist/db/query-timing.d.ts.map +1 -0
  93. package/dist/db/repositories/cacheMetadata.repository.d.ts +12 -0
  94. package/dist/db/repositories/cacheMetadata.repository.d.ts.map +1 -0
  95. package/dist/db/repositories/conversations.repository.d.ts +27 -0
  96. package/dist/db/repositories/conversations.repository.d.ts.map +1 -0
  97. package/dist/db/repositories/devices.repository.d.ts +137 -0
  98. package/dist/db/repositories/devices.repository.d.ts.map +1 -0
  99. package/dist/db/repositories/managed-sessions.repository.d.ts +127 -0
  100. package/dist/db/repositories/managed-sessions.repository.d.ts.map +1 -0
  101. package/dist/db/repositories/projects.repository.d.ts +28 -0
  102. package/dist/db/repositories/projects.repository.d.ts.map +1 -0
  103. package/dist/db/repositories/push.repository.d.ts +186 -0
  104. package/dist/db/repositories/push.repository.d.ts.map +1 -0
  105. package/dist/db/repositories/sessions.repository.d.ts +16 -0
  106. package/dist/db/repositories/sessions.repository.d.ts.map +1 -0
  107. package/dist/db/runtime-store.d.ts +80 -0
  108. package/dist/db/runtime-store.d.ts.map +1 -0
  109. package/dist/db/sqlite-migrate.d.ts +13 -0
  110. package/dist/db/sqlite-migrate.d.ts.map +1 -0
  111. package/dist/db/upload-records.d.ts +11 -0
  112. package/dist/db/upload-records.d.ts.map +1 -0
  113. package/dist/e2ee/noise.d.ts +261 -0
  114. package/dist/e2ee/noise.d.ts.map +1 -0
  115. package/dist/e2ee/pair-payload.d.ts +60 -0
  116. package/dist/e2ee/pair-payload.d.ts.map +1 -0
  117. package/dist/e2ee/pair-request.d.ts +24 -0
  118. package/dist/e2ee/pair-request.d.ts.map +1 -0
  119. package/dist/external-tails.d.ts +91 -0
  120. package/dist/external-tails.d.ts.map +1 -0
  121. package/dist/feature-flags.d.ts +212 -0
  122. package/dist/feature-flags.d.ts.map +1 -0
  123. package/dist/handlers/handleListProjects.d.ts +3 -0
  124. package/dist/handlers/handleListProjects.d.ts.map +1 -0
  125. package/dist/index.cjs +84 -15
  126. package/dist/index.cjs.map +1 -1
  127. package/dist/index.d.ts +18 -2571
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +84 -15
  130. package/dist/index.js.map +1 -1
  131. package/dist/lifecycle/constants.d.ts +21 -0
  132. package/dist/lifecycle/constants.d.ts.map +1 -0
  133. package/dist/lifecycle/process-liveness.d.ts +7 -0
  134. package/dist/lifecycle/process-liveness.d.ts.map +1 -0
  135. package/dist/live-session-manager.d.ts +59 -0
  136. package/dist/live-session-manager.d.ts.map +1 -0
  137. package/dist/logger.d.ts +14 -0
  138. package/dist/logger.d.ts.map +1 -0
  139. package/dist/pair-store.d.ts +60 -0
  140. package/dist/pair-store.d.ts.map +1 -0
  141. package/dist/platform.d.ts +25 -0
  142. package/dist/platform.d.ts.map +1 -0
  143. package/dist/process-discovery.d.ts +35 -0
  144. package/dist/process-discovery.d.ts.map +1 -0
  145. package/dist/providers.d.ts +7 -0
  146. package/dist/providers.d.ts.map +1 -0
  147. package/dist/pty-host/protocol.d.ts +270 -0
  148. package/dist/pty-host/protocol.d.ts.map +1 -0
  149. package/dist/pty-host/remote-session-runner.d.ts +133 -0
  150. package/dist/pty-host/remote-session-runner.d.ts.map +1 -0
  151. package/dist/pty-host/socket.d.ts +54 -0
  152. package/dist/pty-host/socket.d.ts.map +1 -0
  153. package/dist/pty-host/spawn-host.d.ts +30 -0
  154. package/dist/pty-host/spawn-host.d.ts.map +1 -0
  155. package/dist/pty-manager.d.ts +65 -0
  156. package/dist/pty-manager.d.ts.map +1 -0
  157. package/dist/pty-shared.d.ts +27 -0
  158. package/dist/pty-shared.d.ts.map +1 -0
  159. package/dist/scanner-manager.d.ts +126 -0
  160. package/dist/scanner-manager.d.ts.map +1 -0
  161. package/dist/schemas/cacheAlert.schema.d.ts +14 -0
  162. package/dist/schemas/cacheAlert.schema.d.ts.map +1 -0
  163. package/dist/schemas/claudeFlags.schema.d.ts +7 -0
  164. package/dist/schemas/claudeFlags.schema.d.ts.map +1 -0
  165. package/dist/schemas/project.schema.d.ts +18 -0
  166. package/dist/schemas/project.schema.d.ts.map +1 -0
  167. package/dist/schemas/updateConfig.schema.d.ts +19 -0
  168. package/dist/schemas/updateConfig.schema.d.ts.map +1 -0
  169. package/dist/seal.d.ts +14 -0
  170. package/dist/seal.d.ts.map +1 -0
  171. package/dist/server-identity.d.ts +43 -0
  172. package/dist/server-identity.d.ts.map +1 -0
  173. package/dist/server-wiring.d.ts +184 -0
  174. package/dist/server-wiring.d.ts.map +1 -0
  175. package/dist/server.d.ts +390 -0
  176. package/dist/server.d.ts.map +1 -0
  177. package/dist/services/backup/backup.d.ts +103 -0
  178. package/dist/services/backup/backup.d.ts.map +1 -0
  179. package/dist/services/cache/cacheMetadata.d.ts +8 -0
  180. package/dist/services/cache/cacheMetadata.d.ts.map +1 -0
  181. package/dist/services/cache-integrity/alertStore.d.ts +24 -0
  182. package/dist/services/cache-integrity/alertStore.d.ts.map +1 -0
  183. package/dist/services/cache-integrity/backup.d.ts +8 -0
  184. package/dist/services/cache-integrity/backup.d.ts.map +1 -0
  185. package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts +71 -0
  186. package/dist/services/cache-integrity/cacheIntegrityMonitor.d.ts.map +1 -0
  187. package/dist/services/conversations/conversationWatcher.d.ts +99 -0
  188. package/dist/services/conversations/conversationWatcher.d.ts.map +1 -0
  189. package/dist/services/conversations/findSearchTarget.d.ts +30 -0
  190. package/dist/services/conversations/findSearchTarget.d.ts.map +1 -0
  191. package/dist/services/conversations/isAgentConversation.d.ts +8 -0
  192. package/dist/services/conversations/isAgentConversation.d.ts.map +1 -0
  193. package/dist/services/conversations/pruneAgentConversations.d.ts +8 -0
  194. package/dist/services/conversations/pruneAgentConversations.d.ts.map +1 -0
  195. package/dist/services/conversations/refreshConversationCache.d.ts +27 -0
  196. package/dist/services/conversations/refreshConversationCache.d.ts.map +1 -0
  197. package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts +33 -0
  198. package/dist/services/conversations/shouldRefreshProjectsFromHdd.d.ts.map +1 -0
  199. package/dist/services/diagnostics/diagnostics.d.ts +66 -0
  200. package/dist/services/diagnostics/diagnostics.d.ts.map +1 -0
  201. package/dist/services/projectChats/deriveProjectChatTitle.d.ts +15 -0
  202. package/dist/services/projectChats/deriveProjectChatTitle.d.ts.map +1 -0
  203. package/dist/services/projects/ensureProjectsForConversations.d.ts +15 -0
  204. package/dist/services/projects/ensureProjectsForConversations.d.ts.map +1 -0
  205. package/dist/services/providers/capabilities.d.ts +105 -0
  206. package/dist/services/providers/capabilities.d.ts.map +1 -0
  207. package/dist/services/providers/providerHealth.d.ts +72 -0
  208. package/dist/services/providers/providerHealth.d.ts.map +1 -0
  209. package/dist/services/push/apnsClient.d.ts +105 -0
  210. package/dist/services/push/apnsClient.d.ts.map +1 -0
  211. package/dist/services/push/expoPushSender.d.ts +37 -0
  212. package/dist/services/push/expoPushSender.d.ts.map +1 -0
  213. package/dist/services/push/liveActivityContentState.d.ts +60 -0
  214. package/dist/services/push/liveActivityContentState.d.ts.map +1 -0
  215. package/dist/services/push/liveActivityNotifier.d.ts +49 -0
  216. package/dist/services/push/liveActivityNotifier.d.ts.map +1 -0
  217. package/dist/services/push/liveActivityRenewal.d.ts +63 -0
  218. package/dist/services/push/liveActivityRenewal.d.ts.map +1 -0
  219. package/dist/services/push/liveActivitySender.d.ts +88 -0
  220. package/dist/services/push/liveActivitySender.d.ts.map +1 -0
  221. package/dist/services/push/waitingInputNotifier.d.ts +41 -0
  222. package/dist/services/push/waitingInputNotifier.d.ts.map +1 -0
  223. package/dist/services/questions/answersToKeystrokes.d.ts +8 -0
  224. package/dist/services/questions/answersToKeystrokes.d.ts.map +1 -0
  225. package/dist/services/questions/codexGateAnswers.d.ts +14 -0
  226. package/dist/services/questions/codexGateAnswers.d.ts.map +1 -0
  227. package/dist/services/questions/codexScreen.d.ts +74 -0
  228. package/dist/services/questions/codexScreen.d.ts.map +1 -0
  229. package/dist/services/questions/detectAskUserQuestion.d.ts +6 -0
  230. package/dist/services/questions/detectAskUserQuestion.d.ts.map +1 -0
  231. package/dist/services/questions/detectPermissionGate.d.ts +62 -0
  232. package/dist/services/questions/detectPermissionGate.d.ts.map +1 -0
  233. package/dist/services/questions/detectQuestionFromScreen.d.ts +30 -0
  234. package/dist/services/questions/detectQuestionFromScreen.d.ts.map +1 -0
  235. package/dist/services/questions/detectShellPrompt.d.ts +18 -0
  236. package/dist/services/questions/detectShellPrompt.d.ts.map +1 -0
  237. package/dist/services/questions/parseAgentPhase.d.ts +12 -0
  238. package/dist/services/questions/parseAgentPhase.d.ts.map +1 -0
  239. package/dist/services/questions/parseStatusLine.d.ts +19 -0
  240. package/dist/services/questions/parseStatusLine.d.ts.map +1 -0
  241. package/dist/services/questions/questionBroadcast.d.ts +18 -0
  242. package/dist/services/questions/questionBroadcast.d.ts.map +1 -0
  243. package/dist/services/questions/resolveAnswer.d.ts +16 -0
  244. package/dist/services/questions/resolveAnswer.d.ts.map +1 -0
  245. package/dist/services/search/searchQuery.d.ts +78 -0
  246. package/dist/services/search/searchQuery.d.ts.map +1 -0
  247. package/dist/services/security/capabilities.d.ts +50 -0
  248. package/dist/services/security/capabilities.d.ts.map +1 -0
  249. package/dist/services/sessions/autoResumeOnBoot.d.ts +28 -0
  250. package/dist/services/sessions/autoResumeOnBoot.d.ts.map +1 -0
  251. package/dist/services/sessions/codexRolloutOwner.d.ts +55 -0
  252. package/dist/services/sessions/codexRolloutOwner.d.ts.map +1 -0
  253. package/dist/services/sessions/conversationBusy.d.ts +32 -0
  254. package/dist/services/sessions/conversationBusy.d.ts.map +1 -0
  255. package/dist/services/sessions/idempotency.d.ts +67 -0
  256. package/dist/services/sessions/idempotency.d.ts.map +1 -0
  257. package/dist/services/sessions/reconcileSessions.d.ts +63 -0
  258. package/dist/services/sessions/reconcileSessions.d.ts.map +1 -0
  259. package/dist/services/sessions/rehydrateSessions.d.ts +68 -0
  260. package/dist/services/sessions/rehydrateSessions.d.ts.map +1 -0
  261. package/dist/services/sessions/resumeIdentity.d.ts +16 -0
  262. package/dist/services/sessions/resumeIdentity.d.ts.map +1 -0
  263. package/dist/session-registry-boot.d.ts +142 -0
  264. package/dist/session-registry-boot.d.ts.map +1 -0
  265. package/dist/session-store.d.ts +32 -0
  266. package/dist/session-store.d.ts.map +1 -0
  267. package/dist/session-watchers.d.ts +60 -0
  268. package/dist/session-watchers.d.ts.map +1 -0
  269. package/dist/types.d.ts +616 -0
  270. package/dist/types.d.ts.map +1 -0
  271. package/dist/uploads.d.ts +16 -0
  272. package/dist/uploads.d.ts.map +1 -0
  273. package/dist/utils/bootToken.d.ts +3 -0
  274. package/dist/utils/bootToken.d.ts.map +1 -0
  275. package/dist/utils/canonicalizeFilePath.d.ts +75 -0
  276. package/dist/utils/canonicalizeFilePath.d.ts.map +1 -0
  277. package/dist/utils/canonicalizeProjectPath.d.ts +13 -0
  278. package/dist/utils/canonicalizeProjectPath.d.ts.map +1 -0
  279. package/dist/utils/codexConversationLine.d.ts +38 -0
  280. package/dist/utils/codexConversationLine.d.ts.map +1 -0
  281. package/dist/utils/conversationEtag.d.ts +19 -0
  282. package/dist/utils/conversationEtag.d.ts.map +1 -0
  283. package/dist/utils/dates.d.ts +12 -0
  284. package/dist/utils/dates.d.ts.map +1 -0
  285. package/dist/utils/debounce.d.ts +15 -0
  286. package/dist/utils/debounce.d.ts.map +1 -0
  287. package/dist/utils/deriveSessionName.d.ts +10 -0
  288. package/dist/utils/deriveSessionName.d.ts.map +1 -0
  289. package/dist/utils/fileIdentity.d.ts +36 -0
  290. package/dist/utils/fileIdentity.d.ts.map +1 -0
  291. package/dist/utils/isScannedSnapshotStale.d.ts +16 -0
  292. package/dist/utils/isScannedSnapshotStale.d.ts.map +1 -0
  293. package/dist/utils/scanProgressThrottle.d.ts +12 -0
  294. package/dist/utils/scanProgressThrottle.d.ts.map +1 -0
  295. package/dist/version.d.ts +3 -0
  296. package/dist/version.d.ts.map +1 -0
  297. package/dist/ws-hub.d.ts +15 -0
  298. package/dist/ws-hub.d.ts.map +1 -0
  299. package/package.json +3 -4
  300. package/dist/index.d.cts +0 -2571
@@ -0,0 +1,41 @@
1
+ import type { ManagedSession } from "../../types";
2
+ import type { ExpoPushMessage, ExpoPushSender } from "./expoPushSender";
3
+ /**
4
+ * The payload, and why it is this thin.
5
+ *
6
+ * It says *which* session wants attention, never *what* the agent said. The
7
+ * published privacy policy states notification payloads exclude prompts,
8
+ * terminal output, credentials and conversation content, so `lastOutput` (raw
9
+ * PTY output) and `sessionName` (derived from the user's first message) are
10
+ * both deliberately absent — carrying them is what made the Live Activity
11
+ * payload diverge from that text (RonenMars/threadbase-mobile#636).
12
+ *
13
+ * `projectName` and the two ids stay: mobile needs `sessionId` + `serverId` to
14
+ * route the tap to the session, and a notification that cannot say which
15
+ * project it is about is not actionable.
16
+ */
17
+ export declare function waitingInputMessage(session: ManagedSession, serverId: string): ExpoPushMessage;
18
+ export declare class WaitingInputNotifier {
19
+ private readonly sender;
20
+ private readonly serverId;
21
+ private readonly isWatched;
22
+ /** Sessions with a turn the user started that has not yet been answered. */
23
+ private openTurn;
24
+ /**
25
+ * @param isWatched Whether a client is currently subscribed to this session
26
+ * over WebSocket. Mobile subscribes while the session screen is open and the
27
+ * socket dies when the app is backgrounded, so this is the available signal
28
+ * for "the user is already looking" — and a push to someone already reading
29
+ * the output is pure noise.
30
+ */
31
+ constructor(sender: ExpoPushSender, serverId: string, isWatched: (sessionId: string) => boolean);
32
+ /**
33
+ * React to a session status change.
34
+ *
35
+ * Fire-and-forget by design: a push must never delay or fail a session
36
+ * transition, so this returns a promise the caller may ignore and every error
37
+ * is logged rather than propagated.
38
+ */
39
+ onStatusChange(session: ManagedSession, previousStatus?: string): Promise<void>;
40
+ }
41
+ //# sourceMappingURL=waitingInputNotifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitingInputNotifier.d.ts","sourceRoot":"","sources":["../../../src/services/push/waitingInputNotifier.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAwBxE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAM9F;AAED,qBAAa,oBAAoB;IAY7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAb5B,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAqB;IAErC;;;;;;OAMG;IACH,YACmB,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,EACxD;IAEJ;;;;;;OAMG;IACG,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCpF;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { AskQuestion } from "../../types";
2
+ export declare class UnknownOptionError extends Error {
3
+ readonly question: string;
4
+ readonly value: string;
5
+ constructor(question: string, value: string);
6
+ }
7
+ export declare function answersToKeystrokes(questions: AskQuestion[], answers: Record<string, string | string[]>): string;
8
+ //# sourceMappingURL=answersToKeystrokes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answersToKeystrokes.d.ts","sourceRoot":"","sources":["../../../src/services/questions/answersToKeystrokes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,QAAQ,EAAE,MAAM;aAChB,KAAK,EAAE,MAAM;IAF/B,YACkB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EAI9B;CACF;AAID,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,WAAW,EAAE,EACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACzC,MAAM,CAaR"}
@@ -0,0 +1,14 @@
1
+ export type CodexGateType = "hooks" | "trust";
2
+ export interface GateAnswers {
3
+ codexHooksGate?: "trust_all" | "continue_untrusted";
4
+ codexTrustGate?: "yes";
5
+ }
6
+ export declare function loadGateAnswers(): GateAnswers;
7
+ export declare function saveGateAnswer<K extends keyof GateAnswers>(key: K, value: GateAnswers[K]): void;
8
+ /**
9
+ * The digit that answers a gate per the remembered choice, or null when the
10
+ * user must be asked. Digits are the dialogs' literal on-screen numbers
11
+ * (probe-verified: a digit keypress selects AND confirms, no Enter needed).
12
+ */
13
+ export declare function rememberedGateDigit(gate: CodexGateType): string | null;
14
+ //# sourceMappingURL=codexGateAnswers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexGateAnswers.d.ts","sourceRoot":"","sources":["../../../src/services/questions/codexGateAnswers.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,WAAW,GAAG,oBAAoB,CAAC;IACpD,cAAc,CAAC,EAAE,KAAK,CAAC;CACxB;AAOD,wBAAgB,eAAe,IAAI,WAAW,CAO7C;AAED,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAI/F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAQtE"}
@@ -0,0 +1,74 @@
1
+ import type { PermissionOption } from "../../types";
2
+ import type { CodexGateType } from "./codexGateAnswers";
3
+ /**
4
+ * Codex's rendered-screen regexes and predicates: readiness, busy/boot state,
5
+ * blocking prompts (trust gate, hooks review, usage limits) and the cards built
6
+ * from them. Pure functions of the rendered lines — no PTY, no session state.
7
+ *
8
+ * Lives here rather than in codex-pty-runner.ts for symmetry with the Claude
9
+ * side, whose equivalents are already in this directory (detectPermissionGate,
10
+ * detectQuestionFromScreen, detectShellPrompt, parseStatusLine).
11
+ */
12
+ export declare const CODEX_PROMPT_READY_TEXT = "Ready";
13
+ export declare const CODEX_BUSY_STATUS_RE: RegExp;
14
+ export declare const CODEX_WORKING_STATUS_RE: RegExp;
15
+ export declare const CODEX_MCP_BOOT_RE: RegExp;
16
+ export declare const CODEX_TRUST_GATE_REGEX: RegExp;
17
+ export declare const CODEX_HOOKS_GATE_REGEX: RegExp;
18
+ export declare const CODEX_ACTIVE_WRITER_RE: RegExp;
19
+ /** `failureCode` set on a session killed by the writer-lock detection above. */
20
+ export declare const CODEX_ACTIVE_WRITER_CODE = "codex_active_writer";
21
+ export declare const CODEX_USAGE_LIMIT_RE: RegExp;
22
+ export declare const CODEX_USAGE_RESET_TIP_RE: RegExp;
23
+ export declare const CODEX_RATE_LIMIT_MENU_RE: RegExp;
24
+ export interface CodexBlockingPrompt {
25
+ prompt: string;
26
+ detail?: string;
27
+ options: PermissionOption[];
28
+ /** Tip-only (not a hard limit / rate-limit menu). Surfaced after a failed turn. */
29
+ soft?: boolean;
30
+ }
31
+ /**
32
+ * Detect Codex's rendered command-approval card. This deliberately does not
33
+ * reuse parseCodexNumberedOptions: the visible 1/2 rows do not answer this
34
+ * dialog, while `y` and Escape do.
35
+ */
36
+ export declare function detectCodexCommandApproval(lines: string[]): CodexBlockingPrompt | null;
37
+ /** Parse Codex's numbered TUI menus (`1. …`, `› 2. …`). */
38
+ export declare function parseCodexNumberedOptions(lines: string[]): PermissionOption[];
39
+ /**
40
+ * Usage-limit errors, the soft "reset available" tip, and the "Approaching
41
+ * rate limits" model-picker menu. Surfaced over the permission transport so
42
+ * mobile shows a card instead of spinning forever in `running`.
43
+ */
44
+ export declare function detectCodexBlockingPrompt(lines: string[]): CodexBlockingPrompt | null;
45
+ /** Last non-blank rendered line — Codex paints the status bar there. */
46
+ export declare function codexStatusBarLine(lines: string[]): string;
47
+ /**
48
+ * True while the screen shows something that precedes a turn rather than being
49
+ * one: a blocking gate dialog, or MCP boot progress. Both keep the composer
50
+ * shut, but neither is the agent doing work — the status-bar half of
51
+ * codexScreenBlocksComposer cannot tell them apart on its own, and reading
52
+ * only that half is how the agent phase reported "working" during boot.
53
+ */
54
+ export declare function codexScreenPreTurn(lines: string[]): boolean;
55
+ /**
56
+ * True while Codex must not receive composer keystrokes: gate dialogs, MCP
57
+ * boot progress, or a Starting/Working status bar. Shared by boot detection,
58
+ * the flat fallback, and mid-session idle re-detect.
59
+ */
60
+ export declare function codexScreenBlocksComposer(lines: string[]): boolean;
61
+ /** Authoritative Ready: status-bar word present and screen not otherwise busy. */
62
+ export declare function codexScreenShowsReady(lines: string[]): boolean;
63
+ /**
64
+ * Soft idle for a truncated Ready bar: compose `›` / `>` is up and nothing
65
+ * busy is on screen. Not used as a sole boot-ready signal on quiet — `›`
66
+ * appears during Starting — but the flat fallback requires it (or Ready)
67
+ * before settling so a model-only status line is not mistaken for usable.
68
+ */
69
+ export declare function codexScreenLooksIdle(lines: string[]): boolean;
70
+ export declare function gateCard(gate: CodexGateType, lines: string[]): {
71
+ prompt: string;
72
+ options: PermissionOption[];
73
+ };
74
+ //# sourceMappingURL=codexScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexScreen.d.ts","sourceRoot":"","sources":["../../../src/services/questions/codexScreen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;;;;;GAQG;AAQH,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAI/C,eAAO,MAAM,oBAAoB,QAA6B,CAAC;AAM/D,eAAO,MAAM,uBAAuB,QAAgB,CAAC;AAWrD,eAAO,MAAM,iBAAiB,QAAsC,CAAC;AAOrE,eAAO,MAAM,sBAAsB,QAAwB,CAAC;AAQ5D,eAAO,MAAM,sBAAsB,QAAuB,CAAC;AAa3D,eAAO,MAAM,sBAAsB,QAAwC,CAAC;AAE5E,gFAAgF;AAChF,eAAO,MAAM,wBAAwB,wBAAwB,CAAC;AAG9D,eAAO,MAAM,oBAAoB,QAA2C,CAAC;AAI7E,eAAO,MAAM,wBAAwB,QAAiC,CAAC;AAGvE,eAAO,MAAM,wBAAwB,QAA6B,CAAC;AAEnE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAeD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,mBAAmB,GAAG,IAAI,CA8CtF;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAS7E;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,mBAAmB,GAAG,IAAI,CAmBrF;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAM3D;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAGlE;AAED,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAG9D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAM7D;AAUD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,MAAM,EAAE,GACd;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAqCjD"}
@@ -0,0 +1,6 @@
1
+ import type { AskQuestion } from "../../types";
2
+ export declare function detectAskUserQuestion(rawLine: string): {
3
+ toolUseId: string;
4
+ questions: AskQuestion[];
5
+ } | null;
6
+ //# sourceMappingURL=detectAskUserQuestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectAskUserQuestion.d.ts","sourceRoot":"","sources":["../../../src/services/questions/detectAskUserQuestion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AA4D1D,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GACd;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,IAAI,CAgBxD"}
@@ -0,0 +1,62 @@
1
+ export interface PermissionOption {
2
+ /** The real leading number shown on screen (NOT a 1-based array index). */
3
+ index: number;
4
+ label: string;
5
+ /**
6
+ * Literal keystroke bytes that answer this option, when the number alone
7
+ * isn't the answer (e.g. a y/N shell prompt answers "y\r"/"n\r", not "1\r").
8
+ * Additive: OSC-777 gates omit it and the client answers via `index`; the
9
+ * unstructured shell-prompt path (detectShellPrompt) populates it.
10
+ */
11
+ answerKeys?: string;
12
+ }
13
+ export interface PermissionGate {
14
+ /** Prompt text above the options, e.g. "Claude needs your permission to use Bash". */
15
+ prompt?: string;
16
+ /**
17
+ * The descriptive block above the prompt — the tool title, the command, and any
18
+ * action description Claude paints inside the gate box (newline-joined). Lets the
19
+ * client show WHAT is being permitted, not just "Do you want to proceed?".
20
+ */
21
+ detail?: string;
22
+ options: PermissionOption[];
23
+ /** Index value (the on-screen number) of the `❯`-highlighted option, if any. */
24
+ cursor?: number;
25
+ }
26
+ /**
27
+ * Stable content key for de-duping repeated broadcasts of the same gate across
28
+ * PTY repaint ticks. Includes cursor — moving the on-screen selection is a
29
+ * real update the client needs, so it must produce a new key.
30
+ */
31
+ export declare function permissionContentKey(gate: {
32
+ prompt?: string;
33
+ detail?: string;
34
+ options: PermissionOption[];
35
+ cursor?: number;
36
+ }): string;
37
+ /** True if a raw PTY chunk contains the Claude Code OSC 777 permission notify. */
38
+ export declare function hasPermissionOsc(rawData: string): boolean;
39
+ /**
40
+ * True if a raw PTY chunk contains the OSC 777 "waiting for your input" notify —
41
+ * Claude finished its turn. Not a gate: it is the positive signal that any gate
42
+ * we were tracking is over, which is what lets a stuck card close without
43
+ * waiting for a prompt marker that will never come.
44
+ */
45
+ export declare function hasWaitingForInputOsc(rawData: string): boolean;
46
+ /**
47
+ * Scrape the permission gate's options + prompt from rendered screen lines.
48
+ * Scrapes the LAST option block on screen, scanning bottom-up: a stale
49
+ * numbered list sitting in scrollback above the real gate (e.g. Claude's own
50
+ * prose) matches the same option shape and must not be vacuumed in with it.
51
+ * Returns null when no numbered options are present (not a gate, or not painted
52
+ * yet). Pure — no I/O.
53
+ */
54
+ export declare function scrapePermissionGate(lines: string[]): PermissionGate | null;
55
+ /**
56
+ * Claim a permission gate from rendered screen lines without an OSC 777.
57
+ * Returns the scraped gate when the full gate signature is present:
58
+ * ≥2 numbered options, the gate footer, no Ask-menu footer, and at least one
59
+ * Yes/No-family option label. Pure — no I/O.
60
+ */
61
+ export declare function detectGateScreen(lines: string[]): PermissionGate | null;
62
+ //# sourceMappingURL=detectPermissionGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectPermissionGate.d.ts","sourceRoot":"","sources":["../../../src/services/questions/detectPermissionGate.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAIT;AAwBD,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAkBD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,GAAG,IAAI,CAgD3E;AA4CD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,GAAG,IAAI,CAOvE"}
@@ -0,0 +1,30 @@
1
+ import type { AskQuestion } from "../../types";
2
+ /**
3
+ * Detect an AskUserQuestion menu in rendered screen lines. Returns the question
4
+ * set (single-question; the TUI shows one picker at a time) or null.
5
+ * Pure — no I/O.
6
+ */
7
+ export declare function detectQuestionFromScreen(lines: string[]): {
8
+ questions: AskQuestion[];
9
+ } | null;
10
+ /**
11
+ * True when the rendered screen is the AskUserQuestion "Ready to submit your
12
+ * answers?" confirmation (a question line + a "Submit answers" option under the
13
+ * Ask footer). Pure — no I/O. Retained as a classifier (e.g. for analytics);
14
+ * the submit screen now renders as a normal card.
15
+ */
16
+ export declare function isSubmitConfirmationScreen(lines: string[]): boolean;
17
+ /**
18
+ * True when an AskUserQuestion menu is still painted on the rendered screen.
19
+ * Cheaper and far more forgiving than detectQuestionFromScreen: it asks only
20
+ * "is the picker up?", so a menu whose options wrap oddly still reads as
21
+ * present. Used to reject an answer for a menu that already closed. Pure.
22
+ */
23
+ export declare function isQuestionMenuOnScreen(lines: string[]): boolean;
24
+ /**
25
+ * Stable content key for de-duping a screen-scraped question against the JSONL
26
+ * detection of the same question (they share no toolUseId). Keyed on the
27
+ * question text + option labels.
28
+ */
29
+ export declare function questionContentKey(questions: AskQuestion[]): string;
30
+ //# sourceMappingURL=detectQuestionFromScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectQuestionFromScreen.d.ts","sourceRoot":"","sources":["../../../src/services/questions/detectQuestionFromScreen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AA0D1D;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,SAAS,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,IAAI,CAoE7F;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAYnE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAInE"}
@@ -0,0 +1,18 @@
1
+ export interface ShellPromptOption {
2
+ /** Positional fallback number (1-based). Authoritative answer is `answerKeys`. */
3
+ index: number;
4
+ label: string;
5
+ /** The exact bytes to send to answer this option, e.g. "y\r" or "2\r". */
6
+ answerKeys: string;
7
+ }
8
+ export interface ShellPrompt {
9
+ prompt: string;
10
+ options: ShellPromptOption[];
11
+ }
12
+ /**
13
+ * Scrape an unstructured shell prompt from rendered screen lines. Returns null
14
+ * when the tail isn't a recognised prompt (prose, Claude's own UI, empty).
15
+ * Pure — no I/O.
16
+ */
17
+ export declare function detectShellPrompt(lines: string[]): ShellPrompt | null;
18
+ //# sourceMappingURL=detectShellPrompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detectShellPrompt.d.ts","sourceRoot":"","sources":["../../../src/services/questions/detectShellPrompt.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAgCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,IAAI,CA2ErE"}
@@ -0,0 +1,12 @@
1
+ import type { ProviderName } from "../../providers";
2
+ import type { AgentPhase } from "../../types";
3
+ /**
4
+ * Derive the agent's phase from a rendered screen.
5
+ *
6
+ * An unrecognised provider yields `null` rather than falling back to a
7
+ * provider-specific grammar. `getTerminalChromeFilter` already establishes that
8
+ * instinct — "prefer passthrough over wrong Claude filters" — and the opposite
9
+ * default is what let a wrong grammar run against the wrong provider in #647.
10
+ */
11
+ export declare function parseAgentPhase(lines: string[], provider: ProviderName): AgentPhase | null;
12
+ //# sourceMappingURL=parseAgentPhase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAgentPhase.d.ts","sourceRoot":"","sources":["../../../src/services/questions/parseAgentPhase.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgC9C;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CAI1F"}
@@ -0,0 +1,19 @@
1
+ export interface StatusLineInfo {
2
+ /** e.g. "Opus 4.8 (1M context)" or "Sonnet 5". */
3
+ model?: string;
4
+ /** e.g. "high" — the reasoning-effort tier. */
5
+ effort?: string;
6
+ /** e.g. "accept edits on" — the active permission mode. */
7
+ permissionMode?: string;
8
+ }
9
+ /**
10
+ * Extract model / effort / permission mode from rendered screen lines.
11
+ * Returns an empty object when the footer isn't on screen — callers treat every
12
+ * field as optional, so a missed parse degrades to "not reported" rather than
13
+ * throwing or inventing a value.
14
+ *
15
+ * Scans from the bottom: the footer is the last thing painted, and older
16
+ * scrollback can contain text that looks like a footer row.
17
+ */
18
+ export declare function parseStatusLine(lines: string[]): StatusLineInfo;
19
+ //# sourceMappingURL=parseStatusLine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseStatusLine.d.ts","sourceRoot":"","sources":["../../../src/services/questions/parseStatusLine.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAgBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,cAAc,CAwB/D"}
@@ -0,0 +1,18 @@
1
+ import type { AskQuestion, WSMessage } from "../../types";
2
+ export interface PendingQuestion {
3
+ toolUseId: string;
4
+ questions: AskQuestion[];
5
+ }
6
+ export declare function questionsFromLines(sessionId: string, lines: string[]): {
7
+ messages: Extract<WSMessage, {
8
+ type: "question";
9
+ }>[];
10
+ pending: PendingQuestion[];
11
+ };
12
+ export declare function shouldBroadcastQuestion(args: {
13
+ newContentKey: string;
14
+ lastContentKey: string | undefined;
15
+ newToolUseId: string;
16
+ priorToolUseId: string | undefined;
17
+ }): boolean;
18
+ //# sourceMappingURL=questionBroadcast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"questionBroadcast.d.ts","sourceRoot":"","sources":["../../../src/services/questions/questionBroadcast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,WAAW,EAAE,CAAC;CAC1B;AAID,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EAAE,GACd;IACD,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,UAAU,CAAA;KAAE,CAAC,EAAE,CAAC;IACrD,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B,CAgBA;AAaD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC,GAAG,OAAO,CAIV"}
@@ -0,0 +1,16 @@
1
+ import type { AskQuestion } from "../../types";
2
+ export type AnswerResolution = {
3
+ ok: true;
4
+ keys: string;
5
+ } | {
6
+ ok: false;
7
+ reason: "no_pending_question" | "tool_use_mismatch" | "unknown_option";
8
+ };
9
+ export declare function resolveAnswer(pending: {
10
+ toolUseId: string;
11
+ questions: AskQuestion[];
12
+ } | undefined, body: {
13
+ toolUseId?: unknown;
14
+ answers?: unknown;
15
+ }): AnswerResolution;
16
+ //# sourceMappingURL=resolveAnswer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveAnswer.d.ts","sourceRoot":"","sources":["../../../src/services/questions/resolveAnswer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,MAAM,gBAAgB,GACxB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,qBAAqB,GAAG,mBAAmB,GAAG,gBAAgB,CAAA;CAAE,CAAC;AAE1F,wBAAgB,aAAa,CAC3B,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,SAAS,EACpE,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/C,gBAAgB,CAYlB"}
@@ -0,0 +1,78 @@
1
+ import type { ProviderName } from "../../providers";
2
+ /**
3
+ * Search query parsing, pagination, and filters (C8).
4
+ *
5
+ * `/api/search` returned `{ hasMore: false, offset: 0, total: results.length }`
6
+ * with all three values hardcoded. That was not merely unimplemented — it was
7
+ * actively wrong: the scanner truncates at `limit`, so a query with more matches
8
+ * than the limit reported `hasMore: false` and `total` equal to the truncated
9
+ * count. A client had no way to learn that results were missing, let alone
10
+ * fetch them.
11
+ *
12
+ * The scanner also already computes a relevance `score` and match `snippets`
13
+ * per result, and the endpoint discarded both — so results arrived in an
14
+ * unexplained order with no indication of *why* anything matched.
15
+ */
16
+ export declare const DEFAULT_SEARCH_LIMIT = 50;
17
+ export declare const MAX_SEARCH_LIMIT = 200;
18
+ export declare const MAX_QUERY_LENGTH = 256;
19
+ export interface SearchFilters {
20
+ provider?: ProviderName;
21
+ projectPath?: string;
22
+ branch?: string;
23
+ /** Inclusive lower bound on last activity, epoch ms. */
24
+ since?: number;
25
+ /** Inclusive upper bound on last activity, epoch ms. */
26
+ until?: number;
27
+ }
28
+ export interface ParsedSearchQuery {
29
+ q: string;
30
+ limit: number;
31
+ offset: number;
32
+ filters: SearchFilters;
33
+ }
34
+ export declare class SearchQueryError extends Error {
35
+ readonly code: string;
36
+ constructor(message: string, code: string);
37
+ }
38
+ /**
39
+ * Parse and validate search parameters.
40
+ *
41
+ * Rejects rather than silently clamping an invalid query, so a client that
42
+ * mistypes a filter learns about it instead of receiving plausible-looking
43
+ * results for a query it did not mean. `limit` is the exception: it is clamped,
44
+ * because an over-large limit is a resource question rather than a
45
+ * misunderstanding, and failing a search over it would be unhelpful.
46
+ */
47
+ export declare function parseSearchQuery(params: URLSearchParams): ParsedSearchQuery;
48
+ /** A search result as returned to clients, after adaptation. */
49
+ export interface AdaptedResult {
50
+ projectPath?: string;
51
+ branch?: string;
52
+ provider?: string;
53
+ lastActivity?: string | number | null;
54
+ }
55
+ /**
56
+ * Apply the filters the scanner cannot express itself.
57
+ *
58
+ * The scanner's SearchOptions supports `provider` but not project, branch, or
59
+ * date bounds, so those are applied here. Filtering after the fact means the
60
+ * scanner's own limit must be raised before slicing — see `handleSearch` — or
61
+ * a filter would silently drop results that a later page should have contained.
62
+ */
63
+ export declare function applyFilters<T extends AdaptedResult>(results: T[], filters: SearchFilters): T[];
64
+ export interface Page<T> {
65
+ items: T[];
66
+ total: number;
67
+ offset: number;
68
+ hasMore: boolean;
69
+ }
70
+ /**
71
+ * Slice a filtered result set into a page.
72
+ *
73
+ * `total` is the count AFTER filtering and BEFORE slicing, and `hasMore` is
74
+ * derived from it — the two values the previous implementation hardcoded to
75
+ * `results.length` and `false`.
76
+ */
77
+ export declare function paginate<T>(results: T[], offset: number, limit: number): Page<T>;
78
+ //# sourceMappingURL=searchQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchQuery.d.ts","sourceRoot":"","sources":["../../../src/services/search/searchQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;CACxB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAGvC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAFvB,YACE,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,MAAM,EAGtB;CACF;AAQD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,CAiD3E;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACvC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,aAAa,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,CAAC,EAAE,CAgB/F;AAED,MAAM,WAAW,IAAI,CAAC,CAAC;IACrB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAQhF"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Scoped device capabilities (C5).
3
+ * See docs/architecture/2026-07-24-device-identity-and-capabilities.md.
4
+ *
5
+ * Authorization was all-or-nothing: authMiddleware asked one question — is this
6
+ * token the API key — and answered 401 or full access. A device paired merely to
7
+ * glance at session status held exactly the authority of the one driving the
8
+ * agent, because there was only ever one credential and no principal to scope.
9
+ */
10
+ export declare const CAPABILITIES: readonly ["history:read", "session:control", "fs:browse", "fs:upload", "notifications", "admin"];
11
+ export type Capability = (typeof CAPABILITIES)[number];
12
+ export declare function isCapability(value: unknown): value is Capability;
13
+ /**
14
+ * Every capability, `admin` included. What a normal driving device gets.
15
+ *
16
+ * It withheld `admin` originally, on the reasoning that a device should run the
17
+ * agent without being able to rotate credentials or revoke its siblings. That is
18
+ * a sound rule for a server shared between people, and this one is not: the
19
+ * phone IS the administration surface. Mobile's paired-devices screen
20
+ * (`GET /api/devices`), backup and restore (`/api/backup/*`) and the model and
21
+ * effort settings (`/api/config/claude-flags`) are all admin-gated, so a device
22
+ * without `admin` loses four working screens the moment it starts presenting its
23
+ * own token instead of the shared key.
24
+ *
25
+ * `read-only` is where the narrowing lives, and it still does.
26
+ */
27
+ export declare const FULL_CAPABILITIES: Capability[];
28
+ /**
29
+ * Read-only monitoring. The mode that makes a "just show me what's happening"
30
+ * device safe to pair, and the one C5 explicitly calls for.
31
+ */
32
+ export declare const READ_ONLY_CAPABILITIES: Capability[];
33
+ export type CapabilityPreset = "full" | "read-only";
34
+ export declare function capabilitiesForPreset(preset: CapabilityPreset): Capability[];
35
+ /**
36
+ * The principal behind a request.
37
+ *
38
+ * `legacy` is the shared API key: it predates device identity, so it carries the
39
+ * full preset and no device id. Keeping it working is what lets this ship
40
+ * without breaking every already-paired device.
41
+ */
42
+ export interface Principal {
43
+ kind: "device" | "legacy";
44
+ deviceId?: string;
45
+ capabilities: Capability[];
46
+ }
47
+ export declare function legacyPrincipal(): Principal;
48
+ export declare function hasCapability(principal: Principal, required: Capability): boolean;
49
+ export declare function requiredCapability(path: string, method: string): Capability | null;
50
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/services/security/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,YAAY,YACvB,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,eAAe,EACf,OAAO,CACC,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAAU,EAOzC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,UAAU,EAAqB,CAAC;AAErE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,CAAC;AAEpD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,EAAE,CAE5E;AAED;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,wBAAgB,eAAe,IAAI,SAAS,CAM3C;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAEjF;AAgED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAgBlF"}
@@ -0,0 +1,28 @@
1
+ import type { ManagedSessionRow } from "../../db/repositories/managed-sessions.repository";
2
+ /** Only a recent restart is eligible for unattended recovery. */
3
+ export declare const AUTO_RESUME_WINDOW_MS: number;
4
+ /** Hard ceiling for unattended agent starts during one boot. */
5
+ export declare const AUTO_RESUME_MAX = 5;
6
+ /** At most two provider processes may be starting at once. */
7
+ export declare const AUTO_RESUME_CONCURRENCY = 2;
8
+ /** Keep successive starts from landing on the host in the same instant. */
9
+ export declare const AUTO_RESUME_STAGGER_MS = 500;
10
+ export type AutoResumeSkipReason = "not_shutdown" | "not_interrupted" | "too_old" | "project_missing" | "resume_identity_missing" | "history_missing";
11
+ export interface AutoResumeOptions {
12
+ now: number;
13
+ projectExists: (projectPath: string) => boolean;
14
+ historyExists: (row: ManagedSessionRow) => boolean;
15
+ }
16
+ /** Why a persisted row must remain a user-driven resume, or null when eligible. */
17
+ export declare function autoResumeSkipReason(row: ManagedSessionRow, opts: AutoResumeOptions): AutoResumeSkipReason | null;
18
+ export interface AutoResumePlan {
19
+ attempts: ManagedSessionRow[];
20
+ skipped: Array<{
21
+ row: ManagedSessionRow;
22
+ reason: AutoResumeSkipReason;
23
+ }>;
24
+ overflow: ManagedSessionRow[];
25
+ }
26
+ /** Preserve repository order while applying eligibility and the per-boot ceiling. */
27
+ export declare function planAutoResume(rows: ManagedSessionRow[], opts: AutoResumeOptions): AutoResumePlan;
28
+ //# sourceMappingURL=autoResumeOnBoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoResumeOnBoot.d.ts","sourceRoot":"","sources":["../../../src/services/sessions/autoResumeOnBoot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAC;AAG3F,iEAAiE;AACjE,eAAO,MAAM,qBAAqB,QAAiB,CAAC;AAEpD,gEAAgE;AAChE,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,8DAA8D;AAC9D,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C,MAAM,MAAM,oBAAoB,GAC5B,cAAc,GACd,iBAAiB,GACjB,SAAS,GACT,iBAAiB,GACjB,yBAAyB,GACzB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,aAAa,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC;CACpD;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,iBAAiB,GACtB,oBAAoB,GAAG,IAAI,CAQ7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,iBAAiB,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,CAAC,CAAC;IACzE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,qFAAqF;AACrF,wBAAgB,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,iBAAiB,GAAG,cAAc,CAejG"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Who is holding a Codex rollout JSONL open right now.
3
+ *
4
+ * Codex enforces a single-writer rule per rollout and only reports it *after*
5
+ * `codex resume` has started ("already has an active writer (code -32600)"),
6
+ * by which point the streamer has already spawned a PTY and answered 201. The
7
+ * heuristic pre-flight in conversationBusy.ts cannot see that owner: a Codex
8
+ * process need not carry the rollout UUID in its argv, and a quiet-but-owned
9
+ * rollout has an mtime well outside the busy window (the 2026-08-09 incident:
10
+ * pid 9935 held the file open with an mtime older than 120 s).
11
+ *
12
+ * An open file handle on the exact rollout is direct evidence of the condition
13
+ * Codex itself rejects, so it is the one pre-spawn signal worth paying for.
14
+ *
15
+ * It is an OPTIMISATION, never a proof of the negative: `lsof` is POSIX-only,
16
+ * may be absent, may be denied, and cannot see another user's process. A null
17
+ * result means "no evidence", and the caller must still rely on the
18
+ * authoritative post-spawn handshake.
19
+ */
20
+ /** Hard cap on the probe. Resume is latency-sensitive — a slow lsof is a miss. */
21
+ export declare const ROLLOUT_OWNER_TIMEOUT_MS = 800;
22
+ /**
23
+ * How the owning process is best described to a client.
24
+ *
25
+ * Only a process whose command is exactly `codex` is classified, and even then
26
+ * only as "terminal". A VS Code / desktop `codex app-server` can host several
27
+ * unrelated threads, so mis-labelling one as a standalone TUI is what would
28
+ * make a destructive recovery action look safe. Everything else stays
29
+ * "unknown", and no takeover is ever offered from this signal.
30
+ */
31
+ export type CodexOwnerSource = "terminal" | "unknown";
32
+ export interface CodexRolloutOwner {
33
+ pid: number;
34
+ command: string;
35
+ source: CodexOwnerSource;
36
+ }
37
+ export interface FindRolloutOwnerOptions {
38
+ platform?: NodeJS.Platform;
39
+ timeoutMs?: number;
40
+ /** Our own pid — the streamer's handles on the file are not a collision. */
41
+ selfPid?: number;
42
+ /** Injection point for tests; defaults to a bounded `lsof` call. */
43
+ run?: (rolloutPath: string, timeoutMs: number) => Promise<string>;
44
+ }
45
+ /** Parse `lsof -F pc` output into (pid, command) pairs, in file order. */
46
+ export declare function parseLsofFieldOutput(stdout: string): Array<{
47
+ pid: number;
48
+ command: string;
49
+ }>;
50
+ /**
51
+ * First foreign process holding `rolloutPath` open, or null when there is no
52
+ * evidence of one (no match, unsupported platform, missing/denied/slow lsof).
53
+ */
54
+ export declare function findRolloutOwner(rolloutPath: string, options?: FindRolloutOwnerOptions): Promise<CodexRolloutOwner | null>;
55
+ //# sourceMappingURL=codexRolloutOwner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codexRolloutOwner.d.ts","sourceRoot":"","sources":["../../../src/services/sessions/codexRolloutOwner.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACnE;AA2CD,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAa5F;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAsBnC"}