@northflare/runner 0.0.11 → 0.0.13

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 (81) hide show
  1. package/dist/utils/config.d.ts +1 -0
  2. package/dist/utils/config.d.ts.map +1 -1
  3. package/dist/utils/config.js +13 -2
  4. package/dist/utils/config.js.map +1 -1
  5. package/package.json +1 -2
  6. package/coverage/base.css +0 -224
  7. package/coverage/block-navigation.js +0 -87
  8. package/coverage/coverage-final.json +0 -12
  9. package/coverage/favicon.png +0 -0
  10. package/coverage/index.html +0 -176
  11. package/coverage/lib/index.html +0 -116
  12. package/coverage/lib/preload-script.js.html +0 -964
  13. package/coverage/prettify.css +0 -1
  14. package/coverage/prettify.js +0 -2
  15. package/coverage/sort-arrow-sprite.png +0 -0
  16. package/coverage/sorter.js +0 -196
  17. package/coverage/src/collections/index.html +0 -116
  18. package/coverage/src/collections/runner-messages.ts.html +0 -312
  19. package/coverage/src/components/claude-manager.ts.html +0 -1290
  20. package/coverage/src/components/index.html +0 -146
  21. package/coverage/src/components/message-handler.ts.html +0 -730
  22. package/coverage/src/components/repository-manager.ts.html +0 -841
  23. package/coverage/src/index.html +0 -131
  24. package/coverage/src/index.ts.html +0 -448
  25. package/coverage/src/runner.ts.html +0 -1239
  26. package/coverage/src/utils/config.ts.html +0 -780
  27. package/coverage/src/utils/console.ts.html +0 -121
  28. package/coverage/src/utils/index.html +0 -161
  29. package/coverage/src/utils/logger.ts.html +0 -475
  30. package/coverage/src/utils/status-line.ts.html +0 -445
  31. package/exceptions.log +0 -24
  32. package/lib/codex-sdk/src/codex.ts +0 -38
  33. package/lib/codex-sdk/src/codexOptions.ts +0 -10
  34. package/lib/codex-sdk/src/events.ts +0 -80
  35. package/lib/codex-sdk/src/exec.ts +0 -336
  36. package/lib/codex-sdk/src/index.ts +0 -39
  37. package/lib/codex-sdk/src/items.ts +0 -127
  38. package/lib/codex-sdk/src/outputSchemaFile.ts +0 -40
  39. package/lib/codex-sdk/src/thread.ts +0 -155
  40. package/lib/codex-sdk/src/threadOptions.ts +0 -18
  41. package/lib/codex-sdk/src/turnOptions.ts +0 -6
  42. package/lib/codex-sdk/tests/abort.test.ts +0 -165
  43. package/lib/codex-sdk/tests/codexExecSpy.ts +0 -37
  44. package/lib/codex-sdk/tests/responsesProxy.ts +0 -225
  45. package/lib/codex-sdk/tests/run.test.ts +0 -687
  46. package/lib/codex-sdk/tests/runStreamed.test.ts +0 -211
  47. package/lib/codex-sdk/tsconfig.json +0 -24
  48. package/rejections.log +0 -68
  49. package/runner.log +0 -488
  50. package/src/components/claude-sdk-manager.ts +0 -1425
  51. package/src/components/codex-sdk-manager.ts +0 -1358
  52. package/src/components/enhanced-repository-manager.ts +0 -823
  53. package/src/components/message-handler-sse.ts +0 -1097
  54. package/src/components/repository-manager.ts +0 -337
  55. package/src/index.ts +0 -168
  56. package/src/runner-sse.ts +0 -917
  57. package/src/services/RunnerAPIClient.ts +0 -175
  58. package/src/services/SSEClient.ts +0 -258
  59. package/src/types/claude.ts +0 -66
  60. package/src/types/computer-name.d.ts +0 -4
  61. package/src/types/index.ts +0 -64
  62. package/src/types/messages.ts +0 -39
  63. package/src/types/runner-interface.ts +0 -36
  64. package/src/utils/StateManager.ts +0 -187
  65. package/src/utils/config.ts +0 -316
  66. package/src/utils/console.ts +0 -15
  67. package/src/utils/debug.ts +0 -18
  68. package/src/utils/expand-env.ts +0 -22
  69. package/src/utils/logger.ts +0 -134
  70. package/src/utils/model.ts +0 -29
  71. package/src/utils/status-line.ts +0 -122
  72. package/src/utils/tool-response-sanitizer.ts +0 -160
  73. package/test-debug.sh +0 -26
  74. package/tests/retry-strategies.test.ts +0 -410
  75. package/tests/sdk-integration.test.ts +0 -329
  76. package/tests/sdk-streaming.test.ts +0 -1180
  77. package/tests/setup.ts +0 -5
  78. package/tests/test-claude-manager.ts +0 -120
  79. package/tests/tool-response-sanitizer.test.ts +0 -63
  80. package/tsconfig.json +0 -36
  81. package/vitest.config.ts +0 -27
