@straiffi/archon 1.2.34 → 1.3.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 (158) hide show
  1. package/dist/client/assets/TestsDialog-DelI4dOJ.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-Cn7GlwQg.js +36 -0
  5. package/dist/client/assets/array-DOVTz2Mq.js +1 -0
  6. package/dist/client/assets/blockDiagram-GPEHLZMM-Dbt3i35a.js +132 -0
  7. package/dist/client/assets/c4Diagram-AAUBKEIU-BCNsqu0u.js +10 -0
  8. package/dist/client/assets/channel-BmkYY3c1.js +1 -0
  9. package/dist/client/assets/chunk-2J33WTMH-B9c8AzpT.js +1 -0
  10. package/dist/client/assets/chunk-3OPIFGDE-D-qpTyaE.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-bBV3HPCk.js +2 -0
  16. package/dist/client/assets/chunk-727SXJPM-InkxsEhY.js +206 -0
  17. package/dist/client/assets/chunk-AQP2D5EJ-DZZL694W.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-BuAgybUd.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-B9fgatSq.js +10 -0
  24. package/dist/client/assets/chunk-L5ZTLDWV-L-7z2xOe.js +1 -0
  25. package/dist/client/assets/chunk-LZXEDZCA-hrScZnrx.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-d2HjiRzD.js +1 -0
  30. package/dist/client/assets/chunk-NNHCCRGN-C4ci-Gd6.js +159 -0
  31. package/dist/client/assets/chunk-NZK2D7GU-C6cn05ZM.js +1 -0
  32. package/dist/client/assets/chunk-O5CBEL6O-BAjbtmB_.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-By4sIjXN.js +1 -0
  38. package/dist/client/assets/chunk-XPW4576I-YiT9fJFY.js +32 -0
  39. package/dist/client/assets/classDiagram-4FO5ZUOK-B9B9lIAo.js +1 -0
  40. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DXR72HYe.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-_iu0KXos.js +4 -0
  45. package/dist/client/assets/defaultLocale-Ck2Xxk-C.js +1 -0
  46. package/dist/client/assets/diagram-2AECGRRQ-DyBAakP6.js +43 -0
  47. package/dist/client/assets/diagram-5GNKFQAL-xD8YOWp-.js +10 -0
  48. package/dist/client/assets/diagram-KO2AKTUF-BQDiusQc.js +3 -0
  49. package/dist/client/assets/diagram-LMA3HP47-BRu1DXcK.js +24 -0
  50. package/dist/client/assets/diagram-OG6HWLK6-C3A1wt8S.js +24 -0
  51. package/dist/client/assets/dist-BQjeO--f.js +1 -0
  52. package/dist/client/assets/erDiagram-TEJ5UH35-C_fWil4q.js +85 -0
  53. package/dist/client/assets/eventmodeling-FCH6USID-BczyucFk.js +1 -0
  54. package/dist/client/assets/flowDiagram-I6XJVG4X-CKsgXWad.js +162 -0
  55. package/dist/client/assets/ganttDiagram-6RSMTGT7-DRhmLmdi.js +292 -0
  56. package/dist/client/assets/gitGraph-WXDBUCRP-x5mlGyzr.js +1 -0
  57. package/dist/client/assets/gitGraphDiagram-PVQCEYII-C34Vr5C1.js +106 -0
  58. package/dist/client/assets/graphlib-CMVU3iJd.js +1 -0
  59. package/dist/client/assets/index-DENrWubs.js +260 -0
  60. package/dist/client/assets/index-iElL-crz.css +2 -0
  61. package/dist/client/assets/info-J43DQDTF-BsM_Qb70.js +1 -0
  62. package/dist/client/assets/infoDiagram-5YYISTIA-Bkbr_hQH.js +2 -0
  63. package/dist/client/assets/init-Bft5Ffpj.js +1 -0
  64. package/dist/client/assets/ishikawaDiagram-YF4QCWOH-CEXsy2hU.js +70 -0
  65. package/dist/client/assets/journeyDiagram-JHISSGLW-RuKnL83f.js +139 -0
  66. package/dist/client/assets/kanban-definition-UN3LZRKU-DrlhCmkA.js +89 -0
  67. package/dist/client/assets/katex-Bpz5kWH9.js +257 -0
  68. package/dist/client/assets/line-CGdxyPh9.js +1 -0
  69. package/dist/client/assets/linear-BYVhmsFj.js +1 -0
  70. package/dist/client/assets/mermaid-parser.core-CbzywbCW.js +4 -0
  71. package/dist/client/assets/mermaid.core-09FBpi2R.js +9 -0
  72. package/dist/client/assets/mindmap-definition-RKZ34NQL-CXrsI5b1.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-HbOpep9N.js +30 -0
  78. package/dist/client/assets/quadrantDiagram-W4KKPZXB-BWw-ZWMn.js +7 -0
  79. package/dist/client/assets/radar-GUYGQ44K-XEreg8aR.js +1 -0
  80. package/dist/client/assets/requirementDiagram-4Y6WPE33-CpscsQdI.js +84 -0
  81. package/dist/client/assets/rough.esm-DCvqWubr.js +1 -0
  82. package/dist/client/assets/sankeyDiagram-5OEKKPKP-BoV5tyAf.js +40 -0
  83. package/dist/client/assets/sequenceDiagram-3UESZ5HK-CBcDRtjR.js +162 -0
  84. package/dist/client/assets/src-BcaL9nCM.js +1 -0
  85. package/dist/client/assets/stateDiagram-AJRCARHV-Df9lcs70.js +1 -0
  86. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-FIWIctC4.js +1 -0
  87. package/dist/client/assets/timeline-definition-PNZ67QCA-BFv1VICg.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-DPRtn-XH.js +34 -0
  91. package/dist/client/assets/wardley-L42UT6IY-Ct9qHtJP.js +1 -0
  92. package/dist/client/assets/wardleyDiagram-YWT4CUSO-CDiint0P.js +78 -0
  93. package/dist/client/assets/xychartDiagram-2RQKCTM6-ELyFdgmG.js +7 -0
  94. package/dist/client/index.html +3 -4
  95. package/dist/server/db.js +92 -0
  96. package/dist/server/db.js.map +1 -1
  97. package/dist/server/index.js +396 -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 +353 -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 +79 -0
  124. package/dist/server/lib/specMessages.js.map +1 -0
  125. package/dist/server/lib/specOperations.js +171 -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 +347 -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 +520 -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,171 @@
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, updateSpecSessionMode } 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 resolveSpecMode = (value) => {
28
+ return value === 'grill' ? 'grill' : 'standard';
29
+ };
30
+ export const createProjectSpecSession = ({ projectId, payload, broadcaster, }) => {
31
+ const project = getProjectById(projectId);
32
+ if (!project) {
33
+ return { ok: false, status: 404, error: 'Not found' };
34
+ }
35
+ const tool = resolveSpecTool(getPayloadValue(payload, 'tool'));
36
+ const mode = resolveSpecMode(getPayloadValue(payload, 'mode'));
37
+ const requestedModel = getPayloadValue(payload, 'model');
38
+ const rawModel = typeof requestedModel === 'string' ? requestedModel : project.helper_model;
39
+ const normalizedModel = tool === 'opencode' ? normalizeModelId(rawModel) || null : null;
40
+ const requestedVariant = getPayloadValue(payload, 'variant');
41
+ const normalizedVariant = tool === 'opencode' && normalizedModel && typeof requestedVariant === 'string'
42
+ ? requestedVariant.trim() || null
43
+ : tool === 'opencode' && normalizedModel
44
+ ? project.helper_variant ?? null
45
+ : null;
46
+ const specSession = createSpecSession({
47
+ projectId: project.id,
48
+ tool,
49
+ mode,
50
+ model: normalizedModel,
51
+ variant: normalizedVariant,
52
+ skills: normalizeSkillNames(getPayloadValue(payload, 'skills')),
53
+ externalSource: parseIncomingExternalSource(getPayloadValue(payload, 'external_source')),
54
+ });
55
+ broadcaster.emit('spec-session:created', specSession);
56
+ return { ok: true, status: 201, value: specSession };
57
+ };
58
+ export const updateProjectSpecSessionMode = ({ projectId, specSessionId, payload, broadcaster, }) => {
59
+ const project = getProjectById(projectId);
60
+ if (!project) {
61
+ return { ok: false, status: 404, error: 'Not found' };
62
+ }
63
+ const existing = getProjectSpecSession(project.id, specSessionId);
64
+ if (!existing) {
65
+ return { ok: false, status: 404, error: 'Not found' };
66
+ }
67
+ const updatedSession = updateSpecSessionMode(existing.id, resolveSpecMode(getPayloadValue(payload, 'mode')));
68
+ if (!updatedSession) {
69
+ return { ok: false, status: 404, error: 'Not found' };
70
+ }
71
+ broadcaster.emit('spec-session:updated', updatedSession);
72
+ return { ok: true, status: 200, value: updatedSession };
73
+ };
74
+ export const submitProjectSpecSessionMessage = ({ projectId, specSessionId, payload, broadcaster, }) => {
75
+ const project = getProjectById(projectId);
76
+ if (!project) {
77
+ return { ok: false, status: 404, error: 'Not found' };
78
+ }
79
+ const existing = getProjectSpecSession(project.id, specSessionId);
80
+ if (!existing) {
81
+ return { ok: false, status: 404, error: 'Not found' };
82
+ }
83
+ const requestedInstruction = getPayloadValue(payload, 'instruction');
84
+ const instruction = typeof requestedInstruction === 'string' ? requestedInstruction.trim() : '';
85
+ const requestedAttachmentIds = getPayloadValue(payload, 'attachment_ids');
86
+ if (requestedAttachmentIds !== undefined && (!Array.isArray(requestedAttachmentIds) || requestedAttachmentIds.some(value => typeof value !== 'string'))) {
87
+ return { ok: false, status: 400, error: 'attachment_ids must be an array of strings.' };
88
+ }
89
+ const attachmentIds = Array.isArray(requestedAttachmentIds)
90
+ ? requestedAttachmentIds.map(value => value.trim()).filter(Boolean)
91
+ : [];
92
+ if (!instruction && attachmentIds.length === 0) {
93
+ return { ok: false, status: 400, error: 'instruction or attachment_ids is required' };
94
+ }
95
+ const resolvedAttachments = resolveDraftSpecAttachmentsForSession({
96
+ specSessionId: existing.id,
97
+ attachmentIds,
98
+ });
99
+ if (!resolvedAttachments.ok) {
100
+ return { ok: false, status: 400, error: resolvedAttachments.error };
101
+ }
102
+ const requestedModel = getPayloadValue(payload, 'model');
103
+ const rawModel = typeof requestedModel === 'string' ? requestedModel : project.helper_model;
104
+ let accepted = false;
105
+ try {
106
+ accepted = startSpecSessionTurn({
107
+ specSessionId: existing.id,
108
+ instruction,
109
+ attachments: resolvedAttachments.attachments,
110
+ tool: existing.tool,
111
+ model: typeof rawModel === 'string' ? rawModel : null,
112
+ variant: typeof getPayloadValue(payload, 'variant') === 'string' ? getPayloadValue(payload, 'variant') : project.helper_variant,
113
+ skills: normalizeSkillNames(getPayloadValue(payload, 'skills')),
114
+ io: broadcaster,
115
+ });
116
+ }
117
+ catch (error) {
118
+ return { ok: false, status: 500, error: error instanceof Error ? error.message : String(error) };
119
+ }
120
+ if (!accepted) {
121
+ return { ok: false, status: 409, error: 'This spec session is already running.' };
122
+ }
123
+ return { ok: true, status: 200, value: getProjectSpecSession(project.id, existing.id) };
124
+ };
125
+ export const stopProjectSpecSessionResponse = async ({ projectId, specSessionId, }) => {
126
+ const project = getProjectById(projectId);
127
+ if (!project) {
128
+ return { ok: false, status: 404, error: 'Not found' };
129
+ }
130
+ const specSession = getProjectSpecSession(project.id, specSessionId);
131
+ if (!specSession) {
132
+ return { ok: false, status: 404, error: 'Not found' };
133
+ }
134
+ const stopped = await stopSpecAgent(specSession.id);
135
+ if (!stopped) {
136
+ return { ok: false, status: 409, error: 'No active spec response found for this session.' };
137
+ }
138
+ return { ok: true, status: 200, value: { ok: true } };
139
+ };
140
+ export const deleteProjectSpecSession = ({ projectId, specSessionId, broadcaster, }) => {
141
+ const project = getProjectById(projectId);
142
+ if (!project) {
143
+ return { ok: false, status: 404, error: 'Not found' };
144
+ }
145
+ const existing = getProjectSpecSession(project.id, specSessionId);
146
+ if (!existing) {
147
+ return { ok: false, status: 404, error: 'Not found' };
148
+ }
149
+ stopSpecAgent(specSessionId).catch(() => {
150
+ // Best-effort stop before delete; orphaned process is acceptable.
151
+ });
152
+ const affectedTicketIds = getTicketIdsForOriginSpecSession(specSessionId);
153
+ const affectedChatSessionIds = getChatSessionIdsForOriginSpecSession(specSessionId);
154
+ clearOriginSpecReferences(specSessionId);
155
+ deleteSpecSession(specSessionId);
156
+ for (const ticketId of affectedTicketIds) {
157
+ const ticket = getTicket(ticketId);
158
+ if (ticket) {
159
+ broadcaster.emit('ticket:updated', ticket);
160
+ }
161
+ }
162
+ for (const chatSessionId of affectedChatSessionIds) {
163
+ const chatSession = getChatSession(chatSessionId);
164
+ if (chatSession) {
165
+ broadcaster.emit('chat-session:updated', chatSession);
166
+ }
167
+ }
168
+ broadcaster.emit('spec-session:deleted', { id: specSessionId, project_id: project.id });
169
+ return { ok: true, status: 200, value: { ok: true } };
170
+ };
171
+ //# 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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"}
@@ -0,0 +1,347 @@
1
+ import { randomUUID } from 'crypto';
2
+ import db from '../db.js';
3
+ import { deleteSpecSessionAttachmentFiles } from './attachments.js';
4
+ import { listSpecMessages } from './specMessages.js';
5
+ const DEFAULT_SPEC_SESSION_TITLE = 'New spec';
6
+ const lastUserMessageAtSelect = `(
7
+ SELECT MAX(spec_messages.created_at)
8
+ FROM spec_messages
9
+ WHERE spec_messages.spec_session_id = spec_sessions.id
10
+ AND spec_messages.role = 'user'
11
+ )`;
12
+ const lastMessageAtSelect = `(
13
+ SELECT MAX(spec_messages.created_at)
14
+ FROM spec_messages
15
+ WHERE spec_messages.spec_session_id = spec_sessions.id
16
+ )`;
17
+ const activityAtSelect = `COALESCE(${lastMessageAtSelect}, spec_sessions.created_at)`;
18
+ const linkedTicketCountSelect = `(
19
+ SELECT COUNT(*)
20
+ FROM tickets
21
+ WHERE tickets.origin_spec_session_id = spec_sessions.id
22
+ )`;
23
+ const linkedChatCountSelect = `(
24
+ SELECT COUNT(*)
25
+ FROM chat_sessions
26
+ WHERE chat_sessions.origin_spec_session_id = spec_sessions.id
27
+ )`;
28
+ const firstUserMessagePreviewSelect = `(
29
+ SELECT spec_messages.content
30
+ FROM spec_messages
31
+ WHERE spec_messages.spec_session_id = spec_sessions.id
32
+ AND spec_messages.role = 'user'
33
+ ORDER BY spec_messages.created_at ASC, spec_messages.rowid ASC
34
+ LIMIT 1
35
+ )`;
36
+ const listSpecSessionsStatement = db.prepare(`
37
+ SELECT id, project_id, title, tool, model, variant, skills_json, mode, agent_status, agent_log, agent_message_id, previous_agent_log, previous_agent_message_id, streaming_response,
38
+ latest_snapshot_id, claude_session_id, opencode_session_id,
39
+ external_provider, external_id, external_key, external_url, external_metadata_json,
40
+ usage_snapshot_context_window, usage_snapshot_max_output_tokens, usage_snapshot_total_tokens,
41
+ usage_snapshot_input_tokens, usage_snapshot_output_tokens, usage_snapshot_cache_read_tokens,
42
+ usage_snapshot_reasoning_tokens, usage_snapshot_cost,
43
+ ${firstUserMessagePreviewSelect} AS first_user_message_preview,
44
+ ${linkedTicketCountSelect} AS linked_ticket_count,
45
+ ${linkedChatCountSelect} AS linked_chat_count,
46
+ ${lastUserMessageAtSelect} AS last_user_message_at,
47
+ ${activityAtSelect} AS activity_at, created_at, updated_at
48
+ FROM spec_sessions
49
+ WHERE project_id = ?
50
+ ORDER BY activity_at DESC, id DESC
51
+ `);
52
+ const getSpecSessionStatement = db.prepare(`
53
+ SELECT id, project_id, title, tool, model, variant, skills_json, mode, agent_status, agent_log, agent_message_id, previous_agent_log, previous_agent_message_id, streaming_response,
54
+ latest_snapshot_id, claude_session_id, opencode_session_id,
55
+ external_provider, external_id, external_key, external_url, external_metadata_json,
56
+ usage_snapshot_context_window, usage_snapshot_max_output_tokens, usage_snapshot_total_tokens,
57
+ usage_snapshot_input_tokens, usage_snapshot_output_tokens, usage_snapshot_cache_read_tokens,
58
+ usage_snapshot_reasoning_tokens, usage_snapshot_cost,
59
+ ${firstUserMessagePreviewSelect} AS first_user_message_preview,
60
+ ${linkedTicketCountSelect} AS linked_ticket_count,
61
+ ${linkedChatCountSelect} AS linked_chat_count,
62
+ ${lastUserMessageAtSelect} AS last_user_message_at,
63
+ ${activityAtSelect} AS activity_at, created_at, updated_at
64
+ FROM spec_sessions
65
+ WHERE id = ?
66
+ `);
67
+ const insertSpecSessionStatement = db.prepare(`
68
+ INSERT INTO spec_sessions (
69
+ id, project_id, title, tool, model, variant, skills_json, mode,
70
+ agent_status, agent_log, streaming_response, latest_snapshot_id, claude_session_id, opencode_session_id,
71
+ external_provider, external_id, external_key, external_url, external_metadata_json
72
+ )
73
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, NULL, NULL, NULL, ?, ?, ?, ?, ?)
74
+ `);
75
+ const updateSpecSessionModeStatement = db.prepare(`
76
+ UPDATE spec_sessions
77
+ SET mode = ?, updated_at = CURRENT_TIMESTAMP
78
+ WHERE id = ?
79
+ `);
80
+ const updateSpecSessionRunConfigStatement = db.prepare(`
81
+ UPDATE spec_sessions
82
+ SET tool = ?, model = ?, variant = ?, skills_json = ?, updated_at = CURRENT_TIMESTAMP
83
+ WHERE id = ?
84
+ `);
85
+ const updateSpecSessionStatusStatement = db.prepare(`
86
+ UPDATE spec_sessions
87
+ SET agent_status = ?, agent_log = ?, streaming_response = ?, updated_at = CURRENT_TIMESTAMP
88
+ WHERE id = ?
89
+ `);
90
+ const updateClaudeSessionIdStatement = db.prepare(`
91
+ UPDATE spec_sessions
92
+ SET claude_session_id = ?, updated_at = CURRENT_TIMESTAMP
93
+ WHERE id = ?
94
+ `);
95
+ const updateOpencodeSessionIdStatement = db.prepare(`
96
+ UPDATE spec_sessions
97
+ SET opencode_session_id = ?, updated_at = CURRENT_TIMESTAMP
98
+ WHERE id = ?
99
+ `);
100
+ const updateSpecSessionUsageSnapshotStatement = db.prepare(`
101
+ UPDATE spec_sessions
102
+ SET usage_snapshot_context_window = ?,
103
+ usage_snapshot_max_output_tokens = ?,
104
+ usage_snapshot_total_tokens = ?,
105
+ usage_snapshot_input_tokens = ?,
106
+ usage_snapshot_output_tokens = ?,
107
+ usage_snapshot_cache_read_tokens = ?,
108
+ usage_snapshot_reasoning_tokens = ?,
109
+ usage_snapshot_cost = ?,
110
+ updated_at = CURRENT_TIMESTAMP
111
+ WHERE id = ?
112
+ `);
113
+ const updateSpecSessionLatestSnapshotStatement = db.prepare(`
114
+ UPDATE spec_sessions
115
+ SET latest_snapshot_id = ?, updated_at = CURRENT_TIMESTAMP
116
+ WHERE id = ?
117
+ `);
118
+ const updateSpecSessionTitleStatement = db.prepare(`
119
+ UPDATE spec_sessions
120
+ SET title = ?, updated_at = CURRENT_TIMESTAMP
121
+ WHERE id = ?
122
+ `);
123
+ const deleteSpecSessionStatement = db.prepare(`
124
+ DELETE FROM spec_sessions
125
+ WHERE id = ?
126
+ `);
127
+ const deleteSpecSessionAttachmentsSql = db.prepare(`
128
+ DELETE FROM attachments
129
+ WHERE chat_session_id = ?
130
+ `);
131
+ const insertSpecSnapshotStatement = db.prepare(`
132
+ INSERT INTO spec_snapshots (id, spec_session_id, summary, assumptions_json, open_questions_json, likely_files_json, tickets_json, dependencies_json, mermaid, mockup, plan_text)
133
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
134
+ `);
135
+ const getSpecSnapshotStatement = db.prepare(`
136
+ SELECT id, spec_session_id, summary, assumptions_json, open_questions_json, likely_files_json, tickets_json, dependencies_json, mermaid, mockup, plan_text, created_at
137
+ FROM spec_snapshots
138
+ WHERE id = ?
139
+ `);
140
+ const parseSpecSkills = (value) => {
141
+ if (!value) {
142
+ return [];
143
+ }
144
+ try {
145
+ const parsed = JSON.parse(value);
146
+ if (!Array.isArray(parsed)) {
147
+ return [];
148
+ }
149
+ return parsed
150
+ .filter((entry) => typeof entry === 'string')
151
+ .map(entry => entry.trim())
152
+ .filter(Boolean)
153
+ .filter((entry, index, values) => values.indexOf(entry) === index);
154
+ }
155
+ catch {
156
+ return [];
157
+ }
158
+ };
159
+ export const resolveSpecModeValue = (value) => {
160
+ return value === 'grill' ? 'grill' : 'standard';
161
+ };
162
+ const parseSpecExternalSource = (row) => {
163
+ if ((row.external_provider !== 'jira' && row.external_provider !== 'github')
164
+ || !row.external_id
165
+ || !row.external_key) {
166
+ return null;
167
+ }
168
+ let metadata = null;
169
+ if (row.external_metadata_json) {
170
+ try {
171
+ const parsed = JSON.parse(row.external_metadata_json);
172
+ metadata = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
173
+ }
174
+ catch {
175
+ metadata = null;
176
+ }
177
+ }
178
+ return {
179
+ provider: row.external_provider,
180
+ external_id: row.external_id,
181
+ external_key: row.external_key,
182
+ external_url: row.external_url ?? null,
183
+ metadata,
184
+ };
185
+ };
186
+ const serializeSpecSession = (row, options = {}) => {
187
+ if (!row) {
188
+ return null;
189
+ }
190
+ const sessionBase = {
191
+ id: row.id,
192
+ project_id: row.project_id,
193
+ title: row.title,
194
+ tool: row.tool,
195
+ model: row.model,
196
+ variant: row.variant,
197
+ skills: parseSpecSkills(row.skills_json),
198
+ mode: resolveSpecModeValue(row.mode),
199
+ agent_status: row.agent_status,
200
+ agent_log: row.agent_log,
201
+ agent_message_id: row.agent_message_id ?? null,
202
+ previous_agent_log: row.previous_agent_log ?? null,
203
+ previous_agent_message_id: row.previous_agent_message_id ?? null,
204
+ streaming_response: row.streaming_response,
205
+ latest_snapshot_id: row.latest_snapshot_id ?? null,
206
+ claude_session_id: row.claude_session_id,
207
+ opencode_session_id: row.opencode_session_id,
208
+ linked_ticket_count: typeof row.linked_ticket_count === 'number' ? row.linked_ticket_count : 0,
209
+ linked_chat_count: typeof row.linked_chat_count === 'number' ? row.linked_chat_count : 0,
210
+ first_user_message_preview: row.first_user_message_preview ?? null,
211
+ activity_at: row.activity_at,
212
+ last_user_message_at: row.last_user_message_at ?? null,
213
+ external_source: parseSpecExternalSource(row),
214
+ usage_snapshot_context_window: row.usage_snapshot_context_window ?? null,
215
+ usage_snapshot_max_output_tokens: row.usage_snapshot_max_output_tokens ?? null,
216
+ usage_snapshot_total_tokens: row.usage_snapshot_total_tokens ?? null,
217
+ usage_snapshot_input_tokens: row.usage_snapshot_input_tokens ?? null,
218
+ usage_snapshot_output_tokens: row.usage_snapshot_output_tokens ?? null,
219
+ usage_snapshot_cache_read_tokens: row.usage_snapshot_cache_read_tokens ?? null,
220
+ usage_snapshot_reasoning_tokens: row.usage_snapshot_reasoning_tokens ?? null,
221
+ usage_snapshot_cost: row.usage_snapshot_cost ?? null,
222
+ created_at: row.created_at,
223
+ updated_at: row.updated_at,
224
+ };
225
+ return options.includeMessages
226
+ ? {
227
+ ...sessionBase,
228
+ messages: listSpecMessages(row.id, row.project_id),
229
+ }
230
+ : sessionBase;
231
+ };
232
+ export const getDefaultSpecSessionTitle = () => DEFAULT_SPEC_SESSION_TITLE;
233
+ export const deriveSpecSessionTitle = (prompt) => {
234
+ const normalized = prompt
235
+ .replace(/\s+/g, ' ')
236
+ .trim();
237
+ if (!normalized) {
238
+ return DEFAULT_SPEC_SESSION_TITLE;
239
+ }
240
+ return normalized.length > 80 ? `${normalized.slice(0, 77).trimEnd()}...` : normalized;
241
+ };
242
+ export const listSpecSessions = (projectId) => {
243
+ return listSpecSessionsStatement.all(projectId)
244
+ .map(row => serializeSpecSession(row))
245
+ .filter((session) => session !== null);
246
+ };
247
+ export const getSpecSession = (id, options = {}) => {
248
+ return serializeSpecSession(getSpecSessionStatement.get(id), options);
249
+ };
250
+ export const createSpecSession = ({ projectId, tool, model, variant, skills, title = DEFAULT_SPEC_SESSION_TITLE, mode = 'standard', externalSource = null, }) => {
251
+ const id = randomUUID();
252
+ insertSpecSessionStatement.run(id, projectId, title.trim() || DEFAULT_SPEC_SESSION_TITLE, tool, model, variant, JSON.stringify(skills ?? []), resolveSpecModeValue(mode), externalSource?.provider ?? null, externalSource?.external_id ?? null, externalSource?.external_key ?? null, externalSource?.external_url ?? null, externalSource?.metadata ? JSON.stringify(externalSource.metadata) : null);
253
+ return getSpecSession(id, { includeMessages: true });
254
+ };
255
+ export const updateSpecSessionMode = (specSessionId, mode) => {
256
+ updateSpecSessionModeStatement.run(resolveSpecModeValue(mode), specSessionId);
257
+ return getSpecSession(specSessionId, { includeMessages: true });
258
+ };
259
+ export const updateSpecSessionTitle = (specSessionId, title) => {
260
+ updateSpecSessionTitleStatement.run(title.trim() || DEFAULT_SPEC_SESSION_TITLE, specSessionId);
261
+ };
262
+ export const updateSpecSessionRunConfig = ({ specSessionId, tool, model, variant, skills, }) => {
263
+ updateSpecSessionRunConfigStatement.run(tool, model, variant, JSON.stringify(skills), specSessionId);
264
+ };
265
+ export const updateSpecSessionStatus = (specSessionId, status, log, streamingResponse) => {
266
+ updateSpecSessionStatusStatement.run(status, log, streamingResponse, specSessionId);
267
+ };
268
+ export const clearSpecSessionStreamingResponse = (specSessionId) => {
269
+ db.prepare('UPDATE spec_sessions SET streaming_response = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(specSessionId);
270
+ };
271
+ export const updateSpecSessionResumeId = (specSessionId, tool, sessionId) => {
272
+ if (tool === 'claude') {
273
+ updateClaudeSessionIdStatement.run(sessionId, specSessionId);
274
+ return;
275
+ }
276
+ updateOpencodeSessionIdStatement.run(sessionId, specSessionId);
277
+ };
278
+ export const updateSpecSessionUsageSnapshot = (specSessionId, usage) => {
279
+ updateSpecSessionUsageSnapshotStatement.run(usage.usage_snapshot_context_window, usage.usage_snapshot_max_output_tokens, usage.usage_snapshot_total_tokens, usage.usage_snapshot_input_tokens, usage.usage_snapshot_output_tokens, usage.usage_snapshot_cache_read_tokens, usage.usage_snapshot_reasoning_tokens, usage.usage_snapshot_cost, specSessionId);
280
+ };
281
+ export const updateSpecSessionLatestSnapshot = (specSessionId, snapshotId) => {
282
+ updateSpecSessionLatestSnapshotStatement.run(snapshotId, specSessionId);
283
+ };
284
+ export const deleteSpecSession = (specSessionId) => {
285
+ deleteSpecSessionAttachmentFiles(specSessionId);
286
+ deleteSpecSessionAttachmentsSql.run(specSessionId);
287
+ deleteSpecSessionStatement.run(specSessionId);
288
+ };
289
+ export const createSpecSnapshot = ({ specSessionId, summary, assumptions, openQuestions, likelyFiles, tickets, dependencies, mermaid, mockup, planText, }) => {
290
+ const id = randomUUID();
291
+ insertSpecSnapshotStatement.run(id, specSessionId, summary, JSON.stringify(assumptions), JSON.stringify(openQuestions), JSON.stringify(likelyFiles), JSON.stringify(tickets), JSON.stringify(dependencies), mermaid, mockup, planText);
292
+ return id;
293
+ };
294
+ export const getSpecSnapshot = (snapshotId) => {
295
+ const row = getSpecSnapshotStatement.get(snapshotId);
296
+ if (!row) {
297
+ return null;
298
+ }
299
+ return {
300
+ id: row.id,
301
+ spec_session_id: row.spec_session_id,
302
+ summary: row.summary ?? '',
303
+ assumptions: parseSnapshotJsonArray(row.assumptions_json),
304
+ open_questions: parseSnapshotJsonArray(row.open_questions_json),
305
+ likely_files: parseSnapshotJsonArray(row.likely_files_json),
306
+ tickets: parseSnapshotJsonArray(row.tickets_json),
307
+ dependencies: parseSnapshotJsonArray(row.dependencies_json),
308
+ mermaid: row.mermaid,
309
+ mockup: row.mockup,
310
+ plan_text: row.plan_text ?? '',
311
+ created_at: row.created_at,
312
+ };
313
+ };
314
+ const getCreatedTicketIdsForSnapshotStatement = db.prepare('SELECT id FROM tickets WHERE origin_spec_snapshot_id = ? AND project_id = ? ORDER BY created_at DESC, id DESC');
315
+ export const getCreatedTicketIdsForSnapshot = (snapshotId, projectId) => {
316
+ const rows = getCreatedTicketIdsForSnapshotStatement.all(snapshotId, projectId);
317
+ return rows.map(row => row.id);
318
+ };
319
+ const getTicketIdsForOriginSpecSessionStatement = db.prepare('SELECT id FROM tickets WHERE origin_spec_session_id = ?');
320
+ export const getTicketIdsForOriginSpecSession = (specSessionId) => {
321
+ const rows = getTicketIdsForOriginSpecSessionStatement.all(specSessionId);
322
+ return rows.map(row => row.id);
323
+ };
324
+ const getChatSessionIdsForOriginSpecSessionStatement = db.prepare('SELECT id FROM chat_sessions WHERE origin_spec_session_id = ?');
325
+ export const getChatSessionIdsForOriginSpecSession = (specSessionId) => {
326
+ const rows = getChatSessionIdsForOriginSpecSessionStatement.all(specSessionId);
327
+ return rows.map(row => row.id);
328
+ };
329
+ const clearOriginSpecReferencesOnTicketsStatement = db.prepare('UPDATE tickets SET origin_spec_session_id = NULL, origin_spec_snapshot_id = NULL WHERE origin_spec_session_id = ?');
330
+ const clearOriginSpecReferencesOnChatSessionsStatement = db.prepare('UPDATE chat_sessions SET origin_spec_session_id = NULL, origin_spec_snapshot_id = NULL WHERE origin_spec_session_id = ?');
331
+ export const clearOriginSpecReferences = (specSessionId) => {
332
+ clearOriginSpecReferencesOnTicketsStatement.run(specSessionId);
333
+ clearOriginSpecReferencesOnChatSessionsStatement.run(specSessionId);
334
+ };
335
+ const parseSnapshotJsonArray = (value) => {
336
+ if (!value) {
337
+ return [];
338
+ }
339
+ try {
340
+ const parsed = JSON.parse(value);
341
+ return Array.isArray(parsed) ? parsed : [];
342
+ }
343
+ catch {
344
+ return [];
345
+ }
346
+ };
347
+ //# sourceMappingURL=specs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs.js","sourceRoot":"","sources":["../../../server/lib/specs.ts"],"names":[],"mappings":"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"}