opencode-orchestrator 0.8.12 β 0.8.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +265 -67
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,70 +28,202 @@ Multi-agent system that autonomously executes complex tasks. Commander delegates
|
|
|
28
28
|
|
|
29
29
|
---
|
|
30
30
|
|
|
31
|
-
## ποΈ
|
|
31
|
+
## ποΈ Architecture Overview
|
|
32
|
+
|
|
33
|
+
### π User Flow Architecture
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
37
|
+
β π€ USER REQUEST β
|
|
38
|
+
β /task "Build a REST API" β
|
|
39
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
40
|
+
β
|
|
41
|
+
βΌ
|
|
42
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
43
|
+
β chat.message-handler.ts β
|
|
44
|
+
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
|
45
|
+
β β 1. Detect /task command β β
|
|
46
|
+
β β 2. Create SessionState in sessions Map β β
|
|
47
|
+
β β 3. Call startMissionLoop() β Write .opencode/loop-state.json β β
|
|
48
|
+
β β 4. Apply mission template + Inject prompt to Commander β β
|
|
49
|
+
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
|
50
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
51
|
+
β
|
|
52
|
+
βΌ
|
|
53
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
54
|
+
β π― MASTER SESSION (Commander) β
|
|
55
|
+
β β
|
|
56
|
+
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
|
|
57
|
+
β β 1οΈβ£ THINK βββββΆβ 2οΈβ£ PLAN βββββΆβ 3οΈβ£ DELEGATE βββββΆβ 4οΈβ£ MONITOR β β
|
|
58
|
+
β β Analyze β β Create β β Spawn β β Watch β β
|
|
59
|
+
β β request β β TODO.md β β Workers β β progress β β
|
|
60
|
+
β βββββββββββββββ βββββββββββββββ βββββββββββββββ βββββββββββββββ β
|
|
61
|
+
β β
|
|
62
|
+
β Core Systems Active: β
|
|
63
|
+
β β’ π SessionRecovery (auto error handling) β
|
|
64
|
+
β β’ π TodoContinuation (auto-resume on idle) β
|
|
65
|
+
β β’ ποΈ MissionSealHandler (completion detection) β
|
|
66
|
+
β β’ π£ TaskToastManager (consolidated notifications) β
|
|
67
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
68
|
+
β
|
|
69
|
+
delegate_task (background: true)
|
|
70
|
+
β
|
|
71
|
+
ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ
|
|
72
|
+
βΌ βΌ βΌ
|
|
73
|
+
ββββββββββββββββββββββ ββββββββββββββββββββββ ββββββββββββββββββββββ
|
|
74
|
+
β β‘ Worker Session 1 β β β‘ Worker Session 2 β β β‘ Worker Session N β
|
|
75
|
+
β Agent: Planner β β Agent: Worker β β Agent: Reviewer β
|
|
76
|
+
ββββββββββββββββββββββ€ ββββββββββββββββββββββ€ ββββββββββββββββββββββ€
|
|
77
|
+
β β’ Independent exec β β β’ Independent exec β β β’ Read/Write β
|
|
78
|
+
β β’ Read/Write β β β’ Read/Write β β .opencode/ β
|
|
79
|
+
β .opencode/ β β .opencode/ β β β’ Notify parent β
|
|
80
|
+
β β’ Notify parent β β β’ Notify parent β β on complete β
|
|
81
|
+
β on complete β β on complete β ββββββββββββββββββββββ
|
|
82
|
+
ββββββββββββββββββββββ ββββββββββββββββββββββ
|
|
83
|
+
β β β
|
|
84
|
+
ββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββ
|
|
85
|
+
βΌ
|
|
86
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
87
|
+
β π SHARED CONTEXT (.opencode/) β
|
|
88
|
+
β β
|
|
89
|
+
β todo.md βββ Planner creates β Worker implements β Reviewer checks βββΆ [x] β
|
|
90
|
+
β β
|
|
91
|
+
β β‘ All sessions read/write this shared workspace β
|
|
92
|
+
β π Progress is tracked via todo.md checkboxes β
|
|
93
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
94
|
+
β
|
|
95
|
+
βΌ
|
|
96
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
97
|
+
β ποΈ MISSION SEAL LOOP β
|
|
98
|
+
β β
|
|
99
|
+
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
|
100
|
+
β β β β
|
|
101
|
+
β β session.idle event βββΆ Check for <mission_seal>SEALED</mission_seal> β β
|
|
102
|
+
β β β β β β
|
|
103
|
+
β β β ββββββββββ΄βββββββββ β β
|
|
104
|
+
β β β βΌ βΌ β β
|
|
105
|
+
β β β [Seal Found] [Not Found] β β
|
|
106
|
+
β β β β β β β
|
|
107
|
+
β β β βΌ βΌ β β
|
|
108
|
+
β β β β
Mission Complete iteration < max? β β
|
|
109
|
+
β β β Clear state β β β
|
|
110
|
+
β β β ββββββββ΄βββββββ β β
|
|
111
|
+
β β β βΌ βΌ β β
|
|
112
|
+
β β β [YES] [NO] β β
|
|
113
|
+
β β β β β β β
|
|
114
|
+
β β β βΌ βΌ β β
|
|
115
|
+
β β β 3s countdown toast β οΈ Max iterations β β
|
|
116
|
+
β β β Inject continuation Force stop β β
|
|
117
|
+
β β β β β β
|
|
118
|
+
β β ββββββββββββββββββββββββββββ β β
|
|
119
|
+
β β LOOP β β
|
|
120
|
+
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
|
|
121
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### π Project Architecture
|
|
32
125
|
|
|
33
126
|
```
|
|
34
|
-
|
|
35
|
-
β
|
|
36
|
-
β
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
β
|
|
43
|
-
β
|
|
44
|
-
|
|
45
|
-
β
|
|
46
|
-
β
|
|
47
|
-
β
|
|
48
|
-
β
|
|
49
|
-
β
|
|
50
|
-
β
|
|
51
|
-
β β
|
|
52
|
-
β
|
|
53
|
-
β
|
|
54
|
-
β
|
|
55
|
-
β
|
|
56
|
-
β
|
|
57
|
-
β
|
|
58
|
-
β
|
|
59
|
-
β
|
|
60
|
-
|
|
61
|
-
β
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
delegate_task (async)
|
|
65
|
-
β
|
|
66
|
-
βββββββββββββββββββββββββββΌββββββββββββββββββββββββββ
|
|
67
|
-
βΌ βΌ βΌ
|
|
127
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
128
|
+
β OpenCode Orchestrator Plugin β
|
|
129
|
+
β src/index.ts β
|
|
130
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
131
|
+
β
|
|
132
|
+
βββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββ
|
|
133
|
+
βΌ βΌ βΌ
|
|
134
|
+
βββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββββββββββ
|
|
135
|
+
β Plugin Hooks β β Core Systems β β Tools β
|
|
136
|
+
β plugin-handlers/ β β src/core/ β β src/tools/ β
|
|
137
|
+
βββββββββββββββββββββββ€ βββββββββββββββββββββββ€ βββββββββββββββββββββββββββββββ€
|
|
138
|
+
β β’ chat.message β β β’ agents/ β β β’ parallel/ β
|
|
139
|
+
β β’ event β β ParallelManager β β delegate_task β
|
|
140
|
+
β β’ tool.execute β β TaskStore β β get_task_result β
|
|
141
|
+
β β’ assistant.done β β Concurrency β β β’ web/ β
|
|
142
|
+
βββββββββββββββββββββββ β β’ loop/ β β webfetch, websearch β
|
|
143
|
+
β MissionSeal β β β’ background-cmd/ β
|
|
144
|
+
β TodoContinuation β β run_background β
|
|
145
|
+
β β’ recovery/ β β β’ search β
|
|
146
|
+
β SessionRecovery β β grep, glob, mgrep β
|
|
147
|
+
β β’ notification/ β βββββββββββββββββββββββββββββββ
|
|
148
|
+
β Toast, Manager β
|
|
149
|
+
β β’ session/ β
|
|
150
|
+
β SharedContext β
|
|
151
|
+
β β’ cache/ β
|
|
152
|
+
β DocumentCache β
|
|
153
|
+
βββββββββββββββββββββββ
|
|
154
|
+
β
|
|
155
|
+
βββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββ
|
|
156
|
+
βΌ βΌ βΌ
|
|
68
157
|
βββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββ
|
|
69
|
-
β
|
|
70
|
-
β
|
|
71
|
-
|
|
72
|
-
β
|
|
73
|
-
β
|
|
74
|
-
β
|
|
75
|
-
β β’ Notify parent β β β’ Notify parent β β β’ Notify parent β
|
|
76
|
-
β on complete β β on complete β β on complete β
|
|
158
|
+
β π― Commander β β π Planner β β π¨ Worker β
|
|
159
|
+
β Orchestrator β β Research+Plan β β Implementation β
|
|
160
|
+
βββββββββββββββββββββββ€ βββββββββββββββββββββββ€ βββββββββββββββββββββββ€
|
|
161
|
+
β β’ Mission control β β β’ Task decompose β β β’ Code writing β
|
|
162
|
+
β β’ Parallel delegate β β β’ Doc research β β β’ File operations β
|
|
163
|
+
β β’ TODO monitoring β β β’ TODO creation β β β’ Command execution β
|
|
77
164
|
βββββββββββββββββββββββ βββββββββββββββββββββββ βββββββββββββββββββββββ
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
β
|
|
83
|
-
β
|
|
84
|
-
β
|
|
85
|
-
β
|
|
86
|
-
β
|
|
87
|
-
β
|
|
88
|
-
β
|
|
89
|
-
β
|
|
90
|
-
β
|
|
91
|
-
|
|
165
|
+
β β β
|
|
166
|
+
β β β
|
|
167
|
+
β ββββββββββ΄βββββββββ β
|
|
168
|
+
β βΌ β β
|
|
169
|
+
β βββββββββββββββββββββββ β β
|
|
170
|
+
β β β
Reviewer β β β
|
|
171
|
+
β β Quality+Context β β β
|
|
172
|
+
β βββββββββββββββββββββββ€ β β
|
|
173
|
+
β β β’ Verification β β β
|
|
174
|
+
β β β’ TODO updates β β β
|
|
175
|
+
β β β’ Context manage β β β
|
|
176
|
+
β βββββββββββββββββββββββ β β
|
|
177
|
+
β β β β
|
|
178
|
+
ββββββββββββββββββββΌββββββββββββββββββ΄βββββββββββββββββββ
|
|
179
|
+
βΌ
|
|
180
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
181
|
+
β π Shared Workspace (.opencode/) β
|
|
182
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
|
|
183
|
+
β todo.md β Hierarchical task list (Epic β Task β Subtask) β
|
|
184
|
+
β context.md β Adaptive context (shrinks with progress) β
|
|
185
|
+
β loop-state.json β Mission loop iteration state β
|
|
186
|
+
β docs/ β Cached documentation (auto-expire) β
|
|
187
|
+
β archive/ β Old context snapshots β
|
|
188
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
### π Directory Structure
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
src/
|
|
196
|
+
βββ index.ts # Plugin main entry point
|
|
197
|
+
βββ agents/
|
|
198
|
+
β βββ commander.ts # Commander agent definition
|
|
199
|
+
β βββ definitions.ts # Agent exports
|
|
200
|
+
β βββ prompts/ # Prompt fragments (commander/, planner/, worker/, reviewer/)
|
|
201
|
+
β βββ subagents/ # Subagent definitions (planner.ts, worker.ts, reviewer.ts)
|
|
202
|
+
βββ core/
|
|
203
|
+
β βββ agents/ # ParallelAgentManager, TaskStore, ConcurrencyController
|
|
204
|
+
β βββ cache/ # DocumentCache
|
|
205
|
+
β βββ loop/ # MissionSeal, TodoContinuation, TodoEnforcer
|
|
206
|
+
β βββ notification/ # Toast, TaskToastManager
|
|
207
|
+
β βββ recovery/ # SessionRecovery, ErrorPatterns
|
|
208
|
+
β βββ session/ # SharedContext
|
|
209
|
+
β βββ task/ # TaskScheduler, TaskParser
|
|
210
|
+
βββ plugin-handlers/
|
|
211
|
+
β βββ chat-message-handler.ts # /task detection, mission start
|
|
212
|
+
β βββ event-handler.ts # session.idle, session.error handling
|
|
213
|
+
β βββ tool-execute-handler.ts # Tool completion tracking
|
|
214
|
+
β βββ assistant-done-handler.ts # Response completion
|
|
215
|
+
βββ shared/
|
|
216
|
+
β βββ constants/ # PATHS, TOOL_NAMES, MISSION_SEAL, etc.
|
|
217
|
+
β βββ agent/ # Agent definitions, names
|
|
218
|
+
β βββ errors/ # Error types
|
|
219
|
+
βββ tools/
|
|
220
|
+
β βββ parallel/ # delegate_task, get_task_result, list_tasks, cancel_task
|
|
221
|
+
β βββ web/ # webfetch, websearch, codesearch, cache_docs
|
|
222
|
+
β βββ background-cmd/ # run_background, check_background, list_background
|
|
223
|
+
β βββ search.ts # grep_search, glob_search, mgrep
|
|
224
|
+
βββ utils/ # Utility functions
|
|
92
225
|
```
|
|
93
226
|
|
|
94
|
-
---
|
|
95
227
|
|
|
96
228
|
## Installation
|
|
97
229
|
|
|
@@ -127,9 +259,17 @@ Use `/task` when you need the AI to **complete a mission autonomously**:
|
|
|
127
259
|
**What Commander Mode Does:**
|
|
128
260
|
- βΎοΈ **Runs until sealed** β Loops until agent outputs `<mission_seal>SEALED</mission_seal>`
|
|
129
261
|
- π§ **Anti-Hallucination** β Researches docs before coding
|
|
130
|
-
- β‘ **Parallel Execution** β Up to 50 concurrent
|
|
131
|
-
- π **Auto-Recovery** β Handles errors automatically
|
|
132
|
-
- π **
|
|
262
|
+
- β‘ **Parallel Execution** β Up to 50 concurrent Worker Sessions
|
|
263
|
+
- π **Auto-Recovery** β Handles errors automatically with pattern matching
|
|
264
|
+
- π **Progress Tracking** β Monitors TODO completion and shows progress
|
|
265
|
+
|
|
266
|
+
**Concurrency Limits (per agent type):**
|
|
267
|
+
| Agent | Max Concurrent | Purpose |
|
|
268
|
+
|--------|---------------|-----------|
|
|
269
|
+
| Commander | 1 | Single orchestrator per mission |
|
|
270
|
+
| Planner | 3 | Research and TODO planning |
|
|
271
|
+
| Worker | 10 | Implementation tasks |
|
|
272
|
+
| Reviewer | 5 | Verification and testing |
|
|
133
273
|
|
|
134
274
|
**ποΈ Mission Seal Loop:**
|
|
135
275
|
```
|
|
@@ -172,7 +312,65 @@ What's the difference between useState and useReducer?
|
|
|
172
312
|
|
|
173
313
|
---
|
|
174
314
|
|
|
175
|
-
##
|
|
315
|
+
## π Mission Loop Mechanism
|
|
316
|
+
|
|
317
|
+
The Commander uses an event-driven mission loop to autonomously complete missions:
|
|
318
|
+
|
|
319
|
+
```
|
|
320
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
321
|
+
β MISSION LOOP LIFECYCLE β
|
|
322
|
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
323
|
+
|
|
324
|
+
1οΈβ£ User sends "/task 'mission'"
|
|
325
|
+
β
|
|
326
|
+
2οΈβ£ chat.message handler detects /task
|
|
327
|
+
β
|
|
328
|
+
3οΈβ£ Create session + startMissionLoop()
|
|
329
|
+
β
|
|
330
|
+
Write .opencode/loop-state.json:
|
|
331
|
+
{
|
|
332
|
+
"active": true,
|
|
333
|
+
"sessionID": "ses_abc",
|
|
334
|
+
"iteration": 1,
|
|
335
|
+
"maxIterations": 20
|
|
336
|
+
}
|
|
337
|
+
β
|
|
338
|
+
4οΈβ£ Commander receives prompt β delegates work
|
|
339
|
+
β
|
|
340
|
+
5οΈβ£ Worker sessions execute β results collected
|
|
341
|
+
β
|
|
342
|
+
6οΈβ£ session.idle event triggers
|
|
343
|
+
β
|
|
344
|
+
Check for <mission_seal>SEALED</mission_seal>
|
|
345
|
+
ββ Seal found? β Clear loop state β Complete β
|
|
346
|
+
ββ Not found? β Increment iteration β Continue loop
|
|
347
|
+
β
|
|
348
|
+
Show countdown toast (3 seconds)
|
|
349
|
+
β
|
|
350
|
+
Inject continuation prompt
|
|
351
|
+
β
|
|
352
|
+
[Loop back to step 4]
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
**Key Loop Components:**
|
|
356
|
+
|
|
357
|
+
| Component | File | Purpose |
|
|
358
|
+
|-----------|-------|---------|
|
|
359
|
+
| Loop State | `src/core/loop/mission-seal.ts` | State management (.opencode/loop-state.json) |
|
|
360
|
+
| Seal Detection | `src/core/loop/mission-seal-handler.ts` | Detect `<mission_seal>` in responses |
|
|
361
|
+
| Continuation | `src/core/loop/mission-seal-handler.ts` | Inject prompts to continue work |
|
|
362
|
+
| Countdown | `src/core/loop/mission-seal-handler.ts` | 3-second countdown toast |
|
|
363
|
+
| Idle Handler | `src/plugin-handlers/assistant-done-handler.ts` | Monitor session.idle events |
|
|
364
|
+
|
|
365
|
+
**Why Event-Driven?**
|
|
366
|
+
- No fixed iteration limits - loop continues until sealed
|
|
367
|
+
- Resilient to network delays
|
|
368
|
+
- Can be interrupted by user at any time
|
|
369
|
+
- Efficient polling (500ms interval with backoff)
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## The 4 Agents
|
|
176
374
|
|
|
177
375
|
| Agent | Role | Responsibility |
|
|
178
376
|
| :--------------- | :----------- | :--------------------------------- |
|
|
@@ -210,7 +408,7 @@ What's the difference between useState and useReducer?
|
|
|
210
408
|
| Notifications | 100/parent | FIFO eviction |
|
|
211
409
|
| Event History | 100 | Ring buffer |
|
|
212
410
|
| Session TTL | 60 min | Auto cleanup |
|
|
213
|
-
| Poll Interval |
|
|
411
|
+
| Poll Interval | 500ms | Fast completion detection |
|
|
214
412
|
| Max Poll Count | 600 | Hard limit prevents infinite loops |
|
|
215
413
|
| Sync Timeout | 5 min | Safe delegate_task timeout |
|
|
216
414
|
| Recovery Attempts | 3 | Auto session error recovery |
|
|
@@ -238,9 +436,9 @@ Automatic recovery from common errors:
|
|
|
238
436
|
|
|
239
437
|
### Todo Continuation
|
|
240
438
|
- Monitors `session.idle` events
|
|
241
|
-
-
|
|
439
|
+
- 3-second countdown toast before auto-continuation
|
|
242
440
|
- Cancels on user interaction
|
|
243
|
-
- Skips if background tasks running
|
|
441
|
+
- Skips if background tasks running or session is recovering
|
|
244
442
|
|
|
245
443
|
### noReply Optimization
|
|
246
444
|
- Individual task completion: `noReply: true` (saves tokens)
|
|
@@ -274,9 +472,9 @@ tail -f "$(node -e 'console.log(require("os").tmpdir())')/opencode-orchestrator.
|
|
|
274
472
|
## Documentation
|
|
275
473
|
|
|
276
474
|
- **[System Architecture](docs/SYSTEM_ARCHITECTURE.md)** β Detailed technical docs
|
|
277
|
-
- **[
|
|
475
|
+
- **[Architecture and Flow](docs/ARCHITECTURE_AND_FLOW.md)** β Complete architecture guide with scenarios
|
|
476
|
+
- **[Improvement Suggestions](docs/IMPROVEMENT_SUGGESTIONS.md)** β Project improvement recommendations
|
|
278
477
|
- [Release Notes](docs/releases/) β Version history
|
|
279
|
-
- [Troubleshooting](docs/PLUGIN_TROUBLESHOOTING.md)
|
|
280
478
|
|
|
281
479
|
---
|
|
282
480
|
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "opencode-orchestrator",
|
|
3
3
|
"displayName": "OpenCode Orchestrator",
|
|
4
4
|
"description": "Distributed Cognitive Architecture for OpenCode. Turns simple prompts into specialized multi-agent workflows (Planner, Coder, Reviewer).",
|
|
5
|
-
"version": "0.8.
|
|
5
|
+
"version": "0.8.13",
|
|
6
6
|
"author": "agnusdei1207",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"repository": {
|