@graphmemory/server 1.2.0 → 1.3.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 (92) hide show
  1. package/LICENSE +84 -12
  2. package/README.md +7 -1
  3. package/dist/api/index.js +147 -50
  4. package/dist/api/rest/index.js +35 -15
  5. package/dist/api/rest/tools.js +8 -1
  6. package/dist/api/tools/code/search-code.js +12 -9
  7. package/dist/api/tools/code/search-files.js +1 -1
  8. package/dist/api/tools/docs/cross-references.js +3 -2
  9. package/dist/api/tools/docs/explain-symbol.js +2 -1
  10. package/dist/api/tools/docs/find-examples.js +2 -1
  11. package/dist/api/tools/docs/search-files.js +1 -1
  12. package/dist/api/tools/docs/search-snippets.js +1 -1
  13. package/dist/api/tools/docs/search.js +5 -4
  14. package/dist/api/tools/file-index/search-all-files.js +1 -1
  15. package/dist/api/tools/knowledge/add-attachment.js +14 -3
  16. package/dist/api/tools/knowledge/remove-attachment.js +5 -1
  17. package/dist/api/tools/knowledge/search-notes.js +5 -4
  18. package/dist/api/tools/skills/add-attachment.js +14 -3
  19. package/dist/api/tools/skills/recall-skills.js +1 -1
  20. package/dist/api/tools/skills/remove-attachment.js +5 -1
  21. package/dist/api/tools/skills/search-skills.js +6 -5
  22. package/dist/api/tools/tasks/add-attachment.js +14 -3
  23. package/dist/api/tools/tasks/remove-attachment.js +5 -1
  24. package/dist/api/tools/tasks/search-tasks.js +5 -4
  25. package/dist/cli/index.js +61 -51
  26. package/dist/cli/indexer.js +60 -28
  27. package/dist/graphs/code.js +70 -7
  28. package/dist/graphs/docs.js +15 -2
  29. package/dist/graphs/file-index.js +17 -3
  30. package/dist/graphs/file-lang.js +1 -1
  31. package/dist/graphs/knowledge.js +20 -3
  32. package/dist/graphs/skill.js +23 -4
  33. package/dist/graphs/task.js +23 -4
  34. package/dist/lib/embedding-codec.js +65 -0
  35. package/dist/lib/jwt.js +4 -4
  36. package/dist/lib/multi-config.js +6 -1
  37. package/dist/lib/parsers/code.js +158 -31
  38. package/dist/lib/parsers/codeblock.js +11 -6
  39. package/dist/lib/parsers/docs.js +59 -31
  40. package/dist/lib/parsers/languages/registry.js +2 -2
  41. package/dist/lib/parsers/languages/typescript.js +195 -44
  42. package/dist/lib/project-manager.js +14 -10
  43. package/dist/lib/search/bm25.js +18 -1
  44. package/dist/lib/search/code.js +12 -3
  45. package/dist/ui/assets/NoteForm-aZX9f6-3.js +1 -0
  46. package/dist/ui/assets/SkillForm-KYa3o92l.js +1 -0
  47. package/dist/ui/assets/TaskForm-Bl5nkybO.js +1 -0
  48. package/dist/ui/assets/_articleId_-DjbCByxM.js +1 -0
  49. package/dist/ui/assets/_docId_-hdCDjclV.js +1 -0
  50. package/dist/ui/assets/_filePath_-CpG836v4.js +1 -0
  51. package/dist/ui/assets/_noteId_-C1enaQd1.js +1 -0
  52. package/dist/ui/assets/_skillId_-hPoCet7J.js +1 -0
  53. package/dist/ui/assets/_taskId_-DSB3dLVz.js +1 -0
  54. package/dist/ui/assets/_toolName_-3SmCfxZy.js +2 -0
  55. package/dist/ui/assets/api-BMnBjMMf.js +1 -0
  56. package/dist/ui/assets/api-BlFF6gX-.js +1 -0
  57. package/dist/ui/assets/api-CrGJOcaN.js +1 -0
  58. package/dist/ui/assets/api-DuX-0a_X.js +1 -0
  59. package/dist/ui/assets/attachments-CEQ-2nMo.js +1 -0
  60. package/dist/ui/assets/client-Bq88u7gN.js +1 -0
  61. package/dist/ui/assets/docs-CrXsRcOG.js +1 -0
  62. package/dist/ui/assets/edit-BYiy1FZy.js +1 -0
  63. package/dist/ui/assets/edit-TUIIpUMF.js +1 -0
  64. package/dist/ui/assets/edit-hc-ZWz3y.js +1 -0
  65. package/dist/ui/assets/esm-BWiKNcBW.js +1 -0
  66. package/dist/ui/assets/files-0bPg6NH9.js +1 -0
  67. package/dist/ui/assets/graph-DXGud_wF.js +1 -0
  68. package/dist/ui/assets/help-CEMQqZUR.js +891 -0
  69. package/dist/ui/assets/help-DJ52_fxN.js +1 -0
  70. package/dist/ui/assets/index-BCZDAYZi.js +2 -0
  71. package/dist/ui/assets/index-D6zSNtzo.css +1 -0
  72. package/dist/ui/assets/knowledge-DeygeGGH.js +1 -0
  73. package/dist/ui/assets/new-CpD7hOBA.js +1 -0
  74. package/dist/ui/assets/new-DHTg3Dqq.js +1 -0
  75. package/dist/ui/assets/new-s8c0M75X.js +1 -0
  76. package/dist/ui/assets/prompts-BgOmdxgM.js +295 -0
  77. package/dist/ui/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  78. package/dist/ui/assets/search-EpJhdP2a.js +1 -0
  79. package/dist/ui/assets/skill-y9pizyqE.js +1 -0
  80. package/dist/ui/assets/skills-Cga9iUZN.js +1 -0
  81. package/dist/ui/assets/tasks-CobouTKV.js +1 -0
  82. package/dist/ui/assets/tools-JxKH5BDF.js +1 -0
  83. package/dist/ui/assets/vendor-graph-BWpSgpMe.js +321 -0
  84. package/dist/ui/assets/vendor-markdown-CT8ZVEPu.js +50 -0
  85. package/dist/ui/assets/vendor-md-editor-DmWafJvr.js +44 -0
  86. package/dist/ui/assets/{index-kKd4mVrh.css → vendor-md-editor-HrwGbQou.css} +1 -1
  87. package/dist/ui/assets/vendor-mui-BPj7d3Sw.js +139 -0
  88. package/dist/ui/assets/vendor-mui-icons-B196sG3f.js +1 -0
  89. package/dist/ui/assets/vendor-react-CHUjhoxh.js +11 -0
  90. package/dist/ui/index.html +11 -3
  91. package/package.json +2 -2
  92. package/dist/ui/assets/index-0hRezICt.js +0 -1702
@@ -13,11 +13,46 @@ function getDocComment(node) {
13
13
  }
14
14
  return '';
15
15
  }
