@pantion/dialogs 0.2.1

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 (260) hide show
  1. package/dialogs/dialog-builder/convergence-rules.md +64 -0
  2. package/dialogs/dialog-builder/dialog.json +10 -0
  3. package/dialogs/dialog-builder/prompts/convergence-intro.md +21 -0
  4. package/dialogs/dialog-builder/prompts/translate-intro.md +17 -0
  5. package/dialogs/dialog-builder/translate.md +46 -0
  6. package/dialogs/image/convergence-rules.md +55 -0
  7. package/dialogs/image/dialog.json +12 -0
  8. package/dialogs/image/prompts/convergence-intro.md +25 -0
  9. package/dialogs/image/prompts/translate-intro.md +37 -0
  10. package/dialogs/image/translate.md +67 -0
  11. package/dialogs/software/convergence-rules.md +29 -0
  12. package/dialogs/software/dialog.json +12 -0
  13. package/dialogs/software/prompts/convergence-intro.md +22 -0
  14. package/dialogs/software/prompts/translate-intro.md +19 -0
  15. package/dialogs/software/translate.md +74 -0
  16. package/dialogs/software-brownfield/convergence-rules.md +109 -0
  17. package/dialogs/software-brownfield/dialog.json +12 -0
  18. package/dialogs/software-brownfield/prompts/convergence-intro.md +26 -0
  19. package/dialogs/software-brownfield/prompts/translate-intro.md +13 -0
  20. package/dialogs/software-brownfield/translate.md +56 -0
  21. package/dialogs/video/convergence-rules.md +96 -0
  22. package/dialogs/video/dialog.json +12 -0
  23. package/dialogs/video/prompts/convergence-intro.md +28 -0
  24. package/dialogs/video/prompts/translate-intro.md +41 -0
  25. package/dialogs/video/translate.md +81 -0
  26. package/dist/core/canon/index-manager.d.ts +27 -0
  27. package/dist/core/canon/index-manager.d.ts.map +1 -0
  28. package/dist/core/canon/index-manager.js +127 -0
  29. package/dist/core/canon/index-manager.js.map +1 -0
  30. package/dist/core/canon/manifest.d.ts +21 -0
  31. package/dist/core/canon/manifest.d.ts.map +1 -0
  32. package/dist/core/canon/manifest.js +56 -0
  33. package/dist/core/canon/manifest.js.map +1 -0
  34. package/dist/core/canon/validator.d.ts +12 -0
  35. package/dist/core/canon/validator.d.ts.map +1 -0
  36. package/dist/core/canon/validator.js +320 -0
  37. package/dist/core/canon/validator.js.map +1 -0
  38. package/dist/core/dialog/canon-writer.d.ts +22 -0
  39. package/dist/core/dialog/canon-writer.d.ts.map +1 -0
  40. package/dist/core/dialog/canon-writer.js +96 -0
  41. package/dist/core/dialog/canon-writer.js.map +1 -0
  42. package/dist/core/dialog/registry.d.ts +10 -0
  43. package/dist/core/dialog/registry.d.ts.map +1 -0
  44. package/dist/core/dialog/registry.js +102 -0
  45. package/dist/core/dialog/registry.js.map +1 -0
  46. package/dist/core/dialog/selector.d.ts +11 -0
  47. package/dist/core/dialog/selector.d.ts.map +1 -0
  48. package/dist/core/dialog/selector.js +32 -0
  49. package/dist/core/dialog/selector.js.map +1 -0
  50. package/dist/core/index.d.ts +20 -0
  51. package/dist/core/index.d.ts.map +1 -0
  52. package/dist/core/index.js +30 -0
  53. package/dist/core/index.js.map +1 -0
  54. package/dist/core/protocol/convergence.d.ts +11 -0
  55. package/dist/core/protocol/convergence.d.ts.map +1 -0
  56. package/dist/core/protocol/convergence.js +30 -0
  57. package/dist/core/protocol/convergence.js.map +1 -0
  58. package/dist/core/protocol/loader.d.ts +6 -0
  59. package/dist/core/protocol/loader.d.ts.map +1 -0
  60. package/dist/core/protocol/loader.js +31 -0
  61. package/dist/core/protocol/loader.js.map +1 -0
  62. package/dist/core/protocol/stamp-parser.d.ts +46 -0
  63. package/dist/core/protocol/stamp-parser.d.ts.map +1 -0
  64. package/dist/core/protocol/stamp-parser.js +333 -0
  65. package/dist/core/protocol/stamp-parser.js.map +1 -0
  66. package/dist/core/protocol/system-prompt.d.ts +16 -0
  67. package/dist/core/protocol/system-prompt.d.ts.map +1 -0
  68. package/dist/core/protocol/system-prompt.js +68 -0
  69. package/dist/core/protocol/system-prompt.js.map +1 -0
  70. package/dist/core/session/canon-writer.d.ts +33 -0
  71. package/dist/core/session/canon-writer.d.ts.map +1 -0
  72. package/dist/core/session/canon-writer.js +152 -0
  73. package/dist/core/session/canon-writer.js.map +1 -0
  74. package/dist/core/session/manager.d.ts +10 -0
  75. package/dist/core/session/manager.d.ts.map +1 -0
  76. package/dist/core/session/manager.js +105 -0
  77. package/dist/core/session/manager.js.map +1 -0
  78. package/dist/core/skill/canon-writer.d.ts +22 -0
  79. package/dist/core/skill/canon-writer.d.ts.map +1 -0
  80. package/dist/core/skill/canon-writer.js +96 -0
  81. package/dist/core/skill/canon-writer.js.map +1 -0
  82. package/dist/core/skill/registry.d.ts +10 -0
  83. package/dist/core/skill/registry.d.ts.map +1 -0
  84. package/dist/core/skill/registry.js +102 -0
  85. package/dist/core/skill/registry.js.map +1 -0
  86. package/dist/core/skill/selector.d.ts +11 -0
  87. package/dist/core/skill/selector.d.ts.map +1 -0
  88. package/dist/core/skill/selector.js +32 -0
  89. package/dist/core/skill/selector.js.map +1 -0
  90. package/dist/core/soul/registry.d.ts +10 -0
  91. package/dist/core/soul/registry.d.ts.map +1 -0
  92. package/dist/core/soul/registry.js +73 -0
  93. package/dist/core/soul/registry.js.map +1 -0
  94. package/dist/core/types.d.ts +154 -0
  95. package/dist/core/types.d.ts.map +1 -0
  96. package/dist/core/types.js +6 -0
  97. package/dist/core/types.js.map +1 -0
  98. package/dist/core/utils/fs.d.ts +14 -0
  99. package/dist/core/utils/fs.d.ts.map +1 -0
  100. package/dist/core/utils/fs.js +44 -0
  101. package/dist/core/utils/fs.js.map +1 -0
  102. package/dist/core/utils/project-detect.d.ts +3 -0
  103. package/dist/core/utils/project-detect.d.ts.map +1 -0
  104. package/dist/core/utils/project-detect.js +38 -0
  105. package/dist/core/utils/project-detect.js.map +1 -0
  106. package/dist/feature-set.d.ts +14 -0
  107. package/dist/feature-set.d.ts.map +1 -0
  108. package/dist/feature-set.js +38 -0
  109. package/dist/feature-set.js.map +1 -0
  110. package/dist/index.d.ts +3 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +56 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/prompts/convergence-prompts.d.ts +4 -0
  115. package/dist/prompts/convergence-prompts.d.ts.map +1 -0
  116. package/dist/prompts/convergence-prompts.js +76 -0
  117. package/dist/prompts/convergence-prompts.js.map +1 -0
  118. package/dist/prompts/index.d.ts +4 -0
  119. package/dist/prompts/index.d.ts.map +1 -0
  120. package/dist/prompts/index.js +7 -0
  121. package/dist/prompts/index.js.map +1 -0
  122. package/dist/prompts/workflow-prompts.d.ts +9 -0
  123. package/dist/prompts/workflow-prompts.d.ts.map +1 -0
  124. package/dist/prompts/workflow-prompts.js +265 -0
  125. package/dist/prompts/workflow-prompts.js.map +1 -0
  126. package/dist/resources/canon-resources.d.ts +4 -0
  127. package/dist/resources/canon-resources.d.ts.map +1 -0
  128. package/dist/resources/canon-resources.js +164 -0
  129. package/dist/resources/canon-resources.js.map +1 -0
  130. package/dist/server.d.ts +9 -0
  131. package/dist/server.d.ts.map +1 -0
  132. package/dist/server.js +47 -0
  133. package/dist/server.js.map +1 -0
  134. package/dist/tools/amend.d.ts +4 -0
  135. package/dist/tools/amend.d.ts.map +1 -0
  136. package/dist/tools/amend.js +106 -0
  137. package/dist/tools/amend.js.map +1 -0
  138. package/dist/tools/approve.d.ts +4 -0
  139. package/dist/tools/approve.d.ts.map +1 -0
  140. package/dist/tools/approve.js +60 -0
  141. package/dist/tools/approve.js.map +1 -0
  142. package/dist/tools/check-convergence.d.ts +4 -0
  143. package/dist/tools/check-convergence.d.ts.map +1 -0
  144. package/dist/tools/check-convergence.js +50 -0
  145. package/dist/tools/check-convergence.js.map +1 -0
  146. package/dist/tools/check.d.ts +4 -0
  147. package/dist/tools/check.d.ts.map +1 -0
  148. package/dist/tools/check.js +190 -0
  149. package/dist/tools/check.js.map +1 -0
  150. package/dist/tools/create-dialog.d.ts +4 -0
  151. package/dist/tools/create-dialog.d.ts.map +1 -0
  152. package/dist/tools/create-dialog.js +58 -0
  153. package/dist/tools/create-dialog.js.map +1 -0
  154. package/dist/tools/create-skill.d.ts +4 -0
  155. package/dist/tools/create-skill.d.ts.map +1 -0
  156. package/dist/tools/create-skill.js +58 -0
  157. package/dist/tools/create-skill.js.map +1 -0
  158. package/dist/tools/decompose.d.ts +4 -0
  159. package/dist/tools/decompose.d.ts.map +1 -0
  160. package/dist/tools/decompose.js +56 -0
  161. package/dist/tools/decompose.js.map +1 -0
  162. package/dist/tools/index.d.ts +4 -0
  163. package/dist/tools/index.d.ts.map +1 -0
  164. package/dist/tools/index.js +49 -0
  165. package/dist/tools/index.js.map +1 -0
  166. package/dist/tools/list-canons.d.ts +4 -0
  167. package/dist/tools/list-canons.d.ts.map +1 -0
  168. package/dist/tools/list-canons.js +28 -0
  169. package/dist/tools/list-canons.js.map +1 -0
  170. package/dist/tools/migrate.d.ts +4 -0
  171. package/dist/tools/migrate.d.ts.map +1 -0
  172. package/dist/tools/migrate.js +38 -0
  173. package/dist/tools/migrate.js.map +1 -0
  174. package/dist/tools/onboard.d.ts +4 -0
  175. package/dist/tools/onboard.d.ts.map +1 -0
  176. package/dist/tools/onboard.js +27 -0
  177. package/dist/tools/onboard.js.map +1 -0
  178. package/dist/tools/reconverge.d.ts +4 -0
  179. package/dist/tools/reconverge.d.ts.map +1 -0
  180. package/dist/tools/reconverge.js +68 -0
  181. package/dist/tools/reconverge.js.map +1 -0
  182. package/dist/tools/redialog.d.ts +4 -0
  183. package/dist/tools/redialog.d.ts.map +1 -0
  184. package/dist/tools/redialog.js +63 -0
  185. package/dist/tools/redialog.js.map +1 -0
  186. package/dist/tools/reflect.d.ts +4 -0
  187. package/dist/tools/reflect.d.ts.map +1 -0
  188. package/dist/tools/reflect.js +86 -0
  189. package/dist/tools/reflect.js.map +1 -0
  190. package/dist/tools/reject.d.ts +4 -0
  191. package/dist/tools/reject.d.ts.map +1 -0
  192. package/dist/tools/reject.js +57 -0
  193. package/dist/tools/reject.js.map +1 -0
  194. package/dist/tools/reskill.d.ts +4 -0
  195. package/dist/tools/reskill.d.ts.map +1 -0
  196. package/dist/tools/reskill.js +63 -0
  197. package/dist/tools/reskill.js.map +1 -0
  198. package/dist/tools/resume.d.ts +4 -0
  199. package/dist/tools/resume.d.ts.map +1 -0
  200. package/dist/tools/resume.js +56 -0
  201. package/dist/tools/resume.js.map +1 -0
  202. package/dist/tools/reverse.d.ts +4 -0
  203. package/dist/tools/reverse.d.ts.map +1 -0
  204. package/dist/tools/reverse.js +32 -0
  205. package/dist/tools/reverse.js.map +1 -0
  206. package/dist/tools/save-canon.d.ts +4 -0
  207. package/dist/tools/save-canon.d.ts.map +1 -0
  208. package/dist/tools/save-canon.js +97 -0
  209. package/dist/tools/save-canon.js.map +1 -0
  210. package/dist/tools/start.d.ts +4 -0
  211. package/dist/tools/start.d.ts.map +1 -0
  212. package/dist/tools/start.js +83 -0
  213. package/dist/tools/start.js.map +1 -0
  214. package/dist/tools/translate.d.ts +4 -0
  215. package/dist/tools/translate.d.ts.map +1 -0
  216. package/dist/tools/translate.js +102 -0
  217. package/dist/tools/translate.js.map +1 -0
  218. package/dist/tools/update.d.ts +4 -0
  219. package/dist/tools/update.d.ts.map +1 -0
  220. package/dist/tools/update.js +42 -0
  221. package/dist/tools/update.js.map +1 -0
  222. package/dist/tools/validate.d.ts +4 -0
  223. package/dist/tools/validate.d.ts.map +1 -0
  224. package/dist/tools/validate.js +86 -0
  225. package/dist/tools/validate.js.map +1 -0
  226. package/dist/utils/response.d.ts +12 -0
  227. package/dist/utils/response.d.ts.map +1 -0
  228. package/dist/utils/response.js +18 -0
  229. package/dist/utils/response.js.map +1 -0
  230. package/package.json +37 -0
  231. package/protocol/commands/amend.md +188 -0
  232. package/protocol/commands/build.md +90 -0
  233. package/protocol/commands/check.md +255 -0
  234. package/protocol/commands/create-dialog.md +81 -0
  235. package/protocol/commands/decompose.md +230 -0
  236. package/protocol/commands/dialog.md +173 -0
  237. package/protocol/commands/help.md +121 -0
  238. package/protocol/commands/migrate.md +173 -0
  239. package/protocol/commands/onboard.md +210 -0
  240. package/protocol/commands/quick.md +170 -0
  241. package/protocol/commands/redialog.md +73 -0
  242. package/protocol/commands/reflect.md +136 -0
  243. package/protocol/commands/resume.md +148 -0
  244. package/protocol/commands/reverse.md +312 -0
  245. package/protocol/commands/start.md +220 -0
  246. package/protocol/commands/translate.md +157 -0
  247. package/protocol/commands/update.md +205 -0
  248. package/protocol/core-advanced.md +188 -0
  249. package/protocol/core.md +274 -0
  250. package/protocol/pantion-future-prompt.md +88 -0
  251. package/protocol/pantion-intent.md +78 -0
  252. package/protocol/templates/acceptance-tests.md +116 -0
  253. package/protocol/templates/behavior-map.md +135 -0
  254. package/protocol/templates/traceability-map.md +56 -0
  255. package/souls/beginner/rules.md +34 -0
  256. package/souls/beginner/soul.json +6 -0
  257. package/souls/default/rules.md +25 -0
  258. package/souls/default/soul.json +6 -0
  259. package/souls/young/rules.md +67 -0
  260. package/souls/young/soul.json +6 -0
