@4da/mcp-server 3.2.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +234 -62
  3. package/dist/auth.d.ts +36 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +82 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/db.d.ts +100 -2
  8. package/dist/db.d.ts.map +1 -1
  9. package/dist/db.js +707 -1
  10. package/dist/db.js.map +1 -1
  11. package/dist/doctor.d.ts +15 -0
  12. package/dist/doctor.d.ts.map +1 -0
  13. package/dist/doctor.js +124 -0
  14. package/dist/doctor.js.map +1 -0
  15. package/dist/http-transport.d.ts +25 -0
  16. package/dist/http-transport.d.ts.map +1 -0
  17. package/dist/http-transport.js +143 -0
  18. package/dist/http-transport.js.map +1 -0
  19. package/dist/index.d.ts +15 -18
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +195 -250
  22. package/dist/index.js.map +1 -1
  23. package/dist/live/cache.d.ts +16 -0
  24. package/dist/live/cache.d.ts.map +1 -0
  25. package/dist/live/cache.js +61 -0
  26. package/dist/live/cache.js.map +1 -0
  27. package/dist/live/hn-fetcher.d.ts +19 -0
  28. package/dist/live/hn-fetcher.d.ts.map +1 -0
  29. package/dist/live/hn-fetcher.js +123 -0
  30. package/dist/live/hn-fetcher.js.map +1 -0
  31. package/dist/live/index.d.ts +55 -0
  32. package/dist/live/index.d.ts.map +1 -0
  33. package/dist/live/index.js +131 -0
  34. package/dist/live/index.js.map +1 -0
  35. package/dist/live/osv-scanner.d.ts +19 -0
  36. package/dist/live/osv-scanner.d.ts.map +1 -0
  37. package/dist/live/osv-scanner.js +197 -0
  38. package/dist/live/osv-scanner.js.map +1 -0
  39. package/dist/live/rate-limiter.d.ts +19 -0
  40. package/dist/live/rate-limiter.d.ts.map +1 -0
  41. package/dist/live/rate-limiter.js +52 -0
  42. package/dist/live/rate-limiter.js.map +1 -0
  43. package/dist/live/types.d.ts +89 -0
  44. package/dist/live/types.d.ts.map +1 -0
  45. package/dist/live/types.js +3 -0
  46. package/dist/live/types.js.map +1 -0
  47. package/dist/live/version-resolver.d.ts +11 -0
  48. package/dist/live/version-resolver.d.ts.map +1 -0
  49. package/dist/live/version-resolver.js +321 -0
  50. package/dist/live/version-resolver.js.map +1 -0
  51. package/dist/live-singleton.d.ts +9 -0
  52. package/dist/live-singleton.d.ts.map +1 -0
  53. package/dist/live-singleton.js +14 -0
  54. package/dist/live-singleton.js.map +1 -0
  55. package/dist/llm.d.ts +20 -2
  56. package/dist/llm.d.ts.map +1 -1
  57. package/dist/llm.js +80 -22
  58. package/dist/llm.js.map +1 -1
  59. package/dist/output-manager.d.ts.map +1 -1
  60. package/dist/output-manager.js +1 -0
  61. package/dist/output-manager.js.map +1 -1
  62. package/dist/project-scanner.d.ts +27 -0
  63. package/dist/project-scanner.d.ts.map +1 -0
  64. package/dist/project-scanner.js +366 -0
  65. package/dist/project-scanner.js.map +1 -0
  66. package/dist/schema-registry.d.ts +31 -13
  67. package/dist/schema-registry.d.ts.map +1 -1
  68. package/dist/schema-registry.js +208 -32
  69. package/dist/schema-registry.js.map +1 -1
  70. package/dist/schemas/agent-feedback-stats.json +14 -0
  71. package/dist/schemas/agent-memory.json +49 -0
  72. package/dist/schemas/agent-session-brief.json +25 -0
  73. package/dist/schemas/attention-report.json +13 -0
  74. package/dist/schemas/autophagy-status.json +13 -0
  75. package/dist/schemas/compound-advantage.json +14 -0
  76. package/dist/schemas/decision-enforcement.json +22 -0
  77. package/dist/schemas/decision-memory.json +54 -0
  78. package/dist/schemas/decision-windows.json +22 -0
  79. package/dist/schemas/delegation-score.json +18 -0
  80. package/dist/schemas/developer-dna.json +219 -0
  81. package/dist/schemas/export-context.json +17 -0
  82. package/dist/schemas/knowledge-gaps.json +14 -0
  83. package/dist/schemas/preemption-feed.json +18 -0
  84. package/dist/schemas/project-health.json +13 -0
  85. package/dist/schemas/record-agent-feedback.json +28 -0
  86. package/dist/schemas/reverse-mentions.json +13 -0
  87. package/dist/schemas/semantic-shifts.json +17 -0
  88. package/dist/schemas/signal-chains.json +19 -0
  89. package/dist/schemas/tech-radar.json +23 -0
  90. package/dist/schemas/trust-summary.json +13 -0
  91. package/dist/schemas/vulnerability-scan.json +26 -0
  92. package/dist/schemas/what-should-i-know.json +19 -0
  93. package/dist/setup.d.ts +18 -0
  94. package/dist/setup.d.ts.map +1 -0
  95. package/dist/setup.js +171 -0
  96. package/dist/setup.js.map +1 -0
  97. package/dist/tool-dispatch.d.ts +33 -0
  98. package/dist/tool-dispatch.d.ts.map +1 -0
  99. package/dist/tool-dispatch.js +87 -0
  100. package/dist/tool-dispatch.js.map +1 -0
  101. package/dist/tools/agent-feedback-stats.d.ts +30 -0
  102. package/dist/tools/agent-feedback-stats.d.ts.map +1 -0
  103. package/dist/tools/agent-feedback-stats.js +41 -0
  104. package/dist/tools/agent-feedback-stats.js.map +1 -0
  105. package/dist/tools/agent-memory.d.ts +94 -0
  106. package/dist/tools/agent-memory.d.ts.map +1 -0
  107. package/dist/tools/agent-memory.js +262 -0
  108. package/dist/tools/agent-memory.js.map +1 -0
  109. package/dist/tools/agent-session-brief.d.ts +44 -0
  110. package/dist/tools/agent-session-brief.d.ts.map +1 -0
  111. package/dist/tools/agent-session-brief.js +179 -0
  112. package/dist/tools/agent-session-brief.js.map +1 -0
  113. package/dist/tools/attention-report.d.ts +6 -5
  114. package/dist/tools/attention-report.d.ts.map +1 -1
  115. package/dist/tools/attention-report.js +1 -0
  116. package/dist/tools/attention-report.js.map +1 -1
  117. package/dist/tools/autophagy-status.d.ts +25 -0
  118. package/dist/tools/autophagy-status.d.ts.map +1 -0
  119. package/dist/tools/autophagy-status.js +56 -0
  120. package/dist/tools/autophagy-status.js.map +1 -0
  121. package/dist/tools/compound-advantage.d.ts +30 -0
  122. package/dist/tools/compound-advantage.d.ts.map +1 -0
  123. package/dist/tools/compound-advantage.js +133 -0
  124. package/dist/tools/compound-advantage.js.map +1 -0
  125. package/dist/tools/config-validator.d.ts.map +1 -1
  126. package/dist/tools/config-validator.js +31 -0
  127. package/dist/tools/config-validator.js.map +1 -1
  128. package/dist/tools/context-analysis.d.ts.map +1 -1
  129. package/dist/tools/context-analysis.js +1 -0
  130. package/dist/tools/context-analysis.js.map +1 -1
  131. package/dist/tools/daily-briefing.d.ts.map +1 -1
  132. package/dist/tools/daily-briefing.js +17 -1
  133. package/dist/tools/daily-briefing.js.map +1 -1
  134. package/dist/tools/decision-enforcement.d.ts +59 -0
  135. package/dist/tools/decision-enforcement.d.ts.map +1 -0
  136. package/dist/tools/decision-enforcement.js +185 -0
  137. package/dist/tools/decision-enforcement.js.map +1 -0
  138. package/dist/tools/decision-memory.d.ts +132 -0
  139. package/dist/tools/decision-memory.d.ts.map +1 -0
  140. package/dist/tools/decision-memory.js +345 -0
  141. package/dist/tools/decision-memory.js.map +1 -0
  142. package/dist/tools/decision-windows.d.ts +37 -0
  143. package/dist/tools/decision-windows.d.ts.map +1 -0
  144. package/dist/tools/decision-windows.js +67 -0
  145. package/dist/tools/decision-windows.js.map +1 -0
  146. package/dist/tools/delegation-score.d.ts +34 -0
  147. package/dist/tools/delegation-score.d.ts.map +1 -0
  148. package/dist/tools/delegation-score.js +251 -0
  149. package/dist/tools/delegation-score.js.map +1 -0
  150. package/dist/tools/developer-dna.d.ts +79 -0
  151. package/dist/tools/developer-dna.d.ts.map +1 -0
  152. package/dist/tools/developer-dna.js +378 -0
  153. package/dist/tools/developer-dna.js.map +1 -0
  154. package/dist/tools/explain-relevance.d.ts.map +1 -1
  155. package/dist/tools/explain-relevance.js +1 -0
  156. package/dist/tools/explain-relevance.js.map +1 -1
  157. package/dist/tools/export-context.d.ts +23 -6
  158. package/dist/tools/export-context.d.ts.map +1 -1
  159. package/dist/tools/export-context.js +58 -14
  160. package/dist/tools/export-context.js.map +1 -1
  161. package/dist/tools/get-actionable-signals.d.ts.map +1 -1
  162. package/dist/tools/get-actionable-signals.js +60 -9
  163. package/dist/tools/get-actionable-signals.js.map +1 -1
  164. package/dist/tools/get-context.d.ts.map +1 -1
  165. package/dist/tools/get-context.js +1 -0
  166. package/dist/tools/get-context.js.map +1 -1
  167. package/dist/tools/get-relevant-content.d.ts.map +1 -1
  168. package/dist/tools/get-relevant-content.js +3 -0
  169. package/dist/tools/get-relevant-content.js.map +1 -1
  170. package/dist/tools/index.d.ts +26 -16
  171. package/dist/tools/index.d.ts.map +1 -1
  172. package/dist/tools/index.js +35 -16
  173. package/dist/tools/index.js.map +1 -1
  174. package/dist/tools/knowledge-gaps.d.ts +11 -1
  175. package/dist/tools/knowledge-gaps.d.ts.map +1 -1
  176. package/dist/tools/knowledge-gaps.js +9 -3
  177. package/dist/tools/knowledge-gaps.js.map +1 -1
  178. package/dist/tools/llm-status.d.ts.map +1 -1
  179. package/dist/tools/llm-status.js +1 -0
  180. package/dist/tools/llm-status.js.map +1 -1
  181. package/dist/tools/muse-context.d.ts +195 -0
  182. package/dist/tools/muse-context.d.ts.map +1 -0
  183. package/dist/tools/muse-context.js +284 -0
  184. package/dist/tools/muse-context.js.map +1 -0
  185. package/dist/tools/preemption-feed.d.ts +55 -0
  186. package/dist/tools/preemption-feed.d.ts.map +1 -0
  187. package/dist/tools/preemption-feed.js +124 -0
  188. package/dist/tools/preemption-feed.js.map +1 -0
  189. package/dist/tools/project-health.d.ts +12 -6
  190. package/dist/tools/project-health.d.ts.map +1 -1
  191. package/dist/tools/project-health.js +49 -10
  192. package/dist/tools/project-health.js.map +1 -1
  193. package/dist/tools/record-agent-feedback.d.ts +46 -0
  194. package/dist/tools/record-agent-feedback.d.ts.map +1 -0
  195. package/dist/tools/record-agent-feedback.js +71 -0
  196. package/dist/tools/record-agent-feedback.js.map +1 -0
  197. package/dist/tools/record-feedback.d.ts.map +1 -1
  198. package/dist/tools/record-feedback.js +1 -0
  199. package/dist/tools/record-feedback.js.map +1 -1
  200. package/dist/tools/reverse-mentions.d.ts +8 -8
  201. package/dist/tools/reverse-mentions.d.ts.map +1 -1
  202. package/dist/tools/reverse-mentions.js +1 -0
  203. package/dist/tools/reverse-mentions.js.map +1 -1
  204. package/dist/tools/score-autopsy.d.ts.map +1 -1
  205. package/dist/tools/score-autopsy.js +1 -0
  206. package/dist/tools/score-autopsy.js.map +1 -1
  207. package/dist/tools/semantic-shifts.d.ts +17 -1
  208. package/dist/tools/semantic-shifts.d.ts.map +1 -1
  209. package/dist/tools/semantic-shifts.js +1 -0
  210. package/dist/tools/semantic-shifts.js.map +1 -1
  211. package/dist/tools/signal-chains.d.ts +14 -7
  212. package/dist/tools/signal-chains.d.ts.map +1 -1
  213. package/dist/tools/signal-chains.js +5 -2
  214. package/dist/tools/signal-chains.js.map +1 -1
  215. package/dist/tools/source-health.d.ts.map +1 -1
  216. package/dist/tools/source-health.js +1 -0
  217. package/dist/tools/source-health.js.map +1 -1
  218. package/dist/tools/tech-radar.d.ts +38 -0
  219. package/dist/tools/tech-radar.d.ts.map +1 -0
  220. package/dist/tools/tech-radar.js +249 -0
  221. package/dist/tools/tech-radar.js.map +1 -0
  222. package/dist/tools/topic-connections.d.ts.map +1 -1
  223. package/dist/tools/topic-connections.js +1 -0
  224. package/dist/tools/topic-connections.js.map +1 -1
  225. package/dist/tools/trend-analysis.d.ts.map +1 -1
  226. package/dist/tools/trend-analysis.js +1 -0
  227. package/dist/tools/trend-analysis.js.map +1 -1
  228. package/dist/tools/trust-summary.d.ts +38 -0
  229. package/dist/tools/trust-summary.d.ts.map +1 -0
  230. package/dist/tools/trust-summary.js +89 -0
  231. package/dist/tools/trust-summary.js.map +1 -0
  232. package/dist/tools/vulnerability-scan.d.ts +89 -0
  233. package/dist/tools/vulnerability-scan.d.ts.map +1 -0
  234. package/dist/tools/vulnerability-scan.js +127 -0
  235. package/dist/tools/vulnerability-scan.js.map +1 -0
  236. package/dist/tools/what-should-i-know.d.ts +79 -0
  237. package/dist/tools/what-should-i-know.d.ts.map +1 -0
  238. package/dist/tools/what-should-i-know.js +376 -0
  239. package/dist/tools/what-should-i-know.js.map +1 -0
  240. package/dist/types.d.ts +221 -0
  241. package/dist/types.d.ts.map +1 -1
  242. package/dist/types.js +1 -0
  243. package/dist/types.js.map +1 -1
  244. package/package.json +53 -24
