coaiajs 0.3.0 → 0.3.2

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 (179) hide show
  1. package/KINSHIP.md +1 -1
  2. package/README.md +191 -75
  3. package/dist/mcp/config.d.ts.map +1 -0
  4. package/dist/mcp/config.js +0 -2
  5. package/dist/mcp/config.js.map +1 -0
  6. package/dist/mcp/prompts.d.ts.map +1 -0
  7. package/dist/mcp/prompts.js.map +1 -0
  8. package/dist/mcp/resources.d.ts.map +1 -0
  9. package/dist/mcp/resources.js.map +1 -0
  10. package/dist/mcp/server.d.ts.map +1 -0
  11. package/dist/mcp/server.js +1 -1
  12. package/dist/mcp/server.js.map +1 -0
  13. package/dist/mcp/tools/coaiapy-tools.d.ts.map +1 -0
  14. package/dist/mcp/tools/coaiapy-tools.js.map +1 -0
  15. package/dist/mcp/tools/index.d.ts.map +1 -0
  16. package/dist/mcp/tools/index.js.map +1 -0
  17. package/dist/src/audio.d.ts.map +1 -0
  18. package/dist/src/audio.js.map +1 -0
  19. package/dist/src/cli-helpers.d.ts.map +1 -0
  20. package/dist/src/cli-helpers.js.map +1 -0
  21. package/dist/src/cli.d.ts.map +1 -0
  22. package/dist/src/cli.js +1 -0
  23. package/dist/src/cli.js.map +1 -0
  24. package/dist/src/config.d.ts.map +1 -0
  25. package/dist/src/config.js.map +1 -0
  26. package/dist/src/environment.d.ts.map +1 -0
  27. package/dist/src/environment.js.map +1 -0
  28. package/dist/src/github.d.ts.map +1 -0
  29. package/dist/src/github.js.map +1 -0
  30. package/dist/src/index.d.ts +1 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +1 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/langfuse/client.d.ts.map +1 -0
  35. package/dist/src/langfuse/client.js.map +1 -0
  36. package/dist/src/langfuse/comments.d.ts.map +1 -0
  37. package/dist/src/langfuse/comments.js.map +1 -0
  38. package/dist/src/langfuse/datasets.d.ts.map +1 -0
  39. package/dist/src/langfuse/datasets.js.map +1 -0
  40. package/dist/src/langfuse/index.d.ts +1 -0
  41. package/dist/src/langfuse/index.d.ts.map +1 -0
  42. package/dist/src/langfuse/index.js.map +1 -0
  43. package/dist/src/langfuse/media.d.ts.map +1 -0
  44. package/dist/src/langfuse/media.js.map +1 -0
  45. package/dist/src/langfuse/observations.d.ts.map +1 -0
  46. package/dist/src/langfuse/observations.js.map +1 -0
  47. package/dist/src/langfuse/prompts.d.ts +5 -1
  48. package/dist/src/langfuse/prompts.d.ts.map +1 -0
  49. package/dist/src/langfuse/prompts.js +16 -3
  50. package/dist/src/langfuse/prompts.js.map +1 -0
  51. package/dist/src/langfuse/scores.d.ts.map +1 -0
  52. package/dist/src/langfuse/scores.js.map +1 -0
  53. package/dist/src/langfuse/traces.d.ts.map +1 -0
  54. package/dist/src/langfuse/traces.js.map +1 -0
  55. package/dist/src/llm.d.ts.map +1 -0
  56. package/dist/src/llm.js.map +1 -0
  57. package/dist/src/narrative/graph-manager.d.ts.map +1 -0
  58. package/dist/src/narrative/graph-manager.js.map +1 -0
  59. package/dist/src/narrative/index.d.ts.map +1 -0
  60. package/dist/src/narrative/index.js.map +1 -0
  61. package/dist/src/narrative/markdown-export.d.ts.map +1 -0
  62. package/dist/src/narrative/markdown-export.js.map +1 -0
  63. package/dist/src/narrative/tool-definitions.d.ts.map +1 -0
  64. package/dist/src/narrative/tool-definitions.js.map +1 -0
  65. package/dist/src/narrative/tool-handlers.d.ts.map +1 -0
  66. package/dist/src/narrative/tool-handlers.js.map +1 -0
  67. package/dist/src/narrative/types.d.ts.map +1 -0
  68. package/dist/src/narrative/types.js.map +1 -0
  69. package/dist/src/narrative/validation.d.ts.map +1 -0
  70. package/dist/src/narrative/validation.js.map +1 -0
  71. package/dist/src/pde/index.d.ts.map +1 -0
  72. package/dist/src/pde/index.js.map +1 -0
  73. package/dist/src/pde/mcp-handlers.d.ts.map +1 -0
  74. package/dist/src/pde/mcp-handlers.js.map +1 -0
  75. package/dist/src/pde/mcp-tools.d.ts.map +1 -0
  76. package/dist/src/pde/mcp-tools.js.map +1 -0
  77. package/dist/src/pde/session-manager.d.ts.map +1 -0
  78. package/dist/src/pde/session-manager.js.map +1 -0
  79. package/dist/src/pde/stc-mapper.d.ts.map +1 -0
  80. package/dist/src/pde/stc-mapper.js.map +1 -0
  81. package/dist/src/pipeline/index.d.ts.map +1 -0
  82. package/dist/src/pipeline/index.js.map +1 -0
  83. package/dist/src/pipeline/template-engine.d.ts.map +1 -0
  84. package/dist/src/pipeline/template-engine.js.map +1 -0
  85. package/dist/src/planning/index.d.ts.map +1 -0
  86. package/dist/src/planning/index.js.map +1 -0
  87. package/dist/src/planning/mcp-handlers.d.ts.map +1 -0
  88. package/dist/src/planning/mcp-handlers.js.map +1 -0
  89. package/dist/src/planning/mcp-tools.d.ts.map +1 -0
  90. package/dist/src/planning/mcp-tools.js.map +1 -0
  91. package/dist/src/planning/plan-parser.d.ts.map +1 -0
  92. package/dist/src/planning/plan-parser.js.map +1 -0
  93. package/dist/src/redis.d.ts.map +1 -0
  94. package/dist/src/redis.js.map +1 -0
  95. package/dist/src/types.d.ts.map +1 -0
  96. package/dist/src/types.js.map +1 -0
  97. package/dist/src/version.d.ts.map +1 -0
  98. package/dist/src/version.js.map +1 -0
  99. package/llms-full.txt +361 -0
  100. package/llms.txt +43 -0
  101. package/package.json +79 -12
  102. package/.claude/settings.local.json +0 -17
  103. package/.claude-plugin/marketplace.json +0 -26
  104. package/articles/academic/NOTES.md +0 -1
  105. package/articles/academic/README.md +0 -1
  106. package/articles/academic/creative-orientation-vs-problem-solving.md +0 -177
  107. package/articles/academic/jsonl-knowledge-graphs-agent-memory.md +0 -142
  108. package/articles/academic/langfuse-observability-llm-pipelines.md +0 -144
  109. package/articles/academic/medicine-wheel-software-architecture.md +0 -163
  110. package/articles/academic/mmot-autonomous-agents.md +0 -156
  111. package/articles/academic/model-context-protocol-interagent.md +0 -161
  112. package/articles/academic/pde-prompt-decomposition.md +0 -186
  113. package/articles/academic/structural-tension-in-ai-agents.md +0 -134
  114. package/articles/reviews/mcp-protocol-design-review.md +0 -170
  115. package/articles/reviews/observability-ai-systems-review.md +0 -176
  116. package/articles/reviews/prompt-engineering-decomposition-review.md +0 -184
  117. package/articles/surveys/agent-orchestration-survey.md +0 -186
  118. package/articles/surveys/knowledge-graph-storage-survey.md +0 -204
  119. package/articles/surveys/structural-tension-methodology-survey.md +0 -154
  120. package/articles/technical/aws-sdk-v3-polly.md +0 -270
  121. package/articles/technical/commander-cli-framework.md +0 -262
  122. package/articles/technical/dotenv-config-patterns.md +0 -360
  123. package/articles/technical/ioredis-vs-redis.md +0 -142
  124. package/articles/technical/langfuse-js-sdk-vs-rest.md +0 -191
  125. package/articles/technical/mcp-sdk-typescript.md +0 -291
  126. package/articles/technical/octokit-github-api.md +0 -293
  127. package/articles/technical/openai-sdk-modern.md +0 -231
  128. package/articles/technical/yaml-parsing-node.md +0 -266
  129. package/articles/technical/zod-runtime-validation.md +0 -212
  130. package/coaiajs-langfuse-claude-plugin/.claude-plugin/marketplace.json +0 -16
  131. package/coaiajs-langfuse-claude-plugin/.claude-plugin/plugin.json +0 -10
  132. package/coaiajs-langfuse-claude-plugin/.mcp.json +0 -8
  133. package/coaiajs-langfuse-claude-plugin/README.md +0 -60
  134. package/mcp/config.ts +0 -225
  135. package/mcp/prompts.ts +0 -131
  136. package/mcp/resources.ts +0 -84
  137. package/mcp/server.ts +0 -519
  138. package/mcp/tools/coaiapy-tools.ts +0 -366
  139. package/mcp/tools/index.ts +0 -4
  140. package/src/audio.ts +0 -76
  141. package/src/cli-helpers.ts +0 -86
  142. package/src/cli.ts +0 -1261
  143. package/src/config.ts +0 -207
  144. package/src/environment.ts +0 -171
  145. package/src/github.ts +0 -143
  146. package/src/index.ts +0 -82
  147. package/src/langfuse/client.ts +0 -105
  148. package/src/langfuse/comments.ts +0 -52
  149. package/src/langfuse/datasets.ts +0 -178
  150. package/src/langfuse/index.ts +0 -37
  151. package/src/langfuse/media.ts +0 -193
  152. package/src/langfuse/observations.ts +0 -155
  153. package/src/langfuse/prompts.ts +0 -157
  154. package/src/langfuse/scores.ts +0 -456
  155. package/src/langfuse/traces.ts +0 -353
  156. package/src/llm.ts +0 -106
  157. package/src/narrative/graph-manager.ts +0 -1358
  158. package/src/narrative/index.ts +0 -188
  159. package/src/narrative/markdown-export.ts +0 -535
  160. package/src/narrative/tool-definitions.ts +0 -635
  161. package/src/narrative/tool-handlers.ts +0 -528
  162. package/src/narrative/types.ts +0 -9
  163. package/src/narrative/validation.ts +0 -179
  164. package/src/pde/index.ts +0 -34
  165. package/src/pde/mcp-handlers.ts +0 -359
  166. package/src/pde/mcp-tools.ts +0 -201
  167. package/src/pde/session-manager.ts +0 -248
  168. package/src/pde/stc-mapper.ts +0 -298
  169. package/src/pipeline/index.ts +0 -7
  170. package/src/pipeline/template-engine.ts +0 -398
  171. package/src/planning/index.ts +0 -32
  172. package/src/planning/mcp-handlers.ts +0 -369
  173. package/src/planning/mcp-tools.ts +0 -155
  174. package/src/planning/plan-parser.ts +0 -587
  175. package/src/redis.ts +0 -111
  176. package/src/types.ts +0 -281
  177. package/src/version.ts +0 -39
  178. package/test/config.test.mjs +0 -93
  179. package/tsconfig.json +0 -26
