@tyvm/knowhow 0.0.61 → 0.0.63

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 (29) hide show
  1. package/package.json +1 -1
  2. package/src/chat/modules/AgentModule.ts +6 -6
  3. package/src/processors/JsonCompressor.ts +496 -0
  4. package/src/processors/TokenCompressor.ts +194 -125
  5. package/src/processors/ToolResponseCache.ts +64 -11
  6. package/src/processors/index.ts +1 -0
  7. package/tests/compressor/bigstring.test.ts +352 -2
  8. package/tests/compressor/githubjson.txt +1 -0
  9. package/tests/compressor/toolResponseCache.test.ts +303 -0
  10. package/ts_build/package.json +1 -1
  11. package/ts_build/src/chat/modules/AgentModule.js +5 -4
  12. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  13. package/ts_build/src/processors/JsonCompressor.d.ts +36 -0
  14. package/ts_build/src/processors/JsonCompressor.js +295 -0
  15. package/ts_build/src/processors/JsonCompressor.js.map +1 -0
  16. package/ts_build/src/processors/TokenCompressor.d.ts +23 -5
  17. package/ts_build/src/processors/TokenCompressor.js +106 -70
  18. package/ts_build/src/processors/TokenCompressor.js.map +1 -1
  19. package/ts_build/src/processors/ToolResponseCache.d.ts +4 -2
  20. package/ts_build/src/processors/ToolResponseCache.js +50 -10
  21. package/ts_build/src/processors/ToolResponseCache.js.map +1 -1
  22. package/ts_build/src/processors/index.d.ts +1 -0
  23. package/ts_build/src/processors/index.js +3 -1
  24. package/ts_build/src/processors/index.js.map +1 -1
  25. package/ts_build/tests/compressor/bigstring.test.js +209 -0
  26. package/ts_build/tests/compressor/bigstring.test.js.map +1 -1
  27. package/ts_build/tests/compressor/toolResponseCache.test.d.ts +1 -0
  28. package/ts_build/tests/compressor/toolResponseCache.test.js +240 -0
  29. package/ts_build/tests/compressor/toolResponseCache.test.js.map +1 -0
@@ -1,10 +1,12 @@
1
1
  import { readFile } from "../../src/utils";
2
- import { TokenCompressor } from "../../src/processors/TokenCompressor";
2
+ import { TokenCompressor, KeyInfo } from "../../src/processors/TokenCompressor";
3
3
  import { services } from "../../src/services";
4
+ import { Message } from "../../src/clients/types";
4
5
 
