@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.
- package/dist/client/assets/TestsDialog-DelI4dOJ.js +5 -0
- package/dist/client/assets/arc-4YfDy8uK.js +1 -0
- package/dist/client/assets/architecture-7EHR7CIX-B0ldQ5d_.js +1 -0
- package/dist/client/assets/architectureDiagram-3BPJPVTR-Cn7GlwQg.js +36 -0
- package/dist/client/assets/array-DOVTz2Mq.js +1 -0
- package/dist/client/assets/blockDiagram-GPEHLZMM-Dbt3i35a.js +132 -0
- package/dist/client/assets/c4Diagram-AAUBKEIU-BCNsqu0u.js +10 -0
- package/dist/client/assets/channel-BmkYY3c1.js +1 -0
- package/dist/client/assets/chunk-2J33WTMH-B9c8AzpT.js +1 -0
- package/dist/client/assets/chunk-3OPIFGDE-D-qpTyaE.js +62 -0
- package/dist/client/assets/chunk-4BX2VUAB-B3mVWXS4.js +1 -0
- package/dist/client/assets/chunk-4EGX6M5U-DTB6Um9X.js +1 -0
- package/dist/client/assets/chunk-55IACEB6-BB-0ajVZ.js +1 -0
- package/dist/client/assets/chunk-5DO6E6H7-DtX6GYFY.js +1 -0
- package/dist/client/assets/chunk-5ZQYHXKU-bBV3HPCk.js +2 -0
- package/dist/client/assets/chunk-727SXJPM-InkxsEhY.js +206 -0
- package/dist/client/assets/chunk-AQP2D5EJ-DZZL694W.js +231 -0
- package/dist/client/assets/chunk-BR22UD5L-CkJbcXZG.js +1 -0
- package/dist/client/assets/chunk-BSJP7CBP-X4eyoSqE.js +1 -0
- package/dist/client/assets/chunk-CSCIHK7Q-BuAgybUd.js +124 -0
- package/dist/client/assets/chunk-FHYWG6QK-Cb5GzaCb.js +1 -0
- package/dist/client/assets/chunk-FMBD7UC4-mGY2D2YB.js +15 -0
- package/dist/client/assets/chunk-KSCS5N6A-B9fgatSq.js +10 -0
- package/dist/client/assets/chunk-L5ZTLDWV-L-7z2xOe.js +1 -0
- package/dist/client/assets/chunk-LZXEDZCA-hrScZnrx.js +2 -0
- package/dist/client/assets/chunk-MPE355IW-WT7jTCZh.js +1 -0
- package/dist/client/assets/chunk-MZUSXYTE-CClXfOSj.js +1 -0
- package/dist/client/assets/chunk-N66VUXT2-Bpe4yprw.js +1 -0
- package/dist/client/assets/chunk-ND2GUHAM-d2HjiRzD.js +1 -0
- package/dist/client/assets/chunk-NNHCCRGN-C4ci-Gd6.js +159 -0
- package/dist/client/assets/chunk-NZK2D7GU-C6cn05ZM.js +1 -0
- package/dist/client/assets/chunk-O5CBEL6O-BAjbtmB_.js +70 -0
- package/dist/client/assets/chunk-PUPMXCY4-Dh45WL5s.js +1 -0
- package/dist/client/assets/chunk-QZHKN3VN-U_l6-b5-.js +1 -0
- package/dist/client/assets/chunk-UIBZB4QT-Cp2xSKlH.js +1 -0
- package/dist/client/assets/chunk-WCWK7LTN-BOt5FFIu.js +1 -0
- package/dist/client/assets/chunk-WU5MYG2G-By4sIjXN.js +1 -0
- package/dist/client/assets/chunk-XPW4576I-YiT9fJFY.js +32 -0
- package/dist/client/assets/classDiagram-4FO5ZUOK-B9B9lIAo.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DXR72HYe.js +1 -0
- package/dist/client/assets/cose-bilkent-S5V4N54A-CtC2zeMr.js +1 -0
- package/dist/client/assets/cytoscape.esm-DnmRtSj9.js +321 -0
- package/dist/client/assets/dagre-5AiD43Uu.js +1 -0
- package/dist/client/assets/dagre-BM42HDAG-_iu0KXos.js +4 -0
- package/dist/client/assets/defaultLocale-Ck2Xxk-C.js +1 -0
- package/dist/client/assets/diagram-2AECGRRQ-DyBAakP6.js +43 -0
- package/dist/client/assets/diagram-5GNKFQAL-xD8YOWp-.js +10 -0
- package/dist/client/assets/diagram-KO2AKTUF-BQDiusQc.js +3 -0
- package/dist/client/assets/diagram-LMA3HP47-BRu1DXcK.js +24 -0
- package/dist/client/assets/diagram-OG6HWLK6-C3A1wt8S.js +24 -0
- package/dist/client/assets/dist-BQjeO--f.js +1 -0
- package/dist/client/assets/erDiagram-TEJ5UH35-C_fWil4q.js +85 -0
- package/dist/client/assets/eventmodeling-FCH6USID-BczyucFk.js +1 -0
- package/dist/client/assets/flowDiagram-I6XJVG4X-CKsgXWad.js +162 -0
- package/dist/client/assets/ganttDiagram-6RSMTGT7-DRhmLmdi.js +292 -0
- package/dist/client/assets/gitGraph-WXDBUCRP-x5mlGyzr.js +1 -0
- package/dist/client/assets/gitGraphDiagram-PVQCEYII-C34Vr5C1.js +106 -0
- package/dist/client/assets/graphlib-CMVU3iJd.js +1 -0
- package/dist/client/assets/index-DENrWubs.js +260 -0
- package/dist/client/assets/index-iElL-crz.css +2 -0
- package/dist/client/assets/info-J43DQDTF-BsM_Qb70.js +1 -0
- package/dist/client/assets/infoDiagram-5YYISTIA-Bkbr_hQH.js +2 -0
- package/dist/client/assets/init-Bft5Ffpj.js +1 -0
- package/dist/client/assets/ishikawaDiagram-YF4QCWOH-CEXsy2hU.js +70 -0
- package/dist/client/assets/journeyDiagram-JHISSGLW-RuKnL83f.js +139 -0
- package/dist/client/assets/kanban-definition-UN3LZRKU-DrlhCmkA.js +89 -0
- package/dist/client/assets/katex-Bpz5kWH9.js +257 -0
- package/dist/client/assets/line-CGdxyPh9.js +1 -0
- package/dist/client/assets/linear-BYVhmsFj.js +1 -0
- package/dist/client/assets/mermaid-parser.core-CbzywbCW.js +4 -0
- package/dist/client/assets/mermaid.core-09FBpi2R.js +9 -0
- package/dist/client/assets/mindmap-definition-RKZ34NQL-CXrsI5b1.js +96 -0
- package/dist/client/assets/ordinal-DIg8h6NI.js +1 -0
- package/dist/client/assets/packet-YPE3B663-DeVIMHV5.js +1 -0
- package/dist/client/assets/path-DfRbCp9y.js +1 -0
- package/dist/client/assets/pie-LRSECV5Y-ByRF4_cj.js +1 -0
- package/dist/client/assets/pieDiagram-4H26LBE5-HbOpep9N.js +30 -0
- package/dist/client/assets/quadrantDiagram-W4KKPZXB-BWw-ZWMn.js +7 -0
- package/dist/client/assets/radar-GUYGQ44K-XEreg8aR.js +1 -0
- package/dist/client/assets/requirementDiagram-4Y6WPE33-CpscsQdI.js +84 -0
- package/dist/client/assets/rough.esm-DCvqWubr.js +1 -0
- package/dist/client/assets/sankeyDiagram-5OEKKPKP-BoV5tyAf.js +40 -0
- package/dist/client/assets/sequenceDiagram-3UESZ5HK-CBcDRtjR.js +162 -0
- package/dist/client/assets/src-BcaL9nCM.js +1 -0
- package/dist/client/assets/stateDiagram-AJRCARHV-Df9lcs70.js +1 -0
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-FIWIctC4.js +1 -0
- package/dist/client/assets/timeline-definition-PNZ67QCA-BFv1VICg.js +120 -0
- package/dist/client/assets/treeView-BLDUP644-D85P2Ji3.js +1 -0
- package/dist/client/assets/treemap-LRROVOQU-BnXG5utQ.js +1 -0
- package/dist/client/assets/vennDiagram-CIIHVFJN-DPRtn-XH.js +34 -0
- package/dist/client/assets/wardley-L42UT6IY-Ct9qHtJP.js +1 -0
- package/dist/client/assets/wardleyDiagram-YWT4CUSO-CDiint0P.js +78 -0
- package/dist/client/assets/xychartDiagram-2RQKCTM6-ELyFdgmG.js +7 -0
- package/dist/client/index.html +3 -4
- package/dist/server/db.js +92 -0
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +396 -123
- package/dist/server/index.js.map +1 -1
- package/dist/server/lib/agent.js +462 -0
- package/dist/server/lib/agent.js.map +1 -1
- package/dist/server/lib/attachments.js +146 -0
- package/dist/server/lib/attachments.js.map +1 -1
- package/dist/server/lib/buildFlow.js +2 -1
- package/dist/server/lib/buildFlow.js.map +1 -1
- package/dist/server/lib/chatOperations.js +2 -0
- package/dist/server/lib/chatOperations.js.map +1 -1
- package/dist/server/lib/chats.js +9 -4
- package/dist/server/lib/chats.js.map +1 -1
- package/dist/server/lib/externalSource.js +32 -0
- package/dist/server/lib/externalSource.js.map +1 -0
- package/dist/server/lib/httpError.js +9 -0
- package/dist/server/lib/httpError.js.map +1 -0
- package/dist/server/lib/mobileAccess.js +3 -0
- package/dist/server/lib/mobileAccess.js.map +1 -1
- package/dist/server/lib/specArtifact.js +353 -0
- package/dist/server/lib/specArtifact.js.map +1 -0
- package/dist/server/lib/specDraft.js +33 -0
- package/dist/server/lib/specDraft.js.map +1 -0
- package/dist/server/lib/specExport.js +70 -0
- package/dist/server/lib/specExport.js.map +1 -0
- package/dist/server/lib/specFormatting.js +26 -0
- package/dist/server/lib/specFormatting.js.map +1 -0
- package/dist/server/lib/specMessages.js +79 -0
- package/dist/server/lib/specMessages.js.map +1 -0
- package/dist/server/lib/specOperations.js +171 -0
- package/dist/server/lib/specOperations.js.map +1 -0
- package/dist/server/lib/specSections.js +82 -0
- package/dist/server/lib/specSections.js.map +1 -0
- package/dist/server/lib/specs.js +347 -0
- package/dist/server/lib/specs.js.map +1 -0
- package/dist/server/lib/thinkingState.js +26 -0
- package/dist/server/lib/thinkingState.js.map +1 -1
- package/dist/server/lib/ticketBatch.js +55 -0
- package/dist/server/lib/ticketBatch.js.map +1 -0
- package/dist/server/lib/ticketDescriptionContract.js +52 -0
- package/dist/server/lib/ticketDescriptionContract.js.map +1 -0
- package/dist/server/lib/tickets.js +7 -3
- package/dist/server/lib/tickets.js.map +1 -1
- package/dist/server/workers/build.js +10 -1
- package/dist/server/workers/build.js.map +1 -1
- package/dist/server/workers/chat.js +10 -1
- package/dist/server/workers/chat.js.map +1 -1
- package/dist/server/workers/followUp.js +10 -1
- package/dist/server/workers/followUp.js.map +1 -1
- package/dist/server/workers/plan.js +10 -32
- package/dist/server/workers/plan.js.map +1 -1
- package/dist/server/workers/planFollowUp.js +10 -0
- package/dist/server/workers/planFollowUp.js.map +1 -1
- package/dist/server/workers/review.js +10 -1
- package/dist/server/workers/review.js.map +1 -1
- package/dist/server/workers/specSession.js +520 -0
- package/dist/server/workers/specSession.js.map +1 -0
- package/package.json +1 -1
- package/dist/client/assets/TestsDialog-1JPVtcz7.js +0 -5
- package/dist/client/assets/dropdown-menu-BULYW006.js +0 -43
- package/dist/client/assets/index-DGoXllNX.js +0 -150
- package/dist/client/assets/index-DoNUd8CK.css +0 -2
- /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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAc9G,MAAM,CAAC,MAAM,mBAAmB,GAAmC;IACjE,IAAI,EAAE,MAAM;IACZ,eAAe,EAAE,kBAAkB;IACnC,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,gBAAgB;IAC/B,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,QAAQ,EAAE,WAAW;CACtB,CAAA;AAQD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,QAAsB,EACtB,GAAmB,EACC,EAAE;IACtB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,WAAW,EAAE,IAAI,EAAE,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAA;QAC1G,CAAC;QACD,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,WAAW,EAAE,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAA;QACxG,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAA;QAC7G,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE,IAAI,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAA;QACrG,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,YAAY,EAAE,IAAI,EAAE,kBAAkB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAA;QAC5G,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,aAAa,EAAE,IAAI,EAAE,kBAAkB,QAAQ,CAAC,OAAO,UAAU,EAAE,CAAA;QAChH,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,wBAAwB,QAAQ,CAAC,MAAM,UAAU,EAAE,CAAA;QAChH,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,iBAAiB;YACpB,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,QAAsB,EACtB,IAAmC,EACpB,EAAE;IACjB,OAAO,IAAI;SACR,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;SAC5C,MAAM,CAAC,CAAC,OAAO,EAA0B,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAA;AAClE,CAAC,CAAA"}
|
|
@@ -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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"}
|