@pantion/mcp-server 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.
- package/dist/feature-set.d.ts +14 -0
- package/dist/feature-set.d.ts.map +1 -0
- package/dist/feature-set.js +38 -0
- package/dist/feature-set.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/convergence-prompts.d.ts +4 -0
- package/dist/prompts/convergence-prompts.d.ts.map +1 -0
- package/dist/prompts/convergence-prompts.js +76 -0
- package/dist/prompts/convergence-prompts.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +7 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/workflow-prompts.d.ts +9 -0
- package/dist/prompts/workflow-prompts.d.ts.map +1 -0
- package/dist/prompts/workflow-prompts.js +249 -0
- package/dist/prompts/workflow-prompts.js.map +1 -0
- package/dist/resources/canon-resources.d.ts +4 -0
- package/dist/resources/canon-resources.d.ts.map +1 -0
- package/dist/resources/canon-resources.js +160 -0
- package/dist/resources/canon-resources.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +47 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/amend.d.ts +4 -0
- package/dist/tools/amend.d.ts.map +1 -0
- package/dist/tools/amend.js +106 -0
- package/dist/tools/amend.js.map +1 -0
- package/dist/tools/approve.d.ts +4 -0
- package/dist/tools/approve.d.ts.map +1 -0
- package/dist/tools/approve.js +60 -0
- package/dist/tools/approve.js.map +1 -0
- package/dist/tools/check-convergence.d.ts +4 -0
- package/dist/tools/check-convergence.d.ts.map +1 -0
- package/dist/tools/check-convergence.js +50 -0
- package/dist/tools/check-convergence.js.map +1 -0
- package/dist/tools/check.d.ts +4 -0
- package/dist/tools/check.d.ts.map +1 -0
- package/dist/tools/check.js +190 -0
- package/dist/tools/check.js.map +1 -0
- package/dist/tools/create-skill.d.ts +4 -0
- package/dist/tools/create-skill.d.ts.map +1 -0
- package/dist/tools/create-skill.js +58 -0
- package/dist/tools/create-skill.js.map +1 -0
- package/dist/tools/decompose.d.ts +4 -0
- package/dist/tools/decompose.d.ts.map +1 -0
- package/dist/tools/decompose.js +56 -0
- package/dist/tools/decompose.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +47 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-canons.d.ts +4 -0
- package/dist/tools/list-canons.d.ts.map +1 -0
- package/dist/tools/list-canons.js +28 -0
- package/dist/tools/list-canons.js.map +1 -0
- package/dist/tools/migrate.d.ts +4 -0
- package/dist/tools/migrate.d.ts.map +1 -0
- package/dist/tools/migrate.js +38 -0
- package/dist/tools/migrate.js.map +1 -0
- package/dist/tools/onboard.d.ts +4 -0
- package/dist/tools/onboard.d.ts.map +1 -0
- package/dist/tools/onboard.js +27 -0
- package/dist/tools/onboard.js.map +1 -0
- package/dist/tools/reconverge.d.ts +4 -0
- package/dist/tools/reconverge.d.ts.map +1 -0
- package/dist/tools/reconverge.js +68 -0
- package/dist/tools/reconverge.js.map +1 -0
- package/dist/tools/reject.d.ts +4 -0
- package/dist/tools/reject.d.ts.map +1 -0
- package/dist/tools/reject.js +57 -0
- package/dist/tools/reject.js.map +1 -0
- package/dist/tools/reskill.d.ts +4 -0
- package/dist/tools/reskill.d.ts.map +1 -0
- package/dist/tools/reskill.js +63 -0
- package/dist/tools/reskill.js.map +1 -0
- package/dist/tools/resume.d.ts +4 -0
- package/dist/tools/resume.d.ts.map +1 -0
- package/dist/tools/resume.js +56 -0
- package/dist/tools/resume.js.map +1 -0
- package/dist/tools/reverse.d.ts +4 -0
- package/dist/tools/reverse.d.ts.map +1 -0
- package/dist/tools/reverse.js +32 -0
- package/dist/tools/reverse.js.map +1 -0
- package/dist/tools/save-canon.d.ts +4 -0
- package/dist/tools/save-canon.d.ts.map +1 -0
- package/dist/tools/save-canon.js +97 -0
- package/dist/tools/save-canon.js.map +1 -0
- package/dist/tools/start.d.ts +4 -0
- package/dist/tools/start.d.ts.map +1 -0
- package/dist/tools/start.js +83 -0
- package/dist/tools/start.js.map +1 -0
- package/dist/tools/translate.d.ts +4 -0
- package/dist/tools/translate.d.ts.map +1 -0
- package/dist/tools/translate.js +102 -0
- package/dist/tools/translate.js.map +1 -0
- package/dist/tools/update.d.ts +4 -0
- package/dist/tools/update.d.ts.map +1 -0
- package/dist/tools/update.js +42 -0
- package/dist/tools/update.js.map +1 -0
- package/dist/utils/response.d.ts +12 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +18 -0
- package/dist/utils/response.js.map +1 -0
- package/package.json +37 -0
- package/protocol/commands/amend.md +188 -0
- package/protocol/commands/build.md +90 -0
- package/protocol/commands/check.md +255 -0
- package/protocol/commands/create-skill.md +81 -0
- package/protocol/commands/decompose.md +230 -0
- package/protocol/commands/dialog.md +173 -0
- package/protocol/commands/help.md +121 -0
- package/protocol/commands/migrate.md +173 -0
- package/protocol/commands/onboard.md +210 -0
- package/protocol/commands/quick.md +170 -0
- package/protocol/commands/redialog.md +252 -0
- package/protocol/commands/reskill.md +73 -0
- package/protocol/commands/resume.md +148 -0
- package/protocol/commands/reverse.md +312 -0
- package/protocol/commands/start.md +220 -0
- package/protocol/commands/translate.md +157 -0
- package/protocol/commands/update.md +205 -0
- package/protocol/commands/validate.md +137 -0
- package/protocol/core-advanced.md +188 -0
- package/protocol/core.md +273 -0
- package/protocol/pantion-future-prompt.md +88 -0
- package/protocol/pantion-intent.md +78 -0
- package/protocol/templates/acceptance-tests.md +116 -0
- package/protocol/templates/behavior-map.md +135 -0
- package/protocol/templates/traceability-map.md +56 -0
- package/skills/image/convergence-rules.md +55 -0
- package/skills/image/prompts/convergence-intro.md +25 -0
- package/skills/image/prompts/translate-intro.md +37 -0
- package/skills/image/skill.json +12 -0
- package/skills/image/translate.md +67 -0
- package/skills/skill-builder/convergence-rules.md +64 -0
- package/skills/skill-builder/prompts/convergence-intro.md +21 -0
- package/skills/skill-builder/prompts/translate-intro.md +17 -0
- package/skills/skill-builder/skill.json +10 -0
- package/skills/skill-builder/translate.md +46 -0
- package/skills/software/convergence-rules.md +29 -0
- package/skills/software/prompts/convergence-intro.md +22 -0
- package/skills/software/prompts/translate-intro.md +19 -0
- package/skills/software/skill.json +12 -0
- package/skills/software/translate.md +74 -0
- package/skills/software-brownfield/convergence-rules.md +109 -0
- package/skills/software-brownfield/prompts/convergence-intro.md +26 -0
- package/skills/software-brownfield/prompts/translate-intro.md +13 -0
- package/skills/software-brownfield/skill.json +12 -0
- package/skills/software-brownfield/translate.md +56 -0
- package/souls/beginner/rules.md +34 -0
- package/souls/beginner/soul.json +6 -0
- package/souls/default/rules.md +25 -0
- package/souls/default/soul.json +6 -0
- package/souls/young/rules.md +67 -0
- package/souls/young/soul.json +6 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { readFileSafe, canonDir, extractConvergenceStamp, extractHumanStamp, formatHumanStamp, replaceHumanStamp, writeFile, assembleSystemPrompt, createSession, saveSession, assertSafeName, } from '@pantion/core';
|
|
4
|
+
import { success, error } from '../utils/response.js';
|
|
5
|
+
export function registerReconverge(server, context) {
|
|
6
|
+
server.tool('pantion_redialog', 'Re-evaluate an existing converged canon with a better model. Reads the dialog, provides gap analysis instructions, and creates a session for supplementary convergence.', {
|
|
7
|
+
canon_name: z.string().describe('Name of the canon to redialog'),
|
|
8
|
+
project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
|
|
9
|
+
}, async ({ canon_name, project_path }) => {
|
|
10
|
+
try {
|
|
11
|
+
const projectPath = project_path ?? context.projectPath;
|
|
12
|
+
assertSafeName(canon_name);
|
|
13
|
+
const dir = canonDir(projectPath);
|
|
14
|
+
const dialogPath = resolve(dir, canon_name, 'dialog.md');
|
|
15
|
+
const dialog = readFileSafe(dialogPath);
|
|
16
|
+
if (!dialog) {
|
|
17
|
+
return error(`Canon dialog not found: ${dialogPath}`);
|
|
18
|
+
}
|
|
19
|
+
const stamp = extractConvergenceStamp(dialog);
|
|
20
|
+
if (!stamp) {
|
|
21
|
+
return error('No convergence stamp found. This canon may be a DRAFT — use pantion_resume instead.');
|
|
22
|
+
}
|
|
23
|
+
if (stamp.type === 'draft') {
|
|
24
|
+
return error('Canon is still a DRAFT. Use pantion_resume to finish converging first, then reconverge.');
|
|
25
|
+
}
|
|
26
|
+
// Extract the raw STATUS value from the stamp for display
|
|
27
|
+
const statusMatch = stamp.raw.match(/STATUS:\s*(.+)/);
|
|
28
|
+
const displayStatus = statusMatch ? statusMatch[1].trim() : stamp.type;
|
|
29
|
+
// Extract inference policy from stamp
|
|
30
|
+
const inferencePolicy = stamp.inferencePolicy;
|
|
31
|
+
// Assemble reconverge system prompt
|
|
32
|
+
const convergenceInstructions = assembleSystemPrompt({
|
|
33
|
+
mode: 'reconverge',
|
|
34
|
+
existingDialog: dialog,
|
|
35
|
+
canonName: canon_name,
|
|
36
|
+
protocolDir: context.protocolDir,
|
|
37
|
+
inferencePolicy: inferencePolicy === 'strict' ? 'strict' : undefined,
|
|
38
|
+
});
|
|
39
|
+
// Reset HUMAN STAMP to PENDING (reconvergence invalidates previous approval)
|
|
40
|
+
let humanStampReset = false;
|
|
41
|
+
const humanStamp = extractHumanStamp(dialog);
|
|
42
|
+
if (humanStamp && humanStamp.status !== 'PENDING') {
|
|
43
|
+
const pendingStamp = formatHumanStamp({ status: 'PENDING' });
|
|
44
|
+
const resetContent = replaceHumanStamp(dialog, pendingStamp);
|
|
45
|
+
if (resetContent) {
|
|
46
|
+
writeFile(dialogPath, resetContent);
|
|
47
|
+
humanStampReset = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Create a new session for the reconvergence work
|
|
51
|
+
const session = createSession(projectPath, `reconverge-${canon_name}`, convergenceInstructions);
|
|
52
|
+
session.canonName = canon_name;
|
|
53
|
+
saveSession(projectPath, session);
|
|
54
|
+
return success({
|
|
55
|
+
dialog,
|
|
56
|
+
current_status: displayStatus,
|
|
57
|
+
session_id: session.id,
|
|
58
|
+
human_stamp_reset: humanStampReset || undefined,
|
|
59
|
+
convergence_instructions: convergenceInstructions,
|
|
60
|
+
message: `Canon "${canon_name}" loaded for reconvergence. Status: ${displayStatus}. Analyze the dialog for gaps before conducting supplementary convergence.`,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=reconverge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconverge.js","sourceRoot":"","sources":["../../src/tools/reconverge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { readFileSafe, canonDir, extractConvergenceStamp, extractHumanStamp, formatHumanStamp, replaceHumanStamp, writeFile, assertSafeName, } from '@pantion/core';
|
|
4
|
+
import { success, error } from '../utils/response.js';
|
|
5
|
+
export function registerReject(server, context) {
|
|
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).', {
|
|
7
|
+
canon_name: z.string().describe('Name of the canon to reject'),
|
|
8
|
+
role: z.string().describe('Role of the reviewer (e.g. "Product Owner", "Opdrachtgever")'),
|
|
9
|
+
note: z.string().optional().describe('Optional note explaining the rejection'),
|
|
10
|
+
project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
|
|
11
|
+
}, async ({ canon_name, role, note, project_path }) => {
|
|
12
|
+
try {
|
|
13
|
+
const projectPath = project_path ?? context.projectPath;
|
|
14
|
+
assertSafeName(canon_name);
|
|
15
|
+
const dir = canonDir(projectPath);
|
|
16
|
+
const dialogPath = resolve(dir, canon_name, 'dialog.md');
|
|
17
|
+
const content = readFileSafe(dialogPath);
|
|
18
|
+
if (!content) {
|
|
19
|
+
return error(`Canon dialog not found: ${canon_name}`);
|
|
20
|
+
}
|
|
21
|
+
const stamp = extractConvergenceStamp(content);
|
|
22
|
+
if (!stamp || stamp.type === 'draft') {
|
|
23
|
+
return error('Canon is not converged. Only converged canons can be rejected.');
|
|
24
|
+
}
|
|
25
|
+
const date = new Date().toISOString().split('T')[0];
|
|
26
|
+
const newStamp = formatHumanStamp({
|
|
27
|
+
status: 'REJECTED',
|
|
28
|
+
date,
|
|
29
|
+
role,
|
|
30
|
+
note: note ?? '[not set]',
|
|
31
|
+
});
|
|
32
|
+
let updated;
|
|
33
|
+
const humanStamp = extractHumanStamp(content);
|
|
34
|
+
if (humanStamp) {
|
|
35
|
+
updated = replaceHumanStamp(content, newStamp);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
updated = content + '\n\n' + newStamp + '\n';
|
|
39
|
+
}
|
|
40
|
+
if (!updated) {
|
|
41
|
+
return error('Failed to update HUMAN STAMP in dialog file.');
|
|
42
|
+
}
|
|
43
|
+
writeFile(dialogPath, updated);
|
|
44
|
+
return success({
|
|
45
|
+
rejected: true,
|
|
46
|
+
canon_name,
|
|
47
|
+
date,
|
|
48
|
+
role,
|
|
49
|
+
note: note ?? undefined,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=reject.js.map
|
|
@@ -0,0 +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,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,OAAsB;IACtE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,iJAAiJ,EACjJ;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC9D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;QACzF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;QAC9E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KACpG,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;YACxD,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrC,OAAO,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACjF,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,gBAAgB,CAAC;gBAChC,MAAM,EAAE,UAAU;gBAClB,IAAI;gBACJ,IAAI;gBACJ,IAAI,EAAE,IAAI,IAAI,WAAW;aAC1B,CAAC,CAAC;YAEH,IAAI,OAAsB,CAAC;YAC3B,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAC/D,CAAC;YAED,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAE/B,OAAO,OAAO,CAAC;gBACb,QAAQ,EAAE,IAAI;gBACd,UAAU;gBACV,IAAI;gBACJ,IAAI;gBACJ,IAAI,EAAE,IAAI,IAAI,SAAS;aACxB,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reskill.d.ts","sourceRoot":"","sources":["../../src/tools/reskill.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAalD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAuE/E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { readSkillCanonDialog, skillHasCanon, extractConvergenceStamp, assembleSystemPrompt, createSession, saveSession, getSkill, assertSafeName, } from '@pantion/core';
|
|
3
|
+
import { success, error } from '../utils/response.js';
|
|
4
|
+
export function registerReskill(server, context) {
|
|
5
|
+
server.tool('pantion_reskill', 'Re-evaluate an existing dynamic skill canon with a better model. Reads the skill-canon, provides gap analysis instructions, and creates a session for supplementary convergence.', {
|
|
6
|
+
skill_name: z.string().describe('Name of the skill to reskill'),
|
|
7
|
+
project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
|
|
8
|
+
}, async ({ skill_name, project_path }) => {
|
|
9
|
+
try {
|
|
10
|
+
assertSafeName(skill_name);
|
|
11
|
+
const projectPath = project_path ?? context.projectPath;
|
|
12
|
+
// Verify skill exists and has a canon
|
|
13
|
+
if (!skillHasCanon(projectPath, skill_name)) {
|
|
14
|
+
const skill = getSkill(skill_name, projectPath, context.skillsDir);
|
|
15
|
+
if (skill) {
|
|
16
|
+
return error(`Skill "${skill_name}" exists but has no canon (it is a hand-crafted skill). Use pantion_create-skill to create a dynamic version.`);
|
|
17
|
+
}
|
|
18
|
+
return error(`Skill "${skill_name}" not found or has no canon.`);
|
|
19
|
+
}
|
|
20
|
+
const dialog = readSkillCanonDialog(projectPath, skill_name);
|
|
21
|
+
if (!dialog) {
|
|
22
|
+
return error(`Could not read skill canon dialog for "${skill_name}".`);
|
|
23
|
+
}
|
|
24
|
+
const stamp = extractConvergenceStamp(dialog);
|
|
25
|
+
if (!stamp) {
|
|
26
|
+
return error('No convergence stamp found in skill canon. This skill may be a DRAFT — use pantion_resume instead.');
|
|
27
|
+
}
|
|
28
|
+
if (stamp.type === 'draft') {
|
|
29
|
+
return error('Skill canon is still a DRAFT. Resume the skill creation dialog first.');
|
|
30
|
+
}
|
|
31
|
+
const statusMatch = stamp.raw.match(/STATUS:\s*(.+)/);
|
|
32
|
+
const displayStatus = statusMatch ? statusMatch[1].trim() : stamp.type;
|
|
33
|
+
// Load skill-builder rules for the reconverge prompt
|
|
34
|
+
const skillBuilder = getSkill('skill-builder', projectPath, context.skillsDir);
|
|
35
|
+
// Assemble reconverge system prompt with skill-builder context
|
|
36
|
+
const convergenceInstructions = assembleSystemPrompt({
|
|
37
|
+
mode: 'reconverge',
|
|
38
|
+
existingDialog: dialog,
|
|
39
|
+
canonName: `skill:${skill_name}`,
|
|
40
|
+
skillRules: skillBuilder?.convergenceRules,
|
|
41
|
+
protocolDir: context.protocolDir,
|
|
42
|
+
});
|
|
43
|
+
// Create session for the reskill work
|
|
44
|
+
const session = createSession(projectPath, `reskill-${skill_name}`, convergenceInstructions);
|
|
45
|
+
session.canonType = 'skill';
|
|
46
|
+
session.targetSkillName = skill_name;
|
|
47
|
+
session.skill = 'skill-builder';
|
|
48
|
+
saveSession(projectPath, session);
|
|
49
|
+
return success({
|
|
50
|
+
dialog,
|
|
51
|
+
current_status: displayStatus,
|
|
52
|
+
skill_name,
|
|
53
|
+
session_id: session.id,
|
|
54
|
+
convergence_instructions: convergenceInstructions,
|
|
55
|
+
message: `Skill canon "${skill_name}" loaded for reconvergence. Status: ${displayStatus}. Analyze the skill dialog for gaps in domain knowledge before conducting supplementary convergence.`,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=reskill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reskill.js","sourceRoot":"","sources":["../../src/tools/reskill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../src/tools/resume.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,CA2D9E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { readFileSafe, canonDir, extractConvergenceStamp, extractProgressStamp, assembleSystemPrompt, createSession, saveSession, assertSafeName, } from '@pantion/core';
|
|
4
|
+
import { success, error } from '../utils/response.js';
|
|
5
|
+
export function registerResume(server, context) {
|
|
6
|
+
server.tool('pantion_resume', 'Resume a DRAFT canon for continued convergence. Returns the existing dialog and convergence instructions.', {
|
|
7
|
+
canon_name: z.string().describe('Name of the canon to resume'),
|
|
8
|
+
project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
|
|
9
|
+
}, async ({ canon_name, project_path }) => {
|
|
10
|
+
try {
|
|
11
|
+
const projectPath = project_path ?? context.projectPath;
|
|
12
|
+
assertSafeName(canon_name);
|
|
13
|
+
const dir = canonDir(projectPath);
|
|
14
|
+
const dialogPath = resolve(dir, canon_name, 'dialog.md');
|
|
15
|
+
const dialog = readFileSafe(dialogPath);
|
|
16
|
+
if (!dialog) {
|
|
17
|
+
return error(`Canon dialog not found: ${dialogPath}`);
|
|
18
|
+
}
|
|
19
|
+
// Extract open questions from stamp
|
|
20
|
+
let openQuestions = [];
|
|
21
|
+
const convergenceStamp = extractConvergenceStamp(dialog);
|
|
22
|
+
if (convergenceStamp) {
|
|
23
|
+
openQuestions = convergenceStamp.openQuestions;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const progressStamp = extractProgressStamp(dialog);
|
|
27
|
+
if (progressStamp) {
|
|
28
|
+
openQuestions = progressStamp.openQuestions;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Extract inference policy from stamp (if available)
|
|
32
|
+
const inferencePolicy = convergenceStamp?.inferencePolicy;
|
|
33
|
+
// Assemble resume system prompt
|
|
34
|
+
const convergenceInstructions = assembleSystemPrompt({
|
|
35
|
+
mode: 'resume',
|
|
36
|
+
existingDialog: dialog,
|
|
37
|
+
protocolDir: context.protocolDir,
|
|
38
|
+
inferencePolicy: inferencePolicy === 'strict' ? 'strict' : undefined,
|
|
39
|
+
});
|
|
40
|
+
// Create a new session for the resumed work
|
|
41
|
+
const session = createSession(projectPath, `resume-${canon_name}`, convergenceInstructions);
|
|
42
|
+
session.canonName = canon_name;
|
|
43
|
+
saveSession(projectPath, session);
|
|
44
|
+
return success({
|
|
45
|
+
dialog,
|
|
46
|
+
open_questions: openQuestions,
|
|
47
|
+
session_id: session.id,
|
|
48
|
+
convergence_instructions: convergenceInstructions,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=resume.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/tools/resume.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,oBAAoB,EACpB,oBAAoB,EACpB,aAAa,EACb,WAAW,EAEX,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,cAAc,CAAC,MAAiB,EAAE,OAAsB;IACtE,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,2GAA2G,EAC3G;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;QAC9D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KACpG,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE;QACrC,IAAI,CAAC;YACL,MAAM,WAAW,GAAG,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;YACxD,cAAc,CAAC,UAAU,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YAEzD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YACxC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;YACxD,CAAC;YAED,oCAAoC;YACpC,IAAI,aAAa,GAAa,EAAE,CAAC;YACjC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,aAAa,GAAG,gBAAgB,CAAC,aAAa,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;gBACnD,IAAI,aAAa,EAAE,CAAC;oBAClB,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,qDAAqD;YACrD,MAAM,eAAe,GAAG,gBAAgB,EAAE,eAAwD,CAAC;YAEnG,gCAAgC;YAChC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;gBACnD,IAAI,EAAE,QAAQ;gBACd,cAAc,EAAE,MAAM;gBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,eAAe,EAAE,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aACrE,CAAC,CAAC;YAEH,4CAA4C;YAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,UAAU,UAAU,EAAE,EAAE,uBAAuB,CAAC,CAAC;YAC5F,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC;YAC/B,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAElC,OAAO,OAAO,CAAC;gBACb,MAAM;gBACN,cAAc,EAAE,aAAa;gBAC7B,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,wBAAwB,EAAE,uBAAuB;aAClD,CAAC,CAAC;QACH,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse.d.ts","sourceRoot":"","sources":["../../src/tools/reverse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQlD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAkC/E"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { assembleSystemPrompt, createSession, saveSession, } from '@pantion/core';
|
|
3
|
+
import { success, error } from '../utils/response.js';
|
|
4
|
+
export function registerReverse(server, context) {
|
|
5
|
+
server.tool('pantion_reverse', 'Start a reverse Pantion session: extract intent from an existing codebase and reconstruct it as a DialogSpec Canon. The client LLM scans the code and produces a synthetic dialog.', {
|
|
6
|
+
canon_name: z.string().optional().describe('Name for the resulting canon (default: "reverse")'),
|
|
7
|
+
project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
|
|
8
|
+
}, async ({ canon_name, project_path }) => {
|
|
9
|
+
try {
|
|
10
|
+
const projectPath = project_path ?? context.projectPath;
|
|
11
|
+
const name = canon_name ?? 'reverse';
|
|
12
|
+
const convergenceInstructions = assembleSystemPrompt({
|
|
13
|
+
mode: 'reverse',
|
|
14
|
+
canonName: name,
|
|
15
|
+
protocolDir: context.protocolDir,
|
|
16
|
+
});
|
|
17
|
+
const session = createSession(projectPath, `reverse-${name}`, convergenceInstructions);
|
|
18
|
+
session.canonName = name;
|
|
19
|
+
saveSession(projectPath, session);
|
|
20
|
+
return success({
|
|
21
|
+
session_id: session.id,
|
|
22
|
+
canon_name: name,
|
|
23
|
+
convergence_instructions: convergenceInstructions,
|
|
24
|
+
message: `Reverse Pantion session started. Follow the reverse protocol: scan the codebase, extract intent, classify HARD/FLEX, and produce a synthetic DialogSpec Canon.`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=reverse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reverse.js","sourceRoot":"","sources":["../../src/tools/reverse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,OAAsB;IACvE,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oLAAoL,EACpL;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC/F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KACpG,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE;QACrC,IAAI,CAAC;YACL,MAAM,WAAW,GAAG,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;YACxD,MAAM,IAAI,GAAG,UAAU,IAAI,SAAS,CAAC;YAErC,MAAM,uBAAuB,GAAG,oBAAoB,CAAC;gBACnD,IAAI,EAAE,SAAS;gBACf,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,EAAE,uBAAuB,CAAC,CAAC;YACvF,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YACzB,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAElC,OAAO,OAAO,CAAC;gBACb,UAAU,EAAE,OAAO,CAAC,EAAE;gBACtB,UAAU,EAAE,IAAI;gBAChB,wBAAwB,EAAE,uBAAuB;gBACjD,OAAO,EAAE,gKAAgK;aAC1K,CAAC,CAAC;QACH,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-canon.d.ts","sourceRoot":"","sources":["../../src/tools/save-canon.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAmBlD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+FjF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { loadSession, saveSession, writeDialogFile, writeSummaryFile, updateCanonIndex, writeSkillDialogFile, writeSkillSummaryFile, extractConvergenceStamp, } from '@pantion/core';
|
|
3
|
+
import { success, error } from '../utils/response.js';
|
|
4
|
+
const messageSchema = z.object({
|
|
5
|
+
role: z.enum(['user', 'assistant']),
|
|
6
|
+
content: z.string(),
|
|
7
|
+
});
|
|
8
|
+
export function registerSaveCanon(server, context) {
|
|
9
|
+
server.tool('pantion_save-canon', 'Write canon files to disk after convergence. Writes the dialog file (THE CANON) and optionally a summary.', {
|
|
10
|
+
session_id: z.string().describe('Session ID from pantion_start'),
|
|
11
|
+
dialog: z.array(messageSchema).describe('The full converged dialog'),
|
|
12
|
+
name: z.string().describe('Canon name (e.g. "my-project")'),
|
|
13
|
+
summary: z.string().optional().describe('Client-generated summary content'),
|
|
14
|
+
skill_name: z.string().optional().describe('Target skill name — writes to skills/{name}/canon/ instead of canon/'),
|
|
15
|
+
mode: z.enum(['dialog', 'full']).optional().describe('Convergence mode used. Dialog mode auto-approves the canon.'),
|
|
16
|
+
check_result: z.string().optional().describe('Last pantion_check result summary (e.g. "PASS (12/13)")'),
|
|
17
|
+
}, async ({ session_id, dialog, name, summary, skill_name, mode, check_result }) => {
|
|
18
|
+
try {
|
|
19
|
+
const projectPath = context.projectPath;
|
|
20
|
+
const date = new Date().toISOString().split('T')[0];
|
|
21
|
+
const messages = dialog.map((m) => ({ role: m.role, content: m.content }));
|
|
22
|
+
// Check for convergence stamp (blocking error if missing)
|
|
23
|
+
const fullText = dialog.map((m) => m.content).join('\n');
|
|
24
|
+
const stamp = extractConvergenceStamp(fullText);
|
|
25
|
+
if (!stamp) {
|
|
26
|
+
return error('Dialog does not contain a DIALOGSPEC STAMP. A converged stamp is required to save a canon.');
|
|
27
|
+
}
|
|
28
|
+
if (stamp.type === 'draft') {
|
|
29
|
+
return error('Dialog contains a DRAFT stamp. Only converged dialogs can be saved as canon. Use pantion_resume to continue convergence.');
|
|
30
|
+
}
|
|
31
|
+
// Update session
|
|
32
|
+
const session = loadSession(projectPath, session_id);
|
|
33
|
+
if (session) {
|
|
34
|
+
session.messages = messages;
|
|
35
|
+
session.canonName = name;
|
|
36
|
+
session.status = 'converged';
|
|
37
|
+
if (skill_name) {
|
|
38
|
+
session.canonType = 'skill';
|
|
39
|
+
session.targetSkillName = skill_name;
|
|
40
|
+
}
|
|
41
|
+
saveSession(projectPath, session);
|
|
42
|
+
}
|
|
43
|
+
// Build a session-like object for the canon writer
|
|
44
|
+
const sessionForWriter = session ?? {
|
|
45
|
+
id: session_id,
|
|
46
|
+
name,
|
|
47
|
+
status: 'converged',
|
|
48
|
+
messages,
|
|
49
|
+
systemPrompt: '',
|
|
50
|
+
createdAt: new Date().toISOString(),
|
|
51
|
+
updatedAt: new Date().toISOString(),
|
|
52
|
+
canonName: name,
|
|
53
|
+
};
|
|
54
|
+
// Build canon metadata from session state + parameters
|
|
55
|
+
const metadata = {};
|
|
56
|
+
if (session?.skill)
|
|
57
|
+
metadata.skill = session.skill;
|
|
58
|
+
if (session?.soul)
|
|
59
|
+
metadata.soul = session.soul;
|
|
60
|
+
if (mode)
|
|
61
|
+
metadata.mode = mode;
|
|
62
|
+
if (check_result)
|
|
63
|
+
metadata.checkResult = check_result;
|
|
64
|
+
const hasMetadata = Object.keys(metadata).length > 0;
|
|
65
|
+
let canonPath;
|
|
66
|
+
let summaryPath;
|
|
67
|
+
if (skill_name) {
|
|
68
|
+
// Skill canon → skills/{skill_name}/canon/
|
|
69
|
+
canonPath = writeSkillDialogFile(sessionForWriter, skill_name, date, projectPath, mode, hasMetadata ? metadata : undefined);
|
|
70
|
+
if (summary) {
|
|
71
|
+
summaryPath = writeSkillSummaryFile(skill_name, date, summary, projectPath);
|
|
72
|
+
}
|
|
73
|
+
// Skill canons do NOT go in the project canon index
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Project canon → canon/ (existing behavior)
|
|
77
|
+
canonPath = writeDialogFile(sessionForWriter, name, date, projectPath, mode, hasMetadata ? metadata : undefined);
|
|
78
|
+
if (summary) {
|
|
79
|
+
summaryPath = writeSummaryFile(name, date, summary, projectPath);
|
|
80
|
+
}
|
|
81
|
+
updateCanonIndex(name, 'converged', date, projectPath);
|
|
82
|
+
}
|
|
83
|
+
return success({
|
|
84
|
+
canon_path: canonPath,
|
|
85
|
+
summary_path: summaryPath,
|
|
86
|
+
index_updated: !skill_name,
|
|
87
|
+
skill_name: skill_name ?? undefined,
|
|
88
|
+
stamp_type: stamp.type,
|
|
89
|
+
stamp_model: stamp.model,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=save-canon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-canon.js","sourceRoot":"","sources":["../../src/tools/save-canon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/tools/start.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAYlD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAwF7E"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { autoSelectSkill, listSkills, getSkill, assembleSystemPrompt, createSession, saveSession, getSoul, } from '@pantion/core';
|
|
3
|
+
import { success, error } from '../utils/response.js';
|
|
4
|
+
export function registerStart(server, context) {
|
|
5
|
+
server.tool('pantion_start', 'Start a new Pantion dialog session. Returns convergence instructions for the client LLM.', {
|
|
6
|
+
project_path: z.string().optional().describe('Project directory (defaults to server project path)'),
|
|
7
|
+
skill: z.string().optional().describe('Explicit skill name to use (e.g. "dating-profile", "software")'),
|
|
8
|
+
domain: z.string().optional().describe('Domain hint for skill auto-selection (e.g. "software", "image")'),
|
|
9
|
+
user_message: z.string().optional().describe('The user\'s original message — used for skill auto-selection via keyword matching'),
|
|
10
|
+
soul: z.string().optional().describe('Interaction style (e.g. "default", "beginner", "young")'),
|
|
11
|
+
mode: z.enum(['dialog', 'full']).default('dialog').describe('Convergence mode: "dialog" (default, fast) or "full" (complete protocol)'),
|
|
12
|
+
}, async ({ project_path, skill: skillName, domain, user_message, soul, mode }) => {
|
|
13
|
+
try {
|
|
14
|
+
const projectPath = project_path ?? context.projectPath;
|
|
15
|
+
// Select skill: explicit name > domain hint > user message keywords
|
|
16
|
+
let selection = skillName
|
|
17
|
+
? (() => {
|
|
18
|
+
const s = getSkill(skillName, projectPath, context.skillsDir);
|
|
19
|
+
return s ? { skill: s, matchedKeywords: [skillName] } : null;
|
|
20
|
+
})()
|
|
21
|
+
: null;
|
|
22
|
+
if (!selection) {
|
|
23
|
+
const selectionInput = domain ?? user_message;
|
|
24
|
+
selection = selectionInput
|
|
25
|
+
? autoSelectSkill(selectionInput, projectPath, context.skillsDir)
|
|
26
|
+
: null;
|
|
27
|
+
}
|
|
28
|
+
// If no skill matched, list available skills for the client to present
|
|
29
|
+
const availableSkills = !selection
|
|
30
|
+
? listSkills(projectPath, context.skillsDir)
|
|
31
|
+
.filter((s) => s.manifest.name !== 'skill-builder')
|
|
32
|
+
.map((s) => ({ name: s.manifest.name, displayName: s.manifest.displayName, description: s.manifest.description }))
|
|
33
|
+
: undefined;
|
|
34
|
+
// Load soul (default if not specified)
|
|
35
|
+
const soulObj = soul
|
|
36
|
+
? getSoul(soul, projectPath, context.soulsDir)
|
|
37
|
+
: getSoul('default', projectPath, context.soulsDir);
|
|
38
|
+
// Assemble convergence instructions (system prompt for client LLM)
|
|
39
|
+
const promptMode = mode === 'full' ? 'start' : 'dialog';
|
|
40
|
+
const convergenceInstructions = assembleSystemPrompt({
|
|
41
|
+
mode: promptMode,
|
|
42
|
+
skillRules: selection?.skill.convergenceRules,
|
|
43
|
+
soulRules: soulObj?.rules,
|
|
44
|
+
protocolDir: context.protocolDir,
|
|
45
|
+
});
|
|
46
|
+
// Create a session
|
|
47
|
+
const sessionName = `session-${Date.now()}`;
|
|
48
|
+
const session = createSession(projectPath, sessionName, convergenceInstructions);
|
|
49
|
+
if (selection || soulObj) {
|
|
50
|
+
if (selection)
|
|
51
|
+
session.skill = selection.skill.manifest.name;
|
|
52
|
+
if (soulObj)
|
|
53
|
+
session.soul = soulObj.manifest.name;
|
|
54
|
+
saveSession(projectPath, session);
|
|
55
|
+
}
|
|
56
|
+
const firstQuestion = selection
|
|
57
|
+
? `I've selected the **${selection.skill.manifest.displayName}** skill (matched: ${selection.matchedKeywords.join(', ')}). What would you like to build?`
|
|
58
|
+
: availableSkills && availableSkills.length > 0
|
|
59
|
+
? `Welcome to Pantion. I couldn't determine the domain from your description. Available domains: ${availableSkills.map((s) => `**${s.displayName}**`).join(', ')}. Which fits best, or shall I proceed with a general convergence?`
|
|
60
|
+
: 'Welcome to Pantion. Describe in your own words what you want to build. Be as free as you like — I will ask the right questions to turn your idea into an unambiguous intent description.';
|
|
61
|
+
return success({
|
|
62
|
+
session_id: session.id,
|
|
63
|
+
mode,
|
|
64
|
+
skill: selection ? {
|
|
65
|
+
name: selection.skill.manifest.name,
|
|
66
|
+
displayName: selection.skill.manifest.displayName,
|
|
67
|
+
matchedKeywords: selection.matchedKeywords,
|
|
68
|
+
} : null,
|
|
69
|
+
available_skills: availableSkills?.length ? availableSkills : undefined,
|
|
70
|
+
soul: soulObj ? {
|
|
71
|
+
name: soulObj.manifest.name,
|
|
72
|
+
displayName: soulObj.manifest.displayName,
|
|
73
|
+
} : null,
|
|
74
|
+
convergence_instructions: convergenceInstructions,
|
|
75
|
+
first_question: firstQuestion,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/tools/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../src/tools/translate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAUlD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAkFjF"}
|