@straiffi/archon 1.2.34 → 1.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.
Files changed (158) hide show
  1. package/dist/client/assets/TestsDialog-j0fYZ2AP.js +5 -0
  2. package/dist/client/assets/arc-4YfDy8uK.js +1 -0
  3. package/dist/client/assets/architecture-7EHR7CIX-B0ldQ5d_.js +1 -0
  4. package/dist/client/assets/architectureDiagram-3BPJPVTR-CnivPz9K.js +36 -0
  5. package/dist/client/assets/array-DOVTz2Mq.js +1 -0
  6. package/dist/client/assets/blockDiagram-GPEHLZMM-Rd0YcyFR.js +132 -0
  7. package/dist/client/assets/c4Diagram-AAUBKEIU-kFDNpO2v.js +10 -0
  8. package/dist/client/assets/channel-C2eURzdr.js +1 -0
  9. package/dist/client/assets/chunk-2J33WTMH-CaqozdP8.js +1 -0
  10. package/dist/client/assets/chunk-3OPIFGDE-B8iFdxrR.js +62 -0
  11. package/dist/client/assets/chunk-4BX2VUAB-B3mVWXS4.js +1 -0
  12. package/dist/client/assets/chunk-4EGX6M5U-DTB6Um9X.js +1 -0
  13. package/dist/client/assets/chunk-55IACEB6-BB-0ajVZ.js +1 -0
  14. package/dist/client/assets/chunk-5DO6E6H7-DtX6GYFY.js +1 -0
  15. package/dist/client/assets/chunk-5ZQYHXKU-BrIMEXNE.js +2 -0
  16. package/dist/client/assets/chunk-727SXJPM-BtIA7PWh.js +206 -0
  17. package/dist/client/assets/chunk-AQP2D5EJ-fZoHENDl.js +231 -0
  18. package/dist/client/assets/chunk-BR22UD5L-CkJbcXZG.js +1 -0
  19. package/dist/client/assets/chunk-BSJP7CBP-X4eyoSqE.js +1 -0
  20. package/dist/client/assets/chunk-CSCIHK7Q-DWO1NEfx.js +124 -0
  21. package/dist/client/assets/chunk-FHYWG6QK-Cb5GzaCb.js +1 -0
  22. package/dist/client/assets/chunk-FMBD7UC4-mGY2D2YB.js +15 -0
  23. package/dist/client/assets/chunk-KSCS5N6A-CF2IF83X.js +10 -0
  24. package/dist/client/assets/chunk-L5ZTLDWV-BUItv2Ib.js +1 -0
  25. package/dist/client/assets/chunk-LZXEDZCA-BXfHhDLH.js +2 -0
  26. package/dist/client/assets/chunk-MPE355IW-WT7jTCZh.js +1 -0
  27. package/dist/client/assets/chunk-MZUSXYTE-CClXfOSj.js +1 -0
  28. package/dist/client/assets/chunk-N66VUXT2-Bpe4yprw.js +1 -0
  29. package/dist/client/assets/chunk-ND2GUHAM-C2qj1a3s.js +1 -0
  30. package/dist/client/assets/chunk-NNHCCRGN-C4ci-Gd6.js +159 -0
  31. package/dist/client/assets/chunk-NZK2D7GU-Chir8aJ-.js +1 -0
  32. package/dist/client/assets/chunk-O5CBEL6O-DEfSochA.js +70 -0
  33. package/dist/client/assets/chunk-PUPMXCY4-Dh45WL5s.js +1 -0
  34. package/dist/client/assets/chunk-QZHKN3VN-U_l6-b5-.js +1 -0
  35. package/dist/client/assets/chunk-UIBZB4QT-Cp2xSKlH.js +1 -0
  36. package/dist/client/assets/chunk-WCWK7LTN-BOt5FFIu.js +1 -0
  37. package/dist/client/assets/chunk-WU5MYG2G-BszlpZ1y.js +1 -0
  38. package/dist/client/assets/chunk-XPW4576I-YiT9fJFY.js +32 -0
  39. package/dist/client/assets/classDiagram-4FO5ZUOK-D8cVFEdr.js +1 -0
  40. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BJah23qn.js +1 -0
  41. package/dist/client/assets/cose-bilkent-S5V4N54A-CtC2zeMr.js +1 -0
  42. package/dist/client/assets/cytoscape.esm-DnmRtSj9.js +321 -0
  43. package/dist/client/assets/dagre-5AiD43Uu.js +1 -0
  44. package/dist/client/assets/dagre-BM42HDAG-D-czLNXn.js +4 -0
  45. package/dist/client/assets/defaultLocale-Ck2Xxk-C.js +1 -0
  46. package/dist/client/assets/diagram-2AECGRRQ-DswYVROV.js +43 -0
  47. package/dist/client/assets/diagram-5GNKFQAL-C2LB4-Kp.js +10 -0
  48. package/dist/client/assets/diagram-KO2AKTUF-4pdiiwxL.js +3 -0
  49. package/dist/client/assets/diagram-LMA3HP47-DgGvwfLE.js +24 -0
  50. package/dist/client/assets/diagram-OG6HWLK6-ODytJwCx.js +24 -0
  51. package/dist/client/assets/dist-BQjeO--f.js +1 -0
  52. package/dist/client/assets/erDiagram-TEJ5UH35-CE_PuRb6.js +85 -0
  53. package/dist/client/assets/eventmodeling-FCH6USID-BczyucFk.js +1 -0
  54. package/dist/client/assets/flowDiagram-I6XJVG4X-COhcCfz4.js +162 -0
  55. package/dist/client/assets/ganttDiagram-6RSMTGT7-Dj2Sy2Gh.js +292 -0
  56. package/dist/client/assets/gitGraph-WXDBUCRP-x5mlGyzr.js +1 -0
  57. package/dist/client/assets/gitGraphDiagram-PVQCEYII-D_3GyFuB.js +106 -0
  58. package/dist/client/assets/graphlib-CMVU3iJd.js +1 -0
  59. package/dist/client/assets/index-C4OZfq84.js +260 -0
  60. package/dist/client/assets/index-I0a6lbgt.css +2 -0
  61. package/dist/client/assets/info-J43DQDTF-BsM_Qb70.js +1 -0
  62. package/dist/client/assets/infoDiagram-5YYISTIA-CBWV9QV_.js +2 -0
  63. package/dist/client/assets/init-Bft5Ffpj.js +1 -0
  64. package/dist/client/assets/ishikawaDiagram-YF4QCWOH-Ddnuid12.js +70 -0
  65. package/dist/client/assets/journeyDiagram-JHISSGLW-BpXuCD5H.js +139 -0
  66. package/dist/client/assets/kanban-definition-UN3LZRKU-BuZe6GDK.js +89 -0
  67. package/dist/client/assets/katex-Bpz5kWH9.js +257 -0
  68. package/dist/client/assets/line-BE4yoTuW.js +1 -0
  69. package/dist/client/assets/linear-BYVhmsFj.js +1 -0
  70. package/dist/client/assets/mermaid-parser.core-B2H_eqyg.js +4 -0
  71. package/dist/client/assets/mermaid.core-CU1B0VWF.js +9 -0
  72. package/dist/client/assets/mindmap-definition-RKZ34NQL-CG4XJeRx.js +96 -0
  73. package/dist/client/assets/ordinal-DIg8h6NI.js +1 -0
  74. package/dist/client/assets/packet-YPE3B663-DeVIMHV5.js +1 -0
  75. package/dist/client/assets/path-DfRbCp9y.js +1 -0
  76. package/dist/client/assets/pie-LRSECV5Y-ByRF4_cj.js +1 -0
  77. package/dist/client/assets/pieDiagram-4H26LBE5-CN5uHxOy.js +30 -0
  78. package/dist/client/assets/quadrantDiagram-W4KKPZXB-Bxov0SvH.js +7 -0
  79. package/dist/client/assets/radar-GUYGQ44K-XEreg8aR.js +1 -0
  80. package/dist/client/assets/requirementDiagram-4Y6WPE33-DWw4nY3R.js +84 -0
  81. package/dist/client/assets/rough.esm-DCvqWubr.js +1 -0
  82. package/dist/client/assets/sankeyDiagram-5OEKKPKP-CzRuy9FU.js +40 -0
  83. package/dist/client/assets/sequenceDiagram-3UESZ5HK-BLAdf9cH.js +162 -0
  84. package/dist/client/assets/src-BcaL9nCM.js +1 -0
  85. package/dist/client/assets/stateDiagram-AJRCARHV-Dbwp6kCy.js +1 -0
  86. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BWC0_Q2v.js +1 -0
  87. package/dist/client/assets/timeline-definition-PNZ67QCA-HajxAhbq.js +120 -0
  88. package/dist/client/assets/treeView-BLDUP644-D85P2Ji3.js +1 -0
  89. package/dist/client/assets/treemap-LRROVOQU-BnXG5utQ.js +1 -0
  90. package/dist/client/assets/vennDiagram-CIIHVFJN-DWaZcpRa.js +34 -0
  91. package/dist/client/assets/wardley-L42UT6IY-Ct9qHtJP.js +1 -0
  92. package/dist/client/assets/wardleyDiagram-YWT4CUSO-BPhQM7CW.js +78 -0
  93. package/dist/client/assets/xychartDiagram-2RQKCTM6-CITmODsS.js +7 -0
  94. package/dist/client/index.html +3 -4
  95. package/dist/server/db.js +90 -0
  96. package/dist/server/db.js.map +1 -1
  97. package/dist/server/index.js +384 -123
  98. package/dist/server/index.js.map +1 -1
  99. package/dist/server/lib/agent.js +462 -0
  100. package/dist/server/lib/agent.js.map +1 -1
  101. package/dist/server/lib/attachments.js +146 -0
  102. package/dist/server/lib/attachments.js.map +1 -1
  103. package/dist/server/lib/buildFlow.js +2 -1
  104. package/dist/server/lib/buildFlow.js.map +1 -1
  105. package/dist/server/lib/chatOperations.js +2 -0
  106. package/dist/server/lib/chatOperations.js.map +1 -1
  107. package/dist/server/lib/chats.js +9 -4
  108. package/dist/server/lib/chats.js.map +1 -1
  109. package/dist/server/lib/externalSource.js +32 -0
  110. package/dist/server/lib/externalSource.js.map +1 -0
  111. package/dist/server/lib/httpError.js +9 -0
  112. package/dist/server/lib/httpError.js.map +1 -0
  113. package/dist/server/lib/mobileAccess.js +3 -0
  114. package/dist/server/lib/mobileAccess.js.map +1 -1
  115. package/dist/server/lib/specArtifact.js +256 -0
  116. package/dist/server/lib/specArtifact.js.map +1 -0
  117. package/dist/server/lib/specDraft.js +33 -0
  118. package/dist/server/lib/specDraft.js.map +1 -0
  119. package/dist/server/lib/specExport.js +70 -0
  120. package/dist/server/lib/specExport.js.map +1 -0
  121. package/dist/server/lib/specFormatting.js +26 -0
  122. package/dist/server/lib/specFormatting.js.map +1 -0
  123. package/dist/server/lib/specMessages.js +47 -0
  124. package/dist/server/lib/specMessages.js.map +1 -0
  125. package/dist/server/lib/specOperations.js +150 -0
  126. package/dist/server/lib/specOperations.js.map +1 -0
  127. package/dist/server/lib/specSections.js +82 -0
  128. package/dist/server/lib/specSections.js.map +1 -0
  129. package/dist/server/lib/specs.js +318 -0
  130. package/dist/server/lib/specs.js.map +1 -0
  131. package/dist/server/lib/thinkingState.js +26 -0
  132. package/dist/server/lib/thinkingState.js.map +1 -1
  133. package/dist/server/lib/ticketBatch.js +55 -0
  134. package/dist/server/lib/ticketBatch.js.map +1 -0
  135. package/dist/server/lib/ticketDescriptionContract.js +52 -0
  136. package/dist/server/lib/ticketDescriptionContract.js.map +1 -0
  137. package/dist/server/lib/tickets.js +7 -3
  138. package/dist/server/lib/tickets.js.map +1 -1
  139. package/dist/server/workers/build.js +10 -1
  140. package/dist/server/workers/build.js.map +1 -1
  141. package/dist/server/workers/chat.js +10 -1
  142. package/dist/server/workers/chat.js.map +1 -1
  143. package/dist/server/workers/followUp.js +10 -1
  144. package/dist/server/workers/followUp.js.map +1 -1
  145. package/dist/server/workers/plan.js +10 -32
  146. package/dist/server/workers/plan.js.map +1 -1
  147. package/dist/server/workers/planFollowUp.js +10 -0
  148. package/dist/server/workers/planFollowUp.js.map +1 -1
  149. package/dist/server/workers/review.js +10 -1
  150. package/dist/server/workers/review.js.map +1 -1
  151. package/dist/server/workers/specSession.js +418 -0
  152. package/dist/server/workers/specSession.js.map +1 -0
  153. package/package.json +1 -1
  154. package/dist/client/assets/TestsDialog-1JPVtcz7.js +0 -5
  155. package/dist/client/assets/dropdown-menu-BULYW006.js +0 -43
  156. package/dist/client/assets/index-DGoXllNX.js +0 -150
  157. package/dist/client/assets/index-DoNUd8CK.css +0 -2
  158. /package/dist/client/assets/{rolldown-runtime-BYbx6iT9.js → chunk-BNv3lrIs.js} +0 -0