@@ -0,0 +1,219 @@
1
+ {
2
+ "name": "developer_dna",
3
+ "description": "Export your Developer DNA — a comprehensive profile of your tech identity built from project scans, engagement data, and learned preferences. Includes primary stack, adjacent tech, top dependencies, engaged topics, blind spots, source engagement rates, and aggregate stats.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "include_blind_spots": {
8
+ "type": "boolean",
9
+ "description": "Include blind spot analysis (dependencies with stale engagement). Default: true",
10
+ "default": true
11
+ },
12
+ "max_dependencies": {
13
+ "type": "number",
14
+ "description": "Maximum dependencies to include. Default: 30",
15
+ "default": 30
16
+ },
17
+ "max_topics": {
18
+ "type": "number",
19
+ "description": "Maximum engaged topics to include. Default: 20",
20
+ "default": 20
21
+ }
22
+ }
23
+ },
24
+ "outputSchema": {
25
+ "$schema": "http://json-schema.org/draft-07/schema#",
26
+ "title": "DeveloperDna",
27
+ "description": "Comprehensive developer identity profile built from local project data and engagement signals.",
28
+ "type": "object",
29
+ "required": [
30
+ "generated_at",
31
+ "primary_stack",
32
+ "adjacent_tech",
33
+ "top_dependencies",
34
+ "interests",
35
+ "top_engaged_topics",
36
+ "blind_spots",
37
+ "source_engagement",
38
+ "stats",
39
+ "identity_summary"
40
+ ],
41
+ "properties": {
42
+ "generated_at": {
43
+ "type": "string",
44
+ "format": "date-time",
45
+ "description": "ISO 8601 timestamp when this DNA profile was generated."
46
+ },
47
+ "primary_stack": {
48
+ "type": "array",
49
+ "items": { "type": "string" },
50
+ "description": "Technologies from the user's declared tech stack (user_identity + tech_stack tables)."
51
+ },
52
+ "adjacent_tech": {
53
+ "type": "array",
54
+ "items": { "type": "string" },
55
+ "description": "Technologies detected by ACE in local projects but not in the declared stack."
56
+ },
57
+ "top_dependencies": {
58
+ "type": "array",
59
+ "items": { "$ref": "#/outputSchema/definitions/DependencyEntry" },
60
+ "description": "Most-used project dependencies across scanned projects."
61
+ },
62
+ "interests": {
63
+ "type": "array",
64
+ "items": { "type": "string" },
65
+ "description": "Explicit interest topics declared by the user."
66
+ },
67
+ "top_engaged_topics": {
68
+ "type": "array",
69
+ "items": { "$ref": "#/outputSchema/definitions/EngagedTopic" },
70
+ "description": "Topics with highest positive engagement from interaction data."
71
+ },
72
+ "blind_spots": {
73
+ "type": "array",
74
+ "items": { "$ref": "#/outputSchema/definitions/BlindSpotEntry" },
75
+ "description": "Dependencies in the codebase with stale or zero engagement."
76
+ },
77
+ "source_engagement": {
78
+ "type": "array",
79
+ "items": { "$ref": "#/outputSchema/definitions/SourceEngagement" },
80
+ "description": "Engagement rates broken down by content source type."
81
+ },
82
+ "stats": {
83
+ "$ref": "#/outputSchema/definitions/DnaStats",
84
+ "description": "Aggregate statistics about the developer's 4DA usage."
85
+ },
86
+ "identity_summary": {
87
+ "type": "string",
88
+ "description": "Human-readable one-paragraph summary of the developer's technical identity."
89
+ }
90
+ },
91
+ "definitions": {
92
+ "DependencyEntry": {
93
+ "type": "object",
94
+ "required": ["name", "project_path"],
95
+ "properties": {
96
+ "name": {
97
+ "type": "string",
98
+ "description": "Package or library name."
99
+ },
100
+ "project_path": {
101
+ "type": "string",
102
+ "description": "Path to the project that uses this dependency."
103
+ }
104
+ }
105
+ },
106
+ "EngagedTopic": {
107
+ "type": "object",
108
+ "required": ["topic", "interactions", "percent_of_total"],
109
+ "properties": {
110
+ "topic": {
111
+ "type": "string",
112
+ "description": "The topic name."
113
+ },
114
+ "interactions": {
115
+ "type": "integer",
116
+ "minimum": 0,
117
+ "description": "Total positive interaction count for this topic."
118
+ },
119
+ "percent_of_total": {
120
+ "type": "number",
121
+ "minimum": 0,
122
+ "maximum": 100,
123
+ "description": "Percentage of total interactions attributed to this topic."
124
+ }
125
+ }
126
+ },
127
+ "BlindSpotEntry": {
128
+ "type": "object",
129
+ "required": ["dependency", "severity", "days_stale"],
130
+ "properties": {
131
+ "dependency": {
132
+ "type": "string",
133
+ "description": "The dependency or technology name."
134
+ },
135
+ "severity": {
136
+ "type": "string",
137
+ "enum": ["critical", "high", "medium", "low"],
138
+ "description": "How urgent the knowledge gap is."
139
+ },
140
+ "days_stale": {
141
+ "type": "integer",
142
+ "minimum": 0,
143
+ "description": "Days since last engagement with content about this dependency."
144
+ }
145
+ }
146
+ },
147
+ "SourceEngagement": {
148
+ "type": "object",
149
+ "required": ["source_type", "items_seen", "items_saved", "engagement_rate"],
150
+ "properties": {
151
+ "source_type": {
152
+ "type": "string",
153
+ "description": "Content source identifier (e.g., hackernews, reddit, arxiv, rss)."
154
+ },
155
+ "items_seen": {
156
+ "type": "integer",
157
+ "minimum": 0,
158
+ "description": "Total items fetched from this source."
159
+ },
160
+ "items_saved": {
161
+ "type": "integer",
162
+ "minimum": 0,
163
+ "description": "Items the user explicitly saved from this source."
164
+ },
165
+ "engagement_rate": {
166
+ "type": "number",
167
+ "minimum": 0,
168
+ "maximum": 1,
169
+ "description": "Ratio of items_saved to items_seen (0..1)."
170
+ }
171
+ }
172
+ },
173
+ "DnaStats": {
174
+ "type": "object",
175
+ "required": [
176
+ "total_items_processed",
177
+ "total_relevant",
178
+ "rejection_rate",
179
+ "project_count",
180
+ "dependency_count",
181
+ "days_active"
182
+ ],
183
+ "properties": {
184
+ "total_items_processed": {
185
+ "type": "integer",
186
+ "minimum": 0,
187
+ "description": "Total content items ingested by 4DA."
188
+ },
189
+ "total_relevant": {
190
+ "type": "integer",
191
+ "minimum": 0,
192
+ "description": "Items that passed the relevance threshold."
193
+ },
194
+ "rejection_rate": {
195
+ "type": "number",
196
+ "minimum": 0,
197
+ "maximum": 1,
198
+ "description": "Fraction of items rejected as irrelevant (0..1)."
199
+ },
200
+ "project_count": {
201
+ "type": "integer",
202
+ "minimum": 0,
203
+ "description": "Number of distinct projects scanned by ACE."
204
+ },
205
+ "dependency_count": {
206
+ "type": "integer",
207
+ "minimum": 0,
208
+ "description": "Total unique dependencies across all projects."
209
+ },
210
+ "days_active": {
211
+ "type": "integer",
212
+ "minimum": 0,
213
+ "description": "Days since the earliest source item was ingested."
214
+ }
215
+ }
216
+ }
217
+ }
218
+ }
219
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "export_context_packet",
3
+ "description": "Generate a portable context packet for session handoff between AI agents or tools.\n\nExports the user's current 4DA context including open signals, saved items, and active state into a self-contained packet that another session can consume.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "include_signals": {
8
+ "type": "boolean",
9
+ "description": "Include open signals. Default: true"
10
+ },
11
+ "include_saved": {
12
+ "type": "boolean",
13
+ "description": "Include saved items. Default: true"
14
+ }
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "knowledge_gaps",
3
+ "description": "Detect knowledge gaps in your project dependencies.\n\nIdentifies dependencies you use but haven't been tracking content about — blind spots where a breaking change, security advisory, or major release could catch you off guard.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "min_severity": {
8
+ "type": "string",
9
+ "enum": ["critical", "high", "medium", "low"],
10
+ "description": "Minimum gap severity to include. Default: medium"
11
+ }
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "preemption_feed",
3
+ "description": "Get forward-looking intelligence alerts about upcoming risks, breaking changes, and ecosystem shifts affecting your stack.\n\nSynthesizes signal chains, dependency health alerts, and knowledge gaps into actionable preemption intelligence. Use before dependency updates or when planning work.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "urgency_filter": {
8
+ "type": "string",
9
+ "description": "Filter by minimum urgency: critical, high, medium, watch. Default: all",
10
+ "enum": ["critical", "high", "medium", "watch"]
11
+ },
12
+ "limit": {
13
+ "type": "number",
14
+ "description": "Maximum alerts to return. Default: 10"
15
+ }
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "project_health",
3
+ "description": "Project health radar for dependency freshness and security.\n\nAssesses the health of your scanned projects by analyzing dependency counts, package freshness, and cross-referencing with content signals for security advisories or breaking changes.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "project_path": {
8
+ "type": "string",
9
+ "description": "Specific project path to check. Omit for all projects."
10
+ }
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "record_agent_feedback",
3
+ "description": "Record whether content recommended by 4DA was useful in the agent's task.\n\nCall this after using get_relevant_content results to help 4DA learn what's actually valuable for AI-assisted development.\n\nOutcomes:\n- \"used\": Agent/developer used the recommended content (strong positive signal)\n- \"rejected\": Content was not useful — outdated, irrelevant, or wrong context (negative signal)\n- \"partially_used\": Some value extracted but not directly applicable (weak positive signal)\n\nThis feedback helps 4DA's PASIFA scoring system learn which content sources and topics are genuinely useful when agents recommend them.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "item_ids": {
8
+ "type": "array",
9
+ "items": { "type": "string" },
10
+ "description": "Source item IDs that were recommended (from get_relevant_content results)"
11
+ },
12
+ "outcome": {
13
+ "type": "string",
14
+ "enum": ["used", "rejected", "partially_used"],
15
+ "description": "Whether the agent/developer used the recommended content"
16
+ },
17
+ "context": {
18
+ "type": "string",
19
+ "description": "Brief context about why (e.g., 'recommended to developer, they found it relevant' or 'content was outdated')"
20
+ },
21
+ "session_task": {
22
+ "type": "string",
23
+ "description": "What task the agent was working on when it used this content"
24
+ }
25
+ },
26
+ "required": ["item_ids", "outcome"]
27
+ }
28
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "reverse_mentions",
3
+ "description": "Find where your projects are mentioned in sources.\n\nSearches across all indexed content for mentions of your project names, dependencies, and technologies. Useful for discovering discussions about your work or tools you maintain.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "limit": {
8
+ "type": "number",
9
+ "description": "Maximum mentions to return. Default: 20"
10
+ }
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "semantic_shifts",
3
+ "description": "Detect narrative shifts in topics you follow.\n\nAnalyzes how the meaning and context of topics are changing over time by comparing content embeddings across time windows. Catches paradigm shifts early.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "period_days": {
8
+ "type": "number",
9
+ "description": "Look-back period in days. Default: 7"
10
+ },
11
+ "min_magnitude": {
12
+ "type": "number",
13
+ "description": "Minimum drift magnitude (0-1). Default: 0.1"
14
+ }
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "signal_chains",
3
+ "description": "Get causal signal chains connecting related events over time.\n\nTracks evolving stories across sources — e.g., a security vulnerability first mentioned on HN, then an advisory on GitHub, then a fix release. Chains link related signals into narratives.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "resolution": {
8
+ "type": "string",
9
+ "enum": ["open", "resolved", "expired", "all"],
10
+ "description": "Filter by chain resolution status. Default: open"
11
+ },
12
+ "min_priority": {
13
+ "type": "string",
14
+ "enum": ["critical", "high", "medium", "low"],
15
+ "description": "Minimum chain priority to include. Default: low"
16
+ }
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "tech_radar",
3
+ "description": "Generate a technology radar from decisions and content signals.\n\nPlaces technologies into quadrants (languages, frameworks, tools, platforms) and rings (adopt, trial, assess, hold) based on your decisions, usage patterns, and content engagement.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "quadrant": {
8
+ "type": "string",
9
+ "enum": ["languages", "frameworks", "tools", "platforms"],
10
+ "description": "Filter by quadrant. Leave empty for all quadrants."
11
+ },
12
+ "ring": {
13
+ "type": "string",
14
+ "enum": ["adopt", "trial", "assess", "hold"],
15
+ "description": "Filter by ring. Leave empty for all rings."
16
+ },
17
+ "search": {
18
+ "type": "string",
19
+ "description": "Free-text search to filter entries by name."
20
+ }
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "trust_summary",
3
+ "description": "Get intelligence quality metrics — precision, action conversion rate, false positive rate, and preemption wins.\n\nReturns trust ledger data for a configurable time window. Use this to assess how reliable 4DA's signals are before acting on them.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "days": {
8
+ "type": "number",
9
+ "description": "Number of days to analyze. Default: 30"
10
+ }
11
+ }
12
+ }
13
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "vulnerability_scan",
3
+ "description": "Scan project dependencies for known vulnerabilities (CVEs) using OSV.dev.\n\nReturns severity levels, fix versions, and upgrade recommendations for npm, Rust, Python, and Go dependencies. Zero configuration — automatically detects your stack from manifest and lock files.\n\nPrivacy: only sends package names and versions (public manifest data). No code, paths, or personal data transmitted.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "project_path": {
8
+ "type": "string",
9
+ "description": "Project directory to scan. Default: current working directory."
10
+ },
11
+ "severity_filter": {
12
+ "type": "string",
13
+ "enum": ["critical", "high", "medium", "low"],
14
+ "description": "Only show vulnerabilities at or above this severity level."
15
+ },
16
+ "include_dev": {
17
+ "type": "boolean",
18
+ "description": "Include devDependencies in scan. Default: false."
19
+ },
20
+ "force_refresh": {
21
+ "type": "boolean",
22
+ "description": "Ignore cache and fetch fresh data from OSV.dev. Default: false."
23
+ }
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "what_should_i_know",
3
+ "description": "Pre-task intelligence briefing. Given a task description and optional file paths, returns filtered advisories (security alerts, breaking changes), active decision windows, signal chains, relevant past decisions/memories, and a delegation assessment. Call this before starting any non-trivial task to get caught up on what matters.",
4
+ "inputSchema": {
5
+ "type": "object",
6
+ "properties": {
7
+ "task": {
8
+ "type": "string",
9
+ "description": "Description of what you are about to work on"
10
+ },
11
+ "files": {
12
+ "type": "array",
13
+ "items": { "type": "string" },
14
+ "description": "File paths involved in the task (optional). Improves relevance filtering."
15
+ }
16
+ },
17
+ "required": ["task"]
18
+ }
19
+ }
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * 4DA MCP Setup — Zero-friction editor configuration
4
+ *
5
+ * Detects installed editors and writes MCP server configuration so
6
+ * the user can start using 4DA tools immediately after install.
7
+ *
8
+ * Usage:
9
+ * npx @4da/mcp-server --setup
10
+ * 4da-mcp-setup
11
+ * pnpm run setup
12
+ */
13
+ /**
14
+ * Run the setup wizard: detect editors and write MCP configurations.
15
+ * @param dryRun If true, only report what would be written without modifying files.
16
+ */
17
+ export declare function runSetup(dryRun?: boolean): void;
18
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AA+HH;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,UAAQ,GAAG,IAAI,CAkC7C"}
package/dist/setup.js ADDED
@@ -0,0 +1,171 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: FSL-1.1-Apache-2.0
3
+ /**
4
+ * 4DA MCP Setup — Zero-friction editor configuration
5
+ *
6
+ * Detects installed editors and writes MCP server configuration so
7
+ * the user can start using 4DA tools immediately after install.
8
+ *
9
+ * Usage:
10
+ * npx @4da/mcp-server --setup
11
+ * 4da-mcp-setup
12
+ * pnpm run setup
13
+ */
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
15
+ import { join, dirname } from "node:path";
16
+ import { homedir } from "node:os";
17
+ /** MCP config snippet for editors that use the standard mcpServers format */
18
+ const MCP_CONFIG = {
19
+ "4da": {
20
+ command: "npx",
21
+ args: ["@4da/mcp-server"],
22
+ },
23
+ };
24
+ /**
25
+ * Safely read and parse a JSON file, returning empty object on failure.
26
+ */
27
+ function readJsonSafe(filePath) {
28
+ if (!existsSync(filePath))
29
+ return {};
30
+ try {
31
+ return JSON.parse(readFileSync(filePath, "utf-8"));
32
+ }
33
+ catch {
34
+ return {};
35
+ }
36
+ }
37
+ /**
38
+ * Ensure directory exists and write JSON to file.
39
+ */
40
+ function writeJsonFile(filePath, data) {
41
+ const dir = dirname(filePath);
42
+ if (!existsSync(dir)) {
43
+ mkdirSync(dir, { recursive: true });
44
+ }
45
+ writeFileSync(filePath, JSON.stringify(data, null, 2) + "\n");
46
+ }
47
+ const editors = [
48
+ {
49
+ name: "Claude Code",
50
+ detect: () => {
51
+ // Project-level config takes priority
52
+ const projectClaudeDir = join(process.cwd(), ".claude");
53
+ if (existsSync(projectClaudeDir)) {
54
+ return join(projectClaudeDir, "settings.json");
55
+ }
56
+ // Fall back to global config
57
+ return join(homedir(), ".claude.json");
58
+ },
59
+ write: (configPath) => {
60
+ const config = readJsonSafe(configPath);
61
+ const mcpServers = (config.mcpServers || {});
62
+ mcpServers["4da"] = MCP_CONFIG["4da"];
63
+ config.mcpServers = mcpServers;
64
+ writeJsonFile(configPath, config);
65
+ console.log(` Written: ${configPath}`);
66
+ },
67
+ },
68
+ {
69
+ name: "Cursor",
70
+ detect: () => {
71
+ const cursorDir = join(homedir(), ".cursor");
72
+ if (existsSync(cursorDir)) {
73
+ return join(cursorDir, "mcp.json");
74
+ }
75
+ return null;
76
+ },
77
+ write: (configPath) => {
78
+ const config = readJsonSafe(configPath);
79
+ const mcpServers = (config.mcpServers || {});
80
+ mcpServers["4da"] = MCP_CONFIG["4da"];
81
+ config.mcpServers = mcpServers;
82
+ writeJsonFile(configPath, config);
83
+ console.log(` Written: ${configPath}`);
84
+ },
85
+ },
86
+ {
87
+ name: "VS Code (Copilot)",
88
+ detect: () => {
89
+ const vscodePath = join(homedir(), ".vscode");
90
+ if (existsSync(vscodePath)) {
91
+ return join(vscodePath, "mcp.json");
92
+ }
93
+ return null;
94
+ },
95
+ write: (configPath) => {
96
+ const config = readJsonSafe(configPath);
97
+ // VS Code uses "servers" key instead of "mcpServers"
98
+ const servers = (config.servers || {});
99
+ servers["4da"] = {
100
+ type: "stdio",
101
+ command: "npx",
102
+ args: ["@4da/mcp-server"],
103
+ };
104
+ config.servers = servers;
105
+ writeJsonFile(configPath, config);
106
+ console.log(` Written: ${configPath}`);
107
+ },
108
+ },
109
+ {
110
+ name: "Windsurf",
111
+ detect: () => {
112
+ const windsurfDir = join(homedir(), ".windsurf");
113
+ if (existsSync(windsurfDir)) {
114
+ return join(windsurfDir, "mcp.json");
115
+ }
116
+ return null;
117
+ },
118
+ write: (configPath) => {
119
+ const config = readJsonSafe(configPath);
120
+ const mcpServers = (config.mcpServers || {});
121
+ mcpServers["4da"] = MCP_CONFIG["4da"];
122
+ config.mcpServers = mcpServers;
123
+ writeJsonFile(configPath, config);
124
+ console.log(` Written: ${configPath}`);
125
+ },
126
+ },
127
+ ];
128
+ /**
129
+ * Run the setup wizard: detect editors and write MCP configurations.
130
+ * @param dryRun If true, only report what would be written without modifying files.
131
+ */
132
+ export function runSetup(dryRun = false) {
133
+ console.log("\n 4DA MCP Server — Setup\n");
134
+ if (dryRun)
135
+ console.log(" [DRY RUN] No files will be modified.\n");
136
+ console.log(" Detecting editors...\n");
137
+ let configured = 0;
138
+ for (const editor of editors) {
139
+ const configPath = editor.detect();
140
+ if (configPath) {
141
+ console.log(` Found: ${editor.name}`);
142
+ if (dryRun) {
143
+ console.log(` Would write: ${configPath}`);
144
+ }
145
+ else {
146
+ editor.write(configPath);
147
+ }
148
+ configured++;
149
+ console.log("");
150
+ }
151
+ }
152
+ if (configured === 0) {
153
+ console.log(" No supported editors detected.\n");
154
+ console.log(" Manual setup — add to your editor's MCP config:\n");
155
+ console.log(` ${JSON.stringify(MCP_CONFIG, null, 2)}\n`);
156
+ }
157
+ console.log(" Done. Restart your editor to activate 4DA.");
158
+ console.log("");
159
+ console.log(" Note: This server reads data from the 4DA desktop app.");
160
+ console.log(" If you haven't installed it yet:");
161
+ console.log(" https://github.com/runyourempire/4DA/releases/latest");
162
+ console.log("");
163
+ console.log(" Run: npx @4da/mcp-server --doctor to verify everything works.\n");
164
+ }
165
+ // Run directly if invoked as a script (bin entry or pnpm run setup)
166
+ const isDirectRun = process.argv[1]?.endsWith("setup.js") || process.argv[1]?.endsWith("setup.ts");
167
+ if (isDirectRun) {
168
+ const dryRun = process.argv.includes("--dry-run");
169
+ runSetup(dryRun);
170
+ }
171
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AACA,8CAA8C;AAC9C;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,6EAA6E;AAC7E,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE;QACL,OAAO,EAAE,KAAK;QACd,IAAI,EAAE,CAAC,iBAAiB,CAAC;KAC1B;CACF,CAAC;AAUF;;GAEG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAA4B,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,QAAgB,EAAE,IAA6B;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,OAAO,GAAmB;IAC9B;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,GAAG,EAAE;YACX,sCAAsC;YACtC,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;YACxD,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;YACjD,CAAC;YACD,6BAA6B;YAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;QACzC,CAAC;QACD,KAAK,EAAE,CAAC,UAAkB,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;YACxE,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/B,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QAC1C,CAAC;KACF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,GAAG,EAAE;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;YAC7C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,EAAE,CAAC,UAAkB,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;YACxE,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/B,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QAC1C,CAAC;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,GAAG,EAAE;YACX,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;YAC9C,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,EAAE,CAAC,UAAkB,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACxC,qDAAqD;YACrD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;YAClE,OAAO,CAAC,KAAK,CAAC,GAAG;gBACf,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,CAAC,iBAAiB,CAAC;aAC1B,CAAC;YACF,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;YACzB,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QAC1C,CAAC;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,GAAG,EAAE;YACX,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;YACjD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,EAAE,CAAC,UAAkB,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACxC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAA4B,CAAC;YACxE,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACtC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAC/B,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;QAC1C,CAAC;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAM,GAAG,KAAK;IACrC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAExC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACvC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC3B,CAAC;YACD,UAAU,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;AACpF,CAAC;AAED,oEAAoE;AACpE,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AACjF,IAAI,WAAW,EAAE,CAAC;IAChB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC"}