@@ -0,0 +1,68 @@
1
+ import { loadProtocolCore, loadProtocolCommand } from './loader.js';
2
+ /**
3
+ * Assemble the full system prompt from protocol core + command + skill rules.
4
+ * This is the bridge between the protocol .md files and the LLM.
5
+ */
6
+ export function assembleSystemPrompt(options) {
7
+ const parts = [];
8
+ // 1. Core protocol knowledge (advanced sections only for modes that need them)
9
+ const advancedModes = ['reconverge', 'decompose', 'reverse', 'create-dialog', 'redialog'];
10
+ const needsAdvanced = advancedModes.includes(options.mode);
11
+ parts.push(loadProtocolCore(options.protocolDir, { includeAdvanced: needsAdvanced }));
12
+ // 2. Mode-specific command protocol
13
+ parts.push('\n---\n');
14
+ const commandName = options.mode === 'reconverge' ? 'redialog' : options.mode;
15
+ parts.push(loadProtocolCommand(commandName, options.protocolDir));
16
+ // 3. Dialog-specific convergence rules (if a dialog is active)
17
+ if (options.dialogRules) {
18
+ parts.push('\n---\n');
19
+ parts.push('# Active Dialog — Additional Convergence Rules\n\n');
20
+ parts.push(options.dialogRules);
21
+ }
22
+ // 4. Soul interaction style (if configured)
23
+ if (options.soulRules) {
24
+ parts.push('\n---\n');
25
+ parts.push('# Active Soul — Interaction Style\n\n');
26
+ parts.push(options.soulRules);
27
+ }
28
+ // 5. Context
29
+ parts.push('\n---\n');
30
+ parts.push('# Session Context\n\n');
31
+ if (options.canonName) {
32
+ parts.push(`Canon name: ${options.canonName}\n`);
33
+ }
34
+ if (options.userLanguage) {
35
+ parts.push(`User language: ${options.userLanguage}. Respond in this language.\n`);
36
+ }
37
+ parts.push(`Date: ${new Date().toISOString().split('T')[0]}\n`);
38
+ // 6. Inference Policy enforcement (dynamic based on stamp value)
39
+ if (options.inferencePolicy === 'strict') {
40
+ parts.push('\n---\n');
41
+ parts.push('# Inference Policy: STRICT\n\n');
42
+ parts.push('This canon operates under STRICT inference policy. You MUST:\n');
43
+ parts.push('- On ANY ambiguity: STOP and formulate OPEN QUESTIONS. Do not guess.\n');
44
+ parts.push('- Make NO implicit assumptions — every decision must trace to an explicit dialog turn.\n');
45
+ parts.push('- Do NOT choose between alternatives — present them as open questions for the user.\n');
46
+ parts.push('- If a concept has multiple interpretations, ask which one the user means.\n');
47
+ parts.push('- Treat FLEX zones as "undecided", not as "your choice".\n');
48
+ }
49
+ // 7. For resume/reconverge/decompose: include the existing dialog
50
+ if (options.existingDialog) {
51
+ parts.push('\n---\n');
52
+ if (options.mode === 'reconverge') {
53
+ parts.push('# Existing Dialog (reconvergence context)\n\n');
54
+ parts.push('The following dialog has already been conducted and converged. Analyze it for gaps — questions that should have been asked, assumptions that were never made explicit, edge cases not explored. Do NOT continue the dialog yet. First produce a gap analysis, then conduct a targeted supplementary dialog for the gaps the user selects.\n\n');
55
+ }
56
+ else if (options.mode === 'decompose') {
57
+ parts.push('# Existing Dialog (decomposition context)\n\n');
58
+ parts.push('The following dialog has already been conducted and converged as a standalone canon. It is now being decomposed into subsystems. Use the existing dialog as a starting point — summarize what you already know and focus on decomposition.\n\n');
59
+ }
60
+ else {
61
+ parts.push('# Existing Dialog (resume context)\n\n');
62
+ parts.push('The following dialog has already been conducted. Continue from where it left off.\n\n');
63
+ }
64
+ parts.push(options.existingDialog);
65
+ }
66
+ return parts.join('\n');
67
+ }
68
+ //# sourceMappingURL=system-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../../src/core/protocol/system-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { Session, CanonMetadata } from '../types.js';
2
+ /**
3
+ * Write the dialog file (THE CANON — verbatim dialog).
4
+ * No LLM dependency — this is purely file I/O.
5
+ */
6
+ export declare function writeDialogFile(session: Session, name: string, date: string, projectPath: string, mode?: 'dialog' | 'full', metadata?: CanonMetadata): string;
7
+ /**
8
+ * Write a summary file (DERIVED — content provided by the client LLM).
9
+ * The server does not generate summaries; it writes what the client provides.
10
+ */
11
+ export declare function writeSummaryFile(name: string, date: string, summaryContent: string, projectPath: string): string;
12
+ /**
13
+ * Append an amendment block to an existing dialog file.
14
+ */
15
+ export declare function appendAmendment(canonName: string, projectPath: string, amendmentDialog: Array<{
16
+ role: string;
17
+ content: string;
18
+ }>, stampRaw: string): string;
19
+ /**
20
+ * Append a Reality Convergence block to an existing dialog file.
21
+ * Reality Convergence captures empirical feedback from a built implementation
22
+ * back into the canon as intent-deepening.
23
+ */
24
+ export declare function appendRealityConvergence(canonName: string, projectPath: string, validationDialog: Array<{
25
+ role: string;
26
+ content: string;
27
+ }>, stampRaw: string): string;
28
+ /**
29
+ * Update the canon index with a new or updated entry.
30
+ * Regenerates the full index from filesystem state.
31
+ */
32
+ export declare function updateCanonIndex(_name: string, _status: string, _date: string, projectPath: string): void;
33
+ //# sourceMappingURL=canon-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canon-writer.d.ts","sourceRoot":"","sources":["../../../src/core/session/canon-writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAK1D;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,EACxB,QAAQ,CAAC,EAAE,aAAa,GACvB,MAAM,CASR;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACzD,QAAQ,EAAE,MAAM,GACf,MAAM,CAgCR;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC1D,QAAQ,EAAE,MAAM,GACf,MAAM,CAgCR;AAwDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,IAAI,CAEN"}
@@ -0,0 +1,152 @@
1
+ import { resolve } from 'node:path';
2
+ import { writeFile, readFileSafe, canonDir, ensureDir, assertSafeName } from '../utils/fs.js';
3
+ import { createPendingHumanStamp, createAutoApprovedHumanStamp, formatCanonMetadata } from '../protocol/stamp-parser.js';
4
+ import { regenerateIndex } from '../canon/index-manager.js';
5
+ /**
6
+ * Write the dialog file (THE CANON — verbatim dialog).
7
+ * No LLM dependency — this is purely file I/O.
8
+ */
9
+ export function writeDialogFile(session, name, date, projectPath, mode, metadata) {
10
+ assertSafeName(name);
11
+ const dir = canonDir(projectPath);
12
+ ensureDir(dir);
13
+ const content = formatDialog(session, name, date, mode, metadata);
14
+ const dialogPath = resolve(dir, name, 'dialog.md');
15
+ writeFile(dialogPath, content);
16
+ return dialogPath;
17
+ }
18
+ /**
19
+ * Write a summary file (DERIVED — content provided by the client LLM).
20
+ * The server does not generate summaries; it writes what the client provides.
21
+ */
22
+ export function writeSummaryFile(name, date, summaryContent, projectPath) {
23
+ assertSafeName(name);
24
+ const dir = canonDir(projectPath);
25
+ ensureDir(dir);
26
+ // Normalize literal \n sequences to real newlines (client may send escaped strings)
27
+ let content = normalizeLiteralNewlines(summaryContent);
28
+ // Ensure the summary has the derivation comment
29
+ if (!content.includes('Derived from:')) {
30
+ content = `<!-- Derived from: canon/${name}/dialog.md, ${date} -->\n<!-- This is a DERIVED file for navigation — the dialog is the only source of truth -->\n\n${content}`;
31
+ }
32
+ const summaryPath = resolve(dir, name, 'summary.md');
33
+ writeFile(summaryPath, content);
34
+ return summaryPath;
35
+ }
36
+ /**
37
+ * Append an amendment block to an existing dialog file.
38
+ */
39
+ export function appendAmendment(canonName, projectPath, amendmentDialog, stampRaw) {
40
+ assertSafeName(canonName);
41
+ const dir = canonDir(projectPath);
42
+ const dialogPath = resolve(dir, canonName, 'dialog.md');
43
+ const existing = readFileSafe(dialogPath);
44
+ if (!existing) {
45
+ throw new Error(`Canon dialog not found: ${dialogPath}`);
46
+ }
47
+ const lines = [
48
+ existing,
49
+ '',
50
+ '---',
51
+ '',
52
+ '# Amendment',
53
+ '',
54
+ stampRaw,
55
+ '',
56
+ '---',
57
+ '',
58
+ ];
59
+ for (const msg of amendmentDialog) {
60
+ const role = msg.role === 'user' ? 'HUMAN' : 'ASSISTANT';
61
+ lines.push(`${role}: ${msg.content}`);
62
+ lines.push('');
63
+ }
64
+ const content = lines.join('\n');
65
+ writeFile(dialogPath, content);
66
+ return dialogPath;
67
+ }
68
+ /**
69
+ * Append a Reality Convergence block to an existing dialog file.
70
+ * Reality Convergence captures empirical feedback from a built implementation
71
+ * back into the canon as intent-deepening.
72
+ */
73
+ export function appendRealityConvergence(canonName, projectPath, validationDialog, stampRaw) {
74
+ assertSafeName(canonName);
75
+ const dir = canonDir(projectPath);
76
+ const dialogPath = resolve(dir, canonName, 'dialog.md');
77
+ const existing = readFileSafe(dialogPath);
78
+ if (!existing) {
79
+ throw new Error(`Canon dialog not found: ${dialogPath}`);
80
+ }
81
+ const lines = [
82
+ existing,
83
+ '',
84
+ '---',
85
+ '',
86
+ '# Reality Convergence',
87
+ '',
88
+ stampRaw,
89
+ '',
90
+ '---',
91
+ '',
92
+ ];
93
+ for (const msg of validationDialog) {
94
+ const role = msg.role === 'user' ? 'HUMAN' : 'ASSISTANT';
95
+ lines.push(`${role}: ${msg.content}`);
96
+ lines.push('');
97
+ }
98
+ const content = lines.join('\n');
99
+ writeFile(dialogPath, content);
100
+ return dialogPath;
101
+ }
102
+ /**
103
+ * Normalize literal \n (backslash + n) sequences to real newlines.
104
+ * Client LLMs sometimes send escaped strings via MCP.
105
+ */
106
+ function normalizeLiteralNewlines(text) {
107
+ // Only replace if the text contains literal \n but no real newlines —
108
+ // this indicates the entire content is on one line with escaped newlines.
109
+ if (!text.includes('\n') && text.includes('\\n')) {
110
+ return text.replace(/\\n/g, '\n');
111
+ }
112
+ return text;
113
+ }
114
+ function formatDialog(session, _name, _date, mode, metadata) {
115
+ const lines = [];
116
+ lines.push('# DialogSpec Dialog');
117
+ lines.push('<!-- This is the canon — the verbatim dialog is the only source of truth -->');
118
+ lines.push('<!-- All other files (summary, project files, tests) are derived from this dialog -->');
119
+ lines.push('');
120
+ // Only add stampRaw at the top if the stamp is NOT already in the dialog messages.
121
+ // The client may include the stamp in the last assistant message, which would cause duplication.
122
+ const stampInMessages = session.stampRaw && session.messages.some((msg) => msg.content.includes('=== DIALOGSPEC STAMP ==='));
123
+ if (session.stampRaw && !stampInMessages) {
124
+ lines.push(session.stampRaw);
125
+ lines.push('');
126
+ }
127
+ lines.push('---');
128
+ lines.push('');
129
+ for (const msg of session.messages) {
130
+ const role = msg.role === 'user' ? 'HUMAN' : 'ASSISTANT';
131
+ lines.push(`${role}: ${msg.content}`);
132
+ lines.push('');
133
+ }
134
+ // Append CANON METADATA block (server-generated replay context)
135
+ if (metadata) {
136
+ lines.push('');
137
+ lines.push(formatCanonMetadata(metadata));
138
+ }
139
+ // Append HUMAN STAMP block (auto-approved for dialog mode, pending for full mode)
140
+ lines.push('');
141
+ lines.push(mode === 'dialog' ? createAutoApprovedHumanStamp() : createPendingHumanStamp());
142
+ lines.push('');
143
+ return lines.join('\n');
144
+ }
145
+ /**
146
+ * Update the canon index with a new or updated entry.
147
+ * Regenerates the full index from filesystem state.
148
+ */
149
+ export function updateCanonIndex(_name, _status, _date, projectPath) {
150
+ regenerateIndex(projectPath);
151
+ }
152
+ //# sourceMappingURL=canon-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canon-writer.js","sourceRoot":"","sources":["../../../src/core/session/canon-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Session, SessionMeta, SessionStatus, Message } from '../types.js';
2
+ export declare function createSession(projectPath: string, name: string, systemPrompt: string): Session;
3
+ export declare function saveSession(projectPath: string, session: Session): void;
4
+ export declare function loadSession(projectPath: string, id: string): Session | null;
5
+ export declare function listSessions(projectPath: string): SessionMeta[];
6
+ export declare function getLastSession(projectPath: string): Session | null;
7
+ export declare function findSessionByName(projectPath: string, name: string): Session | null;
8
+ export declare function addMessage(session: Session, message: Message): void;
9
+ export declare function updateStatus(session: Session, status: SessionStatus): void;
10
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAgChF,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAa9F;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAIvE;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAS3E;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA4B/D;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAIlE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAOnF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAE1E"}
@@ -0,0 +1,105 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ function isSession(obj) {
4
+ return (typeof obj === 'object' && obj !== null &&
5
+ typeof obj.id === 'string' &&
6
+ typeof obj.name === 'string' &&
7
+ Array.isArray(obj.messages));
8
+ }
9
+ const SESSIONS_DIR = '.pantion/sessions';
10
+ function getSessionsDir(projectPath) {
11
+ const dir = resolve(projectPath, SESSIONS_DIR);
12
+ if (!existsSync(dir)) {
13
+ mkdirSync(dir, { recursive: true });
14
+ }
15
+ return dir;
16
+ }
17
+ function sessionPath(projectPath, id) {
18
+ return resolve(getSessionsDir(projectPath), `${id}.json`);
19
+ }
20
+ function generateId() {
21
+ const now = new Date();
22
+ const date = now.toISOString().split('T')[0].replace(/-/g, '');
23
+ const rand = Math.random().toString(36).slice(2, 8);
24
+ return `${date}-${rand}`;
25
+ }
26
+ export function createSession(projectPath, name, systemPrompt) {
27
+ const now = new Date().toISOString();
28
+ const session = {
29
+ id: generateId(),
30
+ name,
31
+ status: 'active',
32
+ messages: [],
33
+ systemPrompt,
34
+ createdAt: now,
35
+ updatedAt: now,
36
+ };
37
+ saveSession(projectPath, session);
38
+ return session;
39
+ }
40
+ export function saveSession(projectPath, session) {
41
+ session.updatedAt = new Date().toISOString();
42
+ const path = sessionPath(projectPath, session.id);
43
+ writeFileSync(path, JSON.stringify(session, null, 2), 'utf-8');
44
+ }
45
+ export function loadSession(projectPath, id) {
46
+ const path = sessionPath(projectPath, id);
47
+ if (!existsSync(path))
48
+ return null;
49
+ try {
50
+ const data = JSON.parse(readFileSync(path, 'utf-8'));
51
+ return isSession(data) ? data : null;
52
+ }
53
+ catch {
54
+ return null;
55
+ }
56
+ }
57
+ export function listSessions(projectPath) {
58
+ const dir = getSessionsDir(projectPath);
59
+ const files = readdirSync(dir).filter((f) => f.endsWith('.json'));
60
+ const metas = [];
61
+ for (const file of files) {
62
+ try {
63
+ const data = JSON.parse(readFileSync(resolve(dir, file), 'utf-8'));
64
+ if (!isSession(data))
65
+ continue;
66
+ const session = data;
67
+ metas.push({
68
+ id: session.id,
69
+ name: session.name,
70
+ status: session.status,
71
+ dialog: session.dialog,
72
+ soul: session.soul,
73
+ updatedAt: session.updatedAt,
74
+ canonName: session.canonName,
75
+ messageCount: session.messages.length,
76
+ canonType: session.canonType,
77
+ targetDialogName: session.targetDialogName,
78
+ });
79
+ }
80
+ catch {
81
+ // skip corrupt files
82
+ }
83
+ }
84
+ return metas.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
85
+ }
86
+ export function getLastSession(projectPath) {
87
+ const metas = listSessions(projectPath);
88
+ if (metas.length === 0)
89
+ return null;
90
+ return loadSession(projectPath, metas[0].id);
91
+ }
92
+ export function findSessionByName(projectPath, name) {
93
+ const metas = listSessions(projectPath);
94
+ const match = metas.find((m) => m.name === name || m.canonName === name || m.id === name);
95
+ if (!match)
96
+ return null;
97
+ return loadSession(projectPath, match.id);
98
+ }
99
+ export function addMessage(session, message) {
100
+ session.messages.push(message);
101
+ }
102
+ export function updateStatus(session, status) {
103
+ session.status = status;
104
+ }
105
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/session/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Session, CanonMetadata } from '../types.js';
2
+ /**
3
+ * Get the skill canon directory: skills/{skillName}/canon/
4
+ */
5
+ export declare function skillCanonDir(projectPath: string, skillName: string): string;
6
+ /**
7
+ * Write a skill dialog file (THE CANON for the skill).
8
+ */
9
+ export declare function writeSkillDialogFile(session: Session, skillName: string, date: string, projectPath: string, mode?: 'dialog' | 'full', metadata?: CanonMetadata): string;
10
+ /**
11
+ * Write a skill summary file (DERIVED from skill canon).
12
+ */
13
+ export declare function writeSkillSummaryFile(skillName: string, date: string, summaryContent: string, projectPath: string): string;
14
+ /**
15
+ * Check if a skill has a canon (is a dynamic skill).
16
+ */
17
+ export declare function skillHasCanon(projectPath: string, skillName: string): boolean;
18
+ /**
19
+ * Read a skill's canon dialog.
20
+ */
21
+ export declare function readSkillCanonDialog(projectPath: string, skillName: string): string | null;
22
+ //# sourceMappingURL=canon-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canon-writer.d.ts","sourceRoot":"","sources":["../../../src/core/skill/canon-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI1D;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,EACxB,QAAQ,CAAC,EAAE,aAAa,GACvB,MAAM,CASR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,MAAM,CAcR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAI7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI1F"}
@@ -0,0 +1,96 @@
1
+ import { resolve } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { writeFile, readFileSafe, ensureDir, assertSafeName } from '../utils/fs.js';
4
+ import { createPendingHumanStamp, createAutoApprovedHumanStamp, formatCanonMetadata } from '../protocol/stamp-parser.js';
5
+ /**
6
+ * Get the skill canon directory: skills/{skillName}/canon/
7
+ */
8
+ export function skillCanonDir(projectPath, skillName) {
9
+ return resolve(projectPath, 'skills', skillName, 'canon');
10
+ }
11
+ /**
12
+ * Write a skill dialog file (THE CANON for the skill).
13
+ */
14
+ export function writeSkillDialogFile(session, skillName, date, projectPath, mode, metadata) {
15
+ assertSafeName(skillName);
16
+ const dir = skillCanonDir(projectPath, skillName);
17
+ ensureDir(dir);
18
+ const content = formatSkillDialog(session, skillName, mode, metadata);
19
+ const dialogPath = resolve(dir, 'skill-dialog.md');
20
+ writeFile(dialogPath, content);
21
+ return dialogPath;
22
+ }
23
+ /**
24
+ * Write a skill summary file (DERIVED from skill canon).
25
+ */
26
+ export function writeSkillSummaryFile(skillName, date, summaryContent, projectPath) {
27
+ assertSafeName(skillName);
28
+ const dir = skillCanonDir(projectPath, skillName);
29
+ ensureDir(dir);
30
+ // Normalize literal \n sequences to real newlines (client may send escaped strings)
31
+ let content = normalizeLiteralNewlines(summaryContent);
32
+ if (!content.includes('Derived from:')) {
33
+ content = `<!-- Derived from: skills/${skillName}/canon/skill-dialog.md, ${date} -->\n<!-- This is a DERIVED file — the skill dialog is the only source of truth -->\n\n${content}`;
34
+ }
35
+ const summaryPath = resolve(dir, 'skill-summary.md');
36
+ writeFile(summaryPath, content);
37
+ return summaryPath;
38
+ }
39
+ /**
40
+ * Check if a skill has a canon (is a dynamic skill).
41
+ */
42
+ export function skillHasCanon(projectPath, skillName) {
43
+ assertSafeName(skillName);
44
+ const dialogPath = resolve(skillCanonDir(projectPath, skillName), 'skill-dialog.md');
45
+ return existsSync(dialogPath);
46
+ }
47
+ /**
48
+ * Read a skill's canon dialog.
49
+ */
50
+ export function readSkillCanonDialog(projectPath, skillName) {
51
+ assertSafeName(skillName);
52
+ const dialogPath = resolve(skillCanonDir(projectPath, skillName), 'skill-dialog.md');
53
+ return readFileSafe(dialogPath);
54
+ }
55
+ /**
56
+ * Normalize literal \n (backslash + n) sequences to real newlines.
57
+ * Client LLMs sometimes send escaped strings via MCP.
58
+ */
59
+ function normalizeLiteralNewlines(text) {
60
+ if (!text.includes('\n') && text.includes('\\n')) {
61
+ return text.replace(/\\n/g, '\n');
62
+ }
63
+ return text;
64
+ }
65
+ function formatSkillDialog(session, skillName, mode, metadata) {
66
+ const lines = [];
67
+ lines.push('# Skill DialogSpec Dialog');
68
+ lines.push(`<!-- Skill canon for: ${skillName} -->`);
69
+ lines.push('<!-- This is the canon — the verbatim dialog is the only source of truth -->');
70
+ lines.push('<!-- All skill files (skill.json, convergence-rules.md, translate.md, prompts/) are derived from this dialog -->');
71
+ lines.push('');
72
+ // Only add stampRaw at the top if the stamp is NOT already in the dialog messages.
73
+ const stampInMessages = session.stampRaw && session.messages.some((msg) => msg.content.includes('=== DIALOGSPEC STAMP ==='));
74
+ if (session.stampRaw && !stampInMessages) {
75
+ lines.push(session.stampRaw);
76
+ lines.push('');
77
+ }
78
+ lines.push('---');
79
+ lines.push('');
80
+ for (const msg of session.messages) {
81
+ const role = msg.role === 'user' ? 'HUMAN' : 'ASSISTANT';
82
+ lines.push(`${role}: ${msg.content}`);
83
+ lines.push('');
84
+ }
85
+ // Append CANON METADATA block (server-generated replay context)
86
+ if (metadata) {
87
+ lines.push('');
88
+ lines.push(formatCanonMetadata(metadata));
89
+ }
90
+ // Append HUMAN STAMP block (auto-approved for dialog mode, pending for full mode)
91
+ lines.push('');
92
+ lines.push(mode === 'dialog' ? createAutoApprovedHumanStamp() : createPendingHumanStamp());
93
+ lines.push('');
94
+ return lines.join('\n');
95
+ }
96
+ //# sourceMappingURL=canon-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canon-writer.js","sourceRoot":"","sources":["../../../src/core/skill/canon-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Skill } from '../types.js';
2
+ /**
3
+ * List all available skills (deduplicated by name, project > user > bundled).
4
+ */
5
+ export declare function listSkills(projectPath: string, skillsDir?: string): Skill[];
6
+ /**
7
+ * Get a specific skill by name.
8
+ */
9
+ export declare function getSkill(name: string, projectPath: string, skillsDir?: string): Skill | null;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/skill/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AA0FxD;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAkB3E;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAE5F"}