16
- /** Build a signature: first line of the node text (truncated to 200 chars). */
17
- function buildSignature(node) {
18
- const text = node.text ?? '';
19
- const firstLine = text.split('\n')[0].trim();
20
- return firstLine.length > 200 ? firstLine.slice(0, 200) + '…' : firstLine;
16
+ /** Collapse whitespace and truncate. */
17
+ function truncate(text, maxLen = 300) {
18
+ const collapsed = text.replace(/\s+/g, ' ').trim();
19
+ return collapsed.length > maxLen ? collapsed.slice(0, maxLen) + '' : collapsed;
20
+ }
21
+ /**
22
+ * Build signature by taking everything before the body node.
23
+ * For code (ASCII-dominated), byte offset ≈ char offset.
24
+ * Falls back to first line if no body found.
25
+ */
26
+ function buildSignature(outerNode, innerNode) {
27
+ const bodyNode = innerNode.childForFieldName('body');
28
+ const text = outerNode.text ?? '';
29
+ if (!bodyNode) {
30
+ // No body (type alias, ambient declaration, etc.) — use full text
31
+ return truncate(text);
32
+ }
33
+ // Slice text from outer start up to body start
34
+ const headerBytes = bodyNode.startIndex - outerNode.startIndex;
35
+ if (headerBytes > 0) {
36
+ return truncate(text.slice(0, headerBytes));
37
+ }
38
+ return truncate(text.split('\n')[0]);
39
+ }
40
+ /**
41
+ * Build signature for variable declarations.
42
+ * If value is arrow/function, strip the function body.
43
+ */
44
+ function buildVariableSignature(outerNode, declarator) {
45
+ const value = declarator.childForFieldName('value');
46
+ if (value) {
47
+ const valueBody = value.childForFieldName('body');
48
+ if (valueBody) {
49
+ const fullText = outerNode.text ?? '';
50
+ const bodyOffset = valueBody.startIndex - outerNode.startIndex;
51
+ if (bodyOffset > 0)
52
+ return truncate(fullText.slice(0, bodyOffset));
53
+ }
54
+ }
55
+ return truncate(outerNode.text ?? '');
21
56
  }
22
57
  /** Build the full body text for a symbol. Includes JSDoc + node text. */
23
58
  function buildBody(node, docComment) {
@@ -26,10 +61,6 @@ function buildBody(node, docComment) {
26
61
  }
27
62
  return node.text ?? '';
28
63
  }
29
- /** Build a signature: always use the code declaration, not JSDoc. */
30
- function buildFullSignature(node, _docComment) {
31
- return buildSignature(node);
32
- }
33
64
  /** Check if a node is inside an export_statement. */
34
65
  function isExported(node) {
35
66
  const parent = node.parent;
@@ -49,76 +80,171 @@ function startLine(node) {
49
80
  function endLine(node) {
50
81
  return (node.endPosition?.row ?? 0) + 1;
51
82
  }
83
+ /**
84
+ * Extract the base type name from a type node, handling generic types.
85
+ * `Foo` → "Foo", `Foo<T>` (generic_type) → "Foo"
86
+ */
87
+ function extractTypeName(node) {
88
+ if (node.type === 'identifier' || node.type === 'type_identifier') {
89
+ return node.text;
90
+ }
91
+ if (node.type === 'generic_type') {
92
+ const name = node.childForFieldName('name') ?? node.namedChildren?.[0];
93
+ if (name && (name.type === 'identifier' || name.type === 'type_identifier')) {
94
+ return name.text;
95
+ }
96
+ }
97
+ return null;
98
+ }
52
99
  // ---------------------------------------------------------------------------
53
100
  // Symbol extraction
54
101
  // ---------------------------------------------------------------------------
55
- function extractClassSymbol(node) {
56
- const outer = getOuterNode(node);
57
- const doc = getDocComment(outer);
58
- const name = node.childForFieldName('name')?.text ?? '';
59
- const body = node.childForFieldName('body');
60
- // Extract methods
102
+ /** Extract class members: methods, fields, getters/setters. */
103
+ function extractClassMembers(body) {
61
104
  const children = [];
62
- if (body) {
63
- for (const member of body.namedChildren) {
64
- if (member.type === 'method_definition') {
105
+ if (!body)
106
+ return children;
107
+ for (const member of body.namedChildren) {
108
+ switch (member.type) {
109
+ case 'method_definition':
110
+ case 'abstract_method_definition':
111
+ case 'abstract_method_signature': {
65
112
  const methodName = member.childForFieldName('name')?.text ?? '';
66
113
  if (!methodName)
67
114
  continue;
68
115
  const methodDoc = getDocComment(member);
69
116
  children.push({
70
117
  name: methodName,
71
- kind: 'method',
72
- signature: buildSignature(member),
118
+ kind: methodName === 'constructor' ? 'constructor' : 'method',
119
+ signature: buildSignature(member, member),
73
120
  docComment: methodDoc,
74
121
  body: buildBody(member, methodDoc),
75
122
  startLine: startLine(member),
76
123
  endLine: endLine(member),
77
124
  isExported: false,
78
125
  });
126
+ break;
127
+ }
128
+ case 'public_field_definition':
129
+ case 'property_definition': {
130
+ const fieldName = member.childForFieldName('name')?.text ?? '';
131
+ if (!fieldName)
132
+ continue;
133
+ const fieldDoc = getDocComment(member);
134
+ children.push({
135
+ name: fieldName,
136
+ kind: 'variable',
137
+ signature: truncate(member.text ?? ''),
138
+ docComment: fieldDoc,
139
+ body: buildBody(member, fieldDoc),
140
+ startLine: startLine(member),
141
+ endLine: endLine(member),
142
+ isExported: false,
143
+ });
144
+ break;
79
145
  }
80
146
  }
81
147
  }
148
+ return children;
149
+ }
150
+ function extractClassSymbol(node) {
151
+ const outer = getOuterNode(node);
152
+ const doc = getDocComment(outer);
153
+ const name = node.childForFieldName('name')?.text ?? '';
154
+ const body = node.childForFieldName('body');
155
+ const children = extractClassMembers(body);
82
156
  return {
83
157
  name,
84
158
  kind: 'class',
85
- signature: buildFullSignature(outer, doc),
159
+ signature: buildSignature(outer, node),
86
160
  docComment: doc,
87
161
  body: buildBody(outer, doc),
88
162
  startLine: startLine(outer),
89
163
  endLine: endLine(outer),
90
164
  isExported: isExported(node),
91
- children,
165
+ children: children.length > 0 ? children : undefined,
92
166
  };
93
167
  }
168
+ /** Extract nested named function declarations from a function body (1 level deep). */
169
+ function extractNestedFunctions(body) {
170
+ const nested = [];
171
+ if (!body || body.type !== 'statement_block')
172
+ return nested;
173
+ for (const stmt of body.namedChildren) {
174
+ if (stmt.type === 'function_declaration') {
175
+ const childName = stmt.childForFieldName('name')?.text;
176
+ if (!childName)
177
+ continue;
178
+ const childDoc = getDocComment(stmt);
179
+ nested.push({
180
+ name: childName,
181
+ kind: 'function',
182
+ signature: buildSignature(stmt, stmt),
183
+ docComment: childDoc,
184
+ body: buildBody(stmt, childDoc),
185
+ startLine: startLine(stmt),
186
+ endLine: endLine(stmt),
187
+ isExported: false,
188
+ });
189
+ }
190
+ }
191
+ return nested;
192
+ }
94
193
  function extractFunctionSymbol(node) {
95
194
  const outer = getOuterNode(node);
96
195
  const doc = getDocComment(outer);
97
196
  const name = node.childForFieldName('name')?.text ?? '';
197
+ const body = node.childForFieldName('body');
198
+ const children = extractNestedFunctions(body);
98
199
  return {
99
200
  name,
100
201
  kind: 'function',
101
- signature: buildFullSignature(outer, doc),
202
+ signature: buildSignature(outer, node),
102
203
  docComment: doc,
103
204
  body: buildBody(outer, doc),
104
205
  startLine: startLine(outer),
105
206
  endLine: endLine(outer),
106
207
  isExported: isExported(node),
208
+ children: children.length > 0 ? children : undefined,
107
209
  };
108
210
  }
109
211
  function extractInterfaceSymbol(node) {
110
212
  const outer = getOuterNode(node);
111
213
  const doc = getDocComment(outer);
112
214
  const name = node.childForFieldName('name')?.text ?? '';
215
+ // Extract interface members
216
+ const children = [];
217
+ const body = node.childForFieldName('body');
218
+ if (body) {
219
+ for (const member of body.namedChildren) {
220
+ if (member.type === 'property_signature' || member.type === 'method_signature') {
221
+ const memberName = member.childForFieldName('name')?.text ?? '';
222
+ if (!memberName)
223
+ continue;
224
+ const memberDoc = getDocComment(member);
225
+ children.push({
226
+ name: memberName,
227
+ kind: member.type === 'method_signature' ? 'method' : 'variable',
228
+ signature: truncate(member.text ?? ''),
229
+ docComment: memberDoc,
230
+ body: buildBody(member, memberDoc),
231
+ startLine: startLine(member),
232
+ endLine: endLine(member),
233
+ isExported: false,
234
+ });
235
+ }
236
+ }
237
+ }
113
238
  return {
114
239
  name,
115
240
  kind: 'interface',
116
- signature: buildFullSignature(outer, doc),
241
+ signature: buildSignature(outer, node),
117
242
  docComment: doc,
118
243
  body: buildBody(outer, doc),
119
244
  startLine: startLine(outer),
120
245
  endLine: endLine(outer),
121
246
  isExported: isExported(node),
247
+ children: children.length > 0 ? children : undefined,
122
248
  };
123
249
  }
124
250
  function extractTypeAliasSymbol(node) {
@@ -128,7 +254,7 @@ function extractTypeAliasSymbol(node) {
128
254
  return {
129
255
  name,
130
256
  kind: 'type',
131
- signature: buildFullSignature(outer, doc),
257
+ signature: truncate(outer.text ?? ''),
132
258
  docComment: doc,
133
259
  body: buildBody(outer, doc),
134
260
  startLine: startLine(outer),
@@ -143,7 +269,7 @@ function extractEnumSymbol(node) {
143
269
  return {
144
270
  name,
145
271
  kind: 'enum',
146
- signature: buildFullSignature(outer, doc),
272
+ signature: buildSignature(outer, node),
147
273
  docComment: doc,
148
274
  body: buildBody(outer, doc),
149
275
  startLine: startLine(outer),
@@ -155,7 +281,6 @@ function extractVariableSymbols(node, exported) {
155
281
  const outer = exported ? node.parent : node;
156
282
  const doc = getDocComment(outer);
157
283
  const symbols = [];
158
- // Find all variable_declarator children
159
284
  for (const child of node.namedChildren) {
160
285
  if (child.type === 'variable_declarator') {
161
286
  const name = child.childForFieldName('name')?.text ?? '';
@@ -163,15 +288,24 @@ function extractVariableSymbols(node, exported) {
163
288
  continue;
164
289
  const value = child.childForFieldName('value');
165
290
  const isArrow = value?.type === 'arrow_function' || value?.type === 'function_expression';
291
+ // Extract nested named functions from arrow/function body
292
+ let children;
293
+ if (isArrow && value) {
294
+ const fnBody = value.childForFieldName('body');
295
+ const nested = extractNestedFunctions(fnBody);
296
+ if (nested.length > 0)
297
+ children = nested;
298
+ }
166
299
  symbols.push({
167
300
  name,
168
301
  kind: isArrow ? 'function' : 'variable',
169
- signature: buildFullSignature(outer, doc),
302
+ signature: buildVariableSignature(outer, child),
170
303
  docComment: doc,
171
304
  body: buildBody(outer, doc),
172
305
  startLine: startLine(outer),
173
306
  endLine: endLine(outer),
174
307
  isExported: exported,
308
+ children,
175
309
  });
176
310
  }
177
311
  }
@@ -182,13 +316,15 @@ function extractVariableSymbols(node, exported) {
182
316
  // ---------------------------------------------------------------------------
183
317
  function processTopLevel(node) {
184
318
  switch (node.type) {
185
- case 'function_declaration': {
319
+ case 'function_declaration':
320
+ case 'function_signature': {
186
321
  const name = node.childForFieldName('name')?.text;
187
322
  if (!name)
188
323
  return [];
189
324
  return [extractFunctionSymbol(node)];
190
325
  }
191
- case 'class_declaration': {
326
+ case 'class_declaration':
327
+ case 'abstract_class_declaration': {
192
328
  const name = node.childForFieldName('name')?.text;
193
329
  if (!name)
194
330
  return [];
@@ -218,6 +354,17 @@ function processTopLevel(node) {
218
354
  }
219
355
  return [];
220
356
  }
357
+ case 'ambient_declaration': {
358
+ // declare function/class/interface/etc — unwrap and process inner declaration
359
+ for (const child of node.namedChildren) {
360
+ if (child.type === 'comment')
361
+ continue;
362
+ const results = processTopLevel(child);
363
+ if (results.length > 0)
364
+ return results;
365
+ }
366
+ return [];
367
+ }
221
368
  default:
222
369
  return [];
223
370
  }
@@ -233,27 +380,27 @@ const typescriptMapper = {
233
380
  extractEdges(rootNode) {
234
381
  const edges = [];
235
382
  function findClasses(node) {
236
- if (node.type === 'class_declaration') {
383
+ if (node.type === 'class_declaration' || node.type === 'abstract_class_declaration') {
237
384
  const className = node.childForFieldName('name')?.text;
238
385
  if (!className)
239
386
  return;
240
- // Look for class_heritage
241
387
  for (const child of node.namedChildren) {
242
388
  if (child.type === 'class_heritage') {
243
389
  for (const clause of child.namedChildren) {
244
390
  if (clause.type === 'extends_clause') {
245
- // First named child is the base class
246
391
  for (const c of clause.namedChildren) {
247
- if (c.type === 'identifier' || c.type === 'type_identifier') {
248
- edges.push({ fromName: className, toName: c.text, kind: 'extends' });
249
- break;
392
+ const typeName = extractTypeName(c);
393
+ if (typeName) {
394
+ edges.push({ fromName: className, toName: typeName, kind: 'extends' });
395
+ break; // Only one base class
250
396
  }
251
397
  }
252
398
  }
253
399
  if (clause.type === 'implements_clause') {
254
400
  for (const c of clause.namedChildren) {
255
- if (c.type === 'type_identifier' || c.type === 'identifier') {
256
- edges.push({ fromName: className, toName: c.text, kind: 'implements' });
401
+ const typeName = extractTypeName(c);
402
+ if (typeName) {
403
+ edges.push({ fromName: className, toName: typeName, kind: 'implements' });
257
404
  }
258
405
  }
259
406
  }
@@ -271,14 +418,20 @@ const typescriptMapper = {
271
418
  extractImports(rootNode) {
272
419
  const imports = [];
273
420
  for (const child of rootNode.children) {
421
+ // import statements
274
422
  if (child.type === 'import_statement') {
275
423
  const source = child.childForFieldName('source');
276
424
  if (source) {
277
- // Remove quotes from string literal
278
425
  const specifier = source.text.replace(/^['"]|['"]$/g, '');
279
- if (specifier.startsWith('./') || specifier.startsWith('../')) {
280
- imports.push({ specifier });
281
- }
426
+ imports.push({ specifier });
427
+ }
428
+ }
429
+ // Re-exports: export { ... } from '...' and export * from '...'
430
+ if (child.type === 'export_statement') {
431
+ const source = child.childForFieldName('source');
432
+ if (source) {
433
+ const specifier = source.text.replace(/^['"]|['"]$/g, '');
434
+ imports.push({ specifier });
282
435
  }
283
436
  }
284
437
  }
@@ -293,10 +446,8 @@ function registerTypescript() {
293
446
  if (_registered)
294
447
  return;
295
448
  _registered = true;
296
- // TypeScript and TSX share the same mapper
297
449
  (0, registry_1.registerLanguage)('typescript', 'tree-sitter-typescript.wasm', typescriptMapper);
298
450
  (0, registry_1.registerLanguage)('tsx', 'tree-sitter-tsx.wasm', typescriptMapper);
299
- // JavaScript and JSX use the same mapper (TS is a superset)
300
451
  (0, registry_1.registerLanguage)('javascript', 'tree-sitter-javascript.wasm', typescriptMapper);
301
452
  (0, registry_1.registerLanguage)('jsx', 'tree-sitter-javascript.wasm', typescriptMapper);
302
453
  }
@@ -287,17 +287,21 @@ class ProjectManager extends events_1.EventEmitter {
287
287
  this.saveProject(instance);
288
288
  instance.dirty = false;
289
289
  // Scan and watch .notes/ and .tasks/ for reverse import (skip for workspace projects — handled by workspace)
290
+ // Skip mirror entirely if knowledge or tasks graph is readonly (mirror requires both)
290
291
  if (instance.mirrorTracker && !instance.workspaceId && instance.knowledgeManager && instance.taskManager) {
291
- const mirrorConfig = {
292
- projectDir: instance.config.projectDir,
293
- knowledgeManager: instance.knowledgeManager,
294
- taskManager: instance.taskManager,
295
- skillManager: instance.skillManager,
296
- mutationQueue: instance.mutationQueue,
297
- tracker: instance.mirrorTracker,
298
- };
299
- await (0, mirror_watcher_1.scanMirrorDirs)(mirrorConfig);
300
- instance.mirrorWatcher = (0, mirror_watcher_1.startMirrorWatcher)(mirrorConfig);
292
+ const gc = instance.config.graphConfigs;
293
+ if (!gc.knowledge.readonly && !gc.tasks.readonly) {
294
+ const mirrorConfig = {
295
+ projectDir: instance.config.projectDir,
296
+ knowledgeManager: instance.knowledgeManager,
297
+ taskManager: instance.taskManager,
298
+ skillManager: gc.skills.readonly ? undefined : instance.skillManager,
299
+ mutationQueue: instance.mutationQueue,
300
+ tracker: instance.mirrorTracker,
301
+ };
302
+ await (0, mirror_watcher_1.scanMirrorDirs)(mirrorConfig);
303
+ instance.mirrorWatcher = (0, mirror_watcher_1.startMirrorWatcher)(mirrorConfig);
304
+ }
301
305
  }
302
306
  this.emit('project:indexed', { projectId: id });
303
307
  process.stderr.write(`[project-manager] Project "${id}" indexed\n`);
@@ -15,6 +15,23 @@ exports.rrfFuse = rrfFuse;
15
15
  * "getUserById" → ["get", "user", "by", "id"]
16
16
  * "JWT tokens" → ["jwt", "tokens"]
17
17
  */
18
+ /**
19
+ * Minimal stop words for code/doc search.
20
+ * Only articles, conjunctions, prepositions, and pronouns — words that never
21
+ * carry meaning in code search. Excludes programming-significant words like
22
+ * `for`, `do`, `if`, `not`, `is`, `has`, `all`, `can`, `no`.
23
+ */
24
+ const STOP_WORDS = new Set([
25
+ 'a', 'an', 'the', // articles
26
+ 'and', 'or', 'but', 'nor', // conjunctions
27
+ 'of', 'with', 'by', 'from', 'as', 'at', 'on', 'in', 'to', 'into', 'onto', // prepositions
28
+ 'it', 'its', 'he', 'she', 'we', 'they', 'i', 'me', // pronouns
29
+ 'my', 'you', 'your', 'his', 'her', 'our', 'their', // possessives
30
+ 'this', 'that', 'these', 'those', // demonstratives
31
+ 'been', 'being', 'were', 'was', 'are', // be-forms (but not 'be', 'is')
32
+ 'would', 'could', 'should', 'shall', 'might', // modals (but not 'can', 'may', 'will', 'do')
33
+ 'than', 'such', 'very', 'just', 'also', 'about', // fillers
34
+ ]);
18
35
  function tokenize(text) {
19
36
  if (!text)
20
37
  return [];
@@ -24,7 +41,7 @@ function tokenize(text) {
24
41
  .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2') // XMLParser → XML Parser
25
42
  .split(/[^a-zA-Z0-9]+/)
26
43
  .map(t => t.toLowerCase())
27
- .filter(t => t.length > 0);
44
+ .filter(t => t.length > 0 && !STOP_WORDS.has(t));
28
45
  return parts;
29
46
  }
30
47
  // ---------------------------------------------------------------------------
@@ -12,7 +12,7 @@ const bm25_1 = require("../../lib/search/bm25");
12
12
  * 4. De-duplicate, re-filter, sort, cap at `maxResults`.
13
13
  */
14
14
  function searchCode(graph, queryEmbedding, options = {}) {
15
- const { topK = 5, bfsDepth = 1, maxResults = 20, minScore = 0.5, bfsDecay = 0.8, queryText, bm25Index, searchMode = 'hybrid', rrfK = 60 } = options;
15
+ const { topK = 5, bfsDepth = 1, maxResults = 20, minScore = 0.3, bfsDecay = 0.8, includeBody = false, queryText, bm25Index, searchMode = 'hybrid', rrfK = 60 } = options;
16
16
  const useVector = searchMode !== 'keyword';
17
17
  const useBm25 = searchMode !== 'vector' && !!queryText && !!bm25Index;
18
18
  // --- 1. Score all nodes ---
@@ -74,8 +74,14 @@ function searchCode(graph, queryEmbedding, options = {}) {
74
74
  if (item.score * bfsDecay < minS)
75
75
  continue;
76
76
  const nextScore = item.score * bfsDecay;
77
+ // Follow all outgoing edges (contains, imports, extends, implements)
77
78
  graph.outNeighbors(item.id).forEach(n => queue.push({ id: n, depth: item.depth + 1, score: nextScore }));
78
- graph.inNeighbors(item.id).forEach(n => queue.push({ id: n, depth: item.depth + 1, score: nextScore }));
79
+ // Follow incoming edges, but NOT reverse imports (avoids noise from popular utility files)
80
+ graph.forEachInEdge(item.id, (_edge, attrs, source) => {
81
+ if (attrs.kind !== 'imports') {
82
+ queue.push({ id: source, depth: item.depth + 1, score: nextScore });
83
+ }
84
+ });
79
85
  }
80
86
  }
81
87
  for (const seed of seeds) {
@@ -86,7 +92,7 @@ function searchCode(graph, queryEmbedding, options = {}) {
86
92
  .filter(([, score]) => score >= minS)
87
93
  .map(([id, score]) => {
88
94
  const attrs = graph.getNodeAttributes(id);
89
- return {
95
+ const result = {
90
96
  id,
91
97
  fileId: attrs.fileId,
92
98
  kind: attrs.kind,
@@ -97,6 +103,9 @@ function searchCode(graph, queryEmbedding, options = {}) {
97
103
  endLine: attrs.endLine,
98
104
  score,
99
105
  };
106
+ if (includeBody)
107
+ result.body = attrs.body;
108
+ return result;
100
109
  })
101
110
  .sort((a, b) => b.score - a.score)
102
111
  .slice(0, maxResults);
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{Y as r,nt as i,q as a,r as o}from"./vendor-mui-BPj7d3Sw.js";import{D as s,E as c,I as l,O as u,P as d,S as f}from"./index-BCZDAYZi.js";var p=e(n(),1),m=t();function h({note:e,onSubmit:t,onCancel:n,submitLabel:h=`Save`}){let[g,_]=(0,p.useState)(``),[v,y]=(0,p.useState)(``),[b,x]=(0,p.useState)([]),[S,C]=(0,p.useState)(!1),[w,T]=(0,p.useState)(!1);(0,p.useEffect)(()=>{e&&(_(e.title),y(e.content),x(e.tags??[]))},[e]);let E=async()=>{if(!g.trim()){T(!0);return}C(!0);try{await t({title:g.trim(),content:v.trim(),tags:b})}finally{C(!1)}};return(0,m.jsxs)(r,{component:`form`,id:`note-form`,onSubmit:e=>{e.preventDefault(),E()},sx:{display:`flex`,flexDirection:`column`,gap:3},children:[(0,m.jsx)(l,{title:`Details`,children:(0,m.jsxs)(u,{children:[(0,m.jsxs)(s,{fullWidth:!0,children:[(0,m.jsx)(c,{required:!0,children:`Title`}),(0,m.jsx)(o,{autoFocus:!0,fullWidth:!0,value:g,onChange:e=>{_(e.target.value),T(!1)},error:w,helperText:w?`Title is required`:void 0})]}),(0,m.jsxs)(s,{fullWidth:!0,children:[(0,m.jsx)(c,{children:`Content`}),(0,m.jsx)(f,{value:v,onChange:y,height:300})]}),(0,m.jsx)(s,{fullWidth:!0,children:(0,m.jsx)(d,{tags:b,editable:!0,onAdd:e=>x(t=>t.includes(e)?t:[...t,e]),onRemove:e=>x(t=>t.filter(t=>t!==e))})})]})}),(0,m.jsxs)(r,{sx:{display:`flex`,gap:1,justifyContent:`flex-end`},children:[(0,m.jsx)(a,{onClick:n,children:`Cancel`}),(0,m.jsx)(a,{variant:`contained`,onClick:E,disabled:S||!g.trim(),children:S?(0,m.jsx)(i,{size:20}):h})]})]})}export{h as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{$ as r,Y as i,_ as a,nt as o,q as s,r as c,tt as l,v as u,y as d}from"./vendor-mui-BPj7d3Sw.js";import{K as f,i as p}from"./vendor-mui-icons-B196sG3f.js";import{D as m,E as h,I as g,O as _,P as v,S as y}from"./index-BCZDAYZi.js";var b=e(n(),1),x=t();function S({skill:e,onSubmit:t,onCancel:n,submitLabel:S=`Save`}){let[C,w]=(0,b.useState)(``),[T,E]=(0,b.useState)(``),[D,O]=(0,b.useState)([``]),[k,A]=(0,b.useState)([]),[j,M]=(0,b.useState)([]),[N,P]=(0,b.useState)([]),[F,I]=(0,b.useState)([]),[L,R]=(0,b.useState)(`user`),[z,B]=(0,b.useState)(1),[V,H]=(0,b.useState)(!1),[U,W]=(0,b.useState)(!1);(0,b.useEffect)(()=>{e&&(w(e.title),E(e.description),O(e.steps.length>0?e.steps:[``]),A(e.triggers??[]),M(e.inputHints??[]),P(e.filePatterns??[]),I(e.tags??[]),R(e.source),B(e.confidence))},[e]);let G=async()=>{if(!C.trim()){W(!0);return}H(!0);try{await t({title:C.trim(),description:T.trim(),steps:D.map(e=>e.trim()).filter(Boolean),triggers:k,inputHints:j,filePatterns:N,tags:F,source:L,confidence:z})}finally{H(!1)}},K=(e,t)=>{O(n=>n.map((n,r)=>r===e?t:n))},q=()=>{O(e=>[...e,``])},J=e=>{O(t=>t.filter((t,n)=>n!==e))};return(0,x.jsxs)(i,{component:`form`,id:`skill-form`,onSubmit:e=>{e.preventDefault(),G()},sx:{display:`flex`,flexDirection:`column`,gap:3},children:[(0,x.jsx)(g,{title:`Details`,children:(0,x.jsxs)(_,{children:[(0,x.jsxs)(m,{fullWidth:!0,children:[(0,x.jsx)(h,{required:!0,children:`Title`}),(0,x.jsx)(c,{autoFocus:!0,fullWidth:!0,value:C,onChange:e=>{w(e.target.value),W(!1)},error:U,helperText:U?`Title is required`:void 0})]}),(0,x.jsxs)(m,{fullWidth:!0,children:[(0,x.jsx)(h,{children:`Description`}),(0,x.jsx)(y,{value:T,onChange:E,height:200})]})]})}),(0,x.jsx)(g,{title:`Steps`,children:(0,x.jsxs)(i,{sx:{display:`flex`,flexDirection:`column`,gap:1},children:[D.map((e,t)=>(0,x.jsxs)(i,{sx:{display:`flex`,gap:1,alignItems:`center`},children:[(0,x.jsxs)(r,{variant:`body2`,sx:{minWidth:24,color:`text.secondary`},children:[t+1,`.`]}),(0,x.jsx)(c,{fullWidth:!0,size:`small`,value:e,onChange:e=>K(t,e.target.value),placeholder:`Step ${t+1}`}),D.length>1&&(0,x.jsx)(l,{size:`small`,onClick:()=>J(t),color:`error`,children:(0,x.jsx)(p,{fontSize:`small`})})]},t)),(0,x.jsx)(s,{size:`small`,startIcon:(0,x.jsx)(f,{}),onClick:q,sx:{alignSelf:`flex-start`},children:`Add Step`})]})}),(0,x.jsx)(g,{title:`Matching`,children:(0,x.jsxs)(_,{children:[(0,x.jsxs)(m,{fullWidth:!0,children:[(0,x.jsx)(h,{children:`Triggers`}),(0,x.jsx)(v,{tags:k,editable:!0,onAdd:e=>A(t=>t.includes(e)?t:[...t,e]),onRemove:e=>A(t=>t.filter(t=>t!==e))})]}),(0,x.jsxs)(m,{fullWidth:!0,children:[(0,x.jsx)(h,{children:`Input Hints`}),(0,x.jsx)(v,{tags:j,editable:!0,onAdd:e=>M(t=>t.includes(e)?t:[...t,e]),onRemove:e=>M(t=>t.filter(t=>t!==e))})]}),(0,x.jsxs)(m,{fullWidth:!0,children:[(0,x.jsx)(h,{children:`File Patterns`}),(0,x.jsx)(v,{tags:N,editable:!0,onAdd:e=>P(t=>t.includes(e)?t:[...t,e]),onRemove:e=>P(t=>t.filter(t=>t!==e))})]})]})}),(0,x.jsx)(g,{title:`Properties`,children:(0,x.jsxs)(_,{children:[(0,x.jsxs)(m,{children:[(0,x.jsx)(h,{children:`Source`}),(0,x.jsxs)(u,{fullWidth:!0,value:L,onChange:e=>R(e.target.value),children:[(0,x.jsx)(d,{value:`user`,children:`User`}),(0,x.jsx)(d,{value:`learned`,children:`Learned`})]})]}),(0,x.jsx)(m,{children:(0,x.jsxs)(i,{sx:{px:1},children:[(0,x.jsxs)(h,{children:[`Confidence: `,Math.round(z*100),`%`]}),(0,x.jsx)(a,{value:z,onChange:(e,t)=>B(t),min:0,max:1,step:.01,valueLabelDisplay:`auto`,valueLabelFormat:e=>`${Math.round(e*100)}%`})]})}),(0,x.jsx)(m,{fullWidth:!0,children:(0,x.jsx)(v,{tags:F,editable:!0,onAdd:e=>I(t=>t.includes(e)?t:[...t,e]),onRemove:e=>I(t=>t.filter(t=>t!==e))})})]})}),(0,x.jsxs)(i,{sx:{display:`flex`,gap:1,justifyContent:`flex-end`},children:[(0,x.jsx)(s,{onClick:n,children:`Cancel`}),(0,x.jsx)(s,{variant:`contained`,onClick:G,disabled:V||!C.trim(),children:V?(0,x.jsx)(o,{size:20}):S})]})]})}export{S as t};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{l as r}from"./vendor-react-CHUjhoxh.js";import{Y as i,nt as a,q as o,r as s,v as c,y as l}from"./vendor-mui-BPj7d3Sw.js";import{D as u,E as d,I as f,O as p,P as m,S as h,et as g,t as _}from"./index-BCZDAYZi.js";var v=e(n(),1),y=t();function b({task:e,onSubmit:t,onCancel:n,submitLabel:b=`Save`}){let{projectId:x}=r(),[S,C]=(0,v.useState)(``),[w,T]=(0,v.useState)(``),[E,D]=(0,v.useState)(`todo`),[O,k]=(0,v.useState)(`medium`),[A,j]=(0,v.useState)([]),[M,N]=(0,v.useState)(``),[P,F]=(0,v.useState)(``),[I,L]=(0,v.useState)(``),[R,z]=(0,v.useState)([]),[B,V]=(0,v.useState)(!1),[H,U]=(0,v.useState)(!1);(0,v.useEffect)(()=>{e&&(C(e.title),T(e.description),D(e.status),k(e.priority),j(e.tags??[]),N(e.dueDate?new Date(e.dueDate).toISOString().split(`T`)[0]:``),F(e.estimate==null?``:String(e.estimate)),L(e.assignee??``))},[e]),(0,v.useEffect)(()=>{x&&g(x).then(z).catch(()=>{})},[x]);let W=async()=>{if(!S.trim()){U(!0);return}V(!0);try{await t({title:S.trim(),description:w.trim(),status:E,priority:O,tags:A,dueDate:M?new Date(M).getTime():null,estimate:P?Number(P):null,assignee:I||null})}finally{V(!1)}};return(0,y.jsxs)(i,{component:`form`,id:`task-form`,onSubmit:e=>{e.preventDefault(),W()},sx:{display:`flex`,flexDirection:`column`,gap:3},children:[(0,y.jsx)(f,{title:`Details`,children:(0,y.jsxs)(p,{children:[(0,y.jsxs)(u,{fullWidth:!0,children:[(0,y.jsx)(d,{required:!0,children:`Title`}),(0,y.jsx)(s,{autoFocus:!0,fullWidth:!0,value:S,onChange:e=>{C(e.target.value),U(!1)},error:H,helperText:H?`Title is required`:void 0})]}),(0,y.jsxs)(u,{fullWidth:!0,children:[(0,y.jsx)(d,{children:`Description`}),(0,y.jsx)(h,{value:w,onChange:T,height:250})]})]})}),(0,y.jsx)(f,{title:`Properties`,children:(0,y.jsxs)(p,{children:[(0,y.jsxs)(u,{children:[(0,y.jsx)(d,{children:`Status`}),(0,y.jsx)(c,{fullWidth:!0,value:E,onChange:e=>D(e.target.value),children:_.map(e=>(0,y.jsx)(l,{value:e.status,children:e.label},e.status))})]}),(0,y.jsxs)(u,{children:[(0,y.jsx)(d,{children:`Priority`}),(0,y.jsxs)(c,{fullWidth:!0,value:O,onChange:e=>k(e.target.value),children:[(0,y.jsx)(l,{value:`critical`,children:`Critical`}),(0,y.jsx)(l,{value:`high`,children:`High`}),(0,y.jsx)(l,{value:`medium`,children:`Medium`}),(0,y.jsx)(l,{value:`low`,children:`Low`})]})]}),(0,y.jsxs)(u,{children:[(0,y.jsx)(d,{children:`Due Date`}),(0,y.jsx)(s,{fullWidth:!0,type:`date`,value:M,onChange:e=>N(e.target.value)})]}),(0,y.jsxs)(u,{children:[(0,y.jsx)(d,{children:`Estimate (hours)`}),(0,y.jsx)(s,{fullWidth:!0,type:`number`,value:P,onChange:e=>F(e.target.value),slotProps:{input:{inputProps:{min:0,step:.5}}}})]}),(0,y.jsxs)(u,{children:[(0,y.jsx)(d,{children:`Assignee`}),(0,y.jsxs)(c,{fullWidth:!0,value:I,onChange:e=>L(e.target.value),displayEmpty:!0,renderValue:e=>e?R.find(t=>t.id===e)?.name||e:`Unassigned`,children:[(0,y.jsx)(l,{value:``,children:`Unassigned`}),R.map(e=>(0,y.jsx)(l,{value:e.id,children:e.name||e.id},e.id))]})]}),(0,y.jsx)(u,{fullWidth:!0,children:(0,y.jsx)(m,{tags:A,editable:!0,onAdd:e=>j(t=>t.includes(e)?t:[...t,e]),onRemove:e=>j(t=>t.filter(t=>t!==e))})})]})}),(0,y.jsxs)(i,{sx:{display:`flex`,gap:1,justifyContent:`flex-end`},children:[(0,y.jsx)(o,{onClick:n,children:`Cancel`}),(0,y.jsx)(o,{variant:`contained`,onClick:W,disabled:B||!S.trim(),children:B?(0,y.jsx)(a,{size:20}):b})]})]})}export{b as t};
@@ -0,0 +1 @@
1
+ import{D as e}from"./vendor-markdown-CT8ZVEPu.js";import{c as t,l as n}from"./vendor-react-CHUjhoxh.js";import{$ as r,X as i,Y as a,ut as o}from"./vendor-mui-BPj7d3Sw.js";import"./vendor-md-editor-DmWafJvr.js";import{nt as s,tt as c}from"./vendor-mui-icons-B196sG3f.js";import{C as l,F as u,I as d,T as f,j as p}from"./index-BCZDAYZi.js";import{t as m}from"./help-CEMQqZUR.js";var h=e(),g={overview:`primary`,concept:`warning`,guide:`success`};function _(){let{projectId:e,articleId:_}=n(),v=t(),{palette:y}=o(),b=_?m(_):void 0;return b?(0,h.jsxs)(a,{children:[(0,h.jsx)(p,{breadcrumbs:[{label:`Help`,to:`/${e}/help`},{label:b.title}]}),(0,h.jsxs)(a,{sx:{display:`flex`,flexDirection:`column`,gap:2},children:[(0,h.jsxs)(a,{sx:{display:`flex`,alignItems:`center`,gap:1.5,mb:1},children:[(0,h.jsx)(u,{label:b.category===`overview`?`Overview`:b.category===`concept`?`Concept`:`Guide`,color:g[b.category]||`primary`}),(0,h.jsx)(r,{variant:`body2`,sx:{color:y.custom.textMuted},children:b.summary})]}),(0,h.jsx)(d,{title:`Article`,children:(0,h.jsx)(l,{children:b.content})}),b.relatedTools.length>0&&(0,h.jsx)(d,{title:`Related Tools`,children:(0,h.jsx)(a,{sx:{display:`flex`,flexWrap:`wrap`,gap:1},children:b.relatedTools.map(t=>(0,h.jsx)(i,{icon:(0,h.jsx)(s,{}),label:t,size:`small`,variant:`outlined`,clickable:!0,onClick:()=>v(`/${e}/tools/${t}`),sx:{fontFamily:`monospace`}},t))})})]})]}):(0,h.jsxs)(a,{children:[(0,h.jsx)(p,{breadcrumbs:[{label:`Help`,to:`/${e}/help`},{label:`Not Found`}]}),(0,h.jsx)(f,{icon:(0,h.jsx)(c,{}),title:`Article not found`})]})}export{_ as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{c as r,l as i}from"./vendor-react-CHUjhoxh.js";import{$ as a,D as o,E as s,O as c,S as l,Y as u,et as d,nt as f,ut as p}from"./vendor-mui-BPj7d3Sw.js";import"./vendor-md-editor-DmWafJvr.js";import{I as m,N as h,P as g,j as _,k as v}from"./index-BCZDAYZi.js";import{n as y,t as b}from"./api-BlFF6gX-.js";var x=e(n(),1),S=t();function C(){let{projectId:e,docId:t}=i(),n=r(),{palette:C}=p(),[w,T]=(0,x.useState)(null),[E,D]=(0,x.useState)([]),[O,k]=(0,x.useState)(!0),[A,j]=(0,x.useState)(null);if((0,x.useEffect)(()=>{if(!e||!t)return;k(!0);let n=decodeURIComponent(t);Promise.all([b(e,n),b(e,n).then(t=>y(e,t.fileId).catch(()=>[]))]).then(([e,t])=>{T(e),D(t),j(null)}).catch(e=>j(e instanceof Error?e.message:String(e))).finally(()=>k(!1))},[e,t]),O)return(0,S.jsx)(u,{sx:{display:`flex`,justifyContent:`center`,py:4},children:(0,S.jsx)(f,{})});if(A||!w)return(0,S.jsx)(d,{severity:`error`,children:A||`Doc node not found`});let M=decodeURIComponent(t);return(0,S.jsxs)(u,{children:[(0,S.jsx)(_,{breadcrumbs:[{label:`Docs`,to:`/${e}/docs`},{label:w.title||w.id}]}),(0,S.jsxs)(m,{title:`Details`,sx:{mb:3},children:[(0,S.jsx)(v,{label:`ID`,children:(0,S.jsxs)(u,{sx:{display:`flex`,alignItems:`center`,gap:.5},children:[(0,S.jsx)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:w.id}),(0,S.jsx)(h,{value:w.id})]})}),(0,S.jsx)(v,{label:`File`,children:(0,S.jsx)(c,{component:`button`,variant:`body2`,onClick:()=>n(`/${e}/docs`),children:w.fileId})}),(0,S.jsx)(v,{label:`Level`,children:(0,S.jsx)(a,{variant:`body2`,children:w.level})}),w.language&&(0,S.jsx)(v,{label:`Language`,children:(0,S.jsx)(a,{variant:`body2`,children:w.language})}),w.symbols&&w.symbols.length>0&&(0,S.jsx)(v,{label:`Symbols`,divider:!1,children:(0,S.jsx)(g,{tags:w.symbols})})]}),w.content&&(0,S.jsx)(m,{title:`Content`,sx:{mb:3},children:(0,S.jsx)(a,{variant:`body2`,sx:{whiteSpace:`pre-wrap`,fontFamily:w.language?`monospace`:`inherit`,fontSize:w.language?`0.85rem`:void 0},children:w.content})}),E.length>1&&(0,S.jsx)(m,{title:`In this file`,children:(0,S.jsx)(o,{dense:!0,disablePadding:!0,children:E.map(t=>(0,S.jsx)(s,{selected:t.id===M,onClick:()=>n(`/${e}/docs/${encodeURIComponent(t.id)}`),sx:{borderRadius:1,py:.25,...t.id===M&&{bgcolor:`${C.primary.main}14`}},children:(0,S.jsx)(l,{primary:(0,S.jsx)(a,{variant:`body2`,sx:{pl:(t.level-1)*2},fontWeight:t.id===M?700:400,children:t.title||t.id})})},t.id))})})]})}export{C as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{c as r,l as i}from"./vendor-react-CHUjhoxh.js";import{$ as a,O as o,Y as s,et as c,m as l,nt as u,ut as d}from"./vendor-mui-BPj7d3Sw.js";import"./vendor-md-editor-DmWafJvr.js";import{F as f,H as p,I as m,N as h,a as g,d as _,j as v,k as y,r as b}from"./index-BCZDAYZi.js";import{t as x}from"./api-BMnBjMMf.js";var S=e(n(),1),C=t();function w(e){return e==null?`—`:e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function T(){let{projectId:e,"*":t}=i(),n=r(),{palette:T}=d(),[E,D]=(0,S.useState)(null),[O,k]=(0,S.useState)([]),[A,j]=(0,S.useState)([]),[M,N]=(0,S.useState)(!0),[P,F]=(0,S.useState)(null);if((0,S.useEffect)(()=>{!e||!t||(N(!0),Promise.all([x(e,t),p(e,`files`,t).catch(()=>[]),_(e,`files`,t).catch(()=>[])]).then(([e,t,n])=>{D(e),k(t),j(n),F(null)}).catch(e=>F(e instanceof Error?e.message:String(e))).finally(()=>N(!1)))},[e,t]),M)return(0,C.jsx)(s,{sx:{display:`flex`,justifyContent:`center`,py:4},children:(0,C.jsx)(u,{})});if(P||!E)return(0,C.jsx)(c,{severity:`error`,children:P||`File not found`});let I=t.split(`/`).slice(0,-1).join(`/`)||`.`;return(0,C.jsxs)(s,{children:[(0,C.jsx)(v,{breadcrumbs:[{label:`Files`,to:`/${e}/files`},{label:E.fileName}]}),(0,C.jsxs)(m,{title:`Metadata`,sx:{mb:3},children:[(0,C.jsx)(y,{label:`Path`,children:(0,C.jsxs)(s,{sx:{display:`flex`,alignItems:`center`,gap:.5},children:[(0,C.jsx)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:E.filePath}),(0,C.jsx)(h,{value:E.filePath})]})}),(0,C.jsx)(y,{label:`Size`,children:(0,C.jsx)(a,{variant:`body2`,children:w(E.size)})}),E.language&&(0,C.jsx)(y,{label:`Language`,children:(0,C.jsx)(a,{variant:`body2`,children:E.language})}),E.mimeType&&(0,C.jsx)(y,{label:`MIME Type`,children:(0,C.jsx)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:E.mimeType})}),E.extension&&(0,C.jsx)(y,{label:`Extension`,children:(0,C.jsx)(a,{variant:`body2`,children:E.extension})}),(0,C.jsx)(y,{label:`Directory`,divider:!1,children:(0,C.jsx)(o,{component:`button`,variant:`body2`,onClick:()=>n(`/${e}/files?dir=${I}`),children:I})})]}),(0,C.jsx)(m,{title:`Linked Notes`,sx:{mb:3},children:O.length===0?(0,C.jsx)(a,{variant:`body2`,sx:{color:T.custom.textMuted},children:`No linked notes`}):(0,C.jsx)(l,{spacing:.5,children:O.map(t=>(0,C.jsxs)(s,{sx:{display:`flex`,alignItems:`center`,gap:1},children:[(0,C.jsx)(f,{label:t.kind,color:`neutral`,size:`small`}),(0,C.jsx)(o,{component:`button`,variant:`body2`,onClick:()=>n(`/${e}/knowledge/${t.noteId}`),children:t.title})]},t.noteId))})}),(0,C.jsx)(m,{title:`Linked Tasks`,children:A.length===0?(0,C.jsx)(a,{variant:`body2`,sx:{color:T.custom.textMuted},children:`No linked tasks`}):(0,C.jsx)(l,{spacing:.5,children:A.map(t=>(0,C.jsxs)(s,{sx:{display:`flex`,alignItems:`center`,gap:1},children:[(0,C.jsx)(f,{label:g(t.status),color:b[t.status]??`neutral`,size:`small`}),(0,C.jsx)(o,{component:`button`,variant:`body2`,onClick:()=>n(`/${e}/tasks/${t.taskId}`),children:t.title})]},t.taskId))})})]})}export{T as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{c as r,l as i}from"./vendor-react-CHUjhoxh.js";import{$ as a,Y as o,et as s,nt as c,q as l}from"./vendor-mui-BPj7d3Sw.js";import"./vendor-md-editor-DmWafJvr.js";import{M as u,W as d}from"./vendor-mui-icons-B196sG3f.js";import{B as f,C as p,I as m,K as h,M as g,N as _,P as v,Q as y,U as b,W as x,X as S,Z as C,j as w,k as T,q as E,w as D,z as O}from"./index-BCZDAYZi.js";import"./skill-y9pizyqE.js";import{n as k,t as A}from"./attachments-CEQ-2nMo.js";var j=e(n(),1),M=t();function N(){let{projectId:e,noteId:t}=i(),n=r(),N=C(`knowledge`),[P,F]=(0,j.useState)(null),[I,L]=(0,j.useState)([]),[R,z]=(0,j.useState)([]),[B,V]=(0,j.useState)(!0),[H,U]=(0,j.useState)(null),[W,G]=(0,j.useState)(!1),K=(0,j.useCallback)(async()=>{if(!(!e||!t))try{let[n,r,i]=await Promise.all([b(e,t),h(e,t),x(e,t)]);F(n),L(r),z(i),U(null)}catch(e){U(e instanceof Error?e.message:String(e))}finally{V(!1)}},[e,t]);return(0,j.useEffect)(()=>{K()},[K]),y(e??null,(0,j.useCallback)(e=>{e.type.startsWith(`note:`)&&K()},[K])),B?(0,M.jsx)(o,{sx:{display:`flex`,justifyContent:`center`,py:4},children:(0,M.jsx)(c,{})}):H||!P?(0,M.jsx)(s,{severity:`error`,children:H||`Note not found`}):(0,M.jsxs)(o,{children:[(0,M.jsx)(w,{breadcrumbs:[{label:`Knowledge`,to:`/${e}/knowledge`},{label:P.title}],actions:N?(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(l,{variant:`contained`,color:`success`,startIcon:(0,M.jsx)(d,{}),onClick:()=>n(`/${e}/knowledge/${t}/edit`),children:`Edit`}),(0,M.jsx)(l,{color:`error`,startIcon:(0,M.jsx)(u,{}),onClick:()=>G(!0),children:`Delete`})]}):void 0}),(0,M.jsxs)(m,{title:`Details`,sx:{mb:3},children:[(0,M.jsx)(T,{label:`ID`,children:(0,M.jsxs)(o,{sx:{display:`flex`,alignItems:`center`,gap:.5},children:[(0,M.jsx)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:P.id}),(0,M.jsx)(_,{value:P.id})]})}),(0,M.jsx)(T,{label:`Version`,children:(0,M.jsxs)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:[`v`,P.version]})}),(0,M.jsx)(T,{label:`Tags`,children:P.tags.length>0?(0,M.jsx)(v,{tags:P.tags}):(0,M.jsx)(a,{variant:`body2`,color:`text.secondary`,children:`—`})}),P.createdBy&&(0,M.jsx)(T,{label:`Created by`,children:(0,M.jsx)(a,{variant:`body2`,children:P.createdBy})}),P.updatedBy&&P.updatedBy!==P.createdBy&&(0,M.jsx)(T,{label:`Updated by`,children:(0,M.jsx)(a,{variant:`body2`,children:P.updatedBy})}),(0,M.jsx)(T,{label:`Created`,children:(0,M.jsx)(g,{value:P.createdAt,showTime:!0,showRelative:!0})}),(0,M.jsx)(T,{label:`Updated`,divider:!P.content,children:(0,M.jsx)(g,{value:P.updatedAt,showTime:!0,showRelative:!0})}),P.content&&(0,M.jsx)(T,{label:`Content`,divider:!1,children:(0,M.jsx)(p,{children:P.content})})]}),(0,M.jsx)(m,{title:`Attachments`,sx:{mb:3},children:(0,M.jsx)(A,{attachments:R,getUrl:n=>E(e,t,n),onUpload:async n=>{await S(e,t,n),z(await x(e,t))},onDelete:async n=>{await f(e,t,n),z(await x(e,t))},readOnly:!N})}),(0,M.jsx)(m,{title:`Relations`,children:(0,M.jsx)(k,{projectId:e,entityId:t,entityType:`knowledge`,relations:I,onRefresh:K})}),(0,M.jsx)(D,{open:W,title:`Delete Note`,message:`Are you sure you want to delete "${P.title}"? This cannot be undone.`,confirmLabel:`Delete`,confirmColor:`error`,onConfirm:async()=>{!e||!t||(await O(e,t),n(`/${e}/knowledge`))},onCancel:()=>G(!1)})]})}export{N as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{c as r,l as i}from"./vendor-react-CHUjhoxh.js";import{$ as a,X as o,Y as s,et as c,nt as l,q as u}from"./vendor-mui-BPj7d3Sw.js";import"./vendor-md-editor-DmWafJvr.js";import{M as d,W as f}from"./vendor-mui-icons-B196sG3f.js";import{C as p,F as m,I as h,N as g,P as _,Q as v,Z as y,j as b,k as x,w as S}from"./index-BCZDAYZi.js";import{_ as C,c as w,d as T,f as E,h as D,i as O,n as k,r as A,s as j,u as M}from"./skill-y9pizyqE.js";import{n as N,t as P}from"./attachments-CEQ-2nMo.js";var F=e(n(),1),I=t();function L(){let{projectId:e,skillId:t}=i(),n=r(),L=y(`skills`),[R,z]=(0,F.useState)(null),[B,V]=(0,F.useState)([]),[H,U]=(0,F.useState)([]),[W,G]=(0,F.useState)(!0),[K,q]=(0,F.useState)(null),[J,Y]=(0,F.useState)(!1),X=(0,F.useCallback)(async()=>{if(!(!e||!t))try{let[n,r,i]=await Promise.all([M(e,t),E(e,t),T(e,t)]);z(n),V(r),U(i),q(null)}catch(e){q(e instanceof Error?e.message:String(e))}finally{G(!1)}},[e,t]);return(0,F.useEffect)(()=>{X()},[X]),v(e??null,(0,F.useCallback)(e=>{e.type.startsWith(`skill:`)&&X()},[X])),W?(0,I.jsx)(s,{sx:{display:`flex`,justifyContent:`center`,py:4},children:(0,I.jsx)(l,{})}):K||!R?(0,I.jsx)(c,{severity:`error`,children:K||`Skill not found`}):(0,I.jsxs)(s,{children:[(0,I.jsx)(b,{breadcrumbs:[{label:`Skills`,to:`/${e}/skills`},{label:R.title}],actions:L?(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(u,{variant:`contained`,color:`success`,startIcon:(0,I.jsx)(f,{}),onClick:()=>n(`/${e}/skills/${t}/edit`),children:`Edit`}),(0,I.jsx)(u,{color:`error`,startIcon:(0,I.jsx)(d,{}),onClick:()=>Y(!0),children:`Delete`})]}):void 0}),(0,I.jsxs)(h,{title:`Details`,sx:{mb:3},children:[(0,I.jsx)(x,{label:`ID`,children:(0,I.jsxs)(s,{sx:{display:`flex`,alignItems:`center`,gap:.5},children:[(0,I.jsx)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:R.id}),(0,I.jsx)(g,{value:R.id})]})}),(0,I.jsx)(x,{label:`Version`,children:(0,I.jsxs)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:[`v`,R.version]})}),(0,I.jsx)(x,{label:`Source`,children:(0,I.jsx)(m,{label:O(R.source),color:k[R.source]??`primary`})}),(0,I.jsx)(x,{label:`Confidence`,children:(0,I.jsx)(a,{variant:`body2`,children:A(R.confidence)})}),(0,I.jsx)(x,{label:`Usage Count`,children:(0,I.jsx)(a,{variant:`body2`,children:R.usageCount})}),R.lastUsedAt&&(0,I.jsx)(x,{label:`Last Used`,children:(0,I.jsx)(a,{variant:`body2`,children:new Date(R.lastUsedAt).toLocaleString()})}),R.createdBy&&(0,I.jsx)(x,{label:`Created by`,children:(0,I.jsx)(a,{variant:`body2`,children:R.createdBy})}),R.updatedBy&&R.updatedBy!==R.createdBy&&(0,I.jsx)(x,{label:`Updated by`,children:(0,I.jsx)(a,{variant:`body2`,children:R.updatedBy})}),(0,I.jsx)(x,{label:`Created`,children:(0,I.jsx)(a,{variant:`body2`,children:new Date(R.createdAt).toLocaleString()})}),(0,I.jsx)(x,{label:`Updated`,children:(0,I.jsx)(a,{variant:`body2`,children:new Date(R.updatedAt).toLocaleString()})}),(0,I.jsx)(x,{label:`Tags`,children:R.tags.length>0?(0,I.jsx)(_,{tags:R.tags}):(0,I.jsx)(a,{variant:`body2`,color:`text.secondary`,children:`—`})}),R.description&&(0,I.jsx)(x,{label:`Description`,divider:!1,children:(0,I.jsx)(p,{children:R.description})})]}),R.steps.length>0&&(0,I.jsx)(h,{title:`Steps`,sx:{mb:3},children:(0,I.jsx)(s,{component:`ol`,sx:{m:0,pl:2.5},children:R.steps.map((e,t)=>(0,I.jsx)(a,{component:`li`,variant:`body2`,sx:{mb:.5},children:e},t))})}),R.triggers.length>0&&(0,I.jsx)(h,{title:`Triggers`,sx:{mb:3},children:(0,I.jsx)(s,{sx:{display:`flex`,flexWrap:`wrap`,gap:.5},children:R.triggers.map((e,t)=>(0,I.jsx)(o,{label:e,size:`small`,variant:`outlined`},t))})}),R.inputHints.length>0&&(0,I.jsx)(h,{title:`Input Hints`,sx:{mb:3},children:(0,I.jsx)(s,{sx:{display:`flex`,flexWrap:`wrap`,gap:.5},children:R.inputHints.map((e,t)=>(0,I.jsx)(o,{label:e,size:`small`,variant:`outlined`},t))})}),R.filePatterns.length>0&&(0,I.jsx)(h,{title:`File Patterns`,sx:{mb:3},children:(0,I.jsx)(s,{sx:{display:`flex`,flexWrap:`wrap`,gap:.5},children:R.filePatterns.map((e,t)=>(0,I.jsx)(o,{label:e,size:`small`,variant:`outlined`,sx:{fontFamily:`monospace`}},t))})}),(0,I.jsx)(h,{title:`Attachments`,sx:{mb:3},children:(0,I.jsx)(P,{attachments:H,getUrl:n=>D(e,t,n),onUpload:async n=>{await C(e,t,n),U(await T(e,t))},onDelete:async n=>{await w(e,t,n),U(await T(e,t))},readOnly:!L})}),(0,I.jsx)(h,{title:`Relations`,children:(0,I.jsx)(N,{projectId:e,entityId:t,entityType:`skills`,relations:B,onRefresh:X})}),(0,I.jsx)(S,{open:J,title:`Delete Skill`,message:`Are you sure you want to delete "${R.title}"? This cannot be undone.`,confirmLabel:`Delete`,confirmColor:`error`,onConfirm:async()=>{!e||!t||(await j(e,t),n(`/${e}/skills`))},onCancel:()=>Y(!1)})]})}export{L as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{c as r,l as i}from"./vendor-react-CHUjhoxh.js";import{$ as a,O as o,P as s,Y as c,et as ee,k as te,m as l,nt as u,q as d,v as f,y as p}from"./vendor-mui-BPj7d3Sw.js";import"./vendor-md-editor-DmWafJvr.js";import{M as ne,W as m}from"./vendor-mui-icons-B196sG3f.js";import{C as h,F as g,I as _,M as v,N as re,P as ie,Q as ae,Z as oe,a as y,b,c as x,et as S,f as C,g as w,i as T,j as E,k as D,l as O,m as k,n as A,p as j,r as M,t as N,v as P,w as F}from"./index-BCZDAYZi.js";import"./skill-y9pizyqE.js";import{n as I,t as L}from"./attachments-CEQ-2nMo.js";var R=e(n(),1),z=t();function B(){let{projectId:e,taskId:t}=i(),n=r(),B=oe(`tasks`),[V,H]=(0,R.useState)(null),[U,W]=(0,R.useState)([]),[G,K]=(0,R.useState)([]),[q,se]=(0,R.useState)([]),[ce,le]=(0,R.useState)(!0),[J,Y]=(0,R.useState)(null),[X,Z]=(0,R.useState)(!1),Q=(0,R.useCallback)(async()=>{if(!(!e||!t))try{let[n,r,i,a]=await Promise.all([C(e,t),k(e,t),j(e,t),S(e).catch(()=>[])]);H(n),W(r),K(i),se(a),Y(null)}catch(e){Y(e instanceof Error?e.message:String(e))}finally{le(!1)}},[e,t]);(0,R.useEffect)(()=>{Q()},[Q]),ae(e??null,(0,R.useCallback)(e=>{e.type.startsWith(`task:`)&&Q()},[Q]));let ue=async()=>{!e||!t||(await x(e,t),n(`/${e}/tasks`))},de=async n=>{!e||!t||(await w(e,t,n),Q())};if(ce)return(0,z.jsx)(c,{sx:{display:`flex`,justifyContent:`center`,py:4},children:(0,z.jsx)(u,{})});if(J||!V)return(0,z.jsx)(ee,{severity:`error`,children:J||`Task not found`});let $=(t,r)=>!r||r.length===0?null:(0,z.jsx)(D,{label:t,children:(0,z.jsx)(l,{spacing:.5,children:r.map(t=>(0,z.jsxs)(c,{sx:{display:`flex`,alignItems:`center`,gap:1},children:[(0,z.jsx)(g,{label:y(t.status),color:M[t.status],size:`small`}),(0,z.jsx)(o,{component:`button`,variant:`body2`,onClick:()=>n(`/${e}/tasks/${t.id}`),children:t.title})]},t.id))})}),fe=!!(V.subtasks?.length||V.blockedBy?.length||V.blocks?.length||V.related?.length);return(0,z.jsxs)(c,{children:[(0,z.jsx)(E,{breadcrumbs:[{label:`Tasks`,to:`/${e}/tasks`},{label:V.title}],actions:B?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(d,{variant:`contained`,color:`success`,startIcon:(0,z.jsx)(m,{}),onClick:()=>n(`/${e}/tasks/${t}/edit`),children:`Edit`}),(0,z.jsx)(d,{color:`error`,startIcon:(0,z.jsx)(ne,{}),onClick:()=>Z(!0),children:`Delete`})]}):void 0}),(0,z.jsxs)(_,{title:`Properties`,sx:{mb:3},children:[(0,z.jsx)(D,{label:`ID`,children:(0,z.jsxs)(c,{sx:{display:`flex`,alignItems:`center`,gap:.5},children:[(0,z.jsx)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:V.id}),(0,z.jsx)(re,{value:V.id})]})}),(0,z.jsx)(D,{label:`Version`,children:(0,z.jsxs)(a,{variant:`body2`,sx:{fontFamily:`monospace`},children:[`v`,V.version]})}),(0,z.jsx)(D,{label:`Status`,children:(0,z.jsxs)(c,{sx:{display:`flex`,alignItems:`center`,gap:1},children:[(0,z.jsx)(g,{label:y(V.status),color:M[V.status]}),B&&(0,z.jsxs)(s,{size:`small`,sx:{minWidth:140},children:[(0,z.jsx)(te,{children:`Move to`}),(0,z.jsx)(f,{value:``,label:`Move to`,onChange:e=>de(e.target.value),children:N.filter(e=>e.status!==V.status).map(e=>(0,z.jsx)(p,{value:e.status,children:e.label},e.status))})]})]})}),(0,z.jsx)(D,{label:`Priority`,children:(0,z.jsx)(g,{label:T(V.priority),color:A[V.priority]})}),(0,z.jsx)(D,{label:`Tags`,children:V.tags.length>0?(0,z.jsx)(ie,{tags:V.tags}):(0,z.jsx)(a,{variant:`body2`,color:`text.secondary`,children:`—`})}),V.dueDate!=null&&(0,z.jsx)(D,{label:`Due Date`,children:(0,z.jsx)(v,{value:V.dueDate,showRelative:!0})}),V.estimate!=null&&(0,z.jsx)(D,{label:`Estimate`,children:(0,z.jsxs)(a,{variant:`body2`,children:[V.estimate,`h`]})}),V.assignee&&(0,z.jsx)(D,{label:`Assignee`,children:(0,z.jsx)(a,{variant:`body2`,children:q.find(e=>e.id===V.assignee)?.name??V.assignee})}),V.completedAt!=null&&(0,z.jsx)(D,{label:`Completed`,children:(0,z.jsx)(v,{value:V.completedAt,showTime:!0,showRelative:!0})}),V.createdBy&&(0,z.jsx)(D,{label:`Created by`,children:(0,z.jsx)(a,{variant:`body2`,children:V.createdBy})}),V.updatedBy&&V.updatedBy!==V.createdBy&&(0,z.jsx)(D,{label:`Updated by`,children:(0,z.jsx)(a,{variant:`body2`,children:V.updatedBy})}),(0,z.jsx)(D,{label:`Created`,children:(0,z.jsx)(v,{value:V.createdAt,showTime:!0,showRelative:!0})}),(0,z.jsx)(D,{label:`Updated`,divider:!1,children:(0,z.jsx)(v,{value:V.updatedAt,showTime:!0,showRelative:!0})})]}),V.description&&(0,z.jsx)(_,{title:`Description`,sx:{mb:3},children:(0,z.jsx)(h,{children:V.description})}),fe&&(0,z.jsxs)(_,{title:`Dependencies`,sx:{mb:3},children:[$(`Subtasks`,V.subtasks),$(`Blocked by`,V.blockedBy),$(`Blocks`,V.blocks),$(`Related`,V.related)]}),(0,z.jsx)(_,{title:`Attachments`,sx:{mb:3},children:(0,z.jsx)(L,{attachments:G,getUrl:n=>P(e,t,n),onUpload:async n=>{await b(e,t,n),K(await j(e,t))},onDelete:async n=>{await O(e,t,n),K(await j(e,t))},readOnly:!B})}),(0,z.jsx)(_,{title:`Cross-graph Links`,children:(0,z.jsx)(I,{projectId:e,entityId:t,entityType:`tasks`,relations:U,onRefresh:Q})}),(0,z.jsx)(F,{open:X,title:`Delete Task`,message:`Are you sure you want to delete "${V.title}"? This cannot be undone.`,confirmLabel:`Delete`,confirmColor:`error`,onConfirm:ue,onCancel:()=>Z(!1)})]})}export{B as default};
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-Dw2cE7zH.js";import{D as t,O as n}from"./vendor-markdown-CT8ZVEPu.js";import{c as r,l as i}from"./vendor-react-CHUjhoxh.js";import{$ as a,X as o,Y as s,a as c,c as l,d as u,et as d,l as f,nt as p,p as m,q as h,r as g,s as _,u as v,ut as y}from"./vendor-mui-BPj7d3Sw.js";import"./vendor-md-editor-DmWafJvr.js";import{nt as b,t as x,tt as S}from"./vendor-mui-icons-B196sG3f.js";import{E as C,F as w,I as T,N as E,T as D,j as O}from"./index-BCZDAYZi.js";import{n as k}from"./help-CEMQqZUR.js";import{n as A,t as j}from"./api-DuX-0a_X.js";var M=e(n(),1),N=t(),P={docs:`primary`,code:`success`,knowledge:`warning`,tasks:`neutral`,skills:`primary`,files:`neutral`,context:`neutral`,"cross-graph":`error`};function F(e){let t={},n=e.inputSchema?.properties||{};for(let[e,r]of Object.entries(n))r.default===void 0?t[e]=``:t[e]=String(r.default);return t}function I(e,t){let n=e.trim();if(n!==``){if(t.type===`number`||t.type===`integer`){let e=Number(n);return isNaN(e)?void 0:e}if(t.type===`boolean`)return n===`true`;if(t.type===`array`)try{return JSON.parse(n)}catch{return n.split(`,`).map(e=>e.trim()).filter(Boolean)}if(t.type===`object`)try{return JSON.parse(n)}catch{return}return n}}function L(e){return e.enum?e.enum.join(` | `):e.type===`array`&&e.items?.type?`${e.items.type}[]`:e.type||`any`}function R(){let{projectId:e,toolName:t}=i(),n=r(),{palette:R}=y(),[z,B]=(0,M.useState)(null),[V,H]=(0,M.useState)(!0),[U,W]=(0,M.useState)({}),[G,K]=(0,M.useState)(!1),[q,J]=(0,M.useState)(null);(0,M.useEffect)(()=>{!e||!t||(H(!0),A(e,t).then(e=>{B(e),W(F(e))}).finally(()=>H(!1)))},[e,t]);let Y=(0,M.useCallback)(async()=>{if(!(!e||!t||!z)){K(!0),J(null);try{let n=z.inputSchema?.properties||{},r={};for(let[e,t]of Object.entries(U)){let i=I(t,n[e]||{});i!==void 0&&(r[e]=i)}J(await j(e,t,r))}catch(e){J({result:[{type:`text`,text:e instanceof Error?e.message:`Unknown error`}],isError:!0,duration:0})}finally{K(!1)}}},[e,t,z,U]);if(V)return(0,N.jsx)(s,{sx:{display:`flex`,justifyContent:`center`,py:8},children:(0,N.jsx)(p,{})});if(!z)return(0,N.jsx)(D,{icon:(0,N.jsx)(b,{}),title:`Tool not found`});let X=z.inputSchema?.properties||{},Z=new Set(z.inputSchema?.required||[]),Q=q?q.result.map(e=>e.text||``).join(`
2
+ `):``,$=Q;try{$=JSON.stringify(JSON.parse(Q),null,2)}catch{}return(0,N.jsxs)(s,{children:[(0,N.jsx)(O,{breadcrumbs:[{label:`Tools`,to:`/${e}/tools`},{label:z.name}]}),(0,N.jsxs)(s,{sx:{display:`flex`,flexDirection:`column`,gap:2},children:[(0,N.jsx)(T,{title:`Info`,children:(0,N.jsxs)(s,{sx:{display:`flex`,flexDirection:`column`,gap:1.5},children:[(0,N.jsxs)(s,{sx:{display:`flex`,alignItems:`center`,gap:1.5},children:[(0,N.jsx)(a,{variant:`h6`,fontWeight:700,sx:{fontFamily:`monospace`},children:z.name}),(0,N.jsx)(w,{label:z.category,color:P[z.category]||`neutral`}),(0,N.jsx)(E,{value:z.name})]}),(0,N.jsx)(a,{variant:`body2`,sx:{color:R.custom.textMuted},children:z.description})]})}),(0,N.jsx)(T,{title:`Parameters (${Object.keys(X).length})`,children:Object.keys(X).length===0?(0,N.jsx)(a,{variant:`body2`,sx:{color:R.custom.textMuted},children:`This tool takes no parameters.`}):(0,N.jsx)(l,{children:(0,N.jsxs)(u,{size:`small`,children:[(0,N.jsx)(_,{children:(0,N.jsxs)(c,{children:[(0,N.jsx)(f,{children:`Name`}),(0,N.jsx)(f,{children:`Type`}),(0,N.jsx)(f,{children:`Required`}),(0,N.jsx)(f,{children:`Description`})]})}),(0,N.jsx)(v,{children:Object.entries(X).map(([e,t])=>(0,N.jsxs)(c,{children:[(0,N.jsx)(f,{children:(0,N.jsx)(a,{variant:`body2`,sx:{fontFamily:`monospace`,fontWeight:600},children:e})}),(0,N.jsx)(f,{children:(0,N.jsx)(o,{label:L(t),size:`small`,variant:`outlined`})}),(0,N.jsx)(f,{children:Z.has(e)?(0,N.jsx)(a,{variant:`body2`,color:`error`,fontWeight:600,children:`Yes`}):(0,N.jsx)(a,{variant:`body2`,sx:{color:R.custom.textMuted},children:`No`})}),(0,N.jsx)(f,{children:(0,N.jsx)(a,{variant:`body2`,sx:{color:R.custom.textMuted},children:t.description||`-`})})]},e))})]})})}),(0,N.jsx)(T,{title:`Playground`,action:(0,N.jsx)(h,{variant:`contained`,size:`small`,startIcon:G?(0,N.jsx)(p,{size:16,color:`inherit`}):(0,N.jsx)(x,{}),onClick:Y,disabled:G,children:G?`Running...`:`Execute`}),children:(0,N.jsx)(s,{sx:{display:`flex`,flexDirection:`column`,gap:1.5},children:Object.keys(X).length===0?(0,N.jsx)(a,{variant:`body2`,sx:{color:R.custom.textMuted},children:`No parameters required. Click Execute to run.`}):Object.entries(X).map(([e,t])=>{if(t.type===`boolean`)return(0,N.jsxs)(s,{children:[(0,N.jsx)(C,{children:e}),(0,N.jsx)(m,{checked:U[e]===`true`,onChange:t=>W(n=>({...n,[e]:String(t.target.checked)})),size:`small`})]},e);let n=t.type===`array`||t.type===`object`||e===`content`||e===`description`;return(0,N.jsxs)(s,{children:[(0,N.jsx)(C,{required:Z.has(e),children:e}),(0,N.jsx)(g,{value:U[e]||``,onChange:t=>W(n=>({...n,[e]:t.target.value})),size:`small`,fullWidth:!0,multiline:n,minRows:n?2:void 0,helperText:t.description,placeholder:t.enum?t.enum.join(` | `):t.type===`array`?`["item1", "item2"] or item1, item2`:t.type===`number`||t.type===`integer`?`0`:void 0,slotProps:{input:{sx:{fontFamily:`monospace`,fontSize:`0.875rem`}}}})]},e)})})}),q&&(0,N.jsxs)(T,{title:`Response`,action:(0,N.jsxs)(s,{sx:{display:`flex`,alignItems:`center`,gap:1.5},children:[(0,N.jsxs)(a,{variant:`caption`,sx:{color:R.custom.textMuted},children:[q.duration,`ms`]}),Q&&(0,N.jsx)(E,{value:$})]}),children:[q.isError&&(0,N.jsx)(d,{severity:`error`,sx:{mb:1.5},children:`Tool returned an error`}),(0,N.jsx)(s,{component:`pre`,sx:{m:0,p:1.5,bgcolor:R.custom.surfaceMuted,borderRadius:1,overflow:`auto`,maxHeight:500,fontFamily:`monospace`,fontSize:`0.8125rem`,lineHeight:1.5,whiteSpace:`pre-wrap`,wordBreak:`break-word`},children:$||`(empty response)`})]}),t&&k(t).length>0&&(0,N.jsx)(T,{title:`Related Guides`,children:(0,N.jsx)(s,{sx:{display:`flex`,flexWrap:`wrap`,gap:1},children:k(t).map(t=>(0,N.jsx)(o,{icon:(0,N.jsx)(S,{}),label:t.title,size:`small`,variant:`outlined`,clickable:!0,onClick:()=>n(`/${e}/help/${t.id}`)},t.id))})})]})]})}export{R as default};
@@ -0,0 +1 @@
1
+ import{i as e,n as t,r as n}from"./client-Bq88u7gN.js";function r(r,i){return n(`/projects/${r}/files${t({directory:i?.directory,extension:i?.extension,language:i?.language,filter:i?.filter,limit:i?.limit})}`).then(e)}function i(r,i,a){return n(`/projects/${r}/files/search${t({q:i,topK:a?.topK,minScore:a?.minScore})}`).then(e)}function a(e,r){return n(`/projects/${e}/files/info${t({path:r})}`)}export{r as n,i as r,a as t};
@@ -0,0 +1 @@
1
+ import{i as e,n as t,r as n}from"./client-Bq88u7gN.js";function r(r,i){return n(`/projects/${r}/docs/topics${t({filter:i?.filter,limit:i?.limit})}`).then(e)}function i(t,r){return n(`/projects/${t}/docs/toc/${r}`).then(e)}function a(e,t){return n(`/projects/${e}/docs/nodes/${t}`)}function o(r,i,a){return n(`/projects/${r}/docs/search${t({q:i,topK:a?.topK,minScore:a?.minScore})}`).then(e)}export{o as i,i as n,r,a as t};
@@ -0,0 +1 @@
1
+ import{i as e,n as t,r as n}from"./client-Bq88u7gN.js";function r(r,i,a){return n(`/projects/${r}/code/search${t({q:i,topK:a?.topK,minScore:a?.minScore})}`).then(e)}export{r as t};
@@ -0,0 +1 @@
1
+ import{i as e,r as t}from"./client-Bq88u7gN.js";function n(n){return t(`/projects/${n}/tools`).then(e)}function r(e,n){return t(`/projects/${e}/tools/${n}`)}function i(e,n,r){return t(`/projects/${e}/tools/${n}/call`,{method:`POST`,body:JSON.stringify({arguments:r})})}export{r as n,n as r,i as t};