@pantion/dialogs 0.2.1 → 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 (132) hide show
  1. package/dialogs/router/convergence-rules.md +157 -0
  2. package/dialogs/router/dialog.json +12 -0
  3. package/dialogs/router/translate.md +21 -0
  4. package/dialogs/software/convergence-rules.md +202 -15
  5. package/dialogs/software/prompts/convergence-intro.md +27 -15
  6. package/dist/core/feedback/aggregator.d.ts +7 -0
  7. package/dist/core/feedback/aggregator.d.ts.map +1 -0
  8. package/dist/core/feedback/aggregator.js +119 -0
  9. package/dist/core/feedback/aggregator.js.map +1 -0
  10. package/dist/core/feedback/store.d.ts +20 -0
  11. package/dist/core/feedback/store.d.ts.map +1 -0
  12. package/dist/core/feedback/store.js +111 -0
  13. package/dist/core/feedback/store.js.map +1 -0
  14. package/dist/core/feedback/suggestions.d.ts +5 -0
  15. package/dist/core/feedback/suggestions.d.ts.map +1 -0
  16. package/dist/core/feedback/suggestions.js +60 -0
  17. package/dist/core/feedback/suggestions.js.map +1 -0
  18. package/dist/core/feedback/types.d.ts +26 -0
  19. package/dist/core/feedback/types.d.ts.map +1 -0
  20. package/dist/core/feedback/types.js +2 -0
  21. package/dist/core/feedback/types.js.map +1 -0
  22. package/dist/core/index.d.ts +16 -3
  23. package/dist/core/index.d.ts.map +1 -1
  24. package/dist/core/index.js +10 -2
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/protocol/loader.d.ts +4 -0
  27. package/dist/core/protocol/loader.d.ts.map +1 -1
  28. package/dist/core/protocol/loader.js +16 -0
  29. package/dist/core/protocol/loader.js.map +1 -1
  30. package/dist/core/protocol/stamp-parser.d.ts.map +1 -1
  31. package/dist/core/protocol/stamp-parser.js +2 -1
  32. package/dist/core/protocol/stamp-parser.js.map +1 -1
  33. package/dist/core/protocol/system-prompt.d.ts +17 -0
  34. package/dist/core/protocol/system-prompt.d.ts.map +1 -1
  35. package/dist/core/protocol/system-prompt.js +67 -5
  36. package/dist/core/protocol/system-prompt.js.map +1 -1
  37. package/dist/core/router/classifier.d.ts +29 -0
  38. package/dist/core/router/classifier.d.ts.map +1 -0
  39. package/dist/core/router/classifier.js +160 -0
  40. package/dist/core/router/classifier.js.map +1 -0
  41. package/dist/core/router/context.d.ts +28 -0
  42. package/dist/core/router/context.d.ts.map +1 -0
  43. package/dist/core/router/context.js +65 -0
  44. package/dist/core/router/context.js.map +1 -0
  45. package/dist/core/router/menu.d.ts +18 -0
  46. package/dist/core/router/menu.d.ts.map +1 -0
  47. package/dist/core/router/menu.js +109 -0
  48. package/dist/core/router/menu.js.map +1 -0
  49. package/dist/core/router/next-actions.d.ts +17 -0
  50. package/dist/core/router/next-actions.d.ts.map +1 -0
  51. package/dist/core/router/next-actions.js +153 -0
  52. package/dist/core/router/next-actions.js.map +1 -0
  53. package/dist/core/router/types.d.ts +49 -0
  54. package/dist/core/router/types.d.ts.map +1 -0
  55. package/dist/core/router/types.js +8 -0
  56. package/dist/core/router/types.js.map +1 -0
  57. package/dist/core/types.d.ts +2 -0
  58. package/dist/core/types.d.ts.map +1 -1
  59. package/dist/core/utils/datetime.d.ts +13 -0
  60. package/dist/core/utils/datetime.d.ts.map +1 -0
  61. package/dist/core/utils/datetime.js +17 -0
  62. package/dist/core/utils/datetime.js.map +1 -0
  63. package/dist/feature-set.d.ts.map +1 -1
  64. package/dist/feature-set.js +22 -14
  65. package/dist/feature-set.js.map +1 -1
  66. package/dist/index.js +3 -3
  67. package/dist/index.js.map +1 -1
  68. package/dist/prompts/convergence-prompts.js +1 -1
  69. package/dist/prompts/convergence-prompts.js.map +1 -1
  70. package/dist/prompts/workflow-prompts.d.ts.map +1 -1
  71. package/dist/prompts/workflow-prompts.js +92 -13
  72. package/dist/prompts/workflow-prompts.js.map +1 -1
  73. package/dist/server.d.ts.map +1 -1
  74. package/dist/server.js +8 -0
  75. package/dist/server.js.map +1 -1
  76. package/dist/tools/amend.d.ts.map +1 -1
  77. package/dist/tools/amend.js +2 -2
  78. package/dist/tools/amend.js.map +1 -1
  79. package/dist/tools/approve.d.ts.map +1 -1
  80. package/dist/tools/approve.js +2 -2
  81. package/dist/tools/approve.js.map +1 -1
  82. package/dist/tools/build.d.ts +4 -0
  83. package/dist/tools/build.d.ts.map +1 -0
  84. package/dist/tools/build.js +200 -0
  85. package/dist/tools/build.js.map +1 -0
  86. package/dist/tools/check-convergence.d.ts.map +1 -1
  87. package/dist/tools/check-convergence.js +15 -1
  88. package/dist/tools/check-convergence.js.map +1 -1
  89. package/dist/tools/feedback.d.ts +4 -0
  90. package/dist/tools/feedback.d.ts.map +1 -0
  91. package/dist/tools/feedback.js +51 -0
  92. package/dist/tools/feedback.js.map +1 -0
  93. package/dist/tools/index.d.ts.map +1 -1
  94. package/dist/tools/index.js +11 -2
  95. package/dist/tools/index.js.map +1 -1
  96. package/dist/tools/learn.d.ts +4 -0
  97. package/dist/tools/learn.d.ts.map +1 -0
  98. package/dist/tools/learn.js +38 -0
  99. package/dist/tools/learn.js.map +1 -0
  100. package/dist/tools/reflect.d.ts.map +1 -1
  101. package/dist/tools/reflect.js +68 -1
  102. package/dist/tools/reflect.js.map +1 -1
  103. package/dist/tools/reject.d.ts.map +1 -1
  104. package/dist/tools/reject.js +2 -2
  105. package/dist/tools/reject.js.map +1 -1
  106. package/dist/tools/router.d.ts +10 -0
  107. package/dist/tools/router.d.ts.map +1 -0
  108. package/dist/tools/router.js +315 -0
  109. package/dist/tools/router.js.map +1 -0
  110. package/dist/tools/save-canon.d.ts.map +1 -1
  111. package/dist/tools/save-canon.js +28 -12
  112. package/dist/tools/save-canon.js.map +1 -1
  113. package/dist/tools/start.d.ts.map +1 -1
  114. package/dist/tools/start.js +20 -7
  115. package/dist/tools/start.js.map +1 -1
  116. package/dist/tools/translate.d.ts.map +1 -1
  117. package/dist/tools/translate.js +21 -4
  118. package/dist/tools/translate.js.map +1 -1
  119. package/dist/tools/version.d.ts +4 -0
  120. package/dist/tools/version.d.ts.map +1 -0
  121. package/dist/tools/version.js +13 -0
  122. package/dist/tools/version.js.map +1 -0
  123. package/package.json +1 -1
  124. package/protocol/commands/dialog-post.md +46 -0
  125. package/protocol/commands/dialog-stamps.md +67 -0
  126. package/protocol/commands/dialog.md +4 -98
  127. package/protocol/commands/start-post.md +53 -0
  128. package/protocol/commands/start-stamps.md +133 -0
  129. package/protocol/commands/start.md +20 -167
  130. package/protocol/core-save.md +102 -0
  131. package/protocol/core-stamps.md +97 -0
  132. package/protocol/core.md +4 -191
