@northflare/runner 0.0.1

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 (154) hide show
  1. package/DEBUG_LOGGING.md +60 -0
  2. package/LICENSE +21 -0
  3. package/MIGRATION_PLAN.md +52 -0
  4. package/README.md +220 -0
  5. package/SDK_IMPLEMENTATION_GUIDE.md +1036 -0
  6. package/bin/northflare-runner +367 -0
  7. package/coverage/base.css +224 -0
  8. package/coverage/block-navigation.js +87 -0
  9. package/coverage/coverage-final.json +12 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +176 -0
  12. package/coverage/lib/index.html +116 -0
  13. package/coverage/lib/preload-script.js.html +964 -0
  14. package/coverage/prettify.css +1 -0
  15. package/coverage/prettify.js +2 -0
  16. package/coverage/sort-arrow-sprite.png +0 -0
  17. package/coverage/sorter.js +196 -0
  18. package/coverage/src/collections/index.html +116 -0
  19. package/coverage/src/collections/runner-messages.ts.html +312 -0
  20. package/coverage/src/components/claude-manager.ts.html +1290 -0
  21. package/coverage/src/components/index.html +146 -0
  22. package/coverage/src/components/message-handler.ts.html +730 -0
  23. package/coverage/src/components/repository-manager.ts.html +841 -0
  24. package/coverage/src/index.html +131 -0
  25. package/coverage/src/index.ts.html +448 -0
  26. package/coverage/src/runner.ts.html +1239 -0
  27. package/coverage/src/utils/config.ts.html +780 -0
  28. package/coverage/src/utils/console.ts.html +121 -0
  29. package/coverage/src/utils/index.html +161 -0
  30. package/coverage/src/utils/logger.ts.html +475 -0
  31. package/coverage/src/utils/status-line.ts.html +445 -0
  32. package/dist/collections/runner-messages.d.ts +52 -0
  33. package/dist/collections/runner-messages.d.ts.map +1 -0
  34. package/dist/collections/runner-messages.js +161 -0
  35. package/dist/collections/runner-messages.js.map +1 -0
  36. package/dist/components/claude-manager.d.ts +39 -0
  37. package/dist/components/claude-manager.d.ts.map +1 -0
  38. package/dist/components/claude-manager.js +783 -0
  39. package/dist/components/claude-manager.js.map +1 -0
  40. package/dist/components/claude-sdk-manager.d.ts +47 -0
  41. package/dist/components/claude-sdk-manager.d.ts.map +1 -0
  42. package/dist/components/claude-sdk-manager.js +1088 -0
  43. package/dist/components/claude-sdk-manager.js.map +1 -0
  44. package/dist/components/enhanced-repository-manager.d.ts +134 -0
  45. package/dist/components/enhanced-repository-manager.d.ts.map +1 -0
  46. package/dist/components/enhanced-repository-manager.js +602 -0
  47. package/dist/components/enhanced-repository-manager.js.map +1 -0
  48. package/dist/components/message-handler-sse.d.ts +46 -0
  49. package/dist/components/message-handler-sse.d.ts.map +1 -0
  50. package/dist/components/message-handler-sse.js +734 -0
  51. package/dist/components/message-handler-sse.js.map +1 -0
  52. package/dist/components/message-handler.d.ts +35 -0
  53. package/dist/components/message-handler.d.ts.map +1 -0
  54. package/dist/components/message-handler.js +689 -0
  55. package/dist/components/message-handler.js.map +1 -0
  56. package/dist/components/repository-manager.d.ts +51 -0
  57. package/dist/components/repository-manager.d.ts.map +1 -0
  58. package/dist/components/repository-manager.js +295 -0
  59. package/dist/components/repository-manager.js.map +1 -0
  60. package/dist/index.d.ts +9 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +166 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/runner-sse.d.ts +57 -0
  65. package/dist/runner-sse.d.ts.map +1 -0
  66. package/dist/runner-sse.js +698 -0
  67. package/dist/runner-sse.js.map +1 -0
  68. package/dist/runner.d.ts +51 -0
  69. package/dist/runner.d.ts.map +1 -0
  70. package/dist/runner.js +530 -0
  71. package/dist/runner.js.map +1 -0
  72. package/dist/services/RunnerAPIClient.d.ts +30 -0
  73. package/dist/services/RunnerAPIClient.d.ts.map +1 -0
  74. package/dist/services/RunnerAPIClient.js +112 -0
  75. package/dist/services/RunnerAPIClient.js.map +1 -0
  76. package/dist/services/SSEClient.d.ts +60 -0
  77. package/dist/services/SSEClient.d.ts.map +1 -0
  78. package/dist/services/SSEClient.js +204 -0
  79. package/dist/services/SSEClient.js.map +1 -0
  80. package/dist/types/claude.d.ts +45 -0
  81. package/dist/types/claude.d.ts.map +1 -0
  82. package/dist/types/claude.js +6 -0
  83. package/dist/types/claude.js.map +1 -0
  84. package/dist/types/index.d.ts +47 -0
  85. package/dist/types/index.d.ts.map +1 -0
  86. package/dist/types/index.js +23 -0
  87. package/dist/types/index.js.map +1 -0
  88. package/dist/types/messages.d.ts +31 -0
  89. package/dist/types/messages.d.ts.map +1 -0
  90. package/dist/types/messages.js +6 -0
  91. package/dist/types/messages.js.map +1 -0
  92. package/dist/types/runner-interface.d.ts +24 -0
  93. package/dist/types/runner-interface.d.ts.map +1 -0
  94. package/dist/types/runner-interface.js +6 -0
  95. package/dist/types/runner-interface.js.map +1 -0
  96. package/dist/utils/StateManager.d.ts +52 -0
  97. package/dist/utils/StateManager.d.ts.map +1 -0
  98. package/dist/utils/StateManager.js +162 -0
  99. package/dist/utils/StateManager.js.map +1 -0
  100. package/dist/utils/config.d.ts +41 -0
  101. package/dist/utils/config.d.ts.map +1 -0
  102. package/dist/utils/config.js +250 -0
  103. package/dist/utils/config.js.map +1 -0
  104. package/dist/utils/console.d.ts +11 -0
  105. package/dist/utils/console.d.ts.map +1 -0
  106. package/dist/utils/console.js +15 -0
  107. package/dist/utils/console.js.map +1 -0
  108. package/dist/utils/expand-env.d.ts +2 -0
  109. package/dist/utils/expand-env.d.ts.map +1 -0
  110. package/dist/utils/expand-env.js +20 -0
  111. package/dist/utils/expand-env.js.map +1 -0
  112. package/dist/utils/logger.d.ts +9 -0
  113. package/dist/utils/logger.d.ts.map +1 -0
  114. package/dist/utils/logger.js +108 -0
  115. package/dist/utils/logger.js.map +1 -0
  116. package/dist/utils/status-line.d.ts +37 -0
  117. package/dist/utils/status-line.d.ts.map +1 -0
  118. package/dist/utils/status-line.js +113 -0
  119. package/dist/utils/status-line.js.map +1 -0
  120. package/docs/claude-manager.md +91 -0
  121. package/exceptions.log +22 -0
  122. package/lib/preload-script.js +293 -0
  123. package/package.json +55 -0
  124. package/rejections.log +63 -0
  125. package/runner.log +488 -0
  126. package/src/components/claude-sdk-manager.ts +1354 -0
  127. package/src/components/enhanced-repository-manager.ts +823 -0
  128. package/src/components/message-handler-sse.ts +1011 -0
  129. package/src/components/repository-manager.ts +337 -0
  130. package/src/index.ts +166 -0
  131. package/src/runner-sse.ts +847 -0
  132. package/src/services/RunnerAPIClient.ts +135 -0
  133. package/src/services/SSEClient.ts +258 -0
  134. package/src/types/claude.ts +55 -0
  135. package/src/types/computer-name.d.ts +4 -0
  136. package/src/types/index.ts +63 -0
  137. package/src/types/messages.ts +39 -0
  138. package/src/types/runner-interface.ts +34 -0
  139. package/src/utils/StateManager.ts +187 -0
  140. package/src/utils/codex-sdk.js +448 -0
  141. package/src/utils/config.ts +315 -0
  142. package/src/utils/console.ts +13 -0
  143. package/src/utils/expand-env.ts +22 -0
  144. package/src/utils/logger.ts +131 -0
  145. package/src/utils/sdk-demo.js +34 -0
  146. package/src/utils/status-line.ts +121 -0
  147. package/test-debug.sh +26 -0
  148. package/tests/retry-strategies.test.ts +410 -0
  149. package/tests/sdk-integration.test.ts +329 -0
  150. package/tests/sdk-streaming.test.ts +1180 -0
  151. package/tests/setup.ts +5 -0
  152. package/tests/test-claude-manager.ts +120 -0
  153. package/tsconfig.json +36 -0
  154. package/vitest.config.ts +27 -0
