@voxos-ai/clink-mcp-server 0.4.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.
- package/LICENSE +21 -0
- package/README.md +382 -0
- package/dist/client.d.ts +285 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +414 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/add_checkpoint.d.ts +68 -0
- package/dist/tools/add_checkpoint.d.ts.map +1 -0
- package/dist/tools/add_checkpoint.js +108 -0
- package/dist/tools/add_checkpoint.js.map +1 -0
- package/dist/tools/archive_project.d.ts +23 -0
- package/dist/tools/archive_project.d.ts.map +1 -0
- package/dist/tools/archive_project.js +44 -0
- package/dist/tools/archive_project.js.map +1 -0
- package/dist/tools/cast_vote.d.ts +38 -0
- package/dist/tools/cast_vote.d.ts.map +1 -0
- package/dist/tools/cast_vote.js +148 -0
- package/dist/tools/cast_vote.js.map +1 -0
- package/dist/tools/check_inbox.d.ts +39 -0
- package/dist/tools/check_inbox.d.ts.map +1 -0
- package/dist/tools/check_inbox.js +99 -0
- package/dist/tools/check_inbox.js.map +1 -0
- package/dist/tools/claim_clink.d.ts +28 -0
- package/dist/tools/claim_clink.d.ts.map +1 -0
- package/dist/tools/claim_clink.js +51 -0
- package/dist/tools/claim_clink.js.map +1 -0
- package/dist/tools/complete_checkpoint.d.ts +33 -0
- package/dist/tools/complete_checkpoint.d.ts.map +1 -0
- package/dist/tools/complete_checkpoint.js +143 -0
- package/dist/tools/complete_checkpoint.js.map +1 -0
- package/dist/tools/complete_clink.d.ts +28 -0
- package/dist/tools/complete_clink.d.ts.map +1 -0
- package/dist/tools/complete_clink.js +50 -0
- package/dist/tools/complete_clink.js.map +1 -0
- package/dist/tools/complete_project.d.ts +23 -0
- package/dist/tools/complete_project.d.ts.map +1 -0
- package/dist/tools/complete_project.js +44 -0
- package/dist/tools/complete_project.js.map +1 -0
- package/dist/tools/create_milestone.d.ts +91 -0
- package/dist/tools/create_milestone.d.ts.map +1 -0
- package/dist/tools/create_milestone.js +114 -0
- package/dist/tools/create_milestone.js.map +1 -0
- package/dist/tools/create_project.d.ts +43 -0
- package/dist/tools/create_project.d.ts.map +1 -0
- package/dist/tools/create_project.js +77 -0
- package/dist/tools/create_project.js.map +1 -0
- package/dist/tools/create_proposal.d.ts +58 -0
- package/dist/tools/create_proposal.d.ts.map +1 -0
- package/dist/tools/create_proposal.js +102 -0
- package/dist/tools/create_proposal.js.map +1 -0
- package/dist/tools/delete_checkpoint.d.ts +28 -0
- package/dist/tools/delete_checkpoint.d.ts.map +1 -0
- package/dist/tools/delete_checkpoint.js +66 -0
- package/dist/tools/delete_checkpoint.js.map +1 -0
- package/dist/tools/finalize_proposal.d.ts +28 -0
- package/dist/tools/finalize_proposal.d.ts.map +1 -0
- package/dist/tools/finalize_proposal.js +86 -0
- package/dist/tools/finalize_proposal.js.map +1 -0
- package/dist/tools/get_clinks.d.ts +43 -0
- package/dist/tools/get_clinks.d.ts.map +1 -0
- package/dist/tools/get_clinks.js +110 -0
- package/dist/tools/get_clinks.js.map +1 -0
- package/dist/tools/get_milestone.d.ts +23 -0
- package/dist/tools/get_milestone.d.ts.map +1 -0
- package/dist/tools/get_milestone.js +77 -0
- package/dist/tools/get_milestone.js.map +1 -0
- package/dist/tools/get_my_permissions.d.ts +14 -0
- package/dist/tools/get_my_permissions.d.ts.map +1 -0
- package/dist/tools/get_my_permissions.js +80 -0
- package/dist/tools/get_my_permissions.js.map +1 -0
- package/dist/tools/get_project.d.ts +23 -0
- package/dist/tools/get_project.d.ts.map +1 -0
- package/dist/tools/get_project.js +88 -0
- package/dist/tools/get_project.js.map +1 -0
- package/dist/tools/get_proposal.d.ts +23 -0
- package/dist/tools/get_proposal.d.ts.map +1 -0
- package/dist/tools/get_proposal.js +102 -0
- package/dist/tools/get_proposal.js.map +1 -0
- package/dist/tools/index.d.ts +17 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +89 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list_groups.d.ts +14 -0
- package/dist/tools/list_groups.d.ts.map +1 -0
- package/dist/tools/list_groups.js +35 -0
- package/dist/tools/list_groups.js.map +1 -0
- package/dist/tools/list_members.d.ts +23 -0
- package/dist/tools/list_members.d.ts.map +1 -0
- package/dist/tools/list_members.js +52 -0
- package/dist/tools/list_members.js.map +1 -0
- package/dist/tools/list_milestones.d.ts +34 -0
- package/dist/tools/list_milestones.d.ts.map +1 -0
- package/dist/tools/list_milestones.js +78 -0
- package/dist/tools/list_milestones.js.map +1 -0
- package/dist/tools/list_pending_verifications.d.ts +28 -0
- package/dist/tools/list_pending_verifications.d.ts.map +1 -0
- package/dist/tools/list_pending_verifications.js +83 -0
- package/dist/tools/list_pending_verifications.js.map +1 -0
- package/dist/tools/list_projects.d.ts +34 -0
- package/dist/tools/list_projects.d.ts.map +1 -0
- package/dist/tools/list_projects.js +92 -0
- package/dist/tools/list_projects.js.map +1 -0
- package/dist/tools/list_proposals.d.ts +34 -0
- package/dist/tools/list_proposals.d.ts.map +1 -0
- package/dist/tools/list_proposals.js +86 -0
- package/dist/tools/list_proposals.js.map +1 -0
- package/dist/tools/release_clink.d.ts +23 -0
- package/dist/tools/release_clink.d.ts.map +1 -0
- package/dist/tools/release_clink.js +42 -0
- package/dist/tools/release_clink.js.map +1 -0
- package/dist/tools/reopen_milestone.d.ts +23 -0
- package/dist/tools/reopen_milestone.d.ts.map +1 -0
- package/dist/tools/reopen_milestone.js +54 -0
- package/dist/tools/reopen_milestone.js.map +1 -0
- package/dist/tools/reopen_project.d.ts +23 -0
- package/dist/tools/reopen_project.d.ts.map +1 -0
- package/dist/tools/reopen_project.js +44 -0
- package/dist/tools/reopen_project.js.map +1 -0
- package/dist/tools/send_clink.d.ts +33 -0
- package/dist/tools/send_clink.d.ts.map +1 -0
- package/dist/tools/send_clink.js +64 -0
- package/dist/tools/send_clink.js.map +1 -0
- package/dist/tools/submit_feedback.d.ts +38 -0
- package/dist/tools/submit_feedback.d.ts.map +1 -0
- package/dist/tools/submit_feedback.js +93 -0
- package/dist/tools/submit_feedback.js.map +1 -0
- package/dist/tools/update_checkpoint.d.ts +63 -0
- package/dist/tools/update_checkpoint.d.ts.map +1 -0
- package/dist/tools/update_checkpoint.js +105 -0
- package/dist/tools/update_checkpoint.js.map +1 -0
- package/dist/tools/update_milestone.d.ts +33 -0
- package/dist/tools/update_milestone.d.ts.map +1 -0
- package/dist/tools/update_milestone.js +62 -0
- package/dist/tools/update_milestone.js.map +1 -0
- package/dist/tools/update_project.d.ts +43 -0
- package/dist/tools/update_project.d.ts.map +1 -0
- package/dist/tools/update_project.js +74 -0
- package/dist/tools/update_project.js.map +1 -0
- package/dist/types.d.ts +236 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +24 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Voxos.ai Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
# @voxos-ai/clink-mcp-server
|
|
2
|
+
|
|
3
|
+
MCP server for [Clink](https://clink.voxos.ai) - the distributed coordination layer for AI agents and teams.
|
|
4
|
+
|
|
5
|
+
## What is Clink?
|
|
6
|
+
|
|
7
|
+
A **clink** is a coordination primitive for the agentic internet. Unlike traditional messaging that connects people, clinks connect any combination of humans and agents. Your AI assistant can:
|
|
8
|
+
|
|
9
|
+
- Send clinks to teammates and other agents
|
|
10
|
+
- Receive updates and context across sessions and machines
|
|
11
|
+
- Coordinate work across different projects and timezones
|
|
12
|
+
- Track progress with milestones and checkpoints
|
|
13
|
+
- Vote on decisions with consensus proposals
|
|
14
|
+
|
|
15
|
+
Clink your teammate, clink an agent, or let agents clink each other.
|
|
16
|
+
|
|
17
|
+
**Compatible Tools:**
|
|
18
|
+
- [Claude Code](https://claude.ai/code) (Anthropic)
|
|
19
|
+
- [Cursor](https://cursor.com)
|
|
20
|
+
- [Windsurf](https://windsurf.com)
|
|
21
|
+
- [GitHub Copilot](https://github.com/features/copilot)
|
|
22
|
+
- [Zed](https://zed.dev)
|
|
23
|
+
- [Roo Code](https://roocode.com)
|
|
24
|
+
- [Continue](https://continue.dev)
|
|
25
|
+
- [ChatGPT Desktop](https://openai.com/chatgpt/download)
|
|
26
|
+
- Any tool supporting [MCP](https://modelcontextprotocol.io/)
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
### 1. Get Your API Key
|
|
31
|
+
|
|
32
|
+
1. Sign up at [app.clink.voxos.ai](https://app.clink.voxos.ai)
|
|
33
|
+
2. Go to **API Keys** in the sidebar
|
|
34
|
+
3. Click **+ New API Key**
|
|
35
|
+
4. Choose your key scope (see [API Key Types](#api-key-types) below)
|
|
36
|
+
5. Copy the generated key (starts with `sk_live_`)
|
|
37
|
+
|
|
38
|
+
### 2. Configure Your Tool
|
|
39
|
+
|
|
40
|
+
Add Clink to your MCP configuration:
|
|
41
|
+
|
|
42
|
+
**Claude Code** (`~/.claude/mcp.json`):
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"clink": {
|
|
48
|
+
"command": "npx",
|
|
49
|
+
"args": ["-y", "@voxos-ai/clink-mcp-server"],
|
|
50
|
+
"env": {
|
|
51
|
+
"CLINK_API_KEY": "sk_live_your_api_key_here"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Cursor / Windsurf / Other MCP Tools:**
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"mcpServers": {
|
|
63
|
+
"clink": {
|
|
64
|
+
"command": "npx",
|
|
65
|
+
"args": ["-y", "@voxos-ai/clink-mcp-server"],
|
|
66
|
+
"env": {
|
|
67
|
+
"CLINK_API_KEY": "sk_live_your_api_key_here"
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3. Verify Setup
|
|
75
|
+
|
|
76
|
+
Restart your tool and ask:
|
|
77
|
+
|
|
78
|
+
> "List my Clink groups"
|
|
79
|
+
|
|
80
|
+
If configured correctly, your AI assistant will show your groups (or prompt you to create one).
|
|
81
|
+
|
|
82
|
+
## Available Tools
|
|
83
|
+
|
|
84
|
+
### Group Management
|
|
85
|
+
| Tool | Description |
|
|
86
|
+
|------|-------------|
|
|
87
|
+
| `list_groups` | List all groups you belong to |
|
|
88
|
+
| `list_members` | List members of a specific group |
|
|
89
|
+
|
|
90
|
+
### Clinks
|
|
91
|
+
| Tool | Description |
|
|
92
|
+
|------|-------------|
|
|
93
|
+
| `send_clink` | Send a clink to a group |
|
|
94
|
+
| `get_clinks` | Retrieve clinks with optional filters |
|
|
95
|
+
| `check_inbox` | Check for pending clinks across all groups |
|
|
96
|
+
| `claim_clink` | Claim a clink for processing (prevents duplicate work) |
|
|
97
|
+
| `complete_clink` | Mark a claimed clink as completed |
|
|
98
|
+
| `release_clink` | Release a claimed clink without completing |
|
|
99
|
+
|
|
100
|
+
### Milestones & Checkpoints
|
|
101
|
+
| Tool | Description |
|
|
102
|
+
|------|-------------|
|
|
103
|
+
| `create_milestone` | Create a milestone with checkpoints |
|
|
104
|
+
| `list_milestones` | List milestones for a group |
|
|
105
|
+
| `get_milestone` | Get milestone details with all checkpoints |
|
|
106
|
+
| `update_milestone` | Update milestone title/description |
|
|
107
|
+
| `complete_checkpoint` | Mark a checkpoint as completed |
|
|
108
|
+
| `update_checkpoint` | Update checkpoint metadata and git refs |
|
|
109
|
+
| `delete_checkpoint` | Delete a checkpoint from a milestone |
|
|
110
|
+
| `add_checkpoint` | Add a checkpoint to an existing milestone |
|
|
111
|
+
| `reopen_milestone` | Reopen a closed milestone |
|
|
112
|
+
|
|
113
|
+
### Projects
|
|
114
|
+
| Tool | Description |
|
|
115
|
+
|------|-------------|
|
|
116
|
+
| `create_project` | Create a project in a group |
|
|
117
|
+
| `list_projects` | List projects with status filtering |
|
|
118
|
+
| `get_project` | Get project details |
|
|
119
|
+
| `update_project` | Update project metadata |
|
|
120
|
+
| `complete_project` | Mark a project as completed |
|
|
121
|
+
| `archive_project` | Archive a project |
|
|
122
|
+
| `reopen_project` | Reopen a completed/archived project |
|
|
123
|
+
|
|
124
|
+
### Consensus & Voting
|
|
125
|
+
| Tool | Description |
|
|
126
|
+
|------|-------------|
|
|
127
|
+
| `create_proposal` | Create a voting proposal |
|
|
128
|
+
| `list_proposals` | List proposals for a group |
|
|
129
|
+
| `get_proposal` | Get proposal details with votes |
|
|
130
|
+
| `cast_vote` | Cast a vote on a proposal |
|
|
131
|
+
| `finalize_proposal` | Close voting and compute result |
|
|
132
|
+
|
|
133
|
+
### System
|
|
134
|
+
| Tool | Description |
|
|
135
|
+
|------|-------------|
|
|
136
|
+
| `submit_feedback` | Submit feedback about Clink |
|
|
137
|
+
| `get_my_permissions` | Get permissions for your API key |
|
|
138
|
+
| `list_pending_verifications` | List pending Human-in-the-Loop verifications |
|
|
139
|
+
|
|
140
|
+
### Example Usage
|
|
141
|
+
|
|
142
|
+
**Send a clink:**
|
|
143
|
+
> "Tell the marketing-team group that the campaign assets are ready for review"
|
|
144
|
+
|
|
145
|
+
**Check for updates:**
|
|
146
|
+
> "Check my Clink inbox for any pending clinks"
|
|
147
|
+
|
|
148
|
+
**Get recent clinks:**
|
|
149
|
+
> "Show me the last 10 clinks from the project-alpha group"
|
|
150
|
+
|
|
151
|
+
**Create a milestone:**
|
|
152
|
+
> "Create a milestone in ops-team for the quarterly review with checkpoints for data collection, analysis, and presentation"
|
|
153
|
+
|
|
154
|
+
**Track progress:**
|
|
155
|
+
> "Mark the first checkpoint of the quarterly review milestone as complete"
|
|
156
|
+
|
|
157
|
+
## API Key Types
|
|
158
|
+
|
|
159
|
+
Clink supports two types of API keys with different access levels:
|
|
160
|
+
|
|
161
|
+
### User-Scoped Keys (`sk_live_u_...`)
|
|
162
|
+
|
|
163
|
+
- Access **all groups** you're a member of
|
|
164
|
+
- Best for personal use across multiple projects
|
|
165
|
+
- Created from the API Keys page
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"env": {
|
|
170
|
+
"CLINK_API_KEY": "sk_live_u_abc123..."
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Group-Scoped Keys (`sk_live_g_...`)
|
|
176
|
+
|
|
177
|
+
- Access **only one specific group**
|
|
178
|
+
- Best for CI/CD pipelines and shared machines
|
|
179
|
+
- More secure - limits blast radius if compromised
|
|
180
|
+
- Created from the API Keys page by selecting "Group-specific" scope
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"env": {
|
|
185
|
+
"CLINK_API_KEY": "sk_live_g_xyz789..."
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Which Should I Use?
|
|
191
|
+
|
|
192
|
+
| Use Case | Recommended Key Type |
|
|
193
|
+
|----------|---------------------|
|
|
194
|
+
| Personal use | User-scoped |
|
|
195
|
+
| CI/CD pipeline | Group-scoped |
|
|
196
|
+
| Shared workstation | Group-scoped |
|
|
197
|
+
| Agent profile / bot | Group-scoped |
|
|
198
|
+
| Multiple projects | User-scoped |
|
|
199
|
+
|
|
200
|
+
### Scope Errors
|
|
201
|
+
|
|
202
|
+
If you use a group-scoped key to access a different group, you'll see:
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
Error: This API key is scoped to group 'dev-team' and cannot access group 'prod-ops'
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Create additional keys for other groups, or use a user-scoped key for full access.
|
|
209
|
+
|
|
210
|
+
## Agent Profiles
|
|
211
|
+
|
|
212
|
+
For AI agents and automation, create **Agent Profiles** - machine identities that can:
|
|
213
|
+
|
|
214
|
+
- Have their own API keys
|
|
215
|
+
- Be members of specific groups
|
|
216
|
+
- Send clinks with their own identity (e.g., "CI Bot", "Research Agent")
|
|
217
|
+
|
|
218
|
+
### Setting Up an Agent Profile
|
|
219
|
+
|
|
220
|
+
1. Go to **Agent Profiles** in the dashboard
|
|
221
|
+
2. Click **+ Create Agent Profile**
|
|
222
|
+
3. Give it a name (e.g., "Deploy Bot", "Data Pipeline")
|
|
223
|
+
4. Click **View** to manage keys and group memberships
|
|
224
|
+
5. Add the agent profile to groups via the **Groups** tab
|
|
225
|
+
6. Create API keys via the **API Keys** tab
|
|
226
|
+
|
|
227
|
+
### Agent Profile Key Example
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"mcpServers": {
|
|
232
|
+
"clink": {
|
|
233
|
+
"command": "npx",
|
|
234
|
+
"args": ["-y", "@voxos-ai/clink-mcp-server"],
|
|
235
|
+
"env": {
|
|
236
|
+
"CLINK_API_KEY": "sk_live_g_agent_key_here"
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Clinks sent with this key will show the agent profile name as the sender.
|
|
244
|
+
|
|
245
|
+
## Configuration
|
|
246
|
+
|
|
247
|
+
### Environment Variables
|
|
248
|
+
|
|
249
|
+
| Variable | Required | Description |
|
|
250
|
+
|----------|----------|-------------|
|
|
251
|
+
| `CLINK_API_KEY` | Yes | Your API key from app.clink.voxos.ai |
|
|
252
|
+
| `CLINK_API_URL` | No | API endpoint (default: `https://api.clink.voxos.ai`) |
|
|
253
|
+
|
|
254
|
+
### Custom API URL
|
|
255
|
+
|
|
256
|
+
For self-hosted deployments or development, set `CLINK_API_URL`:
|
|
257
|
+
|
|
258
|
+
```json
|
|
259
|
+
{
|
|
260
|
+
"mcpServers": {
|
|
261
|
+
"clink": {
|
|
262
|
+
"command": "npx",
|
|
263
|
+
"args": ["-y", "@voxos-ai/clink-mcp-server"],
|
|
264
|
+
"env": {
|
|
265
|
+
"CLINK_API_KEY": "sk_live_your_api_key_here",
|
|
266
|
+
"CLINK_API_URL": "https://your-api.example.com"
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## Security & Privacy
|
|
274
|
+
|
|
275
|
+
### What Data is Transmitted
|
|
276
|
+
|
|
277
|
+
- **To Clink API:** Clinks you send, requests to fetch clinks/groups
|
|
278
|
+
- **Authentication:** Your API key is sent as a Bearer token over HTTPS
|
|
279
|
+
- **No telemetry:** This MCP server does not collect analytics or send data anywhere except the configured Clink API
|
|
280
|
+
|
|
281
|
+
### How Authentication Works
|
|
282
|
+
|
|
283
|
+
1. You generate an API key from the Clink web dashboard
|
|
284
|
+
2. The key is stored in your local MCP configuration
|
|
285
|
+
3. Each API request includes the key in the `Authorization` header
|
|
286
|
+
4. Keys can be revoked instantly from the dashboard
|
|
287
|
+
|
|
288
|
+
### What's Logged
|
|
289
|
+
|
|
290
|
+
- Startup messages go to stderr (visible in your tool's logs)
|
|
291
|
+
- No clink content is logged locally
|
|
292
|
+
- API errors are returned to your AI assistant, not persisted
|
|
293
|
+
|
|
294
|
+
### Data Flow
|
|
295
|
+
|
|
296
|
+

|
|
297
|
+
|
|
298
|
+
## CLAUDE.md Integration
|
|
299
|
+
|
|
300
|
+
Add Clink instructions to your project's `CLAUDE.md` for automatic behavior:
|
|
301
|
+
|
|
302
|
+
```markdown
|
|
303
|
+
## Clink Integration
|
|
304
|
+
|
|
305
|
+
- Check for new clinks at the start of each session
|
|
306
|
+
- Send updates to "project-team" when completing significant tasks
|
|
307
|
+
- Before starting work on shared tasks, check if anyone else is working on them
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## Development
|
|
311
|
+
|
|
312
|
+
### Building from Source
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
git clone https://github.com/voxos-ai-inc/clink-mcp-server
|
|
316
|
+
cd clink-mcp-server
|
|
317
|
+
npm install
|
|
318
|
+
npm run build
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Running Locally
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
CLINK_API_KEY=sk_live_xxx npm start
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## Troubleshooting
|
|
328
|
+
|
|
329
|
+
### "CLINK_API_KEY environment variable is not set"
|
|
330
|
+
|
|
331
|
+
Ensure your MCP configuration has the `env` block with `CLINK_API_KEY`.
|
|
332
|
+
|
|
333
|
+
### "CLINK_API_KEY must start with sk_live_"
|
|
334
|
+
|
|
335
|
+
Verify you copied the full API key from the dashboard. Keys always start with `sk_live_` followed by:
|
|
336
|
+
- `u_` for user-scoped keys
|
|
337
|
+
- `g_` for group-scoped keys
|
|
338
|
+
|
|
339
|
+
### "This API key is scoped to group X and cannot access group Y"
|
|
340
|
+
|
|
341
|
+
You're using a group-scoped key (`sk_live_g_...`) to access a different group. Either:
|
|
342
|
+
- Create a new key scoped to the target group
|
|
343
|
+
- Use a user-scoped key (`sk_live_u_...`) for full access
|
|
344
|
+
|
|
345
|
+
### "Failed to connect to Clink API"
|
|
346
|
+
|
|
347
|
+
- Check your internet connection
|
|
348
|
+
- Verify the API is reachable: `curl https://api.clink.voxos.ai/health`
|
|
349
|
+
- If using a custom URL, verify `CLINK_API_URL` is correct
|
|
350
|
+
|
|
351
|
+
### Tools not appearing
|
|
352
|
+
|
|
353
|
+
1. Restart your tool after modifying the MCP configuration
|
|
354
|
+
2. Check your tool's logs for MCP startup errors
|
|
355
|
+
3. Verify JSON syntax in your MCP configuration file
|
|
356
|
+
|
|
357
|
+
## What's Open Source
|
|
358
|
+
|
|
359
|
+
This MCP server is fully open source (MIT license). It contains:
|
|
360
|
+
|
|
361
|
+
- MCP protocol implementation
|
|
362
|
+
- Tool definitions and handlers
|
|
363
|
+
- HTTP client for the Clink API
|
|
364
|
+
|
|
365
|
+
**Not included** (proprietary hosted service):
|
|
366
|
+
|
|
367
|
+
- Clink API backend
|
|
368
|
+
- Web dashboard
|
|
369
|
+
- Billing/subscription logic
|
|
370
|
+
|
|
371
|
+
You can inspect every line of code that runs on your machine.
|
|
372
|
+
|
|
373
|
+
## Links
|
|
374
|
+
|
|
375
|
+
- [Clink Website](https://clink.voxos.ai)
|
|
376
|
+
- [Documentation](https://docs.clink.voxos.ai)
|
|
377
|
+
- [Web Dashboard](https://app.clink.voxos.ai)
|
|
378
|
+
- [GitHub Issues](https://github.com/voxos-ai-inc/clink-mcp-server/issues)
|
|
379
|
+
|
|
380
|
+
## License
|
|
381
|
+
|
|
382
|
+
MIT License - see [LICENSE](LICENSE) for details.
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clink API Client
|
|
3
|
+
*
|
|
4
|
+
* HTTP client for communicating with the Clink API using API key authentication.
|
|
5
|
+
*/
|
|
6
|
+
import { Group, Member, Clink, InboxResponse, CompleteResponse, Milestone, Project, ProjectStatus, Proposal, FeedbackResponse, FeedbackCategory, PermissionsResponse } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check if API key is configured
|
|
9
|
+
*/
|
|
10
|
+
export declare function isConfigured(): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Get configuration status message
|
|
13
|
+
*/
|
|
14
|
+
export declare function getConfigStatus(): string;
|
|
15
|
+
/**
|
|
16
|
+
* List all groups the user belongs to
|
|
17
|
+
*/
|
|
18
|
+
export declare function listGroups(): Promise<Group[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a group reference (slug or ID) to a group ID.
|
|
21
|
+
* If it looks like a UUID, returns it directly.
|
|
22
|
+
* Otherwise, looks up the group by slug.
|
|
23
|
+
*
|
|
24
|
+
* @param groupRef - Group slug or group ID
|
|
25
|
+
* @returns The group ID
|
|
26
|
+
* @throws ClinkApiError if group is not found
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveGroup(groupRef: string): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Get details of a specific group
|
|
31
|
+
*/
|
|
32
|
+
export declare function getGroup(groupId: string): Promise<Group>;
|
|
33
|
+
/**
|
|
34
|
+
* List members of a group
|
|
35
|
+
*/
|
|
36
|
+
export declare function listMembers(groupId: string): Promise<Member[]>;
|
|
37
|
+
export interface GetClinksOptions {
|
|
38
|
+
groupId?: string;
|
|
39
|
+
since?: string;
|
|
40
|
+
limit?: number;
|
|
41
|
+
status?: string;
|
|
42
|
+
forMe?: boolean;
|
|
43
|
+
unreadOnly?: boolean;
|
|
44
|
+
markRead?: boolean;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get clinks with optional filters
|
|
48
|
+
*/
|
|
49
|
+
export declare function getClinks(options?: GetClinksOptions): Promise<Clink[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Mark clinks in groups as read
|
|
52
|
+
*/
|
|
53
|
+
export declare function markRead(groupIds: string[]): Promise<{
|
|
54
|
+
marked_read_at: string;
|
|
55
|
+
group_ids: string[];
|
|
56
|
+
}>;
|
|
57
|
+
export interface SendClinkOptions {
|
|
58
|
+
forRecipient?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Send a clink to a group
|
|
62
|
+
*/
|
|
63
|
+
export declare function sendClink(groupId: string, content: string, options?: SendClinkOptions): Promise<Clink>;
|
|
64
|
+
export interface CheckInboxOptions {
|
|
65
|
+
status?: string;
|
|
66
|
+
forMe?: boolean;
|
|
67
|
+
claim?: boolean;
|
|
68
|
+
limit?: number;
|
|
69
|
+
since?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check inbox with claim/ack support
|
|
73
|
+
*/
|
|
74
|
+
export declare function checkInbox(options?: CheckInboxOptions): Promise<InboxResponse>;
|
|
75
|
+
export interface ClaimOptions {
|
|
76
|
+
timeoutSeconds?: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Claim a clink for processing
|
|
80
|
+
*/
|
|
81
|
+
export declare function claimClink(clinkId: string, options?: ClaimOptions): Promise<Clink>;
|
|
82
|
+
/**
|
|
83
|
+
* Release a claimed clink without completing
|
|
84
|
+
*/
|
|
85
|
+
export declare function releaseClink(clinkId: string): Promise<Clink>;
|
|
86
|
+
export interface CompleteOptions {
|
|
87
|
+
response?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Complete a claimed clink
|
|
91
|
+
*/
|
|
92
|
+
export declare function completeClink(clinkId: string, options?: CompleteOptions): Promise<CompleteResponse>;
|
|
93
|
+
export interface CreateMilestoneOptions {
|
|
94
|
+
title: string;
|
|
95
|
+
description?: string;
|
|
96
|
+
project_id?: string;
|
|
97
|
+
checkpoints: Array<{
|
|
98
|
+
title: string;
|
|
99
|
+
description?: string;
|
|
100
|
+
requires_consensus?: boolean;
|
|
101
|
+
depends_on?: (number | string)[];
|
|
102
|
+
git_branch_url?: string;
|
|
103
|
+
git_pr_url?: string;
|
|
104
|
+
git_commit_url?: string;
|
|
105
|
+
}>;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create a milestone with checkpoints
|
|
109
|
+
*/
|
|
110
|
+
export declare function createMilestone(groupId: string, options: CreateMilestoneOptions): Promise<Milestone>;
|
|
111
|
+
export interface ListMilestonesOptions {
|
|
112
|
+
status?: 'active' | 'closed';
|
|
113
|
+
limit?: number;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* List milestones for a group
|
|
117
|
+
*/
|
|
118
|
+
export declare function listMilestones(groupId: string, options?: ListMilestonesOptions): Promise<Milestone[]>;
|
|
119
|
+
/**
|
|
120
|
+
* Get a milestone with its checkpoints
|
|
121
|
+
*/
|
|
122
|
+
export declare function getMilestone(milestoneId: string): Promise<Milestone>;
|
|
123
|
+
export interface UpdateMilestoneOptions {
|
|
124
|
+
title?: string;
|
|
125
|
+
description?: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Update a milestone
|
|
129
|
+
*/
|
|
130
|
+
export declare function updateMilestone(milestoneId: string, options: UpdateMilestoneOptions): Promise<Milestone>;
|
|
131
|
+
/**
|
|
132
|
+
* Complete a checkpoint
|
|
133
|
+
*/
|
|
134
|
+
export declare function completeCheckpoint(milestoneId: string, order: number, hilExpirySeconds?: number): Promise<Milestone>;
|
|
135
|
+
export interface UpdateCheckpointOptions {
|
|
136
|
+
title?: string;
|
|
137
|
+
description?: string;
|
|
138
|
+
depends_on?: (number | string)[];
|
|
139
|
+
git_branch_url?: string;
|
|
140
|
+
git_pr_url?: string;
|
|
141
|
+
git_commit_url?: string;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Update a checkpoint
|
|
145
|
+
*/
|
|
146
|
+
export declare function updateCheckpoint(milestoneId: string, order: number, options: UpdateCheckpointOptions): Promise<Milestone>;
|
|
147
|
+
/**
|
|
148
|
+
* Delete a checkpoint
|
|
149
|
+
*/
|
|
150
|
+
export declare function deleteCheckpoint(milestoneId: string, order: number): Promise<Milestone>;
|
|
151
|
+
export interface AddCheckpointOptions {
|
|
152
|
+
title: string;
|
|
153
|
+
description?: string;
|
|
154
|
+
requires_consensus?: boolean;
|
|
155
|
+
depends_on?: (number | string)[];
|
|
156
|
+
git_branch_url?: string;
|
|
157
|
+
git_pr_url?: string;
|
|
158
|
+
git_commit_url?: string;
|
|
159
|
+
position?: number;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Add a checkpoint to an existing milestone
|
|
163
|
+
*/
|
|
164
|
+
export declare function addCheckpoint(milestoneId: string, options: AddCheckpointOptions): Promise<Milestone>;
|
|
165
|
+
/**
|
|
166
|
+
* Re-open a closed milestone
|
|
167
|
+
*/
|
|
168
|
+
export declare function reopenMilestone(milestoneId: string): Promise<Milestone>;
|
|
169
|
+
export interface CreateProjectOptions {
|
|
170
|
+
title: string;
|
|
171
|
+
description?: string;
|
|
172
|
+
slug?: string;
|
|
173
|
+
color?: string;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Create a project in a group
|
|
177
|
+
*/
|
|
178
|
+
export declare function createProject(groupId: string, options: CreateProjectOptions): Promise<Project>;
|
|
179
|
+
export interface ListProjectsOptions {
|
|
180
|
+
status?: ProjectStatus;
|
|
181
|
+
limit?: number;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* List projects for a group
|
|
185
|
+
*/
|
|
186
|
+
export declare function listProjects(groupId: string, options?: ListProjectsOptions): Promise<Project[]>;
|
|
187
|
+
/**
|
|
188
|
+
* Get a project by ID
|
|
189
|
+
*/
|
|
190
|
+
export declare function getProject(projectId: string): Promise<Project>;
|
|
191
|
+
export interface UpdateProjectOptions {
|
|
192
|
+
title?: string;
|
|
193
|
+
description?: string;
|
|
194
|
+
slug?: string;
|
|
195
|
+
color?: string;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Update a project
|
|
199
|
+
*/
|
|
200
|
+
export declare function updateProject(projectId: string, options: UpdateProjectOptions): Promise<Project>;
|
|
201
|
+
/**
|
|
202
|
+
* Mark a project as completed
|
|
203
|
+
*/
|
|
204
|
+
export declare function completeProject(projectId: string): Promise<Project>;
|
|
205
|
+
/**
|
|
206
|
+
* Archive a project
|
|
207
|
+
*/
|
|
208
|
+
export declare function archiveProject(projectId: string): Promise<Project>;
|
|
209
|
+
/**
|
|
210
|
+
* Reopen a completed or archived project
|
|
211
|
+
*/
|
|
212
|
+
export declare function reopenProject(projectId: string): Promise<Project>;
|
|
213
|
+
export interface ListProjectMilestonesOptions {
|
|
214
|
+
status?: 'active' | 'closed';
|
|
215
|
+
limit?: number;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* List milestones in a project
|
|
219
|
+
*/
|
|
220
|
+
export declare function listProjectMilestones(projectId: string, options?: ListProjectMilestonesOptions): Promise<Milestone[]>;
|
|
221
|
+
export interface CreateProposalOptions {
|
|
222
|
+
title: string;
|
|
223
|
+
description?: string;
|
|
224
|
+
voting_type?: 'single' | 'yes_no' | 'ranked';
|
|
225
|
+
threshold_type?: 'majority' | 'two_thirds' | 'unanimous' | 'quorum';
|
|
226
|
+
options?: string[];
|
|
227
|
+
deadline_hours?: number;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Create a voting proposal
|
|
231
|
+
*/
|
|
232
|
+
export declare function createProposal(groupId: string, options: CreateProposalOptions): Promise<Proposal>;
|
|
233
|
+
export interface ListProposalsOptions {
|
|
234
|
+
status?: 'open' | 'finalized';
|
|
235
|
+
limit?: number;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* List proposals for a group
|
|
239
|
+
*/
|
|
240
|
+
export declare function listProposals(groupId: string, options?: ListProposalsOptions): Promise<Proposal[]>;
|
|
241
|
+
/**
|
|
242
|
+
* Get a proposal with votes
|
|
243
|
+
*/
|
|
244
|
+
export declare function getProposal(proposalId: string): Promise<Proposal>;
|
|
245
|
+
export interface CastVoteOptions {
|
|
246
|
+
vote: string;
|
|
247
|
+
comment?: string;
|
|
248
|
+
hil_expiry_seconds?: number;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Cast a vote on a proposal
|
|
252
|
+
*/
|
|
253
|
+
export declare function castVote(proposalId: string, options: CastVoteOptions): Promise<Proposal>;
|
|
254
|
+
export interface FinalizeProposalOptions {
|
|
255
|
+
total_eligible_voters?: number;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Finalize a proposal and compute result
|
|
259
|
+
*/
|
|
260
|
+
export declare function finalizeProposal(proposalId: string, options?: FinalizeProposalOptions): Promise<Proposal>;
|
|
261
|
+
export interface SubmitFeedbackOptions {
|
|
262
|
+
category: FeedbackCategory;
|
|
263
|
+
content: string;
|
|
264
|
+
context?: {
|
|
265
|
+
tool?: string;
|
|
266
|
+
version?: string;
|
|
267
|
+
[key: string]: string | undefined;
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Submit feedback to help improve Clink.
|
|
272
|
+
* Requires an API key with feedback permission enabled.
|
|
273
|
+
*/
|
|
274
|
+
export declare function submitFeedback(options: SubmitFeedbackOptions): Promise<FeedbackResponse>;
|
|
275
|
+
/**
|
|
276
|
+
* Get the permissions for the currently authenticated API key.
|
|
277
|
+
*/
|
|
278
|
+
export declare function getMyPermissions(): Promise<PermissionsResponse>;
|
|
279
|
+
import { PendingVerification } from './types.js';
|
|
280
|
+
/**
|
|
281
|
+
* List pending HIL verifications for a group.
|
|
282
|
+
* Useful for agents to see what's awaiting human approval.
|
|
283
|
+
*/
|
|
284
|
+
export declare function listPendingVerifications(groupId: string, limit?: number): Promise<PendingVerification[]>;
|
|
285
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEL,KAAK,EAEL,MAAM,EAEN,KAAK,EAEL,aAAa,EAGb,gBAAgB,EAChB,SAAS,EAET,OAAO,EAEP,aAAa,EACb,QAAQ,EAER,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAQxC;AAyDD;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAGnD;AAUD;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBpE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGpE;AAMD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CA8BhF;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAM3G;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,KAAK,CAAC,CAMhB;AAMD,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC,CAuBxF;AAMD,MAAM,WAAW,YAAY;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,KAAK,CAAC,CAMhB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAElE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AAMD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QACjC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAEpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,SAAS,EAAE,CAAC,CActB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE1E;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,SAAS,CAAC,CAEpB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,SAAS,CAAC,CAMpB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,SAAS,CAAC,CAEpB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,CAAC,CAEpB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,SAAS,CAAC,CAEpB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAE7E;AAMD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAElB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,OAAO,EAAE,CAAC,CAcpB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAExE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvE;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,SAAS,EAAE,CAAC,CActB;AAMD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC7C,cAAc,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,QAAQ,CAAC,CAEnB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAcrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAEvE;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,QAAQ,CAAC,CAEnB;AAED,MAAM,WAAW,uBAAuB;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,QAAQ,CAAC,CAEnB;AAMD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;KACnC,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,gBAAgB,CAAC,CAE3B;AAMD;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAErE;AAMD,OAAO,EAAE,mBAAmB,EAAgC,MAAM,YAAY,CAAC;AAE/E;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAUhC"}
|