@develosaur/mcp 1.0.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/dist/auth/ApiKeyAuth.d.ts +23 -0
- package/dist/auth/ApiKeyAuth.d.ts.map +1 -0
- package/dist/auth/ApiKeyAuth.js +119 -0
- package/dist/auth/ApiKeyAuth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +252 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/edges.d.ts +10 -0
- package/dist/tools/edges.d.ts.map +1 -0
- package/dist/tools/edges.js +58 -0
- package/dist/tools/edges.js.map +1 -0
- package/dist/tools/nodes.d.ts +26 -0
- package/dist/tools/nodes.d.ts.map +1 -0
- package/dist/tools/nodes.js +188 -0
- package/dist/tools/nodes.js.map +1 -0
- package/dist/tools/query.d.ts +27 -0
- package/dist/tools/query.d.ts.map +1 -0
- package/dist/tools/query.js +133 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/nodeDefaults.d.ts +14 -0
- package/dist/utils/nodeDefaults.d.ts.map +1 -0
- package/dist/utils/nodeDefaults.js +49 -0
- package/dist/utils/nodeDefaults.js.map +1 -0
- package/dist/utils/rateLimiter.d.ts +11 -0
- package/dist/utils/rateLimiter.d.ts.map +1 -0
- package/dist/utils/rateLimiter.js +32 -0
- package/dist/utils/rateLimiter.js.map +1 -0
- package/dist/yjs/BinaryEncoding.d.ts +7 -0
- package/dist/yjs/BinaryEncoding.d.ts.map +1 -0
- package/dist/yjs/BinaryEncoding.js +11 -0
- package/dist/yjs/BinaryEncoding.js.map +1 -0
- package/dist/yjs/YjsProjectSession.d.ts +45 -0
- package/dist/yjs/YjsProjectSession.d.ts.map +1 -0
- package/dist/yjs/YjsProjectSession.js +129 -0
- package/dist/yjs/YjsProjectSession.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as Y from 'yjs';
|
|
2
|
+
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
3
|
+
export declare class YjsProjectSession {
|
|
4
|
+
private yDoc;
|
|
5
|
+
private channel;
|
|
6
|
+
private supabase;
|
|
7
|
+
private projectId;
|
|
8
|
+
private connected;
|
|
9
|
+
constructor(supabase: SupabaseClient, projectId: string);
|
|
10
|
+
/**
|
|
11
|
+
* Load project state: snapshot + incremental updates
|
|
12
|
+
* Uses the EXISTING load_yjs_state_efficient RPC (no modifications)
|
|
13
|
+
*/
|
|
14
|
+
load(): Promise<{
|
|
15
|
+
nodeCount: number;
|
|
16
|
+
edgeCount: number;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Connect to Realtime channel for bidirectional sync
|
|
20
|
+
*/
|
|
21
|
+
connectRealtime(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Apply a mutation to the Y.Doc, save the delta, and broadcast
|
|
24
|
+
* Uses the EXISTING save_yjs_update RPC (no modifications)
|
|
25
|
+
*/
|
|
26
|
+
applyChange(fn: (doc: Y.Doc) => void): Promise<number>;
|
|
27
|
+
/**
|
|
28
|
+
* Broadcast an update via Realtime channel
|
|
29
|
+
*/
|
|
30
|
+
private broadcast;
|
|
31
|
+
/**
|
|
32
|
+
* Disconnect from Realtime
|
|
33
|
+
*/
|
|
34
|
+
disconnect(): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Access the Y.Doc for read operations
|
|
37
|
+
*/
|
|
38
|
+
getDoc(): Y.Doc;
|
|
39
|
+
/**
|
|
40
|
+
* Check if Realtime is connected
|
|
41
|
+
*/
|
|
42
|
+
isConnected(): boolean;
|
|
43
|
+
getProjectId(): string;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=YjsProjectSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"YjsProjectSession.d.ts","sourceRoot":"","sources":["../../src/yjs/YjsProjectSession.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,uBAAuB,CAAC;AAG7E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;gBAEd,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM;IAMvD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAuC/D;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtC;;;OAGG;IACG,WAAW,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAkC5D;;OAEG;YACW,SAAS;IAkBvB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC;;OAEG;IACH,MAAM,IAAI,CAAC,CAAC,GAAG;IAIf;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB,YAAY,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as Y from 'yjs';
|
|
2
|
+
import { uint8ArrayToBase64, base64ToUint8Array } from './BinaryEncoding.js';
|
|
3
|
+
export class YjsProjectSession {
|
|
4
|
+
yDoc;
|
|
5
|
+
channel = null;
|
|
6
|
+
supabase;
|
|
7
|
+
projectId;
|
|
8
|
+
connected = false;
|
|
9
|
+
constructor(supabase, projectId) {
|
|
10
|
+
this.supabase = supabase;
|
|
11
|
+
this.projectId = projectId;
|
|
12
|
+
this.yDoc = new Y.Doc();
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load project state: snapshot + incremental updates
|
|
16
|
+
* Uses the EXISTING load_yjs_state_efficient RPC (no modifications)
|
|
17
|
+
*/
|
|
18
|
+
async load() {
|
|
19
|
+
const { data, error } = await this.supabase.rpc('load_yjs_state_efficient', {
|
|
20
|
+
p_project_id: this.projectId,
|
|
21
|
+
});
|
|
22
|
+
if (error) {
|
|
23
|
+
throw new Error(`Failed to load project: ${error.message}`);
|
|
24
|
+
}
|
|
25
|
+
if (data && data.length > 0) {
|
|
26
|
+
const state = data[0];
|
|
27
|
+
// Apply snapshot
|
|
28
|
+
if (state.snapshot_base64) {
|
|
29
|
+
Y.applyUpdate(this.yDoc, base64ToUint8Array(state.snapshot_base64), 'remote');
|
|
30
|
+
}
|
|
31
|
+
// Apply incremental updates
|
|
32
|
+
if (state.updates && Array.isArray(state.updates)) {
|
|
33
|
+
for (const updateBase64 of state.updates) {
|
|
34
|
+
Y.applyUpdate(this.yDoc, base64ToUint8Array(updateBase64), 'remote');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const nodeCount = this.yDoc.getMap('nodes').size;
|
|
39
|
+
const edgeCount = this.yDoc.getMap('edges').size;
|
|
40
|
+
return { nodeCount, edgeCount };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Connect to Realtime channel for bidirectional sync
|
|
44
|
+
*/
|
|
45
|
+
async connectRealtime() {
|
|
46
|
+
this.channel = this.supabase.channel(`yjs-project-${this.projectId}`);
|
|
47
|
+
// Listen for updates from the web app
|
|
48
|
+
this.channel.on('broadcast', { event: 'yjs-update' }, ({ payload }) => {
|
|
49
|
+
if (payload.clientId === this.yDoc.clientID)
|
|
50
|
+
return; // Skip own
|
|
51
|
+
Y.applyUpdate(this.yDoc, new Uint8Array(payload.update), 'remote');
|
|
52
|
+
});
|
|
53
|
+
await this.channel.subscribe();
|
|
54
|
+
this.connected = true;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Apply a mutation to the Y.Doc, save the delta, and broadcast
|
|
58
|
+
* Uses the EXISTING save_yjs_update RPC (no modifications)
|
|
59
|
+
*/
|
|
60
|
+
async applyChange(fn) {
|
|
61
|
+
let capturedUpdate = null;
|
|
62
|
+
const listener = (update, origin) => {
|
|
63
|
+
if (origin !== 'remote') {
|
|
64
|
+
capturedUpdate = update;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
this.yDoc.on('update', listener);
|
|
68
|
+
this.yDoc.transact(() => fn(this.yDoc), 'local');
|
|
69
|
+
this.yDoc.off('update', listener);
|
|
70
|
+
if (!capturedUpdate)
|
|
71
|
+
return -1; // No-op
|
|
72
|
+
// Save to DB via existing RPC
|
|
73
|
+
const { data, error } = await this.supabase.rpc('save_yjs_update', {
|
|
74
|
+
p_project_id: this.projectId,
|
|
75
|
+
p_update_base64: uint8ArrayToBase64(capturedUpdate),
|
|
76
|
+
p_client_id: this.yDoc.clientID,
|
|
77
|
+
});
|
|
78
|
+
if (error) {
|
|
79
|
+
throw new Error(`Failed to save update: ${error.message}`);
|
|
80
|
+
}
|
|
81
|
+
const sequenceNumber = data;
|
|
82
|
+
// Broadcast to web app
|
|
83
|
+
await this.broadcast(capturedUpdate, sequenceNumber);
|
|
84
|
+
return sequenceNumber;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Broadcast an update via Realtime channel
|
|
88
|
+
*/
|
|
89
|
+
async broadcast(update, seq) {
|
|
90
|
+
if (!this.channel)
|
|
91
|
+
return;
|
|
92
|
+
await this.channel.send({
|
|
93
|
+
type: 'broadcast',
|
|
94
|
+
event: 'yjs-update',
|
|
95
|
+
payload: {
|
|
96
|
+
sequence: seq,
|
|
97
|
+
update: Array.from(update),
|
|
98
|
+
clientId: this.yDoc.clientID,
|
|
99
|
+
timestamp: Date.now(),
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Disconnect from Realtime
|
|
105
|
+
*/
|
|
106
|
+
async disconnect() {
|
|
107
|
+
if (this.channel) {
|
|
108
|
+
await this.supabase.removeChannel(this.channel);
|
|
109
|
+
this.channel = null;
|
|
110
|
+
}
|
|
111
|
+
this.connected = false;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Access the Y.Doc for read operations
|
|
115
|
+
*/
|
|
116
|
+
getDoc() {
|
|
117
|
+
return this.yDoc;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check if Realtime is connected
|
|
121
|
+
*/
|
|
122
|
+
isConnected() {
|
|
123
|
+
return this.connected;
|
|
124
|
+
}
|
|
125
|
+
getProjectId() {
|
|
126
|
+
return this.projectId;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=YjsProjectSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"YjsProjectSession.js","sourceRoot":"","sources":["../../src/yjs/YjsProjectSession.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@develosaur/mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Develosaur MCP server — AI agents track development progress in real-time",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"develosaur-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
17
|
+
"@supabase/supabase-js": "^2.49.4",
|
|
18
|
+
"yjs": "^13.6.24"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"typescript": "^5.7.0",
|
|
22
|
+
"@types/node": "^22.0.0"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist",
|
|
26
|
+
"README.md"
|
|
27
|
+
],
|
|
28
|
+
"keywords": [
|
|
29
|
+
"mcp",
|
|
30
|
+
"develosaur",
|
|
31
|
+
"project-management",
|
|
32
|
+
"ai-agent",
|
|
33
|
+
"model-context-protocol"
|
|
34
|
+
],
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
}
|
|
39
|
+
}
|