repoburg 1.3.202 → 1.3.209

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 (288) hide show
  1. package/agent-pane/backend/dist/index.js +2103 -32003
  2. package/agent-pane/backend/dist/server.js +45313 -0
  3. package/backend/dist/src/agent-runtime/agent-runtime.types.d.ts +1 -0
  4. package/backend/dist/src/llm-orchestration/hooks/frontend-notification.hook.js +6 -6
  5. package/backend/dist/src/llm-orchestration/hooks/frontend-notification.hook.js.map +1 -1
  6. package/backend/dist/src/llm-orchestration/llm-turn-processor.service.js +1 -0
  7. package/backend/dist/src/llm-orchestration/llm-turn-processor.service.js.map +1 -1
  8. package/backend/dist/tsconfig.build.tsbuildinfo +1 -1
  9. package/daemon/dist/agentPane.js +128 -0
  10. package/daemon/dist/agentPane.spec.js +183 -0
  11. package/daemon/dist/index.js +28 -8
  12. package/daemon/package.json +1 -1
  13. package/model-selector-scroll.png +0 -0
  14. package/package.json +10 -2
  15. package/agent-pane/.prettierignore +0 -5
  16. package/agent-pane/.prettierrc +0 -8
  17. package/agent-pane/backend/coverage/base.css +0 -224
  18. package/agent-pane/backend/coverage/block-navigation.js +0 -87
  19. package/agent-pane/backend/coverage/clover.xml +0 -887
  20. package/agent-pane/backend/coverage/coverage-final.json +0 -10
  21. package/agent-pane/backend/coverage/favicon.png +0 -0
  22. package/agent-pane/backend/coverage/index.html +0 -176
  23. package/agent-pane/backend/coverage/prettify.css +0 -1
  24. package/agent-pane/backend/coverage/prettify.js +0 -2
  25. package/agent-pane/backend/coverage/sort-arrow-sprite.png +0 -0
  26. package/agent-pane/backend/coverage/sorter.js +0 -210
  27. package/agent-pane/backend/coverage/src/codex/codex-provider.ts.html +0 -1402
  28. package/agent-pane/backend/coverage/src/codex/index.html +0 -131
  29. package/agent-pane/backend/coverage/src/codex/item-mapper.ts.html +0 -331
  30. package/agent-pane/backend/coverage/src/db/index.html +0 -131
  31. package/agent-pane/backend/coverage/src/db/index.ts.html +0 -436
  32. package/agent-pane/backend/coverage/src/db/schema.ts.html +0 -175
  33. package/agent-pane/backend/coverage/src/index.html +0 -116
  34. package/agent-pane/backend/coverage/src/index.ts.html +0 -262
  35. package/agent-pane/backend/coverage/src/routes/index.html +0 -146
  36. package/agent-pane/backend/coverage/src/routes/sessions.ts.html +0 -991
  37. package/agent-pane/backend/coverage/src/routes/turns.ts.html +0 -256
  38. package/agent-pane/backend/coverage/src/routes/workspaces.ts.html +0 -406
  39. package/agent-pane/backend/coverage/src/ws/index.html +0 -116
  40. package/agent-pane/backend/coverage/src/ws/index.ts.html +0 -238
  41. package/agent-pane/backend/data.db +0 -0
  42. package/agent-pane/backend/data.db-shm +0 -0
  43. package/agent-pane/backend/data.db-wal +0 -0
  44. package/agent-pane/backend/package-lock.json +0 -5945
  45. package/agent-pane/backend/package.json +0 -33
  46. package/agent-pane/backend/scripts/backfill-from-jsonl.ts +0 -206
  47. package/agent-pane/backend/scripts/import-session-from-jsonl.ts +0 -264
  48. package/agent-pane/backend/src/claude/claude-message-mapper.test.ts +0 -271
  49. package/agent-pane/backend/src/claude/claude-message-mapper.ts +0 -259
  50. package/agent-pane/backend/src/claude/claude-provider.test.ts +0 -455
  51. package/agent-pane/backend/src/claude/claude-provider.ts +0 -1319
  52. package/agent-pane/backend/src/claude/claude-types.ts +0 -45
  53. package/agent-pane/backend/src/codex/app-server-client.test.ts +0 -183
  54. package/agent-pane/backend/src/codex/app-server-client.ts +0 -247
  55. package/agent-pane/backend/src/codex/app-server-types.ts +0 -259
  56. package/agent-pane/backend/src/codex/codex-provider-runtime-config.test.ts +0 -56
  57. package/agent-pane/backend/src/codex/codex-provider.test.ts +0 -60
  58. package/agent-pane/backend/src/codex/codex-provider.ts +0 -619
  59. package/agent-pane/backend/src/codex/item-mapper.test.ts +0 -221
  60. package/agent-pane/backend/src/codex/item-mapper.ts +0 -86
  61. package/agent-pane/backend/src/codex/shared-app-server.ts +0 -25
  62. package/agent-pane/backend/src/db/index.test.ts +0 -125
  63. package/agent-pane/backend/src/db/index.ts +0 -236
  64. package/agent-pane/backend/src/db/schema.ts +0 -34
  65. package/agent-pane/backend/src/index.ts +0 -89
  66. package/agent-pane/backend/src/integration/__fixtures__/cancel-turn.json +0 -29
  67. package/agent-pane/backend/src/integration/__fixtures__/delta-streaming.json +0 -40
  68. package/agent-pane/backend/src/integration/__fixtures__/failed-turn.json +0 -16
  69. package/agent-pane/backend/src/integration/__fixtures__/mcp-tool-call.json +0 -60
  70. package/agent-pane/backend/src/integration/__fixtures__/missing-item-started.json +0 -34
  71. package/agent-pane/backend/src/integration/__fixtures__/multi-item-turn.json +0 -85
  72. package/agent-pane/backend/src/integration/__fixtures__/multi-turn.json +0 -48
  73. package/agent-pane/backend/src/integration/__fixtures__/simple-turn.json +0 -35
  74. package/agent-pane/backend/src/integration/delta-streaming.test.ts +0 -130
  75. package/agent-pane/backend/src/integration/helpers/app-server-mock.ts +0 -272
  76. package/agent-pane/backend/src/integration/helpers/test-app.ts +0 -110
  77. package/agent-pane/backend/src/integration/helpers/ws-capture.ts +0 -64
  78. package/agent-pane/backend/src/integration/item-lifecycle.test.ts +0 -133
  79. package/agent-pane/backend/src/integration/mcp-tool-call.test.ts +0 -102
  80. package/agent-pane/backend/src/integration/missing-item-started.test.ts +0 -91
  81. package/agent-pane/backend/src/integration/multi-turn.test.ts +0 -121
  82. package/agent-pane/backend/src/integration/session-operations.test.ts +0 -175
  83. package/agent-pane/backend/src/integration/threads-claude-fork.test.ts +0 -241
  84. package/agent-pane/backend/src/integration/threads.test.ts +0 -309
  85. package/agent-pane/backend/src/integration/title-generation.test.ts +0 -109
  86. package/agent-pane/backend/src/integration/turn-cancel.test.ts +0 -111
  87. package/agent-pane/backend/src/integration/turn-failure.test.ts +0 -97
  88. package/agent-pane/backend/src/integration/turn-lifecycle.test.ts +0 -141
  89. package/agent-pane/backend/src/providers/index.ts +0 -16
  90. package/agent-pane/backend/src/providers/registry.test.ts +0 -92
  91. package/agent-pane/backend/src/providers/registry.ts +0 -43
  92. package/agent-pane/backend/src/providers/runtime-provider.ts +0 -49
  93. package/agent-pane/backend/src/repoburg/action-mapping.test.ts +0 -122
  94. package/agent-pane/backend/src/repoburg/action-mapping.ts +0 -294
  95. package/agent-pane/backend/src/repoburg/agent-runtime-client.test.ts +0 -271
  96. package/agent-pane/backend/src/repoburg/agent-runtime-client.ts +0 -285
  97. package/agent-pane/backend/src/repoburg/backend-resolver.test.ts +0 -356
  98. package/agent-pane/backend/src/repoburg/backend-resolver.ts +0 -261
  99. package/agent-pane/backend/src/repoburg/repoburg-client.test.ts +0 -180
  100. package/agent-pane/backend/src/repoburg/repoburg-client.ts +0 -194
  101. package/agent-pane/backend/src/repoburg/repoburg-provider.test.ts +0 -780
  102. package/agent-pane/backend/src/repoburg/repoburg-provider.ts +0 -471
  103. package/agent-pane/backend/src/repoburg/turn-projector.test.ts +0 -621
  104. package/agent-pane/backend/src/repoburg/turn-projector.ts +0 -637
  105. package/agent-pane/backend/src/routes/files.ts +0 -31
  106. package/agent-pane/backend/src/routes/mcp.ts +0 -33
  107. package/agent-pane/backend/src/routes/models.test.ts +0 -92
  108. package/agent-pane/backend/src/routes/models.ts +0 -16
  109. package/agent-pane/backend/src/routes/plugins.ts +0 -40
  110. package/agent-pane/backend/src/routes/providers.test.ts +0 -86
  111. package/agent-pane/backend/src/routes/providers.ts +0 -86
  112. package/agent-pane/backend/src/routes/sessions.test.ts +0 -772
  113. package/agent-pane/backend/src/routes/sessions.ts +0 -565
  114. package/agent-pane/backend/src/routes/skills.test.ts +0 -114
  115. package/agent-pane/backend/src/routes/skills.ts +0 -70
  116. package/agent-pane/backend/src/routes/threads.ts +0 -323
  117. package/agent-pane/backend/src/routes/turns.test.ts +0 -196
  118. package/agent-pane/backend/src/routes/turns.ts +0 -103
  119. package/agent-pane/backend/src/routes/workspaces.test.ts +0 -197
  120. package/agent-pane/backend/src/routes/workspaces.ts +0 -128
  121. package/agent-pane/backend/src/ws/index.test.ts +0 -107
  122. package/agent-pane/backend/src/ws/index.ts +0 -51
  123. package/agent-pane/backend/tsconfig.json +0 -25
  124. package/agent-pane/backend/vitest.config.ts +0 -20
  125. package/agent-pane/eslint.config.js +0 -33
  126. package/agent-pane/frontend/coverage/base.css +0 -224
  127. package/agent-pane/frontend/coverage/block-navigation.js +0 -87
  128. package/agent-pane/frontend/coverage/clover.xml +0 -2962
  129. package/agent-pane/frontend/coverage/coverage-final.json +0 -37
  130. package/agent-pane/frontend/coverage/favicon.png +0 -0
  131. package/agent-pane/frontend/coverage/index.html +0 -251
  132. package/agent-pane/frontend/coverage/prettify.css +0 -1
  133. package/agent-pane/frontend/coverage/prettify.js +0 -2
  134. package/agent-pane/frontend/coverage/sort-arrow-sprite.png +0 -0
  135. package/agent-pane/frontend/coverage/sorter.js +0 -210
  136. package/agent-pane/frontend/coverage/src/App.tsx.html +0 -217
  137. package/agent-pane/frontend/coverage/src/AppInitializer.tsx.html +0 -223
  138. package/agent-pane/frontend/coverage/src/api/client.ts.html +0 -187
  139. package/agent-pane/frontend/coverage/src/api/index.html +0 -161
  140. package/agent-pane/frontend/coverage/src/api/sessions.ts.html +0 -316
  141. package/agent-pane/frontend/coverage/src/api/websocket.ts.html +0 -544
  142. package/agent-pane/frontend/coverage/src/api/workspaces.ts.html +0 -199
  143. package/agent-pane/frontend/coverage/src/components/CollapsibleToolCalls.tsx.html +0 -226
  144. package/agent-pane/frontend/coverage/src/components/CommandInputBar.tsx.html +0 -382
  145. package/agent-pane/frontend/coverage/src/components/CommandPalette.tsx.html +0 -715
  146. package/agent-pane/frontend/coverage/src/components/IdeWorkspace.tsx.html +0 -160
  147. package/agent-pane/frontend/coverage/src/components/ModelSelector.tsx.html +0 -478
  148. package/agent-pane/frontend/coverage/src/components/NewSessionDialog.tsx.html +0 -472
  149. package/agent-pane/frontend/coverage/src/components/RenderArea.tsx.html +0 -574
  150. package/agent-pane/frontend/coverage/src/components/RightPanel.tsx.html +0 -205
  151. package/agent-pane/frontend/coverage/src/components/RuntimeIcon.tsx.html +0 -133
  152. package/agent-pane/frontend/coverage/src/components/SessionTabs.tsx.html +0 -217
  153. package/agent-pane/frontend/coverage/src/components/StatusBar.tsx.html +0 -271
  154. package/agent-pane/frontend/coverage/src/components/StatusDot.tsx.html +0 -109
  155. package/agent-pane/frontend/coverage/src/components/Toast.tsx.html +0 -313
  156. package/agent-pane/frontend/coverage/src/components/TurnContent.tsx.html +0 -1216
  157. package/agent-pane/frontend/coverage/src/components/WorkspaceSidebar.tsx.html +0 -1138
  158. package/agent-pane/frontend/coverage/src/components/index.html +0 -326
  159. package/agent-pane/frontend/coverage/src/components/panels/ChangesPanel.tsx.html +0 -247
  160. package/agent-pane/frontend/coverage/src/components/panels/LogsPanel.tsx.html +0 -160
  161. package/agent-pane/frontend/coverage/src/components/panels/MetricsPanel.tsx.html +0 -427
  162. package/agent-pane/frontend/coverage/src/components/panels/TurnsPanel.tsx.html +0 -397
  163. package/agent-pane/frontend/coverage/src/components/panels/index.html +0 -161
  164. package/agent-pane/frontend/coverage/src/constants/index.html +0 -116
  165. package/agent-pane/frontend/coverage/src/constants/models.ts.html +0 -406
  166. package/agent-pane/frontend/coverage/src/hooks/index.html +0 -146
  167. package/agent-pane/frontend/coverage/src/hooks/useEscapeKey.ts.html +0 -124
  168. package/agent-pane/frontend/coverage/src/hooks/useOutsideClick.ts.html +0 -142
  169. package/agent-pane/frontend/coverage/src/hooks/useSessionStatus.ts.html +0 -187
  170. package/agent-pane/frontend/coverage/src/index.html +0 -146
  171. package/agent-pane/frontend/coverage/src/main.tsx.html +0 -115
  172. package/agent-pane/frontend/coverage/src/store/index.html +0 -116
  173. package/agent-pane/frontend/coverage/src/store/store.ts.html +0 -2404
  174. package/agent-pane/frontend/coverage/src/test/component-helpers.ts.html +0 -190
  175. package/agent-pane/frontend/coverage/src/test/fixtures.ts.html +0 -367
  176. package/agent-pane/frontend/coverage/src/test/index.html +0 -131
  177. package/agent-pane/frontend/coverage/src/types/index.html +0 -116
  178. package/agent-pane/frontend/coverage/src/types/index.ts.html +0 -466
  179. package/agent-pane/frontend/coverage/src/utils/changes.ts.html +0 -202
  180. package/agent-pane/frontend/coverage/src/utils/duration.ts.html +0 -127
  181. package/agent-pane/frontend/coverage/src/utils/index.html +0 -131
  182. package/agent-pane/frontend/dist/assets/index-CJxD4YmJ.js +0 -370
  183. package/agent-pane/frontend/dist/assets/index-r-xwfOKQ.css +0 -1
  184. package/agent-pane/frontend/dist/index.html +0 -19
  185. package/agent-pane/frontend/index.html +0 -18
  186. package/agent-pane/frontend/package-lock.json +0 -4211
  187. package/agent-pane/frontend/package.json +0 -35
  188. package/agent-pane/frontend/src/App.test.tsx +0 -74
  189. package/agent-pane/frontend/src/App.tsx +0 -44
  190. package/agent-pane/frontend/src/AppInitializer.test.tsx +0 -142
  191. package/agent-pane/frontend/src/AppInitializer.tsx +0 -46
  192. package/agent-pane/frontend/src/__tests__/ThreadsPanel.test.tsx +0 -192
  193. package/agent-pane/frontend/src/api/client.test.ts +0 -126
  194. package/agent-pane/frontend/src/api/client.ts +0 -34
  195. package/agent-pane/frontend/src/api/models.ts +0 -7
  196. package/agent-pane/frontend/src/api/providers.ts +0 -17
  197. package/agent-pane/frontend/src/api/sessions.test.ts +0 -246
  198. package/agent-pane/frontend/src/api/sessions.ts +0 -97
  199. package/agent-pane/frontend/src/api/skills.ts +0 -12
  200. package/agent-pane/frontend/src/api/websocket.test.ts +0 -288
  201. package/agent-pane/frontend/src/api/websocket.ts +0 -240
  202. package/agent-pane/frontend/src/api/workspaces.test.ts +0 -112
  203. package/agent-pane/frontend/src/api/workspaces.ts +0 -38
  204. package/agent-pane/frontend/src/components/AskUserItem.test.tsx +0 -143
  205. package/agent-pane/frontend/src/components/AskUserItem.tsx +0 -207
  206. package/agent-pane/frontend/src/components/CollapsibleToolCalls.test.tsx +0 -49
  207. package/agent-pane/frontend/src/components/CollapsibleToolCalls.tsx +0 -56
  208. package/agent-pane/frontend/src/components/CommandInputBar.test.tsx +0 -133
  209. package/agent-pane/frontend/src/components/CommandInputBar.tsx +0 -584
  210. package/agent-pane/frontend/src/components/CommandPalette.test.tsx +0 -226
  211. package/agent-pane/frontend/src/components/CommandPalette.tsx +0 -194
  212. package/agent-pane/frontend/src/components/CommentableText.test.tsx +0 -196
  213. package/agent-pane/frontend/src/components/CommentableText.tsx +0 -379
  214. package/agent-pane/frontend/src/components/IdeWorkspace.test.tsx +0 -39
  215. package/agent-pane/frontend/src/components/IdeWorkspace.tsx +0 -51
  216. package/agent-pane/frontend/src/components/ModelSelector.test.tsx +0 -129
  217. package/agent-pane/frontend/src/components/ModelSelector.tsx +0 -191
  218. package/agent-pane/frontend/src/components/NewSessionDialog.test.tsx +0 -95
  219. package/agent-pane/frontend/src/components/NewSessionDialog.tsx +0 -129
  220. package/agent-pane/frontend/src/components/RenderArea.test.tsx +0 -160
  221. package/agent-pane/frontend/src/components/RenderArea.tsx +0 -170
  222. package/agent-pane/frontend/src/components/ResizeHandle.tsx +0 -29
  223. package/agent-pane/frontend/src/components/RightPanel.test.tsx +0 -43
  224. package/agent-pane/frontend/src/components/RightPanel.tsx +0 -46
  225. package/agent-pane/frontend/src/components/RuntimeIcon.test.tsx +0 -32
  226. package/agent-pane/frontend/src/components/RuntimeIcon.tsx +0 -16
  227. package/agent-pane/frontend/src/components/SessionTabs.test.tsx +0 -72
  228. package/agent-pane/frontend/src/components/SessionTabs.tsx +0 -49
  229. package/agent-pane/frontend/src/components/StatusBar.test.tsx +0 -56
  230. package/agent-pane/frontend/src/components/StatusBar.tsx +0 -129
  231. package/agent-pane/frontend/src/components/StatusDot.test.tsx +0 -25
  232. package/agent-pane/frontend/src/components/StatusDot.tsx +0 -8
  233. package/agent-pane/frontend/src/components/Toast.test.tsx +0 -79
  234. package/agent-pane/frontend/src/components/Toast.tsx +0 -76
  235. package/agent-pane/frontend/src/components/TurnContent.test.tsx +0 -377
  236. package/agent-pane/frontend/src/components/TurnContent.tsx +0 -594
  237. package/agent-pane/frontend/src/components/WorkspaceSidebar.test.tsx +0 -297
  238. package/agent-pane/frontend/src/components/WorkspaceSidebar.tsx +0 -351
  239. package/agent-pane/frontend/src/components/input/OptionSubPopup.tsx +0 -32
  240. package/agent-pane/frontend/src/components/input/SkillMentionPopup.test.tsx +0 -63
  241. package/agent-pane/frontend/src/components/input/SkillMentionPopup.tsx +0 -78
  242. package/agent-pane/frontend/src/components/input/SlashPopup.test.tsx +0 -96
  243. package/agent-pane/frontend/src/components/input/SlashPopup.tsx +0 -82
  244. package/agent-pane/frontend/src/components/panels/ChangesPanel.test.tsx +0 -61
  245. package/agent-pane/frontend/src/components/panels/ChangesPanel.tsx +0 -54
  246. package/agent-pane/frontend/src/components/panels/TasksPanel.test.tsx +0 -97
  247. package/agent-pane/frontend/src/components/panels/TasksPanel.tsx +0 -208
  248. package/agent-pane/frontend/src/components/panels/ThreadsPanel.tsx +0 -382
  249. package/agent-pane/frontend/src/components/panels/TurnsPanel.test.tsx +0 -131
  250. package/agent-pane/frontend/src/components/panels/TurnsPanel.tsx +0 -131
  251. package/agent-pane/frontend/src/constants/models.test.ts +0 -97
  252. package/agent-pane/frontend/src/constants/models.ts +0 -166
  253. package/agent-pane/frontend/src/hooks/useEscapeKey.test.ts +0 -42
  254. package/agent-pane/frontend/src/hooks/useEscapeKey.ts +0 -13
  255. package/agent-pane/frontend/src/hooks/useOutsideClick.test.ts +0 -92
  256. package/agent-pane/frontend/src/hooks/useOutsideClick.ts +0 -19
  257. package/agent-pane/frontend/src/hooks/useProvider.ts +0 -44
  258. package/agent-pane/frontend/src/hooks/useResizable.test.ts +0 -97
  259. package/agent-pane/frontend/src/hooks/useResizable.ts +0 -75
  260. package/agent-pane/frontend/src/hooks/useSessionStatus.test.ts +0 -116
  261. package/agent-pane/frontend/src/hooks/useSessionStatus.ts +0 -34
  262. package/agent-pane/frontend/src/main.test.tsx +0 -37
  263. package/agent-pane/frontend/src/main.tsx +0 -10
  264. package/agent-pane/frontend/src/store/sessionSlice.ts +0 -440
  265. package/agent-pane/frontend/src/store/store.test.ts +0 -1338
  266. package/agent-pane/frontend/src/store/store.ts +0 -37
  267. package/agent-pane/frontend/src/store/threadSlice.ts +0 -136
  268. package/agent-pane/frontend/src/store/uiSlice.ts +0 -133
  269. package/agent-pane/frontend/src/store/workspaceSlice.ts +0 -77
  270. package/agent-pane/frontend/src/store/wsSlice.ts +0 -368
  271. package/agent-pane/frontend/src/styles/app.css +0 -627
  272. package/agent-pane/frontend/src/styles/tokens.css +0 -62
  273. package/agent-pane/frontend/src/test/component-helpers.ts +0 -38
  274. package/agent-pane/frontend/src/test/fixtures.ts +0 -101
  275. package/agent-pane/frontend/src/test-setup.ts +0 -5
  276. package/agent-pane/frontend/src/types/index.test.ts +0 -128
  277. package/agent-pane/frontend/src/types/index.ts +0 -134
  278. package/agent-pane/frontend/src/utils/changes.test.ts +0 -81
  279. package/agent-pane/frontend/src/utils/changes.ts +0 -39
  280. package/agent-pane/frontend/src/utils/duration.test.ts +0 -76
  281. package/agent-pane/frontend/src/utils/duration.ts +0 -14
  282. package/agent-pane/frontend/tsconfig.json +0 -25
  283. package/agent-pane/frontend/vite.config.ts +0 -22
  284. package/agent-pane/frontend/vitest.config.ts +0 -29
  285. package/agent-pane/package-lock.json +0 -1527
  286. package/agent-pane/package.json +0 -19
  287. package/agent-pane/shared/provider-types.ts +0 -67
  288. package/agent-pane/shared/types.ts +0 -184
