@northflare/runner 0.0.12 → 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 (77) hide show
  1. package/package.json +2 -3
  2. package/coverage/base.css +0 -224
  3. package/coverage/block-navigation.js +0 -87
  4. package/coverage/coverage-final.json +0 -12
  5. package/coverage/favicon.png +0 -0
  6. package/coverage/index.html +0 -176
  7. package/coverage/lib/index.html +0 -116
  8. package/coverage/lib/preload-script.js.html +0 -964
  9. package/coverage/prettify.css +0 -1
  10. package/coverage/prettify.js +0 -2
  11. package/coverage/sort-arrow-sprite.png +0 -0
  12. package/coverage/sorter.js +0 -196
  13. package/coverage/src/collections/index.html +0 -116
  14. package/coverage/src/collections/runner-messages.ts.html +0 -312
  15. package/coverage/src/components/claude-manager.ts.html +0 -1290
  16. package/coverage/src/components/index.html +0 -146
  17. package/coverage/src/components/message-handler.ts.html +0 -730
  18. package/coverage/src/components/repository-manager.ts.html +0 -841
  19. package/coverage/src/index.html +0 -131
  20. package/coverage/src/index.ts.html +0 -448
  21. package/coverage/src/runner.ts.html +0 -1239
  22. package/coverage/src/utils/config.ts.html +0 -780
  23. package/coverage/src/utils/console.ts.html +0 -121
  24. package/coverage/src/utils/index.html +0 -161
  25. package/coverage/src/utils/logger.ts.html +0 -475
  26. package/coverage/src/utils/status-line.ts.html +0 -445
  27. package/exceptions.log +0 -24
  28. package/lib/codex-sdk/src/codex.ts +0 -38
  29. package/lib/codex-sdk/src/codexOptions.ts +0 -10
  30. package/lib/codex-sdk/src/events.ts +0 -80
  31. package/lib/codex-sdk/src/exec.ts +0 -336
  32. package/lib/codex-sdk/src/index.ts +0 -39
  33. package/lib/codex-sdk/src/items.ts +0 -127
  34. package/lib/codex-sdk/src/outputSchemaFile.ts +0 -40
  35. package/lib/codex-sdk/src/thread.ts +0 -155
  36. package/lib/codex-sdk/src/threadOptions.ts +0 -18
  37. package/lib/codex-sdk/src/turnOptions.ts +0 -6
  38. package/lib/codex-sdk/tests/abort.test.ts +0 -165
  39. package/lib/codex-sdk/tests/codexExecSpy.ts +0 -37
  40. package/lib/codex-sdk/tests/responsesProxy.ts +0 -225
  41. package/lib/codex-sdk/tests/run.test.ts +0 -687
  42. package/lib/codex-sdk/tests/runStreamed.test.ts +0 -211
  43. package/lib/codex-sdk/tsconfig.json +0 -24
  44. package/rejections.log +0 -68
  45. package/runner.log +0 -488
  46. package/src/components/claude-sdk-manager.ts +0 -1425
  47. package/src/components/codex-sdk-manager.ts +0 -1358
  48. package/src/components/enhanced-repository-manager.ts +0 -823
  49. package/src/components/message-handler-sse.ts +0 -1097
  50. package/src/components/repository-manager.ts +0 -337
  51. package/src/index.ts +0 -168
  52. package/src/runner-sse.ts +0 -917
  53. package/src/services/RunnerAPIClient.ts +0 -175
  54. package/src/services/SSEClient.ts +0 -258
  55. package/src/types/claude.ts +0 -66
  56. package/src/types/computer-name.d.ts +0 -4
  57. package/src/types/index.ts +0 -64
  58. package/src/types/messages.ts +0 -39
  59. package/src/types/runner-interface.ts +0 -36
  60. package/src/utils/StateManager.ts +0 -187
  61. package/src/utils/config.ts +0 -327
  62. package/src/utils/console.ts +0 -15
  63. package/src/utils/debug.ts +0 -18
  64. package/src/utils/expand-env.ts +0 -22
  65. package/src/utils/logger.ts +0 -134
  66. package/src/utils/model.ts +0 -29
  67. package/src/utils/status-line.ts +0 -122
  68. package/src/utils/tool-response-sanitizer.ts +0 -160
  69. package/test-debug.sh +0 -26
  70. package/tests/retry-strategies.test.ts +0 -410
  71. package/tests/sdk-integration.test.ts +0 -329
  72. package/tests/sdk-streaming.test.ts +0 -1180
  73. package/tests/setup.ts +0 -5
  74. package/tests/test-claude-manager.ts +0 -120
  75. package/tests/tool-response-sanitizer.test.ts +0 -63
  76. package/tsconfig.json +0 -36
  77. 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>