@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.
Files changed (45) hide show
  1. package/dist/auth/ApiKeyAuth.d.ts +23 -0
  2. package/dist/auth/ApiKeyAuth.d.ts.map +1 -0
  3. package/dist/auth/ApiKeyAuth.js +119 -0
  4. package/dist/auth/ApiKeyAuth.js.map +1 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +23 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/server.d.ts +5 -0
  10. package/dist/server.d.ts.map +1 -0
  11. package/dist/server.js +252 -0
  12. package/dist/server.js.map +1 -0
  13. package/dist/tools/edges.d.ts +10 -0
  14. package/dist/tools/edges.d.ts.map +1 -0
  15. package/dist/tools/edges.js +58 -0
  16. package/dist/tools/edges.js.map +1 -0
  17. package/dist/tools/nodes.d.ts +26 -0
  18. package/dist/tools/nodes.d.ts.map +1 -0
  19. package/dist/tools/nodes.js +188 -0
  20. package/dist/tools/nodes.js.map +1 -0
  21. package/dist/tools/query.d.ts +27 -0
  22. package/dist/tools/query.d.ts.map +1 -0
  23. package/dist/tools/query.js +133 -0
  24. package/dist/tools/query.js.map +1 -0
  25. package/dist/types.d.ts +97 -0
  26. package/dist/types.d.ts.map +1 -0
  27. package/dist/types.js +6 -0
  28. package/dist/types.js.map +1 -0
  29. package/dist/utils/nodeDefaults.d.ts +14 -0
  30. package/dist/utils/nodeDefaults.d.ts.map +1 -0
  31. package/dist/utils/nodeDefaults.js +49 -0
  32. package/dist/utils/nodeDefaults.js.map +1 -0
  33. package/dist/utils/rateLimiter.d.ts +11 -0
  34. package/dist/utils/rateLimiter.d.ts.map +1 -0
  35. package/dist/utils/rateLimiter.js +32 -0
  36. package/dist/utils/rateLimiter.js.map +1 -0
  37. package/dist/yjs/BinaryEncoding.d.ts +7 -0
  38. package/dist/yjs/BinaryEncoding.d.ts.map +1 -0
  39. package/dist/yjs/BinaryEncoding.js +11 -0
  40. package/dist/yjs/BinaryEncoding.js.map +1 -0
  41. package/dist/yjs/YjsProjectSession.d.ts +45 -0
  42. package/dist/yjs/YjsProjectSession.d.ts.map +1 -0
  43. package/dist/yjs/YjsProjectSession.js +129 -0
  44. package/dist/yjs/YjsProjectSession.js.map +1 -0
  45. package/package.json +39 -0
