a2acalling 0.6.73 → 0.6.75
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/.a2a-manifest.json +2 -2
- package/.c8rc.json +16 -0
- package/.node-version +1 -0
- package/.serena/project.yml +126 -0
- package/ARCHITECTURE.md +40 -16
- package/CONVENTIONS.md +39 -6
- package/biome.json +27 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +146 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +210 -0
- package/coverage/src/index.html +131 -0
- package/coverage/src/index.js.html +313 -0
- package/coverage/src/lib/agent-card.js.html +418 -0
- package/coverage/src/lib/call-monitor.js.html +700 -0
- package/coverage/src/lib/callbook.js.html +1183 -0
- package/coverage/src/lib/claude-subagent.js.html +2173 -0
- package/coverage/src/lib/client.js.html +2134 -0
- package/coverage/src/lib/config.js.html +1525 -0
- package/coverage/src/lib/conversation-driver.js.html +1909 -0
- package/coverage/src/lib/conversations.js.html +2575 -0
- package/coverage/src/lib/crypto.js.html +424 -0
- package/coverage/src/lib/dashboard-events.js.html +724 -0
- package/coverage/src/lib/disclosure.js.html +2461 -0
- package/coverage/src/lib/external-ip.js.html +718 -0
- package/coverage/src/lib/index.html +506 -0
- package/coverage/src/lib/invite-host.js.html +754 -0
- package/coverage/src/lib/local-request.js.html +292 -0
- package/coverage/src/lib/logger.js.html +2116 -0
- package/coverage/src/lib/openclaw-integration.js.html +1102 -0
- package/coverage/src/lib/pid-file.js.html +394 -0
- package/coverage/src/lib/port-scanner.js.html +334 -0
- package/coverage/src/lib/prompt-template.js.html +1150 -0
- package/coverage/src/lib/runtime-adapter.js.html +2188 -0
- package/coverage/src/lib/summarizer.js.html +553 -0
- package/coverage/src/lib/summary-formatter.js.html +589 -0
- package/coverage/src/lib/summary-prompt.js.html +694 -0
- package/coverage/src/lib/tokens.js.html +2689 -0
- package/coverage/src/lib/turn-timeout.js.html +241 -0
- package/coverage/src/lib/update-checker.js.html +364 -0
- package/coverage/src/lib/update-manager.js.html +1024 -0
- package/coverage/src/routes/a2a.js.html +3724 -0
- package/coverage/src/routes/callbook.js.html +511 -0
- package/coverage/src/routes/dashboard.js.html +4819 -0
- package/coverage/src/routes/index.html +146 -0
- package/coverage/src/server.js.html +3622 -0
- package/coverage/tmp/coverage-1605378-1772576706365-0.json +1 -0
- package/coverage/tmp/coverage-1605384-1772576607459-0.json +1 -0
- package/coverage/tmp/coverage-1605410-1772576631155-0.json +1 -0
- package/coverage/tmp/coverage-1606942-1772576636869-0.json +1 -0
- package/coverage/tmp/coverage-1607004-1772576637454-0.json +1 -0
- package/coverage/tmp/coverage-1607044-1772576637876-0.json +1 -0
- package/coverage/tmp/coverage-1607096-1772576638356-0.json +1 -0
- package/coverage/tmp/coverage-1607145-1772576638777-0.json +1 -0
- package/coverage/tmp/coverage-1607201-1772576639277-0.json +1 -0
- package/coverage/tmp/coverage-1607247-1772576639755-0.json +1 -0
- package/coverage/tmp/coverage-1607317-1772576640083-0.json +1 -0
- package/coverage/tmp/coverage-1607381-1772576640465-0.json +1 -0
- package/coverage/tmp/coverage-1607446-1772576640868-0.json +1 -0
- package/coverage/tmp/coverage-1607501-1772576641662-0.json +1 -0
- package/coverage/tmp/coverage-1607534-1772576641565-0.json +1 -0
- package/coverage/tmp/coverage-1607627-1772576641871-0.json +1 -0
- package/coverage/tmp/coverage-1607665-1772576642172-0.json +1 -0
- package/coverage/tmp/coverage-1607714-1772576642577-0.json +1 -0
- package/coverage/tmp/coverage-1607788-1772576643466-0.json +1 -0
- package/coverage/tmp/coverage-1607924-1772576644678-0.json +1 -0
- package/coverage/tmp/coverage-1607978-1772576645154-0.json +1 -0
- package/coverage/tmp/coverage-1608035-1772576645564-0.json +1 -0
- package/coverage/tmp/coverage-1608106-1772576645967-0.json +1 -0
- package/coverage/tmp/coverage-1608179-1772576648656-0.json +1 -0
- package/coverage/tmp/coverage-1608196-1772576647367-0.json +1 -0
- package/coverage/tmp/coverage-1608217-1772576648557-0.json +1 -0
- package/coverage/tmp/coverage-1608256-1772576651378-0.json +1 -0
- package/coverage/tmp/coverage-1608265-1772576650058-0.json +1 -0
- package/coverage/tmp/coverage-1608289-1772576651358-0.json +1 -0
- package/coverage/tmp/coverage-1608591-1772576660465-0.json +1 -0
- package/coverage/tmp/coverage-1608648-1772576659272-0.json +1 -0
- package/coverage/tmp/coverage-1608665-1772576660374-0.json +1 -0
- package/coverage/tmp/coverage-1608677-1772576661268-0.json +1 -0
- package/coverage/tmp/coverage-1608684-1772576663968-0.json +1 -0
- package/coverage/tmp/coverage-1608692-1772576662575-0.json +1 -0
- package/coverage/tmp/coverage-1608701-1772576663873-0.json +1 -0
- package/coverage/tmp/coverage-1608718-1772576666674-0.json +1 -0
- package/coverage/tmp/coverage-1608725-1772576665463-0.json +1 -0
- package/coverage/tmp/coverage-1608738-1772576666577-0.json +1 -0
- package/coverage/tmp/coverage-1608753-1772576669664-0.json +1 -0
- package/coverage/tmp/coverage-1608763-1772576668275-0.json +1 -0
- package/coverage/tmp/coverage-1608771-1772576669563-0.json +1 -0
- package/coverage/tmp/coverage-1608828-1772576676574-0.json +1 -0
- package/coverage/tmp/coverage-1609244-1772576675272-0.json +1 -0
- package/coverage/tmp/coverage-1609342-1772576676478-0.json +1 -0
- package/coverage/tmp/coverage-1609450-1772576686954-0.json +1 -0
- package/coverage/tmp/coverage-1609841-1772576685466-0.json +1 -0
- package/coverage/tmp/coverage-1609925-1772576686855-0.json +1 -0
- package/coverage/tmp/coverage-1610399-1772576692469-0.json +1 -0
- package/coverage/tmp/coverage-1611283-1772576703062-0.json +1 -0
- package/coverage/tmp/coverage-1611294-1772576703755-0.json +1 -0
- package/docs/assessments/2026-02-27-google-a2a-protocol-assessment.md +292 -0
- package/docs/plans/2026-03-01-a2a-68-openclaw-integration-tests.md +676 -0
- package/docs/plans/2026-03-01-a2a-77-invoke-security-tests.md +661 -0
- package/docs/plans/2026-03-03-a2a-91-macos-packaging-plan.md +144 -0
- package/docs/signing-setup.md +49 -0
- package/eslint.config.js +16 -0
- package/knip.json +17 -0
- package/native/macos/certs/appldevcert.cer +0 -0
- package/native/macos/src-tauri/binaries/.gitkeep +0 -0
- package/native/macos/src-tauri/capabilities/default.json +11 -1
- package/native/macos/src-tauri/entitlements.plist +14 -0
- package/native/macos/src-tauri/src/discovery.rs +14 -3
- package/native/macos/src-tauri/src/health.rs +4 -0
- package/native/macos/src-tauri/src/lib.rs +52 -11
- package/native/macos/src-tauri/src/server.rs +262 -26
- package/native/macos/src-tauri/tauri.conf.json +13 -4
- package/package.json +16 -2
- package/pkg.config.json +14 -0
- package/scripts/build-standalone.sh +106 -0
- package/scripts/install-openclaw.js +3 -5
- package/scripts/smoke-test-standalone.sh +101 -0
- package/scripts/sync-version.sh +28 -0
- package/scripts/verify-app-bundle.sh +34 -0
- package/src/lib/agent-card.js +111 -0
- package/src/lib/client.js +290 -49
- package/src/lib/conversations.js +2 -0
- package/src/lib/local-request.js +69 -0
- package/src/lib/logger.js +2 -0
- package/src/lib/runtime-adapter.js +41 -1
- package/src/routes/a2a.js +393 -66
- package/src/routes/dashboard.js +1 -27
- package/src/server.js +19 -0
- package/.maestro/inbox/release-workflow-spam.md +0 -25
|
@@ -0,0 +1,2188 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/lib/runtime-adapter.js</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/lib</a> runtime-adapter.js</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">43.93% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>308/701</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">54.16% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>39/72</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">66.66% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>10/15</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">43.93% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>308/701</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line low'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
+
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
+
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
+
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
+
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
+
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
+
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
+
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
+
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
+
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
+
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
+
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
+
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
+
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
+
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
+
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
+
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
+
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
+
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
+
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
+
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
+
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
+
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
+
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
+
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
+
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
+
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
+
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
+
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
+
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
+
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
+
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
+
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
+
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
+
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
+
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
+
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
+
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
+
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
+
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
+
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
+
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
+
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
+
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
+
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
+
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
+
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
+
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
+
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
+
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
+
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
+
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
+
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
+
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
+
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
+
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
+
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
+
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
+
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
+
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
+
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
+
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
+
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
+
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
+
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
+
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
+
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
+
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
+
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
+
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
+
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
+
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
+
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
+
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
+
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
+
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
+
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
+
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
+
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
+
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
+
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
+
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
+
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
+
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
+
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
+
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
+
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
+
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
+
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
+
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
+
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
+
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
+
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
+
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
+
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
+
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
+
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
+
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
+
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
+
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
+
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
+
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
+
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
+
<a name='L322'></a><a href='#L322'>322</a>
|
|
388
|
+
<a name='L323'></a><a href='#L323'>323</a>
|
|
389
|
+
<a name='L324'></a><a href='#L324'>324</a>
|
|
390
|
+
<a name='L325'></a><a href='#L325'>325</a>
|
|
391
|
+
<a name='L326'></a><a href='#L326'>326</a>
|
|
392
|
+
<a name='L327'></a><a href='#L327'>327</a>
|
|
393
|
+
<a name='L328'></a><a href='#L328'>328</a>
|
|
394
|
+
<a name='L329'></a><a href='#L329'>329</a>
|
|
395
|
+
<a name='L330'></a><a href='#L330'>330</a>
|
|
396
|
+
<a name='L331'></a><a href='#L331'>331</a>
|
|
397
|
+
<a name='L332'></a><a href='#L332'>332</a>
|
|
398
|
+
<a name='L333'></a><a href='#L333'>333</a>
|
|
399
|
+
<a name='L334'></a><a href='#L334'>334</a>
|
|
400
|
+
<a name='L335'></a><a href='#L335'>335</a>
|
|
401
|
+
<a name='L336'></a><a href='#L336'>336</a>
|
|
402
|
+
<a name='L337'></a><a href='#L337'>337</a>
|
|
403
|
+
<a name='L338'></a><a href='#L338'>338</a>
|
|
404
|
+
<a name='L339'></a><a href='#L339'>339</a>
|
|
405
|
+
<a name='L340'></a><a href='#L340'>340</a>
|
|
406
|
+
<a name='L341'></a><a href='#L341'>341</a>
|
|
407
|
+
<a name='L342'></a><a href='#L342'>342</a>
|
|
408
|
+
<a name='L343'></a><a href='#L343'>343</a>
|
|
409
|
+
<a name='L344'></a><a href='#L344'>344</a>
|
|
410
|
+
<a name='L345'></a><a href='#L345'>345</a>
|
|
411
|
+
<a name='L346'></a><a href='#L346'>346</a>
|
|
412
|
+
<a name='L347'></a><a href='#L347'>347</a>
|
|
413
|
+
<a name='L348'></a><a href='#L348'>348</a>
|
|
414
|
+
<a name='L349'></a><a href='#L349'>349</a>
|
|
415
|
+
<a name='L350'></a><a href='#L350'>350</a>
|
|
416
|
+
<a name='L351'></a><a href='#L351'>351</a>
|
|
417
|
+
<a name='L352'></a><a href='#L352'>352</a>
|
|
418
|
+
<a name='L353'></a><a href='#L353'>353</a>
|
|
419
|
+
<a name='L354'></a><a href='#L354'>354</a>
|
|
420
|
+
<a name='L355'></a><a href='#L355'>355</a>
|
|
421
|
+
<a name='L356'></a><a href='#L356'>356</a>
|
|
422
|
+
<a name='L357'></a><a href='#L357'>357</a>
|
|
423
|
+
<a name='L358'></a><a href='#L358'>358</a>
|
|
424
|
+
<a name='L359'></a><a href='#L359'>359</a>
|
|
425
|
+
<a name='L360'></a><a href='#L360'>360</a>
|
|
426
|
+
<a name='L361'></a><a href='#L361'>361</a>
|
|
427
|
+
<a name='L362'></a><a href='#L362'>362</a>
|
|
428
|
+
<a name='L363'></a><a href='#L363'>363</a>
|
|
429
|
+
<a name='L364'></a><a href='#L364'>364</a>
|
|
430
|
+
<a name='L365'></a><a href='#L365'>365</a>
|
|
431
|
+
<a name='L366'></a><a href='#L366'>366</a>
|
|
432
|
+
<a name='L367'></a><a href='#L367'>367</a>
|
|
433
|
+
<a name='L368'></a><a href='#L368'>368</a>
|
|
434
|
+
<a name='L369'></a><a href='#L369'>369</a>
|
|
435
|
+
<a name='L370'></a><a href='#L370'>370</a>
|
|
436
|
+
<a name='L371'></a><a href='#L371'>371</a>
|
|
437
|
+
<a name='L372'></a><a href='#L372'>372</a>
|
|
438
|
+
<a name='L373'></a><a href='#L373'>373</a>
|
|
439
|
+
<a name='L374'></a><a href='#L374'>374</a>
|
|
440
|
+
<a name='L375'></a><a href='#L375'>375</a>
|
|
441
|
+
<a name='L376'></a><a href='#L376'>376</a>
|
|
442
|
+
<a name='L377'></a><a href='#L377'>377</a>
|
|
443
|
+
<a name='L378'></a><a href='#L378'>378</a>
|
|
444
|
+
<a name='L379'></a><a href='#L379'>379</a>
|
|
445
|
+
<a name='L380'></a><a href='#L380'>380</a>
|
|
446
|
+
<a name='L381'></a><a href='#L381'>381</a>
|
|
447
|
+
<a name='L382'></a><a href='#L382'>382</a>
|
|
448
|
+
<a name='L383'></a><a href='#L383'>383</a>
|
|
449
|
+
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
|
+
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
|
+
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a>
|
|
620
|
+
<a name='L555'></a><a href='#L555'>555</a>
|
|
621
|
+
<a name='L556'></a><a href='#L556'>556</a>
|
|
622
|
+
<a name='L557'></a><a href='#L557'>557</a>
|
|
623
|
+
<a name='L558'></a><a href='#L558'>558</a>
|
|
624
|
+
<a name='L559'></a><a href='#L559'>559</a>
|
|
625
|
+
<a name='L560'></a><a href='#L560'>560</a>
|
|
626
|
+
<a name='L561'></a><a href='#L561'>561</a>
|
|
627
|
+
<a name='L562'></a><a href='#L562'>562</a>
|
|
628
|
+
<a name='L563'></a><a href='#L563'>563</a>
|
|
629
|
+
<a name='L564'></a><a href='#L564'>564</a>
|
|
630
|
+
<a name='L565'></a><a href='#L565'>565</a>
|
|
631
|
+
<a name='L566'></a><a href='#L566'>566</a>
|
|
632
|
+
<a name='L567'></a><a href='#L567'>567</a>
|
|
633
|
+
<a name='L568'></a><a href='#L568'>568</a>
|
|
634
|
+
<a name='L569'></a><a href='#L569'>569</a>
|
|
635
|
+
<a name='L570'></a><a href='#L570'>570</a>
|
|
636
|
+
<a name='L571'></a><a href='#L571'>571</a>
|
|
637
|
+
<a name='L572'></a><a href='#L572'>572</a>
|
|
638
|
+
<a name='L573'></a><a href='#L573'>573</a>
|
|
639
|
+
<a name='L574'></a><a href='#L574'>574</a>
|
|
640
|
+
<a name='L575'></a><a href='#L575'>575</a>
|
|
641
|
+
<a name='L576'></a><a href='#L576'>576</a>
|
|
642
|
+
<a name='L577'></a><a href='#L577'>577</a>
|
|
643
|
+
<a name='L578'></a><a href='#L578'>578</a>
|
|
644
|
+
<a name='L579'></a><a href='#L579'>579</a>
|
|
645
|
+
<a name='L580'></a><a href='#L580'>580</a>
|
|
646
|
+
<a name='L581'></a><a href='#L581'>581</a>
|
|
647
|
+
<a name='L582'></a><a href='#L582'>582</a>
|
|
648
|
+
<a name='L583'></a><a href='#L583'>583</a>
|
|
649
|
+
<a name='L584'></a><a href='#L584'>584</a>
|
|
650
|
+
<a name='L585'></a><a href='#L585'>585</a>
|
|
651
|
+
<a name='L586'></a><a href='#L586'>586</a>
|
|
652
|
+
<a name='L587'></a><a href='#L587'>587</a>
|
|
653
|
+
<a name='L588'></a><a href='#L588'>588</a>
|
|
654
|
+
<a name='L589'></a><a href='#L589'>589</a>
|
|
655
|
+
<a name='L590'></a><a href='#L590'>590</a>
|
|
656
|
+
<a name='L591'></a><a href='#L591'>591</a>
|
|
657
|
+
<a name='L592'></a><a href='#L592'>592</a>
|
|
658
|
+
<a name='L593'></a><a href='#L593'>593</a>
|
|
659
|
+
<a name='L594'></a><a href='#L594'>594</a>
|
|
660
|
+
<a name='L595'></a><a href='#L595'>595</a>
|
|
661
|
+
<a name='L596'></a><a href='#L596'>596</a>
|
|
662
|
+
<a name='L597'></a><a href='#L597'>597</a>
|
|
663
|
+
<a name='L598'></a><a href='#L598'>598</a>
|
|
664
|
+
<a name='L599'></a><a href='#L599'>599</a>
|
|
665
|
+
<a name='L600'></a><a href='#L600'>600</a>
|
|
666
|
+
<a name='L601'></a><a href='#L601'>601</a>
|
|
667
|
+
<a name='L602'></a><a href='#L602'>602</a>
|
|
668
|
+
<a name='L603'></a><a href='#L603'>603</a>
|
|
669
|
+
<a name='L604'></a><a href='#L604'>604</a>
|
|
670
|
+
<a name='L605'></a><a href='#L605'>605</a>
|
|
671
|
+
<a name='L606'></a><a href='#L606'>606</a>
|
|
672
|
+
<a name='L607'></a><a href='#L607'>607</a>
|
|
673
|
+
<a name='L608'></a><a href='#L608'>608</a>
|
|
674
|
+
<a name='L609'></a><a href='#L609'>609</a>
|
|
675
|
+
<a name='L610'></a><a href='#L610'>610</a>
|
|
676
|
+
<a name='L611'></a><a href='#L611'>611</a>
|
|
677
|
+
<a name='L612'></a><a href='#L612'>612</a>
|
|
678
|
+
<a name='L613'></a><a href='#L613'>613</a>
|
|
679
|
+
<a name='L614'></a><a href='#L614'>614</a>
|
|
680
|
+
<a name='L615'></a><a href='#L615'>615</a>
|
|
681
|
+
<a name='L616'></a><a href='#L616'>616</a>
|
|
682
|
+
<a name='L617'></a><a href='#L617'>617</a>
|
|
683
|
+
<a name='L618'></a><a href='#L618'>618</a>
|
|
684
|
+
<a name='L619'></a><a href='#L619'>619</a>
|
|
685
|
+
<a name='L620'></a><a href='#L620'>620</a>
|
|
686
|
+
<a name='L621'></a><a href='#L621'>621</a>
|
|
687
|
+
<a name='L622'></a><a href='#L622'>622</a>
|
|
688
|
+
<a name='L623'></a><a href='#L623'>623</a>
|
|
689
|
+
<a name='L624'></a><a href='#L624'>624</a>
|
|
690
|
+
<a name='L625'></a><a href='#L625'>625</a>
|
|
691
|
+
<a name='L626'></a><a href='#L626'>626</a>
|
|
692
|
+
<a name='L627'></a><a href='#L627'>627</a>
|
|
693
|
+
<a name='L628'></a><a href='#L628'>628</a>
|
|
694
|
+
<a name='L629'></a><a href='#L629'>629</a>
|
|
695
|
+
<a name='L630'></a><a href='#L630'>630</a>
|
|
696
|
+
<a name='L631'></a><a href='#L631'>631</a>
|
|
697
|
+
<a name='L632'></a><a href='#L632'>632</a>
|
|
698
|
+
<a name='L633'></a><a href='#L633'>633</a>
|
|
699
|
+
<a name='L634'></a><a href='#L634'>634</a>
|
|
700
|
+
<a name='L635'></a><a href='#L635'>635</a>
|
|
701
|
+
<a name='L636'></a><a href='#L636'>636</a>
|
|
702
|
+
<a name='L637'></a><a href='#L637'>637</a>
|
|
703
|
+
<a name='L638'></a><a href='#L638'>638</a>
|
|
704
|
+
<a name='L639'></a><a href='#L639'>639</a>
|
|
705
|
+
<a name='L640'></a><a href='#L640'>640</a>
|
|
706
|
+
<a name='L641'></a><a href='#L641'>641</a>
|
|
707
|
+
<a name='L642'></a><a href='#L642'>642</a>
|
|
708
|
+
<a name='L643'></a><a href='#L643'>643</a>
|
|
709
|
+
<a name='L644'></a><a href='#L644'>644</a>
|
|
710
|
+
<a name='L645'></a><a href='#L645'>645</a>
|
|
711
|
+
<a name='L646'></a><a href='#L646'>646</a>
|
|
712
|
+
<a name='L647'></a><a href='#L647'>647</a>
|
|
713
|
+
<a name='L648'></a><a href='#L648'>648</a>
|
|
714
|
+
<a name='L649'></a><a href='#L649'>649</a>
|
|
715
|
+
<a name='L650'></a><a href='#L650'>650</a>
|
|
716
|
+
<a name='L651'></a><a href='#L651'>651</a>
|
|
717
|
+
<a name='L652'></a><a href='#L652'>652</a>
|
|
718
|
+
<a name='L653'></a><a href='#L653'>653</a>
|
|
719
|
+
<a name='L654'></a><a href='#L654'>654</a>
|
|
720
|
+
<a name='L655'></a><a href='#L655'>655</a>
|
|
721
|
+
<a name='L656'></a><a href='#L656'>656</a>
|
|
722
|
+
<a name='L657'></a><a href='#L657'>657</a>
|
|
723
|
+
<a name='L658'></a><a href='#L658'>658</a>
|
|
724
|
+
<a name='L659'></a><a href='#L659'>659</a>
|
|
725
|
+
<a name='L660'></a><a href='#L660'>660</a>
|
|
726
|
+
<a name='L661'></a><a href='#L661'>661</a>
|
|
727
|
+
<a name='L662'></a><a href='#L662'>662</a>
|
|
728
|
+
<a name='L663'></a><a href='#L663'>663</a>
|
|
729
|
+
<a name='L664'></a><a href='#L664'>664</a>
|
|
730
|
+
<a name='L665'></a><a href='#L665'>665</a>
|
|
731
|
+
<a name='L666'></a><a href='#L666'>666</a>
|
|
732
|
+
<a name='L667'></a><a href='#L667'>667</a>
|
|
733
|
+
<a name='L668'></a><a href='#L668'>668</a>
|
|
734
|
+
<a name='L669'></a><a href='#L669'>669</a>
|
|
735
|
+
<a name='L670'></a><a href='#L670'>670</a>
|
|
736
|
+
<a name='L671'></a><a href='#L671'>671</a>
|
|
737
|
+
<a name='L672'></a><a href='#L672'>672</a>
|
|
738
|
+
<a name='L673'></a><a href='#L673'>673</a>
|
|
739
|
+
<a name='L674'></a><a href='#L674'>674</a>
|
|
740
|
+
<a name='L675'></a><a href='#L675'>675</a>
|
|
741
|
+
<a name='L676'></a><a href='#L676'>676</a>
|
|
742
|
+
<a name='L677'></a><a href='#L677'>677</a>
|
|
743
|
+
<a name='L678'></a><a href='#L678'>678</a>
|
|
744
|
+
<a name='L679'></a><a href='#L679'>679</a>
|
|
745
|
+
<a name='L680'></a><a href='#L680'>680</a>
|
|
746
|
+
<a name='L681'></a><a href='#L681'>681</a>
|
|
747
|
+
<a name='L682'></a><a href='#L682'>682</a>
|
|
748
|
+
<a name='L683'></a><a href='#L683'>683</a>
|
|
749
|
+
<a name='L684'></a><a href='#L684'>684</a>
|
|
750
|
+
<a name='L685'></a><a href='#L685'>685</a>
|
|
751
|
+
<a name='L686'></a><a href='#L686'>686</a>
|
|
752
|
+
<a name='L687'></a><a href='#L687'>687</a>
|
|
753
|
+
<a name='L688'></a><a href='#L688'>688</a>
|
|
754
|
+
<a name='L689'></a><a href='#L689'>689</a>
|
|
755
|
+
<a name='L690'></a><a href='#L690'>690</a>
|
|
756
|
+
<a name='L691'></a><a href='#L691'>691</a>
|
|
757
|
+
<a name='L692'></a><a href='#L692'>692</a>
|
|
758
|
+
<a name='L693'></a><a href='#L693'>693</a>
|
|
759
|
+
<a name='L694'></a><a href='#L694'>694</a>
|
|
760
|
+
<a name='L695'></a><a href='#L695'>695</a>
|
|
761
|
+
<a name='L696'></a><a href='#L696'>696</a>
|
|
762
|
+
<a name='L697'></a><a href='#L697'>697</a>
|
|
763
|
+
<a name='L698'></a><a href='#L698'>698</a>
|
|
764
|
+
<a name='L699'></a><a href='#L699'>699</a>
|
|
765
|
+
<a name='L700'></a><a href='#L700'>700</a>
|
|
766
|
+
<a name='L701'></a><a href='#L701'>701</a>
|
|
767
|
+
<a name='L702'></a><a href='#L702'>702</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">22x</span>
|
|
768
|
+
<span class="cline-any cline-yes">22x</span>
|
|
769
|
+
<span class="cline-any cline-yes">22x</span>
|
|
770
|
+
<span class="cline-any cline-yes">22x</span>
|
|
771
|
+
<span class="cline-any cline-yes">22x</span>
|
|
772
|
+
<span class="cline-any cline-yes">22x</span>
|
|
773
|
+
<span class="cline-any cline-yes">22x</span>
|
|
774
|
+
<span class="cline-any cline-yes">22x</span>
|
|
775
|
+
<span class="cline-any cline-yes">22x</span>
|
|
776
|
+
<span class="cline-any cline-yes">22x</span>
|
|
777
|
+
<span class="cline-any cline-yes">22x</span>
|
|
778
|
+
<span class="cline-any cline-yes">22x</span>
|
|
779
|
+
<span class="cline-any cline-yes">22x</span>
|
|
780
|
+
<span class="cline-any cline-yes">22x</span>
|
|
781
|
+
<span class="cline-any cline-yes">22x</span>
|
|
782
|
+
<span class="cline-any cline-yes">22x</span>
|
|
783
|
+
<span class="cline-any cline-yes">22x</span>
|
|
784
|
+
<span class="cline-any cline-yes">22x</span>
|
|
785
|
+
<span class="cline-any cline-yes">22x</span>
|
|
786
|
+
<span class="cline-any cline-yes">22x</span>
|
|
787
|
+
<span class="cline-any cline-yes">22x</span>
|
|
788
|
+
<span class="cline-any cline-yes">22x</span>
|
|
789
|
+
<span class="cline-any cline-yes">22x</span>
|
|
790
|
+
<span class="cline-any cline-yes">22x</span>
|
|
791
|
+
<span class="cline-any cline-yes">22x</span>
|
|
792
|
+
<span class="cline-any cline-yes">44x</span>
|
|
793
|
+
<span class="cline-any cline-yes">44x</span>
|
|
794
|
+
<span class="cline-any cline-yes">44x</span>
|
|
795
|
+
<span class="cline-any cline-yes">44x</span>
|
|
796
|
+
<span class="cline-any cline-yes">44x</span>
|
|
797
|
+
<span class="cline-any cline-yes">4x</span>
|
|
798
|
+
<span class="cline-any cline-yes">4x</span>
|
|
799
|
+
<span class="cline-any cline-yes">44x</span>
|
|
800
|
+
<span class="cline-any cline-yes">22x</span>
|
|
801
|
+
<span class="cline-any cline-yes">2x</span>
|
|
802
|
+
<span class="cline-any cline-yes">2x</span>
|
|
803
|
+
<span class="cline-any cline-yes">2x</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">22x</span>
|
|
808
|
+
<span class="cline-any cline-yes">22x</span>
|
|
809
|
+
<span class="cline-any cline-yes">22x</span>
|
|
810
|
+
<span class="cline-any cline-yes">22x</span>
|
|
811
|
+
<span class="cline-any cline-yes">22x</span>
|
|
812
|
+
<span class="cline-any cline-yes">22x</span>
|
|
813
|
+
<span class="cline-any cline-yes">22x</span>
|
|
814
|
+
<span class="cline-any cline-yes">22x</span>
|
|
815
|
+
<span class="cline-any cline-yes">22x</span>
|
|
816
|
+
<span class="cline-any cline-yes">22x</span>
|
|
817
|
+
<span class="cline-any cline-yes">13x</span>
|
|
818
|
+
<span class="cline-any cline-yes">13x</span>
|
|
819
|
+
<span class="cline-any cline-yes">13x</span>
|
|
820
|
+
<span class="cline-any cline-yes">13x</span>
|
|
821
|
+
<span class="cline-any cline-yes">13x</span>
|
|
822
|
+
<span class="cline-any cline-yes">13x</span>
|
|
823
|
+
<span class="cline-any cline-yes">13x</span>
|
|
824
|
+
<span class="cline-any cline-yes">13x</span>
|
|
825
|
+
<span class="cline-any cline-yes">9x</span>
|
|
826
|
+
<span class="cline-any cline-yes">22x</span>
|
|
827
|
+
<span class="cline-any cline-yes">3x</span>
|
|
828
|
+
<span class="cline-any cline-yes">3x</span>
|
|
829
|
+
<span class="cline-any cline-yes">3x</span>
|
|
830
|
+
<span class="cline-any cline-yes">3x</span>
|
|
831
|
+
<span class="cline-any cline-yes">3x</span>
|
|
832
|
+
<span class="cline-any cline-yes">3x</span>
|
|
833
|
+
<span class="cline-any cline-yes">3x</span>
|
|
834
|
+
<span class="cline-any cline-yes">3x</span>
|
|
835
|
+
<span class="cline-any cline-yes">3x</span>
|
|
836
|
+
<span class="cline-any cline-yes">6x</span>
|
|
837
|
+
<span class="cline-any cline-yes">22x</span>
|
|
838
|
+
<span class="cline-any cline-yes">2x</span>
|
|
839
|
+
<span class="cline-any cline-yes">1x</span>
|
|
840
|
+
<span class="cline-any cline-yes">1x</span>
|
|
841
|
+
<span class="cline-any cline-yes">1x</span>
|
|
842
|
+
<span class="cline-any cline-yes">1x</span>
|
|
843
|
+
<span class="cline-any cline-yes">1x</span>
|
|
844
|
+
<span class="cline-any cline-yes">1x</span>
|
|
845
|
+
<span class="cline-any cline-yes">1x</span>
|
|
846
|
+
<span class="cline-any cline-yes">1x</span>
|
|
847
|
+
<span class="cline-any cline-yes">1x</span>
|
|
848
|
+
<span class="cline-any cline-yes">1x</span>
|
|
849
|
+
<span class="cline-any cline-yes">1x</span>
|
|
850
|
+
<span class="cline-any cline-yes">1x</span>
|
|
851
|
+
<span class="cline-any cline-yes">1x</span>
|
|
852
|
+
<span class="cline-any cline-yes">1x</span>
|
|
853
|
+
<span class="cline-any cline-yes">1x</span>
|
|
854
|
+
<span class="cline-any cline-yes">1x</span>
|
|
855
|
+
<span class="cline-any cline-yes">1x</span>
|
|
856
|
+
<span class="cline-any cline-yes">4x</span>
|
|
857
|
+
<span class="cline-any cline-yes">22x</span>
|
|
858
|
+
<span class="cline-any cline-yes">1x</span>
|
|
859
|
+
<span class="cline-any cline-no"> </span>
|
|
860
|
+
<span class="cline-any cline-no"> </span>
|
|
861
|
+
<span class="cline-any cline-no"> </span>
|
|
862
|
+
<span class="cline-any cline-no"> </span>
|
|
863
|
+
<span class="cline-any cline-no"> </span>
|
|
864
|
+
<span class="cline-any cline-no"> </span>
|
|
865
|
+
<span class="cline-any cline-no"> </span>
|
|
866
|
+
<span class="cline-any cline-no"> </span>
|
|
867
|
+
<span class="cline-any cline-yes">1x</span>
|
|
868
|
+
<span class="cline-any cline-yes">1x</span>
|
|
869
|
+
<span class="cline-any cline-yes">1x</span>
|
|
870
|
+
<span class="cline-any cline-yes">1x</span>
|
|
871
|
+
<span class="cline-any cline-yes">1x</span>
|
|
872
|
+
<span class="cline-any cline-yes">1x</span>
|
|
873
|
+
<span class="cline-any cline-yes">1x</span>
|
|
874
|
+
<span class="cline-any cline-yes">1x</span>
|
|
875
|
+
<span class="cline-any cline-yes">1x</span>
|
|
876
|
+
<span class="cline-any cline-yes">3x</span>
|
|
877
|
+
<span class="cline-any cline-yes">3x</span>
|
|
878
|
+
<span class="cline-any cline-yes">3x</span>
|
|
879
|
+
<span class="cline-any cline-yes">3x</span>
|
|
880
|
+
<span class="cline-any cline-yes">3x</span>
|
|
881
|
+
<span class="cline-any cline-yes">3x</span>
|
|
882
|
+
<span class="cline-any cline-yes">3x</span>
|
|
883
|
+
<span class="cline-any cline-yes">3x</span>
|
|
884
|
+
<span class="cline-any cline-yes">3x</span>
|
|
885
|
+
<span class="cline-any cline-yes">3x</span>
|
|
886
|
+
<span class="cline-any cline-yes">3x</span>
|
|
887
|
+
<span class="cline-any cline-no"> </span>
|
|
888
|
+
<span class="cline-any cline-no"> </span>
|
|
889
|
+
<span class="cline-any cline-no"> </span>
|
|
890
|
+
<span class="cline-any cline-no"> </span>
|
|
891
|
+
<span class="cline-any cline-no"> </span>
|
|
892
|
+
<span class="cline-any cline-no"> </span>
|
|
893
|
+
<span class="cline-any cline-no"> </span>
|
|
894
|
+
<span class="cline-any cline-no"> </span>
|
|
895
|
+
<span class="cline-any cline-no"> </span>
|
|
896
|
+
<span class="cline-any cline-no"> </span>
|
|
897
|
+
<span class="cline-any cline-no"> </span>
|
|
898
|
+
<span class="cline-any cline-no"> </span>
|
|
899
|
+
<span class="cline-any cline-no"> </span>
|
|
900
|
+
<span class="cline-any cline-no"> </span>
|
|
901
|
+
<span class="cline-any cline-no"> </span>
|
|
902
|
+
<span class="cline-any cline-no"> </span>
|
|
903
|
+
<span class="cline-any cline-no"> </span>
|
|
904
|
+
<span class="cline-any cline-no"> </span>
|
|
905
|
+
<span class="cline-any cline-no"> </span>
|
|
906
|
+
<span class="cline-any cline-yes">22x</span>
|
|
907
|
+
<span class="cline-any cline-yes">22x</span>
|
|
908
|
+
<span class="cline-any cline-no"> </span>
|
|
909
|
+
<span class="cline-any cline-no"> </span>
|
|
910
|
+
<span class="cline-any cline-no"> </span>
|
|
911
|
+
<span class="cline-any cline-no"> </span>
|
|
912
|
+
<span class="cline-any cline-no"> </span>
|
|
913
|
+
<span class="cline-any cline-no"> </span>
|
|
914
|
+
<span class="cline-any cline-no"> </span>
|
|
915
|
+
<span class="cline-any cline-no"> </span>
|
|
916
|
+
<span class="cline-any cline-no"> </span>
|
|
917
|
+
<span class="cline-any cline-no"> </span>
|
|
918
|
+
<span class="cline-any cline-no"> </span>
|
|
919
|
+
<span class="cline-any cline-yes">22x</span>
|
|
920
|
+
<span class="cline-any cline-yes">22x</span>
|
|
921
|
+
<span class="cline-any cline-yes">30x</span>
|
|
922
|
+
<span class="cline-any cline-yes">30x</span>
|
|
923
|
+
<span class="cline-any cline-yes">30x</span>
|
|
924
|
+
<span class="cline-any cline-yes">30x</span>
|
|
925
|
+
<span class="cline-any cline-yes">22x</span>
|
|
926
|
+
<span class="cline-any cline-yes">15x</span>
|
|
927
|
+
<span class="cline-any cline-yes">15x</span>
|
|
928
|
+
<span class="cline-any cline-yes">15x</span>
|
|
929
|
+
<span class="cline-any cline-yes">15x</span>
|
|
930
|
+
<span class="cline-any cline-yes">15x</span>
|
|
931
|
+
<span class="cline-any cline-yes">15x</span>
|
|
932
|
+
<span class="cline-any cline-yes">15x</span>
|
|
933
|
+
<span class="cline-any cline-yes">15x</span>
|
|
934
|
+
<span class="cline-any cline-yes">15x</span>
|
|
935
|
+
<span class="cline-any cline-yes">15x</span>
|
|
936
|
+
<span class="cline-any cline-yes">15x</span>
|
|
937
|
+
<span class="cline-any cline-yes">15x</span>
|
|
938
|
+
<span class="cline-any cline-yes">15x</span>
|
|
939
|
+
<span class="cline-any cline-yes">15x</span>
|
|
940
|
+
<span class="cline-any cline-yes">15x</span>
|
|
941
|
+
<span class="cline-any cline-yes">15x</span>
|
|
942
|
+
<span class="cline-any cline-yes">15x</span>
|
|
943
|
+
<span class="cline-any cline-yes">15x</span>
|
|
944
|
+
<span class="cline-any cline-yes">15x</span>
|
|
945
|
+
<span class="cline-any cline-yes">15x</span>
|
|
946
|
+
<span class="cline-any cline-yes">15x</span>
|
|
947
|
+
<span class="cline-any cline-yes">15x</span>
|
|
948
|
+
<span class="cline-any cline-yes">15x</span>
|
|
949
|
+
<span class="cline-any cline-yes">15x</span>
|
|
950
|
+
<span class="cline-any cline-yes">15x</span>
|
|
951
|
+
<span class="cline-any cline-yes">15x</span>
|
|
952
|
+
<span class="cline-any cline-yes">15x</span>
|
|
953
|
+
<span class="cline-any cline-yes">15x</span>
|
|
954
|
+
<span class="cline-any cline-yes">5x</span>
|
|
955
|
+
<span class="cline-any cline-yes">5x</span>
|
|
956
|
+
<span class="cline-any cline-yes">21x</span>
|
|
957
|
+
<span class="cline-any cline-yes">21x</span>
|
|
958
|
+
<span class="cline-any cline-yes">2x</span>
|
|
959
|
+
<span class="cline-any cline-yes">2x</span>
|
|
960
|
+
<span class="cline-any cline-yes">21x</span>
|
|
961
|
+
<span class="cline-any cline-yes">5x</span>
|
|
962
|
+
<span class="cline-any cline-yes">5x</span>
|
|
963
|
+
<span class="cline-any cline-yes">3x</span>
|
|
964
|
+
<span class="cline-any cline-yes">3x</span>
|
|
965
|
+
<span class="cline-any cline-yes">2x</span>
|
|
966
|
+
<span class="cline-any cline-yes">2x</span>
|
|
967
|
+
<span class="cline-any cline-yes">2x</span>
|
|
968
|
+
<span class="cline-any cline-yes">2x</span>
|
|
969
|
+
<span class="cline-any cline-yes">5x</span>
|
|
970
|
+
<span class="cline-any cline-yes">3x</span>
|
|
971
|
+
<span class="cline-any cline-yes">3x</span>
|
|
972
|
+
<span class="cline-any cline-yes">5x</span>
|
|
973
|
+
<span class="cline-any cline-yes">15x</span>
|
|
974
|
+
<span class="cline-any cline-yes">15x</span>
|
|
975
|
+
<span class="cline-any cline-no"> </span>
|
|
976
|
+
<span class="cline-any cline-no"> </span>
|
|
977
|
+
<span class="cline-any cline-no"> </span>
|
|
978
|
+
<span class="cline-any cline-no"> </span>
|
|
979
|
+
<span class="cline-any cline-no"> </span>
|
|
980
|
+
<span class="cline-any cline-no"> </span>
|
|
981
|
+
<span class="cline-any cline-no"> </span>
|
|
982
|
+
<span class="cline-any cline-no"> </span>
|
|
983
|
+
<span class="cline-any cline-no"> </span>
|
|
984
|
+
<span class="cline-any cline-no"> </span>
|
|
985
|
+
<span class="cline-any cline-no"> </span>
|
|
986
|
+
<span class="cline-any cline-no"> </span>
|
|
987
|
+
<span class="cline-any cline-no"> </span>
|
|
988
|
+
<span class="cline-any cline-no"> </span>
|
|
989
|
+
<span class="cline-any cline-no"> </span>
|
|
990
|
+
<span class="cline-any cline-no"> </span>
|
|
991
|
+
<span class="cline-any cline-no"> </span>
|
|
992
|
+
<span class="cline-any cline-no"> </span>
|
|
993
|
+
<span class="cline-any cline-no"> </span>
|
|
994
|
+
<span class="cline-any cline-no"> </span>
|
|
995
|
+
<span class="cline-any cline-no"> </span>
|
|
996
|
+
<span class="cline-any cline-no"> </span>
|
|
997
|
+
<span class="cline-any cline-no"> </span>
|
|
998
|
+
<span class="cline-any cline-no"> </span>
|
|
999
|
+
<span class="cline-any cline-no"> </span>
|
|
1000
|
+
<span class="cline-any cline-no"> </span>
|
|
1001
|
+
<span class="cline-any cline-no"> </span>
|
|
1002
|
+
<span class="cline-any cline-no"> </span>
|
|
1003
|
+
<span class="cline-any cline-no"> </span>
|
|
1004
|
+
<span class="cline-any cline-no"> </span>
|
|
1005
|
+
<span class="cline-any cline-no"> </span>
|
|
1006
|
+
<span class="cline-any cline-no"> </span>
|
|
1007
|
+
<span class="cline-any cline-no"> </span>
|
|
1008
|
+
<span class="cline-any cline-no"> </span>
|
|
1009
|
+
<span class="cline-any cline-no"> </span>
|
|
1010
|
+
<span class="cline-any cline-no"> </span>
|
|
1011
|
+
<span class="cline-any cline-no"> </span>
|
|
1012
|
+
<span class="cline-any cline-no"> </span>
|
|
1013
|
+
<span class="cline-any cline-no"> </span>
|
|
1014
|
+
<span class="cline-any cline-no"> </span>
|
|
1015
|
+
<span class="cline-any cline-no"> </span>
|
|
1016
|
+
<span class="cline-any cline-no"> </span>
|
|
1017
|
+
<span class="cline-any cline-no"> </span>
|
|
1018
|
+
<span class="cline-any cline-no"> </span>
|
|
1019
|
+
<span class="cline-any cline-no"> </span>
|
|
1020
|
+
<span class="cline-any cline-no"> </span>
|
|
1021
|
+
<span class="cline-any cline-no"> </span>
|
|
1022
|
+
<span class="cline-any cline-no"> </span>
|
|
1023
|
+
<span class="cline-any cline-no"> </span>
|
|
1024
|
+
<span class="cline-any cline-no"> </span>
|
|
1025
|
+
<span class="cline-any cline-no"> </span>
|
|
1026
|
+
<span class="cline-any cline-no"> </span>
|
|
1027
|
+
<span class="cline-any cline-no"> </span>
|
|
1028
|
+
<span class="cline-any cline-no"> </span>
|
|
1029
|
+
<span class="cline-any cline-no"> </span>
|
|
1030
|
+
<span class="cline-any cline-no"> </span>
|
|
1031
|
+
<span class="cline-any cline-no"> </span>
|
|
1032
|
+
<span class="cline-any cline-no"> </span>
|
|
1033
|
+
<span class="cline-any cline-no"> </span>
|
|
1034
|
+
<span class="cline-any cline-no"> </span>
|
|
1035
|
+
<span class="cline-any cline-no"> </span>
|
|
1036
|
+
<span class="cline-any cline-no"> </span>
|
|
1037
|
+
<span class="cline-any cline-no"> </span>
|
|
1038
|
+
<span class="cline-any cline-no"> </span>
|
|
1039
|
+
<span class="cline-any cline-no"> </span>
|
|
1040
|
+
<span class="cline-any cline-no"> </span>
|
|
1041
|
+
<span class="cline-any cline-no"> </span>
|
|
1042
|
+
<span class="cline-any cline-no"> </span>
|
|
1043
|
+
<span class="cline-any cline-no"> </span>
|
|
1044
|
+
<span class="cline-any cline-no"> </span>
|
|
1045
|
+
<span class="cline-any cline-no"> </span>
|
|
1046
|
+
<span class="cline-any cline-no"> </span>
|
|
1047
|
+
<span class="cline-any cline-no"> </span>
|
|
1048
|
+
<span class="cline-any cline-no"> </span>
|
|
1049
|
+
<span class="cline-any cline-no"> </span>
|
|
1050
|
+
<span class="cline-any cline-no"> </span>
|
|
1051
|
+
<span class="cline-any cline-no"> </span>
|
|
1052
|
+
<span class="cline-any cline-no"> </span>
|
|
1053
|
+
<span class="cline-any cline-no"> </span>
|
|
1054
|
+
<span class="cline-any cline-no"> </span>
|
|
1055
|
+
<span class="cline-any cline-no"> </span>
|
|
1056
|
+
<span class="cline-any cline-no"> </span>
|
|
1057
|
+
<span class="cline-any cline-no"> </span>
|
|
1058
|
+
<span class="cline-any cline-no"> </span>
|
|
1059
|
+
<span class="cline-any cline-no"> </span>
|
|
1060
|
+
<span class="cline-any cline-no"> </span>
|
|
1061
|
+
<span class="cline-any cline-no"> </span>
|
|
1062
|
+
<span class="cline-any cline-no"> </span>
|
|
1063
|
+
<span class="cline-any cline-no"> </span>
|
|
1064
|
+
<span class="cline-any cline-no"> </span>
|
|
1065
|
+
<span class="cline-any cline-no"> </span>
|
|
1066
|
+
<span class="cline-any cline-no"> </span>
|
|
1067
|
+
<span class="cline-any cline-no"> </span>
|
|
1068
|
+
<span class="cline-any cline-no"> </span>
|
|
1069
|
+
<span class="cline-any cline-no"> </span>
|
|
1070
|
+
<span class="cline-any cline-no"> </span>
|
|
1071
|
+
<span class="cline-any cline-no"> </span>
|
|
1072
|
+
<span class="cline-any cline-no"> </span>
|
|
1073
|
+
<span class="cline-any cline-no"> </span>
|
|
1074
|
+
<span class="cline-any cline-no"> </span>
|
|
1075
|
+
<span class="cline-any cline-no"> </span>
|
|
1076
|
+
<span class="cline-any cline-no"> </span>
|
|
1077
|
+
<span class="cline-any cline-no"> </span>
|
|
1078
|
+
<span class="cline-any cline-no"> </span>
|
|
1079
|
+
<span class="cline-any cline-no"> </span>
|
|
1080
|
+
<span class="cline-any cline-no"> </span>
|
|
1081
|
+
<span class="cline-any cline-no"> </span>
|
|
1082
|
+
<span class="cline-any cline-no"> </span>
|
|
1083
|
+
<span class="cline-any cline-no"> </span>
|
|
1084
|
+
<span class="cline-any cline-no"> </span>
|
|
1085
|
+
<span class="cline-any cline-no"> </span>
|
|
1086
|
+
<span class="cline-any cline-no"> </span>
|
|
1087
|
+
<span class="cline-any cline-no"> </span>
|
|
1088
|
+
<span class="cline-any cline-no"> </span>
|
|
1089
|
+
<span class="cline-any cline-no"> </span>
|
|
1090
|
+
<span class="cline-any cline-no"> </span>
|
|
1091
|
+
<span class="cline-any cline-no"> </span>
|
|
1092
|
+
<span class="cline-any cline-no"> </span>
|
|
1093
|
+
<span class="cline-any cline-no"> </span>
|
|
1094
|
+
<span class="cline-any cline-no"> </span>
|
|
1095
|
+
<span class="cline-any cline-no"> </span>
|
|
1096
|
+
<span class="cline-any cline-no"> </span>
|
|
1097
|
+
<span class="cline-any cline-no"> </span>
|
|
1098
|
+
<span class="cline-any cline-no"> </span>
|
|
1099
|
+
<span class="cline-any cline-no"> </span>
|
|
1100
|
+
<span class="cline-any cline-no"> </span>
|
|
1101
|
+
<span class="cline-any cline-no"> </span>
|
|
1102
|
+
<span class="cline-any cline-no"> </span>
|
|
1103
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1104
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1105
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1106
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1107
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1108
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1109
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1110
|
+
<span class="cline-any cline-no"> </span>
|
|
1111
|
+
<span class="cline-any cline-no"> </span>
|
|
1112
|
+
<span class="cline-any cline-no"> </span>
|
|
1113
|
+
<span class="cline-any cline-no"> </span>
|
|
1114
|
+
<span class="cline-any cline-no"> </span>
|
|
1115
|
+
<span class="cline-any cline-no"> </span>
|
|
1116
|
+
<span class="cline-any cline-no"> </span>
|
|
1117
|
+
<span class="cline-any cline-no"> </span>
|
|
1118
|
+
<span class="cline-any cline-no"> </span>
|
|
1119
|
+
<span class="cline-any cline-no"> </span>
|
|
1120
|
+
<span class="cline-any cline-no"> </span>
|
|
1121
|
+
<span class="cline-any cline-no"> </span>
|
|
1122
|
+
<span class="cline-any cline-no"> </span>
|
|
1123
|
+
<span class="cline-any cline-no"> </span>
|
|
1124
|
+
<span class="cline-any cline-no"> </span>
|
|
1125
|
+
<span class="cline-any cline-no"> </span>
|
|
1126
|
+
<span class="cline-any cline-no"> </span>
|
|
1127
|
+
<span class="cline-any cline-no"> </span>
|
|
1128
|
+
<span class="cline-any cline-no"> </span>
|
|
1129
|
+
<span class="cline-any cline-no"> </span>
|
|
1130
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1131
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1132
|
+
<span class="cline-any cline-no"> </span>
|
|
1133
|
+
<span class="cline-any cline-no"> </span>
|
|
1134
|
+
<span class="cline-any cline-no"> </span>
|
|
1135
|
+
<span class="cline-any cline-no"> </span>
|
|
1136
|
+
<span class="cline-any cline-no"> </span>
|
|
1137
|
+
<span class="cline-any cline-no"> </span>
|
|
1138
|
+
<span class="cline-any cline-no"> </span>
|
|
1139
|
+
<span class="cline-any cline-no"> </span>
|
|
1140
|
+
<span class="cline-any cline-no"> </span>
|
|
1141
|
+
<span class="cline-any cline-no"> </span>
|
|
1142
|
+
<span class="cline-any cline-no"> </span>
|
|
1143
|
+
<span class="cline-any cline-no"> </span>
|
|
1144
|
+
<span class="cline-any cline-no"> </span>
|
|
1145
|
+
<span class="cline-any cline-no"> </span>
|
|
1146
|
+
<span class="cline-any cline-no"> </span>
|
|
1147
|
+
<span class="cline-any cline-no"> </span>
|
|
1148
|
+
<span class="cline-any cline-no"> </span>
|
|
1149
|
+
<span class="cline-any cline-no"> </span>
|
|
1150
|
+
<span class="cline-any cline-no"> </span>
|
|
1151
|
+
<span class="cline-any cline-no"> </span>
|
|
1152
|
+
<span class="cline-any cline-no"> </span>
|
|
1153
|
+
<span class="cline-any cline-no"> </span>
|
|
1154
|
+
<span class="cline-any cline-no"> </span>
|
|
1155
|
+
<span class="cline-any cline-no"> </span>
|
|
1156
|
+
<span class="cline-any cline-no"> </span>
|
|
1157
|
+
<span class="cline-any cline-no"> </span>
|
|
1158
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1159
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1160
|
+
<span class="cline-any cline-no"> </span>
|
|
1161
|
+
<span class="cline-any cline-no"> </span>
|
|
1162
|
+
<span class="cline-any cline-no"> </span>
|
|
1163
|
+
<span class="cline-any cline-no"> </span>
|
|
1164
|
+
<span class="cline-any cline-no"> </span>
|
|
1165
|
+
<span class="cline-any cline-no"> </span>
|
|
1166
|
+
<span class="cline-any cline-no"> </span>
|
|
1167
|
+
<span class="cline-any cline-no"> </span>
|
|
1168
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1169
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1170
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1171
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1172
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1173
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1174
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1175
|
+
<span class="cline-any cline-no"> </span>
|
|
1176
|
+
<span class="cline-any cline-no"> </span>
|
|
1177
|
+
<span class="cline-any cline-no"> </span>
|
|
1178
|
+
<span class="cline-any cline-no"> </span>
|
|
1179
|
+
<span class="cline-any cline-no"> </span>
|
|
1180
|
+
<span class="cline-any cline-no"> </span>
|
|
1181
|
+
<span class="cline-any cline-no"> </span>
|
|
1182
|
+
<span class="cline-any cline-no"> </span>
|
|
1183
|
+
<span class="cline-any cline-no"> </span>
|
|
1184
|
+
<span class="cline-any cline-no"> </span>
|
|
1185
|
+
<span class="cline-any cline-no"> </span>
|
|
1186
|
+
<span class="cline-any cline-no"> </span>
|
|
1187
|
+
<span class="cline-any cline-no"> </span>
|
|
1188
|
+
<span class="cline-any cline-no"> </span>
|
|
1189
|
+
<span class="cline-any cline-no"> </span>
|
|
1190
|
+
<span class="cline-any cline-no"> </span>
|
|
1191
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1192
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1193
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1194
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1195
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1196
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1197
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1198
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1199
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1200
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1201
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1202
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1203
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1204
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1205
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1206
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1207
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1208
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1209
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1210
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1211
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1212
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1213
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1214
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1215
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1216
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1217
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1218
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1219
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1220
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1221
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1222
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1223
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1224
|
+
<span class="cline-any cline-no"> </span>
|
|
1225
|
+
<span class="cline-any cline-no"> </span>
|
|
1226
|
+
<span class="cline-any cline-no"> </span>
|
|
1227
|
+
<span class="cline-any cline-no"> </span>
|
|
1228
|
+
<span class="cline-any cline-no"> </span>
|
|
1229
|
+
<span class="cline-any cline-no"> </span>
|
|
1230
|
+
<span class="cline-any cline-no"> </span>
|
|
1231
|
+
<span class="cline-any cline-no"> </span>
|
|
1232
|
+
<span class="cline-any cline-no"> </span>
|
|
1233
|
+
<span class="cline-any cline-no"> </span>
|
|
1234
|
+
<span class="cline-any cline-no"> </span>
|
|
1235
|
+
<span class="cline-any cline-no"> </span>
|
|
1236
|
+
<span class="cline-any cline-no"> </span>
|
|
1237
|
+
<span class="cline-any cline-no"> </span>
|
|
1238
|
+
<span class="cline-any cline-no"> </span>
|
|
1239
|
+
<span class="cline-any cline-no"> </span>
|
|
1240
|
+
<span class="cline-any cline-no"> </span>
|
|
1241
|
+
<span class="cline-any cline-no"> </span>
|
|
1242
|
+
<span class="cline-any cline-no"> </span>
|
|
1243
|
+
<span class="cline-any cline-no"> </span>
|
|
1244
|
+
<span class="cline-any cline-no"> </span>
|
|
1245
|
+
<span class="cline-any cline-no"> </span>
|
|
1246
|
+
<span class="cline-any cline-no"> </span>
|
|
1247
|
+
<span class="cline-any cline-no"> </span>
|
|
1248
|
+
<span class="cline-any cline-no"> </span>
|
|
1249
|
+
<span class="cline-any cline-no"> </span>
|
|
1250
|
+
<span class="cline-any cline-no"> </span>
|
|
1251
|
+
<span class="cline-any cline-no"> </span>
|
|
1252
|
+
<span class="cline-any cline-no"> </span>
|
|
1253
|
+
<span class="cline-any cline-no"> </span>
|
|
1254
|
+
<span class="cline-any cline-no"> </span>
|
|
1255
|
+
<span class="cline-any cline-no"> </span>
|
|
1256
|
+
<span class="cline-any cline-no"> </span>
|
|
1257
|
+
<span class="cline-any cline-no"> </span>
|
|
1258
|
+
<span class="cline-any cline-no"> </span>
|
|
1259
|
+
<span class="cline-any cline-no"> </span>
|
|
1260
|
+
<span class="cline-any cline-no"> </span>
|
|
1261
|
+
<span class="cline-any cline-no"> </span>
|
|
1262
|
+
<span class="cline-any cline-no"> </span>
|
|
1263
|
+
<span class="cline-any cline-no"> </span>
|
|
1264
|
+
<span class="cline-any cline-no"> </span>
|
|
1265
|
+
<span class="cline-any cline-no"> </span>
|
|
1266
|
+
<span class="cline-any cline-no"> </span>
|
|
1267
|
+
<span class="cline-any cline-no"> </span>
|
|
1268
|
+
<span class="cline-any cline-no"> </span>
|
|
1269
|
+
<span class="cline-any cline-no"> </span>
|
|
1270
|
+
<span class="cline-any cline-no"> </span>
|
|
1271
|
+
<span class="cline-any cline-no"> </span>
|
|
1272
|
+
<span class="cline-any cline-no"> </span>
|
|
1273
|
+
<span class="cline-any cline-no"> </span>
|
|
1274
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1275
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1276
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1277
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1278
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1279
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1280
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1281
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1282
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1283
|
+
<span class="cline-any cline-no"> </span>
|
|
1284
|
+
<span class="cline-any cline-no"> </span>
|
|
1285
|
+
<span class="cline-any cline-no"> </span>
|
|
1286
|
+
<span class="cline-any cline-no"> </span>
|
|
1287
|
+
<span class="cline-any cline-no"> </span>
|
|
1288
|
+
<span class="cline-any cline-no"> </span>
|
|
1289
|
+
<span class="cline-any cline-no"> </span>
|
|
1290
|
+
<span class="cline-any cline-no"> </span>
|
|
1291
|
+
<span class="cline-any cline-no"> </span>
|
|
1292
|
+
<span class="cline-any cline-no"> </span>
|
|
1293
|
+
<span class="cline-any cline-no"> </span>
|
|
1294
|
+
<span class="cline-any cline-no"> </span>
|
|
1295
|
+
<span class="cline-any cline-no"> </span>
|
|
1296
|
+
<span class="cline-any cline-no"> </span>
|
|
1297
|
+
<span class="cline-any cline-no"> </span>
|
|
1298
|
+
<span class="cline-any cline-no"> </span>
|
|
1299
|
+
<span class="cline-any cline-no"> </span>
|
|
1300
|
+
<span class="cline-any cline-no"> </span>
|
|
1301
|
+
<span class="cline-any cline-no"> </span>
|
|
1302
|
+
<span class="cline-any cline-no"> </span>
|
|
1303
|
+
<span class="cline-any cline-no"> </span>
|
|
1304
|
+
<span class="cline-any cline-no"> </span>
|
|
1305
|
+
<span class="cline-any cline-no"> </span>
|
|
1306
|
+
<span class="cline-any cline-no"> </span>
|
|
1307
|
+
<span class="cline-any cline-no"> </span>
|
|
1308
|
+
<span class="cline-any cline-no"> </span>
|
|
1309
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1310
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1311
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1312
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1313
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1314
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1315
|
+
<span class="cline-any cline-no"> </span>
|
|
1316
|
+
<span class="cline-any cline-no"> </span>
|
|
1317
|
+
<span class="cline-any cline-no"> </span>
|
|
1318
|
+
<span class="cline-any cline-no"> </span>
|
|
1319
|
+
<span class="cline-any cline-no"> </span>
|
|
1320
|
+
<span class="cline-any cline-no"> </span>
|
|
1321
|
+
<span class="cline-any cline-no"> </span>
|
|
1322
|
+
<span class="cline-any cline-no"> </span>
|
|
1323
|
+
<span class="cline-any cline-no"> </span>
|
|
1324
|
+
<span class="cline-any cline-no"> </span>
|
|
1325
|
+
<span class="cline-any cline-no"> </span>
|
|
1326
|
+
<span class="cline-any cline-no"> </span>
|
|
1327
|
+
<span class="cline-any cline-no"> </span>
|
|
1328
|
+
<span class="cline-any cline-no"> </span>
|
|
1329
|
+
<span class="cline-any cline-no"> </span>
|
|
1330
|
+
<span class="cline-any cline-no"> </span>
|
|
1331
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1332
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1333
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1334
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1335
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1336
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1337
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1338
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1339
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1340
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1341
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1342
|
+
<span class="cline-any cline-no"> </span>
|
|
1343
|
+
<span class="cline-any cline-no"> </span>
|
|
1344
|
+
<span class="cline-any cline-no"> </span>
|
|
1345
|
+
<span class="cline-any cline-no"> </span>
|
|
1346
|
+
<span class="cline-any cline-no"> </span>
|
|
1347
|
+
<span class="cline-any cline-no"> </span>
|
|
1348
|
+
<span class="cline-any cline-no"> </span>
|
|
1349
|
+
<span class="cline-any cline-no"> </span>
|
|
1350
|
+
<span class="cline-any cline-no"> </span>
|
|
1351
|
+
<span class="cline-any cline-no"> </span>
|
|
1352
|
+
<span class="cline-any cline-no"> </span>
|
|
1353
|
+
<span class="cline-any cline-no"> </span>
|
|
1354
|
+
<span class="cline-any cline-no"> </span>
|
|
1355
|
+
<span class="cline-any cline-no"> </span>
|
|
1356
|
+
<span class="cline-any cline-no"> </span>
|
|
1357
|
+
<span class="cline-any cline-no"> </span>
|
|
1358
|
+
<span class="cline-any cline-no"> </span>
|
|
1359
|
+
<span class="cline-any cline-no"> </span>
|
|
1360
|
+
<span class="cline-any cline-no"> </span>
|
|
1361
|
+
<span class="cline-any cline-no"> </span>
|
|
1362
|
+
<span class="cline-any cline-no"> </span>
|
|
1363
|
+
<span class="cline-any cline-no"> </span>
|
|
1364
|
+
<span class="cline-any cline-no"> </span>
|
|
1365
|
+
<span class="cline-any cline-no"> </span>
|
|
1366
|
+
<span class="cline-any cline-no"> </span>
|
|
1367
|
+
<span class="cline-any cline-no"> </span>
|
|
1368
|
+
<span class="cline-any cline-no"> </span>
|
|
1369
|
+
<span class="cline-any cline-no"> </span>
|
|
1370
|
+
<span class="cline-any cline-no"> </span>
|
|
1371
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1372
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1373
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1374
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1375
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1376
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1377
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1378
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1379
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1380
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1381
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1382
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1383
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1384
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1385
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1386
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1387
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1388
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1389
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1390
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1391
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1392
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1393
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1394
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1395
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1396
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1397
|
+
<span class="cline-any cline-no"> </span>
|
|
1398
|
+
<span class="cline-any cline-no"> </span>
|
|
1399
|
+
<span class="cline-any cline-no"> </span>
|
|
1400
|
+
<span class="cline-any cline-no"> </span>
|
|
1401
|
+
<span class="cline-any cline-no"> </span>
|
|
1402
|
+
<span class="cline-any cline-no"> </span>
|
|
1403
|
+
<span class="cline-any cline-no"> </span>
|
|
1404
|
+
<span class="cline-any cline-no"> </span>
|
|
1405
|
+
<span class="cline-any cline-no"> </span>
|
|
1406
|
+
<span class="cline-any cline-no"> </span>
|
|
1407
|
+
<span class="cline-any cline-no"> </span>
|
|
1408
|
+
<span class="cline-any cline-no"> </span>
|
|
1409
|
+
<span class="cline-any cline-no"> </span>
|
|
1410
|
+
<span class="cline-any cline-no"> </span>
|
|
1411
|
+
<span class="cline-any cline-no"> </span>
|
|
1412
|
+
<span class="cline-any cline-no"> </span>
|
|
1413
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1414
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1415
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1416
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1417
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1418
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1419
|
+
<span class="cline-any cline-no"> </span>
|
|
1420
|
+
<span class="cline-any cline-no"> </span>
|
|
1421
|
+
<span class="cline-any cline-no"> </span>
|
|
1422
|
+
<span class="cline-any cline-no"> </span>
|
|
1423
|
+
<span class="cline-any cline-no"> </span>
|
|
1424
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1425
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1426
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1427
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1428
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1429
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1430
|
+
<span class="cline-any cline-no"> </span>
|
|
1431
|
+
<span class="cline-any cline-no"> </span>
|
|
1432
|
+
<span class="cline-any cline-no"> </span>
|
|
1433
|
+
<span class="cline-any cline-no"> </span>
|
|
1434
|
+
<span class="cline-any cline-no"> </span>
|
|
1435
|
+
<span class="cline-any cline-no"> </span>
|
|
1436
|
+
<span class="cline-any cline-no"> </span>
|
|
1437
|
+
<span class="cline-any cline-no"> </span>
|
|
1438
|
+
<span class="cline-any cline-no"> </span>
|
|
1439
|
+
<span class="cline-any cline-no"> </span>
|
|
1440
|
+
<span class="cline-any cline-no"> </span>
|
|
1441
|
+
<span class="cline-any cline-no"> </span>
|
|
1442
|
+
<span class="cline-any cline-no"> </span>
|
|
1443
|
+
<span class="cline-any cline-no"> </span>
|
|
1444
|
+
<span class="cline-any cline-no"> </span>
|
|
1445
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1446
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1447
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1448
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1449
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1450
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1451
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1452
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1453
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1454
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1455
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1456
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1457
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1458
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1459
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1460
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1461
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1462
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1463
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1464
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1465
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1466
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1467
|
+
<span class="cline-any cline-yes">22x</span>
|
|
1468
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/**
|
|
1469
|
+
* Runtime adapter for inbound A2A calls.
|
|
1470
|
+
*
|
|
1471
|
+
* Modes:
|
|
1472
|
+
* - openclaw: uses `openclaw` CLI for turn handling, summaries, notifications
|
|
1473
|
+
* - claude: uses `claude` CLI as a real LLM subagent for conversations
|
|
1474
|
+
*
|
|
1475
|
+
* - test: minimal runtime for CI/headless — echoes messages or spawns A2A_AGENT_COMMAND
|
|
1476
|
+
*
|
|
1477
|
+
* Selection:
|
|
1478
|
+
* - A2A_RUNTIME=openclaw|claude|test|auto (default: auto)
|
|
1479
|
+
* - auto picks openclaw → claude → error (no supported CLI)
|
|
1480
|
+
*/
|
|
1481
|
+
|
|
1482
|
+
const { execSync, spawnSync } = require('child_process');
|
|
1483
|
+
const { createLogger } = require('./logger');
|
|
1484
|
+
const {
|
|
1485
|
+
runClaudeTurn: invokeClaudeTurn,
|
|
1486
|
+
buildSubagentSystemPrompt,
|
|
1487
|
+
runClaudeSummary,
|
|
1488
|
+
resolveClaudeAllowedTools
|
|
1489
|
+
} = require('./claude-subagent');
|
|
1490
|
+
const { getTopicsForTier, formatTopicsForPrompt, loadManifest } = require('./disclosure');
|
|
1491
|
+
const { HARD_FALLBACK_TURN_TIMEOUT_MS } = require('./turn-timeout');
|
|
1492
|
+
|
|
1493
|
+
function commandExists(command) {
|
|
1494
|
+
try {
|
|
1495
|
+
execSync(`command -v ${command}`, { stdio: 'ignore' });
|
|
1496
|
+
return true;
|
|
1497
|
+
} catch (err) {
|
|
1498
|
+
return false;
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
|
|
1502
|
+
function cleanText(value, maxLength = 300) {
|
|
1503
|
+
return String(value <span class="branch-0 cbranch-no" title="branch not covered" >|| '')</span>
|
|
1504
|
+
.replace(/\s+/g, ' ')
|
|
1505
|
+
.trim()
|
|
1506
|
+
.slice(0, maxLength);
|
|
1507
|
+
}
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
function resolveRuntimeMode() {
|
|
1511
|
+
const requested = String(process.env.A2A_RUNTIME || 'auto').trim().toLowerCase();
|
|
1512
|
+
const hasOpenClaw = commandExists('openclaw');
|
|
1513
|
+
const hasClaude = commandExists('claude');
|
|
1514
|
+
|
|
1515
|
+
// A2A-66: test runtime for CI/headless environments — minimal runTurn with
|
|
1516
|
+
// optional A2A_AGENT_COMMAND bridge support.
|
|
1517
|
+
if (requested === 'test') {
|
|
1518
|
+
return {
|
|
1519
|
+
mode: 'test',
|
|
1520
|
+
requested,
|
|
1521
|
+
hasOpenClaw,
|
|
1522
|
+
hasClaude,
|
|
1523
|
+
reason: 'A2A_RUNTIME=test'
|
|
1524
|
+
};
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
if (requested === 'generic') {
|
|
1528
|
+
return {
|
|
1529
|
+
mode: 'none',
|
|
1530
|
+
requested,
|
|
1531
|
+
hasOpenClaw,
|
|
1532
|
+
hasClaude,
|
|
1533
|
+
warning: 'A2A_RUNTIME=generic is no longer supported. Use openclaw or claude runtime.',
|
|
1534
|
+
reason: 'unsupported-generic-mode'
|
|
1535
|
+
};
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1538
|
+
if (requested === 'claude') {
|
|
1539
|
+
if (hasClaude) {
|
|
1540
|
+
return {
|
|
1541
|
+
mode: 'claude',
|
|
1542
|
+
requested,
|
|
1543
|
+
hasOpenClaw,
|
|
1544
|
+
hasClaude,
|
|
1545
|
+
reason: 'A2A_RUNTIME=claude'
|
|
1546
|
+
};
|
|
1547
|
+
}
|
|
1548
|
+
return {
|
|
1549
|
+
mode: 'none',
|
|
1550
|
+
requested,
|
|
1551
|
+
hasOpenClaw,
|
|
1552
|
+
hasClaude,
|
|
1553
|
+
warning: 'A2A_RUNTIME=claude but claude CLI not found; install claude CLI or switch to openclaw',
|
|
1554
|
+
reason: 'forced-claude-missing'
|
|
1555
|
+
};
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
if (requested === 'openclaw') {
|
|
1559
|
+
if (hasOpenClaw) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1560
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1561
|
+
<span class="cstat-no" title="statement not covered" > mode: 'openclaw',</span>
|
|
1562
|
+
<span class="cstat-no" title="statement not covered" > requested,</span>
|
|
1563
|
+
<span class="cstat-no" title="statement not covered" > hasOpenClaw,</span>
|
|
1564
|
+
<span class="cstat-no" title="statement not covered" > hasClaude,</span>
|
|
1565
|
+
<span class="cstat-no" title="statement not covered" > reason: 'A2A_RUNTIME=openclaw'</span>
|
|
1566
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1567
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1568
|
+
return {
|
|
1569
|
+
mode: 'none',
|
|
1570
|
+
requested,
|
|
1571
|
+
hasOpenClaw,
|
|
1572
|
+
hasClaude,
|
|
1573
|
+
warning: 'A2A_RUNTIME=openclaw but openclaw CLI not found; install openclaw CLI or switch to claude',
|
|
1574
|
+
reason: 'forced-openclaw-missing'
|
|
1575
|
+
};
|
|
1576
|
+
}
|
|
1577
|
+
|
|
1578
|
+
// Auto detection chain: openclaw → claude → none
|
|
1579
|
+
if (hasOpenClaw) {
|
|
1580
|
+
return {
|
|
1581
|
+
mode: 'openclaw',
|
|
1582
|
+
requested: 'auto',
|
|
1583
|
+
hasOpenClaw,
|
|
1584
|
+
hasClaude,
|
|
1585
|
+
reason: 'openclaw CLI detected'
|
|
1586
|
+
};
|
|
1587
|
+
}
|
|
1588
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1589
|
+
<span class="cstat-no" title="statement not covered" > if (hasClaude) {</span>
|
|
1590
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1591
|
+
<span class="cstat-no" title="statement not covered" > mode: 'claude',</span>
|
|
1592
|
+
<span class="cstat-no" title="statement not covered" > requested: 'auto',</span>
|
|
1593
|
+
<span class="cstat-no" title="statement not covered" > hasOpenClaw,</span>
|
|
1594
|
+
<span class="cstat-no" title="statement not covered" > hasClaude,</span>
|
|
1595
|
+
<span class="cstat-no" title="statement not covered" > reason: 'claude CLI detected'</span>
|
|
1596
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1597
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1598
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1599
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1600
|
+
<span class="cstat-no" title="statement not covered" > mode: 'none',</span>
|
|
1601
|
+
<span class="cstat-no" title="statement not covered" > requested: 'auto',</span>
|
|
1602
|
+
<span class="cstat-no" title="statement not covered" > hasOpenClaw,</span>
|
|
1603
|
+
<span class="cstat-no" title="statement not covered" > hasClaude,</span>
|
|
1604
|
+
<span class="cstat-no" title="statement not covered" > warning: 'No supported runtime CLI found. Install openclaw or claude CLI.',</span>
|
|
1605
|
+
<span class="cstat-no" title="statement not covered" > reason: 'no supported CLI detected'</span>
|
|
1606
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function normalizeOpenClawOutput(raw) {</span></span>
|
|
1610
|
+
<span class="cstat-no" title="statement not covered" > const lines = String(raw || '')</span>
|
|
1611
|
+
<span class="cstat-no" title="statement not covered" > .split('\n')</span>
|
|
1612
|
+
<span class="cstat-no" title="statement not covered" > .filter(line => {</span>
|
|
1613
|
+
<span class="cstat-no" title="statement not covered" > if (!line.trim()) return false;</span>
|
|
1614
|
+
<span class="cstat-no" title="statement not covered" > if (line.includes('[telegram-topic-tracker]')) return false;</span>
|
|
1615
|
+
<span class="cstat-no" title="statement not covered" > if (line.includes('Plugin registered')) return false;</span>
|
|
1616
|
+
<span class="cstat-no" title="statement not covered" > return true;</span>
|
|
1617
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1618
|
+
<span class="cstat-no" title="statement not covered" > return lines.join('\n').trim();</span>
|
|
1619
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1620
|
+
|
|
1621
|
+
|
|
1622
|
+
function readPositiveIntEnv(name, fallback) {
|
|
1623
|
+
const parsed = Number.parseInt(process.env[name] || '', 10);
|
|
1624
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1627
|
+
function createRuntimeAdapter(options = {}) {
|
|
1628
|
+
const workspaceDir = options.workspaceDir <span class="branch-0 cbranch-no" title="branch not covered" >|| process.cwd();</span>
|
|
1629
|
+
const modeInfo = resolveRuntimeMode();
|
|
1630
|
+
const logger = options.logger || createLogger({ component: 'a2a.runtime' });
|
|
1631
|
+
|
|
1632
|
+
logger.info('Runtime adapter initialized', {
|
|
1633
|
+
event: 'runtime_initialized',
|
|
1634
|
+
data: {
|
|
1635
|
+
mode: modeInfo.mode,
|
|
1636
|
+
requested_mode: modeInfo.requested,
|
|
1637
|
+
reason: modeInfo.reason,
|
|
1638
|
+
has_openclaw: modeInfo.hasOpenClaw,
|
|
1639
|
+
has_claude: modeInfo.hasClaude
|
|
1640
|
+
}
|
|
1641
|
+
});
|
|
1642
|
+
|
|
1643
|
+
// Claude state tracking.
|
|
1644
|
+
// Design decision (A2A-29): we keep per-conversation state for prompt/metadata
|
|
1645
|
+
// continuity, but Claude execution itself is stateless (no `--resume`).
|
|
1646
|
+
const claudeSessions = new Map();
|
|
1647
|
+
const CLAUDE_SESSION_TTL_MS = readPositiveIntEnv('A2A_CLAUDE_SESSION_TTL_MS', 6 * 60 * 60 * 1000);
|
|
1648
|
+
const MAX_CLAUDE_SESSIONS = readPositiveIntEnv('A2A_CLAUDE_MAX_SESSIONS', 500);
|
|
1649
|
+
|
|
1650
|
+
// A2A-69: TTL-based pruning for Claude session state.
|
|
1651
|
+
// Follows the same pattern as pruneCollaborationSessions() in server.js:
|
|
1652
|
+
// 1. Evict entries older than TTL
|
|
1653
|
+
// 2. If still over max, evict oldest-first
|
|
1654
|
+
function pruneClaudeSessions() {
|
|
1655
|
+
const now = Date.now();
|
|
1656
|
+
for (const [id, session] of claudeSessions.entries()) {
|
|
1657
|
+
const updatedAt = Number(session?.updatedAt || 0);
|
|
1658
|
+
if (!updatedAt || now - updatedAt > CLAUDE_SESSION_TTL_MS) {
|
|
1659
|
+
claudeSessions.delete(id);
|
|
1660
|
+
}
|
|
1661
|
+
}
|
|
1662
|
+
|
|
1663
|
+
if (claudeSessions.size <= MAX_CLAUDE_SESSIONS) {
|
|
1664
|
+
return;
|
|
1665
|
+
}
|
|
1666
|
+
|
|
1667
|
+
const oldest = Array.from(claudeSessions.entries())
|
|
1668
|
+
.sort((a, b) => (a[1]?.updatedAt <span class="branch-0 cbranch-no" title="branch not covered" >|| 0)</span> - (b[1]?.updatedAt <span class="branch-0 cbranch-no" title="branch not covered" >|| 0)</span>);
|
|
1669
|
+
const toDelete = claudeSessions.size - MAX_CLAUDE_SESSIONS;
|
|
1670
|
+
for (let i = 0; i < toDelete; i++) {
|
|
1671
|
+
claudeSessions.delete(oldest[i][0]);
|
|
1672
|
+
}
|
|
1673
|
+
}
|
|
1674
|
+
|
|
1675
|
+
<span class="fstat-no" title="function not covered" > async function runClaudeTurnAdapter({ sessionId, message, caller, context, timeoutMs }) {</span>
|
|
1676
|
+
<span class="cstat-no" title="statement not covered" > const traceId = context?.traceId || context?.trace_id;</span>
|
|
1677
|
+
<span class="cstat-no" title="statement not covered" > const requestId = context?.requestId || context?.request_id;</span>
|
|
1678
|
+
<span class="cstat-no" title="statement not covered" > const conversationId = context?.conversationId || context?.conversation_id;</span>
|
|
1679
|
+
<span class="cstat-no" title="statement not covered" > const startAt = Date.now();</span>
|
|
1680
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1681
|
+
<span class="cstat-no" title="statement not covered" > // A2A-69: prune stale sessions before accessing/creating state</span>
|
|
1682
|
+
<span class="cstat-no" title="statement not covered" > pruneClaudeSessions();</span>
|
|
1683
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1684
|
+
<span class="cstat-no" title="statement not covered" > // Get or create session state</span>
|
|
1685
|
+
<span class="cstat-no" title="statement not covered" > let session = claudeSessions.get(sessionId);</span>
|
|
1686
|
+
<span class="cstat-no" title="statement not covered" > if (!session) {</span>
|
|
1687
|
+
<span class="cstat-no" title="statement not covered" > // First turn: build the system prompt from disclosure context</span>
|
|
1688
|
+
<span class="cstat-no" title="statement not covered" > const manifest = loadManifest();</span>
|
|
1689
|
+
<span class="cstat-no" title="statement not covered" > const tierTopics = getTopicsForTier(context?.tier || 'public');</span>
|
|
1690
|
+
<span class="cstat-no" title="statement not covered" > const formatted = formatTopicsForPrompt(tierTopics);</span>
|
|
1691
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1692
|
+
<span class="cstat-no" title="statement not covered" > session = {</span>
|
|
1693
|
+
<span class="cstat-no" title="statement not covered" > systemPrompt: '',</span>
|
|
1694
|
+
<span class="cstat-no" title="statement not covered" > turnCount: 0,</span>
|
|
1695
|
+
<span class="cstat-no" title="statement not covered" > lastMeta: null,</span>
|
|
1696
|
+
<span class="cstat-no" title="statement not covered" > updatedAt: Date.now(),</span>
|
|
1697
|
+
<span class="cstat-no" title="statement not covered" > // Keep a permission snapshot so summary runs with the same policy envelope.</span>
|
|
1698
|
+
<span class="cstat-no" title="statement not covered" > permissionSnapshot: {</span>
|
|
1699
|
+
<span class="cstat-no" title="statement not covered" > capabilities: Array.isArray(context?.capabilities) ? context.capabilities : [],</span>
|
|
1700
|
+
<span class="cstat-no" title="statement not covered" > allowedTopics: Array.isArray(context?.allowedTopics || context?.allowed_topics)</span>
|
|
1701
|
+
<span class="cstat-no" title="statement not covered" > ? (context?.allowedTopics || context?.allowed_topics)</span>
|
|
1702
|
+
<span class="cstat-no" title="statement not covered" > : [],</span>
|
|
1703
|
+
<span class="cstat-no" title="statement not covered" > allowedTools: Array.isArray(context?.allowedTools || context?.allowed_tools)</span>
|
|
1704
|
+
<span class="cstat-no" title="statement not covered" > ? (context?.allowedTools || context?.allowed_tools)</span>
|
|
1705
|
+
<span class="cstat-no" title="statement not covered" > : []</span>
|
|
1706
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1707
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1708
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1709
|
+
<span class="cstat-no" title="statement not covered" > const sessionAllowedTools = resolveClaudeAllowedTools({</span>
|
|
1710
|
+
<span class="cstat-no" title="statement not covered" > capabilities: session.permissionSnapshot.capabilities,</span>
|
|
1711
|
+
<span class="cstat-no" title="statement not covered" > allowedTopics: session.permissionSnapshot.allowedTopics,</span>
|
|
1712
|
+
<span class="cstat-no" title="statement not covered" > allowedTools: session.permissionSnapshot.allowedTools</span>
|
|
1713
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1714
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1715
|
+
<span class="cstat-no" title="statement not covered" > session.systemPrompt = buildSubagentSystemPrompt({</span>
|
|
1716
|
+
<span class="cstat-no" title="statement not covered" > agentName: context?.agentName || 'Agent',</span>
|
|
1717
|
+
<span class="cstat-no" title="statement not covered" > ownerName: context?.ownerName || 'the owner',</span>
|
|
1718
|
+
<span class="cstat-no" title="statement not covered" > otherAgentName: caller?.name || 'Remote Agent',</span>
|
|
1719
|
+
<span class="cstat-no" title="statement not covered" > otherOwnerName: caller?.owner || 'their owner',</span>
|
|
1720
|
+
<span class="cstat-no" title="statement not covered" > accessTier: context?.tier || 'public',</span>
|
|
1721
|
+
<span class="cstat-no" title="statement not covered" > tierTopics: formatted.topics,</span>
|
|
1722
|
+
<span class="cstat-no" title="statement not covered" > tierObjectives: formatted.objectives,</span>
|
|
1723
|
+
<span class="cstat-no" title="statement not covered" > doNotDiscuss: formatted.doNotDiscuss,</span>
|
|
1724
|
+
<span class="cstat-no" title="statement not covered" > neverDisclose: formatted.neverDisclose,</span>
|
|
1725
|
+
<span class="cstat-no" title="statement not covered" > personalityNotes: manifest.personality_notes || '',</span>
|
|
1726
|
+
<span class="cstat-no" title="statement not covered" > roleContext: context?.roleContext || '',</span>
|
|
1727
|
+
<span class="cstat-no" title="statement not covered" > allowedTools: sessionAllowedTools</span>
|
|
1728
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1729
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1730
|
+
<span class="cstat-no" title="statement not covered" > claudeSessions.set(sessionId, session);</span>
|
|
1731
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1732
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1733
|
+
<span class="cstat-no" title="statement not covered" > session.updatedAt = Date.now();</span>
|
|
1734
|
+
<span class="cstat-no" title="statement not covered" > session.turnCount++;</span>
|
|
1735
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1736
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Invoking Claude subagent turn', {</span>
|
|
1737
|
+
<span class="cstat-no" title="statement not covered" > event: 'claude_turn_start',</span>
|
|
1738
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
1739
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
1740
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
1741
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
1742
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
1743
|
+
<span class="cstat-no" title="statement not covered" > turn: session.turnCount,</span>
|
|
1744
|
+
<span class="cstat-no" title="statement not covered" > timeout_ms: timeoutMs</span>
|
|
1745
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1746
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1747
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1748
|
+
<span class="cstat-no" title="statement not covered" > const result = await invokeClaudeTurn({</span>
|
|
1749
|
+
<span class="cstat-no" title="statement not covered" > systemPrompt: session.systemPrompt,</span>
|
|
1750
|
+
<span class="cstat-no" title="statement not covered" > turnMessage: message,</span>
|
|
1751
|
+
<span class="cstat-no" title="statement not covered" > turn: session.turnCount,</span>
|
|
1752
|
+
<span class="cstat-no" title="statement not covered" > maxTurns: context?.maxTurns || 30,</span>
|
|
1753
|
+
<span class="cstat-no" title="statement not covered" > phase: context?.phase || 'handshake',</span>
|
|
1754
|
+
<span class="cstat-no" title="statement not covered" > overlapScore: context?.overlapScore || 0.15,</span>
|
|
1755
|
+
<span class="cstat-no" title="statement not covered" > activeThreads: context?.activeThreads || [],</span>
|
|
1756
|
+
<span class="cstat-no" title="statement not covered" > candidateCollaborations: context?.candidateCollaborations || [],</span>
|
|
1757
|
+
<span class="cstat-no" title="statement not covered" > closeSignal: context?.closeSignal || false,</span>
|
|
1758
|
+
<span class="cstat-no" title="statement not covered" > capabilities: Array.isArray(context?.capabilities)</span>
|
|
1759
|
+
<span class="cstat-no" title="statement not covered" > ? context.capabilities</span>
|
|
1760
|
+
<span class="cstat-no" title="statement not covered" > : (session.permissionSnapshot?.capabilities || []),</span>
|
|
1761
|
+
<span class="cstat-no" title="statement not covered" > allowedTopics: Array.isArray(context?.allowedTopics || context?.allowed_topics)</span>
|
|
1762
|
+
<span class="cstat-no" title="statement not covered" > ? (context?.allowedTopics || context?.allowed_topics)</span>
|
|
1763
|
+
<span class="cstat-no" title="statement not covered" > : (session.permissionSnapshot?.allowedTopics || []),</span>
|
|
1764
|
+
<span class="cstat-no" title="statement not covered" > allowedTools: Array.isArray(context?.allowedTools || context?.allowed_tools)</span>
|
|
1765
|
+
<span class="cstat-no" title="statement not covered" > ? (context?.allowedTools || context?.allowed_tools)</span>
|
|
1766
|
+
<span class="cstat-no" title="statement not covered" > : (session.permissionSnapshot?.allowedTools || []),</span>
|
|
1767
|
+
<span class="cstat-no" title="statement not covered" > timeoutMs: timeoutMs || HARD_FALLBACK_TURN_TIMEOUT_MS</span>
|
|
1768
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1769
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1770
|
+
<span class="cstat-no" title="statement not covered" > // Update permission snapshot if the caller supplied explicit context this turn.</span>
|
|
1771
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(context?.capabilities)) {</span>
|
|
1772
|
+
<span class="cstat-no" title="statement not covered" > session.permissionSnapshot.capabilities = context.capabilities;</span>
|
|
1773
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1774
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(context?.allowedTopics || context?.allowed_topics)) {</span>
|
|
1775
|
+
<span class="cstat-no" title="statement not covered" > session.permissionSnapshot.allowedTopics = context?.allowedTopics || context?.allowed_topics;</span>
|
|
1776
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1777
|
+
<span class="cstat-no" title="statement not covered" > if (Array.isArray(context?.allowedTools || context?.allowed_tools)) {</span>
|
|
1778
|
+
<span class="cstat-no" title="statement not covered" > session.permissionSnapshot.allowedTools = context?.allowedTools || context?.allowed_tools;</span>
|
|
1779
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1780
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1781
|
+
<span class="cstat-no" title="statement not covered" > // Store flags/state for retrieval via getLastTurnMeta</span>
|
|
1782
|
+
<span class="cstat-no" title="statement not covered" > session.lastMeta = {</span>
|
|
1783
|
+
<span class="cstat-no" title="statement not covered" > statePatch: result.statePatch,</span>
|
|
1784
|
+
<span class="cstat-no" title="statement not covered" > flags: result.flags</span>
|
|
1785
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1786
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1787
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Claude subagent turn completed', {</span>
|
|
1788
|
+
<span class="cstat-no" title="statement not covered" > event: 'claude_turn_complete',</span>
|
|
1789
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
1790
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
1791
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
1792
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
1793
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
1794
|
+
<span class="cstat-no" title="statement not covered" > turn: session.turnCount,</span>
|
|
1795
|
+
<span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - startAt,</span>
|
|
1796
|
+
<span class="cstat-no" title="statement not covered" > message_length: result.message.length,</span>
|
|
1797
|
+
<span class="cstat-no" title="statement not covered" > has_state_patch: Boolean(result.statePatch),</span>
|
|
1798
|
+
<span class="cstat-no" title="statement not covered" > flag_count: result.flags.length</span>
|
|
1799
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1800
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1801
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1802
|
+
<span class="cstat-no" title="statement not covered" > return result.message;</span>
|
|
1803
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1804
|
+
|
|
1805
|
+
function getLastTurnMeta(sessionId) {
|
|
1806
|
+
const session = claudeSessions.get(sessionId);
|
|
1807
|
+
return session<span class="branch-0 cbranch-no" title="branch not covered" >?.lastMeta </span>|| null;
|
|
1808
|
+
}
|
|
1809
|
+
|
|
1810
|
+
<span class="fstat-no" title="function not covered" > async function runOpenClawTurn({ sessionId, prompt, timeoutMs }) {</span>
|
|
1811
|
+
<span class="cstat-no" title="statement not covered" > const timeoutSeconds = Math.max(5, Math.min(300, Math.round((timeoutMs || 65000) / 1000)));</span>
|
|
1812
|
+
<span class="cstat-no" title="statement not covered" > // Use spawnSync with stdin to avoid shell escaping issues with complex prompts</span>
|
|
1813
|
+
<span class="cstat-no" title="statement not covered" > const result = spawnSync('openclaw', [</span>
|
|
1814
|
+
<span class="cstat-no" title="statement not covered" > 'agent',</span>
|
|
1815
|
+
<span class="cstat-no" title="statement not covered" > '--session-id', sessionId,</span>
|
|
1816
|
+
<span class="cstat-no" title="statement not covered" > '--message', prompt,</span>
|
|
1817
|
+
<span class="cstat-no" title="statement not covered" > '--timeout', String(timeoutSeconds)</span>
|
|
1818
|
+
<span class="cstat-no" title="statement not covered" > ], {</span>
|
|
1819
|
+
<span class="cstat-no" title="statement not covered" > encoding: 'utf8',</span>
|
|
1820
|
+
<span class="cstat-no" title="statement not covered" > timeout: (timeoutMs || 65000) + 5000,</span>
|
|
1821
|
+
<span class="cstat-no" title="statement not covered" > maxBuffer: 1024 * 1024,</span>
|
|
1822
|
+
<span class="cstat-no" title="statement not covered" > cwd: workspaceDir,</span>
|
|
1823
|
+
<span class="cstat-no" title="statement not covered" > env: { ...process.env, FORCE_COLOR: '0' }</span>
|
|
1824
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1825
|
+
<span class="cstat-no" title="statement not covered" > const output = (result.stdout || '') + (result.stderr || '');</span>
|
|
1826
|
+
<span class="cstat-no" title="statement not covered" > if (result.error) {</span>
|
|
1827
|
+
<span class="cstat-no" title="statement not covered" > throw result.error;</span>
|
|
1828
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1829
|
+
<span class="cstat-no" title="statement not covered" > return normalizeOpenClawOutput(output) || '[Sub-agent returned empty response]';</span>
|
|
1830
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1831
|
+
|
|
1832
|
+
<span class="fstat-no" title="function not covered" > async function runOpenClawSummary({ sessionId, prompt, timeoutMs }) {</span>
|
|
1833
|
+
<span class="cstat-no" title="statement not covered" > const timeoutSeconds = Math.max(5, Math.min(120, Math.round((timeoutMs || 35000) / 1000)));</span>
|
|
1834
|
+
<span class="cstat-no" title="statement not covered" > // Use spawnSync with stdin to avoid shell escaping issues with complex prompts</span>
|
|
1835
|
+
<span class="cstat-no" title="statement not covered" > const result = spawnSync('openclaw', [</span>
|
|
1836
|
+
<span class="cstat-no" title="statement not covered" > 'agent',</span>
|
|
1837
|
+
<span class="cstat-no" title="statement not covered" > '--session-id', sessionId,</span>
|
|
1838
|
+
<span class="cstat-no" title="statement not covered" > '--message', prompt,</span>
|
|
1839
|
+
<span class="cstat-no" title="statement not covered" > '--timeout', String(timeoutSeconds)</span>
|
|
1840
|
+
<span class="cstat-no" title="statement not covered" > ], {</span>
|
|
1841
|
+
<span class="cstat-no" title="statement not covered" > encoding: 'utf8',</span>
|
|
1842
|
+
<span class="cstat-no" title="statement not covered" > timeout: (timeoutMs || 35000) + 5000,</span>
|
|
1843
|
+
<span class="cstat-no" title="statement not covered" > cwd: workspaceDir,</span>
|
|
1844
|
+
<span class="cstat-no" title="statement not covered" > env: { ...process.env, FORCE_COLOR: '0' }</span>
|
|
1845
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1846
|
+
<span class="cstat-no" title="statement not covered" > const output = (result.stdout || '') + (result.stderr || '');</span>
|
|
1847
|
+
<span class="cstat-no" title="statement not covered" > if (result.error) {</span>
|
|
1848
|
+
<span class="cstat-no" title="statement not covered" > throw result.error;</span>
|
|
1849
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1850
|
+
<span class="cstat-no" title="statement not covered" > const summaryText = cleanText(normalizeOpenClawOutput(output), 1500);</span>
|
|
1851
|
+
<span class="cstat-no" title="statement not covered" > if (!summaryText) {</span>
|
|
1852
|
+
<span class="cstat-no" title="statement not covered" > return null;</span>
|
|
1853
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1854
|
+
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
1855
|
+
<span class="cstat-no" title="statement not covered" > summary: summaryText,</span>
|
|
1856
|
+
<span class="cstat-no" title="statement not covered" > ownerSummary: summaryText</span>
|
|
1857
|
+
<span class="cstat-no" title="statement not covered" > };</span>
|
|
1858
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1859
|
+
|
|
1860
|
+
<span class="fstat-no" title="function not covered" > async function runOpenClawNotify({ callerName, callerOwner, message }) {</span>
|
|
1861
|
+
<span class="cstat-no" title="statement not covered" > const notification = `🤝 **A2A Call**\nFrom: ${callerName}${callerOwner}\n> ${message.slice(0, 150)}...`;</span>
|
|
1862
|
+
<span class="cstat-no" title="statement not covered" > // Use spawnSync to avoid shell escaping issues</span>
|
|
1863
|
+
<span class="cstat-no" title="statement not covered" > spawnSync('openclaw', [</span>
|
|
1864
|
+
<span class="cstat-no" title="statement not covered" > 'message', 'send',</span>
|
|
1865
|
+
<span class="cstat-no" title="statement not covered" > '--channel', 'telegram',</span>
|
|
1866
|
+
<span class="cstat-no" title="statement not covered" > '--message', notification</span>
|
|
1867
|
+
<span class="cstat-no" title="statement not covered" > ], { timeout: 10000, stdio: 'pipe' });</span>
|
|
1868
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1869
|
+
|
|
1870
|
+
async function runTurn({ sessionId, prompt, message, caller, context = {}, timeoutMs }) {
|
|
1871
|
+
const traceId = context?.traceId || context?.trace_id;
|
|
1872
|
+
const requestId = context?.requestId || context?.request_id;
|
|
1873
|
+
const conversationId = context?.conversationId || context?.conversation_id;
|
|
1874
|
+
|
|
1875
|
+
if (modeInfo.mode === 'claude') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1876
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1877
|
+
<span class="cstat-no" title="statement not covered" > return await runClaudeTurnAdapter({ sessionId, message, caller, context, timeoutMs });</span>
|
|
1878
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
1879
|
+
<span class="cstat-no" title="statement not covered" > logger.error('Claude subagent turn failed', {</span>
|
|
1880
|
+
<span class="cstat-no" title="statement not covered" > event: 'claude_turn_failed',</span>
|
|
1881
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
1882
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
1883
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
1884
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'CLAUDE_TURN_FAILED',</span>
|
|
1885
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Inspect Claude CLI availability, timeout settings, and CLAUDECODE env var.',</span>
|
|
1886
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
1887
|
+
<span class="cstat-no" title="statement not covered" > data: { session_id: sessionId, timeout_ms: timeoutMs }</span>
|
|
1888
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1889
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
1890
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1891
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1892
|
+
|
|
1893
|
+
// A2A-66: test runtime — spawn A2A_AGENT_COMMAND if set, otherwise echo.
|
|
1894
|
+
// Uses shell: true so the command string is parsed by the shell (supports
|
|
1895
|
+
// quoted args, paths with spaces, pipes, etc.).
|
|
1896
|
+
if (modeInfo.mode === 'test') {
|
|
1897
|
+
const agentCommand = process.env.A2A_AGENT_COMMAND;
|
|
1898
|
+
if (agentCommand) {
|
|
1899
|
+
const payload = JSON.stringify({ message, caller, context });
|
|
1900
|
+
const result = spawnSync(agentCommand, {
|
|
1901
|
+
input: payload,
|
|
1902
|
+
encoding: 'utf8',
|
|
1903
|
+
shell: true,
|
|
1904
|
+
timeout: (timeoutMs || 65000) + 5000,
|
|
1905
|
+
maxBuffer: 1024 * 1024,
|
|
1906
|
+
cwd: workspaceDir,
|
|
1907
|
+
env: process.env
|
|
1908
|
+
});
|
|
1909
|
+
if (result.error) {
|
|
1910
|
+
throw result.error;
|
|
1911
|
+
}
|
|
1912
|
+
// A2A-66: check exit code — non-zero means the bridge command failed.
|
|
1913
|
+
if (result.status !== 0) {
|
|
1914
|
+
const stderr = String(result.stderr || '').trim();
|
|
1915
|
+
throw new Error(
|
|
1916
|
+
`A2A_AGENT_COMMAND exited with code ${result.status}` +
|
|
1917
|
+
(stderr <span class="branch-0 cbranch-no" title="branch not covered" >? `: ${stderr.slice(0, 200)}` </span>: '')
|
|
1918
|
+
);
|
|
1919
|
+
}
|
|
1920
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > return String(result.stdout || '')</span>.trim() <span class="branch-0 cbranch-no" title="branch not covered" >|| '[test-runtime] Empty command output';</span>
|
|
1921
|
+
}
|
|
1922
|
+
const snippet = cleanText(message <span class="branch-0 cbranch-no" title="branch not covered" >|| prompt <span class="branch-0 cbranch-no" title="branch not covered" ></span>|| '',</span> 120);
|
|
1923
|
+
return `[test-runtime] Echo: ${snippet}`;
|
|
1924
|
+
}
|
|
1925
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
1926
|
+
<span class="cstat-no" title="statement not covered" > if (modeInfo.mode !== 'openclaw') {</span>
|
|
1927
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
1928
|
+
<span class="cstat-no" title="statement not covered" > `No supported A2A runtime available (mode=${modeInfo.mode}). ` +</span>
|
|
1929
|
+
<span class="cstat-no" title="statement not covered" > 'Install the openclaw or claude CLI and set A2A_RUNTIME accordingly.'</span>
|
|
1930
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
1931
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1932
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1933
|
+
<span class="cstat-no" title="statement not covered" > const startAt = Date.now();</span>
|
|
1934
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Invoking openclaw turn', {</span>
|
|
1935
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_turn_start',</span>
|
|
1936
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
1937
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
1938
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
1939
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
1940
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
1941
|
+
<span class="cstat-no" title="statement not covered" > timeout_ms: timeoutMs</span>
|
|
1942
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1943
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1944
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1945
|
+
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
1946
|
+
<span class="cstat-no" title="statement not covered" > const response = await runOpenClawTurn({ sessionId, prompt, timeoutMs });</span>
|
|
1947
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('OpenClaw turn completed', {</span>
|
|
1948
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_turn_complete',</span>
|
|
1949
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
1950
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
1951
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
1952
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
1953
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
1954
|
+
<span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - startAt</span>
|
|
1955
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1956
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1957
|
+
<span class="cstat-no" title="statement not covered" > return response;</span>
|
|
1958
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
1959
|
+
<span class="cstat-no" title="statement not covered" > logger.error('OpenClaw turn failed', {</span>
|
|
1960
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_turn_failed',</span>
|
|
1961
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
1962
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
1963
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
1964
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'OPENCLAW_TURN_FAILED',</span>
|
|
1965
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Inspect OpenClaw CLI output, timeout settings, and environment PATH.',</span>
|
|
1966
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
1967
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
1968
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
1969
|
+
<span class="cstat-no" title="statement not covered" > timeout_ms: timeoutMs,</span>
|
|
1970
|
+
<span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - startAt</span>
|
|
1971
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1972
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
1973
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
1974
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
async function summarize({ sessionId, prompt, messages, callerInfo, traceId, conversationId, timeoutMs }) {
|
|
1978
|
+
const effectiveTraceId = traceId || callerInfo<span class="branch-0 cbranch-no" title="branch not covered" >?.trace_id </span>|| callerInfo<span class="branch-0 cbranch-no" title="branch not covered" >?.traceId;</span>
|
|
1979
|
+
const requestId = callerInfo<span class="branch-0 cbranch-no" title="branch not covered" >?.request_id </span>|| callerInfo<span class="branch-0 cbranch-no" title="branch not covered" >?.requestId;</span>
|
|
1980
|
+
const effectiveConversationId = conversationId || callerInfo<span class="branch-0 cbranch-no" title="branch not covered" >?.conversation_id </span>|| callerInfo<span class="branch-0 cbranch-no" title="branch not covered" >?.conversationId;</span>
|
|
1981
|
+
|
|
1982
|
+
// Claude mode: stateless summary invocation (no session restore dependency).
|
|
1983
|
+
if (modeInfo.mode === 'claude') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
1984
|
+
<span class="cstat-no" title="statement not covered" > const session = claudeSessions.get(sessionId);</span>
|
|
1985
|
+
<span class="cstat-no" title="statement not covered" > const capabilities = session?.permissionSnapshot?.capabilities</span>
|
|
1986
|
+
<span class="cstat-no" title="statement not covered" > || callerInfo?.capabilities</span>
|
|
1987
|
+
<span class="cstat-no" title="statement not covered" > || [];</span>
|
|
1988
|
+
<span class="cstat-no" title="statement not covered" > const allowedTopics = session?.permissionSnapshot?.allowedTopics</span>
|
|
1989
|
+
<span class="cstat-no" title="statement not covered" > || callerInfo?.allowedTopics</span>
|
|
1990
|
+
<span class="cstat-no" title="statement not covered" > || callerInfo?.allowed_topics</span>
|
|
1991
|
+
<span class="cstat-no" title="statement not covered" > || [];</span>
|
|
1992
|
+
<span class="cstat-no" title="statement not covered" > const allowedTools = session?.permissionSnapshot?.allowedTools</span>
|
|
1993
|
+
<span class="cstat-no" title="statement not covered" > || callerInfo?.allowedTools</span>
|
|
1994
|
+
<span class="cstat-no" title="statement not covered" > || callerInfo?.allowed_tools</span>
|
|
1995
|
+
<span class="cstat-no" title="statement not covered" > || [];</span>
|
|
1996
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
1997
|
+
<span class="cstat-no" title="statement not covered" > const result = await runClaudeSummary({</span>
|
|
1998
|
+
<span class="cstat-no" title="statement not covered" > prompt,</span>
|
|
1999
|
+
<span class="cstat-no" title="statement not covered" > reason: 'conversation ended',</span>
|
|
2000
|
+
<span class="cstat-no" title="statement not covered" > capabilities,</span>
|
|
2001
|
+
<span class="cstat-no" title="statement not covered" > allowedTopics,</span>
|
|
2002
|
+
<span class="cstat-no" title="statement not covered" > allowedTools,</span>
|
|
2003
|
+
<span class="cstat-no" title="statement not covered" > timeoutMs: timeoutMs || HARD_FALLBACK_TURN_TIMEOUT_MS</span>
|
|
2004
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2005
|
+
<span class="cstat-no" title="statement not covered" > if (result && result.summary) {</span>
|
|
2006
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
2007
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2008
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('Claude summary returned empty result');</span>
|
|
2009
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2010
|
+
|
|
2011
|
+
// A2A-66: test runtime — return canned summary.
|
|
2012
|
+
if (modeInfo.mode === 'test') {
|
|
2013
|
+
const text = 'Test conversation concluded.';
|
|
2014
|
+
return { summary: text, ownerSummary: text };
|
|
2015
|
+
}
|
|
2016
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
2017
|
+
<span class="cstat-no" title="statement not covered" > if (modeInfo.mode !== 'openclaw') {</span>
|
|
2018
|
+
<span class="cstat-no" title="statement not covered" > throw new Error(</span>
|
|
2019
|
+
<span class="cstat-no" title="statement not covered" > `No supported A2A runtime available for summarization (mode=${modeInfo.mode}). ` +</span>
|
|
2020
|
+
<span class="cstat-no" title="statement not covered" > 'Install the openclaw or claude CLI and set A2A_RUNTIME accordingly.'</span>
|
|
2021
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
2022
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2023
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2024
|
+
<span class="cstat-no" title="statement not covered" > const startAt = Date.now();</span>
|
|
2025
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Invoking openclaw summary', {</span>
|
|
2026
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_summary_start',</span>
|
|
2027
|
+
<span class="cstat-no" title="statement not covered" > traceId: effectiveTraceId,</span>
|
|
2028
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
2029
|
+
<span class="cstat-no" title="statement not covered" > conversationId: effectiveConversationId,</span>
|
|
2030
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2031
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
2032
|
+
message_count: Array.isArray(messages) ? messages.length <span class="branch-0 cbranch-no" title="branch not covered" >: 0</span>
|
|
2033
|
+
}
|
|
2034
|
+
});
|
|
2035
|
+
|
|
2036
|
+
try {
|
|
2037
|
+
const result = await runOpenClawSummary({
|
|
2038
|
+
sessionId,
|
|
2039
|
+
prompt,
|
|
2040
|
+
timeoutMs: 35000
|
|
2041
|
+
});
|
|
2042
|
+
<span class="branch-0 cbranch-no" title="branch not covered" > if (result && result.summary)</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
|
|
2043
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('OpenClaw summary completed', {</span>
|
|
2044
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_summary_complete',</span>
|
|
2045
|
+
<span class="cstat-no" title="statement not covered" > traceId: effectiveTraceId,</span>
|
|
2046
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
2047
|
+
<span class="cstat-no" title="statement not covered" > conversationId: effectiveConversationId,</span>
|
|
2048
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2049
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
2050
|
+
<span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - startAt</span>
|
|
2051
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2052
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2053
|
+
<span class="cstat-no" title="statement not covered" > return result;</span>
|
|
2054
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2055
|
+
<span class="cstat-no" title="statement not covered" > throw new Error('OpenClaw summary returned empty output');</span>
|
|
2056
|
+
<span class="cstat-no" title="statement not covered" > } catch (err) {</span>
|
|
2057
|
+
<span class="cstat-no" title="statement not covered" > logger.error('OpenClaw summary failed', {</span>
|
|
2058
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_summary_failed',</span>
|
|
2059
|
+
<span class="cstat-no" title="statement not covered" > traceId: effectiveTraceId,</span>
|
|
2060
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
2061
|
+
<span class="cstat-no" title="statement not covered" > conversationId: effectiveConversationId,</span>
|
|
2062
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'OPENCLAW_SUMMARY_FAILED',</span>
|
|
2063
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Inspect summary message length, timeout configuration, and CLI stderr output.',</span>
|
|
2064
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
2065
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2066
|
+
<span class="cstat-no" title="statement not covered" > session_id: sessionId,</span>
|
|
2067
|
+
<span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - startAt</span>
|
|
2068
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2069
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2070
|
+
<span class="cstat-no" title="statement not covered" > throw err;</span>
|
|
2071
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
async function notify({ level, token, caller, message, conversationId, traceId }) {
|
|
2075
|
+
const requestId = token?.request_id || token?.requestId || null;
|
|
2076
|
+
|
|
2077
|
+
logger.debug('Owner notify requested', {
|
|
2078
|
+
event: 'notify_requested',
|
|
2079
|
+
traceId,
|
|
2080
|
+
requestId,
|
|
2081
|
+
conversationId,
|
|
2082
|
+
tokenId: token?.id,
|
|
2083
|
+
data: { level }
|
|
2084
|
+
});
|
|
2085
|
+
|
|
2086
|
+
if (modeInfo.mode === 'claude' || modeInfo.mode === 'test') {
|
|
2087
|
+
// Claude/test mode: notifications are a no-op (no notification transport available)
|
|
2088
|
+
logger.debug('Notification skipped (no notification transport in this mode)', {
|
|
2089
|
+
event: 'notify_skipped',
|
|
2090
|
+
traceId,
|
|
2091
|
+
requestId,
|
|
2092
|
+
conversationId,
|
|
2093
|
+
tokenId: token?.id,
|
|
2094
|
+
data: { mode: modeInfo.mode }
|
|
2095
|
+
});
|
|
2096
|
+
return;
|
|
2097
|
+
}
|
|
2098
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span>
|
|
2099
|
+
<span class="cstat-no" title="statement not covered" > if (modeInfo.mode !== 'openclaw') {</span>
|
|
2100
|
+
<span class="cstat-no" title="statement not covered" > logger.debug('Notification skipped (no supported runtime)', {</span>
|
|
2101
|
+
<span class="cstat-no" title="statement not covered" > event: 'notify_skipped_no_runtime',</span>
|
|
2102
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
2103
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
2104
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
2105
|
+
<span class="cstat-no" title="statement not covered" > tokenId: token?.id</span>
|
|
2106
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2107
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2108
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2109
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2110
|
+
<span class="cstat-no" title="statement not covered" > if (level !== 'all') {</span>
|
|
2111
|
+
<span class="cstat-no" title="statement not covered" > return;</span>
|
|
2112
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2113
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
2114
|
+
const callerName = caller?.name <span class="branch-0 cbranch-no" title="branch not covered" >|| 'Unknown';</span>
|
|
2115
|
+
const callerOwner = caller<span class="branch-0 cbranch-no" title="branch not covered" >?.owner <span class="branch-0 cbranch-no" title="branch not covered" ></span>? ` (${caller.owner})` <span class="branch-0 cbranch-no" title="branch not covered" ></span>: '';</span>
|
|
2116
|
+
const notifyStart = Date.now();
|
|
2117
|
+
|
|
2118
|
+
try {
|
|
2119
|
+
await runOpenClawNotify({ callerName, callerOwner, message: message <span class="branch-0 cbranch-no" title="branch not covered" >|| '' </span>});
|
|
2120
|
+
<span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > logger.debug('OpenClaw notify completed', {</span></span>
|
|
2121
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_notify_complete',</span>
|
|
2122
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
2123
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
2124
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
2125
|
+
tokenId: token?.id,
|
|
2126
|
+
data: {
|
|
2127
|
+
duration_ms: Date.now() - notifyStart
|
|
2128
|
+
}
|
|
2129
|
+
});
|
|
2130
|
+
} <span class="branch-0 cbranch-no" title="branch not covered" >catch (err) {</span>
|
|
2131
|
+
<span class="cstat-no" title="statement not covered" > // Notifications are best-effort; log and swallow</span>
|
|
2132
|
+
<span class="cstat-no" title="statement not covered" > logger.warn('OpenClaw notify failed', {</span>
|
|
2133
|
+
<span class="cstat-no" title="statement not covered" > event: 'openclaw_notify_failed',</span>
|
|
2134
|
+
<span class="cstat-no" title="statement not covered" > traceId,</span>
|
|
2135
|
+
<span class="cstat-no" title="statement not covered" > requestId,</span>
|
|
2136
|
+
<span class="cstat-no" title="statement not covered" > conversationId,</span>
|
|
2137
|
+
<span class="cstat-no" title="statement not covered" > tokenId: token?.id,</span>
|
|
2138
|
+
<span class="cstat-no" title="statement not covered" > error_code: 'OPENCLAW_NOTIFY_FAILED',</span>
|
|
2139
|
+
<span class="cstat-no" title="statement not covered" > hint: 'Check OpenClaw messaging channel config and notify permissions.',</span>
|
|
2140
|
+
<span class="cstat-no" title="statement not covered" > error: err,</span>
|
|
2141
|
+
<span class="cstat-no" title="statement not covered" > data: {</span>
|
|
2142
|
+
<span class="cstat-no" title="statement not covered" > duration_ms: Date.now() - notifyStart</span>
|
|
2143
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2144
|
+
<span class="cstat-no" title="statement not covered" > });</span>
|
|
2145
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
return {
|
|
2149
|
+
mode: modeInfo.mode,
|
|
2150
|
+
requestedMode: modeInfo.requested,
|
|
2151
|
+
hasOpenClaw: modeInfo.hasOpenClaw,
|
|
2152
|
+
hasClaude: modeInfo.hasClaude,
|
|
2153
|
+
reason: modeInfo.reason,
|
|
2154
|
+
warning: modeInfo.warning || null,
|
|
2155
|
+
runTurn,
|
|
2156
|
+
summarize,
|
|
2157
|
+
notify,
|
|
2158
|
+
getLastTurnMeta,
|
|
2159
|
+
// A2A-69: exposed for testing
|
|
2160
|
+
_claudeSessions: claudeSessions,
|
|
2161
|
+
_pruneClaudeSessions: pruneClaudeSessions
|
|
2162
|
+
};
|
|
2163
|
+
}
|
|
2164
|
+
|
|
2165
|
+
module.exports = {
|
|
2166
|
+
createRuntimeAdapter,
|
|
2167
|
+
resolveRuntimeMode
|
|
2168
|
+
};
|
|
2169
|
+
</pre></td></tr></table></pre>
|
|
2170
|
+
|
|
2171
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
2172
|
+
</div><!-- /wrapper -->
|
|
2173
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
2174
|
+
Code coverage generated by
|
|
2175
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
2176
|
+
at 2026-03-03T22:25:10.857Z
|
|
2177
|
+
</div>
|
|
2178
|
+
<script src="../../prettify.js"></script>
|
|
2179
|
+
<script>
|
|
2180
|
+
window.onload = function () {
|
|
2181
|
+
prettyPrint();
|
|
2182
|
+
};
|
|
2183
|
+
</script>
|
|
2184
|
+
<script src="../../sorter.js"></script>
|
|
2185
|
+
<script src="../../block-navigation.js"></script>
|
|
2186
|
+
</body>
|
|
2187
|
+
</html>
|
|
2188
|
+
|