coaiajs 0.1.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 (162) hide show
  1. package/CLAUDE.md +56 -0
  2. package/KINSHIP.md +63 -0
  3. package/README.md +148 -0
  4. package/articles/academic/creative-orientation-vs-problem-solving.md +177 -0
  5. package/articles/academic/jsonl-knowledge-graphs-agent-memory.md +142 -0
  6. package/articles/academic/langfuse-observability-llm-pipelines.md +144 -0
  7. package/articles/academic/medicine-wheel-software-architecture.md +163 -0
  8. package/articles/academic/mmot-autonomous-agents.md +156 -0
  9. package/articles/academic/model-context-protocol-interagent.md +161 -0
  10. package/articles/academic/pde-prompt-decomposition.md +186 -0
  11. package/articles/academic/structural-tension-in-ai-agents.md +134 -0
  12. package/articles/reviews/mcp-protocol-design-review.md +170 -0
  13. package/articles/reviews/observability-ai-systems-review.md +176 -0
  14. package/articles/reviews/prompt-engineering-decomposition-review.md +184 -0
  15. package/articles/surveys/agent-orchestration-survey.md +186 -0
  16. package/articles/surveys/knowledge-graph-storage-survey.md +204 -0
  17. package/articles/surveys/structural-tension-methodology-survey.md +154 -0
  18. package/articles/technical/aws-sdk-v3-polly.md +270 -0
  19. package/articles/technical/commander-cli-framework.md +262 -0
  20. package/articles/technical/dotenv-config-patterns.md +360 -0
  21. package/articles/technical/ioredis-vs-redis.md +142 -0
  22. package/articles/technical/langfuse-js-sdk-vs-rest.md +191 -0
  23. package/articles/technical/mcp-sdk-typescript.md +291 -0
  24. package/articles/technical/octokit-github-api.md +293 -0
  25. package/articles/technical/openai-sdk-modern.md +231 -0
  26. package/articles/technical/yaml-parsing-node.md +266 -0
  27. package/articles/technical/zod-runtime-validation.md +212 -0
  28. package/dist/mcp/config.d.ts +14 -0
  29. package/dist/mcp/config.js +185 -0
  30. package/dist/mcp/server.d.ts +3 -0
  31. package/dist/mcp/server.js +324 -0
  32. package/dist/mcp/tools/coaiapy-tools.d.ts +8 -0
  33. package/dist/mcp/tools/coaiapy-tools.js +326 -0
  34. package/dist/mcp/tools/index.d.ts +3 -0
  35. package/dist/mcp/tools/index.js +3 -0
  36. package/dist/src/audio.d.ts +12 -0
  37. package/dist/src/audio.js +57 -0
  38. package/dist/src/cli-helpers.d.ts +9 -0
  39. package/dist/src/cli-helpers.js +78 -0
  40. package/dist/src/cli.d.ts +3 -0
  41. package/dist/src/cli.js +1086 -0
  42. package/dist/src/config.d.ts +15 -0
  43. package/dist/src/config.js +145 -0
  44. package/dist/src/environment.d.ts +44 -0
  45. package/dist/src/environment.js +146 -0
  46. package/dist/src/github.d.ts +47 -0
  47. package/dist/src/github.js +79 -0
  48. package/dist/src/langfuse/client.d.ts +30 -0
  49. package/dist/src/langfuse/client.js +75 -0
  50. package/dist/src/langfuse/comments.d.ts +16 -0
  51. package/dist/src/langfuse/comments.js +36 -0
  52. package/dist/src/langfuse/datasets.d.ts +19 -0
  53. package/dist/src/langfuse/datasets.js +140 -0
  54. package/dist/src/langfuse/index.d.ts +13 -0
  55. package/dist/src/langfuse/index.js +10 -0
  56. package/dist/src/langfuse/media.d.ts +11 -0
  57. package/dist/src/langfuse/media.js +167 -0
  58. package/dist/src/langfuse/observations.d.ts +18 -0
  59. package/dist/src/langfuse/observations.js +113 -0
  60. package/dist/src/langfuse/prompts.d.ts +14 -0
  61. package/dist/src/langfuse/prompts.js +127 -0
  62. package/dist/src/langfuse/scores.d.ts +54 -0
  63. package/dist/src/langfuse/scores.js +366 -0
  64. package/dist/src/langfuse/traces.d.ts +29 -0
  65. package/dist/src/langfuse/traces.js +225 -0
  66. package/dist/src/llm.d.ts +23 -0
  67. package/dist/src/llm.js +76 -0
  68. package/dist/src/narrative/graph-manager.d.ts +106 -0
  69. package/dist/src/narrative/graph-manager.js +915 -0
  70. package/dist/src/narrative/index.d.ts +9 -0
  71. package/dist/src/narrative/index.js +7 -0
  72. package/dist/src/narrative/markdown-export.d.ts +21 -0
  73. package/dist/src/narrative/markdown-export.js +383 -0
  74. package/dist/src/narrative/tool-definitions.d.ts +21 -0
  75. package/dist/src/narrative/tool-definitions.js +588 -0
  76. package/dist/src/narrative/tool-handlers.d.ts +11 -0
  77. package/dist/src/narrative/tool-handlers.js +462 -0
  78. package/dist/src/narrative/types.d.ts +2 -0
  79. package/dist/src/narrative/types.js +2 -0
  80. package/dist/src/narrative/validation.d.ts +29 -0
  81. package/dist/src/narrative/validation.js +144 -0
  82. package/dist/src/pde/index.d.ts +8 -0
  83. package/dist/src/pde/index.js +8 -0
  84. package/dist/src/pde/mcp-handlers.d.ts +7 -0
  85. package/dist/src/pde/mcp-handlers.js +300 -0
  86. package/dist/src/pde/mcp-tools.d.ts +15 -0
  87. package/dist/src/pde/mcp-tools.js +191 -0
  88. package/dist/src/pde/session-manager.d.ts +32 -0
  89. package/dist/src/pde/session-manager.js +205 -0
  90. package/dist/src/pde/stc-mapper.d.ts +26 -0
  91. package/dist/src/pde/stc-mapper.js +234 -0
  92. package/dist/src/pipeline/index.d.ts +2 -0
  93. package/dist/src/pipeline/index.js +3 -0
  94. package/dist/src/pipeline/template-engine.d.ts +20 -0
  95. package/dist/src/pipeline/template-engine.js +361 -0
  96. package/dist/src/planning/index.d.ts +7 -0
  97. package/dist/src/planning/index.js +7 -0
  98. package/dist/src/planning/mcp-handlers.d.ts +7 -0
  99. package/dist/src/planning/mcp-handlers.js +310 -0
  100. package/dist/src/planning/mcp-tools.d.ts +15 -0
  101. package/dist/src/planning/mcp-tools.js +145 -0
  102. package/dist/src/planning/plan-parser.d.ts +35 -0
  103. package/dist/src/planning/plan-parser.js +506 -0
  104. package/dist/src/redis.d.ts +21 -0
  105. package/dist/src/redis.js +78 -0
  106. package/dist/src/types.d.ts +244 -0
  107. package/dist/src/types.js +8 -0
  108. package/mcp/config.ts +196 -0
  109. package/mcp/server.ts +402 -0
  110. package/mcp/tools/coaiapy-tools.ts +364 -0
  111. package/mcp/tools/index.ts +4 -0
  112. package/package.json +52 -0
  113. package/rispecs/00-coaiajs-platform.spec.md +102 -0
  114. package/rispecs/01-core-config.spec.md +89 -0
  115. package/rispecs/02-redis-module.spec.md +62 -0
  116. package/rispecs/03-langfuse-module.spec.md +101 -0
  117. package/rispecs/04-narrative-engine.spec.md +185 -0
  118. package/rispecs/05-pde-engine.spec.md +112 -0
  119. package/rispecs/06-planning-engine.spec.md +128 -0
  120. package/rispecs/07-pipeline-templates.spec.md +97 -0
  121. package/rispecs/08-cli-interface.spec.md +134 -0
  122. package/rispecs/09-mcp-server.spec.md +140 -0
  123. package/rispecs/10-audio-module.spec.md +63 -0
  124. package/rispecs/KINSHIP.md +56 -0
  125. package/rispecs/README.md +100 -0
  126. package/src/audio.ts +76 -0
  127. package/src/cli-helpers.ts +86 -0
  128. package/src/cli.ts +1223 -0
  129. package/src/config.ts +172 -0
  130. package/src/environment.ts +171 -0
  131. package/src/github.ts +143 -0
  132. package/src/langfuse/client.ts +105 -0
  133. package/src/langfuse/comments.ts +52 -0
  134. package/src/langfuse/datasets.ts +178 -0
  135. package/src/langfuse/index.ts +33 -0
  136. package/src/langfuse/media.ts +193 -0
  137. package/src/langfuse/observations.ts +131 -0
  138. package/src/langfuse/prompts.ts +157 -0
  139. package/src/langfuse/scores.ts +456 -0
  140. package/src/langfuse/traces.ts +276 -0
  141. package/src/llm.ts +106 -0
  142. package/src/narrative/graph-manager.ts +1358 -0
  143. package/src/narrative/index.ts +32 -0
  144. package/src/narrative/markdown-export.ts +535 -0
  145. package/src/narrative/tool-definitions.ts +635 -0
  146. package/src/narrative/tool-handlers.ts +528 -0
  147. package/src/narrative/types.ts +9 -0
  148. package/src/narrative/validation.ts +179 -0
  149. package/src/pde/index.ts +8 -0
  150. package/src/pde/mcp-handlers.ts +359 -0
  151. package/src/pde/mcp-tools.ts +201 -0
  152. package/src/pde/session-manager.ts +248 -0
  153. package/src/pde/stc-mapper.ts +298 -0
  154. package/src/pipeline/index.ts +7 -0
  155. package/src/pipeline/template-engine.ts +398 -0
  156. package/src/planning/index.ts +13 -0
  157. package/src/planning/mcp-handlers.ts +369 -0
  158. package/src/planning/mcp-tools.ts +155 -0
  159. package/src/planning/plan-parser.ts +587 -0
  160. package/src/redis.ts +97 -0
  161. package/src/types.ts +280 -0
  162. package/tsconfig.json +26 -0