5
6
  describe("TokenCompressor - Large File Test", () => {
6
7
  let tokenCompressor: TokenCompressor;
7
8
  const bigstringPath = "tests/compressor/bigstring.txt";
9
+ const jsonPath = "tests/compressor/githubjson.txt";
8
10
 
9
11
  beforeAll(() => {
10
12
  const { Tools } = services();
@@ -64,7 +66,9 @@ describe("TokenCompressor - Large File Test", () => {
64
66
  // Remove the NEXT_CHUNK_KEY marker and add content
65
67
  const nextKey = nextKeyMatch[1];
66
68
  const retrieved = await tokenCompressor.retrieveString(nextKey);
67
- console.log(`Retrieved chunk ${chunkCount} with key: ${nextKey}, length: ${retrieved.length}`);
69
+ console.log(
70
+ `Retrieved chunk ${chunkCount} with key: ${nextKey}, length: ${retrieved.length}`
71
+ );
68
72
  } else {
69
73
  // Last chunk
70
74
  reconstructed += currentChunk;
@@ -97,4 +101,350 @@ describe("TokenCompressor - Large File Test", () => {
97
101
  const compressionRatio = compressed.length / fileContents.length;
98
102
  expect(compressionRatio).toBeLessThan(0.01); // Less than 1% of original size
99
103
  });
104
+
105
+ test("should handle json compression", async () => {
106
+ const fileBuffer = await readFile(jsonPath);
107
+ const fileContents = fileBuffer.toString();
108
+
109
+ // Test that it compresses when above threshold
110
+ const estimatedTokens = Math.ceil(fileContents.length / 4);
111
+ expect(estimatedTokens).toBeGreaterThan(4000); // Default threshold
112
+
113
+ const compressed = tokenCompressor.compressContent(fileContents);
114
+
115
+ console.log({ compressedJson: compressed });
116
+
117
+ // Should return JSON object (not a string marker) for MCP format
118
+ const compressedObj = JSON.parse(compressed);
119
+ expect(compressedObj._mcp_format).toBe(true);
120
+ expect(compressedObj._data).toBeDefined();
121
+ expect(compressedObj._schema_key).toBeDefined();
122
+
123
+ // The compression should result in a smaller representation
124
+ const compressionRatio = compressed.length / fileContents.length;
125
+ expect(compressionRatio).toBeLessThan(0.5); // Less than 50% of original size
126
+ });
127
+
128
+ test("should detect json", async () => {
129
+ const fileBuffer = await readFile(jsonPath);
130
+ const fileContents = fileBuffer.toString();
131
+
132
+ const compressed = tokenCompressor.tryParseJson(fileContents);
133
+
134
+ expect(compressed).toBeTruthy();
135
+ });
136
+
137
+ test("should analyze githubjson.txt compression with key chain utilities", async () => {
138
+ const fileBuffer = await readFile(jsonPath);
139
+ const fileContents = fileBuffer.toString();
140
+
141
+ console.log(`\n=== GitHub JSON Compression Analysis ===`);
142
+ console.log(`Original file size: ${fileContents.length} characters`);
143
+ console.log(`Estimated tokens: ${Math.ceil(fileContents.length / 4)}`);
144
+
145
+ // Compress the content
146
+ const compressed = tokenCompressor.compressContent(fileContents);
147
+
148
+ console.log(
149
+ `\nCompressed representation length: ${compressed.length} characters`
150
+ );
151
+ console.log(`\nCompressed output:\n${compressed.substring(0, 500)}...\n`);
152
+
153
+ // Extract root keys from the compressed output
154
+ const rootKeys = tokenCompressor.extractKeys(compressed);
155
+ console.log(`\nRoot keys found: ${rootKeys.length}`);
156
+ console.log(`Keys: ${rootKeys.join(", ")}\n`);
157
+
158
+ expect(rootKeys.length).toBeGreaterThan(0);
159
+
160
+ // Analyze the key chain for each root key
161
+ for (const rootKey of rootKeys) {
162
+ console.log(`\n--- Analyzing key chain for: ${rootKey} ---`);
163
+ const keyChain = tokenCompressor.getKeyChain(rootKey);
164
+
165
+ console.log(`Total keys in chain: ${keyChain.length}`);
166
+
167
+ // Group keys by depth
168
+ const byDepth = keyChain.reduce((acc, info) => {
169
+ if (!acc[info.depth]) {
170
+ acc[info.depth] = [];
171
+ }
172
+ acc[info.depth].push(info);
173
+ return acc;
174
+ }, {} as Record<number, KeyInfo[]>);
175
+
176
+ console.log(`\nKeys by depth:`);
177
+ for (const [depth, infos] of Object.entries(byDepth)) {
178
+ console.log(` Depth ${depth}: ${infos.length} keys`);
179
+ for (const info of infos) {
180
+ console.log(` - ${info.key}:`);
181
+ console.log(
182
+ ` Size: ${info.size} chars (${info.tokens} tokens)`
183
+ );
184
+ console.log(` Type: ${info.type}`);
185
+ console.log(` Child keys: ${info.childKeys.length}`);
186
+ if (info.nextChunkKey) {
187
+ console.log(` Next chunk: ${info.nextChunkKey}`);
188
+ }
189
+ }
190
+ }
191
+
192
+ // Verify chunk sizes are reasonable
193
+ for (const info of keyChain) {
194
+ const data = await tokenCompressor.retrieveString(info.key);
195
+ console.log({ data });
196
+
197
+ // Chunks should not be unnecessarily small (at least 25% of threshold unless it's the last chunk)
198
+ // Allow smaller chunks for next_chunk types at the end of chains
199
+ if (info.type === "child") {
200
+ expect(info.tokens).toBeGreaterThan(1000); // Child chunks should be substantial
201
+ }
202
+
203
+ // Chunks should not exceed the max tokens significantly
204
+ expect(info.tokens).toBeLessThan(tokenCompressor.maxTokens * 1.5);
205
+ }
206
+
207
+ // Calculate total size
208
+ const totalSize = keyChain.reduce((sum, info) => sum + info.size, 0);
209
+ const totalTokens = keyChain.reduce((sum, info) => sum + info.tokens, 0);
210
+ console.log(
211
+ `\nTotal stored size: ${totalSize} characters (${totalTokens} tokens)`
212
+ );
213
+ console.log(
214
+ `Storage efficiency: Stored ${keyChain.length} chunks for original content`
215
+ );
216
+ }
217
+
218
+ // Verify storage state
219
+ console.log(`\n=== Storage State ===`);
220
+ console.log(`Total keys in storage: ${tokenCompressor.getStorageSize()}`);
221
+ console.log(
222
+ `All storage keys: ${tokenCompressor.getStorageKeys().join(", ")}`
223
+ );
224
+
225
+ expect(tokenCompressor.getStorageSize()).toBeGreaterThan(0);
226
+
227
+ // Test extractKeys utility - with new schema format, compressed is a JSON object
228
+ // Parse it to find actual data keys
229
+ const parsedCompressed = tokenCompressor.tryParseJson(compressed);
230
+ expect(parsedCompressed).toBeTruthy();
231
+
232
+ // Look for keys in the parsed structure
233
+ let dataKeys: string[] = [];
234
+ if (parsedCompressed && typeof parsedCompressed === "object") {
235
+ // Extract all keys from the object recursively
236
+ const extractAllKeys = (obj: any): string[] => {
237
+ const keys: string[] = [];
238
+ const str = JSON.stringify(obj);
239
+ keys.push(...tokenCompressor.extractKeys(str));
240
+ return keys;
241
+ };
242
+ dataKeys = extractAllKeys(parsedCompressed);
243
+ }
244
+
245
+ console.log(`\nKeys found in compressed structure: ${dataKeys.length}`);
246
+ const storedContent =
247
+ dataKeys.length > 0 ? tokenCompressor.retrieveString(dataKeys[0]) : null;
248
+
249
+ const embeddedKeys = tokenCompressor.extractKeys(storedContent!);
250
+ console.log(
251
+ `\nKeys embedded in first stored chunk: ${embeddedKeys.length}`
252
+ );
253
+ if (embeddedKeys.length > 0) {
254
+ console.log(`Embedded keys: ${embeddedKeys.join(", ")}`);
255
+ }
256
+ });
257
+
258
+ test("should demonstrate improved compression with schema and low-signal detection", async () => {
259
+ const fileBuffer = await readFile(jsonPath);
260
+ const fileContents = fileBuffer.toString();
261
+
262
+ console.log(`\n=== Compression Performance Analysis ===`);
263
+ console.log(`Original file size: ${fileContents.length} characters`);
264
+ console.log(`Estimated tokens: ${Math.ceil(fileContents.length / 4)}`);
265
+
266
+ // Compress the content
267
+ const compressed = tokenCompressor.compressContent(fileContents);
268
+
269
+ console.log(`\nCompressed representation: ${compressed.length} characters`);
270
+ const compressionRatio = (
271
+ (1 - compressed.length / fileContents.length) *
272
+ 100
273
+ ).toFixed(2);
274
+ console.log(`Compression ratio: ${compressionRatio}%`);
275
+
276
+ // Parse the compressed output
277
+ console.log(
278
+ `\nCompressed output preview:\n${compressed.substring(0, 800)}`
279
+ );
280
+
281
+ const compressedObj = JSON.parse(compressed);
282
+
283
+ console.log(`\n=== Schema Information ===`);
284
+ if (compressedObj._schema_key) {
285
+ console.log(`Schema key found: ${compressedObj._schema_key}`);
286
+ // The _schema_key already includes the full key with _schema suffix
287
+ const schema = tokenCompressor.retrieveString(compressedObj._schema_key);
288
+ if (schema) {
289
+ console.log(`Schema structure:`);
290
+ console.log(JSON.stringify(schema, null, 2).substring(0, 1000));
291
+ }
292
+ }
293
+
294
+ console.log(`\n=== Low-Signal Property Compression ===`);
295
+ // Check first item in the data array for compression metadata
296
+ if (compressedObj._data && Array.isArray(compressedObj._data)) {
297
+ const firstItem = compressedObj._data[0];
298
+ if (
299
+ typeof firstItem === "string" &&
300
+ firstItem.includes("COMPRESSED_JSON")
301
+ ) {
302
+ // Extract the key and retrieve the object
303
+ const keyMatch = firstItem.match(/Key: (compressed_[a-z0-9_]+)/);
304
+ if (keyMatch) {
305
+ const itemKey = keyMatch[1];
306
+ const itemData = tokenCompressor.retrieveString(itemKey);
307
+ if (itemData) {
308
+ const item = JSON.parse(itemData);
309
+ const innerItem = JSON.parse(item.text);
310
+
311
+ // Check for compressed properties in array items
312
+ if (Array.isArray(innerItem)) {
313
+ const sampleItem = innerItem[0];
314
+ if (sampleItem._compressed_properties_key) {
315
+ console.log(
316
+ `Sample item has ${sampleItem._compressed_property_names.length} compressed properties`
317
+ );
318
+ console.log(
319
+ `Compressed properties: ${sampleItem._compressed_property_names
320
+ .slice(0, 10)
321
+ .join(", ")}...`
322
+ );
323
+ console.log(`Info: ${sampleItem._compression_info}`);
324
+
325
+ // Retrieve the compressed properties
326
+ const compressedProps = tokenCompressor.getCompressedProperties(
327
+ sampleItem._compressed_properties_key
328
+ );
329
+ if (compressedProps) {
330
+ const propNames = Object.keys(
331
+ compressedProps.compressed_properties
332
+ );
333
+ console.log(
334
+ `\nRetrieved ${propNames.length} compressed properties successfully`
335
+ );
336
+ console.log(
337
+ `Sample compressed property keys: ${propNames
338
+ .slice(0, 5)
339
+ .join(", ")}`
340
+ );
341
+ }
342
+ }
343
+ }
344
+ }
345
+ }
346
+ }
347
+ }
348
+
349
+ console.log(`\n=== Storage Analysis ===`);
350
+ const totalKeys = tokenCompressor.getStorageSize();
351
+ console.log(`Total storage keys: ${totalKeys}`);
352
+
353
+ // Calculate total stored size
354
+ let totalStoredSize = 0;
355
+ for (const key of tokenCompressor.getStorageKeys()) {
356
+ const data = tokenCompressor.retrieveString(key);
357
+ if (data) {
358
+ totalStoredSize += data.length;
359
+ }
360
+ }
361
+
362
+ console.log(`Total stored data: ${totalStoredSize} characters`);
363
+ console.log(`Compressed representation: ${compressed.length} characters`);
364
+ console.log(
365
+ `Storage overhead ratio: ${(
366
+ (totalStoredSize / fileContents.length) *
367
+ 100
368
+ ).toFixed(2)}%`
369
+ );
370
+ console.log(`Initial view compression: ${compressionRatio}%`);
371
+
372
+ // Verify we achieved good compression (showing first instance for usability)
373
+ expect(parseFloat(compressionRatio)).toBeGreaterThan(60); // At least 60% compression
374
+
375
+ // Verify schema is accessible
376
+ if (compressedObj._schema_key) {
377
+ const schema = tokenCompressor.retrieveString(compressedObj._schema_key);
378
+ expect(schema).toBeTruthy();
379
+ }
380
+
381
+ // Verify low-signal compression happened
382
+ expect(totalKeys).toBeGreaterThan(5); // Should have multiple compression keys
383
+
384
+ console.log(`\n✓ Compression improvements verified!`);
385
+ });
386
+
387
+ test("should not double-compress already compressed content", async () => {
388
+ // Load the githubjson.txt which contains a Message object
389
+ const fileBuffer = await readFile(jsonPath);
390
+ const fileContents = fileBuffer.toString();
391
+
392
+ console.log(`\n=== Testing Double Compression Prevention ===`);
393
+ console.log(`Original file size: ${fileContents.length} characters`);
394
+
395
+ // Parse the message from the file
396
+ const message = JSON.parse(fileContents) as Message;
397
+
398
+ // Create a copy of the message to compress
399
+ const messageToCompress: Message = JSON.parse(JSON.stringify(message));
400
+
401
+ // First compression
402
+ await tokenCompressor.compressMessage(messageToCompress);
403
+
404
+ const firstCompression = (messageToCompress.content as any[])[0].text;
405
+ console.log(`\nAfter first compression: ${firstCompression.length} characters`);
406
+ console.log(`First compression preview:\n${firstCompression.substring(0, 300)}...`);
407
+
408
+ // Parse the first compression result
409
+ const firstParsed = tokenCompressor.tryParseJson(firstCompression);
410
+ expect(firstParsed).toBeTruthy();
411
+ expect(firstParsed._schema_key).toBeDefined();
412
+ expect(firstParsed.data).toBeDefined();
413
+
414
+ // Second compression - this should NOT compress again
415
+ await tokenCompressor.compressMessage(messageToCompress);
416
+
417
+ const secondCompression = (messageToCompress.content as any[])[0].text;
418
+ console.log(`\nAfter second compression: ${secondCompression.length} characters`);
419
+ console.log(`Second compression preview:\n${secondCompression.substring(0, 300)}...`);
420
+
421
+ // Parse the second compression result
422
+ const secondParsed = tokenCompressor.tryParseJson(secondCompression);
423
+ expect(secondParsed).toBeTruthy();
424
+
425
+ console.log(`\nSecond parsed structure keys:`, Object.keys(secondParsed));
426
+ console.log(`Full structure:`, JSON.stringify(secondParsed, null, 2).substring(0, 500));
427
+
428
+ // Check if we get the over-compressed bug: only metadata, no data
429
+ const isOverCompressed =
430
+ Object.keys(secondParsed).length === 3 &&
431
+ secondParsed._mcp_format === true &&
432
+ secondParsed._raw_structure !== undefined &&
433
+ secondParsed._schema_key !== undefined;
434
+
435
+ console.log(`\nIs over-compressed: ${isOverCompressed}`);
436
+
437
+ // After the fix, second compression should be identical to first (no re-compression)
438
+ expect(secondCompression).toBe(firstCompression);
439
+
440
+ // Both should have the same structure with data
441
+ expect(secondParsed).toEqual(firstParsed);
442
+ expect(secondParsed.data).toBeDefined();
443
+ expect(Array.isArray(secondParsed.data)).toBe(true);
444
+
445
+ // Should NOT be over-compressed
446
+ expect(isOverCompressed).toBe(false);
447
+
448
+ console.log(`\n✓ Double compression prevention verified!`);
449
+ });
100
450
  });
@@ -0,0 +1 @@
1
+ {"content":[{"type":"text","text":"[\n {\n \"id\": 111111111,\n \"node_id\": \"MOCK_NODE_ID_001\",\n \"name\": \"gpt-browser\",\n \"full_name\": \"mock-org/gpt-browser\",\n \"private\": true,\n \"owner\": {\n \"login\": \"mock-org\",\n \"id\": 999999999,\n \"node_id\": \"MOCK_ORG_ID\",\n \"avatar_url\": \"https://avatars.mockserver.com/u/999999999\",\n \"gravatar_id\": \"\",\n \"url\": \"https://api.mockserver.com/users/mock-org\",\n \"html_url\": \"https://mockserver.com/mock-org\",\n \"followers_url\": \"https://api.mockserver.com/users/mock-org/followers\",\n \"following_url\": \"https://api.mockserver.com/users/mock-org/following{/other_user}\",\n \"gists_url\": \"https://api.mockserver.com/users/mock-org/gists{/gist_id}\",\n \"starred_url\": \"https://api.mockserver.com/users/mock-org/starred{/owner}{/repo}\",\n \"subscriptions_url\": \"https://api.mockserver.com/users/mock-org/subscriptions\",\n \"organizations_url\": \"https://api.mockserver.com/users/mock-org/orgs\",\n \"repos_url\": \"https://api.mockserver.com/users/mock-org/repos\",\n \"events_url\": \"https://api.mockserver.com/users/mock-org/events{/privacy}\",\n \"received_events_url\": \"https://api.mockserver.com/users/mock-org/received_events\",\n \"type\": \"Organization\",\n \"user_view_type\": \"public\",\n \"site_admin\": false\n },\n \"html_url\": \"https://mockserver.com/mock-org/gpt-browser\",\n \"description\": null,\n \"fork\": false,\n \"url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser\",\n \"forks_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/forks\",\n \"keys_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/keys{/key_id}\",\n \"collaborators_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/collaborators{/collaborator}\",\n \"teams_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/teams\",\n \"hooks_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/hooks\",\n \"issue_events_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/issues/events{/number}\",\n \"events_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/events\",\n \"assignees_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/assignees{/user}\",\n \"branches_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/branches{/branch}\",\n \"tags_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/tags\",\n \"blobs_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/git/blobs{/sha}\",\n \"git_tags_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/git/tags{/sha}\",\n \"git_refs_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/git/refs{/sha}\",\n \"trees_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/git/trees{/sha}\",\n \"statuses_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/statuses/{sha}\",\n \"languages_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/languages\",\n \"stargazers_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/stargazers\",\n \"contributors_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/contributors\",\n \"subscribers_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/subscribers\",\n \"subscription_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/subscription\",\n \"commits_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/commits{/sha}\",\n \"git_commits_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/git/commits{/sha}\",\n \"comments_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/comments{/number}\",\n \"issue_comment_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/issues/comments{/number}\",\n \"contents_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/contents/{+path}\",\n \"compare_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/compare/{base}...{head}\",\n \"merges_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/merges\",\n \"archive_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/{archive_format}{/ref}\",\n \"downloads_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/downloads\",\n \"issues_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/issues{/number}\",\n \"pulls_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/pulls{/number}\",\n \"milestones_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/milestones{/number}\",\n \"notifications_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/notifications{?since,all,participating}\",\n \"labels_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/labels{/name}\",\n \"releases_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/releases{/id}\",\n \"deployments_url\": \"https://api.mockserver.com/repos/mock-org/gpt-browser/deployments\",\n \"created_at\": \"2023-04-16T01:48:54Z\",\n \"updated_at\": \"2023-04-16T01:49:30Z\",\n \"pushed_at\": \"2024-02-13T20:46:27Z\",\n \"git_url\": \"git://mockserver.com/mock-org/gpt-browser.git\",\n \"ssh_url\": \"git@mockserver.com:mock-org/gpt-browser.git\",\n \"clone_url\": \"https://mockserver.com/mock-org/gpt-browser.git\",\n \"svn_url\": \"https://mockserver.com/mock-org/gpt-browser\",\n \"homepage\": null,\n \"size\": 351,\n \"stargazers_count\": 0,\n \"watchers_count\": 0,\n \"language\": \"TypeScript\",\n \"has_issues\": true,\n \"has_projects\": true,\n \"has_downloads\": true,\n \"has_wiki\": false,\n \"has_pages\": false,\n \"has_discussions\": false,\n \"forks_count\": 0,\n \"mirror_url\": null,\n \"archived\": false,\n \"disabled\": false,\n \"open_issues_count\": 0,\n \"license\": null,\n \"allow_forking\": false,\n \"is_template\": false,\n \"web_commit_signoff_required\": false,\n \"topics\": [],\n \"visibility\": \"private\",\n \"forks\": 0,\n \"open_issues\": 0,\n \"watchers\": 0,\n \"default_branch\": \"master\",\n \"permissions\": {\n \"admin\": true,\n \"maintain\": true,\n \"push\": true,\n \"triage\": true,\n \"pull\": true\n }\n },\n {\n \"id\": 222222222,\n \"node_id\": \"MOCK_NODE_ID_002\",\n \"name\": \"nugget\",\n \"full_name\": \"mock-org/nugget\",\n \"private\": true,\n \"owner\": {\n \"login\": \"mock-org\",\n \"id\": 999999999,\n \"node_id\": \"MOCK_ORG_ID\",\n \"avatar_url\": \"https://avatars.mockserver.com/u/999999999\",\n \"gravatar_id\": \"\",\n \"url\": \"https://api.mockserver.com/users/mock-org\",\n \"html_url\": \"https://mockserver.com/mock-org\",\n \"followers_url\": \"https://api.mockserver.com/users/mock-org/followers\",\n \"following_url\": \"https://api.mockserver.com/users/mock-org/following{/other_user}\",\n \"gists_url\": \"https://api.mockserver.com/users/mock-org/gists{/gist_id}\",\n \"starred_url\": \"https://api.mockserver.com/users/mock-org/starred{/owner}{/repo}\",\n \"subscriptions_url\": \"https://api.mockserver.com/users/mock-org/subscriptions\",\n \"organizations_url\": \"https://api.mockserver.com/users/mock-org/orgs\",\n \"repos_url\": \"https://api.mockserver.com/users/mock-org/repos\",\n \"events_url\": \"https://api.mockserver.com/users/mock-org/events{/privacy}\",\n \"received_events_url\": \"https://api.mockserver.com/users/mock-org/received_events\",\n \"type\": \"Organization\",\n \"user_view_type\": \"public\",\n \"site_admin\": false\n },\n \"html_url\": \"https://mockserver.com/mock-org/nugget\",\n \"description\": \"repo with nugget extension that intercepts api calls on the page\",\n \"fork\": false,\n \"url\": \"https://api.mockserver.com/repos/mock-org/nugget\",\n \"forks_url\": \"https://api.mockserver.com/repos/mock-org/nugget/forks\",\n \"keys_url\": \"https://api.mockserver.com/repos/mock-org/nugget/keys{/key_id}\",\n \"collaborators_url\": \"https://api.mockserver.com/repos/mock-org/nugget/collaborators{/collaborator}\",\n \"teams_url\": \"https://api.mockserver.com/repos/mock-org/nugget/teams\",\n \"hooks_url\": \"https://api.mockserver.com/repos/mock-org/nugget/hooks\",\n \"issue_events_url\": \"https://api.mockserver.com/repos/mock-org/nugget/issues/events{/number}\",\n \"events_url\": \"https://api.mockserver.com/repos/mock-org/nugget/events\",\n \"assignees_url\": \"https://api.mockserver.com/repos/mock-org/nugget/assignees{/user}\",\n \"branches_url\": \"https://api.mockserver.com/repos/mock-org/nugget/branches{/branch}\",\n \"tags_url\": \"https://api.mockserver.com/repos/mock-org/nugget/tags\",\n \"blobs_url\": \"https://api.mockserver.com/repos/mock-org/nugget/git/blobs{/sha}\",\n \"git_tags_url\": \"https://api.mockserver.com/repos/mock-org/nugget/git/tags{/sha}\",\n \"git_refs_url\": \"https://api.mockserver.com/repos/mock-org/nugget/git/refs{/sha}\",\n \"trees_url\": \"https://api.mockserver.com/repos/mock-org/nugget/git/trees{/sha}\",\n \"statuses_url\": \"https://api.mockserver.com/repos/mock-org/nugget/statuses/{sha}\",\n \"languages_url\": \"https://api.mockserver.com/repos/mock-org/nugget/languages\",\n \"stargazers_url\": \"https://api.mockserver.com/repos/mock-org/nugget/stargazers\",\n \"contributors_url\": \"https://api.mockserver.com/repos/mock-org/nugget/contributors\",\n \"subscribers_url\": \"https://api.mockserver.com/repos/mock-org/nugget/subscribers\",\n \"subscription_url\": \"https://api.mockserver.com/repos/mock-org/nugget/subscription\",\n \"commits_url\": \"https://api.mockserver.com/repos/mock-org/nugget/commits{/sha}\",\n \"git_commits_url\": \"https://api.mockserver.com/repos/mock-org/nugget/git/commits{/sha}\",\n \"comments_url\": \"https://api.mockserver.com/repos/mock-org/nugget/comments{/number}\",\n \"issue_comment_url\": \"https://api.mockserver.com/repos/mock-org/nugget/issues/comments{/number}\",\n \"contents_url\": \"https://api.mockserver.com/repos/mock-org/nugget/contents/{+path}\",\n \"compare_url\": \"https://api.mockserver.com/repos/mock-org/nugget/compare/{base}...{head}\",\n \"merges_url\": \"https://api.mockserver.com/repos/mock-org/nugget/merges\",\n \"archive_url\": \"https://api.mockserver.com/repos/mock-org/nugget/{archive_format}{/ref}\",\n \"downloads_url\": \"https://api.mockserver.com/repos/mock-org/nugget/downloads\",\n \"issues_url\": \"https://api.mockserver.com/repos/mock-org/nugget/issues{/number}\",\n \"pulls_url\": \"https://api.mockserver.com/repos/mock-org/nugget/pulls{/number}\",\n \"milestones_url\": \"https://api.mockserver.com/repos/mock-org/nugget/milestones{/number}\",\n \"notifications_url\": \"https://api.mockserver.com/repos/mock-org/nugget/notifications{?since,all,participating}\",\n \"labels_url\": \"https://api.mockserver.com/repos/mock-org/nugget/labels{/name}\",\n \"releases_url\": \"https://api.mockserver.com/repos/mock-org/nugget/releases{/id}\",\n \"deployments_url\": \"https://api.mockserver.com/repos/mock-org/nugget/deployments\",\n \"created_at\": \"2023-10-12T05:10:08Z\",\n \"updated_at\": \"2023-10-12T05:10:28Z\",\n \"pushed_at\": \"2023-10-17T22:46:06Z\",\n \"git_url\": \"git://mockserver.com/mock-org/nugget.git\",\n \"ssh_url\": \"git@mockserver.com:mock-org/nugget.git\",\n \"clone_url\": \"https://mockserver.com/mock-org/nugget.git\",\n \"svn_url\": \"https://mockserver.com/mock-org/nugget\",\n \"homepage\": null,\n \"size\": 130,\n \"stargazers_count\": 0,\n \"watchers_count\": 0,\n \"language\": \"TypeScript\",\n \"has_issues\": true,\n \"has_projects\": true,\n \"has_downloads\": true,\n \"has_wiki\": false,\n \"has_pages\": false,\n \"has_discussions\": false,\n \"forks_count\": 0,\n \"mirror_url\": null,\n \"archived\": false,\n \"disabled\": false,\n \"open_issues_count\": 1,\n \"license\": null,\n \"allow_forking\": false,\n \"is_template\": false,\n \"web_commit_signoff_required\": false,\n \"topics\": [],\n \"visibility\": \"private\",\n \"forks\": 0,\n \"open_issues\": 1,\n \"watchers\": 0,\n \"default_branch\": \"master\",\n \"permissions\": {\n \"admin\": true,\n \"maintain\": true,\n \"push\": true,\n \"triage\": true,\n \"pull\": true\n }\n },\n {\n \"id\": 333333333,\n \"node_id\": \"MOCK_NODE_ID_003\",\n \"name\": \"pill-buddy\",\n \"full_name\": \"mock-org/pill-buddy\",\n \"private\": true,\n \"owner\": {\n \"login\": \"mock-org\",\n \"id\": 999999999,\n \"node_id\": \"MOCK_ORG_ID\",\n \"avatar_url\": \"https://avatars.mockserver.com/u/999999999\",\n \"gravatar_id\": \"\",\n \"url\": \"https://api.mockserver.com/users/mock-org\",\n \"html_url\": \"https://mockserver.com/mock-org\",\n \"followers_url\": \"https://api.mockserver.com/users/mock-org/followers\",\n \"following_url\": \"https://api.mockserver.com/users/mock-org/following{/other_user}\",\n \"gists_url\": \"https://api.mockserver.com/users/mock-org/gists{/gist_id}\",\n \"starred_url\": \"https://api.mockserver.com/users/mock-org/starred{/owner}{/repo}\",\n \"subscriptions_url\": \"https://api.mockserver.com/users/mock-org/subscriptions\",\n \"organizations_url\": \"https://api.mockserver.com/users/mock-org/orgs\",\n \"repos_url\": \"https://api.mockserver.com/users/mock-org/repos\",\n \"events_url\": \"https://api.mockserver.com/users/mock-org/events{/privacy}\",\n \"received_events_url\": \"https://api.mockserver.com/users/mock-org/received_events\",\n \"type\": \"Organization\",\n \"user_view_type\": \"public\",\n \"site_admin\": false\n },\n \"html_url\": \"https://mockserver.com/mock-org/pill-buddy\",\n \"description\": null,\n \"fork\": false,\n \"url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy\",\n \"forks_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/forks\",\n \"keys_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/keys{/key_id}\",\n \"collaborators_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/collaborators{/collaborator}\",\n \"teams_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/teams\",\n \"hooks_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/hooks\",\n \"issue_events_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/issues/events{/number}\",\n \"events_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/events\",\n \"assignees_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/assignees{/user}\",\n \"branches_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/branches{/branch}\",\n \"tags_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/tags\",\n \"blobs_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/git/blobs{/sha}\",\n \"git_tags_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/git/tags{/sha}\",\n \"git_refs_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/git/refs{/sha}\",\n \"trees_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/git/trees{/sha}\",\n \"statuses_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/statuses/{sha}\",\n \"languages_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/languages\",\n \"stargazers_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/stargazers\",\n \"contributors_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/contributors\",\n \"subscribers_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/subscribers\",\n \"subscription_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/subscription\",\n \"commits_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/commits{/sha}\",\n \"git_commits_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/git/commits{/sha}\",\n \"comments_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/comments{/number}\",\n \"issue_comment_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/issues/comments{/number}\",\n \"contents_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/contents/{+path}\",\n \"compare_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/compare/{base}...{head}\",\n \"merges_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/merges\",\n \"archive_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/{archive_format}{/ref}\",\n \"downloads_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/downloads\",\n \"issues_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/issues{/number}\",\n \"pulls_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/pulls{/number}\",\n \"milestones_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/milestones{/number}\",\n \"notifications_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/notifications{?since,all,participating}\",\n \"labels_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/labels{/name}\",\n \"releases_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/releases{/id}\",\n \"deployments_url\": \"https://api.mockserver.com/repos/mock-org/pill-buddy/deployments\",\n \"created_at\": \"2023-04-24T12:04:33Z\",\n \"updated_at\": \"2023-04-24T12:26:53Z\",\n \"pushed_at\": \"2023-04-27T13:28:39Z\",\n \"git_url\": \"git://mockserver.com/mock-org/pill-buddy.git\",\n \"ssh_url\": \"git@mockserver.com:mock-org/pill-buddy.git\",\n \"clone_url\": \"https://mockserver.com/mock-org/pill-buddy.git\",\n \"svn_url\": \"https://mockserver.com/mock-org/pill-buddy\",\n \"homepage\": null,\n \"size\": 229,\n \"stargazers_count\": 0,\n \"watchers_count\": 0,\n \"language\": \"TypeScript\",\n \"has_issues\": true,\n \"has_projects\": true,\n \"has_downloads\": true,\n \"has_wiki\": false,\n \"has_pages\": false,\n \"has_discussions\": false,\n \"forks_count\": 0,\n \"mirror_url\": null,\n \"archived\": false,\n \"disabled\": false,\n \"open_issues_count\": 0,\n \"license\": null,\n \"allow_forking\": false,\n \"is_template\": false,\n \"web_commit_signoff_required\": false,\n \"topics\": [],\n \"visibility\": \"private\",\n \"forks\": 0,\n \"open_issues\": 0,\n \"watchers\": 0,\n \"default_branch\": \"master\",\n \"permissions\": {\n \"admin\": true,\n \"maintain\": true,\n \"push\": true,\n \"triage\": true,\n \"pull\": true\n }\n },\n {\n \"id\": 444444444,\n \"node_id\": \"MOCK_NODE_ID_004\",\n \"name\": \"summary-cast\",\n \"full_name\": \"mock-org/summary-cast\",\n \"private\": true,\n \"owner\": {\n \"login\": \"mock-org\",\n \"id\": 999999999,\n \"node_id\": \"MOCK_ORG_ID\",\n \"avatar_url\": \"https://avatars.mockserver.com/u/999999999\",\n \"gravatar_id\": \"\",\n \"url\": \"https://api.mockserver.com/users/mock-org\",\n \"html_url\": \"https://mockserver.com/mock-org\",\n \"followers_url\": \"https://api.mockserver.com/users/mock-org/followers\",\n \"following_url\": \"https://api.mockserver.com/users/mock-org/following{/other_user}\",\n \"gists_url\": \"https://api.mockserver.com/users/mock-org/gists{/gist_id}\",\n \"starred_url\": \"https://api.mockserver.com/users/mock-org/starred{/owner}{/repo}\",\n \"subscriptions_url\": \"https://api.mockserver.com/users/mock-org/subscriptions\",\n \"organizations_url\": \"https://api.mockserver.com/users/mock-org/orgs\",\n \"repos_url\": \"https://api.mockserver.com/users/mock-org/repos\",\n \"events_url\": \"https://api.mockserver.com/users/mock-org/events{/privacy}\",\n \"received_events_url\": \"https://api.mockserver.com/users/mock-org/received_events\",\n \"type\": \"Organization\",\n \"user_view_type\": \"public\",\n \"site_admin\": false\n },\n \"html_url\": \"https://mockserver.com/mock-org/summary-cast\",\n \"description\": null,\n \"fork\": false,\n \"url\": \"https://api.mockserver.com/repos/mock-org/summary-cast\",\n \"forks_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/forks\",\n \"keys_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/keys{/key_id}\",\n \"collaborators_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/collaborators{/collaborator}\",\n \"teams_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/teams\",\n \"hooks_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/hooks\",\n \"issue_events_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/issues/events{/number}\",\n \"events_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/events\",\n \"assignees_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/assignees{/user}\",\n \"branches_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/branches{/branch}\",\n \"tags_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/tags\",\n \"blobs_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/git/blobs{/sha}\",\n \"git_tags_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/git/tags{/sha}\",\n \"git_refs_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/git/refs{/sha}\",\n \"trees_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/git/trees{/sha}\",\n \"statuses_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/statuses/{sha}\",\n \"languages_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/languages\",\n \"stargazers_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/stargazers\",\n \"contributors_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/contributors\",\n \"subscribers_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/subscribers\",\n \"subscription_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/subscription\",\n \"commits_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/commits{/sha}\",\n \"git_commits_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/git/commits{/sha}\",\n \"comments_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/comments{/number}\",\n \"issue_comment_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/issues/comments{/number}\",\n \"contents_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/contents/{+path}\",\n \"compare_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/compare/{base}...{head}\",\n \"merges_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/merges\",\n \"archive_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/{archive_format}{/ref}\",\n \"downloads_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/downloads\",\n \"issues_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/issues{/number}\",\n \"pulls_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/pulls{/number}\",\n \"milestones_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/milestones{/number}\",\n \"notifications_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/notifications{?since,all,participating}\",\n \"labels_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/labels{/name}\",\n \"releases_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/releases{/id}\",\n \"deployments_url\": \"https://api.mockserver.com/repos/mock-org/summary-cast/deployments\",\n \"created_at\": \"2023-04-28T04:40:22Z\",\n \"updated_at\": \"2023-04-28T04:41:13Z\",\n \"pushed_at\": \"2023-05-01T04:04:54Z\",\n \"git_url\": \"git://mockserver.com/mock-org/summary-cast.git\",\n \"ssh_url\": \"git@mockserver.com:mock-org/summary-cast.git\",\n \"clone_url\": \"https://mockserver.com/mock-org/summary-cast.git\",\n \"svn_url\": \"https://mockserver.com/mock-org/summary-cast\",\n \"homepage\": null,\n \"size\": 51565,\n \"stargazers_count\": 0,\n \"watchers_count\": 0,\n \"language\": \"TypeScript\",\n \"has_issues\": true,\n \"has_projects\": true,\n \"has_downloads\": true,\n \"has_wiki\": false,\n \"has_pages\": false,\n \"has_discussions\": false,\n \"forks_count\": 0,\n \"mirror_url\": null,\n \"archived\": false,\n \"disabled\": false,\n \"open_issues_count\": 0,\n \"license\": null,\n \"allow_forking\": false,\n \"is_template\": false,\n \"web_commit_signoff_required\": false,\n \"topics\": [],\n \"visibility\": \"private\",\n \"forks\": 0,\n \"open_issues\": 0,\n \"watchers\": 0,\n \"default_branch\": \"master\",\n \"permissions\": {\n \"admin\": true,\n \"maintain\": true,\n \"push\": true,\n \"triage\": true,\n \"pull\": true\n }\n },\n {\n \"id\": 555555555,\n \"node_id\": \"MOCK_NODE_ID_005\",\n \"name\": \"tyvm\",\n \"full_name\": \"mock-org/tyvm\",\n \"private\": true,\n \"owner\": {\n \"login\": \"mock-org\",\n \"id\": 999999999,\n \"node_id\": \"MOCK_ORG_ID\",\n \"avatar_url\": \"https://avatars.mockserver.com/u/999999999\",\n \"gravatar_id\": \"\",\n \"url\": \"https://api.mockserver.com/users/mock-org\",\n \"html_url\": \"https://mockserver.com/mock-org\",\n \"followers_url\": \"https://api.mockserver.com/users/mock-org/followers\",\n \"following_url\": \"https://api.mockserver.com/users/mock-org/following{/other_user}\",\n \"gists_url\": \"https://api.mockserver.com/users/mock-org/gists{/gist_id}\",\n \"starred_url\": \"https://api.mockserver.com/users/mock-org/starred{/owner}{/repo}\",\n \"subscriptions_url\": \"https://api.mockserver.com/users/mock-org/subscriptions\",\n \"organizations_url\": \"https://api.mockserver.com/users/mock-org/orgs\",\n \"repos_url\": \"https://api.mockserver.com/users/mock-org/repos\",\n \"events_url\": \"https://api.mockserver.com/users/mock-org/events{/privacy}\",\n \"received_events_url\": \"https://api.mockserver.com/users/mock-org/received_events\",\n \"type\": \"Organization\",\n \"user_view_type\": \"public\",\n \"site_admin\": false\n },\n \"html_url\": \"https://mockserver.com/mock-org/tyvm\",\n \"description\": null,\n \"fork\": false,\n \"url\": \"https://api.mockserver.com/repos/mock-org/tyvm\",\n \"forks_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/forks\",\n \"keys_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/keys{/key_id}\",\n \"collaborators_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/collaborators{/collaborator}\",\n \"teams_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/teams\",\n \"hooks_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/hooks\",\n \"issue_events_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/issues/events{/number}\",\n \"events_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/events\",\n \"assignees_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/assignees{/user}\",\n \"branches_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/branches{/branch}\",\n \"tags_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/tags\",\n \"blobs_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/git/blobs{/sha}\",\n \"git_tags_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/git/tags{/sha}\",\n \"git_refs_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/git/refs{/sha}\",\n \"trees_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/git/trees{/sha}\",\n \"statuses_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/statuses/{sha}\",\n \"languages_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/languages\",\n \"stargazers_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/stargazers\",\n \"contributors_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/contributors\",\n \"subscribers_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/subscribers\",\n \"subscription_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/subscription\",\n \"commits_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/commits{/sha}\",\n \"git_commits_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/git/commits{/sha}\",\n \"comments_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/comments{/number}\",\n \"issue_comment_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/issues/comments{/number}\",\n \"contents_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/contents/{+path}\",\n \"compare_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/compare/{base}...{head}\",\n \"merges_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/merges\",\n \"archive_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/{archive_format}{/ref}\",\n \"downloads_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/downloads\",\n \"issues_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/issues{/number}\",\n \"pulls_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/pulls{/number}\",\n \"milestones_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/milestones{/number}\",\n \"notifications_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/notifications{?since,all,participating}\",\n \"labels_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/labels{/name}\",\n \"releases_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/releases{/id}\",\n \"deployments_url\": \"https://api.mockserver.com/repos/mock-org/tyvm/deployments\",\n \"created_at\": \"2023-01-02T22:24:05Z\",\n \"updated_at\": \"2026-02-12T02:27:28Z\",\n \"pushed_at\": \"2023-01-13T20:40:14Z\",\n \"git_url\": \"git://mockserver.com/mock-org/tyvm.git\",\n \"ssh_url\": \"git@mockserver.com:mock-org/tyvm.git\",\n \"clone_url\": \"https://mockserver.com/mock-org/tyvm.git\",\n \"svn_url\": \"https://mockserver.com/mock-org/tyvm\",\n \"homepage\": null,\n \"size\": 1706,\n \"stargazers_count\": 0,\n \"watchers_count\": 0,\n \"language\": \"TypeScript\",\n \"has_issues\": true,\n \"has_projects\": true,\n \"has_downloads\": true,\n \"has_wiki\": false,\n \"has_pages\": false,\n \"has_discussions\": false,\n \"forks_count\": 0,\n \"mirror_url\": null,\n \"archived\": false,\n \"disabled\": false,\n \"open_issues_count\": 1,\n \"license\": null,\n \"allow_forking\": false,\n \"is_template\": false,\n \"web_commit_signoff_required\": false,\n \"topics\": [],\n \"visibility\": \"private\",\n \"forks\": 0,\n \"open_issues\": 1,\n \"watchers\": 0,\n \"default_branch\": \"main\",\n \"permissions\": {\n \"admin\": true,\n \"maintain\": true,\n \"push\": true,\n \"triage\": true,\n \"pull\": true\n }\n },\n {\n \"id\": 666666666,\n \"node_id\": \"MOCK_NODE_ID_006\",\n \"name\": \"tyvm-primitives\",\n \"full_name\": \"mock-org/tyvm-primitives\",\n \"private\": true,\n \"owner\": {\n \"login\": \"mock-org\",\n \"id\": 999999999,\n \"node_id\": \"MOCK_ORG_ID\",\n \"avatar_url\": \"https://avatars.mockserver.com/u/999999999\",\n \"gravatar_id\": \"\",\n \"url\": \"https://api.mockserver.com/users/mock-org\",\n \"html_url\": \"https://mockserver.com/mock-org\",\n \"followers_url\": \"https://api.mockserver.com/users/mock-org/followers\",\n \"following_url\": \"https://api.mockserver.com/users/mock-org/following{/other_user}\",\n \"gists_url\": \"https://api.mockserver.com/users/mock-org/gists{/gist_id}\",\n \"starred_url\": \"https://api.mockserver.com/users/mock-org/starred{/owner}{/repo}\",\n \"subscriptions_url\": \"https://api.mockserver.com/users/mock-org/subscriptions\",\n \"organizations_url\": \"https://api.mockserver.com/users/mock-org/orgs\",\n \"repos_url\": \"https://api.mockserver.com/users/mock-org/repos\",\n \"events_url\": \"https://api.mockserver.com/users/mock-org/events{/privacy}\",\n \"received_events_url\": \"https://api.mockserver.com/users/mock-org/received_events\",\n \"type\": \"Organization\",\n \"user_view_type\": \"public\",\n \"site_admin\": false\n },\n \"html_url\": \"https://mockserver.com/mock-org/tyvm-primitives\",\n \"description\": null,\n \"fork\": false,\n \"url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives\",\n \"forks_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/forks\",\n \"keys_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/keys{/key_id}\",\n \"collaborators_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/collaborators{/collaborator}\",\n \"teams_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/teams\",\n \"hooks_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/hooks\",\n \"issue_events_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/issues/events{/number}\",\n \"events_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/events\",\n \"assignees_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/assignees{/user}\",\n \"branches_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/branches{/branch}\",\n \"tags_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/tags\",\n \"blobs_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/git/blobs{/sha}\",\n \"git_tags_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/git/tags{/sha}\",\n \"git_refs_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/git/refs{/sha}\",\n \"trees_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/git/trees{/sha}\",\n \"statuses_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/statuses/{sha}\",\n \"languages_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/languages\",\n \"stargazers_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/stargazers\",\n \"contributors_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/contributors\",\n \"subscribers_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/subscribers\",\n \"subscription_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/subscription\",\n \"commits_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/commits{/sha}\",\n \"git_commits_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/git/commits{/sha}\",\n \"comments_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/comments{/number}\",\n \"issue_comment_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/issues/comments{/number}\",\n \"contents_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/contents/{+path}\",\n \"compare_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/compare/{base}...{head}\",\n \"merges_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/merges\",\n \"archive_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/{archive_format}{/ref}\",\n \"downloads_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/downloads\",\n \"issues_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/issues{/number}\",\n \"pulls_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/pulls{/number}\",\n \"milestones_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/milestones{/number}\",\n \"notifications_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/notifications{?since,all,participating}\",\n \"labels_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/labels{/name}\",\n \"releases_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/releases{/id}\",\n \"deployments_url\": \"https://api.mockserver.com/repos/mock-org/tyvm-primitives/deployments\",\n \"created_at\": \"2023-09-25T23:17:26Z\",\n \"updated_at\": \"2023-09-27T02:27:06Z\",\n \"pushed_at\": \"2023-12-19T17:56:07Z\",\n \"git_url\": \"git://mockserver.com/mock-org/tyvm-primitives.git\",\n \"ssh_url\": \"git@mockserver.com:mock-org/tyvm-primitives.git\",\n \"clone_url\": \"https://mockserver.com/mock-org/tyvm-primitives.git\",\n \"svn_url\": \"https://mockserver.com/mock-org/tyvm-primitives\",\n \"homepage\": null,\n \"size\": 603,\n \"stargazers_count\": 0,\n \"watchers_count\": 0,\n \"language\": \"TypeScript\",\n \"has_issues\": true,\n \"has_projects\": true,\n \"has_downloads\": true,\n \"has_wiki\": false,\n \"has_pages\": false,\n \"has_discussions\": false,\n \"forks_count\": 0,\n \"mirror_url\": null,\n \"archived\": false,\n \"disabled\": false,\n \"open_issues_count\": 0,\n \"license\": null,\n \"allow_forking\": false,\n \"is_template\": false,\n \"web_commit_signoff_required\": false,\n \"topics\": [],\n \"visibility\": \"private\",\n \"forks\": 0,\n \"open_issues\": 0,\n \"watchers\": 0,\n \"default_branch\": \"master\",\n \"permissions\": {\n \"admin\": true,\n \"maintain\": true,\n \"push\": true,\n \"triage\": true,\n \"pull\": true\n }\n }\n]\n"}]}