package/mcp/server.ts DELETED
@@ -1,519 +0,0 @@
1
- #!/usr/bin/env node
2
- // coaiajs/mcp/server.ts — Unified MCP server
3
- // Consolidates all tools: coaiapy-mcp (20) + narrative (28) + PDE (10) + planning (6) = 64+ tools
4
-
5
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
- import {
8
- CallToolRequestSchema,
9
- GetPromptRequestSchema,
10
- ListPromptsRequestSchema,
11
- ListResourcesRequestSchema,
12
- ListToolsRequestSchema,
13
- ReadResourceRequestSchema,
14
- type CallToolResult,
15
- } from '@modelcontextprotocol/sdk/types.js';
16
-
17
- import { FeatureConfig } from './config.js';
18
- import { getCoaiapyToolDefinitions } from './tools/index.js';
19
- import type { ToolDefinition } from './tools/index.js';
20
- import { readCoaiaResource } from './resources.js';
21
- import { listPrompts as listCoaiaPrompts, renderPrompt } from './prompts.js';
22
- import { tash as redisTash, fetch as redisFetch } from '../src/redis.js';
23
- import {
24
- ALL_TOOL_DEFINITIONS as NARRATIVE_TOOL_DEFINITIONS,
25
- handleToolCall as handleNarrativeTool,
26
- KnowledgeGraphManager,
27
- } from '../src/narrative/index.js';
28
- import { PDE_MCP_TOOLS, handlePdeTool } from '../src/pde/index.js';
29
- import { PLANNING_MCP_TOOLS, handlePlanningTool } from '../src/planning/index.js';
30
- import type { McpToolResult } from '../src/types.js';
31
- import { getPackageVersion } from '../src/version.js';
32
-
33
- // Langfuse imports
34
- import {
35
- addTrace, patchTraceOutput, listTraces, getTrace, formatTracesMarkdown, formatTraceTree,
36
- } from '../src/langfuse/traces.js';
37
- import { addObservation, getObservation, formatObservationDisplay } from '../src/langfuse/observations.js';
38
- import { listPrompts, getPrompt, formatPromptsTable, formatPromptDisplay } from '../src/langfuse/prompts.js';
39
- import { listDatasets, getDataset, formatDatasetsTable } from '../src/langfuse/datasets.js';
40
- import {
41
- listScoreConfigs, getScoreConfig, applyScoreConfig,
42
- formatScoreConfigsTable,
43
- } from '../src/langfuse/scores.js';
44
- import { listComments, getComment, createComment } from '../src/langfuse/comments.js';
45
- import { uploadAndAttachMedia, getMedia, formatMediaDisplay } from '../src/langfuse/media.js';
46
-
47
- // ─── Server Info ────────────────────────────────────────────────────
48
-
49
- const SERVER_NAME = 'coaiajs-mcp';
50
- const SERVER_VERSION = getPackageVersion();
51
-
52
- // ─── Parse CLI args ─────────────────────────────────────────────────
53
-
54
- function parseArgs(): { memoryPath?: string; plansDir?: string; featureLevel?: string } {
55
- const args = process.argv.slice(2);
56
- const result: Record<string, string> = {};
57
- for (let i = 0; i < args.length; i++) {
58
- if (args[i] === '--memory-path' && args[i + 1]) {
59
- result.memoryPath = args[++i];
60
- } else if (args[i] === '--plans-dir' && args[i + 1]) {
61
- result.plansDir = args[++i];
62
- } else if (args[i] === '--features' && args[i + 1]) {
63
- result.featureLevel = args[++i];
64
- }
65
- }
66
- return result;
67
- }
68
-
69
- // ─── Tool Handler ───────────────────────────────────────────────────
70
-
71
- type ToolArgs = Record<string, unknown>;
72
-
73
- function textResult(text: string, isError = false): CallToolResult {
74
- return { content: [{ type: 'text', text }], isError };
75
- }
76
-
77
- function toCallToolResult(result: McpToolResult): CallToolResult {
78
- return {
79
- content: result.content.map((item) => ({
80
- type: 'text' as const,
81
- text: item.text,
82
- })),
83
- isError: result.isError,
84
- };
85
- }
86
-
87
- async function handleCoaiapyTool(name: string, args: ToolArgs): Promise<CallToolResult> {
88
- try {
89
- switch (name) {
90
- // ── Redis ──
91
- case 'coaia_tash': {
92
- await redisTash(
93
- args.key as string,
94
- args.value as string,
95
- args.ttl as number | undefined,
96
- );
97
- return textResult(JSON.stringify({
98
- success: true,
99
- message: `Stored '${args.key as string}' in Redis`,
100
- }, null, 2));
101
- }
102
- case 'coaia_fetch': {
103
- const value = await redisFetch(args.key as string);
104
- if (value == null) {
105
- return textResult(JSON.stringify({
106
- success: false,
107
- error: `Key '${args.key as string}' not found in Redis`,
108
- }, null, 2), true);
109
- }
110
- return textResult(JSON.stringify({ success: true, value }, null, 2));
111
- }
112
-
113
- // ── Traces ──
114
- case 'coaia_fuse_trace_create': {
115
- const result = await addTrace({
116
- traceId: args.trace_id as string,
117
- userId: args.user_id as string | undefined,
118
- sessionId: args.session_id as string | undefined,
119
- name: args.name as string | undefined,
120
- metadata: args.metadata as Record<string, unknown> | undefined,
121
- inputData: args.input_data,
122
- outputData: args.output_data,
123
- });
124
- return textResult(result);
125
- }
126
-
127
- case 'coaia_fuse_add_observation': {
128
- const result = await addObservation({
129
- observationId: args.observation_id as string,
130
- traceId: args.trace_id as string,
131
- name: args.name as string,
132
- type: args.observation_type as string | undefined,
133
- parentId: args.parent_id as string | undefined,
134
- metadata: args.metadata as Record<string, unknown> | undefined,
135
- inputData: args.input_data,
136
- outputData: args.output_data,
137
- startTime: args.start_time as string | undefined,
138
- endTime: args.end_time as string | undefined,
139
- });
140
- return textResult(result);
141
- }
142
-
143
- case 'coaia_fuse_trace_patch_output': {
144
- const result = await patchTraceOutput(
145
- args.trace_id as string,
146
- args.output_data,
147
- );
148
- return textResult(result);
149
- }
150
-
151
- case 'coaia_fuse_trace_get':
152
- case 'coaia_fuse_trace_view': {
153
- const traceJson = await getTrace(args.trace_id as string);
154
- if (args.json_output) {
155
- return textResult(traceJson);
156
- }
157
- const formatted = formatTraceTree(traceJson);
158
- return textResult(formatted);
159
- }
160
-
161
- case 'coaia_fuse_observation_get': {
162
- const obsJson = await getObservation(args.observation_id as string);
163
- if (args.json_output) {
164
- return textResult(obsJson);
165
- }
166
- return textResult(formatObservationDisplay(obsJson));
167
- }
168
-
169
- case 'coaia_fuse_traces_list': {
170
- const result = await listTraces({
171
- sessionId: args.session_id as string | undefined,
172
- userId: args.user_id as string | undefined,
173
- name: args.name as string | undefined,
174
- tags: args.tags as string[] | undefined,
175
- fromTimestamp: args.from_timestamp as string | undefined,
176
- toTimestamp: args.to_timestamp as string | undefined,
177
- orderBy: args.order_by as string | undefined,
178
- page: args.page as number | undefined,
179
- limit: args.limit as number | undefined,
180
- });
181
- if (args.json_output) return textResult(result);
182
- return textResult(formatTracesMarkdown(result));
183
- }
184
-
185
- case 'coaia_fuse_traces_session_view': {
186
- const result = await listTraces({
187
- sessionId: args.session_id as string,
188
- });
189
- if (args.json_output) return textResult(result);
190
- return textResult(formatTracesMarkdown(result));
191
- }
192
-
193
- // ── Prompts ──
194
- case 'coaia_fuse_prompts_list': {
195
- const result = await listPrompts();
196
- return textResult(formatPromptsTable(result));
197
- }
198
-
199
- case 'coaia_fuse_prompts_get': {
200
- const result = await getPrompt(
201
- args.name as string,
202
- args.label as string | undefined,
203
- );
204
- return textResult(formatPromptDisplay(result));
205
- }
206
-
207
- // ── Datasets ──
208
- case 'coaia_fuse_datasets_list': {
209
- const result = await listDatasets();
210
- return textResult(formatDatasetsTable(result));
211
- }
212
-
213
- case 'coaia_fuse_datasets_get': {
214
- const result = await getDataset(args.name as string);
215
- return textResult(result);
216
- }
217
-
218
- // ── Score Configs ──
219
- case 'coaia_fuse_score_configs_list': {
220
- const result = await listScoreConfigs();
221
- return textResult(formatScoreConfigsTable(result));
222
- }
223
-
224
- case 'coaia_fuse_score_configs_get': {
225
- const result = await getScoreConfig(args.name_or_id as string);
226
- return textResult(result);
227
- }
228
-
229
- case 'coaia_fuse_score_apply': {
230
- const result = await applyScoreConfig(
231
- args.config_name_or_id as string,
232
- args.target_type as string,
233
- args.target_id as string,
234
- args.value as number,
235
- args.observation_id as string | undefined,
236
- args.comment as string | undefined,
237
- );
238
- return textResult(result);
239
- }
240
-
241
- // ── Comments ──
242
- case 'coaia_fuse_comments_list': {
243
- const result = await listComments({
244
- objectType: args.object_type as string | undefined,
245
- objectId: args.object_id as string | undefined,
246
- authorUserId: args.author_user_id as string | undefined,
247
- page: args.page as number | undefined,
248
- limit: args.limit as number | undefined,
249
- });
250
- return textResult(result);
251
- }
252
-
253
- case 'coaia_fuse_comments_get': {
254
- const result = await getComment(args.comment_id as string);
255
- return textResult(result);
256
- }
257
-
258
- case 'coaia_fuse_comments_create': {
259
- const result = await createComment({
260
- text: args.text as string,
261
- objectType: args.object_type as string,
262
- objectId: args.object_id as string,
263
- authorUserId: args.author_user_id as string | undefined,
264
- });
265
- return textResult(result);
266
- }
267
-
268
- // ── Media ──
269
- case 'coaia_fuse_media_upload': {
270
- const result = await uploadAndAttachMedia({
271
- filePath: args.file_path as string,
272
- traceId: args.trace_id as string,
273
- field: args.field as string | undefined,
274
- observationId: args.observation_id as string | undefined,
275
- contentType: args.content_type as string | undefined,
276
- });
277
- return textResult(result);
278
- }
279
-
280
- case 'coaia_fuse_media_get': {
281
- const result = await getMedia(args.media_id as string);
282
- return textResult(formatMediaDisplay(result));
283
- }
284
-
285
- default:
286
- return textResult(`Unknown tool: ${name}`, true);
287
- }
288
- } catch (error) {
289
- const msg = error instanceof Error ? error.message : String(error);
290
- return textResult(JSON.stringify({ error: msg }), true);
291
- }
292
- }
293
-
294
- // ─── Narrative/PDE/Planning tool routing ────────────────────────────
295
-
296
- function getNarrativeToolDefinitions(featureConfig: FeatureConfig): ToolDefinition[] {
297
- return NARRATIVE_TOOL_DEFINITIONS
298
- .filter((tool) => featureConfig.isToolEnabled(tool.name))
299
- .map((tool) => ({
300
- name: tool.name,
301
- description: tool.description,
302
- inputSchema: tool.inputSchema,
303
- }));
304
- }
305
-
306
- const NARRATIVE_TOOL_NAMES = new Set(NARRATIVE_TOOL_DEFINITIONS.map((tool) => tool.name));
307
- const PDE_ALIAS_TO_TOOL: Record<string, string> = {
308
- pde_update_action_progress: 'update_action_progress',
309
- pde_mark_action_complete: 'mark_action_complete',
310
- pde_add_action_step: 'add_action_step',
311
- pde_update_current_reality: 'update_current_reality',
312
- };
313
- const PDE_TOOL_NAMES = new Set([
314
- ...PDE_MCP_TOOLS.map((tool) => tool.name),
315
- ...Object.keys(PDE_ALIAS_TO_TOOL),
316
- ]);
317
- const PLANNING_TOOL_NAMES = new Set(PLANNING_MCP_TOOLS.map((tool) => tool.name));
318
-
319
- function namespacePdeToolIfNeeded(tool: ToolDefinition): ToolDefinition {
320
- if (!NARRATIVE_TOOL_NAMES.has(tool.name)) return tool;
321
- return {
322
- ...tool,
323
- name: `pde_${tool.name}`,
324
- description: `[PDE session] ${tool.description}`,
325
- };
326
- }
327
-
328
- function getPdeToolDefinitions(featureConfig: FeatureConfig): ToolDefinition[] {
329
- return PDE_MCP_TOOLS
330
- .map((tool) => namespacePdeToolIfNeeded(tool as ToolDefinition))
331
- .filter((tool) => featureConfig.isToolEnabled(tool.name));
332
- }
333
-
334
- function getPlanningToolDefinitions(featureConfig: FeatureConfig): ToolDefinition[] {
335
- return PLANNING_MCP_TOOLS
336
- .filter((tool) => featureConfig.isToolEnabled(tool.name))
337
- .map((tool) => ({
338
- name: tool.name,
339
- description: tool.description,
340
- inputSchema: tool.inputSchema,
341
- }));
342
- }
343
-
344
- function normalizePdeToolName(name: string): string {
345
- return PDE_ALIAS_TO_TOOL[name] ?? name;
346
- }
347
-
348
- // ─── Server Creation ────────────────────────────────────────────────
349
-
350
- function createServer(): Server {
351
- const cliArgs = parseArgs();
352
- const featureConfig = new FeatureConfig(
353
- cliArgs.featureLevel as 'MINIMAL' | 'STANDARD' | 'OBSERVABILITY' | 'FULL' | undefined,
354
- );
355
-
356
- const server = new Server(
357
- { name: SERVER_NAME, version: SERVER_VERSION },
358
- { capabilities: { tools: {}, resources: {}, prompts: {} } },
359
- );
360
-
361
- const memoryPath = cliArgs.memoryPath ?? process.env['COAIAJS_MEMORY_PATH'] ?? 'coaia-memory.jsonl';
362
- const narrativeManager = new KnowledgeGraphManager(memoryPath);
363
-
364
- // Collect all tool definitions
365
- const allToolDefs: ToolDefinition[] = [
366
- ...getCoaiapyToolDefinitions(featureConfig),
367
- ...getNarrativeToolDefinitions(featureConfig),
368
- ...getPdeToolDefinitions(featureConfig),
369
- ...getPlanningToolDefinitions(featureConfig),
370
- ];
371
-
372
- // ── list_tools handler ──
373
- server.setRequestHandler(ListToolsRequestSchema, async () => {
374
- return {
375
- tools: allToolDefs.map((t) => ({
376
- name: t.name,
377
- description: t.description,
378
- inputSchema: t.inputSchema,
379
- })),
380
- };
381
- });
382
-
383
- // ── resources/list handler ──
384
- server.setRequestHandler(ListResourcesRequestSchema, async () => {
385
- return {
386
- resources: [
387
- {
388
- uri: 'coaia://templates/',
389
- name: 'Pipeline Templates',
390
- description: 'List of all available pipeline templates',
391
- mimeType: 'application/json',
392
- },
393
- ].filter((resource) => featureConfig.isResourceEnabled(resource.uri)),
394
- };
395
- });
396
-
397
- // ── resources/read handler ──
398
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
399
- const { uri } = request.params;
400
- if (!featureConfig.isResourceEnabled(uri)) {
401
- return {
402
- contents: [{
403
- uri,
404
- mimeType: 'application/json',
405
- text: JSON.stringify({
406
- error: `Resource '${uri}' is not available in ${featureConfig.getFeatureLevel()} feature set`,
407
- }, null, 2),
408
- }],
409
- };
410
- }
411
- return {
412
- contents: [{
413
- uri,
414
- mimeType: 'application/json',
415
- text: await readCoaiaResource(uri),
416
- }],
417
- };
418
- });
419
-
420
- // ── prompts/list handler ──
421
- server.setRequestHandler(ListPromptsRequestSchema, async () => {
422
- return {
423
- prompts: listCoaiaPrompts()
424
- .filter((prompt) => featureConfig.isPromptEnabled(prompt.id))
425
- .map((prompt) => ({
426
- name: prompt.id,
427
- title: prompt.name,
428
- description: prompt.description,
429
- arguments: prompt.variables.map((variable) => ({
430
- name: variable.name,
431
- description: variable.description,
432
- required: variable.required,
433
- })),
434
- })),
435
- };
436
- });
437
-
438
- // ── prompts/get handler ──
439
- server.setRequestHandler(GetPromptRequestSchema, async (request) => {
440
- const { name, arguments: promptArgs } = request.params;
441
- if (!featureConfig.isPromptEnabled(name)) {
442
- const error = `Prompt '${name}' is not available in ${featureConfig.getFeatureLevel()} feature set`;
443
- return {
444
- description: `Error: ${error}`,
445
- messages: [{ role: 'user', content: { type: 'text', text: error } }],
446
- };
447
- }
448
-
449
- try {
450
- const rendered = renderPrompt(name, promptArgs ?? {});
451
- if (!rendered) {
452
- const error = `Prompt '${name}' not found`;
453
- return {
454
- description: `Error: ${error}`,
455
- messages: [{ role: 'user', content: { type: 'text', text: error } }],
456
- };
457
- }
458
- return {
459
- description: `Rendered prompt: ${name}`,
460
- messages: [{ role: 'user', content: { type: 'text', text: rendered } }],
461
- };
462
- } catch (error) {
463
- const message = error instanceof Error ? error.message : String(error);
464
- return {
465
- description: `Error: ${message}`,
466
- messages: [{ role: 'user', content: { type: 'text', text: message } }],
467
- };
468
- }
469
- });
470
-
471
- // ── call_tool handler ──
472
- server.setRequestHandler(CallToolRequestSchema, async (request, _extra) => {
473
- const { name, arguments: args } = request.params;
474
- const toolArgs = (args ?? {}) as ToolArgs;
475
-
476
- // Route to coaiapy handler if it's a coaia_* tool
477
- if (name.startsWith('coaia_')) {
478
- return handleCoaiapyTool(name, toolArgs);
479
- }
480
-
481
- if (NARRATIVE_TOOL_NAMES.has(name)) {
482
- return toCallToolResult(await handleNarrativeTool(name, toolArgs, narrativeManager));
483
- }
484
-
485
- if (PDE_TOOL_NAMES.has(name)) {
486
- return toCallToolResult(await handlePdeTool(normalizePdeToolName(name), toolArgs));
487
- }
488
-
489
- if (PLANNING_TOOL_NAMES.has(name)) {
490
- return toCallToolResult(await handlePlanningTool(name, toolArgs));
491
- }
492
-
493
- return textResult(`Unknown tool: ${name}`, true);
494
- });
495
-
496
- return server;
497
- }
498
-
499
- // ─── Main ───────────────────────────────────────────────────────────
500
-
501
- async function main(): Promise<void> {
502
- const server = createServer();
503
- const transport = new StdioServerTransport();
504
- await server.connect(transport);
505
-
506
- const cliArgs = parseArgs();
507
- const featureConfig = new FeatureConfig(
508
- cliArgs.featureLevel as 'MINIMAL' | 'STANDARD' | 'OBSERVABILITY' | 'FULL' | undefined,
509
- );
510
- const stats = featureConfig.getStats();
511
- console.error(
512
- `${SERVER_NAME} v${SERVER_VERSION} started (${stats.level}: ${stats.tools} tools, ${stats.prompts} prompts, ${stats.resources} resources)`,
513
- );
514
- }
515
-
516
- main().catch((error) => {
517
- console.error('Fatal error:', error);
518
- process.exit(1);
519
- });