@@ -1,1239 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <title>Code coverage report for src/runner.ts</title>
5
- <meta charset="utf-8" />
6
- <link rel="stylesheet" href="../prettify.css" />
7
- <link rel="stylesheet" href="../base.css" />
8
- <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
9
- <meta name="viewport" content="width=device-width, initial-scale=1" />
10
- <style type="text/css">
11
- .coverage-summary .sorter {
12
- background-image: url(../sort-arrow-sprite.png);
13
- }
14
- </style>
15
- </head>
16
-
17
- <body>
18
- <div class="wrapper">
19
- <div class="pad1">
20
- <h1>
21
- <a href="../index.html">All files</a> /
22
- <a href="index.html">src</a> runner.ts
23
- </h1>
24
- <div class="clearfix">
25
- <div class="fl pad1y space-right2">
26
- <span class="strong">66.75% </span>
27
- <span class="quiet">Statements</span>
28
- <span class="fraction">257/385</span>
29
- </div>
30
-
31
- <div class="fl pad1y space-right2">
32
- <span class="strong">76.59% </span>
33
- <span class="quiet">Branches</span>
34
- <span class="fraction">36/47</span>
35
- </div>
36
-
37
- <div class="fl pad1y space-right2">
38
- <span class="strong">60% </span>
39
- <span class="quiet">Functions</span>
40
- <span class="fraction">12/20</span>
41
- </div>
42
-
43
- <div class="fl pad1y space-right2">
44
- <span class="strong">66.75% </span>
45
- <span class="quiet">Lines</span>
46
- <span class="fraction">257/385</span>
47
- </div>
48
- </div>
49
- <p class="quiet">
50
- Press <em>n</em> or <em>j</em> to go to the next uncovered block,
51
- <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
52
- </p>
53
- <template id="filterTemplate">
54
- <div class="quiet">
55
- Filter:
56
- <input type="search" id="fileSearch" />
57
- </div>
58
- </template>
59
- </div>
60
- <div class="status-line medium"></div>
61
- <pre><table class="coverage">
62
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
63
- <a name='L2'></a><a href='#L2'>2</a>
64
- <a name='L3'></a><a href='#L3'>3</a>
65
- <a name='L4'></a><a href='#L4'>4</a>
66
- <a name='L5'></a><a href='#L5'>5</a>
67
- <a name='L6'></a><a href='#L6'>6</a>
68
- <a name='L7'></a><a href='#L7'>7</a>
69
- <a name='L8'></a><a href='#L8'>8</a>
70
- <a name='L9'></a><a href='#L9'>9</a>
71
- <a name='L10'></a><a href='#L10'>10</a>
72
- <a name='L11'></a><a href='#L11'>11</a>
73
- <a name='L12'></a><a href='#L12'>12</a>
74
- <a name='L13'></a><a href='#L13'>13</a>
75
- <a name='L14'></a><a href='#L14'>14</a>
76
- <a name='L15'></a><a href='#L15'>15</a>
77
- <a name='L16'></a><a href='#L16'>16</a>
78
- <a name='L17'></a><a href='#L17'>17</a>
79
- <a name='L18'></a><a href='#L18'>18</a>
80
- <a name='L19'></a><a href='#L19'>19</a>
81
- <a name='L20'></a><a href='#L20'>20</a>
82
- <a name='L21'></a><a href='#L21'>21</a>
83
- <a name='L22'></a><a href='#L22'>22</a>
84
- <a name='L23'></a><a href='#L23'>23</a>
85
- <a name='L24'></a><a href='#L24'>24</a>
86
- <a name='L25'></a><a href='#L25'>25</a>
87
- <a name='L26'></a><a href='#L26'>26</a>
88
- <a name='L27'></a><a href='#L27'>27</a>
89
- <a name='L28'></a><a href='#L28'>28</a>
90
- <a name='L29'></a><a href='#L29'>29</a>
91
- <a name='L30'></a><a href='#L30'>30</a>
92
- <a name='L31'></a><a href='#L31'>31</a>
93
- <a name='L32'></a><a href='#L32'>32</a>
94
- <a name='L33'></a><a href='#L33'>33</a>
95
- <a name='L34'></a><a href='#L34'>34</a>
96
- <a name='L35'></a><a href='#L35'>35</a>
97
- <a name='L36'></a><a href='#L36'>36</a>
98
- <a name='L37'></a><a href='#L37'>37</a>
99
- <a name='L38'></a><a href='#L38'>38</a>
100
- <a name='L39'></a><a href='#L39'>39</a>
101
- <a name='L40'></a><a href='#L40'>40</a>
102
- <a name='L41'></a><a href='#L41'>41</a>
103
- <a name='L42'></a><a href='#L42'>42</a>
104
- <a name='L43'></a><a href='#L43'>43</a>
105
- <a name='L44'></a><a href='#L44'>44</a>
106
- <a name='L45'></a><a href='#L45'>45</a>
107
- <a name='L46'></a><a href='#L46'>46</a>
108
- <a name='L47'></a><a href='#L47'>47</a>
109
- <a name='L48'></a><a href='#L48'>48</a>
110
- <a name='L49'></a><a href='#L49'>49</a>
111
- <a name='L50'></a><a href='#L50'>50</a>
112
- <a name='L51'></a><a href='#L51'>51</a>
113
- <a name='L52'></a><a href='#L52'>52</a>
114
- <a name='L53'></a><a href='#L53'>53</a>
115
- <a name='L54'></a><a href='#L54'>54</a>
116
- <a name='L55'></a><a href='#L55'>55</a>
117
- <a name='L56'></a><a href='#L56'>56</a>
118
- <a name='L57'></a><a href='#L57'>57</a>
119
- <a name='L58'></a><a href='#L58'>58</a>
120
- <a name='L59'></a><a href='#L59'>59</a>
121
- <a name='L60'></a><a href='#L60'>60</a>
122
- <a name='L61'></a><a href='#L61'>61</a>
123
- <a name='L62'></a><a href='#L62'>62</a>
124
- <a name='L63'></a><a href='#L63'>63</a>
125
- <a name='L64'></a><a href='#L64'>64</a>
126
- <a name='L65'></a><a href='#L65'>65</a>
127
- <a name='L66'></a><a href='#L66'>66</a>
128
- <a name='L67'></a><a href='#L67'>67</a>
129
- <a name='L68'></a><a href='#L68'>68</a>
130
- <a name='L69'></a><a href='#L69'>69</a>
131
- <a name='L70'></a><a href='#L70'>70</a>
132
- <a name='L71'></a><a href='#L71'>71</a>
133
- <a name='L72'></a><a href='#L72'>72</a>
134
- <a name='L73'></a><a href='#L73'>73</a>
135
- <a name='L74'></a><a href='#L74'>74</a>
136
- <a name='L75'></a><a href='#L75'>75</a>
137
- <a name='L76'></a><a href='#L76'>76</a>
138
- <a name='L77'></a><a href='#L77'>77</a>
139
- <a name='L78'></a><a href='#L78'>78</a>
140
- <a name='L79'></a><a href='#L79'>79</a>
141
- <a name='L80'></a><a href='#L80'>80</a>
142
- <a name='L81'></a><a href='#L81'>81</a>
143
- <a name='L82'></a><a href='#L82'>82</a>
144
- <a name='L83'></a><a href='#L83'>83</a>
145
- <a name='L84'></a><a href='#L84'>84</a>
146
- <a name='L85'></a><a href='#L85'>85</a>
147
- <a name='L86'></a><a href='#L86'>86</a>
148
- <a name='L87'></a><a href='#L87'>87</a>
149
- <a name='L88'></a><a href='#L88'>88</a>
150
- <a name='L89'></a><a href='#L89'>89</a>
151
- <a name='L90'></a><a href='#L90'>90</a>
152
- <a name='L91'></a><a href='#L91'>91</a>
153
- <a name='L92'></a><a href='#L92'>92</a>
154
- <a name='L93'></a><a href='#L93'>93</a>
155
- <a name='L94'></a><a href='#L94'>94</a>
156
- <a name='L95'></a><a href='#L95'>95</a>
157
- <a name='L96'></a><a href='#L96'>96</a>
158
- <a name='L97'></a><a href='#L97'>97</a>
159
- <a name='L98'></a><a href='#L98'>98</a>
160
- <a name='L99'></a><a href='#L99'>99</a>
161
- <a name='L100'></a><a href='#L100'>100</a>
162
- <a name='L101'></a><a href='#L101'>101</a>
163
- <a name='L102'></a><a href='#L102'>102</a>
164
- <a name='L103'></a><a href='#L103'>103</a>
165
- <a name='L104'></a><a href='#L104'>104</a>
166
- <a name='L105'></a><a href='#L105'>105</a>
167
- <a name='L106'></a><a href='#L106'>106</a>
168
- <a name='L107'></a><a href='#L107'>107</a>
169
- <a name='L108'></a><a href='#L108'>108</a>
170
- <a name='L109'></a><a href='#L109'>109</a>
171
- <a name='L110'></a><a href='#L110'>110</a>
172
- <a name='L111'></a><a href='#L111'>111</a>
173
- <a name='L112'></a><a href='#L112'>112</a>
174
- <a name='L113'></a><a href='#L113'>113</a>
175
- <a name='L114'></a><a href='#L114'>114</a>
176
- <a name='L115'></a><a href='#L115'>115</a>
177
- <a name='L116'></a><a href='#L116'>116</a>
178
- <a name='L117'></a><a href='#L117'>117</a>
179
- <a name='L118'></a><a href='#L118'>118</a>
180
- <a name='L119'></a><a href='#L119'>119</a>
181
- <a name='L120'></a><a href='#L120'>120</a>
182
- <a name='L121'></a><a href='#L121'>121</a>
183
- <a name='L122'></a><a href='#L122'>122</a>
184
- <a name='L123'></a><a href='#L123'>123</a>
185
- <a name='L124'></a><a href='#L124'>124</a>
186
- <a name='L125'></a><a href='#L125'>125</a>
187
- <a name='L126'></a><a href='#L126'>126</a>
188
- <a name='L127'></a><a href='#L127'>127</a>
189
- <a name='L128'></a><a href='#L128'>128</a>
190
- <a name='L129'></a><a href='#L129'>129</a>
191
- <a name='L130'></a><a href='#L130'>130</a>
192
- <a name='L131'></a><a href='#L131'>131</a>
193
- <a name='L132'></a><a href='#L132'>132</a>
194
- <a name='L133'></a><a href='#L133'>133</a>
195
- <a name='L134'></a><a href='#L134'>134</a>
196
- <a name='L135'></a><a href='#L135'>135</a>
197
- <a name='L136'></a><a href='#L136'>136</a>
198
- <a name='L137'></a><a href='#L137'>137</a>
199
- <a name='L138'></a><a href='#L138'>138</a>
200
- <a name='L139'></a><a href='#L139'>139</a>
201
- <a name='L140'></a><a href='#L140'>140</a>
202
- <a name='L141'></a><a href='#L141'>141</a>
203
- <a name='L142'></a><a href='#L142'>142</a>
204
- <a name='L143'></a><a href='#L143'>143</a>
205
- <a name='L144'></a><a href='#L144'>144</a>
206
- <a name='L145'></a><a href='#L145'>145</a>
207
- <a name='L146'></a><a href='#L146'>146</a>
208
- <a name='L147'></a><a href='#L147'>147</a>
209
- <a name='L148'></a><a href='#L148'>148</a>
210
- <a name='L149'></a><a href='#L149'>149</a>
211
- <a name='L150'></a><a href='#L150'>150</a>
212
- <a name='L151'></a><a href='#L151'>151</a>
213
- <a name='L152'></a><a href='#L152'>152</a>
214
- <a name='L153'></a><a href='#L153'>153</a>
215
- <a name='L154'></a><a href='#L154'>154</a>
216
- <a name='L155'></a><a href='#L155'>155</a>
217
- <a name='L156'></a><a href='#L156'>156</a>
218
- <a name='L157'></a><a href='#L157'>157</a>
219
- <a name='L158'></a><a href='#L158'>158</a>
220
- <a name='L159'></a><a href='#L159'>159</a>
221
- <a name='L160'></a><a href='#L160'>160</a>
222
- <a name='L161'></a><a href='#L161'>161</a>
223
- <a name='L162'></a><a href='#L162'>162</a>
224
- <a name='L163'></a><a href='#L163'>163</a>
225
- <a name='L164'></a><a href='#L164'>164</a>
226
- <a name='L165'></a><a href='#L165'>165</a>
227
- <a name='L166'></a><a href='#L166'>166</a>
228
- <a name='L167'></a><a href='#L167'>167</a>
229
- <a name='L168'></a><a href='#L168'>168</a>
230
- <a name='L169'></a><a href='#L169'>169</a>
231
- <a name='L170'></a><a href='#L170'>170</a>
232
- <a name='L171'></a><a href='#L171'>171</a>
233
- <a name='L172'></a><a href='#L172'>172</a>
234
- <a name='L173'></a><a href='#L173'>173</a>
235
- <a name='L174'></a><a href='#L174'>174</a>
236
- <a name='L175'></a><a href='#L175'>175</a>
237
- <a name='L176'></a><a href='#L176'>176</a>
238
- <a name='L177'></a><a href='#L177'>177</a>
239
- <a name='L178'></a><a href='#L178'>178</a>
240
- <a name='L179'></a><a href='#L179'>179</a>
241
- <a name='L180'></a><a href='#L180'>180</a>
242
- <a name='L181'></a><a href='#L181'>181</a>
243
- <a name='L182'></a><a href='#L182'>182</a>
244
- <a name='L183'></a><a href='#L183'>183</a>
245
- <a name='L184'></a><a href='#L184'>184</a>
246
- <a name='L185'></a><a href='#L185'>185</a>
247
- <a name='L186'></a><a href='#L186'>186</a>
248
- <a name='L187'></a><a href='#L187'>187</a>
249
- <a name='L188'></a><a href='#L188'>188</a>
250
- <a name='L189'></a><a href='#L189'>189</a>
251
- <a name='L190'></a><a href='#L190'>190</a>
252
- <a name='L191'></a><a href='#L191'>191</a>
253
- <a name='L192'></a><a href='#L192'>192</a>
254
- <a name='L193'></a><a href='#L193'>193</a>
255
- <a name='L194'></a><a href='#L194'>194</a>
256
- <a name='L195'></a><a href='#L195'>195</a>
257
- <a name='L196'></a><a href='#L196'>196</a>
258
- <a name='L197'></a><a href='#L197'>197</a>
259
- <a name='L198'></a><a href='#L198'>198</a>
260
- <a name='L199'></a><a href='#L199'>199</a>
261
- <a name='L200'></a><a href='#L200'>200</a>
262
- <a name='L201'></a><a href='#L201'>201</a>
263
- <a name='L202'></a><a href='#L202'>202</a>
264
- <a name='L203'></a><a href='#L203'>203</a>
265
- <a name='L204'></a><a href='#L204'>204</a>
266
- <a name='L205'></a><a href='#L205'>205</a>
267
- <a name='L206'></a><a href='#L206'>206</a>
268
- <a name='L207'></a><a href='#L207'>207</a>
269
- <a name='L208'></a><a href='#L208'>208</a>
270
- <a name='L209'></a><a href='#L209'>209</a>
271
- <a name='L210'></a><a href='#L210'>210</a>
272
- <a name='L211'></a><a href='#L211'>211</a>
273
- <a name='L212'></a><a href='#L212'>212</a>
274
- <a name='L213'></a><a href='#L213'>213</a>
275
- <a name='L214'></a><a href='#L214'>214</a>
276
- <a name='L215'></a><a href='#L215'>215</a>
277
- <a name='L216'></a><a href='#L216'>216</a>
278
- <a name='L217'></a><a href='#L217'>217</a>
279
- <a name='L218'></a><a href='#L218'>218</a>
280
- <a name='L219'></a><a href='#L219'>219</a>
281
- <a name='L220'></a><a href='#L220'>220</a>
282
- <a name='L221'></a><a href='#L221'>221</a>
283
- <a name='L222'></a><a href='#L222'>222</a>
284
- <a name='L223'></a><a href='#L223'>223</a>
285
- <a name='L224'></a><a href='#L224'>224</a>
286
- <a name='L225'></a><a href='#L225'>225</a>
287
- <a name='L226'></a><a href='#L226'>226</a>
288
- <a name='L227'></a><a href='#L227'>227</a>
289
- <a name='L228'></a><a href='#L228'>228</a>
290
- <a name='L229'></a><a href='#L229'>229</a>
291
- <a name='L230'></a><a href='#L230'>230</a>
292
- <a name='L231'></a><a href='#L231'>231</a>
293
- <a name='L232'></a><a href='#L232'>232</a>
294
- <a name='L233'></a><a href='#L233'>233</a>
295
- <a name='L234'></a><a href='#L234'>234</a>
296
- <a name='L235'></a><a href='#L235'>235</a>
297
- <a name='L236'></a><a href='#L236'>236</a>
298
- <a name='L237'></a><a href='#L237'>237</a>
299
- <a name='L238'></a><a href='#L238'>238</a>
300
- <a name='L239'></a><a href='#L239'>239</a>
301
- <a name='L240'></a><a href='#L240'>240</a>
302
- <a name='L241'></a><a href='#L241'>241</a>
303
- <a name='L242'></a><a href='#L242'>242</a>
304
- <a name='L243'></a><a href='#L243'>243</a>
305
- <a name='L244'></a><a href='#L244'>244</a>
306
- <a name='L245'></a><a href='#L245'>245</a>
307
- <a name='L246'></a><a href='#L246'>246</a>
308
- <a name='L247'></a><a href='#L247'>247</a>
309
- <a name='L248'></a><a href='#L248'>248</a>
310
- <a name='L249'></a><a href='#L249'>249</a>
311
- <a name='L250'></a><a href='#L250'>250</a>
312
- <a name='L251'></a><a href='#L251'>251</a>
313
- <a name='L252'></a><a href='#L252'>252</a>
314
- <a name='L253'></a><a href='#L253'>253</a>
315
- <a name='L254'></a><a href='#L254'>254</a>
316
- <a name='L255'></a><a href='#L255'>255</a>
317
- <a name='L256'></a><a href='#L256'>256</a>
318
- <a name='L257'></a><a href='#L257'>257</a>
319
- <a name='L258'></a><a href='#L258'>258</a>
320
- <a name='L259'></a><a href='#L259'>259</a>
321
- <a name='L260'></a><a href='#L260'>260</a>
322
- <a name='L261'></a><a href='#L261'>261</a>
323
- <a name='L262'></a><a href='#L262'>262</a>
324
- <a name='L263'></a><a href='#L263'>263</a>
325
- <a name='L264'></a><a href='#L264'>264</a>
326
- <a name='L265'></a><a href='#L265'>265</a>
327
- <a name='L266'></a><a href='#L266'>266</a>
328
- <a name='L267'></a><a href='#L267'>267</a>
329
- <a name='L268'></a><a href='#L268'>268</a>
330
- <a name='L269'></a><a href='#L269'>269</a>
331
- <a name='L270'></a><a href='#L270'>270</a>
332
- <a name='L271'></a><a href='#L271'>271</a>
333
- <a name='L272'></a><a href='#L272'>272</a>
334
- <a name='L273'></a><a href='#L273'>273</a>
335
- <a name='L274'></a><a href='#L274'>274</a>
336
- <a name='L275'></a><a href='#L275'>275</a>
337
- <a name='L276'></a><a href='#L276'>276</a>
338
- <a name='L277'></a><a href='#L277'>277</a>
339
- <a name='L278'></a><a href='#L278'>278</a>
340
- <a name='L279'></a><a href='#L279'>279</a>
341
- <a name='L280'></a><a href='#L280'>280</a>
342
- <a name='L281'></a><a href='#L281'>281</a>
343
- <a name='L282'></a><a href='#L282'>282</a>
344
- <a name='L283'></a><a href='#L283'>283</a>
345
- <a name='L284'></a><a href='#L284'>284</a>
346
- <a name='L285'></a><a href='#L285'>285</a>
347
- <a name='L286'></a><a href='#L286'>286</a>
348
- <a name='L287'></a><a href='#L287'>287</a>
349
- <a name='L288'></a><a href='#L288'>288</a>
350
- <a name='L289'></a><a href='#L289'>289</a>
351
- <a name='L290'></a><a href='#L290'>290</a>
352
- <a name='L291'></a><a href='#L291'>291</a>
353
- <a name='L292'></a><a href='#L292'>292</a>
354
- <a name='L293'></a><a href='#L293'>293</a>
355
- <a name='L294'></a><a href='#L294'>294</a>
356
- <a name='L295'></a><a href='#L295'>295</a>
357
- <a name='L296'></a><a href='#L296'>296</a>
358
- <a name='L297'></a><a href='#L297'>297</a>
359
- <a name='L298'></a><a href='#L298'>298</a>
360
- <a name='L299'></a><a href='#L299'>299</a>
361
- <a name='L300'></a><a href='#L300'>300</a>
362
- <a name='L301'></a><a href='#L301'>301</a>
363
- <a name='L302'></a><a href='#L302'>302</a>
364
- <a name='L303'></a><a href='#L303'>303</a>
365
- <a name='L304'></a><a href='#L304'>304</a>
366
- <a name='L305'></a><a href='#L305'>305</a>
367
- <a name='L306'></a><a href='#L306'>306</a>
368
- <a name='L307'></a><a href='#L307'>307</a>
369
- <a name='L308'></a><a href='#L308'>308</a>
370
- <a name='L309'></a><a href='#L309'>309</a>
371
- <a name='L310'></a><a href='#L310'>310</a>
372
- <a name='L311'></a><a href='#L311'>311</a>
373
- <a name='L312'></a><a href='#L312'>312</a>
374
- <a name='L313'></a><a href='#L313'>313</a>
375
- <a name='L314'></a><a href='#L314'>314</a>
376
- <a name='L315'></a><a href='#L315'>315</a>
377
- <a name='L316'></a><a href='#L316'>316</a>
378
- <a name='L317'></a><a href='#L317'>317</a>
379
- <a name='L318'></a><a href='#L318'>318</a>
380
- <a name='L319'></a><a href='#L319'>319</a>
381
- <a name='L320'></a><a href='#L320'>320</a>
382
- <a name='L321'></a><a href='#L321'>321</a>
383
- <a name='L322'></a><a href='#L322'>322</a>
384
- <a name='L323'></a><a href='#L323'>323</a>
385
- <a name='L324'></a><a href='#L324'>324</a>
386
- <a name='L325'></a><a href='#L325'>325</a>
387
- <a name='L326'></a><a href='#L326'>326</a>
388
- <a name='L327'></a><a href='#L327'>327</a>
389
- <a name='L328'></a><a href='#L328'>328</a>
390
- <a name='L329'></a><a href='#L329'>329</a>
391
- <a name='L330'></a><a href='#L330'>330</a>
392
- <a name='L331'></a><a href='#L331'>331</a>
393
- <a name='L332'></a><a href='#L332'>332</a>
394
- <a name='L333'></a><a href='#L333'>333</a>
395
- <a name='L334'></a><a href='#L334'>334</a>
396
- <a name='L335'></a><a href='#L335'>335</a>
397
- <a name='L336'></a><a href='#L336'>336</a>
398
- <a name='L337'></a><a href='#L337'>337</a>
399
- <a name='L338'></a><a href='#L338'>338</a>
400
- <a name='L339'></a><a href='#L339'>339</a>
401
- <a name='L340'></a><a href='#L340'>340</a>
402
- <a name='L341'></a><a href='#L341'>341</a>
403
- <a name='L342'></a><a href='#L342'>342</a>
404
- <a name='L343'></a><a href='#L343'>343</a>
405
- <a name='L344'></a><a href='#L344'>344</a>
406
- <a name='L345'></a><a href='#L345'>345</a>
407
- <a name='L346'></a><a href='#L346'>346</a>
408
- <a name='L347'></a><a href='#L347'>347</a>
409
- <a name='L348'></a><a href='#L348'>348</a>
410
- <a name='L349'></a><a href='#L349'>349</a>
411
- <a name='L350'></a><a href='#L350'>350</a>
412
- <a name='L351'></a><a href='#L351'>351</a>
413
- <a name='L352'></a><a href='#L352'>352</a>
414
- <a name='L353'></a><a href='#L353'>353</a>
415
- <a name='L354'></a><a href='#L354'>354</a>
416
- <a name='L355'></a><a href='#L355'>355</a>
417
- <a name='L356'></a><a href='#L356'>356</a>
418
- <a name='L357'></a><a href='#L357'>357</a>
419
- <a name='L358'></a><a href='#L358'>358</a>
420
- <a name='L359'></a><a href='#L359'>359</a>
421
- <a name='L360'></a><a href='#L360'>360</a>
422
- <a name='L361'></a><a href='#L361'>361</a>
423
- <a name='L362'></a><a href='#L362'>362</a>
424
- <a name='L363'></a><a href='#L363'>363</a>
425
- <a name='L364'></a><a href='#L364'>364</a>
426
- <a name='L365'></a><a href='#L365'>365</a>
427
- <a name='L366'></a><a href='#L366'>366</a>
428
- <a name='L367'></a><a href='#L367'>367</a>
429
- <a name='L368'></a><a href='#L368'>368</a>
430
- <a name='L369'></a><a href='#L369'>369</a>
431
- <a name='L370'></a><a href='#L370'>370</a>
432
- <a name='L371'></a><a href='#L371'>371</a>
433
- <a name='L372'></a><a href='#L372'>372</a>
434
- <a name='L373'></a><a href='#L373'>373</a>
435
- <a name='L374'></a><a href='#L374'>374</a>
436
- <a name='L375'></a><a href='#L375'>375</a>
437
- <a name='L376'></a><a href='#L376'>376</a>
438
- <a name='L377'></a><a href='#L377'>377</a>
439
- <a name='L378'></a><a href='#L378'>378</a>
440
- <a name='L379'></a><a href='#L379'>379</a>
441
- <a name='L380'></a><a href='#L380'>380</a>
442
- <a name='L381'></a><a href='#L381'>381</a>
443
- <a name='L382'></a><a href='#L382'>382</a>
444
- <a name='L383'></a><a href='#L383'>383</a>
445
- <a name='L384'></a><a href='#L384'>384</a>
446
- <a name='L385'></a><a href='#L385'>385</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
447
- <span class="cline-any cline-yes">1x</span>
448
- <span class="cline-any cline-yes">1x</span>
449
- <span class="cline-any cline-yes">1x</span>
450
- <span class="cline-any cline-yes">1x</span>
451
- <span class="cline-any cline-yes">1x</span>
452
- <span class="cline-any cline-yes">1x</span>
453
- <span class="cline-any cline-yes">1x</span>
454
- <span class="cline-any cline-yes">1x</span>
455
- <span class="cline-any cline-yes">1x</span>
456
- <span class="cline-any cline-yes">1x</span>
457
- <span class="cline-any cline-yes">1x</span>
458
- <span class="cline-any cline-yes">1x</span>
459
- <span class="cline-any cline-yes">1x</span>
460
- <span class="cline-any cline-yes">11x</span>
461
- <span class="cline-any cline-yes">11x</span>
462
- <span class="cline-any cline-yes">11x</span>
463
- <span class="cline-any cline-yes">11x</span>
464
- <span class="cline-any cline-yes">11x</span>
465
- <span class="cline-any cline-yes">11x</span>
466
- <span class="cline-any cline-yes">11x</span>
467
- <span class="cline-any cline-yes">11x</span>
468
- <span class="cline-any cline-yes">11x</span>
469
- <span class="cline-any cline-yes">11x</span>
470
- <span class="cline-any cline-yes">11x</span>
471
- <span class="cline-any cline-yes">11x</span>
472
- <span class="cline-any cline-yes">11x</span>
473
- <span class="cline-any cline-yes">11x</span>
474
- <span class="cline-any cline-yes">11x</span>
475
- <span class="cline-any cline-yes">11x</span>
476
- <span class="cline-any cline-yes">11x</span>
477
- <span class="cline-any cline-yes">11x</span>
478
- <span class="cline-any cline-yes">11x</span>
479
- <span class="cline-any cline-yes">11x</span>
480
- <span class="cline-any cline-yes">11x</span>
481
- <span class="cline-any cline-yes">11x</span>
482
- <span class="cline-any cline-yes">11x</span>
483
- <span class="cline-any cline-yes">11x</span>
484
- <span class="cline-any cline-yes">11x</span>
485
- <span class="cline-any cline-yes">11x</span>
486
- <span class="cline-any cline-yes">11x</span>
487
- <span class="cline-any cline-yes">11x</span>
488
- <span class="cline-any cline-yes">11x</span>
489
- <span class="cline-any cline-no">&nbsp;</span>
490
- <span class="cline-any cline-no">&nbsp;</span>
491
- <span class="cline-any cline-yes">11x</span>
492
- <span class="cline-any cline-yes">11x</span>
493
- <span class="cline-any cline-yes">11x</span>
494
- <span class="cline-any cline-yes">11x</span>
495
- <span class="cline-any cline-yes">7x</span>
496
- <span class="cline-any cline-yes">7x</span>
497
- <span class="cline-any cline-yes">7x</span>
498
- <span class="cline-any cline-yes">7x</span>
499
- <span class="cline-any cline-yes">7x</span>
500
- <span class="cline-any cline-yes">7x</span>
501
- <span class="cline-any cline-yes">7x</span>
502
- <span class="cline-any cline-yes">7x</span>
503
- <span class="cline-any cline-yes">7x</span>
504
- <span class="cline-any cline-yes">7x</span>
505
- <span class="cline-any cline-yes">11x</span>
506
- <span class="cline-any cline-yes">4x</span>
507
- <span class="cline-any cline-yes">4x</span>
508
- <span class="cline-any cline-yes">4x</span>
509
- <span class="cline-any cline-yes">11x</span>
510
- <span class="cline-any cline-yes">11x</span>
511
- <span class="cline-any cline-yes">11x</span>
512
- <span class="cline-any cline-yes">3x</span>
513
- <span class="cline-any cline-yes">1x</span>
514
- <span class="cline-any cline-yes">1x</span>
515
- <span class="cline-any cline-yes">2x</span>
516
- <span class="cline-any cline-yes">2x</span>
517
- <span class="cline-any cline-yes">2x</span>
518
- <span class="cline-any cline-yes">2x</span>
519
- <span class="cline-any cline-yes">2x</span>
520
- <span class="cline-any cline-yes">2x</span>
521
- <span class="cline-any cline-yes">2x</span>
522
- <span class="cline-any cline-yes">2x</span>
523
- <span class="cline-any cline-yes">2x</span>
524
- <span class="cline-any cline-yes">2x</span>
525
- <span class="cline-any cline-yes">2x</span>
526
- <span class="cline-any cline-yes">2x</span>
527
- <span class="cline-any cline-yes">2x</span>
528
- <span class="cline-any cline-yes">2x</span>
529
- <span class="cline-any cline-yes">2x</span>
530
- <span class="cline-any cline-yes">2x</span>
531
- <span class="cline-any cline-yes">2x</span>
532
- <span class="cline-any cline-yes">2x</span>
533
- <span class="cline-any cline-yes">2x</span>
534
- <span class="cline-any cline-yes">2x</span>
535
- <span class="cline-any cline-yes">2x</span>
536
- <span class="cline-any cline-yes">2x</span>
537
- <span class="cline-any cline-yes">3x</span>
538
- <span class="cline-any cline-yes">11x</span>
539
- <span class="cline-any cline-yes">11x</span>
540
- <span class="cline-any cline-yes">1x</span>
541
- <span class="cline-any cline-yes">1x</span>
542
- <span class="cline-any cline-yes">1x</span>
543
- <span class="cline-any cline-yes">1x</span>
544
- <span class="cline-any cline-yes">1x</span>
545
- <span class="cline-any cline-yes">1x</span>
546
- <span class="cline-any cline-yes">1x</span>
547
- <span class="cline-any cline-yes">1x</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-yes">1x</span>
560
- <span class="cline-any cline-yes">11x</span>
561
- <span class="cline-any cline-yes">11x</span>
562
- <span class="cline-any cline-no">&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-no">&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-no">&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-no">&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-no">&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-no">&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-no">&nbsp;</span>
593
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
597
- <span class="cline-any cline-no">&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-no">&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-no">&nbsp;</span>
619
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
- <span class="cline-any cline-yes">11x</span>
625
- <span class="cline-any cline-yes">11x</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-no">&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-no">&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-yes">11x</span>
636
- <span class="cline-any cline-yes">11x</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-no">&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-yes">11x</span>
645
- <span class="cline-any cline-yes">11x</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-yes">11x</span>
649
- <span class="cline-any cline-yes">11x</span>
650
- <span class="cline-any cline-yes">32x</span>
651
- <span class="cline-any cline-yes">32x</span>
652
- <span class="cline-any cline-yes">32x</span>
653
- <span class="cline-any cline-yes">32x</span>
654
- <span class="cline-any cline-yes">32x</span>
655
- <span class="cline-any cline-yes">32x</span>
656
- <span class="cline-any cline-yes">32x</span>
657
- <span class="cline-any cline-yes">32x</span>
658
- <span class="cline-any cline-yes">32x</span>
659
- <span class="cline-any cline-yes">8x</span>
660
- <span class="cline-any cline-yes">8x</span>
661
- <span class="cline-any cline-yes">8x</span>
662
- <span class="cline-any cline-yes">8x</span>
663
- <span class="cline-any cline-yes">8x</span>
664
- <span class="cline-any cline-yes">32x</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-yes">8x</span>
669
- <span class="cline-any cline-yes">8x</span>
670
- <span class="cline-any cline-yes">8x</span>
671
- <span class="cline-any cline-yes">32x</span>
672
- <span class="cline-any cline-yes">32x</span>
673
- <span class="cline-any cline-yes">7x</span>
674
- <span class="cline-any cline-yes">7x</span>
675
- <span class="cline-any cline-yes">7x</span>
676
- <span class="cline-any cline-yes">32x</span>
677
- <span class="cline-any cline-yes">1x</span>
678
- <span class="cline-any cline-yes">1x</span>
679
- <span class="cline-any cline-yes">1x</span>
680
- <span class="cline-any cline-yes">1x</span>
681
- <span class="cline-any cline-yes">1x</span>
682
- <span class="cline-any cline-yes">1x</span>
683
- <span class="cline-any cline-yes">1x</span>
684
- <span class="cline-any cline-yes">32x</span>
685
- <span class="cline-any cline-yes">25x</span>
686
- <span class="cline-any cline-yes">25x</span>
687
- <span class="cline-any cline-yes">25x</span>
688
- <span class="cline-any cline-yes">25x</span>
689
- <span class="cline-any cline-yes">32x</span>
690
- <span class="cline-any cline-yes">11x</span>
691
- <span class="cline-any cline-yes">11x</span>
692
- <span class="cline-any cline-yes">11x</span>
693
- <span class="cline-any cline-yes">11x</span>
694
- <span class="cline-any cline-yes">11x</span>
695
- <span class="cline-any cline-yes">6x</span>
696
- <span class="cline-any cline-yes">6x</span>
697
- <span class="cline-any cline-yes">3x</span>
698
- <span class="cline-any cline-yes">3x</span>
699
- <span class="cline-any cline-yes">5x</span>
700
- <span class="cline-any cline-yes">11x</span>
701
- <span class="cline-any cline-yes">2x</span>
702
- <span class="cline-any cline-yes">2x</span>
703
- <span class="cline-any cline-yes">2x</span>
704
- <span class="cline-any cline-yes">2x</span>
705
- <span class="cline-any cline-yes">2x</span>
706
- <span class="cline-any cline-yes">14x</span>
707
- <span class="cline-any cline-yes">14x</span>
708
- <span class="cline-any cline-yes">14x</span>
709
- <span class="cline-any cline-yes">14x</span>
710
- <span class="cline-any cline-yes">2x</span>
711
- <span class="cline-any cline-yes">14x</span>
712
- <span class="cline-any cline-yes">12x</span>
713
- <span class="cline-any cline-yes">12x</span>
714
- <span class="cline-any cline-yes">12x</span>
715
- <span class="cline-any cline-yes">12x</span>
716
- <span class="cline-any cline-yes">12x</span>
717
- <span class="cline-any cline-yes">14x</span>
718
- <span class="cline-any cline-yes">2x</span>
719
- <span class="cline-any cline-yes">3x</span>
720
- <span class="cline-any cline-yes">3x</span>
721
- <span class="cline-any cline-yes">3x</span>
722
- <span class="cline-any cline-yes">3x</span>
723
- <span class="cline-any cline-yes">3x</span>
724
- <span class="cline-any cline-yes">3x</span>
725
- <span class="cline-any cline-yes">3x</span>
726
- <span class="cline-any cline-yes">3x</span>
727
- <span class="cline-any cline-yes">3x</span>
728
- <span class="cline-any cline-yes">12x</span>
729
- <span class="cline-any cline-yes">12x</span>
730
- <span class="cline-any cline-yes">12x</span>
731
- <span class="cline-any cline-yes">12x</span>
732
- <span class="cline-any cline-yes">2x</span>
733
- <span class="cline-any cline-yes">12x</span>
734
- <span class="cline-any cline-yes">10x</span>
735
- <span class="cline-any cline-yes">10x</span>
736
- <span class="cline-any cline-yes">10x</span>
737
- <span class="cline-any cline-yes">10x</span>
738
- <span class="cline-any cline-yes">10x</span>
739
- <span class="cline-any cline-yes">1x</span>
740
- <span class="cline-any cline-yes">1x</span>
741
- <span class="cline-any cline-yes">1x</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-yes">1x</span>
755
- <span class="cline-any cline-yes">1x</span>
756
- <span class="cline-any cline-yes">1x</span>
757
- <span class="cline-any cline-yes">1x</span>
758
- <span class="cline-any cline-yes">9x</span>
759
- <span class="cline-any cline-yes">9x</span>
760
- <span class="cline-any cline-yes">9x</span>
761
- <span class="cline-any cline-yes">9x</span>
762
- <span class="cline-any cline-yes">9x</span>
763
- <span class="cline-any cline-yes">9x</span>
764
- <span class="cline-any cline-yes">9x</span>
765
- <span class="cline-any cline-yes">9x</span>
766
- <span class="cline-any cline-yes">9x</span>
767
- <span class="cline-any cline-yes">12x</span>
768
- <span class="cline-any cline-yes">3x</span>
769
- <span class="cline-any cline-yes">11x</span>
770
- <span class="cline-any cline-yes">11x</span>
771
- <span class="cline-any cline-yes">11x</span>
772
- <span class="cline-any cline-yes">7x</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-yes">7x</span>
777
- <span class="cline-any cline-yes">7x</span>
778
- <span class="cline-any cline-yes">1x</span>
779
- <span class="cline-any cline-yes">1x</span>
780
- <span class="cline-any cline-yes">1x</span>
781
- <span class="cline-any cline-yes">1x</span>
782
- <span class="cline-any cline-yes">1x</span>
783
- <span class="cline-any cline-yes">1x</span>
784
- <span class="cline-any cline-yes">1x</span>
785
- <span class="cline-any cline-yes">1x</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-no">&nbsp;</span>
788
- <span class="cline-any cline-yes">7x</span>
789
- <span class="cline-any cline-yes">7x</span>
790
- <span class="cline-any cline-yes">11x</span>
791
- <span class="cline-any cline-yes">11x</span>
792
- <span class="cline-any cline-yes">2x</span>
793
- <span class="cline-any cline-yes">2x</span>
794
- <span class="cline-any cline-yes">2x</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-no">&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-yes">2x</span>
805
- <span class="cline-any cline-yes">2x</span>
806
- <span class="cline-any cline-yes">2x</span>
807
- <span class="cline-any cline-yes">2x</span>
808
- <span class="cline-any cline-yes">11x</span>
809
- <span class="cline-any cline-yes">11x</span>
810
- <span class="cline-any cline-yes">11x</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-yes">11x</span>
814
- <span class="cline-any cline-yes">11x</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-yes">11x</span>
818
- <span class="cline-any cline-yes">11x</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-yes">11x</span>
822
- <span class="cline-any cline-yes">11x</span>
823
- <span class="cline-any cline-yes">5x</span>
824
- <span class="cline-any cline-yes">5x</span>
825
- <span class="cline-any cline-yes">11x</span>
826
- <span class="cline-any cline-yes">11x</span>
827
- <span class="cline-any cline-yes">11x</span>
828
- <span class="cline-any cline-yes">5x</span>
829
- <span class="cline-any cline-yes">5x</span>
830
- <span class="cline-any cline-yes">11x</span></td><td class="text"><pre class="prettyprint lang-js">/**
831
- * Main RunnerApp class - entry point and lifecycle manager for the runner app
832
- */
833
- &nbsp;
834
- import { RunnerConfig, ConversationContext, JsonRpcMessage, RetryStrategy } from "./types";
835
- import { MessageHandler } from "./components/message-handler";
836
- import { ClaudeManager } from "./components/claude-manager";
837
- import { RepositoryManager } from "./components/repository-manager";
838
- import { createLogger } from "./utils/logger";
839
- import { statusLineManager } from "./utils/status-line";
840
- &nbsp;
841
- const logger = createLogger("RunnerApp");
842
- &nbsp;
843
- export class RunnerApp {
844
- private messageHandler!: MessageHandler;
845
- private claudeManager!: ClaudeManager;
846
- private repositoryManager!: RepositoryManager;
847
- private activeConversations: Map&lt;string, ConversationContext&gt;;
848
- private config: RunnerConfig;
849
- private heartbeatInterval?: NodeJS.Timeout;
850
- private isRunning: boolean = false;
851
- private isRegistered: boolean = false;
852
- private delayFn: (ms: number) =&gt; Promise&lt;void&gt; = <span class="fstat-no" title="function not covered" >(ms) =&gt; new Promise(resolve =&gt; setTimeout(resolve, ms));</span>
853
- &nbsp;
854
- constructor(config: RunnerConfig) {
855
- this.config = config;
856
- this.activeConversations = new Map();
857
- this.initializeComponents();
858
- }
859
- &nbsp;
860
- private initializeComponents(): void {
861
- // Initialize repository manager first as it's used by Claude manager
862
- this.repositoryManager = new RepositoryManager(this);
863
-
864
- // Initialize Claude manager with repository manager
865
- this.claudeManager = new ClaudeManager(this, this.repositoryManager);
866
-
867
- // Initialize message handler
868
- this.messageHandler = new MessageHandler(this);
869
- }
870
- &nbsp;
871
- async start(): Promise&lt;void&gt; {
872
- if (this.isRunning) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
873
- <span class="cstat-no" title="statement not covered" > throw new Error("Runner is already running");</span>
874
- <span class="cstat-no" title="statement not covered" > }</span>
875
- &nbsp;
876
- try {
877
- // Register with retry strategy
878
- await this.registerWithRetry();
879
-
880
- // Only start processing after successful registration
881
- await this.messageHandler.startProcessing();
882
-
883
- // Only start heartbeat after successful registration
884
- this.startHeartbeat();
885
-
886
- this.isRunning = true;
887
-
888
- logger.info(`Runner ${this.config.runnerId} started successfully`);
889
- } catch (error) {
890
- logger.error("Failed to start runner:", error);
891
- throw error;
892
- }
893
- }
894
- &nbsp;
895
- async stop(): Promise&lt;void&gt; {
896
- if (!this.isRunning) {
897
- return;
898
- }
899
- &nbsp;
900
- logger.info(`Stopping runner ${this.config.runnerId}...`);
901
-
902
- // Stop heartbeat
903
- if (this.heartbeatInterval) {
904
- clearInterval(this.heartbeatInterval);
905
- this.heartbeatInterval = undefined;
906
- }
907
- &nbsp;
908
- // Stop all conversations
909
- await this.stopAllConversations();
910
-
911
- // Stop message processing
912
- await this.messageHandler.stopProcessing();
913
-
914
- // Clean up status line
915
- statusLineManager.dispose();
916
-
917
- // Collections automatically handle cleanup
918
- this.isRunning = false;
919
-
920
- logger.info(`Runner ${this.config.runnerId} stopped`);
921
- }
922
- &nbsp;
923
- async notify(method: string, params: any): Promise&lt;void&gt; {
924
- try {
925
- // Send notification to orchestrator via HTTP
926
- await this.sendToOrchestrator({
927
- jsonrpc: "2.0",
928
- method,
929
- params,
930
- });
931
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
932
- <span class="cstat-no" title="statement not covered" > // Special handling for heartbeat errors - just log a simple line</span>
933
- <span class="cstat-no" title="statement not covered" > if (method === "runner.heartbeat") {</span>
934
- <span class="cstat-no" title="statement not covered" > const errorMessage = error instanceof Error ? error.message : String(error);</span>
935
- <span class="cstat-no" title="statement not covered" > logger.error(`Heartbeat failed: ${errorMessage}`);</span>
936
- <span class="cstat-no" title="statement not covered" > } else {</span>
937
- <span class="cstat-no" title="statement not covered" > // For other RPC errors, log the method and error without stack</span>
938
- <span class="cstat-no" title="statement not covered" > const errorMessage = error instanceof Error ? error.message : String(error);</span>
939
- <span class="cstat-no" title="statement not covered" > logger.error(`RPC Error: Failed to notify with method '${method}': ${errorMessage}`);</span>
940
- <span class="cstat-no" title="statement not covered" > }</span>
941
- <span class="cstat-no" title="statement not covered" > throw error;</span>
942
- <span class="cstat-no" title="statement not covered" > }</span>
943
- }
944
- &nbsp;
945
- <span class="fstat-no" title="function not covered" > async sendToOrchestrator(message: JsonRpcMessage): Promise&lt;any&gt; {</span>
946
- <span class="cstat-no" title="statement not covered" > const maxRetries = 1;</span>
947
- <span class="cstat-no" title="statement not covered" > const retryDelay = 1000; // Start with 1 second</span>
948
- <span class="cstat-no" title="statement not covered" > </span>
949
- <span class="cstat-no" title="statement not covered" > for (let attempt = 1; attempt &lt;= maxRetries; attempt++) {</span>
950
- <span class="cstat-no" title="statement not covered" > try {</span>
951
- <span class="cstat-no" title="statement not covered" > // Build headers - only include X-Runner-Id if we have one (not during registration)</span>
952
- <span class="cstat-no" title="statement not covered" > const headers: Record&lt;string, string&gt; = {</span>
953
- <span class="cstat-no" title="statement not covered" > "Content-Type": "application/json",</span>
954
- <span class="cstat-no" title="statement not covered" > Authorization: `Bearer ${process.env["NORTHFLARE_RUNNER_TOKEN"]}`,</span>
955
- <span class="cstat-no" title="statement not covered" > };</span>
956
- <span class="cstat-no" title="statement not covered" > </span>
957
- <span class="cstat-no" title="statement not covered" > // Only add X-Runner-Id if we're registered (not during registration)</span>
958
- <span class="cstat-no" title="statement not covered" > if (this.config.runnerId &amp;&amp; message.method !== "runner.register") {</span>
959
- <span class="cstat-no" title="statement not covered" > headers["X-Runner-Id"] = this.config.runnerId;</span>
960
- <span class="cstat-no" title="statement not covered" > }</span>
961
- <span class="cstat-no" title="statement not covered" > </span>
962
- <span class="cstat-no" title="statement not covered" > const response = await fetch(</span>
963
- <span class="cstat-no" title="statement not covered" > `${this.config.orchestratorUrl}/api/runner/messages`,</span>
964
- <span class="cstat-no" title="statement not covered" > {</span>
965
- <span class="cstat-no" title="statement not covered" > method: "POST",</span>
966
- <span class="cstat-no" title="statement not covered" > headers,</span>
967
- <span class="cstat-no" title="statement not covered" > body: JSON.stringify(message),</span>
968
- <span class="cstat-no" title="statement not covered" > signal: AbortSignal.timeout(30000), // 30 second timeout</span>
969
- <span class="cstat-no" title="statement not covered" > }</span>
970
- <span class="cstat-no" title="statement not covered" > );</span>
971
- <span class="cstat-no" title="statement not covered" ></span>
972
- <span class="cstat-no" title="statement not covered" > if (!response.ok) {</span>
973
- <span class="cstat-no" title="statement not covered" > const errorText = await response.text();</span>
974
- <span class="cstat-no" title="statement not covered" > throw new Error(`HTTP ${response.status}: ${errorText}`);</span>
975
- <span class="cstat-no" title="statement not covered" > }</span>
976
- <span class="cstat-no" title="statement not covered" ></span>
977
- <span class="cstat-no" title="statement not covered" > return await response.json();</span>
978
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
979
- <span class="cstat-no" title="statement not covered" > const isLastAttempt = attempt === maxRetries;</span>
980
- <span class="cstat-no" title="statement not covered" > const isRetryable = this.isRetryableError(error);</span>
981
- <span class="cstat-no" title="statement not covered" > </span>
982
- <span class="cstat-no" title="statement not covered" > if (!isRetryable || isLastAttempt) {</span>
983
- <span class="cstat-no" title="statement not covered" > const errorMessage = error instanceof Error ? error.message : String(error);</span>
984
- <span class="cstat-no" title="statement not covered" > </span>
985
- <span class="cstat-no" title="statement not covered" > // Don't log verbose errors for heartbeat failures</span>
986
- <span class="cstat-no" title="statement not covered" > if (message.method === "runner.heartbeat") {</span>
987
- <span class="cstat-no" title="statement not covered" > // Heartbeat errors are already logged in notify()</span>
988
- <span class="cstat-no" title="statement not covered" > } else if (message.method === "runner.register") {</span>
989
- <span class="cstat-no" title="statement not covered" > // Special case for registration failures</span>
990
- <span class="cstat-no" title="statement not covered" > logger.error(`Registration failed after ${attempt} attempts: ${errorMessage}`);</span>
991
- <span class="cstat-no" title="statement not covered" > } else {</span>
992
- <span class="cstat-no" title="statement not covered" > // For other RPC messages, log the attempted message and error</span>
993
- <span class="cstat-no" title="statement not covered" > logger.error(`RPC failed after ${attempt} attempts:`, {</span>
994
- <span class="cstat-no" title="statement not covered" > method: message.method,</span>
995
- <span class="cstat-no" title="statement not covered" > params: message.params,</span>
996
- <span class="cstat-no" title="statement not covered" > error: errorMessage</span>
997
- <span class="cstat-no" title="statement not covered" > });</span>
998
- <span class="cstat-no" title="statement not covered" > }</span>
999
- <span class="cstat-no" title="statement not covered" > throw error;</span>
1000
- <span class="cstat-no" title="statement not covered" > }</span>
1001
- <span class="cstat-no" title="statement not covered" > </span>
1002
- <span class="cstat-no" title="statement not covered" > const delay = retryDelay * Math.pow(2, attempt - 1); // Exponential backoff</span>
1003
- <span class="cstat-no" title="statement not covered" > logger.warn(`Request failed (attempt ${attempt}/${maxRetries}), retrying in ${delay}ms...`);</span>
1004
- <span class="cstat-no" title="statement not covered" > await new Promise(resolve =&gt; setTimeout(resolve, delay));</span>
1005
- <span class="cstat-no" title="statement not covered" > }</span>
1006
- <span class="cstat-no" title="statement not covered" > }</span>
1007
- <span class="cstat-no" title="statement not covered" > }</span>
1008
- &nbsp;
1009
- private <span class="fstat-no" title="function not covered" >isRetryableError(error: any): boolean {</span>
1010
- <span class="cstat-no" title="statement not covered" > // Network errors, timeouts, and 5xx errors are retryable</span>
1011
- <span class="cstat-no" title="statement not covered" > if (error.name === 'AbortError') return true;</span>
1012
- <span class="cstat-no" title="statement not covered" > if (error.code === 'ECONNREFUSED') return true;</span>
1013
- <span class="cstat-no" title="statement not covered" > if (error.code === 'ETIMEDOUT') return true;</span>
1014
- <span class="cstat-no" title="statement not covered" > if (error.code === 'ENOTFOUND') return true;</span>
1015
- <span class="cstat-no" title="statement not covered" > if (error.message?.includes('HTTP 5')) return true;</span>
1016
- <span class="cstat-no" title="statement not covered" > if (error.message?.includes('fetch failed')) return true;</span>
1017
- <span class="cstat-no" title="statement not covered" > return false;</span>
1018
- <span class="cstat-no" title="statement not covered" > }</span>
1019
- &nbsp;
1020
- <span class="fstat-no" title="function not covered" > getConversationContext(taskId: string): ConversationContext {</span>
1021
- <span class="cstat-no" title="statement not covered" > // Using taskId as primary key for conversation tracking</span>
1022
- <span class="cstat-no" title="statement not covered" > const context = this.activeConversations.get(taskId);</span>
1023
- <span class="cstat-no" title="statement not covered" > if (!context) {</span>
1024
- <span class="cstat-no" title="statement not covered" > throw new Error(`No conversation context found for task ${taskId}`);</span>
1025
- <span class="cstat-no" title="statement not covered" > }</span>
1026
- <span class="cstat-no" title="statement not covered" > return context;</span>
1027
- <span class="cstat-no" title="statement not covered" > }</span>
1028
- &nbsp;
1029
- <span class="fstat-no" title="function not covered" > getWorkspaceIdForTask(taskId: string): string {</span>
1030
- <span class="cstat-no" title="statement not covered" > return this.getConversationContext(taskId).workspaceId;</span>
1031
- <span class="cstat-no" title="statement not covered" > }</span>
1032
- &nbsp;
1033
- private async registerRunner(): Promise&lt;void&gt; {
1034
- try {
1035
- const response = await this.sendToOrchestrator({
1036
- jsonrpc: "2.0",
1037
- id: "register-" + Date.now(),
1038
- method: "runner.register",
1039
- params: {
1040
- version: "1.0.0",
1041
- },
1042
- });
1043
-
1044
- // Debug log the full response
1045
- logger.info(`Registration response:`, JSON.stringify(response, null, 2));
1046
-
1047
- // Check for JSONRPC error response
1048
- if (response?.error) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1049
- <span class="cstat-no" title="statement not covered" > logger.error(`Registration error from server:`, response.error);</span>
1050
- <span class="cstat-no" title="statement not covered" > throw new Error(`Server error: ${response.error.message || 'Unknown error'}`);</span>
1051
- <span class="cstat-no" title="statement not covered" > }</span>
1052
-
1053
- // Extract result from JSONRPC response structure
1054
- const result = response?.result;
1055
-
1056
- if (result?.runnerId) {
1057
- this.config.runnerId = result.runnerId;
1058
- this.isRegistered = true;
1059
- logger.info(`Runner registered successfully with ID: ${this.config.runnerId}`);
1060
- } else {
1061
- logger.error(`Registration failed. Expected result.runnerId but got:`, {
1062
- hasResult: !!result,
1063
- resultKeys: result ? Object.keys(result<span class="branch-0 cbranch-no" title="branch not covered" >) : [],</span>
1064
- fullResponse: JSON.stringify(response, null, 2)
1065
- });
1066
- throw new Error("Registration response did not include runnerId");
1067
- }
1068
- } catch (error) {
1069
- const errorMessage = error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(error);</span>
1070
- logger.error(`Failed to register runner: ${errorMessage}`);
1071
- throw error;
1072
- }
1073
- }
1074
-
1075
- private async registerWithRetry(): Promise&lt;void&gt; {
1076
- const strategy = this.config.retryStrategy;
1077
-
1078
- if (strategy === "none") {
1079
- // Single attempt, no retries
1080
- await this.registerRunner();
1081
- return;
1082
- }
1083
-
1084
- if (strategy === "interval") {
1085
- // Retry at fixed intervals
1086
- const intervalMs = this.config.retryIntervalSecs * 1000;
1087
- let attempt = 0;
1088
-
1089
- while (!this.isRegistered) {
1090
- attempt++;
1091
- try {
1092
- logger.info(`Registration attempt ${attempt}...`);
1093
- await this.registerRunner();
1094
- return;
1095
- } catch (error) {
1096
- const errorMessage = error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(error);</span>
1097
- logger.error(`Registration attempt ${attempt} failed: ${errorMessage}`);
1098
- logger.info(`Retrying in ${this.config.retryIntervalSecs} seconds...`);
1099
- await this.delayFn(intervalMs);
1100
- }
1101
- }
1102
- }
1103
-
1104
- if (strategy === "exponential") {
1105
- // Exponential backoff with max duration
1106
- const maxDurationMs = this.config.retryDurationSecs * 1000;
1107
- const startTime = Date.now();
1108
- let delayMs = 8000; // Start with 8 seconds
1109
- let attempt = 0;
1110
-
1111
- while (!this.isRegistered) {
1112
- attempt++;
1113
- try {
1114
- logger.info(`Registration attempt ${attempt}...`);
1115
- await this.registerRunner();
1116
- return;
1117
- } catch (error) {
1118
- const errorMessage = error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(error);</span>
1119
- logger.error(`Registration attempt ${attempt} failed: ${errorMessage}`);
1120
-
1121
- const elapsedMs = Date.now() - startTime;
1122
- if (elapsedMs &gt;= maxDurationMs) {
1123
- // Final retry at max duration
1124
- const remainingMs = maxDurationMs - elapsedMs;
1125
- if (remainingMs &gt; 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1126
- <span class="cstat-no" title="statement not covered" > logger.info(`Final retry in ${Math.ceil(remainingMs / 1000)} seconds...`);</span>
1127
- <span class="cstat-no" title="statement not covered" > await this.delayFn(remainingMs);</span>
1128
- <span class="cstat-no" title="statement not covered" > </span>
1129
- <span class="cstat-no" title="statement not covered" > try {</span>
1130
- <span class="cstat-no" title="statement not covered" > logger.info("Final registration attempt...");</span>
1131
- <span class="cstat-no" title="statement not covered" > await this.registerRunner();</span>
1132
- <span class="cstat-no" title="statement not covered" > return;</span>
1133
- <span class="cstat-no" title="statement not covered" > } catch (finalError) {</span>
1134
- <span class="cstat-no" title="statement not covered" > const errorMessage = finalError instanceof Error ? finalError.message : String(finalError);</span>
1135
- <span class="cstat-no" title="statement not covered" > logger.error(`Final registration attempt failed: ${errorMessage}`);</span>
1136
- <span class="cstat-no" title="statement not covered" > throw new Error(`Failed to register after ${this.config.retryDurationSecs} seconds`);</span>
1137
- <span class="cstat-no" title="statement not covered" > }</span>
1138
- } else {
1139
- throw new Error(`Failed to register after ${this.config.retryDurationSecs} seconds`);
1140
- }
1141
- }
1142
-
1143
- // Calculate next delay with exponential backoff
1144
- const nextDelayMs = Math.min(delayMs, maxDurationMs - elapsedMs);
1145
- logger.info(`Retrying in ${Math.ceil(nextDelayMs / 1000)} seconds...`);
1146
- await this.delayFn(nextDelayMs);
1147
-
1148
- // Double the delay for next attempt
1149
- delayMs = Math.min(delayMs * 2, maxDurationMs);
1150
- }
1151
- }
1152
- }
1153
- }
1154
- &nbsp;
1155
- private startHeartbeat(): void {
1156
- if (!this.isRegistered || !this.config.runnerId) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1157
- <span class="cstat-no" title="statement not covered" > logger.warn("Cannot start heartbeat: runner not registered");</span>
1158
- <span class="cstat-no" title="statement not covered" > return;</span>
1159
- <span class="cstat-no" title="statement not covered" > }</span>
1160
-
1161
- this.heartbeatInterval = setInterval(async () =&gt; {
1162
- try {
1163
- await this.notify("runner.heartbeat", {
1164
- runnerId: this.config.runnerId,
1165
- activeConversations: this.activeConversations.size,
1166
- uptime: process.uptime(),
1167
- memoryUsage: process.memoryUsage(),
1168
- });
1169
- <span class="branch-0 cbranch-no" title="branch not covered" > } catch (error) {</span>
1170
- <span class="cstat-no" title="statement not covered" > // Error is already logged in notify() method</span>
1171
- <span class="cstat-no" title="statement not covered" > }</span>
1172
- }, this.config.heartbeatInterval);
1173
- }
1174
- &nbsp;
1175
- private async stopAllConversations(): Promise&lt;void&gt; {
1176
- const stopPromises: Promise&lt;void&gt;[] = [];
1177
-
1178
- for (const [taskId, context] of this.activeConversations) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1179
- <span class="cstat-no" title="statement not covered" > if (context.status === "active" || context.status === "starting") {</span>
1180
- <span class="cstat-no" title="statement not covered" > stopPromises.push(</span>
1181
- <span class="cstat-no" title="statement not covered" > this.claudeManager.stopConversation(taskId, context.sessionId || "")</span>
1182
- <span class="cstat-no" title="statement not covered" > .catch(error =&gt; {</span>
1183
- <span class="cstat-no" title="statement not covered" > logger.error(`Failed to stop conversation ${taskId}:`, error);</span>
1184
- <span class="cstat-no" title="statement not covered" > })</span>
1185
- <span class="cstat-no" title="statement not covered" > );</span>
1186
- <span class="cstat-no" title="statement not covered" > }</span>
1187
- <span class="cstat-no" title="statement not covered" > }</span>
1188
- &nbsp;
1189
- await Promise.all(stopPromises);
1190
- this.activeConversations.clear();
1191
- }
1192
- &nbsp;
1193
- // Getters for components
1194
- <span class="fstat-no" title="function not covered" > get config_(): RunnerConfig {</span>
1195
- <span class="cstat-no" title="statement not covered" > return this.config;</span>
1196
- <span class="cstat-no" title="statement not covered" > }</span>
1197
- &nbsp;
1198
- <span class="fstat-no" title="function not covered" > get activeConversations_(): Map&lt;string, ConversationContext&gt; {</span>
1199
- <span class="cstat-no" title="statement not covered" > return this.activeConversations;</span>
1200
- <span class="cstat-no" title="statement not covered" > }</span>
1201
- &nbsp;
1202
- <span class="fstat-no" title="function not covered" > get claudeManager_(): ClaudeManager {</span>
1203
- <span class="cstat-no" title="statement not covered" > return this.claudeManager;</span>
1204
- <span class="cstat-no" title="statement not covered" > }</span>
1205
-
1206
- getRunnerId(): string | undefined {
1207
- return this.config.runnerId;
1208
- }
1209
- &nbsp;
1210
- // For testing purposes - allows mocking delays
1211
- setDelayFunction(fn: (ms: number) =&gt; Promise&lt;void&gt;): void {
1212
- this.delayFn = fn;
1213
- }
1214
- }</pre></td></tr></table></pre>
1215
-
1216
- <div class="push"></div>
1217
- <!-- for sticky footer -->
1218
- </div>
1219
- <!-- /wrapper -->
1220
- <div class="footer quiet pad2 space-top1 center small">
1221
- Code coverage generated by
1222
- <a
1223
- href="https://istanbul.js.org/"
1224
- target="_blank"
1225
- rel="noopener noreferrer"
1226
- >istanbul</a
1227
- >
1228
- at 2025-08-14T21:15:54.473Z
1229
- </div>
1230
- <script src="../prettify.js"></script>
1231
- <script>
1232
- window.onload = function () {
1233
- prettyPrint();
1234
- };
1235
- </script>
1236
- <script src="../sorter.js"></script>
1237
- <script src="../block-navigation.js"></script>
1238
- </body>
1239
- </html>