@pantion/dialogs 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dialogs/router/convergence-rules.md +160 -0
- package/dialogs/router/dialog.json +12 -0
- package/dialogs/router/translate.md +21 -0
- package/dialogs/software/convergence-rules.md +202 -15
- package/dialogs/software/prompts/convergence-intro.md +27 -15
- package/dist/core/feedback/aggregator.d.ts +7 -0
- package/dist/core/feedback/aggregator.d.ts.map +1 -0
- package/dist/core/feedback/aggregator.js +119 -0
- package/dist/core/feedback/aggregator.js.map +1 -0
- package/dist/core/feedback/store.d.ts +20 -0
- package/dist/core/feedback/store.d.ts.map +1 -0
- package/dist/core/feedback/store.js +111 -0
- package/dist/core/feedback/store.js.map +1 -0
- package/dist/core/feedback/suggestions.d.ts +5 -0
- package/dist/core/feedback/suggestions.d.ts.map +1 -0
- package/dist/core/feedback/suggestions.js +60 -0
- package/dist/core/feedback/suggestions.js.map +1 -0
- package/dist/core/feedback/types.d.ts +26 -0
- package/dist/core/feedback/types.d.ts.map +1 -0
- package/dist/core/feedback/types.js +2 -0
- package/dist/core/feedback/types.js.map +1 -0
- package/dist/core/index.d.ts +16 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +10 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/protocol/loader.d.ts +4 -0
- package/dist/core/protocol/loader.d.ts.map +1 -1
- package/dist/core/protocol/loader.js +16 -0
- package/dist/core/protocol/loader.js.map +1 -1
- package/dist/core/protocol/stamp-parser.d.ts.map +1 -1
- package/dist/core/protocol/stamp-parser.js +2 -1
- package/dist/core/protocol/stamp-parser.js.map +1 -1
- package/dist/core/protocol/system-prompt.d.ts +17 -0
- package/dist/core/protocol/system-prompt.d.ts.map +1 -1
- package/dist/core/protocol/system-prompt.js +63 -5
- package/dist/core/protocol/system-prompt.js.map +1 -1
- package/dist/core/router/classifier.d.ts +29 -0
- package/dist/core/router/classifier.d.ts.map +1 -0
- package/dist/core/router/classifier.js +160 -0
- package/dist/core/router/classifier.js.map +1 -0
- package/dist/core/router/context.d.ts +28 -0
- package/dist/core/router/context.d.ts.map +1 -0
- package/dist/core/router/context.js +65 -0
- package/dist/core/router/context.js.map +1 -0
- package/dist/core/router/menu.d.ts +18 -0
- package/dist/core/router/menu.d.ts.map +1 -0
- package/dist/core/router/menu.js +109 -0
- package/dist/core/router/menu.js.map +1 -0
- package/dist/core/router/next-actions.d.ts +17 -0
- package/dist/core/router/next-actions.d.ts.map +1 -0
- package/dist/core/router/next-actions.js +153 -0
- package/dist/core/router/next-actions.js.map +1 -0
- package/dist/core/router/types.d.ts +49 -0
- package/dist/core/router/types.d.ts.map +1 -0
- package/dist/core/router/types.js +8 -0
- package/dist/core/router/types.js.map +1 -0
- package/dist/core/types.d.ts +2 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/utils/datetime.d.ts +13 -0
- package/dist/core/utils/datetime.d.ts.map +1 -0
- package/dist/core/utils/datetime.js +17 -0
- package/dist/core/utils/datetime.js.map +1 -0
- package/dist/feature-set.d.ts.map +1 -1
- package/dist/feature-set.js +4 -0
- package/dist/feature-set.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/prompts/workflow-prompts.d.ts.map +1 -1
- package/dist/prompts/workflow-prompts.js +81 -1
- package/dist/prompts/workflow-prompts.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +6 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/amend.d.ts.map +1 -1
- package/dist/tools/amend.js +2 -2
- package/dist/tools/amend.js.map +1 -1
- package/dist/tools/approve.d.ts.map +1 -1
- package/dist/tools/approve.js +2 -2
- package/dist/tools/approve.js.map +1 -1
- package/dist/tools/build.d.ts +4 -0
- package/dist/tools/build.d.ts.map +1 -0
- package/dist/tools/build.js +200 -0
- package/dist/tools/build.js.map +1 -0
- package/dist/tools/check-convergence.d.ts.map +1 -1
- package/dist/tools/check-convergence.js +15 -1
- package/dist/tools/check-convergence.js.map +1 -1
- package/dist/tools/feedback.d.ts +4 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +51 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +9 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/learn.d.ts +4 -0
- package/dist/tools/learn.d.ts.map +1 -0
- package/dist/tools/learn.js +38 -0
- package/dist/tools/learn.js.map +1 -0
- package/dist/tools/reflect.d.ts.map +1 -1
- package/dist/tools/reflect.js +68 -1
- package/dist/tools/reflect.js.map +1 -1
- package/dist/tools/reject.d.ts.map +1 -1
- package/dist/tools/reject.js +2 -2
- package/dist/tools/reject.js.map +1 -1
- package/dist/tools/router.d.ts +10 -0
- package/dist/tools/router.d.ts.map +1 -0
- package/dist/tools/router.js +315 -0
- package/dist/tools/router.js.map +1 -0
- package/dist/tools/save-canon.d.ts.map +1 -1
- package/dist/tools/save-canon.js +28 -12
- package/dist/tools/save-canon.js.map +1 -1
- package/dist/tools/start.d.ts.map +1 -1
- package/dist/tools/start.js +20 -7
- package/dist/tools/start.js.map +1 -1
- package/dist/tools/translate.d.ts.map +1 -1
- package/dist/tools/translate.js +21 -4
- package/dist/tools/translate.js.map +1 -1
- package/package.json +1 -1
- package/protocol/commands/dialog-post.md +46 -0
- package/protocol/commands/dialog-stamps.md +67 -0
- package/protocol/commands/dialog.md +4 -98
- package/protocol/commands/start-post.md +53 -0
- package/protocol/commands/start-stamps.md +133 -0
- package/protocol/commands/start.md +20 -167
- package/protocol/core-save.md +102 -0
- package/protocol/core-stamps.md +97 -0
- 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;
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,WAAW,
|
|
1
|
+
{"version":3,"file":"check-convergence.js","sourceRoot":"","sources":["../../src/tools/check-convergence.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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;AAoDlD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAM7E"}
|
package/dist/tools/index.js
CHANGED
|
@@ -18,6 +18,10 @@ 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';
|
|
21
25
|
const TOOL_REGISTRY = [
|
|
22
26
|
['pantion_start', registerStart],
|
|
23
27
|
['pantion_check-convergence', registerCheckConvergence],
|
|
@@ -26,7 +30,7 @@ const TOOL_REGISTRY = [
|
|
|
26
30
|
['pantion_check', registerCheck],
|
|
27
31
|
['pantion_amend', registerAmend],
|
|
28
32
|
['pantion_resume', registerResume],
|
|
29
|
-
['
|
|
33
|
+
['pantion_reconverge', registerReconverge],
|
|
30
34
|
['pantion_list-canons', registerListCanons],
|
|
31
35
|
['pantion_create-dialog', registerCreateDialog],
|
|
32
36
|
['pantion_redialog', registerRedialog],
|
|
@@ -38,6 +42,10 @@ 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],
|
|
41
49
|
];
|
|
42
50
|
export function registerTools(server, context) {
|
|
43
51
|
for (const [name, register] of TOOL_REGISTRY) {
|
package/dist/tools/index.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/tools/reflect.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,QAAQ,EACR,cAAc,
|
|
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;
|
|
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"}
|
package/dist/tools/reject.js
CHANGED
|
@@ -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 =
|
|
25
|
+
const date = stampDateTime();
|
|
26
26
|
const newStamp = formatHumanStamp({
|
|
27
27
|
status: 'REJECTED',
|
|
28
28
|
date,
|
package/dist/tools/reject.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reject.js","sourceRoot":"","sources":["../../src/tools/reject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,cAAc,
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/tools/router.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAalD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+M9E"}
|