@@ -0,0 +1,9 @@
1
+ export { KnowledgeGraphManager } from './graph-manager.js';
2
+ export { handleToolCall } from './tool-handlers.js';
3
+ export { validate, ValidationSchemas } from './validation.js';
4
+ export { ALL_TOOL_DEFINITIONS, STC_TOOLS, NARRATIVE_TOOLS, KG_TOOLS, CORE_TOOLS, } from './tool-definitions.js';
5
+ export type { ToolDefinition } from './tool-definitions.js';
6
+ export { exportChartToMarkdown, exportAllCharts, exportChartProgress, exportChartStats, writeMarkdownToFile, getDefaultFilename, } from './markdown-export.js';
7
+ export type { MarkdownOptions } from './markdown-export.js';
8
+ export type { Entity, EntityMetadata, Relation, RelationMetadata, KnowledgeGraph, McpToolResult, } from './types.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,7 @@
1
+ // narrative/index.ts — Module barrel export
2
+ export { KnowledgeGraphManager } from './graph-manager.js';
3
+ export { handleToolCall } from './tool-handlers.js';
4
+ export { validate, ValidationSchemas } from './validation.js';
5
+ export { ALL_TOOL_DEFINITIONS, STC_TOOLS, NARRATIVE_TOOLS, KG_TOOLS, CORE_TOOLS, } from './tool-definitions.js';
6
+ export { exportChartToMarkdown, exportAllCharts, exportChartProgress, exportChartStats, writeMarkdownToFile, getDefaultFilename, } from './markdown-export.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Markdown Export Module for COAIA Narrative
3
+ *
4
+ * Provides markdown generation for structural tension charts,
5
+ * narrative beats, and associated data structures.
6
+ */
7
+ import type { KnowledgeGraphManager } from './graph-manager.js';
8
+ export interface MarkdownOptions {
9
+ includeMetadata?: boolean;
10
+ includeObservations?: boolean;
11
+ observationLimit?: number;
12
+ includeToc?: boolean;
13
+ outputPath?: string;
14
+ }
15
+ export declare function exportChartToMarkdown(chartId: string, manager: KnowledgeGraphManager, options?: MarkdownOptions): Promise<string>;
16
+ export declare function exportAllCharts(manager: KnowledgeGraphManager, options?: MarkdownOptions): Promise<string>;
17
+ export declare function exportChartProgress(chartId: string, manager: KnowledgeGraphManager): Promise<string>;
18
+ export declare function exportChartStats(manager: KnowledgeGraphManager): Promise<string>;
19
+ export declare function writeMarkdownToFile(content: string, outputPath: string): Promise<void>;
20
+ export declare function getDefaultFilename(exportType: string, chartId?: string): string;
21
+ //# sourceMappingURL=markdown-export.d.ts.map
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Markdown Export Module for COAIA Narrative
3
+ *
4
+ * Provides markdown generation for structural tension charts,
5
+ * narrative beats, and associated data structures.
6
+ */
7
+ import { promises as fs } from 'fs';
8
+ import path from 'path';
9
+ // ─── Utility Functions ────────────────────────────────────────────────
10
+ function escapeMarkdown(text) {
11
+ return text
12
+ .replace(/\\/g, '\\\\')
13
+ .replace(/\*/g, '\\*')
14
+ .replace(/\[/g, '\\[')
15
+ .replace(/\]/g, '\\]')
16
+ .replace(/\(/g, '\\(')
17
+ .replace(/\)/g, '\\)');
18
+ }
19
+ function formatDateForMarkdown(dateStr) {
20
+ if (!dateStr)
21
+ return 'No due date';
22
+ const date = new Date(dateStr);
23
+ const now = new Date();
24
+ const days = Math.ceil((date.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
25
+ if (days < 0)
26
+ return `Overdue by ${Math.abs(days)} days`;
27
+ if (days === 0)
28
+ return 'Due today';
29
+ if (days === 1)
30
+ return 'Due tomorrow';
31
+ if (days <= 7)
32
+ return `Due in ${days} days`;
33
+ return `${date.toLocaleDateString()}`;
34
+ }
35
+ function formatProgressBar(progress) {
36
+ const width = 20;
37
+ const filled = Math.round(progress * width);
38
+ const empty = width - filled;
39
+ const bar = '█'.repeat(filled) + '░'.repeat(empty);
40
+ const percent = Math.round(progress * 100);
41
+ return `[${bar}] ${percent}%`;
42
+ }
43
+ function getStatusIcon(completed) {
44
+ return completed ? '✅' : '⏳';
45
+ }
46
+ function slugify(text) {
47
+ return text
48
+ .toLowerCase()
49
+ .replace(/[^\w\s-]/g, '')
50
+ .replace(/\s+/g, '-')
51
+ .replace(/-+/g, '-');
52
+ }
53
+ // ─── Single Chart Export ──────────────────────────────────────────────
54
+ export async function exportChartToMarkdown(chartId, manager, options = {}) {
55
+ const graph = await manager.readGraph();
56
+ const { includeMetadata = true, includeObservations = true, observationLimit = 0, } = options;
57
+ const chart = graph.entities.find(e => e.entityType === 'structural_tension_chart' &&
58
+ e.metadata?.chartId === chartId);
59
+ if (!chart) {
60
+ return `# Error\n\nChart '${chartId}' not found.`;
61
+ }
62
+ let md = '';
63
+ md += `# Chart: ${chartId}\n\n`;
64
+ if (includeMetadata) {
65
+ if (chart.metadata?.createdAt) {
66
+ const created = new Date(chart.metadata.createdAt).toLocaleString();
67
+ md += `> **Created**: ${created}\n`;
68
+ }
69
+ if (chart.metadata?.parentChart) {
70
+ md += `> **Parent Chart**: ${chart.metadata.parentChart} (Level ${chart.metadata.level})\n`;
71
+ }
72
+ else {
73
+ md += `> **Master Chart** (Level ${chart.metadata?.level || 0})\n`;
74
+ }
75
+ if (chart.metadata?.dueDate) {
76
+ md += `> **Due**: ${formatDateForMarkdown(chart.metadata.dueDate)}\n`;
77
+ }
78
+ md += '\n';
79
+ }
80
+ // Desired Outcome
81
+ const outcome = graph.entities.find(e => e.name === `${chartId}_desired_outcome` &&
82
+ e.entityType === 'desired_outcome');
83
+ md += '## Desired Outcome\n\n';
84
+ if (outcome) {
85
+ md += `${escapeMarkdown(outcome.observations[0])}\n\n`;
86
+ }
87
+ else {
88
+ md += '*(Unknown)*\n\n';
89
+ }
90
+ // Current Reality
91
+ const currentReality = graph.entities.find(e => e.name === `${chartId}_current_reality` &&
92
+ e.entityType === 'current_reality');
93
+ md += '## Current Reality\n\n';
94
+ if (currentReality && currentReality.observations.length > 0) {
95
+ if (includeObservations && observationLimit > 0) {
96
+ const obs = currentReality.observations.slice(-observationLimit);
97
+ obs.forEach(o => (md += `- ${escapeMarkdown(o)}\n`));
98
+ }
99
+ else if (includeObservations) {
100
+ currentReality.observations.forEach(o => (md += `- ${escapeMarkdown(o)}\n`));
101
+ }
102
+ else {
103
+ md += `- ${escapeMarkdown(currentReality.observations[currentReality.observations.length - 1])}\n`;
104
+ }
105
+ md += '\n';
106
+ }
107
+ else {
108
+ md += '*(Not assessed)*\n\n';
109
+ }
110
+ // Progress & Structural Tension
111
+ const actionSteps = graph.entities.filter(e => e.entityType === 'action_step' && e.metadata?.chartId === chartId);
112
+ const completed = actionSteps.filter(a => a.metadata?.completionStatus === true).length;
113
+ const total = actionSteps.length;
114
+ const progress = total > 0 ? completed / total : 0;
115
+ md += '## Structural Tension\n\n';
116
+ md += `${formatProgressBar(progress)}\n\n`;
117
+ md += `- **Completed**: ${completed}/${total} action steps\n\n`;
118
+ // Action Steps
119
+ if (actionSteps.length > 0) {
120
+ md += '## Action Steps\n\n';
121
+ actionSteps.forEach((step, idx) => {
122
+ const isComplete = step.metadata?.completionStatus === true;
123
+ const status = getStatusIcon(isComplete);
124
+ const stepId = step.metadata?.chartId || `step_${idx + 1}`;
125
+ md += `### ${status} ${escapeMarkdown(step.observations[0])}\n\n`;
126
+ md += `- **ID**: ${stepId}\n`;
127
+ md += `- **Status**: ${isComplete ? 'Completed' : 'In Progress'}\n`;
128
+ if (step.metadata?.dueDate) {
129
+ md += `- **Due**: ${formatDateForMarkdown(step.metadata.dueDate)}\n`;
130
+ }
131
+ if (step.observations.length > 1 && includeObservations) {
132
+ md += `- **Notes**:\n`;
133
+ step.observations.slice(1).forEach(note => {
134
+ md += ` - ${escapeMarkdown(note)}\n`;
135
+ });
136
+ }
137
+ md += '\n';
138
+ });
139
+ }
140
+ // Narrative Beats
141
+ const narrativeBeats = graph.entities
142
+ .filter(e => e.entityType === 'narrative_beat' && e.metadata?.chartId === chartId)
143
+ .sort((a, b) => (a.metadata?.act || 0) - (b.metadata?.act || 0));
144
+ if (narrativeBeats.length > 0) {
145
+ md += '## Narrative Beats\n\n';
146
+ narrativeBeats.forEach(beat => {
147
+ const act = beat.metadata?.act || '?';
148
+ const type = beat.metadata?.type_dramatic || 'Unknown';
149
+ const universes = beat.metadata?.universes || [];
150
+ md += `### Act ${act}: ${escapeMarkdown(type)}\n\n`;
151
+ if (universes.length > 0) {
152
+ md += `- **Universes**: ${universes.join(', ')}\n`;
153
+ }
154
+ if (beat.metadata?.timestamp) {
155
+ const ts = new Date(beat.metadata.timestamp).toLocaleString();
156
+ md += `- **Timestamp**: ${ts}\n`;
157
+ }
158
+ if (beat.metadata?.narrative?.description) {
159
+ md += `\n**Description**:\n\n${escapeMarkdown(beat.metadata.narrative.description)}\n`;
160
+ }
161
+ if (beat.metadata?.narrative?.prose) {
162
+ md += `\n**Prose**:\n\n${escapeMarkdown(beat.metadata.narrative.prose)}\n`;
163
+ }
164
+ if (beat.metadata?.narrative?.lessons &&
165
+ beat.metadata.narrative.lessons.length > 0) {
166
+ md += `\n**Lessons**:\n\n`;
167
+ beat.metadata.narrative.lessons.forEach(lesson => {
168
+ md += `- ${escapeMarkdown(lesson)}\n`;
169
+ });
170
+ }
171
+ const dirs = beat.metadata?.fourDirections;
172
+ if (dirs &&
173
+ (dirs.north_vision ||
174
+ dirs.east_intention ||
175
+ dirs.south_emotion ||
176
+ dirs.west_introspection)) {
177
+ md += `\n**Four Directions**:\n\n`;
178
+ if (dirs.north_vision)
179
+ md += `- **North (Vision)**: ${escapeMarkdown(dirs.north_vision)}\n`;
180
+ if (dirs.east_intention)
181
+ md += `- **East (Intention)**: ${escapeMarkdown(dirs.east_intention)}\n`;
182
+ if (dirs.south_emotion)
183
+ md += `- **South (Emotion)**: ${escapeMarkdown(dirs.south_emotion)}\n`;
184
+ if (dirs.west_introspection)
185
+ md += `- **West (Introspection)**: ${escapeMarkdown(dirs.west_introspection)}\n`;
186
+ }
187
+ md += '\n';
188
+ });
189
+ }
190
+ return md;
191
+ }
192
+ // ─── All Charts Export ────────────────────────────────────────────────
193
+ export async function exportAllCharts(manager, options = {}) {
194
+ const graph = await manager.readGraph();
195
+ const { includeToc = true } = options;
196
+ const charts = graph.entities.filter(e => e.entityType === 'structural_tension_chart');
197
+ const masterCharts = charts.filter(c => c.metadata?.level === 0);
198
+ let md = '# Structural Tension Charts\n\n';
199
+ if (includeToc && masterCharts.length > 0) {
200
+ md += '## Table of Contents\n\n';
201
+ masterCharts.forEach(master => {
202
+ const cId = master.metadata?.chartId || master.name;
203
+ const slug = slugify(cId);
204
+ md += `- [${cId}](#${slug})\n`;
205
+ });
206
+ md += '\n---\n\n';
207
+ }
208
+ masterCharts.forEach((master, masterIdx) => {
209
+ const cId = master.metadata?.chartId || master.name;
210
+ md += `## ${cId}\n\n`;
211
+ const outcome = graph.entities.find(e => e.name === `${cId}_desired_outcome` &&
212
+ e.entityType === 'desired_outcome');
213
+ md += `**Desired Outcome**: ${outcome?.observations[0] || 'Unknown'}\n\n`;
214
+ const cr = graph.entities.find(e => e.name === `${cId}_current_reality` &&
215
+ e.entityType === 'current_reality');
216
+ if (cr && cr.observations.length > 0) {
217
+ md += `**Current Reality**: ${cr.observations[cr.observations.length - 1]}\n\n`;
218
+ }
219
+ const actionSteps = graph.entities.filter(e => e.entityType === 'action_step' && e.metadata?.chartId === cId);
220
+ const completed = actionSteps.filter(a => a.metadata?.completionStatus === true).length;
221
+ const total = actionSteps.length;
222
+ const progress = total > 0 ? completed / total : 0;
223
+ md += `**Progress**: ${formatProgressBar(progress)} (${completed}/${total})\n\n`;
224
+ if (master.metadata?.dueDate) {
225
+ md += `**Due**: ${formatDateForMarkdown(master.metadata.dueDate)}\n\n`;
226
+ }
227
+ const actionCharts = charts.filter(c => c.metadata?.parentChart === cId && c.metadata?.level === 1);
228
+ if (actionCharts.length > 0) {
229
+ md += '### Action Steps\n\n';
230
+ actionCharts.forEach(actionChart => {
231
+ const actionChartId = actionChart.metadata?.chartId;
232
+ const actionOutcome = graph.entities.find(e => e.name === `${actionChartId}_desired_outcome` &&
233
+ e.entityType === 'desired_outcome');
234
+ const actionActions = graph.entities.filter(e => e.entityType === 'action_step' &&
235
+ e.metadata?.chartId === actionChartId);
236
+ const actionCompleted = actionActions.filter(a => a.metadata?.completionStatus === true).length;
237
+ const actionTotal = actionActions.length;
238
+ const actionProgress = actionTotal > 0 ? actionCompleted / actionTotal : 0;
239
+ const isComplete = actionChart.metadata?.completionStatus === true;
240
+ const status = isComplete ? '✅' : actionProgress > 0 ? '🔄' : '⏳';
241
+ md += `- ${status} **${escapeMarkdown(actionOutcome?.observations[0] || 'Unknown')}**\n`;
242
+ md += ` - ID: ${actionChartId}\n`;
243
+ if (actionChart.metadata?.dueDate) {
244
+ md += ` - Due: ${formatDateForMarkdown(actionChart.metadata.dueDate)}\n`;
245
+ }
246
+ if (actionTotal > 0) {
247
+ md += ` - Progress: ${formatProgressBar(actionProgress)}\n`;
248
+ }
249
+ });
250
+ md += '\n';
251
+ }
252
+ if (masterIdx < masterCharts.length - 1) {
253
+ md += '---\n\n';
254
+ }
255
+ });
256
+ return md;
257
+ }
258
+ // ─── Progress Report ──────────────────────────────────────────────────
259
+ export async function exportChartProgress(chartId, manager) {
260
+ const graph = await manager.readGraph();
261
+ const chart = graph.entities.find(e => e.entityType === 'structural_tension_chart' &&
262
+ e.metadata?.chartId === chartId);
263
+ if (!chart) {
264
+ return `# Error\n\nChart '${chartId}' not found.`;
265
+ }
266
+ const outcome = graph.entities.find(e => e.name === `${chartId}_desired_outcome`);
267
+ const actions = graph.entities.filter(e => e.entityType === 'action_step' && e.metadata?.chartId === chartId);
268
+ const completed = actions.filter(a => a.metadata?.completionStatus === true);
269
+ const incomplete = actions.filter(a => a.metadata?.completionStatus !== true);
270
+ const progress = actions.length > 0 ? completed.length / actions.length : 0;
271
+ let md = `# Progress Report: ${chartId}\n\n`;
272
+ md += `**Goal**: ${outcome?.observations[0] || 'Unknown'}\n\n`;
273
+ md += `## Overall Progress\n\n`;
274
+ md += `${formatProgressBar(progress)}\n\n`;
275
+ md += '## Completed Actions\n\n';
276
+ if (completed.length > 0) {
277
+ completed.forEach((action, idx) => {
278
+ md += `${idx + 1}. ${escapeMarkdown(action.observations[0])}\n`;
279
+ if (action.metadata?.dueDate) {
280
+ md += ` - Completed: ${formatDateForMarkdown(action.metadata.dueDate)}\n`;
281
+ }
282
+ });
283
+ }
284
+ else {
285
+ md += '*No completed actions yet.*\n';
286
+ }
287
+ md += '\n';
288
+ md += '## Remaining Actions\n\n';
289
+ if (incomplete.length > 0) {
290
+ incomplete.forEach((action, idx) => {
291
+ md += `${idx + 1}. ${escapeMarkdown(action.observations[0])}\n`;
292
+ if (action.metadata?.dueDate) {
293
+ md += ` - Due: ${formatDateForMarkdown(action.metadata.dueDate)}\n`;
294
+ }
295
+ });
296
+ }
297
+ else {
298
+ md += '*All actions completed!*\n';
299
+ }
300
+ md += '\n';
301
+ const currentReality = graph.entities.find(e => e.name === `${chartId}_current_reality`);
302
+ if (currentReality && currentReality.observations.length > 0) {
303
+ md += '## Current Reality Notes\n\n';
304
+ currentReality.observations.slice(-5).forEach(obs => {
305
+ md += `- ${escapeMarkdown(obs)}\n`;
306
+ });
307
+ }
308
+ return md;
309
+ }
310
+ // ─── Statistics ───────────────────────────────────────────────────────
311
+ export async function exportChartStats(manager) {
312
+ const graph = await manager.readGraph();
313
+ const charts = graph.entities.filter(e => e.entityType === 'structural_tension_chart');
314
+ const masterCharts = charts.filter(c => c.metadata?.level === 0);
315
+ const actionCharts = charts.filter(c => c.metadata?.level === 1);
316
+ const allActions = graph.entities.filter(e => e.entityType === 'action_step');
317
+ const completedActions = allActions.filter(a => a.metadata?.completionStatus === true);
318
+ const narrativeBeats = graph.entities.filter(e => e.entityType === 'narrative_beat');
319
+ const overdueCharts = charts.filter(chart => {
320
+ if (!chart.metadata?.dueDate)
321
+ return false;
322
+ const dueDate = new Date(chart.metadata.dueDate);
323
+ return dueDate < new Date();
324
+ });
325
+ let md = '# Structural Tension Charts Statistics\n\n';
326
+ md += '## Overview\n\n';
327
+ md += `| Metric | Count |\n`;
328
+ md += `|--------|-------|\n`;
329
+ md += `| Master Charts | ${masterCharts.length} |\n`;
330
+ md += `| Action Step Charts | ${actionCharts.length} |\n`;
331
+ md += `| Total Charts | ${charts.length} |\n`;
332
+ md += `| Narrative Beats | ${narrativeBeats.length} |\n`;
333
+ md += '\n';
334
+ md += '## Completion Status\n\n';
335
+ md += `| Status | Count |\n`;
336
+ md += `|--------|-------|\n`;
337
+ md += `| Completed Actions | ${completedActions.length}/${allActions.length} |\n`;
338
+ const overallProgress = allActions.length > 0
339
+ ? Math.round((completedActions.length / allActions.length) * 100)
340
+ : 0;
341
+ md += `| Overall Progress | ${overallProgress}% |\n`;
342
+ md += '\n';
343
+ if (overdueCharts.length > 0) {
344
+ md += '## ⚠️ Overdue Charts\n\n';
345
+ overdueCharts.forEach((chart, idx) => {
346
+ const chartId = chart.metadata?.chartId || chart.name;
347
+ md += `${idx + 1}. **${chartId}** - Due: ${formatDateForMarkdown(chart.metadata?.dueDate)}\n`;
348
+ });
349
+ }
350
+ else {
351
+ md += '## ✅ Status\n\n';
352
+ md += 'All charts are on track!\n';
353
+ }
354
+ md += '\n';
355
+ return md;
356
+ }
357
+ // ─── File Output ──────────────────────────────────────────────────────
358
+ export async function writeMarkdownToFile(content, outputPath) {
359
+ const dir = path.dirname(outputPath);
360
+ try {
361
+ await fs.mkdir(dir, { recursive: true });
362
+ }
363
+ catch (_e) {
364
+ // Directory may exist
365
+ }
366
+ await fs.writeFile(outputPath, content, 'utf-8');
367
+ }
368
+ export function getDefaultFilename(exportType, chartId) {
369
+ const timestamp = new Date().toISOString().split('T')[0];
370
+ switch (exportType) {
371
+ case 'chart':
372
+ return `${chartId}-export-${timestamp}.md`;
373
+ case 'list':
374
+ return `structural-tension-charts-${timestamp}.md`;
375
+ case 'progress':
376
+ return `${chartId}-progress-${timestamp}.md`;
377
+ case 'stats':
378
+ return `statistics-${timestamp}.md`;
379
+ default:
380
+ return `export-${timestamp}.md`;
381
+ }
382
+ }
383
+ //# sourceMappingURL=markdown-export.js.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * COAIA Narrative - MCP Tool Definitions (Schemas)
3
+ *
4
+ * Pure data: array of MCP tool schema objects.
5
+ * No logic, no side effects — easy to review, test, and extend.
6
+ */
7
+ export interface ToolDefinition {
8
+ name: string;
9
+ description: string;
10
+ inputSchema: {
11
+ type: string;
12
+ properties: Record<string, unknown>;
13
+ required?: string[];
14
+ };
15
+ }
16
+ export declare const ALL_TOOL_DEFINITIONS: ToolDefinition[];
17
+ export declare const STC_TOOLS: readonly ["create_structural_tension_chart", "manage_action_step", "add_action_step", "telescope_action_step", "remove_action_step", "mark_action_complete", "get_chart_progress", "list_active_charts", "get_chart", "get_action_step", "update_action_progress", "update_current_reality", "update_desired_outcome", "perform_mmot_evaluation"];
18
+ export declare const NARRATIVE_TOOLS: readonly ["create_narrative_beat", "telescope_narrative_beat", "list_narrative_beats"];
19
+ export declare const KG_TOOLS: readonly ["create_entities", "create_relations", "add_observations", "delete_entities", "delete_observations", "delete_relations", "search_nodes", "open_nodes", "read_graph"];
20
+ export declare const CORE_TOOLS: readonly ["list_active_charts", "create_structural_tension_chart", "add_action_step", "mark_action_complete"];
21
+ //# sourceMappingURL=tool-definitions.d.ts.map