@@ -0,0 +1,200 @@
1
+ import { z } from 'zod';
2
+ import { readdirSync, existsSync, statSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ import { readFileSafe, writeFile, ensureDir, canonDir, assertSafeName, extractConvergenceStamp, extractHumanStamp, extractCanonMetadata, stampDateTime, stampDate, } from '../core/index.js';
5
+ import { success, error } from '../utils/response.js';
6
+ export function registerBuild(server, context) {
7
+ server.tool('pantion_build', 'Initiate realization of a converged, approved, and translated canon. For software: returns build instructions with references to spec files and dialog. For image and other domains: returns the prompt/brief content with instructions for the external tool.', {
8
+ canon_name: z.string().describe('Name of the canon to build'),
9
+ project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
10
+ }, async ({ canon_name, project_path }) => {
11
+ try {
12
+ const projectPath = project_path ?? context.projectPath;
13
+ assertSafeName(canon_name);
14
+ const cDir = resolve(canonDir(projectPath), canon_name);
15
+ const dialogPath = resolve(cDir, 'dialog.md');
16
+ // Gate 1: Canon exists and is readable
17
+ const dialogContent = readFileSafe(dialogPath);
18
+ if (!dialogContent) {
19
+ return error(`Canon "${canon_name}" not found. Create and converge a canon first using pantion_start.`);
20
+ }
21
+ // Gate 2: Convergence stamp present and not DRAFT
22
+ const stamp = extractConvergenceStamp(dialogContent);
23
+ if (!stamp || stamp.type === 'draft') {
24
+ return error(`Canon "${canon_name}" is not converged (status: ${stamp?.type ?? 'no stamp'}). Complete the convergence dialog before building.`);
25
+ }
26
+ // Gate 3: HUMAN STAMP = APPROVED or AUTO-APPROVED
27
+ const humanStamp = extractHumanStamp(dialogContent);
28
+ if (!humanStamp || (humanStamp.status !== 'APPROVED' && humanStamp.status !== 'AUTO-APPROVED')) {
29
+ const currentStatus = humanStamp?.status ?? 'PENDING';
30
+ return error(`Canon "${canon_name}" is not approved (HUMAN STAMP status: ${currentStatus}). Use pantion_approve to approve the canon before building.`);
31
+ }
32
+ // Gate 4: Translate has been executed (spec/ or prompt.md/brief.md exist)
33
+ const specDir = resolve(cDir, 'spec');
34
+ const promptPath = resolve(cDir, 'prompt.md');
35
+ const briefPath = resolve(cDir, 'brief.md');
36
+ const hasSpec = existsSync(specDir) && readdirSync(specDir).length > 0;
37
+ const hasPrompt = existsSync(promptPath);
38
+ const hasBrief = existsSync(briefPath);
39
+ if (!hasSpec && !hasPrompt && !hasBrief) {
40
+ return error(`Canon "${canon_name}" has not been translated yet. Use pantion_translate to generate spec files before building.`);
41
+ }
42
+ // Detect domain via CANON METADATA DIALOG field
43
+ const metadata = extractCanonMetadata(dialogContent);
44
+ const domain = detectDomain(metadata?.dialog);
45
+ // Check for previous build and canon modification
46
+ const implDir = resolve(cDir, 'implementations');
47
+ const warnings = [];
48
+ const lastBuild = findLastBuildManifest(implDir);
49
+ if (lastBuild) {
50
+ const dialogStat = statSync(dialogPath);
51
+ const lastBuildTime = extractBuildDate(lastBuild.content);
52
+ if (lastBuildTime && dialogStat.mtimeMs > lastBuildTime.getTime()) {
53
+ warnings.push(`Canon "${canon_name}" has been modified since the last build on ${lastBuild.date}. Review changes before proceeding.`);
54
+ }
55
+ }
56
+ // Build response based on domain
57
+ const date = stampDateTime();
58
+ const dateForFilename = stampDate();
59
+ let buildResult;
60
+ if (domain === 'software') {
61
+ buildResult = buildSoftwareInstructions(cDir, canon_name, projectPath, hasSpec);
62
+ }
63
+ else {
64
+ // Image and all other domains: return prompt/brief content
65
+ buildResult = buildPromptInstructions(cDir, canon_name, domain, hasPrompt, hasBrief);
66
+ }
67
+ // Write build manifest
68
+ const manifestContent = generateBuildManifest({
69
+ canonName: canon_name,
70
+ domain,
71
+ date,
72
+ model: stamp.model,
73
+ humanStampStatus: humanStamp.status,
74
+ filesReferenced: buildResult.files_referenced ?? [],
75
+ });
76
+ ensureDir(implDir);
77
+ const manifestFilename = `${dateForFilename}-build.md`;
78
+ const manifestPath = resolve(implDir, manifestFilename);
79
+ writeFile(manifestPath, manifestContent);
80
+ return success({
81
+ ...buildResult,
82
+ domain,
83
+ manifest_path: `canon/${canon_name}/implementations/${manifestFilename}`,
84
+ }, warnings.length > 0 ? warnings : undefined);
85
+ }
86
+ catch (err) {
87
+ return error(err instanceof Error ? err.message : String(err));
88
+ }
89
+ });
90
+ }
91
+ function detectDomain(dialog) {
92
+ if (!dialog)
93
+ return 'software';
94
+ const lower = dialog.toLowerCase();
95
+ if (lower === 'image' || lower === 'image-prompt')
96
+ return 'image';
97
+ if (lower === 'video')
98
+ return 'video';
99
+ if (lower === 'music' || lower === 'muziek')
100
+ return 'music';
101
+ if (lower === 'software')
102
+ return 'software';
103
+ // Conservative default: non-software domains follow image pattern
104
+ // but return the actual domain name
105
+ return lower;
106
+ }
107
+ function buildSoftwareInstructions(cDir, canonName, projectPath, hasSpec) {
108
+ const filesReferenced = [];
109
+ // Always reference the dialog
110
+ filesReferenced.push(`canon/${canonName}/dialog.md`);
111
+ // Reference summary if it exists
112
+ const summaryPath = resolve(cDir, 'summary.md');
113
+ if (existsSync(summaryPath)) {
114
+ filesReferenced.push(`canon/${canonName}/summary.md`);
115
+ }
116
+ // Reference all spec files
117
+ if (hasSpec) {
118
+ const specDir = resolve(cDir, 'spec');
119
+ for (const file of readdirSync(specDir)) {
120
+ filesReferenced.push(`canon/${canonName}/spec/${file}`);
121
+ }
122
+ }
123
+ return {
124
+ type: 'software',
125
+ instruction: `Build the system described in canon "${canonName}". Read the following files for the complete specification, then implement accordingly.`,
126
+ files_referenced: filesReferenced,
127
+ };
128
+ }
129
+ function buildPromptInstructions(cDir, canonName, domain, hasPrompt, hasBrief) {
130
+ const filesReferenced = [];
131
+ let content = null;
132
+ if (hasPrompt) {
133
+ content = readFileSafe(resolve(cDir, 'prompt.md'));
134
+ filesReferenced.push(`canon/${canonName}/prompt.md`);
135
+ }
136
+ else if (hasBrief) {
137
+ content = readFileSafe(resolve(cDir, 'brief.md'));
138
+ filesReferenced.push(`canon/${canonName}/brief.md`);
139
+ }
140
+ // Also check spec files for non-software domains
141
+ const specDir = resolve(cDir, 'spec');
142
+ if (existsSync(specDir)) {
143
+ for (const file of readdirSync(specDir)) {
144
+ filesReferenced.push(`canon/${canonName}/spec/${file}`);
145
+ }
146
+ }
147
+ const toolHint = domain === 'image'
148
+ ? 'Copy this prompt to your image generation tool (DALL-E, Midjourney, Stable Diffusion, etc.).'
149
+ : `Use this prompt/brief with the appropriate ${domain} generation tool.`;
150
+ return {
151
+ type: 'prompt',
152
+ instruction: toolHint,
153
+ prompt_content: content,
154
+ files_referenced: filesReferenced,
155
+ };
156
+ }
157
+ function generateBuildManifest(input) {
158
+ const lines = [];
159
+ lines.push(`<!-- Derived from: canon/${input.canonName}/dialog.md, ${input.date} -->`);
160
+ lines.push('');
161
+ lines.push('# Build Manifest');
162
+ lines.push('');
163
+ lines.push('## Meta');
164
+ lines.push(`- **Canon**: ${input.canonName}`);
165
+ lines.push(`- **Domain**: ${input.domain}`);
166
+ lines.push(`- **Build Date**: ${input.date}`);
167
+ lines.push(`- **Model**: ${input.model ?? '[unknown]'}`);
168
+ lines.push(`- **HUMAN STAMP**: ${input.humanStampStatus}`);
169
+ lines.push('');
170
+ lines.push('## Files Referenced');
171
+ for (const file of input.filesReferenced) {
172
+ lines.push(`- ${file}`);
173
+ }
174
+ lines.push('');
175
+ return lines.join('\n');
176
+ }
177
+ function findLastBuildManifest(implDir) {
178
+ if (!existsSync(implDir))
179
+ return null;
180
+ const files = readdirSync(implDir)
181
+ .filter((f) => f.endsWith('-build.md'))
182
+ .sort()
183
+ .reverse();
184
+ if (files.length === 0)
185
+ return null;
186
+ const content = readFileSafe(resolve(implDir, files[0]));
187
+ if (!content)
188
+ return null;
189
+ // Extract date from filename (YYYY-MM-DD-build.md)
190
+ const dateMatch = files[0].match(/^(\d{4}-\d{2}-\d{2})/);
191
+ return { date: dateMatch?.[1] ?? 'unknown', content };
192
+ }
193
+ function extractBuildDate(manifestContent) {
194
+ const match = manifestContent.match(/\*\*Build Date\*\*:\s*(.+)/);
195
+ if (!match)
196
+ return null;
197
+ const date = new Date(match[1].trim());
198
+ return isNaN(date.getTime()) ? null : date;
199
+ }
200
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/tools/build.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"check-convergence.d.ts","sourceRoot":"","sources":["../../src/tools/check-convergence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAclD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+CxF"}
1
+ {"version":3,"file":"check-convergence.d.ts","sourceRoot":"","sources":["../../src/tools/check-convergence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAelD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA6DxF"}
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { validateConvergence, loadSession, saveSession, } from '../core/index.js';
2
+ import { validateConvergence, loadSession, saveSession, assembleDeferredPrompt, } from '../core/index.js';
3
3
  import { success, error } from '../utils/response.js';
4
4
  const messageSchema = z.object({
5
5
  role: z.enum(['user', 'assistant']),
@@ -23,6 +23,19 @@ export function registerCheckConvergence(server, context) {
23
23
  }
24
24
  saveSession(context.projectPath, session);
25
25
  }
26
+ // Load deferred stamp instructions so the LLM knows the stamp format
27
+ let deferredInstructions;
28
+ try {
29
+ const commandName = session?.promptMode ?? 'start';
30
+ deferredInstructions = assembleDeferredPrompt({
31
+ phase: 'stamps',
32
+ commandName,
33
+ protocolDir: context.protocolDir,
34
+ });
35
+ }
36
+ catch {
37
+ // Deferred loading is best-effort — check-convergence must never break
38
+ }
26
39
  return success({
27
40
  status: result.status,
28
41
  valid: result.valid,
@@ -40,6 +53,7 @@ export function registerCheckConvergence(server, context) {
40
53
  issues: result.issues,
41
54
  categories: result.categories,
42
55
  score: result.score,
56
+ ...(deferredInstructions ? { deferred_instructions: deferredInstructions } : {}),
43
57
  });
44
58
  }
45
59
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"check-convergence.js","sourceRoot":"","sources":["../../src/tools/check-convergence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check-convergence.js","sourceRoot":"","sources":["../../src/tools/check-convergence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ServerContext } from '../server.js';
3
+ export declare function registerFeedback(server: McpServer, context: ServerContext): void;
4
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOlD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAmDhF"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { assertSafeName, stampDateTime } from '../core/index.js';
3
+ import { appendFeedbackEntry } from '../core/feedback/store.js';
4
+ import { signalPatterns } from '../core/feedback/aggregator.js';
5
+ import { success, error } from '../utils/response.js';
6
+ export function registerFeedback(server, context) {
7
+ server.tool('pantion_feedback', 'Submit feedback on a convergence dialog. Records what was missed, insufficient, or wrongly assumed — feeding future convergences. Feedback is append-only and stored per canon.', {
8
+ canon_name: z.string().describe('Name of the canon this feedback relates to'),
9
+ project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
10
+ type: z.enum(['missed-question', 'insufficient-answer', 'unexpected-edge-case', 'wrong-assumption'])
11
+ .describe('Type of feedback'),
12
+ domain: z.string().describe('Domain of the feedback (e.g. "software", "image", "general")'),
13
+ severity: z.enum(['high', 'medium', 'low']).describe('Impact severity'),
14
+ description: z.string().describe('What went wrong or was missed'),
15
+ suggestion: z.string().describe('What should be done differently in future convergences'),
16
+ }, async ({ canon_name, project_path, type, domain, severity, description, suggestion }) => {
17
+ try {
18
+ const projectPath = project_path ?? context.projectPath;
19
+ assertSafeName(canon_name);
20
+ const entry = {
21
+ type,
22
+ domain,
23
+ severity,
24
+ description,
25
+ suggestion,
26
+ source: 'manual',
27
+ canonName: canon_name,
28
+ date: stampDateTime(),
29
+ };
30
+ const path = appendFeedbackEntry(projectPath, canon_name, entry);
31
+ // Lightweight pattern check (graceful — never fails the tool)
32
+ let patternSignal;
33
+ try {
34
+ patternSignal = signalPatterns(projectPath, canon_name, description);
35
+ }
36
+ catch {
37
+ // Ignore — signaling is best-effort
38
+ }
39
+ return success({
40
+ saved: true,
41
+ feedback_path: path,
42
+ ...(patternSignal ? { pattern_signal: patternSignal } : {}),
43
+ next_steps: 'Use pantion_learn to aggregate feedback into patterns. Multiple feedback entries from different canons strengthen pattern detection.',
44
+ });
45
+ }
46
+ catch (err) {
47
+ return error(err instanceof Error ? err.message : String(err));
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/tools/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAoB,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,OAAsB;IACxE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,iLAAiL,EACjL;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAC7E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QACnG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;aACjG,QAAQ,CAAC,kBAAkB,CAAC;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QAC3F,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACvE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QACjE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;KAC1F,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE;QACtF,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;YACxD,cAAc,CAAC,UAAU,CAAC,CAAC;YAE3B,MAAM,KAAK,GAAkB;gBAC3B,IAAI;gBACJ,MAAM;gBACN,QAAQ;gBACR,WAAW;gBACX,UAAU;gBACV,MAAM,EAAE,QAAQ;gBAChB,SAAS,EAAE,UAAU;gBACrB,IAAI,EAAE,aAAa,EAAE;aACtB,CAAC;YAEF,MAAM,IAAI,GAAG,mBAAmB,CAAC,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAEjE,8DAA8D;YAC9D,IAAI,aAAiC,CAAC;YACtC,IAAI,CAAC;gBACH,aAAa,GAAG,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YACvE,CAAC;YAAC,MAAM,CAAC;gBACP,oCAAoC;YACtC,CAAC;YAED,OAAO,OAAO,CAAC;gBACb,KAAK,EAAE,IAAI;gBACX,aAAa,EAAE,IAAI;gBACnB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,UAAU,EAAE,sIAAsI;aACnJ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA4ClD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAM7E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAqDlD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAM7E"}
@@ -9,7 +9,7 @@ import { registerResume } from './resume.js';
9
9
  import { registerListCanons } from './list-canons.js';
10
10
  import { registerReconverge } from './reconverge.js';
11
11
  import { registerCreateDialog } from './create-dialog.js';
12
- import { registerRedialog } from './redialog.js';
12
+ // import { registerRedialog } from './redialog.js'; // replaced by registerReconverge
13
13
  import { registerDecompose } from './decompose.js';
14
14
  import { registerReverse } from './reverse.js';
15
15
  import { registerOnboard } from './onboard.js';
@@ -18,6 +18,11 @@ import { registerMigrate } from './migrate.js';
18
18
  import { registerApprove } from './approve.js';
19
19
  import { registerReject } from './reject.js';
20
20
  import { registerReflect } from './reflect.js';
21
+ import { registerFeedback } from './feedback.js';
22
+ import { registerLearn } from './learn.js';
23
+ import { registerRouter } from './router.js';
24
+ import { registerBuild } from './build.js';
25
+ import { registerVersion } from './version.js';
21
26
  const TOOL_REGISTRY = [
22
27
  ['pantion_start', registerStart],
23
28
  ['pantion_check-convergence', registerCheckConvergence],
@@ -29,7 +34,6 @@ const TOOL_REGISTRY = [
29
34
  ['pantion_redialog', registerReconverge],
30
35
  ['pantion_list-canons', registerListCanons],
31
36
  ['pantion_create-dialog', registerCreateDialog],
32
- ['pantion_redialog', registerRedialog],
33
37
  ['pantion_decompose', registerDecompose],
34
38
  ['pantion_reverse', registerReverse],
35
39
  ['pantion_onboard', registerOnboard],
@@ -38,6 +42,11 @@ const TOOL_REGISTRY = [
38
42
  ['pantion_approve', registerApprove],
39
43
  ['pantion_reject', registerReject],
40
44
  ['pantion_reflect', registerReflect],
45
+ ['pantion_feedback', registerFeedback],
46
+ ['pantion_learn', registerLearn],
47
+ ['pantion_router', registerRouter],
48
+ ['pantion_build', registerBuild],
49
+ ['pantion_version', registerVersion],
41
50
  ];
42
51
  export function registerTools(server, context) {
43
52
  for (const [name, register] of TOOL_REGISTRY) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,aAAa,GAAyE;IAC1F,CAAC,eAAe,EAAE,aAAa,CAAC;IAChC,CAAC,2BAA2B,EAAE,wBAAwB,CAAC;IACvD,CAAC,oBAAoB,EAAE,iBAAiB,CAAC;IACzC,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;IACxC,CAAC,eAAe,EAAE,aAAa,CAAC;IAChC,CAAC,eAAe,EAAE,aAAa,CAAC;IAChC,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAClC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IACxC,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;IAC3C,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;IAC/C,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IACtC,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;IACxC,CAAC,iBAAiB,EAAE,eAAe,CAAC;IACpC,CAAC,iBAAiB,EAAE,eAAe,CAAC;IACpC,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAClC,CAAC,iBAAiB,EAAE,eAAe,CAAC;IACpC,CAAC,iBAAiB,EAAE,eAAe,CAAC;IACpC,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAClC,CAAC,iBAAiB,EAAE,eAAe,CAAC;CACrC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,OAAsB;IACrE,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC;QAC7C,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ServerContext } from '../server.js';
3
+ export declare function registerLearn(server: McpServer, context: ServerContext): void;
4
+ //# sourceMappingURL=learn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.d.ts","sourceRoot":"","sources":["../../src/tools/learn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAuC7E"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ import { aggregateFeedback } from '../core/feedback/aggregator.js';
3
+ import { readFeedbackConfig } from '../core/feedback/store.js';
4
+ import { success, error } from '../utils/response.js';
5
+ export function registerLearn(server, context) {
6
+ server.tool('pantion_learn', 'Aggregate feedback from all canons into learned patterns. Scans all feedback.md files, detects recurring patterns (threshold: 2+ occurrences), and writes patterns.md. Patterns require human approval before they influence future convergences.', {
7
+ project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
8
+ scope: z.enum(['project-and-global', 'project-only']).optional()
9
+ .describe('Override scope for this run (defaults to config or project-and-global)'),
10
+ }, async ({ project_path, scope }) => {
11
+ try {
12
+ const projectPath = project_path ?? context.projectPath;
13
+ const config = readFeedbackConfig(projectPath);
14
+ const effectiveScope = scope ?? config.scope;
15
+ const rules = aggregateFeedback(projectPath);
16
+ return success({
17
+ patterns_found: rules.length,
18
+ rules_proposed: rules.filter((r) => !r.approved).length,
19
+ rules: rules.map((r) => ({
20
+ pattern: r.pattern,
21
+ rule: r.rule,
22
+ domain: r.domain,
23
+ sources: r.sources,
24
+ approved: r.approved,
25
+ })),
26
+ scope: effectiveScope,
27
+ human_approval_required: rules.some((r) => !r.approved),
28
+ next_steps: rules.length > 0
29
+ ? 'Review proposed patterns in .pantion/feedback/patterns.md. Edit [PROPOSED] to [APPROVED] for rules you want applied to future convergences.'
30
+ : 'No patterns detected yet. Submit more feedback via pantion_feedback or pantion_reflect to build up pattern data.',
31
+ });
32
+ }
33
+ catch (err) {
34
+ return error(err instanceof Error ? err.message : String(err));
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=learn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learn.js","sourceRoot":"","sources":["../../src/tools/learn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,OAAsB;IACrE,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mPAAmP,EACnP;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QACnG,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,oBAAoB,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE;aAC7D,QAAQ,CAAC,wEAAwE,CAAC;KACtF,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;YAExD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;YAE7C,MAAM,KAAK,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAE7C,OAAO,OAAO,CAAC;gBACb,cAAc,EAAE,KAAK,CAAC,MAAM;gBAC5B,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM;gBACvD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,MAAM,EAAE,CAAC,CAAC,MAAM;oBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;iBACrB,CAAC,CAAC;gBACH,KAAK,EAAE,cAAc;gBACrB,uBAAuB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACvD,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;oBAC1B,CAAC,CAAC,6IAA6I;oBAC/I,CAAC,CAAC,kHAAkH;aACvH,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAmElD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+C/E"}
1
+ {"version":3,"file":"reflect.d.ts","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA8HlD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAiE/E"}
@@ -1,6 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import { resolve } from 'node:path';
3
- import { appendRealityConvergence, readFileSafe, canonDir, readCanonIndex, } from '../core/index.js';
3
+ import { appendRealityConvergence, readFileSafe, canonDir, readCanonIndex, stampDateTime, } from '../core/index.js';
4
+ import { appendFeedbackEntry } from '../core/feedback/store.js';
5
+ import { signalPatterns } from '../core/feedback/aggregator.js';
4
6
  import { success, error } from '../utils/response.js';
5
7
  const messageSchema = z.object({
6
8
  role: z.enum(['user', 'assistant']),
@@ -49,6 +51,53 @@ function analyzeImpact(canonName, projectPath) {
49
51
  consistency_warning: consistencyWarning,
50
52
  };
51
53
  }
54
+ // --- Feedback extraction from reflection dialog ---
55
+ const CLASS_TO_FEEDBACK_TYPE = {
56
+ 'intent-mismatch': 'wrong-assumption',
57
+ 'unknown-unknown': 'missed-question',
58
+ 'insufficient-spec': 'insufficient-answer',
59
+ 'edge-case': 'unexpected-edge-case',
60
+ 'assumption-wrong': 'wrong-assumption',
61
+ 'missing-requirement': 'missed-question',
62
+ };
63
+ function extractFeedbackFromReflection(dialog, canonName) {
64
+ const entries = [];
65
+ const today = stampDateTime();
66
+ for (const msg of dialog) {
67
+ if (msg.role !== 'assistant')
68
+ continue;
69
+ // Look for CLASS markers in the reflection
70
+ const classMatches = msg.content.matchAll(/CLASS:\s*(\S+)/gi);
71
+ for (const match of classMatches) {
72
+ const className = match[1].toLowerCase();
73
+ const feedbackType = CLASS_TO_FEEDBACK_TYPE[className];
74
+ if (!feedbackType)
75
+ continue;
76
+ // Extract surrounding context as description
77
+ const lineIndex = msg.content.indexOf(match[0]);
78
+ const contextStart = Math.max(0, lineIndex - 200);
79
+ const contextEnd = Math.min(msg.content.length, lineIndex + 200);
80
+ const context = msg.content.slice(contextStart, contextEnd).trim();
81
+ // Try to extract a severity hint
82
+ let severity = 'medium';
83
+ if (/critical|severe|high/i.test(context))
84
+ severity = 'high';
85
+ else if (/minor|low|trivial/i.test(context))
86
+ severity = 'low';
87
+ entries.push({
88
+ type: feedbackType,
89
+ domain: 'general',
90
+ severity,
91
+ description: `Detected during reflection: ${className}`,
92
+ suggestion: `Address ${className} pattern in future convergences`,
93
+ source: 'reflect',
94
+ canonName,
95
+ date: today,
96
+ });
97
+ }
98
+ }
99
+ return entries;
100
+ }
52
101
  export function registerReflect(server, context) {
53
102
  server.tool('pantion_reflect', 'Append a Reality Convergence block to an existing canon. Captures empirical observations from a built implementation. Observational only — records, classifies, and creates open questions but does NOT modify intent. Intent changes require a separate pantion_amend.', {
54
103
  canon_name: z.string().describe('Name of the canon to reflect on'),
@@ -67,6 +116,22 @@ export function registerReflect(server, context) {
67
116
  // Intent changes require a separate pantion_amend with HUMAN STAMP approval.
68
117
  // NOTE: Reality Convergence does NOT change the canon lifecycle status.
69
118
  // The canon remains CONVERGED/AMENDED/etc. The REALITY STAMP is an overlay.
119
+ // --- Feedback extraction (graceful — never breaks reflect) ---
120
+ let feedbackSignals = 0;
121
+ let patternSignal;
122
+ try {
123
+ const feedbackEntries = extractFeedbackFromReflection(reflection_dialog, canon_name);
124
+ for (const entry of feedbackEntries) {
125
+ appendFeedbackEntry(projectPath, canon_name, entry);
126
+ feedbackSignals++;
127
+ }
128
+ if (feedbackSignals > 0) {
129
+ patternSignal = signalPatterns(projectPath, canon_name, reflection_dialog.map((m) => m.content).join(' '));
130
+ }
131
+ }
132
+ catch {
133
+ // Feedback extraction is best-effort — reflect must never break
134
+ }
70
135
  return success({
71
136
  appended: true,
72
137
  canon_path: canonPath,
@@ -75,6 +140,8 @@ export function registerReflect(server, context) {
75
140
  files_to_regenerate: impact.files_to_regenerate.length > 0 ? impact.files_to_regenerate : undefined,
76
141
  consistency_warning: impact.consistency_warning,
77
142
  },
143
+ ...(feedbackSignals > 0 ? { feedback_signals: feedbackSignals } : {}),
144
+ ...(patternSignal ? { pattern_signal: patternSignal } : {}),
78
145
  next_steps: 'Review observations and open questions. Use pantion_amend to apply intent changes where needed (requires HUMAN STAMP approval).',
79
146
  });
80
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reflect.js","sourceRoot":"","sources":["../../src/tools/reflect.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"reject.d.ts","sourceRoot":"","sources":["../../src/tools/reject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAclD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA6D9E"}
1
+ {"version":3,"file":"reject.d.ts","sourceRoot":"","sources":["../../src/tools/reject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAelD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA6D9E"}
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { resolve } from 'node:path';
3
- import { readFileSafe, canonDir, extractConvergenceStamp, extractHumanStamp, formatHumanStamp, replaceHumanStamp, writeFile, assertSafeName, } from '../core/index.js';
3
+ import { readFileSafe, canonDir, extractConvergenceStamp, extractHumanStamp, formatHumanStamp, replaceHumanStamp, writeFile, assertSafeName, stampDateTime, } from '../core/index.js';
4
4
  import { success, error } from '../utils/response.js';
5
5
  export function registerReject(server, context) {
6
6
  server.tool('pantion_reject', 'Reject a converged canon. Fills in the HUMAN STAMP with REJECTED status. A rejected canon can be approved later after changes (amend/redialog).', {
@@ -22,7 +22,7 @@ export function registerReject(server, context) {
22
22
  if (!stamp || stamp.type === 'draft') {
23
23
  return error('Canon is not converged. Only converged canons can be rejected.');
24
24
  }
25
- const date = new Date().toISOString().split('T')[0];
25
+ const date = stampDateTime();
26
26
  const newStamp = formatHumanStamp({
27
27
  status: 'REJECTED',
28
28
  date,
@@ -1 +1 @@
1
- {"version":3,"file":"reject.js","sourceRoot":"","sources":["../../src/tools/reject.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reject.js","sourceRoot":"","sources":["../../src/tools/reject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * pantion_router — single-entry MCP tool that routes user intent
3
+ * to the correct Pantion tool.
4
+ *
5
+ * Pure decision function: read-only, stateless, no side-effects.
6
+ */
7
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
+ import type { ServerContext } from '../server.js';
9
+ export declare function registerRouter(server: McpServer, context: ServerContext): void;
10
+ //# sourceMappingURL=router.d.ts.map