@@ -0,0 +1,188 @@
1
+ import { buildNodeData, generateNodeId, buildEdgeId } from '../utils/nodeDefaults.js';
2
+ /**
3
+ * Create a single node in the Y.Doc
4
+ */
5
+ export async function createNode(session, params) {
6
+ const nodeData = buildNodeData(params);
7
+ const nodeId = nodeData.id;
8
+ const seq = await session.applyChange((doc) => {
9
+ const nodesMap = doc.getMap('nodes');
10
+ const edgesMap = doc.getMap('edges');
11
+ nodesMap.set(nodeId, nodeData);
12
+ if (params.parentId) {
13
+ const edgeId = buildEdgeId(params.parentId, nodeId);
14
+ edgesMap.set(edgeId, { id: edgeId, source: params.parentId, target: nodeId });
15
+ // Update parent's childIds
16
+ const parentData = nodesMap.get(params.parentId);
17
+ if (parentData) {
18
+ nodesMap.set(params.parentId, {
19
+ ...parentData,
20
+ relationships: {
21
+ ...parentData.relationships,
22
+ childIds: [...(parentData.relationships.childIds || []), nodeId],
23
+ },
24
+ });
25
+ }
26
+ }
27
+ });
28
+ return { nodeId, seq };
29
+ }
30
+ /**
31
+ * Update an existing node's properties (partial update)
32
+ */
33
+ export async function updateNode(session, nodeId, updates) {
34
+ return session.applyChange((doc) => {
35
+ const nodesMap = doc.getMap('nodes');
36
+ const existing = nodesMap.get(nodeId);
37
+ if (!existing)
38
+ throw new Error(`Node ${nodeId} not found`);
39
+ const updated = { ...existing };
40
+ if (updates.title !== undefined)
41
+ updated.title = updates.title;
42
+ if (updates.contentMarkdown !== undefined)
43
+ updated.contentMarkdown = updates.contentMarkdown;
44
+ if (updates.color !== undefined) {
45
+ updated.color = updates.color;
46
+ updated.useCustomColor = true;
47
+ }
48
+ if (updates.tags !== undefined)
49
+ updated.tags = updates.tags;
50
+ if (updates.vScore !== undefined)
51
+ updated.vScore = updates.vScore;
52
+ if (updates.eScore !== undefined)
53
+ updated.eScore = updates.eScore;
54
+ nodesMap.set(nodeId, updated);
55
+ });
56
+ }
57
+ /**
58
+ * Mark a node as completed
59
+ */
60
+ export async function completeNode(session, nodeId) {
61
+ return session.applyChange((doc) => {
62
+ const nodesMap = doc.getMap('nodes');
63
+ const existing = nodesMap.get(nodeId);
64
+ if (!existing)
65
+ throw new Error(`Node ${nodeId} not found`);
66
+ nodesMap.set(nodeId, {
67
+ ...existing,
68
+ completed: true,
69
+ completedAt: new Date().toISOString(),
70
+ heatInitial: 0,
71
+ });
72
+ });
73
+ }
74
+ /**
75
+ * Delete a node and all its descendants recursively
76
+ */
77
+ export async function deleteNode(session, nodeId) {
78
+ return session.applyChange((doc) => {
79
+ const nodesMap = doc.getMap('nodes');
80
+ const edgesMap = doc.getMap('edges');
81
+ // Collect all descendants
82
+ const toDelete = new Set();
83
+ function collectDescendants(id) {
84
+ toDelete.add(id);
85
+ const node = nodesMap.get(id);
86
+ if (node?.relationships?.childIds) {
87
+ for (const childId of node.relationships.childIds) {
88
+ collectDescendants(childId);
89
+ }
90
+ }
91
+ }
92
+ collectDescendants(nodeId);
93
+ // Remove edges that reference any deleted node
94
+ const allEdgeKeys = [];
95
+ edgesMap.forEach((_val, key) => allEdgeKeys.push(key));
96
+ for (const edgeKey of allEdgeKeys) {
97
+ const edge = edgesMap.get(edgeKey);
98
+ if (edge && (toDelete.has(edge.source) || toDelete.has(edge.target))) {
99
+ edgesMap.delete(edgeKey);
100
+ }
101
+ }
102
+ // Remove the target node from its parent's childIds
103
+ const targetNode = nodesMap.get(nodeId);
104
+ if (targetNode?.relationships?.parentId) {
105
+ const parentData = nodesMap.get(targetNode.relationships.parentId);
106
+ if (parentData) {
107
+ nodesMap.set(targetNode.relationships.parentId, {
108
+ ...parentData,
109
+ relationships: {
110
+ ...parentData.relationships,
111
+ childIds: (parentData.relationships.childIds || []).filter((id) => id !== nodeId),
112
+ },
113
+ });
114
+ }
115
+ }
116
+ // Delete all nodes
117
+ for (const id of toDelete) {
118
+ nodesMap.delete(id);
119
+ }
120
+ });
121
+ }
122
+ /**
123
+ * Batch create multiple nodes with temp_id references (atomic)
124
+ */
125
+ export async function batchCreateNodes(session, inputs) {
126
+ const tempToReal = new Map();
127
+ await session.applyChange((doc) => {
128
+ const nodesMap = doc.getMap('nodes');
129
+ const edgesMap = doc.getMap('edges');
130
+ const now = new Date().toISOString();
131
+ // Pass 1: Create all nodes and assign UUIDs
132
+ for (const input of inputs) {
133
+ const nodeId = generateNodeId();
134
+ tempToReal.set(input.temp_id, nodeId);
135
+ const parentId = input.parent_temp_id
136
+ ? tempToReal.get(input.parent_temp_id)
137
+ : input.parent_id;
138
+ const isTitle = input.type === 'title';
139
+ const nodeData = {
140
+ id: nodeId,
141
+ title: input.title,
142
+ contentMarkdown: input.content_markdown || '',
143
+ position: { x: 0, y: 0 },
144
+ dimensions: isTitle
145
+ ? { width: 736, height: 140 }
146
+ : { width: 636, height: 636 },
147
+ color: input.color || '#4299e1',
148
+ useCustomColor: !!input.color,
149
+ type: input.type || 'richtext',
150
+ relationships: { parentId, childIds: [] },
151
+ tags: input.tags || [],
152
+ pinnedTags: [],
153
+ createdAt: now,
154
+ completed: false,
155
+ vScore: input.v_score,
156
+ eScore: input.e_score ?? 5,
157
+ heatInitial: 0,
158
+ heatLastUpdated: now,
159
+ promotionLevel: 0,
160
+ manuallyPositioned: false,
161
+ };
162
+ nodesMap.set(nodeId, nodeData);
163
+ }
164
+ // Pass 2: Create edges and update parent childIds
165
+ for (const input of inputs) {
166
+ const nodeId = tempToReal.get(input.temp_id);
167
+ const parentId = input.parent_temp_id
168
+ ? tempToReal.get(input.parent_temp_id)
169
+ : input.parent_id;
170
+ if (parentId) {
171
+ const edgeId = buildEdgeId(parentId, nodeId);
172
+ edgesMap.set(edgeId, { id: edgeId, source: parentId, target: nodeId });
173
+ const parentData = nodesMap.get(parentId);
174
+ if (parentData) {
175
+ nodesMap.set(parentId, {
176
+ ...parentData,
177
+ relationships: {
178
+ ...parentData.relationships,
179
+ childIds: [...(parentData.relationships.childIds || []), nodeId],
180
+ },
181
+ });
182
+ }
183
+ }
184
+ }
185
+ });
186
+ return tempToReal;
187
+ }
188
+ //# sourceMappingURL=nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/tools/nodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { YjsProjectSession } from '../yjs/YjsProjectSession.js';
2
+ import type { SupabaseClient } from '@supabase/supabase-js';
3
+ import type { Tag } from '../types.js';
4
+ /**
5
+ * Get the project tree as an indented text outline
6
+ */
7
+ export declare function getTree(session: YjsProjectSession, options?: {
8
+ maxDepth?: number;
9
+ includeCompleted?: boolean;
10
+ }): string;
11
+ /**
12
+ * Get full details of a specific node
13
+ */
14
+ export declare function getNode(session: YjsProjectSession, nodeId: string): Record<string, any> | null;
15
+ /**
16
+ * Search nodes by title or content
17
+ */
18
+ export declare function findNodes(session: YjsProjectSession, options: {
19
+ query: string;
20
+ tag?: string;
21
+ completed?: boolean;
22
+ }): Array<Record<string, any>>;
23
+ /**
24
+ * List all tags for the current project (from project_tags table)
25
+ */
26
+ export declare function listTags(supabase: SupabaseClient, projectId: string): Promise<Tag[]>;
27
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAsB,GAAG,EAAE,MAAM,aAAa,CAAC;AAE3D;;GAEG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,MAAM,CAiDR;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CA8B5B;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5D,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAqC5B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,GAAG,EAAE,CAAC,CAmBhB"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Get the project tree as an indented text outline
3
+ */
4
+ export function getTree(session, options = {}) {
5
+ const doc = session.getDoc();
6
+ const nodesMap = doc.getMap('nodes');
7
+ // Collect all nodes
8
+ const nodes = new Map();
9
+ nodesMap.forEach((val, key) => {
10
+ nodes.set(key, val);
11
+ });
12
+ if (nodes.size === 0)
13
+ return '(empty project)';
14
+ // Find root nodes (no parent)
15
+ const roots = [];
16
+ for (const [id, node] of nodes) {
17
+ if (!node.relationships?.parentId) {
18
+ roots.push(id);
19
+ }
20
+ }
21
+ const lines = [];
22
+ function walk(nodeId, depth) {
23
+ if (options.maxDepth !== undefined && depth > options.maxDepth)
24
+ return;
25
+ const node = nodes.get(nodeId);
26
+ if (!node)
27
+ return;
28
+ if (node.completed && !options.includeCompleted)
29
+ return;
30
+ const indent = ' '.repeat(depth);
31
+ const status = node.completed ? '[x]' : '[ ]';
32
+ const tags = node.tags?.length ? ` {${node.tags.join(', ')}}` : '';
33
+ const vScore = node.vScore !== undefined ? ` [v:${node.vScore}]` : '';
34
+ lines.push(`${indent}${status} ${node.title}${tags}${vScore} (${nodeId.slice(0, 8)})`);
35
+ // Walk children
36
+ const childIds = node.relationships?.childIds || [];
37
+ for (const childId of childIds) {
38
+ walk(childId, depth + 1);
39
+ }
40
+ }
41
+ for (const rootId of roots) {
42
+ walk(rootId, 0);
43
+ }
44
+ return lines.join('\n') || '(no visible nodes)';
45
+ }
46
+ /**
47
+ * Get full details of a specific node
48
+ */
49
+ export function getNode(session, nodeId) {
50
+ const doc = session.getDoc();
51
+ const nodesMap = doc.getMap('nodes');
52
+ const node = nodesMap.get(nodeId);
53
+ if (!node)
54
+ return null;
55
+ // Get children details
56
+ const children = (node.relationships?.childIds || []).map((childId) => {
57
+ const child = nodesMap.get(childId);
58
+ return child
59
+ ? { id: childId, title: child.title, completed: !!child.completed }
60
+ : { id: childId, title: '(unknown)', completed: false };
61
+ });
62
+ return {
63
+ id: node.id,
64
+ title: node.title,
65
+ content_markdown: node.contentMarkdown || '',
66
+ type: node.type || 'richtext',
67
+ color: node.color,
68
+ completed: !!node.completed,
69
+ completed_at: node.completedAt || null,
70
+ created_at: node.createdAt || null,
71
+ tags: node.tags || [],
72
+ v_score: node.vScore ?? null,
73
+ e_score: node.eScore ?? 5,
74
+ parent_id: node.relationships?.parentId || null,
75
+ children,
76
+ };
77
+ }
78
+ /**
79
+ * Search nodes by title or content
80
+ */
81
+ export function findNodes(session, options) {
82
+ const doc = session.getDoc();
83
+ const nodesMap = doc.getMap('nodes');
84
+ const queryLower = options.query.toLowerCase();
85
+ const results = [];
86
+ nodesMap.forEach((val, key) => {
87
+ const node = val;
88
+ // Filter by completion status
89
+ if (options.completed !== undefined && !!node.completed !== options.completed) {
90
+ return;
91
+ }
92
+ // Filter by tag
93
+ if (options.tag && !(node.tags || []).includes(options.tag)) {
94
+ return;
95
+ }
96
+ // Search title and content
97
+ const titleMatch = node.title?.toLowerCase().includes(queryLower);
98
+ const contentMatch = node.contentMarkdown?.toLowerCase().includes(queryLower);
99
+ if (titleMatch || contentMatch) {
100
+ results.push({
101
+ id: node.id,
102
+ title: node.title,
103
+ completed: !!node.completed,
104
+ tags: node.tags || [],
105
+ parent_id: node.relationships?.parentId || null,
106
+ match_in: titleMatch ? 'title' : 'content',
107
+ });
108
+ }
109
+ });
110
+ return results;
111
+ }
112
+ /**
113
+ * List all tags for the current project (from project_tags table)
114
+ */
115
+ export async function listTags(supabase, projectId) {
116
+ const { data, error } = await supabase
117
+ .from('project_tags')
118
+ .select('*')
119
+ .eq('project_id', projectId);
120
+ if (error) {
121
+ throw new Error(`Failed to load tags: ${error.message}`);
122
+ }
123
+ return (data || []).map((row) => ({
124
+ id: row.tag_id || row.id,
125
+ name: row.name,
126
+ color: row.color,
127
+ scope: 'project',
128
+ projectId: row.project_id,
129
+ heatIndex: row.heat_index,
130
+ clearHeat: row.clear_heat,
131
+ }));
132
+ }
133
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Standalone type definitions for the MCP server.
3
+ * Duplicated from the web app to keep the package self-contained.
4
+ */
5
+ export interface NodeRelationships {
6
+ parentId?: string;
7
+ childIds: string[];
8
+ siblingIndex?: number;
9
+ active?: boolean;
10
+ }
11
+ export interface NodeData {
12
+ id: string;
13
+ title: string;
14
+ contentMarkdown?: string;
15
+ position: {
16
+ x: number;
17
+ y: number;
18
+ };
19
+ dimensions: {
20
+ width: number;
21
+ height: number;
22
+ };
23
+ color: string;
24
+ useCustomColor?: boolean;
25
+ inheritedColor?: string;
26
+ type?: 'tasks' | 'richtext' | 'deadline' | 'image' | 'title';
27
+ relationships: NodeRelationships;
28
+ completed?: boolean;
29
+ completedAt?: string;
30
+ createdAt?: string;
31
+ tags?: string[];
32
+ pinnedTags?: string[];
33
+ collapsed?: boolean;
34
+ manuallyPositioned?: boolean;
35
+ label?: string;
36
+ hierarchicalId?: string;
37
+ isHidden?: boolean;
38
+ isDocumentable?: boolean;
39
+ heatInitial?: number;
40
+ heatLastUpdated?: string;
41
+ vScore?: number;
42
+ eScore?: number;
43
+ blockedBy?: string[];
44
+ promotionLevel?: number;
45
+ }
46
+ export interface EdgeData {
47
+ id: string;
48
+ source: string;
49
+ target: string;
50
+ [key: string]: any;
51
+ }
52
+ export interface Tag {
53
+ id: string;
54
+ name: string;
55
+ color: string;
56
+ scope: 'global' | 'project';
57
+ isDefault?: boolean;
58
+ projectId?: string;
59
+ userId?: string;
60
+ heatIndex?: number;
61
+ clearHeat?: boolean;
62
+ }
63
+ export interface DevelosaurConfig {
64
+ project_id: string;
65
+ project_name: string;
66
+ api_key: string;
67
+ }
68
+ export interface AuthResult {
69
+ accessToken: string;
70
+ expiresIn: number;
71
+ expiresAt: number;
72
+ projectId: string;
73
+ projectName: string;
74
+ }
75
+ export interface CreateNodeParams {
76
+ title: string;
77
+ contentMarkdown?: string;
78
+ parentId?: string;
79
+ type?: 'tasks' | 'richtext' | 'deadline' | 'title';
80
+ color?: string;
81
+ tags?: string[];
82
+ vScore?: number;
83
+ eScore?: number;
84
+ }
85
+ export interface BatchNodeInput {
86
+ temp_id: string;
87
+ title: string;
88
+ content_markdown?: string;
89
+ parent_temp_id?: string;
90
+ parent_id?: string;
91
+ type?: 'tasks' | 'richtext' | 'deadline' | 'title';
92
+ color?: string;
93
+ tags?: string[];
94
+ v_score?: number;
95
+ e_score?: number;
96
+ }
97
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Standalone type definitions for the MCP server.
3
+ * Duplicated from the web app to keep the package self-contained.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,14 @@
1
+ import type { NodeData, CreateNodeParams } from '../types.js';
2
+ export declare const DEFAULT_NODE_DIMENSIONS: {
3
+ readonly width: 636;
4
+ readonly height: 636;
5
+ };
6
+ export declare const TITLE_NODE_DIMENSIONS: {
7
+ readonly width: number;
8
+ readonly height: 140;
9
+ };
10
+ export declare const DEFAULT_NODE_COLOR = "#4299e1";
11
+ export declare function generateNodeId(): string;
12
+ export declare function buildEdgeId(sourceId: string, targetId: string): string;
13
+ export declare function buildNodeData(params: CreateNodeParams): NodeData;
14
+ //# sourceMappingURL=nodeDefaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeDefaults.d.ts","sourceRoot":"","sources":["../../src/utils/nodeDefaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK9D,eAAO,MAAM,uBAAuB;;;CAG1B,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;CAGxB,CAAC;AAEX,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,QAAQ,CA8BhE"}
@@ -0,0 +1,49 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ // Match web app: A4_HEIGHT=900, A4_WIDTH = round(900 / 1.414) = 636
3
+ const A4_WIDTH = 636;
4
+ export const DEFAULT_NODE_DIMENSIONS = {
5
+ width: A4_WIDTH,
6
+ height: A4_WIDTH, // square by default
7
+ };
8
+ export const TITLE_NODE_DIMENSIONS = {
9
+ width: A4_WIDTH + 100,
10
+ height: 140,
11
+ };
12
+ export const DEFAULT_NODE_COLOR = '#4299e1';
13
+ export function generateNodeId() {
14
+ return randomUUID();
15
+ }
16
+ export function buildEdgeId(sourceId, targetId) {
17
+ return `${sourceId}|${targetId}`;
18
+ }
19
+ export function buildNodeData(params) {
20
+ const now = new Date().toISOString();
21
+ const isTitle = params.type === 'title';
22
+ return {
23
+ id: generateNodeId(),
24
+ title: params.title,
25
+ contentMarkdown: params.contentMarkdown || '',
26
+ position: { x: 0, y: 0 },
27
+ dimensions: isTitle
28
+ ? { ...TITLE_NODE_DIMENSIONS }
29
+ : { ...DEFAULT_NODE_DIMENSIONS },
30
+ color: params.color || DEFAULT_NODE_COLOR,
31
+ useCustomColor: !!params.color,
32
+ type: params.type || 'richtext',
33
+ relationships: {
34
+ parentId: params.parentId || undefined,
35
+ childIds: [],
36
+ },
37
+ tags: params.tags || [],
38
+ pinnedTags: [],
39
+ createdAt: now,
40
+ completed: false,
41
+ vScore: params.vScore,
42
+ eScore: params.eScore ?? 5,
43
+ heatInitial: 0,
44
+ heatLastUpdated: now,
45
+ promotionLevel: 0,
46
+ manuallyPositioned: false,
47
+ };
48
+ }
49
+ //# sourceMappingURL=nodeDefaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeDefaults.js","sourceRoot":"","sources":["../../src/utils/nodeDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,oEAAoE;AACpE,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,QAAQ,EAAE,oBAAoB;CAC9B,CAAC;AAEX,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,KAAK,EAAE,QAAQ,GAAG,GAAG;IACrB,MAAM,EAAE,GAAG;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAE5C,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,QAAgB;IAC5D,OAAO,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAwB;IACpD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;IAExC,OAAO;QACL,EAAE,EAAE,cAAc,EAAE;QACpB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,EAAE;QAC7C,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACxB,UAAU,EAAE,OAAO;YACjB,CAAC,CAAC,EAAE,GAAG,qBAAqB,EAAE;YAC9B,CAAC,CAAC,EAAE,GAAG,uBAAuB,EAAE;QAClC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,kBAAkB;QACzC,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,UAAU;QAC/B,aAAa,EAAE;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;YACtC,QAAQ,EAAE,EAAE;SACb;QACD,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;QACvB,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;QAC1B,WAAW,EAAE,CAAC;QACd,eAAe,EAAE,GAAG;QACpB,cAAc,EAAE,CAAC;QACjB,kBAAkB,EAAE,KAAK;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare class RateLimiter {
2
+ private opsThisSecond;
3
+ private opsThisHour;
4
+ private lastSecondReset;
5
+ private lastHourReset;
6
+ private readonly maxPerSecond;
7
+ private readonly maxPerHour;
8
+ constructor(maxPerSecond?: number, maxPerHour?: number);
9
+ check(): void;
10
+ }
11
+ //# sourceMappingURL=rateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimiter.d.ts","sourceRoot":"","sources":["../../src/utils/rateLimiter.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,aAAa,CAAc;IAEnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,YAAY,SAAK,EAAE,UAAU,SAAO;IAKhD,KAAK,IAAI,IAAI;CA4Bd"}
@@ -0,0 +1,32 @@
1
+ export class RateLimiter {
2
+ opsThisSecond = 0;
3
+ opsThisHour = 0;
4
+ lastSecondReset = Date.now();
5
+ lastHourReset = Date.now();
6
+ maxPerSecond;
7
+ maxPerHour;
8
+ constructor(maxPerSecond = 10, maxPerHour = 1000) {
9
+ this.maxPerSecond = maxPerSecond;
10
+ this.maxPerHour = maxPerHour;
11
+ }
12
+ check() {
13
+ const now = Date.now();
14
+ if (now - this.lastSecondReset > 1000) {
15
+ this.opsThisSecond = 0;
16
+ this.lastSecondReset = now;
17
+ }
18
+ if (now - this.lastHourReset > 3_600_000) {
19
+ this.opsThisHour = 0;
20
+ this.lastHourReset = now;
21
+ }
22
+ if (this.opsThisSecond >= this.maxPerSecond) {
23
+ throw new Error(`Rate limit exceeded: max ${this.maxPerSecond} operations/second. Wait a moment and retry.`);
24
+ }
25
+ if (this.opsThisHour >= this.maxPerHour) {
26
+ throw new Error(`Rate limit exceeded: max ${this.maxPerHour} operations/hour. Try again later.`);
27
+ }
28
+ this.opsThisSecond++;
29
+ this.opsThisHour++;
30
+ }
31
+ }
32
+ //# sourceMappingURL=rateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rateLimiter.js","sourceRoot":"","sources":["../../src/utils/rateLimiter.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACd,aAAa,GAAG,CAAC,CAAC;IAClB,WAAW,GAAG,CAAC,CAAC;IAChB,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAElB,YAAY,CAAS;IACrB,UAAU,CAAS;IAEpC,YAAY,YAAY,GAAG,EAAE,EAAE,UAAU,GAAG,IAAI;QAC9C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,IAAI,GAAG,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC;QAC7B,CAAC;QAED,IAAI,GAAG,GAAG,IAAI,CAAC,aAAa,GAAG,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,CAAC,YAAY,8CAA8C,CAC5F,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,CAAC,UAAU,oCAAoC,CAChF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Binary encoding for Node.js — uses Buffer for base64 conversion.
3
+ * Matches the web app's binaryEncoding.ts but simplified for server.
4
+ */
5
+ export declare function uint8ArrayToBase64(data: Uint8Array): string;
6
+ export declare function base64ToUint8Array(base64: string): Uint8Array;
7
+ //# sourceMappingURL=BinaryEncoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryEncoding.d.ts","sourceRoot":"","sources":["../../src/yjs/BinaryEncoding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAE7D"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Binary encoding for Node.js — uses Buffer for base64 conversion.
3
+ * Matches the web app's binaryEncoding.ts but simplified for server.
4
+ */
5
+ export function uint8ArrayToBase64(data) {
6
+ return Buffer.from(data).toString('base64');
7
+ }
8
+ export function base64ToUint8Array(base64) {
9
+ return new Uint8Array(Buffer.from(base64, 'base64'));
10
+ }
11
+ //# sourceMappingURL=BinaryEncoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryEncoding.js","sourceRoot":"","sources":["../../src/yjs/BinaryEncoding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvD,CAAC"}