@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.
- package/package.json +2 -3
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/coverage-final.json +0 -12
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -176
- package/coverage/lib/index.html +0 -116
- package/coverage/lib/preload-script.js.html +0 -964
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/src/collections/index.html +0 -116
- package/coverage/src/collections/runner-messages.ts.html +0 -312
- package/coverage/src/components/claude-manager.ts.html +0 -1290
- package/coverage/src/components/index.html +0 -146
- package/coverage/src/components/message-handler.ts.html +0 -730
- package/coverage/src/components/repository-manager.ts.html +0 -841
- package/coverage/src/index.html +0 -131
- package/coverage/src/index.ts.html +0 -448
- package/coverage/src/runner.ts.html +0 -1239
- package/coverage/src/utils/config.ts.html +0 -780
- package/coverage/src/utils/console.ts.html +0 -121
- package/coverage/src/utils/index.html +0 -161
- package/coverage/src/utils/logger.ts.html +0 -475
- package/coverage/src/utils/status-line.ts.html +0 -445
- package/exceptions.log +0 -24
- package/lib/codex-sdk/src/codex.ts +0 -38
- package/lib/codex-sdk/src/codexOptions.ts +0 -10
- package/lib/codex-sdk/src/events.ts +0 -80
- package/lib/codex-sdk/src/exec.ts +0 -336
- package/lib/codex-sdk/src/index.ts +0 -39
- package/lib/codex-sdk/src/items.ts +0 -127
- package/lib/codex-sdk/src/outputSchemaFile.ts +0 -40
- package/lib/codex-sdk/src/thread.ts +0 -155
- package/lib/codex-sdk/src/threadOptions.ts +0 -18
- package/lib/codex-sdk/src/turnOptions.ts +0 -6
- package/lib/codex-sdk/tests/abort.test.ts +0 -165
- package/lib/codex-sdk/tests/codexExecSpy.ts +0 -37
- package/lib/codex-sdk/tests/responsesProxy.ts +0 -225
- package/lib/codex-sdk/tests/run.test.ts +0 -687
- package/lib/codex-sdk/tests/runStreamed.test.ts +0 -211
- package/lib/codex-sdk/tsconfig.json +0 -24
- package/rejections.log +0 -68
- package/runner.log +0 -488
- package/src/components/claude-sdk-manager.ts +0 -1425
- package/src/components/codex-sdk-manager.ts +0 -1358
- package/src/components/enhanced-repository-manager.ts +0 -823
- package/src/components/message-handler-sse.ts +0 -1097
- package/src/components/repository-manager.ts +0 -337
- package/src/index.ts +0 -168
- package/src/runner-sse.ts +0 -917
- package/src/services/RunnerAPIClient.ts +0 -175
- package/src/services/SSEClient.ts +0 -258
- package/src/types/claude.ts +0 -66
- package/src/types/computer-name.d.ts +0 -4
- package/src/types/index.ts +0 -64
- package/src/types/messages.ts +0 -39
- package/src/types/runner-interface.ts +0 -36
- package/src/utils/StateManager.ts +0 -187
- package/src/utils/config.ts +0 -327
- package/src/utils/console.ts +0 -15
- package/src/utils/debug.ts +0 -18
- package/src/utils/expand-env.ts +0 -22
- package/src/utils/logger.ts +0 -134
- package/src/utils/model.ts +0 -29
- package/src/utils/status-line.ts +0 -122
- package/src/utils/tool-response-sanitizer.ts +0 -160
- package/test-debug.sh +0 -26
- package/tests/retry-strategies.test.ts +0 -410
- package/tests/sdk-integration.test.ts +0 -329
- package/tests/sdk-streaming.test.ts +0 -1180
- package/tests/setup.ts +0 -5
- package/tests/test-claude-manager.ts +0 -120
- package/tests/tool-response-sanitizer.test.ts +0 -63
- package/tsconfig.json +0 -36
- 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"> </span>
|
|
490
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
549
|
-
<span class="cline-any cline-no"> </span>
|
|
550
|
-
<span class="cline-any cline-no"> </span>
|
|
551
|
-
<span class="cline-any cline-no"> </span>
|
|
552
|
-
<span class="cline-any cline-no"> </span>
|
|
553
|
-
<span class="cline-any cline-no"> </span>
|
|
554
|
-
<span class="cline-any cline-no"> </span>
|
|
555
|
-
<span class="cline-any cline-no"> </span>
|
|
556
|
-
<span class="cline-any cline-no"> </span>
|
|
557
|
-
<span class="cline-any cline-no"> </span>
|
|
558
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
563
|
-
<span class="cline-any cline-no"> </span>
|
|
564
|
-
<span class="cline-any cline-no"> </span>
|
|
565
|
-
<span class="cline-any cline-no"> </span>
|
|
566
|
-
<span class="cline-any cline-no"> </span>
|
|
567
|
-
<span class="cline-any cline-no"> </span>
|
|
568
|
-
<span class="cline-any cline-no"> </span>
|
|
569
|
-
<span class="cline-any cline-no"> </span>
|
|
570
|
-
<span class="cline-any cline-no"> </span>
|
|
571
|
-
<span class="cline-any cline-no"> </span>
|
|
572
|
-
<span class="cline-any cline-no"> </span>
|
|
573
|
-
<span class="cline-any cline-no"> </span>
|
|
574
|
-
<span class="cline-any cline-no"> </span>
|
|
575
|
-
<span class="cline-any cline-no"> </span>
|
|
576
|
-
<span class="cline-any cline-no"> </span>
|
|
577
|
-
<span class="cline-any cline-no"> </span>
|
|
578
|
-
<span class="cline-any cline-no"> </span>
|
|
579
|
-
<span class="cline-any cline-no"> </span>
|
|
580
|
-
<span class="cline-any cline-no"> </span>
|
|
581
|
-
<span class="cline-any cline-no"> </span>
|
|
582
|
-
<span class="cline-any cline-no"> </span>
|
|
583
|
-
<span class="cline-any cline-no"> </span>
|
|
584
|
-
<span class="cline-any cline-no"> </span>
|
|
585
|
-
<span class="cline-any cline-no"> </span>
|
|
586
|
-
<span class="cline-any cline-no"> </span>
|
|
587
|
-
<span class="cline-any cline-no"> </span>
|
|
588
|
-
<span class="cline-any cline-no"> </span>
|
|
589
|
-
<span class="cline-any cline-no"> </span>
|
|
590
|
-
<span class="cline-any cline-no"> </span>
|
|
591
|
-
<span class="cline-any cline-no"> </span>
|
|
592
|
-
<span class="cline-any cline-no"> </span>
|
|
593
|
-
<span class="cline-any cline-no"> </span>
|
|
594
|
-
<span class="cline-any cline-no"> </span>
|
|
595
|
-
<span class="cline-any cline-no"> </span>
|
|
596
|
-
<span class="cline-any cline-no"> </span>
|
|
597
|
-
<span class="cline-any cline-no"> </span>
|
|
598
|
-
<span class="cline-any cline-no"> </span>
|
|
599
|
-
<span class="cline-any cline-no"> </span>
|
|
600
|
-
<span class="cline-any cline-no"> </span>
|
|
601
|
-
<span class="cline-any cline-no"> </span>
|
|
602
|
-
<span class="cline-any cline-no"> </span>
|
|
603
|
-
<span class="cline-any cline-no"> </span>
|
|
604
|
-
<span class="cline-any cline-no"> </span>
|
|
605
|
-
<span class="cline-any cline-no"> </span>
|
|
606
|
-
<span class="cline-any cline-no"> </span>
|
|
607
|
-
<span class="cline-any cline-no"> </span>
|
|
608
|
-
<span class="cline-any cline-no"> </span>
|
|
609
|
-
<span class="cline-any cline-no"> </span>
|
|
610
|
-
<span class="cline-any cline-no"> </span>
|
|
611
|
-
<span class="cline-any cline-no"> </span>
|
|
612
|
-
<span class="cline-any cline-no"> </span>
|
|
613
|
-
<span class="cline-any cline-no"> </span>
|
|
614
|
-
<span class="cline-any cline-no"> </span>
|
|
615
|
-
<span class="cline-any cline-no"> </span>
|
|
616
|
-
<span class="cline-any cline-no"> </span>
|
|
617
|
-
<span class="cline-any cline-no"> </span>
|
|
618
|
-
<span class="cline-any cline-no"> </span>
|
|
619
|
-
<span class="cline-any cline-no"> </span>
|
|
620
|
-
<span class="cline-any cline-no"> </span>
|
|
621
|
-
<span class="cline-any cline-no"> </span>
|
|
622
|
-
<span class="cline-any cline-no"> </span>
|
|
623
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
627
|
-
<span class="cline-any cline-no"> </span>
|
|
628
|
-
<span class="cline-any cline-no"> </span>
|
|
629
|
-
<span class="cline-any cline-no"> </span>
|
|
630
|
-
<span class="cline-any cline-no"> </span>
|
|
631
|
-
<span class="cline-any cline-no"> </span>
|
|
632
|
-
<span class="cline-any cline-no"> </span>
|
|
633
|
-
<span class="cline-any cline-no"> </span>
|
|
634
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
638
|
-
<span class="cline-any cline-no"> </span>
|
|
639
|
-
<span class="cline-any cline-no"> </span>
|
|
640
|
-
<span class="cline-any cline-no"> </span>
|
|
641
|
-
<span class="cline-any cline-no"> </span>
|
|
642
|
-
<span class="cline-any cline-no"> </span>
|
|
643
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
647
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
666
|
-
<span class="cline-any cline-no"> </span>
|
|
667
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
743
|
-
<span class="cline-any cline-no"> </span>
|
|
744
|
-
<span class="cline-any cline-no"> </span>
|
|
745
|
-
<span class="cline-any cline-no"> </span>
|
|
746
|
-
<span class="cline-any cline-no"> </span>
|
|
747
|
-
<span class="cline-any cline-no"> </span>
|
|
748
|
-
<span class="cline-any cline-no"> </span>
|
|
749
|
-
<span class="cline-any cline-no"> </span>
|
|
750
|
-
<span class="cline-any cline-no"> </span>
|
|
751
|
-
<span class="cline-any cline-no"> </span>
|
|
752
|
-
<span class="cline-any cline-no"> </span>
|
|
753
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
774
|
-
<span class="cline-any cline-no"> </span>
|
|
775
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
787
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
796
|
-
<span class="cline-any cline-no"> </span>
|
|
797
|
-
<span class="cline-any cline-no"> </span>
|
|
798
|
-
<span class="cline-any cline-no"> </span>
|
|
799
|
-
<span class="cline-any cline-no"> </span>
|
|
800
|
-
<span class="cline-any cline-no"> </span>
|
|
801
|
-
<span class="cline-any cline-no"> </span>
|
|
802
|
-
<span class="cline-any cline-no"> </span>
|
|
803
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
812
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
816
|
-
<span class="cline-any cline-no"> </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"> </span>
|
|
820
|
-
<span class="cline-any cline-no"> </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
|
-
|
|
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
|
-
|
|
841
|
-
const logger = createLogger("RunnerApp");
|
|
842
|
-
|
|
843
|
-
export class RunnerApp {
|
|
844
|
-
private messageHandler!: MessageHandler;
|
|
845
|
-
private claudeManager!: ClaudeManager;
|
|
846
|
-
private repositoryManager!: RepositoryManager;
|
|
847
|
-
private activeConversations: Map<string, ConversationContext>;
|
|
848
|
-
private config: RunnerConfig;
|
|
849
|
-
private heartbeatInterval?: NodeJS.Timeout;
|
|
850
|
-
private isRunning: boolean = false;
|
|
851
|
-
private isRegistered: boolean = false;
|
|
852
|
-
private delayFn: (ms: number) => Promise<void> = <span class="fstat-no" title="function not covered" >(ms) => new Promise(resolve => setTimeout(resolve, ms));</span>
|
|
853
|
-
|
|
854
|
-
constructor(config: RunnerConfig) {
|
|
855
|
-
this.config = config;
|
|
856
|
-
this.activeConversations = new Map();
|
|
857
|
-
this.initializeComponents();
|
|
858
|
-
}
|
|
859
|
-
|
|
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
|
-
|
|
871
|
-
async start(): Promise<void> {
|
|
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
|
-
|
|
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
|
-
|
|
895
|
-
async stop(): Promise<void> {
|
|
896
|
-
if (!this.isRunning) {
|
|
897
|
-
return;
|
|
898
|
-
}
|
|
899
|
-
|
|
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
|
-
|
|
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
|
-
|
|
923
|
-
async notify(method: string, params: any): Promise<void> {
|
|
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
|
-
|
|
945
|
-
<span class="fstat-no" title="function not covered" > async sendToOrchestrator(message: JsonRpcMessage): Promise<any> {</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 <= 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<string, string> = {</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 && 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 => 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1033
|
-
private async registerRunner(): Promise<void> {
|
|
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<void> {
|
|
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 >= maxDurationMs) {
|
|
1123
|
-
// Final retry at max duration
|
|
1124
|
-
const remainingMs = maxDurationMs - elapsedMs;
|
|
1125
|
-
if (remainingMs > 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
|
-
|
|
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 () => {
|
|
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
|
-
|
|
1175
|
-
private async stopAllConversations(): Promise<void> {
|
|
1176
|
-
const stopPromises: Promise<void>[] = [];
|
|
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 => {</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
|
-
|
|
1189
|
-
await Promise.all(stopPromises);
|
|
1190
|
-
this.activeConversations.clear();
|
|
1191
|
-
}
|
|
1192
|
-
|
|
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
|
-
|
|
1198
|
-
<span class="fstat-no" title="function not covered" > get activeConversations_(): Map<string, ConversationContext> {</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
|
-
|
|
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
|
-
|
|
1210
|
-
// For testing purposes - allows mocking delays
|
|
1211
|
-
setDelayFunction(fn: (ms: number) => Promise<void>): 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>
|