@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.
- package/dist/client/assets/TestsDialog-j0fYZ2AP.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-CnivPz9K.js +36 -0
- package/dist/client/assets/array-DOVTz2Mq.js +1 -0
- package/dist/client/assets/blockDiagram-GPEHLZMM-Rd0YcyFR.js +132 -0
- package/dist/client/assets/c4Diagram-AAUBKEIU-kFDNpO2v.js +10 -0
- package/dist/client/assets/channel-C2eURzdr.js +1 -0
- package/dist/client/assets/chunk-2J33WTMH-CaqozdP8.js +1 -0
- package/dist/client/assets/chunk-3OPIFGDE-B8iFdxrR.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-BrIMEXNE.js +2 -0
- package/dist/client/assets/chunk-727SXJPM-BtIA7PWh.js +206 -0
- package/dist/client/assets/chunk-AQP2D5EJ-fZoHENDl.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-DWO1NEfx.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-CF2IF83X.js +10 -0
- package/dist/client/assets/chunk-L5ZTLDWV-BUItv2Ib.js +1 -0
- package/dist/client/assets/chunk-LZXEDZCA-BXfHhDLH.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-C2qj1a3s.js +1 -0
- package/dist/client/assets/chunk-NNHCCRGN-C4ci-Gd6.js +159 -0
- package/dist/client/assets/chunk-NZK2D7GU-Chir8aJ-.js +1 -0
- package/dist/client/assets/chunk-O5CBEL6O-DEfSochA.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-BszlpZ1y.js +1 -0
- package/dist/client/assets/chunk-XPW4576I-YiT9fJFY.js +32 -0
- package/dist/client/assets/classDiagram-4FO5ZUOK-D8cVFEdr.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BJah23qn.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-D-czLNXn.js +4 -0
- package/dist/client/assets/defaultLocale-Ck2Xxk-C.js +1 -0
- package/dist/client/assets/diagram-2AECGRRQ-DswYVROV.js +43 -0
- package/dist/client/assets/diagram-5GNKFQAL-C2LB4-Kp.js +10 -0
- package/dist/client/assets/diagram-KO2AKTUF-4pdiiwxL.js +3 -0
- package/dist/client/assets/diagram-LMA3HP47-DgGvwfLE.js +24 -0
- package/dist/client/assets/diagram-OG6HWLK6-ODytJwCx.js +24 -0
- package/dist/client/assets/dist-BQjeO--f.js +1 -0
- package/dist/client/assets/erDiagram-TEJ5UH35-CE_PuRb6.js +85 -0
- package/dist/client/assets/eventmodeling-FCH6USID-BczyucFk.js +1 -0
- package/dist/client/assets/flowDiagram-I6XJVG4X-COhcCfz4.js +162 -0
- package/dist/client/assets/ganttDiagram-6RSMTGT7-Dj2Sy2Gh.js +292 -0
- package/dist/client/assets/gitGraph-WXDBUCRP-x5mlGyzr.js +1 -0
- package/dist/client/assets/gitGraphDiagram-PVQCEYII-D_3GyFuB.js +106 -0
- package/dist/client/assets/graphlib-CMVU3iJd.js +1 -0
- package/dist/client/assets/index-C4OZfq84.js +260 -0
- package/dist/client/assets/index-I0a6lbgt.css +2 -0
- package/dist/client/assets/info-J43DQDTF-BsM_Qb70.js +1 -0
- package/dist/client/assets/infoDiagram-5YYISTIA-CBWV9QV_.js +2 -0
- package/dist/client/assets/init-Bft5Ffpj.js +1 -0
- package/dist/client/assets/ishikawaDiagram-YF4QCWOH-Ddnuid12.js +70 -0
- package/dist/client/assets/journeyDiagram-JHISSGLW-BpXuCD5H.js +139 -0
- package/dist/client/assets/kanban-definition-UN3LZRKU-BuZe6GDK.js +89 -0
- package/dist/client/assets/katex-Bpz5kWH9.js +257 -0
- package/dist/client/assets/line-BE4yoTuW.js +1 -0
- package/dist/client/assets/linear-BYVhmsFj.js +1 -0
- package/dist/client/assets/mermaid-parser.core-B2H_eqyg.js +4 -0
- package/dist/client/assets/mermaid.core-CU1B0VWF.js +9 -0
- package/dist/client/assets/mindmap-definition-RKZ34NQL-CG4XJeRx.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-CN5uHxOy.js +30 -0
- package/dist/client/assets/quadrantDiagram-W4KKPZXB-Bxov0SvH.js +7 -0
- package/dist/client/assets/radar-GUYGQ44K-XEreg8aR.js +1 -0
- package/dist/client/assets/requirementDiagram-4Y6WPE33-DWw4nY3R.js +84 -0
- package/dist/client/assets/rough.esm-DCvqWubr.js +1 -0
- package/dist/client/assets/sankeyDiagram-5OEKKPKP-CzRuy9FU.js +40 -0
- package/dist/client/assets/sequenceDiagram-3UESZ5HK-BLAdf9cH.js +162 -0
- package/dist/client/assets/src-BcaL9nCM.js +1 -0
- package/dist/client/assets/stateDiagram-AJRCARHV-Dbwp6kCy.js +1 -0
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BWC0_Q2v.js +1 -0
- package/dist/client/assets/timeline-definition-PNZ67QCA-HajxAhbq.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-DWaZcpRa.js +34 -0
- package/dist/client/assets/wardley-L42UT6IY-Ct9qHtJP.js +1 -0
- package/dist/client/assets/wardleyDiagram-YWT4CUSO-BPhQM7CW.js +78 -0
- package/dist/client/assets/xychartDiagram-2RQKCTM6-CITmODsS.js +7 -0
- package/dist/client/index.html +3 -4
- package/dist/server/db.js +90 -0
- package/dist/server/db.js.map +1 -1
- package/dist/server/index.js +384 -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 +256 -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 +47 -0
- package/dist/server/lib/specMessages.js.map +1 -0
- package/dist/server/lib/specOperations.js +150 -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 +318 -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 +418 -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,318 @@
|
|
|
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 firstUserMessagePreviewSelect = `(
|
|
19
|
+
SELECT spec_messages.content
|
|
20
|
+
FROM spec_messages
|
|
21
|
+
WHERE spec_messages.spec_session_id = spec_sessions.id
|
|
22
|
+
AND spec_messages.role = 'user'
|
|
23
|
+
ORDER BY spec_messages.created_at ASC, spec_messages.rowid ASC
|
|
24
|
+
LIMIT 1
|
|
25
|
+
)`;
|
|
26
|
+
const listSpecSessionsStatement = db.prepare(`
|
|
27
|
+
SELECT id, project_id, title, tool, model, variant, skills_json, agent_status, agent_log, agent_message_id, previous_agent_log, previous_agent_message_id, streaming_response,
|
|
28
|
+
latest_snapshot_id, claude_session_id, opencode_session_id,
|
|
29
|
+
external_provider, external_id, external_key, external_url, external_metadata_json,
|
|
30
|
+
usage_snapshot_context_window, usage_snapshot_max_output_tokens, usage_snapshot_total_tokens,
|
|
31
|
+
usage_snapshot_input_tokens, usage_snapshot_output_tokens, usage_snapshot_cache_read_tokens,
|
|
32
|
+
usage_snapshot_reasoning_tokens, usage_snapshot_cost,
|
|
33
|
+
${firstUserMessagePreviewSelect} AS first_user_message_preview,
|
|
34
|
+
${lastUserMessageAtSelect} AS last_user_message_at,
|
|
35
|
+
${activityAtSelect} AS activity_at, created_at, updated_at
|
|
36
|
+
FROM spec_sessions
|
|
37
|
+
WHERE project_id = ?
|
|
38
|
+
ORDER BY activity_at DESC, id DESC
|
|
39
|
+
`);
|
|
40
|
+
const getSpecSessionStatement = db.prepare(`
|
|
41
|
+
SELECT id, project_id, title, tool, model, variant, skills_json, agent_status, agent_log, agent_message_id, previous_agent_log, previous_agent_message_id, streaming_response,
|
|
42
|
+
latest_snapshot_id, claude_session_id, opencode_session_id,
|
|
43
|
+
external_provider, external_id, external_key, external_url, external_metadata_json,
|
|
44
|
+
usage_snapshot_context_window, usage_snapshot_max_output_tokens, usage_snapshot_total_tokens,
|
|
45
|
+
usage_snapshot_input_tokens, usage_snapshot_output_tokens, usage_snapshot_cache_read_tokens,
|
|
46
|
+
usage_snapshot_reasoning_tokens, usage_snapshot_cost,
|
|
47
|
+
${firstUserMessagePreviewSelect} AS first_user_message_preview,
|
|
48
|
+
${lastUserMessageAtSelect} AS last_user_message_at,
|
|
49
|
+
${activityAtSelect} AS activity_at, created_at, updated_at
|
|
50
|
+
FROM spec_sessions
|
|
51
|
+
WHERE id = ?
|
|
52
|
+
`);
|
|
53
|
+
const insertSpecSessionStatement = db.prepare(`
|
|
54
|
+
INSERT INTO spec_sessions (
|
|
55
|
+
id, project_id, title, tool, model, variant, skills_json,
|
|
56
|
+
agent_status, agent_log, streaming_response, latest_snapshot_id, claude_session_id, opencode_session_id,
|
|
57
|
+
external_provider, external_id, external_key, external_url, external_metadata_json
|
|
58
|
+
)
|
|
59
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, NULL, NULL, NULL, NULL, NULL, NULL, ?, ?, ?, ?, ?)
|
|
60
|
+
`);
|
|
61
|
+
const updateSpecSessionRunConfigStatement = db.prepare(`
|
|
62
|
+
UPDATE spec_sessions
|
|
63
|
+
SET tool = ?, model = ?, variant = ?, skills_json = ?, updated_at = CURRENT_TIMESTAMP
|
|
64
|
+
WHERE id = ?
|
|
65
|
+
`);
|
|
66
|
+
const updateSpecSessionStatusStatement = db.prepare(`
|
|
67
|
+
UPDATE spec_sessions
|
|
68
|
+
SET agent_status = ?, agent_log = ?, streaming_response = ?, updated_at = CURRENT_TIMESTAMP
|
|
69
|
+
WHERE id = ?
|
|
70
|
+
`);
|
|
71
|
+
const updateClaudeSessionIdStatement = db.prepare(`
|
|
72
|
+
UPDATE spec_sessions
|
|
73
|
+
SET claude_session_id = ?, updated_at = CURRENT_TIMESTAMP
|
|
74
|
+
WHERE id = ?
|
|
75
|
+
`);
|
|
76
|
+
const updateOpencodeSessionIdStatement = db.prepare(`
|
|
77
|
+
UPDATE spec_sessions
|
|
78
|
+
SET opencode_session_id = ?, updated_at = CURRENT_TIMESTAMP
|
|
79
|
+
WHERE id = ?
|
|
80
|
+
`);
|
|
81
|
+
const updateSpecSessionUsageSnapshotStatement = db.prepare(`
|
|
82
|
+
UPDATE spec_sessions
|
|
83
|
+
SET usage_snapshot_context_window = ?,
|
|
84
|
+
usage_snapshot_max_output_tokens = ?,
|
|
85
|
+
usage_snapshot_total_tokens = ?,
|
|
86
|
+
usage_snapshot_input_tokens = ?,
|
|
87
|
+
usage_snapshot_output_tokens = ?,
|
|
88
|
+
usage_snapshot_cache_read_tokens = ?,
|
|
89
|
+
usage_snapshot_reasoning_tokens = ?,
|
|
90
|
+
usage_snapshot_cost = ?,
|
|
91
|
+
updated_at = CURRENT_TIMESTAMP
|
|
92
|
+
WHERE id = ?
|
|
93
|
+
`);
|
|
94
|
+
const updateSpecSessionLatestSnapshotStatement = db.prepare(`
|
|
95
|
+
UPDATE spec_sessions
|
|
96
|
+
SET latest_snapshot_id = ?, updated_at = CURRENT_TIMESTAMP
|
|
97
|
+
WHERE id = ?
|
|
98
|
+
`);
|
|
99
|
+
const updateSpecSessionTitleStatement = db.prepare(`
|
|
100
|
+
UPDATE spec_sessions
|
|
101
|
+
SET title = ?, updated_at = CURRENT_TIMESTAMP
|
|
102
|
+
WHERE id = ?
|
|
103
|
+
`);
|
|
104
|
+
const deleteSpecSessionStatement = db.prepare(`
|
|
105
|
+
DELETE FROM spec_sessions
|
|
106
|
+
WHERE id = ?
|
|
107
|
+
`);
|
|
108
|
+
const deleteSpecSessionAttachmentsSql = db.prepare(`
|
|
109
|
+
DELETE FROM attachments
|
|
110
|
+
WHERE chat_session_id = ?
|
|
111
|
+
`);
|
|
112
|
+
const insertSpecSnapshotStatement = db.prepare(`
|
|
113
|
+
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)
|
|
114
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
115
|
+
`);
|
|
116
|
+
const getSpecSnapshotStatement = db.prepare(`
|
|
117
|
+
SELECT id, spec_session_id, summary, assumptions_json, open_questions_json, likely_files_json, tickets_json, dependencies_json, mermaid, mockup, plan_text, created_at
|
|
118
|
+
FROM spec_snapshots
|
|
119
|
+
WHERE id = ?
|
|
120
|
+
`);
|
|
121
|
+
const parseSpecSkills = (value) => {
|
|
122
|
+
if (!value) {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const parsed = JSON.parse(value);
|
|
127
|
+
if (!Array.isArray(parsed)) {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
return parsed
|
|
131
|
+
.filter((entry) => typeof entry === 'string')
|
|
132
|
+
.map(entry => entry.trim())
|
|
133
|
+
.filter(Boolean)
|
|
134
|
+
.filter((entry, index, values) => values.indexOf(entry) === index);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
const parseSpecExternalSource = (row) => {
|
|
141
|
+
if ((row.external_provider !== 'jira' && row.external_provider !== 'github')
|
|
142
|
+
|| !row.external_id
|
|
143
|
+
|| !row.external_key) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
let metadata = null;
|
|
147
|
+
if (row.external_metadata_json) {
|
|
148
|
+
try {
|
|
149
|
+
const parsed = JSON.parse(row.external_metadata_json);
|
|
150
|
+
metadata = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
metadata = null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
provider: row.external_provider,
|
|
158
|
+
external_id: row.external_id,
|
|
159
|
+
external_key: row.external_key,
|
|
160
|
+
external_url: row.external_url ?? null,
|
|
161
|
+
metadata,
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
const serializeSpecSession = (row, options = {}) => {
|
|
165
|
+
if (!row) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const sessionBase = {
|
|
169
|
+
id: row.id,
|
|
170
|
+
project_id: row.project_id,
|
|
171
|
+
title: row.title,
|
|
172
|
+
tool: row.tool,
|
|
173
|
+
model: row.model,
|
|
174
|
+
variant: row.variant,
|
|
175
|
+
skills: parseSpecSkills(row.skills_json),
|
|
176
|
+
agent_status: row.agent_status,
|
|
177
|
+
agent_log: row.agent_log,
|
|
178
|
+
agent_message_id: row.agent_message_id ?? null,
|
|
179
|
+
previous_agent_log: row.previous_agent_log ?? null,
|
|
180
|
+
previous_agent_message_id: row.previous_agent_message_id ?? null,
|
|
181
|
+
streaming_response: row.streaming_response,
|
|
182
|
+
latest_snapshot_id: row.latest_snapshot_id ?? null,
|
|
183
|
+
claude_session_id: row.claude_session_id,
|
|
184
|
+
opencode_session_id: row.opencode_session_id,
|
|
185
|
+
first_user_message_preview: row.first_user_message_preview ?? null,
|
|
186
|
+
activity_at: row.activity_at,
|
|
187
|
+
last_user_message_at: row.last_user_message_at ?? null,
|
|
188
|
+
external_source: parseSpecExternalSource(row),
|
|
189
|
+
usage_snapshot_context_window: row.usage_snapshot_context_window ?? null,
|
|
190
|
+
usage_snapshot_max_output_tokens: row.usage_snapshot_max_output_tokens ?? null,
|
|
191
|
+
usage_snapshot_total_tokens: row.usage_snapshot_total_tokens ?? null,
|
|
192
|
+
usage_snapshot_input_tokens: row.usage_snapshot_input_tokens ?? null,
|
|
193
|
+
usage_snapshot_output_tokens: row.usage_snapshot_output_tokens ?? null,
|
|
194
|
+
usage_snapshot_cache_read_tokens: row.usage_snapshot_cache_read_tokens ?? null,
|
|
195
|
+
usage_snapshot_reasoning_tokens: row.usage_snapshot_reasoning_tokens ?? null,
|
|
196
|
+
usage_snapshot_cost: row.usage_snapshot_cost ?? null,
|
|
197
|
+
created_at: row.created_at,
|
|
198
|
+
updated_at: row.updated_at,
|
|
199
|
+
};
|
|
200
|
+
return options.includeMessages
|
|
201
|
+
? {
|
|
202
|
+
...sessionBase,
|
|
203
|
+
messages: listSpecMessages(row.id, row.project_id),
|
|
204
|
+
}
|
|
205
|
+
: sessionBase;
|
|
206
|
+
};
|
|
207
|
+
export const getDefaultSpecSessionTitle = () => DEFAULT_SPEC_SESSION_TITLE;
|
|
208
|
+
export const deriveSpecSessionTitle = (prompt) => {
|
|
209
|
+
const normalized = prompt
|
|
210
|
+
.replace(/\s+/g, ' ')
|
|
211
|
+
.trim();
|
|
212
|
+
if (!normalized) {
|
|
213
|
+
return DEFAULT_SPEC_SESSION_TITLE;
|
|
214
|
+
}
|
|
215
|
+
return normalized.length > 80 ? `${normalized.slice(0, 77).trimEnd()}...` : normalized;
|
|
216
|
+
};
|
|
217
|
+
export const listSpecSessions = (projectId) => {
|
|
218
|
+
return listSpecSessionsStatement.all(projectId)
|
|
219
|
+
.map(row => serializeSpecSession(row))
|
|
220
|
+
.filter((session) => session !== null);
|
|
221
|
+
};
|
|
222
|
+
export const getSpecSession = (id, options = {}) => {
|
|
223
|
+
return serializeSpecSession(getSpecSessionStatement.get(id), options);
|
|
224
|
+
};
|
|
225
|
+
export const createSpecSession = ({ projectId, tool, model, variant, skills, title = DEFAULT_SPEC_SESSION_TITLE, externalSource = null, }) => {
|
|
226
|
+
const id = randomUUID();
|
|
227
|
+
insertSpecSessionStatement.run(id, projectId, title.trim() || DEFAULT_SPEC_SESSION_TITLE, tool, model, variant, JSON.stringify(skills ?? []), externalSource?.provider ?? null, externalSource?.external_id ?? null, externalSource?.external_key ?? null, externalSource?.external_url ?? null, externalSource?.metadata ? JSON.stringify(externalSource.metadata) : null);
|
|
228
|
+
return getSpecSession(id, { includeMessages: true });
|
|
229
|
+
};
|
|
230
|
+
export const updateSpecSessionTitle = (specSessionId, title) => {
|
|
231
|
+
updateSpecSessionTitleStatement.run(title.trim() || DEFAULT_SPEC_SESSION_TITLE, specSessionId);
|
|
232
|
+
};
|
|
233
|
+
export const updateSpecSessionRunConfig = ({ specSessionId, tool, model, variant, skills, }) => {
|
|
234
|
+
updateSpecSessionRunConfigStatement.run(tool, model, variant, JSON.stringify(skills), specSessionId);
|
|
235
|
+
};
|
|
236
|
+
export const updateSpecSessionStatus = (specSessionId, status, log, streamingResponse) => {
|
|
237
|
+
updateSpecSessionStatusStatement.run(status, log, streamingResponse, specSessionId);
|
|
238
|
+
};
|
|
239
|
+
export const clearSpecSessionStreamingResponse = (specSessionId) => {
|
|
240
|
+
db.prepare('UPDATE spec_sessions SET streaming_response = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(specSessionId);
|
|
241
|
+
};
|
|
242
|
+
export const updateSpecSessionResumeId = (specSessionId, tool, sessionId) => {
|
|
243
|
+
if (tool === 'claude') {
|
|
244
|
+
updateClaudeSessionIdStatement.run(sessionId, specSessionId);
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
updateOpencodeSessionIdStatement.run(sessionId, specSessionId);
|
|
248
|
+
};
|
|
249
|
+
export const updateSpecSessionUsageSnapshot = (specSessionId, usage) => {
|
|
250
|
+
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);
|
|
251
|
+
};
|
|
252
|
+
export const updateSpecSessionLatestSnapshot = (specSessionId, snapshotId) => {
|
|
253
|
+
updateSpecSessionLatestSnapshotStatement.run(snapshotId, specSessionId);
|
|
254
|
+
};
|
|
255
|
+
export const deleteSpecSession = (specSessionId) => {
|
|
256
|
+
deleteSpecSessionAttachmentFiles(specSessionId);
|
|
257
|
+
deleteSpecSessionAttachmentsSql.run(specSessionId);
|
|
258
|
+
deleteSpecSessionStatement.run(specSessionId);
|
|
259
|
+
};
|
|
260
|
+
export const createSpecSnapshot = ({ specSessionId, summary, assumptions, openQuestions, likelyFiles, tickets, dependencies, mermaid, mockup, planText, }) => {
|
|
261
|
+
const id = randomUUID();
|
|
262
|
+
insertSpecSnapshotStatement.run(id, specSessionId, summary, JSON.stringify(assumptions), JSON.stringify(openQuestions), JSON.stringify(likelyFiles), JSON.stringify(tickets), JSON.stringify(dependencies), mermaid, mockup, planText);
|
|
263
|
+
return id;
|
|
264
|
+
};
|
|
265
|
+
export const getSpecSnapshot = (snapshotId) => {
|
|
266
|
+
const row = getSpecSnapshotStatement.get(snapshotId);
|
|
267
|
+
if (!row) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
return {
|
|
271
|
+
id: row.id,
|
|
272
|
+
spec_session_id: row.spec_session_id,
|
|
273
|
+
summary: row.summary ?? '',
|
|
274
|
+
assumptions: parseSnapshotJsonArray(row.assumptions_json),
|
|
275
|
+
open_questions: parseSnapshotJsonArray(row.open_questions_json),
|
|
276
|
+
likely_files: parseSnapshotJsonArray(row.likely_files_json),
|
|
277
|
+
tickets: parseSnapshotJsonArray(row.tickets_json),
|
|
278
|
+
dependencies: parseSnapshotJsonArray(row.dependencies_json),
|
|
279
|
+
mermaid: row.mermaid,
|
|
280
|
+
mockup: row.mockup,
|
|
281
|
+
plan_text: row.plan_text ?? '',
|
|
282
|
+
created_at: row.created_at,
|
|
283
|
+
};
|
|
284
|
+
};
|
|
285
|
+
const getCreatedTicketIdsForSnapshotStatement = db.prepare('SELECT id FROM tickets WHERE origin_spec_snapshot_id = ? AND project_id = ? ORDER BY created_at DESC, id DESC');
|
|
286
|
+
export const getCreatedTicketIdsForSnapshot = (snapshotId, projectId) => {
|
|
287
|
+
const rows = getCreatedTicketIdsForSnapshotStatement.all(snapshotId, projectId);
|
|
288
|
+
return rows.map(row => row.id);
|
|
289
|
+
};
|
|
290
|
+
const getTicketIdsForOriginSpecSessionStatement = db.prepare('SELECT id FROM tickets WHERE origin_spec_session_id = ?');
|
|
291
|
+
export const getTicketIdsForOriginSpecSession = (specSessionId) => {
|
|
292
|
+
const rows = getTicketIdsForOriginSpecSessionStatement.all(specSessionId);
|
|
293
|
+
return rows.map(row => row.id);
|
|
294
|
+
};
|
|
295
|
+
const getChatSessionIdsForOriginSpecSessionStatement = db.prepare('SELECT id FROM chat_sessions WHERE origin_spec_session_id = ?');
|
|
296
|
+
export const getChatSessionIdsForOriginSpecSession = (specSessionId) => {
|
|
297
|
+
const rows = getChatSessionIdsForOriginSpecSessionStatement.all(specSessionId);
|
|
298
|
+
return rows.map(row => row.id);
|
|
299
|
+
};
|
|
300
|
+
const clearOriginSpecReferencesOnTicketsStatement = db.prepare('UPDATE tickets SET origin_spec_session_id = NULL, origin_spec_snapshot_id = NULL WHERE origin_spec_session_id = ?');
|
|
301
|
+
const clearOriginSpecReferencesOnChatSessionsStatement = db.prepare('UPDATE chat_sessions SET origin_spec_session_id = NULL, origin_spec_snapshot_id = NULL WHERE origin_spec_session_id = ?');
|
|
302
|
+
export const clearOriginSpecReferences = (specSessionId) => {
|
|
303
|
+
clearOriginSpecReferencesOnTicketsStatement.run(specSessionId);
|
|
304
|
+
clearOriginSpecReferencesOnChatSessionsStatement.run(specSessionId);
|
|
305
|
+
};
|
|
306
|
+
const parseSnapshotJsonArray = (value) => {
|
|
307
|
+
if (!value) {
|
|
308
|
+
return [];
|
|
309
|
+
}
|
|
310
|
+
try {
|
|
311
|
+
const parsed = JSON.parse(value);
|
|
312
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
return [];
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
//# 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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"}
|
|
@@ -49,6 +49,26 @@ const bindChatSessionThinkingMessageStatement = db.prepare(`
|
|
|
49
49
|
updated_at = CURRENT_TIMESTAMP
|
|
50
50
|
WHERE id = ?
|
|
51
51
|
`);
|
|
52
|
+
const beginSpecSessionThinkingRunStatement = db.prepare(`
|
|
53
|
+
UPDATE spec_sessions
|
|
54
|
+
SET previous_agent_log = CASE
|
|
55
|
+
WHEN agent_message_id IS NOT NULL THEN agent_log
|
|
56
|
+
ELSE NULL
|
|
57
|
+
END,
|
|
58
|
+
previous_agent_message_id = CASE
|
|
59
|
+
WHEN agent_message_id IS NOT NULL THEN agent_message_id
|
|
60
|
+
ELSE NULL
|
|
61
|
+
END,
|
|
62
|
+
agent_message_id = NULL,
|
|
63
|
+
updated_at = CURRENT_TIMESTAMP
|
|
64
|
+
WHERE id = ?
|
|
65
|
+
`);
|
|
66
|
+
const bindSpecSessionThinkingMessageStatement = db.prepare(`
|
|
67
|
+
UPDATE spec_sessions
|
|
68
|
+
SET agent_message_id = ?,
|
|
69
|
+
updated_at = CURRENT_TIMESTAMP
|
|
70
|
+
WHERE id = ?
|
|
71
|
+
`);
|
|
52
72
|
export const beginTicketThinkingRun = (ticketId) => {
|
|
53
73
|
beginTicketThinkingRunStatement.run(ticketId);
|
|
54
74
|
};
|
|
@@ -64,4 +84,10 @@ export const beginChatSessionThinkingRun = (chatSessionId) => {
|
|
|
64
84
|
export const bindChatSessionThinkingMessage = (chatSessionId, messageId) => {
|
|
65
85
|
bindChatSessionThinkingMessageStatement.run(messageId, chatSessionId);
|
|
66
86
|
};
|
|
87
|
+
export const beginSpecSessionThinkingRun = (specSessionId) => {
|
|
88
|
+
beginSpecSessionThinkingRunStatement.run(specSessionId);
|
|
89
|
+
};
|
|
90
|
+
export const bindSpecSessionThinkingMessage = (specSessionId, messageId) => {
|
|
91
|
+
bindSpecSessionThinkingMessageStatement.run(messageId, specSessionId);
|
|
92
|
+
};
|
|
67
93
|
//# sourceMappingURL=thinkingState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thinkingState.js","sourceRoot":"","sources":["../../../server/lib/thinkingState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,MAAM,+BAA+B,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;CAalD,CAAC,CAAA;AAEF,MAAM,kCAAkC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAKrD,CAAC,CAAA;AAEF,MAAM,iCAAiC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;CASpD,CAAC,CAAA;AAEF,MAAM,oCAAoC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;CAavD,CAAC,CAAA;AAEF,MAAM,uCAAuC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAK1D,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAgB,EAAE,EAAE;IACzD,+BAA+B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAE,EAAE;IAC/E,kCAAkC,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC3D,iCAAiC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACjD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAAqB,EAAE,EAAE;IACnE,oCAAoC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,aAAqB,EAAE,SAAiB,EAAE,EAAE;IACzF,uCAAuC,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;AACvE,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"thinkingState.js","sourceRoot":"","sources":["../../../server/lib/thinkingState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,MAAM,+BAA+B,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;CAalD,CAAC,CAAA;AAEF,MAAM,kCAAkC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAKrD,CAAC,CAAA;AAEF,MAAM,iCAAiC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;CASpD,CAAC,CAAA;AAEF,MAAM,oCAAoC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;CAavD,CAAC,CAAA;AAEF,MAAM,uCAAuC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAK1D,CAAC,CAAA;AAEF,MAAM,oCAAoC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;CAavD,CAAC,CAAA;AAEF,MAAM,uCAAuC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAK1D,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAgB,EAAE,EAAE;IACzD,+BAA+B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAE,EAAE;IAC/E,kCAAkC,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC3D,iCAAiC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACjD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAAqB,EAAE,EAAE;IACnE,oCAAoC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,aAAqB,EAAE,SAAiB,EAAE,EAAE;IACzF,uCAAuC,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;AACvE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,aAAqB,EAAE,EAAE;IACnE,oCAAoC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACzD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,aAAqB,EAAE,SAAiB,EAAE,EAAE;IACzF,uCAAuC,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;AACvE,CAAC,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import db from '../db.js';
|
|
2
|
+
import { HttpError } from './httpError.js';
|
|
3
|
+
import { createTicketDependency, validateCreateTicketDependency } from './ticketDependencies.js';
|
|
4
|
+
import { createTicketRecord } from './tickets.js';
|
|
5
|
+
export const materializeTicketsWithDependencies = db.transaction(({ options, tickets, dependencies, }) => {
|
|
6
|
+
const createdTickets = [];
|
|
7
|
+
const createdDependencies = [];
|
|
8
|
+
const ticketIdsByKey = new Map();
|
|
9
|
+
for (const ticket of tickets) {
|
|
10
|
+
const worktreeBundleId = options.resolveWorktreeBundleId
|
|
11
|
+
? options.resolveWorktreeBundleId(ticket)
|
|
12
|
+
: (options.worktreeBundleId ?? null);
|
|
13
|
+
const createdTicket = createTicketRecord({
|
|
14
|
+
title: ticket.title,
|
|
15
|
+
description: ticket.description,
|
|
16
|
+
model: options.model,
|
|
17
|
+
variant: options.variant,
|
|
18
|
+
skills: options.skills,
|
|
19
|
+
tool: options.tool,
|
|
20
|
+
agentStatus: options.agentStatus,
|
|
21
|
+
projectId: options.projectId,
|
|
22
|
+
worktreeBundleId,
|
|
23
|
+
originSpecSessionId: options.originSpecSessionId,
|
|
24
|
+
originSpecSnapshotId: options.originSpecSnapshotId,
|
|
25
|
+
});
|
|
26
|
+
if (!createdTicket) {
|
|
27
|
+
throw new HttpError(500, 'Unable to create the requested ticket.');
|
|
28
|
+
}
|
|
29
|
+
createdTickets.push(createdTicket);
|
|
30
|
+
ticketIdsByKey.set(ticket.key, createdTicket.id);
|
|
31
|
+
options.onTicketCreated?.(ticket, createdTicket);
|
|
32
|
+
}
|
|
33
|
+
for (const dependency of dependencies) {
|
|
34
|
+
const blockerTicketId = ticketIdsByKey.get(dependency.blocker_key);
|
|
35
|
+
const dependentTicketId = ticketIdsByKey.get(dependency.dependent_key);
|
|
36
|
+
if (!blockerTicketId || !dependentTicketId) {
|
|
37
|
+
throw new HttpError(500, 'Ticket dependency references an unknown ticket key.');
|
|
38
|
+
}
|
|
39
|
+
const validation = validateCreateTicketDependency({
|
|
40
|
+
blockerTicketId,
|
|
41
|
+
dependentTicketId,
|
|
42
|
+
projectId: options.projectId,
|
|
43
|
+
});
|
|
44
|
+
if (!validation.ok) {
|
|
45
|
+
throw new HttpError(validation.status, validation.error);
|
|
46
|
+
}
|
|
47
|
+
const createdDependency = createTicketDependency(blockerTicketId, dependentTicketId);
|
|
48
|
+
if (!createdDependency) {
|
|
49
|
+
throw new HttpError(500, 'Unable to create the requested ticket dependency.');
|
|
50
|
+
}
|
|
51
|
+
createdDependencies.push(createdDependency);
|
|
52
|
+
}
|
|
53
|
+
return { createdTickets, createdDependencies, ticketIdsByKey };
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=ticketBatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketBatch.js","sourceRoot":"","sources":["../../../server/lib/ticketBatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared implementation-ready ticket description contract.
|
|
3
|
+
*
|
|
4
|
+
* Consumed by both the plan worker (`workers/plan.ts`) and the spec worker
|
|
5
|
+
* (`workers/specSession.ts`) so spec-sourced tickets and plan-worker-produced
|
|
6
|
+
* tickets are held to the same self-contained description standard.
|
|
7
|
+
*/
|
|
8
|
+
export const IMPLEMENTATION_READY_DESCRIPTION_SECTION_HEADINGS = [
|
|
9
|
+
'Problem Statement',
|
|
10
|
+
'Acceptance Criteria',
|
|
11
|
+
'Implementation Approach',
|
|
12
|
+
'Edge Cases and Error Handling',
|
|
13
|
+
'Constraints and Things to Avoid',
|
|
14
|
+
];
|
|
15
|
+
export const IMPLEMENTATION_READY_DESCRIPTION_REQUIREMENTS = [
|
|
16
|
+
'- A clear problem statement or goal',
|
|
17
|
+
'- Specific acceptance criteria as a checklist',
|
|
18
|
+
'- Concrete implementation approach (files to touch, patterns to follow, APIs to use, etc.)',
|
|
19
|
+
'- Edge cases and error handling to consider',
|
|
20
|
+
'- Any relevant constraints or things to avoid',
|
|
21
|
+
].join('\n');
|
|
22
|
+
export const IMPLEMENTATION_READY_DESCRIPTION_SECTION_TEMPLATE = [
|
|
23
|
+
'Use exactly these markdown sections, in order:',
|
|
24
|
+
...IMPLEMENTATION_READY_DESCRIPTION_SECTION_HEADINGS.map(heading => `- ## ${heading}`),
|
|
25
|
+
].join('\n');
|
|
26
|
+
export const INDENTED_IMPLEMENTATION_READY_DESCRIPTION_SECTION_TEMPLATE = IMPLEMENTATION_READY_DESCRIPTION_SECTION_TEMPLATE
|
|
27
|
+
.split('\n')
|
|
28
|
+
.map(line => ` ${line}`)
|
|
29
|
+
.join('\n');
|
|
30
|
+
export const IMPLEMENTATION_DETAIL_RULES = [
|
|
31
|
+
'- Include at least 3 checklist items in `## Acceptance Criteria`.',
|
|
32
|
+
'- Include at least 2 concrete implementation bullets or numbered steps in `## Implementation Approach`.',
|
|
33
|
+
'- Mention specific files, components, modules, or APIs when they can be inferred from the repository.',
|
|
34
|
+
'- Reference code locations by anchor name (function, route, handler, type, or file name), not by line number. Line numbers drift between planning and implementation.',
|
|
35
|
+
'- Include concrete testing or verification guidance in each ticket description: name the specific test command the project uses (for example `npm test`, `pytest`, `cargo test`, `go test`) when it can be inferred from the repo, plus the specific test files, suites, or check types the implementer should run or update. Generic phrases like "run tests" are insufficient.',
|
|
36
|
+
'- Carry forward the plan\'s goal, repo context, likely files, and constraints into the description.',
|
|
37
|
+
].join('\n');
|
|
38
|
+
/**
|
|
39
|
+
* Rules that keep the five implementation-ready sections from restating the
|
|
40
|
+
* same fact in multiple places. Consumed alongside IMPLEMENTATION_DETAIL_RULES
|
|
41
|
+
* so both the plan worker and the spec worker produce descriptions that do not
|
|
42
|
+
* force the reader to reconcile duplicates.
|
|
43
|
+
*/
|
|
44
|
+
export const IMPLEMENTATION_BODY_DEDUPLICATION_RULES = [
|
|
45
|
+
'- Each fact appears in exactly one section. If a fact fits multiple sections, place it in the most actionable one.',
|
|
46
|
+
'- `## Problem Statement` is the user-facing problem the ticket solves. Do not restate it as a goal or re-summarize it in other sections.',
|
|
47
|
+
'- `## Assumptions` are invariants of the existing system the implementer can rely on.',
|
|
48
|
+
'- `## Edge Cases and Error Handling` are runtime scenarios the new code must handle correctly.',
|
|
49
|
+
'- `## Constraints and Things to Avoid` are boundaries on the implementation itself ("do not …").',
|
|
50
|
+
'- If a fact fits two sections, keep it in the most actionable one and do not restate it elsewhere.',
|
|
51
|
+
].join('\n');
|
|
52
|
+
//# sourceMappingURL=ticketDescriptionContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketDescriptionContract.js","sourceRoot":"","sources":["../../../server/lib/ticketDescriptionContract.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,iDAAiD,GAAG;IAC/D,mBAAmB;IACnB,qBAAqB;IACrB,yBAAyB;IACzB,+BAA+B;IAC/B,iCAAiC;CAClC,CAAA;AAED,MAAM,CAAC,MAAM,6CAA6C,GAAG;IAC3D,qCAAqC;IACrC,+CAA+C;IAC/C,4FAA4F;IAC5F,6CAA6C;IAC7C,+CAA+C;CAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,CAAC,MAAM,iDAAiD,GAAG;IAC/D,gDAAgD;IAChD,GAAG,iDAAiD,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,OAAO,EAAE,CAAC;CACvF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,CAAC,MAAM,0DAA0D,GAAG,iDAAiD;KACxH,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;KACxB,IAAI,CAAC,IAAI,CAAC,CAAA;AAEb,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,mEAAmE;IACnE,yGAAyG;IACzG,uGAAuG;IACvG,uKAAuK;IACvK,kXAAkX;IAClX,qGAAqG;CACtG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAG;IACrD,oHAAoH;IACpH,0IAA0I;IAC1I,uFAAuF;IACvF,gGAAgG;IAChG,kGAAkG;IAClG,oGAAoG;CACrG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA"}
|
|
@@ -529,6 +529,8 @@ export const serializeTicket = (row, options = {}) => {
|
|
|
529
529
|
...(hasWorktree !== undefined ? { has_worktree: hasWorktree } : {}),
|
|
530
530
|
build_chain: buildChain,
|
|
531
531
|
external_source: parseExternalSource(row),
|
|
532
|
+
origin_spec_session_id: row.origin_spec_session_id ?? null,
|
|
533
|
+
origin_spec_snapshot_id: row.origin_spec_snapshot_id ?? null,
|
|
532
534
|
...parseUsageSnapshotJson(row.usage_snapshot_json),
|
|
533
535
|
};
|
|
534
536
|
const ticketWithOptionalFields = {
|
|
@@ -831,7 +833,7 @@ export const getTicket = (id) => {
|
|
|
831
833
|
bundle_execution_position: bundleExecutionPosition >= 0 ? bundleExecutionPosition : null,
|
|
832
834
|
};
|
|
833
835
|
};
|
|
834
|
-
export const createTicketRecord = ({ title, description, model, variant, skills, tool, agentStatus, projectId, worktreeBundleId, planningContext, externalSource, }) => {
|
|
836
|
+
export const createTicketRecord = ({ title, description, model, variant, skills, tool, agentStatus, projectId, worktreeBundleId, planningContext, externalSource, originSpecSessionId, originSpecSnapshotId, }) => {
|
|
835
837
|
const id = randomUUID();
|
|
836
838
|
const laneOrder = getNextLaneOrder(projectId, 'plan');
|
|
837
839
|
const skillsJson = JSON.stringify(skills);
|
|
@@ -852,8 +854,10 @@ export const createTicketRecord = ({ title, description, model, variant, skills,
|
|
|
852
854
|
external_id,
|
|
853
855
|
external_key,
|
|
854
856
|
external_url,
|
|
855
|
-
external_metadata_json
|
|
856
|
-
|
|
857
|
+
external_metadata_json,
|
|
858
|
+
origin_spec_session_id,
|
|
859
|
+
origin_spec_snapshot_id
|
|
860
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, title.trim(), description, model, variant, skillsJson, tool, agentStatus ?? null, worktreeBundleId ?? null, projectId, serializePlanningContext(planningContext), laneOrder, externalSource?.provider ?? null, externalSource?.external_id ?? null, externalSource?.external_key ?? null, externalSource?.external_url ?? null, externalSource?.metadata ? JSON.stringify(externalSource.metadata) : null, originSpecSessionId ?? null, originSpecSnapshotId ?? null);
|
|
857
861
|
upsertTicketDescriptionMessage(id, description);
|
|
858
862
|
return getTicket(id);
|
|
859
863
|
};
|