@@ -1,1402 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/codex/codex-provider.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../prettify.css" />
9
- <link rel="stylesheet" href="../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../index.html">All files</a> / <a href="index.html">src/codex</a> codex-provider.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>0/349</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>0/349</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line low'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
288
- <a name='L223'></a><a href='#L223'>223</a>
289
- <a name='L224'></a><a href='#L224'>224</a>
290
- <a name='L225'></a><a href='#L225'>225</a>
291
- <a name='L226'></a><a href='#L226'>226</a>
292
- <a name='L227'></a><a href='#L227'>227</a>
293
- <a name='L228'></a><a href='#L228'>228</a>
294
- <a name='L229'></a><a href='#L229'>229</a>
295
- <a name='L230'></a><a href='#L230'>230</a>
296
- <a name='L231'></a><a href='#L231'>231</a>
297
- <a name='L232'></a><a href='#L232'>232</a>
298
- <a name='L233'></a><a href='#L233'>233</a>
299
- <a name='L234'></a><a href='#L234'>234</a>
300
- <a name='L235'></a><a href='#L235'>235</a>
301
- <a name='L236'></a><a href='#L236'>236</a>
302
- <a name='L237'></a><a href='#L237'>237</a>
303
- <a name='L238'></a><a href='#L238'>238</a>
304
- <a name='L239'></a><a href='#L239'>239</a>
305
- <a name='L240'></a><a href='#L240'>240</a>
306
- <a name='L241'></a><a href='#L241'>241</a>
307
- <a name='L242'></a><a href='#L242'>242</a>
308
- <a name='L243'></a><a href='#L243'>243</a>
309
- <a name='L244'></a><a href='#L244'>244</a>
310
- <a name='L245'></a><a href='#L245'>245</a>
311
- <a name='L246'></a><a href='#L246'>246</a>
312
- <a name='L247'></a><a href='#L247'>247</a>
313
- <a name='L248'></a><a href='#L248'>248</a>
314
- <a name='L249'></a><a href='#L249'>249</a>
315
- <a name='L250'></a><a href='#L250'>250</a>
316
- <a name='L251'></a><a href='#L251'>251</a>
317
- <a name='L252'></a><a href='#L252'>252</a>
318
- <a name='L253'></a><a href='#L253'>253</a>
319
- <a name='L254'></a><a href='#L254'>254</a>
320
- <a name='L255'></a><a href='#L255'>255</a>
321
- <a name='L256'></a><a href='#L256'>256</a>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a>
488
- <a name='L423'></a><a href='#L423'>423</a>
489
- <a name='L424'></a><a href='#L424'>424</a>
490
- <a name='L425'></a><a href='#L425'>425</a>
491
- <a name='L426'></a><a href='#L426'>426</a>
492
- <a name='L427'></a><a href='#L427'>427</a>
493
- <a name='L428'></a><a href='#L428'>428</a>
494
- <a name='L429'></a><a href='#L429'>429</a>
495
- <a name='L430'></a><a href='#L430'>430</a>
496
- <a name='L431'></a><a href='#L431'>431</a>
497
- <a name='L432'></a><a href='#L432'>432</a>
498
- <a name='L433'></a><a href='#L433'>433</a>
499
- <a name='L434'></a><a href='#L434'>434</a>
500
- <a name='L435'></a><a href='#L435'>435</a>
501
- <a name='L436'></a><a href='#L436'>436</a>
502
- <a name='L437'></a><a href='#L437'>437</a>
503
- <a name='L438'></a><a href='#L438'>438</a>
504
- <a name='L439'></a><a href='#L439'>439</a>
505
- <a name='L440'></a><a href='#L440'>440</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
506
- <span class="cline-any cline-no">&nbsp;</span>
507
- <span class="cline-any cline-no">&nbsp;</span>
508
- <span class="cline-any cline-no">&nbsp;</span>
509
- <span class="cline-any cline-no">&nbsp;</span>
510
- <span class="cline-any cline-no">&nbsp;</span>
511
- <span class="cline-any cline-no">&nbsp;</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-neutral">&nbsp;</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-neutral">&nbsp;</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-neutral">&nbsp;</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-neutral">&nbsp;</span>
520
- <span class="cline-any cline-no">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-no">&nbsp;</span>
524
- <span class="cline-any cline-no">&nbsp;</span>
525
- <span class="cline-any cline-no">&nbsp;</span>
526
- <span class="cline-any cline-no">&nbsp;</span>
527
- <span class="cline-any cline-no">&nbsp;</span>
528
- <span class="cline-any cline-no">&nbsp;</span>
529
- <span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-no">&nbsp;</span>
532
- <span class="cline-any cline-no">&nbsp;</span>
533
- <span class="cline-any cline-no">&nbsp;</span>
534
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-no">&nbsp;</span>
539
- <span class="cline-any cline-no">&nbsp;</span>
540
- <span class="cline-any cline-no">&nbsp;</span>
541
- <span class="cline-any cline-no">&nbsp;</span>
542
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-no">&nbsp;</span>
544
- <span class="cline-any cline-no">&nbsp;</span>
545
- <span class="cline-any cline-no">&nbsp;</span>
546
- <span class="cline-any cline-no">&nbsp;</span>
547
- <span class="cline-any cline-no">&nbsp;</span>
548
- <span class="cline-any cline-no">&nbsp;</span>
549
- <span class="cline-any cline-no">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-no">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-no">&nbsp;</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
568
- <span class="cline-any cline-no">&nbsp;</span>
569
- <span class="cline-any cline-no">&nbsp;</span>
570
- <span class="cline-any cline-no">&nbsp;</span>
571
- <span class="cline-any cline-no">&nbsp;</span>
572
- <span class="cline-any cline-no">&nbsp;</span>
573
- <span class="cline-any cline-no">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-no">&nbsp;</span>
579
- <span class="cline-any cline-no">&nbsp;</span>
580
- <span class="cline-any cline-neutral">&nbsp;</span>
581
- <span class="cline-any cline-no">&nbsp;</span>
582
- <span class="cline-any cline-no">&nbsp;</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
586
- <span class="cline-any cline-no">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-no">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-no">&nbsp;</span>
592
- <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-neutral">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-no">&nbsp;</span>
599
- <span class="cline-any cline-no">&nbsp;</span>
600
- <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-no">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</span>
611
- <span class="cline-any cline-no">&nbsp;</span>
612
- <span class="cline-any cline-no">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-no">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-no">&nbsp;</span>
621
- <span class="cline-any cline-no">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-no">&nbsp;</span>
626
- <span class="cline-any cline-neutral">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-no">&nbsp;</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
638
- <span class="cline-any cline-no">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-neutral">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
- <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-no">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
- <span class="cline-any cline-no">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-no">&nbsp;</span>
657
- <span class="cline-any cline-no">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-no">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-no">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-no">&nbsp;</span>
685
- <span class="cline-any cline-no">&nbsp;</span>
686
- <span class="cline-any cline-no">&nbsp;</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-no">&nbsp;</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
701
- <span class="cline-any cline-no">&nbsp;</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
- <span class="cline-any cline-no">&nbsp;</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-no">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
716
- <span class="cline-any cline-no">&nbsp;</span>
717
- <span class="cline-any cline-no">&nbsp;</span>
718
- <span class="cline-any cline-no">&nbsp;</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
- <span class="cline-any cline-no">&nbsp;</span>
721
- <span class="cline-any cline-no">&nbsp;</span>
722
- <span class="cline-any cline-no">&nbsp;</span>
723
- <span class="cline-any cline-no">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
725
- <span class="cline-any cline-no">&nbsp;</span>
726
- <span class="cline-any cline-no">&nbsp;</span>
727
- <span class="cline-any cline-no">&nbsp;</span>
728
- <span class="cline-any cline-no">&nbsp;</span>
729
- <span class="cline-any cline-no">&nbsp;</span>
730
- <span class="cline-any cline-no">&nbsp;</span>
731
- <span class="cline-any cline-no">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-no">&nbsp;</span>
734
- <span class="cline-any cline-no">&nbsp;</span>
735
- <span class="cline-any cline-no">&nbsp;</span>
736
- <span class="cline-any cline-no">&nbsp;</span>
737
- <span class="cline-any cline-no">&nbsp;</span>
738
- <span class="cline-any cline-no">&nbsp;</span>
739
- <span class="cline-any cline-no">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-neutral">&nbsp;</span>
742
- <span class="cline-any cline-no">&nbsp;</span>
743
- <span class="cline-any cline-no">&nbsp;</span>
744
- <span class="cline-any cline-no">&nbsp;</span>
745
- <span class="cline-any cline-no">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
748
- <span class="cline-any cline-no">&nbsp;</span>
749
- <span class="cline-any cline-no">&nbsp;</span>
750
- <span class="cline-any cline-no">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
752
- <span class="cline-any cline-no">&nbsp;</span>
753
- <span class="cline-any cline-no">&nbsp;</span>
754
- <span class="cline-any cline-no">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-no">&nbsp;</span>
759
- <span class="cline-any cline-no">&nbsp;</span>
760
- <span class="cline-any cline-no">&nbsp;</span>
761
- <span class="cline-any cline-no">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-no">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
- <span class="cline-any cline-no">&nbsp;</span>
767
- <span class="cline-any cline-neutral">&nbsp;</span>
768
- <span class="cline-any cline-no">&nbsp;</span>
769
- <span class="cline-any cline-no">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-no">&nbsp;</span>
773
- <span class="cline-any cline-no">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-no">&nbsp;</span>
777
- <span class="cline-any cline-no">&nbsp;</span>
778
- <span class="cline-any cline-no">&nbsp;</span>
779
- <span class="cline-any cline-no">&nbsp;</span>
780
- <span class="cline-any cline-no">&nbsp;</span>
781
- <span class="cline-any cline-no">&nbsp;</span>
782
- <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-no">&nbsp;</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-no">&nbsp;</span>
789
- <span class="cline-any cline-no">&nbsp;</span>
790
- <span class="cline-any cline-no">&nbsp;</span>
791
- <span class="cline-any cline-no">&nbsp;</span>
792
- <span class="cline-any cline-no">&nbsp;</span>
793
- <span class="cline-any cline-no">&nbsp;</span>
794
- <span class="cline-any cline-no">&nbsp;</span>
795
- <span class="cline-any cline-no">&nbsp;</span>
796
- <span class="cline-any cline-no">&nbsp;</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-no">&nbsp;</span>
802
- <span class="cline-any cline-no">&nbsp;</span>
803
- <span class="cline-any cline-no">&nbsp;</span>
804
- <span class="cline-any cline-no">&nbsp;</span>
805
- <span class="cline-any cline-no">&nbsp;</span>
806
- <span class="cline-any cline-no">&nbsp;</span>
807
- <span class="cline-any cline-no">&nbsp;</span>
808
- <span class="cline-any cline-no">&nbsp;</span>
809
- <span class="cline-any cline-no">&nbsp;</span>
810
- <span class="cline-any cline-no">&nbsp;</span>
811
- <span class="cline-any cline-no">&nbsp;</span>
812
- <span class="cline-any cline-no">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-no">&nbsp;</span>
815
- <span class="cline-any cline-no">&nbsp;</span>
816
- <span class="cline-any cline-no">&nbsp;</span>
817
- <span class="cline-any cline-no">&nbsp;</span>
818
- <span class="cline-any cline-no">&nbsp;</span>
819
- <span class="cline-any cline-no">&nbsp;</span>
820
- <span class="cline-any cline-no">&nbsp;</span>
821
- <span class="cline-any cline-no">&nbsp;</span>
822
- <span class="cline-any cline-no">&nbsp;</span>
823
- <span class="cline-any cline-no">&nbsp;</span>
824
- <span class="cline-any cline-no">&nbsp;</span>
825
- <span class="cline-any cline-no">&nbsp;</span>
826
- <span class="cline-any cline-no">&nbsp;</span>
827
- <span class="cline-any cline-no">&nbsp;</span>
828
- <span class="cline-any cline-no">&nbsp;</span>
829
- <span class="cline-any cline-no">&nbsp;</span>
830
- <span class="cline-any cline-no">&nbsp;</span>
831
- <span class="cline-any cline-no">&nbsp;</span>
832
- <span class="cline-any cline-no">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-no">&nbsp;</span>
836
- <span class="cline-any cline-neutral">&nbsp;</span>
837
- <span class="cline-any cline-neutral">&nbsp;</span>
838
- <span class="cline-any cline-neutral">&nbsp;</span>
839
- <span class="cline-any cline-no">&nbsp;</span>
840
- <span class="cline-any cline-no">&nbsp;</span>
841
- <span class="cline-any cline-no">&nbsp;</span>
842
- <span class="cline-any cline-neutral">&nbsp;</span>
843
- <span class="cline-any cline-no">&nbsp;</span>
844
- <span class="cline-any cline-no">&nbsp;</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-no">&nbsp;</span>
848
- <span class="cline-any cline-no">&nbsp;</span>
849
- <span class="cline-any cline-no">&nbsp;</span>
850
- <span class="cline-any cline-no">&nbsp;</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-neutral">&nbsp;</span>
853
- <span class="cline-any cline-no">&nbsp;</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-no">&nbsp;</span>
857
- <span class="cline-any cline-no">&nbsp;</span>
858
- <span class="cline-any cline-no">&nbsp;</span>
859
- <span class="cline-any cline-no">&nbsp;</span>
860
- <span class="cline-any cline-neutral">&nbsp;</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-no">&nbsp;</span>
863
- <span class="cline-any cline-no">&nbsp;</span>
864
- <span class="cline-any cline-no">&nbsp;</span>
865
- <span class="cline-any cline-no">&nbsp;</span>
866
- <span class="cline-any cline-no">&nbsp;</span>
867
- <span class="cline-any cline-no">&nbsp;</span>
868
- <span class="cline-any cline-neutral">&nbsp;</span>
869
- <span class="cline-any cline-no">&nbsp;</span>
870
- <span class="cline-any cline-no">&nbsp;</span>
871
- <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-no">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-no">&nbsp;</span>
875
- <span class="cline-any cline-no">&nbsp;</span>
876
- <span class="cline-any cline-no">&nbsp;</span>
877
- <span class="cline-any cline-no">&nbsp;</span>
878
- <span class="cline-any cline-no">&nbsp;</span>
879
- <span class="cline-any cline-neutral">&nbsp;</span>
880
- <span class="cline-any cline-no">&nbsp;</span>
881
- <span class="cline-any cline-no">&nbsp;</span>
882
- <span class="cline-any cline-no">&nbsp;</span>
883
- <span class="cline-any cline-no">&nbsp;</span>
884
- <span class="cline-any cline-no">&nbsp;</span>
885
- <span class="cline-any cline-no">&nbsp;</span>
886
- <span class="cline-any cline-no">&nbsp;</span>
887
- <span class="cline-any cline-neutral">&nbsp;</span>
888
- <span class="cline-any cline-no">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-no">&nbsp;</span>
891
- <span class="cline-any cline-no">&nbsp;</span>
892
- <span class="cline-any cline-no">&nbsp;</span>
893
- <span class="cline-any cline-no">&nbsp;</span>
894
- <span class="cline-any cline-no">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-no">&nbsp;</span>
898
- <span class="cline-any cline-no">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-no">&nbsp;</span>
902
- <span class="cline-any cline-no">&nbsp;</span>
903
- <span class="cline-any cline-no">&nbsp;</span>
904
- <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-neutral">&nbsp;</span>
906
- <span class="cline-any cline-no">&nbsp;</span>
907
- <span class="cline-any cline-no">&nbsp;</span>
908
- <span class="cline-any cline-no">&nbsp;</span>
909
- <span class="cline-any cline-no">&nbsp;</span>
910
- <span class="cline-any cline-no">&nbsp;</span>
911
- <span class="cline-any cline-neutral">&nbsp;</span>
912
- <span class="cline-any cline-neutral">&nbsp;</span>
913
- <span class="cline-any cline-no">&nbsp;</span>
914
- <span class="cline-any cline-no">&nbsp;</span>
915
- <span class="cline-any cline-no">&nbsp;</span>
916
- <span class="cline-any cline-no">&nbsp;</span>
917
- <span class="cline-any cline-neutral">&nbsp;</span>
918
- <span class="cline-any cline-no">&nbsp;</span>
919
- <span class="cline-any cline-no">&nbsp;</span>
920
- <span class="cline-any cline-no">&nbsp;</span>
921
- <span class="cline-any cline-neutral">&nbsp;</span>
922
- <span class="cline-any cline-no">&nbsp;</span>
923
- <span class="cline-any cline-neutral">&nbsp;</span>
924
- <span class="cline-any cline-neutral">&nbsp;</span>
925
- <span class="cline-any cline-no">&nbsp;</span>
926
- <span class="cline-any cline-no">&nbsp;</span>
927
- <span class="cline-any cline-no">&nbsp;</span>
928
- <span class="cline-any cline-no">&nbsp;</span>
929
- <span class="cline-any cline-no">&nbsp;</span>
930
- <span class="cline-any cline-no">&nbsp;</span>
931
- <span class="cline-any cline-no">&nbsp;</span>
932
- <span class="cline-any cline-no">&nbsp;</span>
933
- <span class="cline-any cline-no">&nbsp;</span>
934
- <span class="cline-any cline-no">&nbsp;</span>
935
- <span class="cline-any cline-no">&nbsp;</span>
936
- <span class="cline-any cline-no">&nbsp;</span>
937
- <span class="cline-any cline-no">&nbsp;</span>
938
- <span class="cline-any cline-no">&nbsp;</span>
939
- <span class="cline-any cline-no">&nbsp;</span>
940
- <span class="cline-any cline-no">&nbsp;</span>
941
- <span class="cline-any cline-neutral">&nbsp;</span>
942
- <span class="cline-any cline-no">&nbsp;</span>
943
- <span class="cline-any cline-no">&nbsp;</span>
944
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { Codex, type Thread, type ThreadEvent, type ThreadItem, type ThreadOptions } from '@openai/codex-sdk';<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
945
- <span class="cstat-no" title="statement not covered" >import { v4 as uuidv4 } from 'uuid';</span>
946
- <span class="cstat-no" title="statement not covered" >import Database from 'better-sqlite3';</span>
947
- <span class="cstat-no" title="statement not covered" >import { readFileSync, writeFileSync, unlinkSync } from 'node:fs';</span>
948
- <span class="cstat-no" title="statement not covered" >import { getDb } from '../db/index.ts';</span>
949
- <span class="cstat-no" title="statement not covered" >import { broadcast } from '../ws/index.ts';</span>
950
- <span class="cstat-no" title="statement not covered" >import { mapItemData, getItemStatus } from './item-mapper.ts';</span>
951
- import type { Session, Turn, Item, ItemStatus } from '../db/schema.ts';
952
- &nbsp;
953
- interface ThreadEntry {
954
- codex: Codex;
955
- thread: Thread;
956
- abortController: AbortController | null;
957
- }
958
- &nbsp;
959
- <span class="cstat-no" title="statement not covered" >const threadMap = new Map&lt;string, ThreadEntry&gt;();</span>
960
- &nbsp;
961
- /** Insert a new item row into the items table. */
962
- <span class="cstat-no" title="statement not covered" >function insertItem(</span>
963
- <span class="cstat-no" title="statement not covered" > db: Database.Database,</span>
964
- <span class="cstat-no" title="statement not covered" > itemId: string,</span>
965
- <span class="cstat-no" title="statement not covered" > turnId: string,</span>
966
- <span class="cstat-no" title="statement not covered" > sdkItem: ThreadItem,</span>
967
- <span class="cstat-no" title="statement not covered" > data: Record&lt;string, unknown&gt;,</span>
968
- <span class="cstat-no" title="statement not covered" > status: ItemStatus,</span>
969
- <span class="cstat-no" title="statement not covered" > now: string,</span>
970
- <span class="cstat-no" title="statement not covered" >): void {</span>
971
- <span class="cstat-no" title="statement not covered" > db.prepare(</span>
972
- <span class="cstat-no" title="statement not covered" > 'INSERT INTO items (id, turn_id, external_item_id, type, data, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)',</span>
973
- <span class="cstat-no" title="statement not covered" > ).run(itemId, turnId, sdkItem.id, sdkItem.type, JSON.stringify(data), status, now, now);</span>
974
- <span class="cstat-no" title="statement not covered" >}</span>
975
- &nbsp;
976
- /** Update the running state and status of a session. */
977
- <span class="cstat-no" title="statement not covered" >function setSessionStatus(</span>
978
- <span class="cstat-no" title="statement not covered" > db: Database.Database,</span>
979
- <span class="cstat-no" title="statement not covered" > sessionId: string,</span>
980
- <span class="cstat-no" title="statement not covered" > isRunning: 0 | 1,</span>
981
- <span class="cstat-no" title="statement not covered" > status: string,</span>
982
- <span class="cstat-no" title="statement not covered" > now: string,</span>
983
- <span class="cstat-no" title="statement not covered" > hasUnreviewed = false,</span>
984
- <span class="cstat-no" title="statement not covered" >): void {</span>
985
- <span class="cstat-no" title="statement not covered" > if (hasUnreviewed) {</span>
986
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE sessions SET is_running = ?, status = ?, has_unreviewed = 1, updated_at = ? WHERE id = ?').run(</span>
987
- <span class="cstat-no" title="statement not covered" > isRunning,</span>
988
- <span class="cstat-no" title="statement not covered" > status,</span>
989
- <span class="cstat-no" title="statement not covered" > now,</span>
990
- <span class="cstat-no" title="statement not covered" > sessionId,</span>
991
- <span class="cstat-no" title="statement not covered" > );</span>
992
- <span class="cstat-no" title="statement not covered" > } else {</span>
993
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE sessions SET is_running = ?, status = ?, updated_at = ? WHERE id = ?').run(</span>
994
- <span class="cstat-no" title="statement not covered" > isRunning,</span>
995
- <span class="cstat-no" title="statement not covered" > status,</span>
996
- <span class="cstat-no" title="statement not covered" > now,</span>
997
- <span class="cstat-no" title="statement not covered" > sessionId,</span>
998
- <span class="cstat-no" title="statement not covered" > );</span>
999
- <span class="cstat-no" title="statement not covered" > }</span>
1000
- <span class="cstat-no" title="statement not covered" >}</span>
1001
- &nbsp;
1002
- <span class="cstat-no" title="statement not covered" >function getThreadOptions(session: Session): ThreadOptions {</span>
1003
- <span class="cstat-no" title="statement not covered" > return {</span>
1004
- <span class="cstat-no" title="statement not covered" > model: session.model ?? undefined,</span>
1005
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK type omits "max" and "ultra" but the Codex CLI accepts them
1006
- <span class="cstat-no" title="statement not covered" > modelReasoningEffort: (session.model_reasoning_effort as any) ?? undefined,</span>
1007
- <span class="cstat-no" title="statement not covered" > workingDirectory: session.cwd ?? undefined,</span>
1008
- <span class="cstat-no" title="statement not covered" > sandboxMode: 'workspace-write',</span>
1009
- <span class="cstat-no" title="statement not covered" > approvalPolicy: 'never',</span>
1010
- <span class="cstat-no" title="statement not covered" > skipGitRepoCheck: true,</span>
1011
- <span class="cstat-no" title="statement not covered" > };</span>
1012
- <span class="cstat-no" title="statement not covered" >}</span>
1013
- &nbsp;
1014
- <span class="cstat-no" title="statement not covered" >function getOrCreateThread(session: Session): { codex: Codex; thread: Thread } {</span>
1015
- <span class="cstat-no" title="statement not covered" > const existing = threadMap.get(session.id);</span>
1016
- <span class="cstat-no" title="statement not covered" > if (existing) {</span>
1017
- <span class="cstat-no" title="statement not covered" > return { codex: existing.codex, thread: existing.thread };</span>
1018
- <span class="cstat-no" title="statement not covered" > }</span>
1019
- &nbsp;
1020
- <span class="cstat-no" title="statement not covered" > const codex = new Codex();</span>
1021
- <span class="cstat-no" title="statement not covered" > let thread: Thread;</span>
1022
- &nbsp;
1023
- <span class="cstat-no" title="statement not covered" > if (session.external_thread_id) {</span>
1024
- <span class="cstat-no" title="statement not covered" > thread = codex.resumeThread(session.external_thread_id, getThreadOptions(session));</span>
1025
- <span class="cstat-no" title="statement not covered" > } else {</span>
1026
- <span class="cstat-no" title="statement not covered" > thread = codex.startThread(getThreadOptions(session));</span>
1027
- <span class="cstat-no" title="statement not covered" > }</span>
1028
- &nbsp;
1029
- <span class="cstat-no" title="statement not covered" > return { codex, thread };</span>
1030
- <span class="cstat-no" title="statement not covered" >}</span>
1031
- &nbsp;
1032
- /** Start a Codex turn. Fire-and-forget — streams events via WS. */
1033
- <span class="cstat-no" title="statement not covered" >export async function startTurn(session: Session, turn: Turn): Promise&lt;void&gt; {</span>
1034
- <span class="cstat-no" title="statement not covered" > const db = getDb();</span>
1035
- &nbsp;
1036
- // Phase 1: create or resume thread
1037
- <span class="cstat-no" title="statement not covered" > let codex: Codex;</span>
1038
- <span class="cstat-no" title="statement not covered" > let thread: Thread;</span>
1039
- &nbsp;
1040
- <span class="cstat-no" title="statement not covered" > try {</span>
1041
- <span class="cstat-no" title="statement not covered" > const result = getOrCreateThread(session);</span>
1042
- <span class="cstat-no" title="statement not covered" > codex = result.codex;</span>
1043
- <span class="cstat-no" title="statement not covered" > thread = result.thread;</span>
1044
- <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
1045
- <span class="cstat-no" title="statement not covered" > const errMsg = `Failed to create Codex thread: ${(err as Error).message}`;</span>
1046
- <span class="cstat-no" title="statement not covered" > const now = new Date().toISOString();</span>
1047
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET status = ?, error = ?, updated_at = ? WHERE id = ?').run(</span>
1048
- <span class="cstat-no" title="statement not covered" > 'failed',</span>
1049
- <span class="cstat-no" title="statement not covered" > errMsg,</span>
1050
- <span class="cstat-no" title="statement not covered" > now,</span>
1051
- <span class="cstat-no" title="statement not covered" > turn.id,</span>
1052
- <span class="cstat-no" title="statement not covered" > );</span>
1053
- <span class="cstat-no" title="statement not covered" > setSessionStatus(db, session.id, 0, 'failed', now);</span>
1054
- <span class="cstat-no" title="statement not covered" > broadcast('turn:failed', { sessionId: session.id, turnId: turn.id, error: errMsg });</span>
1055
- <span class="cstat-no" title="statement not covered" > return;</span>
1056
- <span class="cstat-no" title="statement not covered" > }</span>
1057
- &nbsp;
1058
- // Phase 2: set up abort controller and update status
1059
- <span class="cstat-no" title="statement not covered" > const abortController = new AbortController();</span>
1060
- <span class="cstat-no" title="statement not covered" > threadMap.set(session.id, { codex, thread, abortController });</span>
1061
- &nbsp;
1062
- <span class="cstat-no" title="statement not covered" > const now = new Date().toISOString();</span>
1063
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET status = ?, updated_at = ? WHERE id = ?').run('running', now, turn.id);</span>
1064
- <span class="cstat-no" title="statement not covered" > setSessionStatus(db, session.id, 1, 'running', now);</span>
1065
- &nbsp;
1066
- <span class="cstat-no" title="statement not covered" > broadcast('turn:started', { sessionId: session.id, turnId: turn.id });</span>
1067
- &nbsp;
1068
- // Phase 3: run the turn and handle events
1069
- <span class="cstat-no" title="statement not covered" > try {</span>
1070
- <span class="cstat-no" title="statement not covered" > const { events } = await thread.runStreamed(turn.user_prompt, { signal: abortController.signal });</span>
1071
- &nbsp;
1072
- <span class="cstat-no" title="statement not covered" > for await (const event of events) {</span>
1073
- <span class="cstat-no" title="statement not covered" > handleEvent(event, session.id, turn.id);</span>
1074
- <span class="cstat-no" title="statement not covered" > }</span>
1075
- <span class="cstat-no" title="statement not covered" > } catch (err) {</span>
1076
- <span class="cstat-no" title="statement not covered" > const isAbort = abortController.signal.aborted || (err as Error).name === 'AbortError';</span>
1077
- <span class="cstat-no" title="statement not covered" > const errMsg = (err as Error).message;</span>
1078
- <span class="cstat-no" title="statement not covered" > const now2 = new Date().toISOString();</span>
1079
- &nbsp;
1080
- <span class="cstat-no" title="statement not covered" > if (isAbort) {</span>
1081
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET status = ?, updated_at = ? WHERE id = ?').run('aborted', now2, turn.id);</span>
1082
- <span class="cstat-no" title="statement not covered" > setSessionStatus(db, session.id, 0, 'active', now2);</span>
1083
- <span class="cstat-no" title="statement not covered" > broadcast('turn:cancelled', { sessionId: session.id, turnId: turn.id });</span>
1084
- <span class="cstat-no" title="statement not covered" > } else {</span>
1085
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET status = ?, error = ?, updated_at = ? WHERE id = ?').run(</span>
1086
- <span class="cstat-no" title="statement not covered" > 'failed',</span>
1087
- <span class="cstat-no" title="statement not covered" > errMsg,</span>
1088
- <span class="cstat-no" title="statement not covered" > now2,</span>
1089
- <span class="cstat-no" title="statement not covered" > turn.id,</span>
1090
- <span class="cstat-no" title="statement not covered" > );</span>
1091
- <span class="cstat-no" title="statement not covered" > setSessionStatus(db, session.id, 0, 'failed', now2);</span>
1092
- <span class="cstat-no" title="statement not covered" > broadcast('turn:failed', { sessionId: session.id, turnId: turn.id, error: errMsg });</span>
1093
- <span class="cstat-no" title="statement not covered" > }</span>
1094
- <span class="cstat-no" title="statement not covered" > } finally {</span>
1095
- <span class="cstat-no" title="statement not covered" > const entry = threadMap.get(session.id);</span>
1096
- <span class="cstat-no" title="statement not covered" > if (entry) {</span>
1097
- <span class="cstat-no" title="statement not covered" > threadMap.set(session.id, { ...entry, abortController: null });</span>
1098
- <span class="cstat-no" title="statement not covered" > }</span>
1099
- <span class="cstat-no" title="statement not covered" > }</span>
1100
- <span class="cstat-no" title="statement not covered" >}</span>
1101
- &nbsp;
1102
- /** Cancel a running turn by session ID. Returns true if a turn was cancelled. */
1103
- <span class="cstat-no" title="statement not covered" >export function interruptTurn(sessionId: string): boolean {</span>
1104
- <span class="cstat-no" title="statement not covered" > const entry = threadMap.get(sessionId);</span>
1105
- <span class="cstat-no" title="statement not covered" > if (entry?.abortController) {</span>
1106
- <span class="cstat-no" title="statement not covered" > entry.abortController.abort();</span>
1107
- <span class="cstat-no" title="statement not covered" > return true;</span>
1108
- <span class="cstat-no" title="statement not covered" > }</span>
1109
- <span class="cstat-no" title="statement not covered" > return false;</span>
1110
- <span class="cstat-no" title="statement not covered" >}</span>
1111
- &nbsp;
1112
- /** Remove a session's thread from the in-memory map. Used after rewind/branch. */
1113
- <span class="cstat-no" title="statement not covered" >export function clearThread(sessionId: string): void {</span>
1114
- <span class="cstat-no" title="statement not covered" > threadMap.delete(sessionId);</span>
1115
- <span class="cstat-no" title="statement not covered" >}</span>
1116
- &nbsp;
1117
- <span class="cstat-no" title="statement not covered" >function handleEvent(event: ThreadEvent, sessionId: string, turnId: string): void {</span>
1118
- <span class="cstat-no" title="statement not covered" > const db = getDb();</span>
1119
- <span class="cstat-no" title="statement not covered" > const now = new Date().toISOString();</span>
1120
- &nbsp;
1121
- <span class="cstat-no" title="statement not covered" > switch (event.type) {</span>
1122
- <span class="cstat-no" title="statement not covered" > case 'thread.started': {</span>
1123
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE sessions SET external_thread_id = ?, updated_at = ? WHERE id = ?').run(</span>
1124
- <span class="cstat-no" title="statement not covered" > event.thread_id,</span>
1125
- <span class="cstat-no" title="statement not covered" > now,</span>
1126
- <span class="cstat-no" title="statement not covered" > sessionId,</span>
1127
- <span class="cstat-no" title="statement not covered" > );</span>
1128
- <span class="cstat-no" title="statement not covered" > break;</span>
1129
- <span class="cstat-no" title="statement not covered" > }</span>
1130
- &nbsp;
1131
- <span class="cstat-no" title="statement not covered" > case 'turn.started': {</span>
1132
- // Already broadcasted turn:started before the stream started.
1133
- <span class="cstat-no" title="statement not covered" > break;</span>
1134
- <span class="cstat-no" title="statement not covered" > }</span>
1135
- &nbsp;
1136
- <span class="cstat-no" title="statement not covered" > case 'item.started': {</span>
1137
- <span class="cstat-no" title="statement not covered" > const item = event.item;</span>
1138
- <span class="cstat-no" title="statement not covered" > const itemId = uuidv4();</span>
1139
- <span class="cstat-no" title="statement not covered" > const data = mapItemData(item);</span>
1140
- <span class="cstat-no" title="statement not covered" > insertItem(db, itemId, turnId, item, data, 'in_progress', now);</span>
1141
- <span class="cstat-no" title="statement not covered" > broadcast('item:started', { sessionId, turnId, item: makeItem(itemId, turnId, item, 'in_progress', now, now) });</span>
1142
- <span class="cstat-no" title="statement not covered" > break;</span>
1143
- <span class="cstat-no" title="statement not covered" > }</span>
1144
- &nbsp;
1145
- <span class="cstat-no" title="statement not covered" > case 'item.updated': {</span>
1146
- <span class="cstat-no" title="statement not covered" > const item = event.item;</span>
1147
- <span class="cstat-no" title="statement not covered" > const data = mapItemData(item);</span>
1148
- <span class="cstat-no" title="statement not covered" > const result = db</span>
1149
- <span class="cstat-no" title="statement not covered" > .prepare('UPDATE items SET data = ?, updated_at = ? WHERE external_item_id = ? AND turn_id = ?')</span>
1150
- <span class="cstat-no" title="statement not covered" > .run(JSON.stringify(data), now, item.id, turnId);</span>
1151
- &nbsp;
1152
- // SDK may skip item.started — insert if missing
1153
- <span class="cstat-no" title="statement not covered" > if (result.changes === 0) {</span>
1154
- <span class="cstat-no" title="statement not covered" > const itemId = uuidv4();</span>
1155
- <span class="cstat-no" title="statement not covered" > insertItem(db, itemId, turnId, item, data, 'in_progress', now);</span>
1156
- <span class="cstat-no" title="statement not covered" > broadcast('item:updated', { sessionId, turnId, item: makeItem(itemId, turnId, item, 'in_progress', now, now) });</span>
1157
- <span class="cstat-no" title="statement not covered" > } else {</span>
1158
- <span class="cstat-no" title="statement not covered" > const row = db</span>
1159
- <span class="cstat-no" title="statement not covered" > .prepare('SELECT id, status, created_at FROM items WHERE external_item_id = ? AND turn_id = ?')</span>
1160
- <span class="cstat-no" title="statement not covered" > .get(item.id, turnId) as { id: string; status: ItemStatus; created_at: string } | undefined;</span>
1161
- <span class="cstat-no" title="statement not covered" > if (row) {</span>
1162
- <span class="cstat-no" title="statement not covered" > broadcast('item:updated', {</span>
1163
- <span class="cstat-no" title="statement not covered" > sessionId,</span>
1164
- <span class="cstat-no" title="statement not covered" > turnId,</span>
1165
- <span class="cstat-no" title="statement not covered" > item: makeItem(row.id, turnId, item, row.status, row.created_at, now),</span>
1166
- <span class="cstat-no" title="statement not covered" > });</span>
1167
- <span class="cstat-no" title="statement not covered" > }</span>
1168
- <span class="cstat-no" title="statement not covered" > }</span>
1169
- <span class="cstat-no" title="statement not covered" > break;</span>
1170
- <span class="cstat-no" title="statement not covered" > }</span>
1171
- &nbsp;
1172
- <span class="cstat-no" title="statement not covered" > case 'item.completed': {</span>
1173
- <span class="cstat-no" title="statement not covered" > const item = event.item;</span>
1174
- <span class="cstat-no" title="statement not covered" > const status = getItemStatus(item);</span>
1175
- <span class="cstat-no" title="statement not covered" > const data = mapItemData(item);</span>
1176
- <span class="cstat-no" title="statement not covered" > const result = db</span>
1177
- <span class="cstat-no" title="statement not covered" > .prepare('UPDATE items SET data = ?, status = ?, updated_at = ? WHERE external_item_id = ? AND turn_id = ?')</span>
1178
- <span class="cstat-no" title="statement not covered" > .run(JSON.stringify(data), status, now, item.id, turnId);</span>
1179
- &nbsp;
1180
- // SDK may skip item.started — insert if missing
1181
- <span class="cstat-no" title="statement not covered" > let itemId: string;</span>
1182
- <span class="cstat-no" title="statement not covered" > let createdAt: string;</span>
1183
- <span class="cstat-no" title="statement not covered" > if (result.changes === 0) {</span>
1184
- <span class="cstat-no" title="statement not covered" > itemId = uuidv4();</span>
1185
- <span class="cstat-no" title="statement not covered" > createdAt = now;</span>
1186
- <span class="cstat-no" title="statement not covered" > insertItem(db, itemId, turnId, item, data, status, now);</span>
1187
- <span class="cstat-no" title="statement not covered" > } else {</span>
1188
- <span class="cstat-no" title="statement not covered" > const row = db</span>
1189
- <span class="cstat-no" title="statement not covered" > .prepare('SELECT id, created_at FROM items WHERE external_item_id = ? AND turn_id = ?')</span>
1190
- <span class="cstat-no" title="statement not covered" > .get(item.id, turnId) as { id: string; created_at: string };</span>
1191
- <span class="cstat-no" title="statement not covered" > itemId = row.id;</span>
1192
- <span class="cstat-no" title="statement not covered" > createdAt = row.created_at;</span>
1193
- <span class="cstat-no" title="statement not covered" > }</span>
1194
- &nbsp;
1195
- // Update turn-level fields
1196
- <span class="cstat-no" title="statement not covered" > if (item.type === 'agent_message') {</span>
1197
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET agent_response = ?, updated_at = ? WHERE id = ?').run(item.text, now, turnId);</span>
1198
- <span class="cstat-no" title="statement not covered" > }</span>
1199
- <span class="cstat-no" title="statement not covered" > if (item.type === 'reasoning') {</span>
1200
- <span class="cstat-no" title="statement not covered" > const existing = db.prepare('SELECT thoughts FROM turns WHERE id = ?').get(turnId) as {</span>
1201
- thoughts: string | null;
1202
- };
1203
- <span class="cstat-no" title="statement not covered" > const thoughts = existing.thoughts ? existing.thoughts + '\n' + item.text : item.text;</span>
1204
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET thoughts = ?, updated_at = ? WHERE id = ?').run(thoughts, now, turnId);</span>
1205
- <span class="cstat-no" title="statement not covered" > }</span>
1206
- &nbsp;
1207
- <span class="cstat-no" title="statement not covered" > broadcast('item:completed', { sessionId, turnId, item: makeItem(itemId, turnId, item, status, createdAt, now) });</span>
1208
- <span class="cstat-no" title="statement not covered" > break;</span>
1209
- <span class="cstat-no" title="statement not covered" > }</span>
1210
- &nbsp;
1211
- <span class="cstat-no" title="statement not covered" > case 'turn.completed': {</span>
1212
- <span class="cstat-no" title="statement not covered" > const usage = event.usage;</span>
1213
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET status = ?, token_usage = ?, updated_at = ? WHERE id = ?').run(</span>
1214
- <span class="cstat-no" title="statement not covered" > 'completed',</span>
1215
- <span class="cstat-no" title="statement not covered" > JSON.stringify(usage),</span>
1216
- <span class="cstat-no" title="statement not covered" > now,</span>
1217
- <span class="cstat-no" title="statement not covered" > turnId,</span>
1218
- <span class="cstat-no" title="statement not covered" > );</span>
1219
- <span class="cstat-no" title="statement not covered" > setSessionStatus(db, sessionId, 0, 'active', now, true);</span>
1220
- <span class="cstat-no" title="statement not covered" > broadcast('turn:completed', { sessionId, turnId, usage, hasUnreviewed: true });</span>
1221
- &nbsp;
1222
- // Auto-generate session title from first turn (if title is still null)
1223
- <span class="cstat-no" title="statement not covered" > syncThreadTitle(sessionId);</span>
1224
- <span class="cstat-no" title="statement not covered" > break;</span>
1225
- <span class="cstat-no" title="statement not covered" > }</span>
1226
- &nbsp;
1227
- <span class="cstat-no" title="statement not covered" > case 'turn.failed': {</span>
1228
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET status = ?, error = ?, updated_at = ? WHERE id = ?').run(</span>
1229
- <span class="cstat-no" title="statement not covered" > 'failed',</span>
1230
- <span class="cstat-no" title="statement not covered" > event.error.message,</span>
1231
- <span class="cstat-no" title="statement not covered" > now,</span>
1232
- <span class="cstat-no" title="statement not covered" > turnId,</span>
1233
- <span class="cstat-no" title="statement not covered" > );</span>
1234
- <span class="cstat-no" title="statement not covered" > setSessionStatus(db, sessionId, 0, 'failed', now);</span>
1235
- <span class="cstat-no" title="statement not covered" > broadcast('turn:failed', { sessionId, turnId, error: event.error.message });</span>
1236
- <span class="cstat-no" title="statement not covered" > break;</span>
1237
- <span class="cstat-no" title="statement not covered" > }</span>
1238
- &nbsp;
1239
- <span class="cstat-no" title="statement not covered" > case 'error': {</span>
1240
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE turns SET status = ?, error = ?, updated_at = ? WHERE id = ?').run(</span>
1241
- <span class="cstat-no" title="statement not covered" > 'failed',</span>
1242
- <span class="cstat-no" title="statement not covered" > event.message,</span>
1243
- <span class="cstat-no" title="statement not covered" > now,</span>
1244
- <span class="cstat-no" title="statement not covered" > turnId,</span>
1245
- <span class="cstat-no" title="statement not covered" > );</span>
1246
- <span class="cstat-no" title="statement not covered" > setSessionStatus(db, sessionId, 0, 'failed', now);</span>
1247
- <span class="cstat-no" title="statement not covered" > broadcast('turn:failed', { sessionId, turnId, error: event.message });</span>
1248
- <span class="cstat-no" title="statement not covered" > break;</span>
1249
- <span class="cstat-no" title="statement not covered" > }</span>
1250
- <span class="cstat-no" title="statement not covered" > }</span>
1251
- <span class="cstat-no" title="statement not covered" >}</span>
1252
- &nbsp;
1253
- <span class="cstat-no" title="statement not covered" >function makeItem(</span>
1254
- <span class="cstat-no" title="statement not covered" > id: string,</span>
1255
- <span class="cstat-no" title="statement not covered" > turnId: string,</span>
1256
- <span class="cstat-no" title="statement not covered" > sdkItem: ThreadItem,</span>
1257
- <span class="cstat-no" title="statement not covered" > status: ItemStatus,</span>
1258
- <span class="cstat-no" title="statement not covered" > createdAt: string,</span>
1259
- <span class="cstat-no" title="statement not covered" > updatedAt: string,</span>
1260
- <span class="cstat-no" title="statement not covered" >): Item {</span>
1261
- <span class="cstat-no" title="statement not covered" > return {</span>
1262
- <span class="cstat-no" title="statement not covered" > id,</span>
1263
- <span class="cstat-no" title="statement not covered" > turn_id: turnId,</span>
1264
- <span class="cstat-no" title="statement not covered" > external_item_id: sdkItem.id,</span>
1265
- <span class="cstat-no" title="statement not covered" > type: sdkItem.type,</span>
1266
- <span class="cstat-no" title="statement not covered" > data: mapItemData(sdkItem),</span>
1267
- <span class="cstat-no" title="statement not covered" > status,</span>
1268
- <span class="cstat-no" title="statement not covered" > created_at: createdAt,</span>
1269
- <span class="cstat-no" title="statement not covered" > updated_at: updatedAt,</span>
1270
- <span class="cstat-no" title="statement not covered" > };</span>
1271
- <span class="cstat-no" title="statement not covered" >}</span>
1272
- &nbsp;
1273
- /** Tracks sessions currently generating titles — prevents duplicate throwaway threads. */
1274
- <span class="cstat-no" title="statement not covered" >const titleGenerating = new Set&lt;string&gt;();</span>
1275
- &nbsp;
1276
- /** Generate a title for the session using a throwaway Codex thread.
1277
- * Only runs once per session — guarded by title === null AND titleGenerating set. */
1278
- <span class="cstat-no" title="statement not covered" >function syncThreadTitle(sessionId: string): void {</span>
1279
- <span class="cstat-no" title="statement not covered" > const db = getDb();</span>
1280
- <span class="cstat-no" title="statement not covered" > const session = db.prepare('SELECT title FROM sessions WHERE id = ?').get(sessionId) as</span>
1281
- { title: string | null } | undefined;
1282
- <span class="cstat-no" title="statement not covered" > if (!session || session.title !== null) return; // Already has a title</span>
1283
- <span class="cstat-no" title="statement not covered" > if (titleGenerating.has(sessionId)) return; // Already generating</span>
1284
- &nbsp;
1285
- // Get the first turn's user_prompt and agent_response
1286
- <span class="cstat-no" title="statement not covered" > const turn = db</span>
1287
- <span class="cstat-no" title="statement not covered" > .prepare('SELECT user_prompt, agent_response FROM turns WHERE session_id = ? ORDER BY created_at ASC LIMIT 1')</span>
1288
- <span class="cstat-no" title="statement not covered" > .get(sessionId) as { user_prompt: string; agent_response: string | null } | undefined;</span>
1289
- <span class="cstat-no" title="statement not covered" > if (!turn) return;</span>
1290
- &nbsp;
1291
- // Mark as generating — prevents concurrent title generation for same session
1292
- <span class="cstat-no" title="statement not covered" > titleGenerating.add(sessionId);</span>
1293
- &nbsp;
1294
- // Fire-and-forget — don't block the turn:completed handler
1295
- <span class="cstat-no" title="statement not covered" > generateTitleAsync(sessionId, turn.user_prompt, turn.agent_response).finally(() =&gt; {</span>
1296
- <span class="cstat-no" title="statement not covered" > titleGenerating.delete(sessionId);</span>
1297
- <span class="cstat-no" title="statement not covered" > });</span>
1298
- <span class="cstat-no" title="statement not covered" >}</span>
1299
- &nbsp;
1300
- /** Create a throwaway Codex thread, ask for a title, update the session, then clean up. */
1301
- <span class="cstat-no" title="statement not covered" >async function generateTitleAsync(sessionId: string, userPrompt: string, agentResponse: string | null): Promise&lt;void&gt; {</span>
1302
- <span class="cstat-no" title="statement not covered" > let throwawayThreadId: string | null = null;</span>
1303
- <span class="cstat-no" title="statement not covered" > try {</span>
1304
- <span class="cstat-no" title="statement not covered" > const codex = new Codex();</span>
1305
- <span class="cstat-no" title="statement not covered" > const thread = codex.startThread({ skipGitRepoCheck: true });</span>
1306
- <span class="cstat-no" title="statement not covered" > throwawayThreadId = thread.id;</span>
1307
- &nbsp;
1308
- <span class="cstat-no" title="statement not covered" > const truncatedPrompt = userPrompt.slice(0, 500);</span>
1309
- <span class="cstat-no" title="statement not covered" > const truncatedResponse = (agentResponse || '').slice(0, 500);</span>
1310
- &nbsp;
1311
- <span class="cstat-no" title="statement not covered" > const titlePrompt = `Generate a concise 3-5 word title for this conversation. Reply with only the title, nothing else.\n\nUser asked: "${truncatedPrompt}"\n\nAgent responded: "${truncatedResponse}"`;</span>
1312
- &nbsp;
1313
- <span class="cstat-no" title="statement not covered" > const result = await thread.run(titlePrompt);</span>
1314
- <span class="cstat-no" title="statement not covered" > const title = result.finalResponse</span>
1315
- <span class="cstat-no" title="statement not covered" > .trim()</span>
1316
- <span class="cstat-no" title="statement not covered" > .replace(/^["']|["']$/g, '')</span>
1317
- <span class="cstat-no" title="statement not covered" > .slice(0, 100);</span>
1318
- &nbsp;
1319
- <span class="cstat-no" title="statement not covered" > if (title) {</span>
1320
- <span class="cstat-no" title="statement not covered" > const db = getDb();</span>
1321
- <span class="cstat-no" title="statement not covered" > const now = new Date().toISOString();</span>
1322
- <span class="cstat-no" title="statement not covered" > db.prepare('UPDATE sessions SET title = ?, updated_at = ? WHERE id = ?').run(title, now, sessionId);</span>
1323
- <span class="cstat-no" title="statement not covered" > broadcast('session:title', { sessionId, title });</span>
1324
- <span class="cstat-no" title="statement not covered" > }</span>
1325
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1326
- // Silently skip on error — session keeps null title
1327
- <span class="cstat-no" title="statement not covered" > } finally {</span>
1328
- // Clean up the throwaway thread
1329
- <span class="cstat-no" title="statement not covered" > if (throwawayThreadId) {</span>
1330
- <span class="cstat-no" title="statement not covered" > cleanupThrowawayThread(throwawayThreadId);</span>
1331
- <span class="cstat-no" title="statement not covered" > }</span>
1332
- <span class="cstat-no" title="statement not covered" > }</span>
1333
- <span class="cstat-no" title="statement not covered" >}</span>
1334
- &nbsp;
1335
- /** Delete throwaway thread from Codex state DB, rollout file, and session_index.jsonl. */
1336
- <span class="cstat-no" title="statement not covered" >function cleanupThrowawayThread(threadId: string): void {</span>
1337
- <span class="cstat-no" title="statement not covered" > const home = process.env.HOME || process.env.USERPROFILE || '';</span>
1338
- &nbsp;
1339
- // 1. Delete from state DB and get rollout path
1340
- <span class="cstat-no" title="statement not covered" > try {</span>
1341
- <span class="cstat-no" title="statement not covered" > const codexDb = new Database(`${home}/.codex/state_5.sqlite`);</span>
1342
- <span class="cstat-no" title="statement not covered" > const row = codexDb.prepare('SELECT rollout_path FROM threads WHERE id = ?').get(threadId) as</span>
1343
- { rollout_path: string } | undefined;
1344
- &nbsp;
1345
- <span class="cstat-no" title="statement not covered" > codexDb</span>
1346
- <span class="cstat-no" title="statement not covered" > .prepare('DELETE FROM thread_spawn_edges WHERE child_thread_id = ? OR parent_thread_id = ?')</span>
1347
- <span class="cstat-no" title="statement not covered" > .run(threadId, threadId);</span>
1348
- <span class="cstat-no" title="statement not covered" > codexDb.prepare('DELETE FROM threads WHERE id = ?').run(threadId);</span>
1349
- <span class="cstat-no" title="statement not covered" > codexDb.close();</span>
1350
- &nbsp;
1351
- // 2. Delete rollout file
1352
- <span class="cstat-no" title="statement not covered" > if (row?.rollout_path) {</span>
1353
- <span class="cstat-no" title="statement not covered" > try {</span>
1354
- <span class="cstat-no" title="statement not covered" > unlinkSync(row.rollout_path);</span>
1355
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1356
- /* file may not exist */
1357
- <span class="cstat-no" title="statement not covered" > }</span>
1358
- <span class="cstat-no" title="statement not covered" > }</span>
1359
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1360
- // DB not found — skip
1361
- <span class="cstat-no" title="statement not covered" > }</span>
1362
- &nbsp;
1363
- // 3. Remove from session_index.jsonl
1364
- <span class="cstat-no" title="statement not covered" > try {</span>
1365
- <span class="cstat-no" title="statement not covered" > const indexPath = `${home}/.codex/session_index.jsonl`;</span>
1366
- <span class="cstat-no" title="statement not covered" > const content = readFileSync(indexPath, 'utf-8');</span>
1367
- <span class="cstat-no" title="statement not covered" > const lines = content</span>
1368
- <span class="cstat-no" title="statement not covered" > .trim()</span>
1369
- <span class="cstat-no" title="statement not covered" > .split('\n')</span>
1370
- <span class="cstat-no" title="statement not covered" > .filter((line) =&gt; {</span>
1371
- <span class="cstat-no" title="statement not covered" > try {</span>
1372
- <span class="cstat-no" title="statement not covered" > const entry = JSON.parse(line) as { id: string };</span>
1373
- <span class="cstat-no" title="statement not covered" > return entry.id !== threadId;</span>
1374
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1375
- <span class="cstat-no" title="statement not covered" > return true; // keep unparseable lines</span>
1376
- <span class="cstat-no" title="statement not covered" > }</span>
1377
- <span class="cstat-no" title="statement not covered" > });</span>
1378
- <span class="cstat-no" title="statement not covered" > writeFileSync(indexPath, lines.join('\n') + '\n');</span>
1379
- <span class="cstat-no" title="statement not covered" > } catch {</span>
1380
- // File not found — skip
1381
- <span class="cstat-no" title="statement not covered" > }</span>
1382
- <span class="cstat-no" title="statement not covered" >}</span>
1383
- &nbsp;</pre></td></tr></table></pre>
1384
-
1385
- <div class='push'></div><!-- for sticky footer -->
1386
- </div><!-- /wrapper -->
1387
- <div class='footer quiet pad2 space-top1 center small'>
1388
- Code coverage generated by
1389
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1390
- at 2026-08-15T06:50:35.719Z
1391
- </div>
1392
- <script src="../../prettify.js"></script>
1393
- <script>
1394
- window.onload = function () {
1395
- prettyPrint();
1396
- };
1397
- </script>
1398
- <script src="../../sorter.js"></script>
1399
- <script src="../../block-navigation.js"></script>
1400
- </body>
1401
- </html>
1402
-