@@ -0,0 +1,70 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { formatSpecSections } from './specSections.js';
4
+ /**
5
+ * Build a human-readable markdown export of a spec snapshot for the project's
6
+ * `docs/plans` directory. The audience is a person reading the file in a
7
+ * markdown viewer, so Goal, Visualization, and UI Mockup are retained for
8
+ * orientation. `plan_text` (planning context) is omitted: it is process
9
+ * narrative about the spec session, not content a doc reader needs.
10
+ *
11
+ * Verification guidance is not surfaced at the wrapper level — each work item's
12
+ * description carries its own per-project testing guidance.
13
+ */
14
+ const EXPORT_SECTION_ORDER = [
15
+ 'workBreakdown',
16
+ 'likelyFiles',
17
+ 'assumptions',
18
+ 'openQuestions',
19
+ 'dependencies',
20
+ 'visualization',
21
+ 'uiMockup',
22
+ ];
23
+ const buildSpecExportMarkdown = ({ snapshot, specSession, }) => {
24
+ const sections = [];
25
+ sections.push(`# ${specSession.title}`);
26
+ sections.push('');
27
+ sections.push(`## Goal`);
28
+ sections.push('');
29
+ sections.push(snapshot.summary || '_No summary provided._');
30
+ sections.push('');
31
+ const renderedSections = formatSpecSections(snapshot, EXPORT_SECTION_ORDER);
32
+ for (const section of renderedSections) {
33
+ sections.push(`## ${section.heading}`);
34
+ sections.push('');
35
+ sections.push(section.body);
36
+ sections.push('');
37
+ }
38
+ sections.push('---');
39
+ sections.push('');
40
+ sections.push(`_Exported from spec session "${specSession.title}" on ${new Date().toISOString().split('T')[0]}_`);
41
+ return sections.join('\n') + '\n';
42
+ };
43
+ const slugify = (text) => {
44
+ return text
45
+ .toLowerCase()
46
+ .replace(/[^a-z0-9]+/g, '_')
47
+ .replace(/^_+|_+$/g, '')
48
+ .slice(0, 80);
49
+ };
50
+ export const exportSpecToDocs = ({ snapshot, specSession, repoPath, }) => {
51
+ const docsDir = path.join(repoPath, 'docs', 'plans');
52
+ const slug = slugify(specSession.title) || 'spec';
53
+ const filename = `${slug}_SPEC.md`;
54
+ const filePath = path.join(docsDir, filename);
55
+ fs.mkdirSync(docsDir, { recursive: true });
56
+ const content = buildSpecExportMarkdown({ snapshot, specSession });
57
+ fs.writeFileSync(filePath, content, 'utf-8');
58
+ return { content, filePath };
59
+ };
60
+ export const checkSpecExportCollision = ({ specSession, repoPath, }) => {
61
+ const docsDir = path.join(repoPath, 'docs', 'plans');
62
+ const slug = slugify(specSession.title) || 'spec';
63
+ const filename = `${slug}_SPEC.md`;
64
+ const filePath = path.join(docsDir, filename);
65
+ if (fs.existsSync(filePath)) {
66
+ return filePath;
67
+ }
68
+ return null;
69
+ };
70
+ //# sourceMappingURL=specExport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specExport.js","sourceRoot":"","sources":["../../../server/lib/specExport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ const NO_CONTENT = '_None_';
2
+ export const formatBulletList = (items) => {
3
+ if (items.length === 0) {
4
+ return NO_CONTENT;
5
+ }
6
+ return items.map(item => `- ${item}`).join('\n');
7
+ };
8
+ export const formatLikelyFiles = (files) => {
9
+ if (files.length === 0) {
10
+ return NO_CONTENT;
11
+ }
12
+ return files.map(file => `- \`${file.path}\` — ${file.reason || 'no reason provided'}`).join('\n');
13
+ };
14
+ export const formatWorkItems = (tickets) => {
15
+ if (tickets.length === 0) {
16
+ return NO_CONTENT;
17
+ }
18
+ return tickets.map(ticket => `### ${ticket.key} — ${ticket.title}\n\n${ticket.description}`).join('\n\n');
19
+ };
20
+ export const formatDependencies = (dependencies) => {
21
+ if (dependencies.length === 0) {
22
+ return NO_CONTENT;
23
+ }
24
+ return dependencies.map(dep => `- \`${dep.blocker_key}\` blocks \`${dep.dependent_key}\``).join('\n');
25
+ };
26
+ //# sourceMappingURL=specFormatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specFormatting.js","sourceRoot":"","sources":["../../../server/lib/specFormatting.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,QAAQ,CAAA;AAE3B,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAA4B,EAAU,EAAE;IACvE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAmC,EAAU,EAAE;IAC/E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAgC,EAAU,EAAE;IAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC3G,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,YAA0C,EAAU,EAAE;IACvF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,CAAC,WAAW,eAAe,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACvG,CAAC,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { randomUUID } from 'crypto';
2
+ import db from '../db.js';
3
+ import { listSpecMessageAttachments } from './attachments.js';
4
+ const listSpecMessagesStatement = db.prepare(`
5
+ SELECT id, spec_session_id, role, kind, content, created_at
6
+ FROM spec_messages
7
+ WHERE spec_session_id = ?
8
+ ORDER BY created_at ASC, rowid ASC
9
+ `);
10
+ const insertSpecMessageStatement = db.prepare(`
11
+ INSERT INTO spec_messages (id, spec_session_id, role, kind, content)
12
+ VALUES (?, ?, ?, ?, ?)
13
+ `);
14
+ const getSpecMessageStatement = db.prepare(`
15
+ SELECT id, spec_session_id, role, kind, content, created_at
16
+ FROM spec_messages
17
+ WHERE id = ?
18
+ `);
19
+ const touchSpecSessionStatement = db.prepare(`
20
+ UPDATE spec_sessions
21
+ SET updated_at = CURRENT_TIMESTAMP
22
+ WHERE id = ?
23
+ `);
24
+ export const listSpecMessages = (specSessionId, projectId) => {
25
+ const attachmentsByMessageId = listSpecMessageAttachments(specSessionId, projectId);
26
+ return listSpecMessagesStatement.all(specSessionId).map(row => ({
27
+ ...row,
28
+ attachments: attachmentsByMessageId.get(row.id) ?? [],
29
+ }));
30
+ };
31
+ export const getSpecMessage = (specMessageId) => {
32
+ const row = getSpecMessageStatement.get(specMessageId);
33
+ if (!row) {
34
+ return null;
35
+ }
36
+ return {
37
+ ...row,
38
+ attachments: [],
39
+ };
40
+ };
41
+ export const createSpecMessage = ({ specSessionId, role, kind, content, }) => {
42
+ const id = randomUUID();
43
+ insertSpecMessageStatement.run(id, specSessionId, role, kind, content);
44
+ touchSpecSessionStatement.run(specSessionId);
45
+ return id;
46
+ };
47
+ //# sourceMappingURL=specMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specMessages.js","sourceRoot":"","sources":["../../../server/lib/specMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAG7D,MAAM,yBAAyB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAK5C,CAAC,CAAA;AAEF,MAAM,0BAA0B,GAAG,EAAE,CAAC,OAAO,CAAC;;;CAG7C,CAAC,CAAA;AAEF,MAAM,uBAAuB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAI1C,CAAC,CAAA;AAEF,MAAM,yBAAyB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAI5C,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,aAAqB,EAAE,SAAiB,EAAiB,EAAE;IAC1F,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,aAAa,EAAE,SAAS,CAAC,CAAA;IAEnF,OAAQ,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpF,GAAG,GAAG;QACN,WAAW,EAAE,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;KACtD,CAAC,CAAC,CAAA;AACL,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,aAAqB,EAAsB,EAAE;IAC1E,MAAM,GAAG,GAAG,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAA+B,CAAA;IACpF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,GAAG,GAAG;QACN,WAAW,EAAE,EAAE;KAChB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,aAAa,EACb,IAAI,EACJ,IAAI,EACJ,OAAO,GAMR,EAAE,EAAE;IACH,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;IACvB,0BAA0B,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACtE,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC5C,OAAO,EAAE,CAAA;AACX,CAAC,CAAA"}
@@ -0,0 +1,150 @@
1
+ import { resolveDraftSpecAttachmentsForSession } from './attachments.js';
2
+ import { stopSpecAgent } from './agent.js';
3
+ import { parseIncomingExternalSource } from './externalSource.js';
4
+ import { normalizeModelId } from './models.js';
5
+ import { getProjectById } from './projects.js';
6
+ import { normalizeSkillNames } from './skills.js';
7
+ import { createSpecSession, getSpecSession, deleteSpecSession, getTicketIdsForOriginSpecSession, getChatSessionIdsForOriginSpecSession, clearOriginSpecReferences } from './specs.js';
8
+ import { getChatSession } from './chats.js';
9
+ import { getTicket } from './tickets.js';
10
+ import { startSpecSessionTurn } from '../workers/specSession.js';
11
+ const getPayloadValue = (payload, key) => {
12
+ return payload?.[key];
13
+ };
14
+ const getProjectSpecSession = (projectId, specSessionId) => {
15
+ const specSession = getSpecSession(specSessionId, { includeMessages: true });
16
+ if (!specSession || specSession.project_id !== projectId) {
17
+ return null;
18
+ }
19
+ return specSession;
20
+ };
21
+ const resolveSpecTool = (value) => {
22
+ if (value === 'claude') {
23
+ return 'claude';
24
+ }
25
+ return 'opencode';
26
+ };
27
+ export const createProjectSpecSession = ({ projectId, payload, broadcaster, }) => {
28
+ const project = getProjectById(projectId);
29
+ if (!project) {
30
+ return { ok: false, status: 404, error: 'Not found' };
31
+ }
32
+ const tool = resolveSpecTool(getPayloadValue(payload, 'tool'));
33
+ const requestedModel = getPayloadValue(payload, 'model');
34
+ const rawModel = typeof requestedModel === 'string' ? requestedModel : project.helper_model;
35
+ const normalizedModel = tool === 'opencode' ? normalizeModelId(rawModel) || null : null;
36
+ const requestedVariant = getPayloadValue(payload, 'variant');
37
+ const normalizedVariant = tool === 'opencode' && normalizedModel && typeof requestedVariant === 'string'
38
+ ? requestedVariant.trim() || null
39
+ : tool === 'opencode' && normalizedModel
40
+ ? project.helper_variant ?? null
41
+ : null;
42
+ const specSession = createSpecSession({
43
+ projectId: project.id,
44
+ tool,
45
+ model: normalizedModel,
46
+ variant: normalizedVariant,
47
+ skills: normalizeSkillNames(getPayloadValue(payload, 'skills')),
48
+ externalSource: parseIncomingExternalSource(getPayloadValue(payload, 'external_source')),
49
+ });
50
+ broadcaster.emit('spec-session:created', specSession);
51
+ return { ok: true, status: 201, value: specSession };
52
+ };
53
+ export const submitProjectSpecSessionMessage = ({ projectId, specSessionId, payload, broadcaster, }) => {
54
+ const project = getProjectById(projectId);
55
+ if (!project) {
56
+ return { ok: false, status: 404, error: 'Not found' };
57
+ }
58
+ const existing = getProjectSpecSession(project.id, specSessionId);
59
+ if (!existing) {
60
+ return { ok: false, status: 404, error: 'Not found' };
61
+ }
62
+ const requestedInstruction = getPayloadValue(payload, 'instruction');
63
+ const instruction = typeof requestedInstruction === 'string' ? requestedInstruction.trim() : '';
64
+ const requestedAttachmentIds = getPayloadValue(payload, 'attachment_ids');
65
+ if (requestedAttachmentIds !== undefined && (!Array.isArray(requestedAttachmentIds) || requestedAttachmentIds.some(value => typeof value !== 'string'))) {
66
+ return { ok: false, status: 400, error: 'attachment_ids must be an array of strings.' };
67
+ }
68
+ const attachmentIds = Array.isArray(requestedAttachmentIds)
69
+ ? requestedAttachmentIds.map(value => value.trim()).filter(Boolean)
70
+ : [];
71
+ if (!instruction && attachmentIds.length === 0) {
72
+ return { ok: false, status: 400, error: 'instruction or attachment_ids is required' };
73
+ }
74
+ const resolvedAttachments = resolveDraftSpecAttachmentsForSession({
75
+ specSessionId: existing.id,
76
+ attachmentIds,
77
+ });
78
+ if (!resolvedAttachments.ok) {
79
+ return { ok: false, status: 400, error: resolvedAttachments.error };
80
+ }
81
+ const requestedModel = getPayloadValue(payload, 'model');
82
+ const rawModel = typeof requestedModel === 'string' ? requestedModel : project.helper_model;
83
+ let accepted = false;
84
+ try {
85
+ accepted = startSpecSessionTurn({
86
+ specSessionId: existing.id,
87
+ instruction,
88
+ attachments: resolvedAttachments.attachments,
89
+ tool: existing.tool,
90
+ model: typeof rawModel === 'string' ? rawModel : null,
91
+ variant: typeof getPayloadValue(payload, 'variant') === 'string' ? getPayloadValue(payload, 'variant') : project.helper_variant,
92
+ skills: normalizeSkillNames(getPayloadValue(payload, 'skills')),
93
+ io: broadcaster,
94
+ });
95
+ }
96
+ catch (error) {
97
+ return { ok: false, status: 500, error: error instanceof Error ? error.message : String(error) };
98
+ }
99
+ if (!accepted) {
100
+ return { ok: false, status: 409, error: 'This spec session is already running.' };
101
+ }
102
+ return { ok: true, status: 200, value: getProjectSpecSession(project.id, existing.id) };
103
+ };
104
+ export const stopProjectSpecSessionResponse = async ({ projectId, specSessionId, }) => {
105
+ const project = getProjectById(projectId);
106
+ if (!project) {
107
+ return { ok: false, status: 404, error: 'Not found' };
108
+ }
109
+ const specSession = getProjectSpecSession(project.id, specSessionId);
110
+ if (!specSession) {
111
+ return { ok: false, status: 404, error: 'Not found' };
112
+ }
113
+ const stopped = await stopSpecAgent(specSession.id);
114
+ if (!stopped) {
115
+ return { ok: false, status: 409, error: 'No active spec response found for this session.' };
116
+ }
117
+ return { ok: true, status: 200, value: { ok: true } };
118
+ };
119
+ export const deleteProjectSpecSession = ({ projectId, specSessionId, broadcaster, }) => {
120
+ const project = getProjectById(projectId);
121
+ if (!project) {
122
+ return { ok: false, status: 404, error: 'Not found' };
123
+ }
124
+ const existing = getProjectSpecSession(project.id, specSessionId);
125
+ if (!existing) {
126
+ return { ok: false, status: 404, error: 'Not found' };
127
+ }
128
+ stopSpecAgent(specSessionId).catch(() => {
129
+ // Best-effort stop before delete; orphaned process is acceptable.
130
+ });
131
+ const affectedTicketIds = getTicketIdsForOriginSpecSession(specSessionId);
132
+ const affectedChatSessionIds = getChatSessionIdsForOriginSpecSession(specSessionId);
133
+ clearOriginSpecReferences(specSessionId);
134
+ deleteSpecSession(specSessionId);
135
+ for (const ticketId of affectedTicketIds) {
136
+ const ticket = getTicket(ticketId);
137
+ if (ticket) {
138
+ broadcaster.emit('ticket:updated', ticket);
139
+ }
140
+ }
141
+ for (const chatSessionId of affectedChatSessionIds) {
142
+ const chatSession = getChatSession(chatSessionId);
143
+ if (chatSession) {
144
+ broadcaster.emit('chat-session:updated', chatSession);
145
+ }
146
+ }
147
+ broadcaster.emit('spec-session:deleted', { id: specSessionId, project_id: project.id });
148
+ return { ok: true, status: 200, value: { ok: true } };
149
+ };
150
+ //# sourceMappingURL=specOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specOperations.js","sourceRoot":"","sources":["../../../server/lib/specOperations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { formatBulletList, formatDependencies, formatLikelyFiles, formatWorkItems } from './specFormatting.js';
2
+ export const SPEC_SECTION_LABELS = {
3
+ goal: 'Goal',
4
+ planningContext: 'Planning Context',
5
+ likelyFiles: 'Likely Files',
6
+ assumptions: 'Assumptions',
7
+ openQuestions: 'Open Questions',
8
+ workBreakdown: 'Work Breakdown',
9
+ dependencies: 'Dependencies',
10
+ visualization: 'Visualization',
11
+ uiMockup: 'UI Mockup',
12
+ };
13
+ /**
14
+ * Render a single snapshot section using the shared label map and content
15
+ * formatters. Returns null when the section has no content so callers can
16
+ * filter it out without an additional guard.
17
+ *
18
+ * `goal` and `planningContext` return null here because each rendering surface
19
+ * formats summary/plan_text differently per audience, so they are owned by the
20
+ * caller. This helper exists to keep labels and array/artifact formatting in
21
+ * one place so the same field can never render under two different headings.
22
+ */
23
+ export const formatSpecSection = (snapshot, key) => {
24
+ switch (key) {
25
+ case 'likelyFiles': {
26
+ if (snapshot.likely_files.length === 0) {
27
+ return null;
28
+ }
29
+ return { key, heading: SPEC_SECTION_LABELS.likelyFiles, body: formatLikelyFiles(snapshot.likely_files) };
30
+ }
31
+ case 'assumptions': {
32
+ if (snapshot.assumptions.length === 0) {
33
+ return null;
34
+ }
35
+ return { key, heading: SPEC_SECTION_LABELS.assumptions, body: formatBulletList(snapshot.assumptions) };
36
+ }
37
+ case 'openQuestions': {
38
+ if (snapshot.open_questions.length === 0) {
39
+ return null;
40
+ }
41
+ return { key, heading: SPEC_SECTION_LABELS.openQuestions, body: formatBulletList(snapshot.open_questions) };
42
+ }
43
+ case 'workBreakdown': {
44
+ if (snapshot.tickets.length === 0) {
45
+ return null;
46
+ }
47
+ return { key, heading: SPEC_SECTION_LABELS.workBreakdown, body: formatWorkItems(snapshot.tickets) };
48
+ }
49
+ case 'dependencies': {
50
+ if (snapshot.dependencies.length === 0) {
51
+ return null;
52
+ }
53
+ return { key, heading: SPEC_SECTION_LABELS.dependencies, body: formatDependencies(snapshot.dependencies) };
54
+ }
55
+ case 'visualization': {
56
+ if (!snapshot.mermaid) {
57
+ return null;
58
+ }
59
+ return { key, heading: SPEC_SECTION_LABELS.visualization, body: `\`\`\`mermaid\n${snapshot.mermaid}\n\`\`\`` };
60
+ }
61
+ case 'uiMockup': {
62
+ if (!snapshot.mockup) {
63
+ return null;
64
+ }
65
+ return { key, heading: SPEC_SECTION_LABELS.uiMockup, body: `\`\`\`archon-mockup\n${snapshot.mockup}\n\`\`\`` };
66
+ }
67
+ case 'goal':
68
+ case 'planningContext':
69
+ return null;
70
+ }
71
+ };
72
+ /**
73
+ * Render a sequence of snapshot sections in the order the caller requests.
74
+ * Empty sections are filtered out so the caller does not need to pre-check
75
+ * field lengths.
76
+ */
77
+ export const formatSpecSections = (snapshot, keys) => {
78
+ return keys
79
+ .map(key => formatSpecSection(snapshot, key))
80
+ .filter((section) => section !== null);
81
+ };
82
+ //# sourceMappingURL=specSections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specSections.js","sourceRoot":"","sources":["../../../server/lib/specSections.ts"],"names":[],"mappings":"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"}