@@ -0,0 +1,730 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/components/message-handler.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/components</a> message-handler.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">57.87% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>125/216</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">43.75% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>7/16</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">50% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>7/14</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">57.87% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>125/216</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line medium'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
282
+ <span class="cline-any cline-yes">1x</span>
283
+ <span class="cline-any cline-yes">1x</span>
284
+ <span class="cline-any cline-yes">1x</span>
285
+ <span class="cline-any cline-yes">1x</span>
286
+ <span class="cline-any cline-yes">1x</span>
287
+ <span class="cline-any cline-yes">1x</span>
288
+ <span class="cline-any cline-yes">1x</span>
289
+ <span class="cline-any cline-yes">1x</span>
290
+ <span class="cline-any cline-yes">1x</span>
291
+ <span class="cline-any cline-yes">1x</span>
292
+ <span class="cline-any cline-yes">6x</span>
293
+ <span class="cline-any cline-yes">6x</span>
294
+ <span class="cline-any cline-yes">6x</span>
295
+ <span class="cline-any cline-yes">6x</span>
296
+ <span class="cline-any cline-yes">6x</span>
297
+ <span class="cline-any cline-yes">6x</span>
298
+ <span class="cline-any cline-yes">6x</span>
299
+ <span class="cline-any cline-yes">6x</span>
300
+ <span class="cline-any cline-yes">6x</span>
301
+ <span class="cline-any cline-yes">6x</span>
302
+ <span class="cline-any cline-yes">6x</span>
303
+ <span class="cline-any cline-yes">6x</span>
304
+ <span class="cline-any cline-yes">6x</span>
305
+ <span class="cline-any cline-yes">6x</span>
306
+ <span class="cline-any cline-yes">6x</span>
307
+ <span class="cline-any cline-yes">6x</span>
308
+ <span class="cline-any cline-yes">6x</span>
309
+ <span class="cline-any cline-yes">6x</span>
310
+ <span class="cline-any cline-yes">6x</span>
311
+ <span class="cline-any cline-yes">6x</span>
312
+ <span class="cline-any cline-yes">6x</span>
313
+ <span class="cline-any cline-yes">6x</span>
314
+ <span class="cline-any cline-yes">6x</span>
315
+ <span class="cline-any cline-no">&nbsp;</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
324
+ <span class="cline-any cline-no">&nbsp;</span>
325
+ <span class="cline-any cline-no">&nbsp;</span>
326
+ <span class="cline-any cline-no">&nbsp;</span>
327
+ <span class="cline-any cline-yes">6x</span>
328
+ <span class="cline-any cline-yes">6x</span>
329
+ <span class="cline-any cline-no">&nbsp;</span>
330
+ <span class="cline-any cline-no">&nbsp;</span>
331
+ <span class="cline-any cline-no">&nbsp;</span>
332
+ <span class="cline-any cline-no">&nbsp;</span>
333
+ <span class="cline-any cline-no">&nbsp;</span>
334
+ <span class="cline-any cline-no">&nbsp;</span>
335
+ <span class="cline-any cline-no">&nbsp;</span>
336
+ <span class="cline-any cline-no">&nbsp;</span>
337
+ <span class="cline-any cline-no">&nbsp;</span>
338
+ <span class="cline-any cline-no">&nbsp;</span>
339
+ <span class="cline-any cline-no">&nbsp;</span>
340
+ <span class="cline-any cline-yes">6x</span>
341
+ <span class="cline-any cline-yes">6x</span>
342
+ <span class="cline-any cline-no">&nbsp;</span>
343
+ <span class="cline-any cline-no">&nbsp;</span>
344
+ <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-no">&nbsp;</span>
346
+ <span class="cline-any cline-no">&nbsp;</span>
347
+ <span class="cline-any cline-no">&nbsp;</span>
348
+ <span class="cline-any cline-no">&nbsp;</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-no">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-no">&nbsp;</span>
354
+ <span class="cline-any cline-no">&nbsp;</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-no">&nbsp;</span>
359
+ <span class="cline-any cline-no">&nbsp;</span>
360
+ <span class="cline-any cline-no">&nbsp;</span>
361
+ <span class="cline-any cline-no">&nbsp;</span>
362
+ <span class="cline-any cline-no">&nbsp;</span>
363
+ <span class="cline-any cline-yes">6x</span>
364
+ <span class="cline-any cline-yes">6x</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-no">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-no">&nbsp;</span>
371
+ <span class="cline-any cline-no">&nbsp;</span>
372
+ <span class="cline-any cline-no">&nbsp;</span>
373
+ <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-no">&nbsp;</span>
375
+ <span class="cline-any cline-yes">6x</span>
376
+ <span class="cline-any cline-yes">6x</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-no">&nbsp;</span>
379
+ <span class="cline-any cline-no">&nbsp;</span>
380
+ <span class="cline-any cline-no">&nbsp;</span>
381
+ <span class="cline-any cline-no">&nbsp;</span>
382
+ <span class="cline-any cline-no">&nbsp;</span>
383
+ <span class="cline-any cline-no">&nbsp;</span>
384
+ <span class="cline-any cline-no">&nbsp;</span>
385
+ <span class="cline-any cline-no">&nbsp;</span>
386
+ <span class="cline-any cline-no">&nbsp;</span>
387
+ <span class="cline-any cline-no">&nbsp;</span>
388
+ <span class="cline-any cline-yes">6x</span>
389
+ <span class="cline-any cline-yes">6x</span>
390
+ <span class="cline-any cline-yes">1x</span>
391
+ <span class="cline-any cline-yes">1x</span>
392
+ <span class="cline-any cline-yes">1x</span>
393
+ <span class="cline-any cline-yes">1x</span>
394
+ <span class="cline-any cline-yes">1x</span>
395
+ <span class="cline-any cline-yes">1x</span>
396
+ <span class="cline-any cline-yes">1x</span>
397
+ <span class="cline-any cline-yes">1x</span>
398
+ <span class="cline-any cline-yes">1x</span>
399
+ <span class="cline-any cline-yes">1x</span>
400
+ <span class="cline-any cline-yes">1x</span>
401
+ <span class="cline-any cline-yes">1x</span>
402
+ <span class="cline-any cline-yes">1x</span>
403
+ <span class="cline-any cline-yes">1x</span>
404
+ <span class="cline-any cline-yes">1x</span>
405
+ <span class="cline-any cline-yes">6x</span>
406
+ <span class="cline-any cline-yes">6x</span>
407
+ <span class="cline-any cline-yes">6x</span>
408
+ <span class="cline-any cline-yes">6x</span>
409
+ <span class="cline-any cline-yes">6x</span>
410
+ <span class="cline-any cline-yes">6x</span>
411
+ <span class="cline-any cline-yes">6x</span>
412
+ <span class="cline-any cline-yes">6x</span>
413
+ <span class="cline-any cline-yes">6x</span>
414
+ <span class="cline-any cline-yes">6x</span>
415
+ <span class="cline-any cline-yes">6x</span>
416
+ <span class="cline-any cline-yes">6x</span>
417
+ <span class="cline-any cline-yes">6x</span>
418
+ <span class="cline-any cline-yes">1x</span>
419
+ <span class="cline-any cline-yes">1x</span>
420
+ <span class="cline-any cline-yes">1x</span>
421
+ <span class="cline-any cline-yes">1x</span>
422
+ <span class="cline-any cline-yes">1x</span>
423
+ <span class="cline-any cline-yes">1x</span>
424
+ <span class="cline-any cline-yes">1x</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
427
+ <span class="cline-any cline-yes">1x</span>
428
+ <span class="cline-any cline-yes">1x</span>
429
+ <span class="cline-any cline-yes">1x</span>
430
+ <span class="cline-any cline-yes">1x</span>
431
+ <span class="cline-any cline-yes">1x</span>
432
+ <span class="cline-any cline-yes">1x</span>
433
+ <span class="cline-any cline-yes">1x</span>
434
+ <span class="cline-any cline-yes">1x</span>
435
+ <span class="cline-any cline-yes">1x</span>
436
+ <span class="cline-any cline-yes">1x</span>
437
+ <span class="cline-any cline-yes">1x</span>
438
+ <span class="cline-any cline-yes">1x</span>
439
+ <span class="cline-any cline-yes">1x</span>
440
+ <span class="cline-any cline-yes">1x</span>
441
+ <span class="cline-any cline-yes">1x</span>
442
+ <span class="cline-any cline-yes">1x</span>
443
+ <span class="cline-any cline-yes">1x</span>
444
+ <span class="cline-any cline-yes">1x</span>
445
+ <span class="cline-any cline-yes">1x</span>
446
+ <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">6x</span>
451
+ <span class="cline-any cline-yes">6x</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-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</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">1x</span>
461
+ <span class="cline-any cline-yes">1x</span>
462
+ <span class="cline-any cline-yes">1x</span>
463
+ <span class="cline-any cline-yes">1x</span>
464
+ <span class="cline-any cline-yes">1x</span>
465
+ <span class="cline-any cline-yes">1x</span>
466
+ <span class="cline-any cline-yes">1x</span>
467
+ <span class="cline-any cline-yes">1x</span>
468
+ <span class="cline-any cline-yes">1x</span>
469
+ <span class="cline-any cline-no">&nbsp;</span>
470
+ <span class="cline-any cline-no">&nbsp;</span>
471
+ <span class="cline-any cline-yes">1x</span>
472
+ <span class="cline-any cline-yes">6x</span>
473
+ <span class="cline-any cline-yes">6x</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-no">&nbsp;</span>
476
+ <span class="cline-any cline-no">&nbsp;</span>
477
+ <span class="cline-any cline-no">&nbsp;</span>
478
+ <span class="cline-any cline-no">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-no">&nbsp;</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-no">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-yes">6x</span>
487
+ <span class="cline-any cline-yes">6x</span>
488
+ <span class="cline-any cline-no">&nbsp;</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-no">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
+ <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-yes">6x</span></td><td class="text"><pre class="prettyprint lang-js">/**
497
+ * MessageHandler - Processes incoming JSONRPC messages from the orchestrator via Tanstack DB collections
498
+ */
499
+ &nbsp;
500
+ import { RunnerApp } from "../runner";
501
+ import { RunnerMessage, MethodHandler, ConversationContext, ConversationConfig } from "../types";
502
+ import { createRunnerMessagesCollection } from "../collections/runner-messages";
503
+ import { statusLineManager } from "../utils/status-line";
504
+ import { console } from "../utils/console";
505
+ &nbsp;
506
+ export class MessageHandler {
507
+ private messagesCollection: any; // Collection type from Tanstack DB
508
+ private methodHandlers: Map&lt;string, MethodHandler&gt;;
509
+ private runner: RunnerApp;
510
+ private processingSubscription?: () =&gt; void;
511
+ private processedMessages: Set&lt;string&gt; = new Set();
512
+ &nbsp;
513
+ constructor(runner: RunnerApp) {
514
+ this.runner = runner;
515
+ this.methodHandlers = new Map();
516
+ this.initializeCollection();
517
+ this.registerHandlers();
518
+ }
519
+ &nbsp;
520
+ private initializeCollection(): void {
521
+ console.log("Initializing Tanstack DB collection for runnerMessages");
522
+
523
+ // Create the collection with ElectricSQL integration
524
+ this.messagesCollection = createRunnerMessagesCollection(
525
+ this.runner.config_
526
+ );
527
+ }
528
+ &nbsp;
529
+ <span class="fstat-no" title="function not covered" > async startProcessing(): Promise&lt;void&gt; {</span>
530
+ <span class="cstat-no" title="statement not covered" > console.log("MessageHandler: Starting message processing...");</span>
531
+ <span class="cstat-no" title="statement not covered" > </span>
532
+ <span class="cstat-no" title="statement not covered" > // Poll for messages periodically</span>
533
+ <span class="cstat-no" title="statement not covered" > setInterval(() =&gt; {</span>
534
+ <span class="cstat-no" title="statement not covered" > const messages = Array.from(this.messagesCollection.state?.values() || []) as RunnerMessage[];</span>
535
+ <span class="cstat-no" title="statement not covered" > const unprocessed = messages</span>
536
+ <span class="cstat-no" title="statement not covered" > .filter((msg) =&gt; msg.direction === "to_runner" &amp;&amp; !msg.processedAt &amp;&amp; !this.processedMessages.has(msg.id))</span>
537
+ <span class="cstat-no" title="statement not covered" > .sort((a, b) =&gt; new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());</span>
538
+ <span class="cstat-no" title="statement not covered" ></span>
539
+ <span class="cstat-no" title="statement not covered" > unprocessed.forEach((msg) =&gt; this.processMessage(msg));</span>
540
+ <span class="cstat-no" title="statement not covered" > }, 1000); // Check every second</span>
541
+ <span class="cstat-no" title="statement not covered" > }</span>
542
+ &nbsp;
543
+ <span class="fstat-no" title="function not covered" > async stopProcessing(): Promise&lt;void&gt; {</span>
544
+ <span class="cstat-no" title="statement not covered" > console.log("MessageHandler: Stopping message processing...");</span>
545
+ <span class="cstat-no" title="statement not covered" > </span>
546
+ <span class="cstat-no" title="statement not covered" > // Unsubscribe from collection updates</span>
547
+ <span class="cstat-no" title="statement not covered" > if (this.processingSubscription) {</span>
548
+ <span class="cstat-no" title="statement not covered" > this.processingSubscription();</span>
549
+ <span class="cstat-no" title="statement not covered" > this.processingSubscription = undefined;</span>
550
+ <span class="cstat-no" title="statement not covered" > }</span>
551
+ <span class="cstat-no" title="statement not covered" > </span>
552
+ <span class="cstat-no" title="statement not covered" > // Clear processed messages tracking</span>
553
+ <span class="cstat-no" title="statement not covered" > this.processedMessages.clear();</span>
554
+ <span class="cstat-no" title="statement not covered" > }</span>
555
+ &nbsp;
556
+ <span class="fstat-no" title="function not covered" > private async processMessage(message: RunnerMessage): Promise&lt;void&gt; {</span>
557
+ <span class="cstat-no" title="statement not covered" > const { method, params } = message.payload;</span>
558
+ <span class="cstat-no" title="statement not covered" > </span>
559
+ <span class="cstat-no" title="statement not covered" > if (!method) {</span>
560
+ <span class="cstat-no" title="statement not covered" > await this.sendError(message, "Missing method in message payload");</span>
561
+ <span class="cstat-no" title="statement not covered" > return;</span>
562
+ <span class="cstat-no" title="statement not covered" > }</span>
563
+ <span class="cstat-no" title="statement not covered" > </span>
564
+ <span class="cstat-no" title="statement not covered" > const handler = this.methodHandlers.get(method);</span>
565
+ <span class="cstat-no" title="statement not covered" ></span>
566
+ <span class="cstat-no" title="statement not covered" > if (!handler) {</span>
567
+ <span class="cstat-no" title="statement not covered" > await this.sendError(message, `Unknown method: ${method}`);</span>
568
+ <span class="cstat-no" title="statement not covered" > return;</span>
569
+ <span class="cstat-no" title="statement not covered" > }</span>
570
+ <span class="cstat-no" title="statement not covered" ></span>
571
+ <span class="cstat-no" title="statement not covered" > try {</span>
572
+ <span class="cstat-no" title="statement not covered" > await handler(params, message);</span>
573
+ <span class="cstat-no" title="statement not covered" > await this.markProcessed(message.id);</span>
574
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
575
+ <span class="cstat-no" title="statement not covered" > await this.handleError(message, error);</span>
576
+ <span class="cstat-no" title="statement not covered" > }</span>
577
+ <span class="cstat-no" title="statement not covered" > }</span>
578
+ &nbsp;
579
+ <span class="fstat-no" title="function not covered" > private async markProcessed(messageId: string): Promise&lt;void&gt; {</span>
580
+ <span class="cstat-no" title="statement not covered" > // Track processed messages internally</span>
581
+ <span class="cstat-no" title="statement not covered" > this.processedMessages.add(messageId);</span>
582
+ <span class="cstat-no" title="statement not covered" > </span>
583
+ <span class="cstat-no" title="statement not covered" > // Update the processedAt field in the database</span>
584
+ <span class="cstat-no" title="statement not covered" > try {</span>
585
+ <span class="cstat-no" title="statement not covered" > await this.messagesCollection.markProcessed(messageId);</span>
586
+ <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
587
+ <span class="cstat-no" title="statement not covered" > console.error(`Failed to mark message ${messageId} as processed:`, error);</span>
588
+ <span class="cstat-no" title="statement not covered" > }</span>
589
+ <span class="cstat-no" title="statement not covered" > }</span>
590
+ &nbsp;
591
+ <span class="fstat-no" title="function not covered" > private async sendError(message: RunnerMessage, errorMessage: string): Promise&lt;void&gt; {</span>
592
+ <span class="cstat-no" title="statement not covered" > await this.runner.notify("error.report", {</span>
593
+ <span class="cstat-no" title="statement not covered" > taskId: message.taskId,</span>
594
+ <span class="cstat-no" title="statement not covered" > messageId: message.id,</span>
595
+ <span class="cstat-no" title="statement not covered" > errorType: "method_error",</span>
596
+ <span class="cstat-no" title="statement not covered" > message: errorMessage,</span>
597
+ <span class="cstat-no" title="statement not covered" > details: {</span>
598
+ <span class="cstat-no" title="statement not covered" > originalMessage: message,</span>
599
+ <span class="cstat-no" title="statement not covered" > timestamp: new Date(),</span>
600
+ <span class="cstat-no" title="statement not covered" > },</span>
601
+ <span class="cstat-no" title="statement not covered" > });</span>
602
+ <span class="cstat-no" title="statement not covered" > }</span>
603
+ &nbsp;
604
+ private async handleError(message: RunnerMessage, error: any): Promise&lt;void&gt; {
605
+ const errorMessage = error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >message : String(error);</span>
606
+ const errorStack = error instanceof Error ? error.<span class="branch-0 cbranch-no" title="branch not covered" >stack : undefined;</span>
607
+
608
+ await this.runner.notify("error.report", {
609
+ taskId: message.taskId,
610
+ messageId: message.id,
611
+ errorType: "processing_error",
612
+ message: errorMessage,
613
+ details: {
614
+ stack: errorStack,
615
+ originalMessage: message,
616
+ timestamp: new Date(),
617
+ },
618
+ });
619
+ }
620
+ &nbsp;
621
+ private registerHandlers(): void {
622
+ console.log("MessageHandler: Registering handlers...");
623
+
624
+ this.methodHandlers = new Map([
625
+ ["conversation.start", this.handleConversationStart.bind(this)],
626
+ ["conversation.stop", this.handleConversationStop.bind(this)],
627
+ ["conversation.resume", this.handleConversationResume.bind(this)],
628
+ ["message.user", this.handleUserMessage.bind(this)],
629
+ ]);
630
+ }
631
+ &nbsp;
632
+ private async handleConversationStart(
633
+ params: any,
634
+ _message: RunnerMessage
635
+ ): Promise&lt;void&gt; {
636
+ const { taskId, config, initialMessages } = params;
637
+ &nbsp;
638
+ // Validate required parameters
639
+ if (!taskId || !config) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
640
+ <span class="cstat-no" title="statement not covered" > throw new Error("Missing required parameters: taskId and config");</span>
641
+ <span class="cstat-no" title="statement not covered" > }</span>
642
+ &nbsp;
643
+ // Create conversation context
644
+ const context: ConversationContext = {
645
+ taskId,
646
+ workspaceId: config.<span class="branch-0 cbranch-no" title="branch not covered" >workspaceId || params.workspaceId,</span>
647
+ status: "starting",
648
+ config: config as ConversationConfig,
649
+ startedAt: new Date(),
650
+ lastActivityAt: new Date(),
651
+ };
652
+ &nbsp;
653
+ this.runner.activeConversations_.set(taskId, context);
654
+
655
+ // Update status line
656
+ statusLineManager.updateActiveCount(this.runner.activeConversations_.size);
657
+ &nbsp;
658
+ // Start the conversation
659
+ await this.runner.claudeManager_.startConversation(
660
+ taskId,
661
+ config,
662
+ <span class="branch-0 cbranch-no" title="branch not covered" > initialMessages || []</span>
663
+ );
664
+ }
665
+ &nbsp;
666
+ private async handleConversationStop(params: any): Promise&lt;void&gt; {
667
+ const { taskId, sessionId } = params;
668
+
669
+ if (!taskId) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
670
+ <span class="cstat-no" title="statement not covered" > throw new Error("Missing required parameter: taskId");</span>
671
+ <span class="cstat-no" title="statement not covered" > }</span>
672
+
673
+ const context = this.runner.activeConversations_.get(taskId);
674
+ &nbsp;
675
+ if (context) {
676
+ context.status = "stopping";
677
+ await this.runner.claudeManager_.stopConversation(taskId, <span class="branch-0 cbranch-no" title="branch not covered" >sessionId || context.<span class="branch-0 cbranch-no" title="branch not covered" >sessionId || "</span>")</span>;
678
+ context.status = "stopped";
679
+ this.runner.activeConversations_.delete(taskId);
680
+
681
+ // Update status line
682
+ statusLineManager.updateActiveCount(this.runner.activeConversations_.size);
683
+ <span class="branch-0 cbranch-no" title="branch not covered" > } else {</span>
684
+ <span class="cstat-no" title="statement not covered" > console.warn(`No conversation found for task ${taskId}`);</span>
685
+ <span class="cstat-no" title="statement not covered" > }</span>
686
+ }
687
+ &nbsp;
688
+ <span class="fstat-no" title="function not covered" > private async handleConversationResume(params: any): Promise&lt;void&gt; {</span>
689
+ <span class="cstat-no" title="statement not covered" > const { taskId, sessionId, config } = params;</span>
690
+ <span class="cstat-no" title="statement not covered" > </span>
691
+ <span class="cstat-no" title="statement not covered" > if (!taskId || !sessionId || !config) {</span>
692
+ <span class="cstat-no" title="statement not covered" > throw new Error("Missing required parameters: taskId, sessionId, and config");</span>
693
+ <span class="cstat-no" title="statement not covered" > }</span>
694
+ <span class="cstat-no" title="statement not covered" > </span>
695
+ <span class="cstat-no" title="statement not covered" > await this.runner.claudeManager_.resumeConversation(</span>
696
+ <span class="cstat-no" title="statement not covered" > taskId,</span>
697
+ <span class="cstat-no" title="statement not covered" > sessionId,</span>
698
+ <span class="cstat-no" title="statement not covered" > config</span>
699
+ <span class="cstat-no" title="statement not covered" > );</span>
700
+ <span class="cstat-no" title="statement not covered" > }</span>
701
+ &nbsp;
702
+ <span class="fstat-no" title="function not covered" > private async handleUserMessage(params: any): Promise&lt;void&gt; {</span>
703
+ <span class="cstat-no" title="statement not covered" > const { taskId, sessionId, content } = params;</span>
704
+ <span class="cstat-no" title="statement not covered" > </span>
705
+ <span class="cstat-no" title="statement not covered" > if (!taskId || !content) {</span>
706
+ <span class="cstat-no" title="statement not covered" > throw new Error("Missing required parameters: taskId and content");</span>
707
+ <span class="cstat-no" title="statement not covered" > }</span>
708
+ <span class="cstat-no" title="statement not covered" > </span>
709
+ <span class="cstat-no" title="statement not covered" > await this.runner.claudeManager_.sendUserMessage(taskId, sessionId || "", content);</span>
710
+ <span class="cstat-no" title="statement not covered" > }</span>
711
+ }</pre></td></tr></table></pre>
712
+
713
+ <div class='push'></div><!-- for sticky footer -->
714
+ </div><!-- /wrapper -->
715
+ <div class='footer quiet pad2 space-top1 center small'>
716
+ Code coverage generated by
717
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
718
+ at 2025-08-14T21:15:54.473Z
719
+ </div>
720
+ <script src="../../prettify.js"></script>
721
+ <script>
722
+ window.onload = function () {
723
+ prettyPrint();
724
+ };
725
+ </script>
726
+ <script src="../../sorter.js"></script>
727
+ <script src="../../block-navigation.js"></script>
728
+ </body>
729
+ </html>
730
+