@straiffi/archon 1.2.34 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/dist/client/assets/TestsDialog-j0fYZ2AP.js +5 -0
  2. package/dist/client/assets/arc-4YfDy8uK.js +1 -0
  3. package/dist/client/assets/architecture-7EHR7CIX-B0ldQ5d_.js +1 -0
  4. package/dist/client/assets/architectureDiagram-3BPJPVTR-CnivPz9K.js +36 -0
  5. package/dist/client/assets/array-DOVTz2Mq.js +1 -0
  6. package/dist/client/assets/blockDiagram-GPEHLZMM-Rd0YcyFR.js +132 -0
  7. package/dist/client/assets/c4Diagram-AAUBKEIU-kFDNpO2v.js +10 -0
  8. package/dist/client/assets/channel-C2eURzdr.js +1 -0
  9. package/dist/client/assets/chunk-2J33WTMH-CaqozdP8.js +1 -0
  10. package/dist/client/assets/chunk-3OPIFGDE-B8iFdxrR.js +62 -0
  11. package/dist/client/assets/chunk-4BX2VUAB-B3mVWXS4.js +1 -0
  12. package/dist/client/assets/chunk-4EGX6M5U-DTB6Um9X.js +1 -0
  13. package/dist/client/assets/chunk-55IACEB6-BB-0ajVZ.js +1 -0
  14. package/dist/client/assets/chunk-5DO6E6H7-DtX6GYFY.js +1 -0
  15. package/dist/client/assets/chunk-5ZQYHXKU-BrIMEXNE.js +2 -0
  16. package/dist/client/assets/chunk-727SXJPM-BtIA7PWh.js +206 -0
  17. package/dist/client/assets/chunk-AQP2D5EJ-fZoHENDl.js +231 -0
  18. package/dist/client/assets/chunk-BR22UD5L-CkJbcXZG.js +1 -0
  19. package/dist/client/assets/chunk-BSJP7CBP-X4eyoSqE.js +1 -0
  20. package/dist/client/assets/chunk-CSCIHK7Q-DWO1NEfx.js +124 -0
  21. package/dist/client/assets/chunk-FHYWG6QK-Cb5GzaCb.js +1 -0
  22. package/dist/client/assets/chunk-FMBD7UC4-mGY2D2YB.js +15 -0
  23. package/dist/client/assets/chunk-KSCS5N6A-CF2IF83X.js +10 -0
  24. package/dist/client/assets/chunk-L5ZTLDWV-BUItv2Ib.js +1 -0
  25. package/dist/client/assets/chunk-LZXEDZCA-BXfHhDLH.js +2 -0
  26. package/dist/client/assets/chunk-MPE355IW-WT7jTCZh.js +1 -0
  27. package/dist/client/assets/chunk-MZUSXYTE-CClXfOSj.js +1 -0
  28. package/dist/client/assets/chunk-N66VUXT2-Bpe4yprw.js +1 -0
  29. package/dist/client/assets/chunk-ND2GUHAM-C2qj1a3s.js +1 -0
  30. package/dist/client/assets/chunk-NNHCCRGN-C4ci-Gd6.js +159 -0
  31. package/dist/client/assets/chunk-NZK2D7GU-Chir8aJ-.js +1 -0
  32. package/dist/client/assets/chunk-O5CBEL6O-DEfSochA.js +70 -0
  33. package/dist/client/assets/chunk-PUPMXCY4-Dh45WL5s.js +1 -0
  34. package/dist/client/assets/chunk-QZHKN3VN-U_l6-b5-.js +1 -0
  35. package/dist/client/assets/chunk-UIBZB4QT-Cp2xSKlH.js +1 -0
  36. package/dist/client/assets/chunk-WCWK7LTN-BOt5FFIu.js +1 -0
  37. package/dist/client/assets/chunk-WU5MYG2G-BszlpZ1y.js +1 -0
  38. package/dist/client/assets/chunk-XPW4576I-YiT9fJFY.js +32 -0
  39. package/dist/client/assets/classDiagram-4FO5ZUOK-D8cVFEdr.js +1 -0
  40. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BJah23qn.js +1 -0
  41. package/dist/client/assets/cose-bilkent-S5V4N54A-CtC2zeMr.js +1 -0
  42. package/dist/client/assets/cytoscape.esm-DnmRtSj9.js +321 -0
  43. package/dist/client/assets/dagre-5AiD43Uu.js +1 -0
  44. package/dist/client/assets/dagre-BM42HDAG-D-czLNXn.js +4 -0
  45. package/dist/client/assets/defaultLocale-Ck2Xxk-C.js +1 -0
  46. package/dist/client/assets/diagram-2AECGRRQ-DswYVROV.js +43 -0
  47. package/dist/client/assets/diagram-5GNKFQAL-C2LB4-Kp.js +10 -0
  48. package/dist/client/assets/diagram-KO2AKTUF-4pdiiwxL.js +3 -0
  49. package/dist/client/assets/diagram-LMA3HP47-DgGvwfLE.js +24 -0
  50. package/dist/client/assets/diagram-OG6HWLK6-ODytJwCx.js +24 -0
  51. package/dist/client/assets/dist-BQjeO--f.js +1 -0
  52. package/dist/client/assets/erDiagram-TEJ5UH35-CE_PuRb6.js +85 -0
  53. package/dist/client/assets/eventmodeling-FCH6USID-BczyucFk.js +1 -0
  54. package/dist/client/assets/flowDiagram-I6XJVG4X-COhcCfz4.js +162 -0
  55. package/dist/client/assets/ganttDiagram-6RSMTGT7-Dj2Sy2Gh.js +292 -0
  56. package/dist/client/assets/gitGraph-WXDBUCRP-x5mlGyzr.js +1 -0
  57. package/dist/client/assets/gitGraphDiagram-PVQCEYII-D_3GyFuB.js +106 -0
  58. package/dist/client/assets/graphlib-CMVU3iJd.js +1 -0
  59. package/dist/client/assets/index-C4OZfq84.js +260 -0
  60. package/dist/client/assets/index-I0a6lbgt.css +2 -0
  61. package/dist/client/assets/info-J43DQDTF-BsM_Qb70.js +1 -0
  62. package/dist/client/assets/infoDiagram-5YYISTIA-CBWV9QV_.js +2 -0
  63. package/dist/client/assets/init-Bft5Ffpj.js +1 -0
  64. package/dist/client/assets/ishikawaDiagram-YF4QCWOH-Ddnuid12.js +70 -0
  65. package/dist/client/assets/journeyDiagram-JHISSGLW-BpXuCD5H.js +139 -0
  66. package/dist/client/assets/kanban-definition-UN3LZRKU-BuZe6GDK.js +89 -0
  67. package/dist/client/assets/katex-Bpz5kWH9.js +257 -0
  68. package/dist/client/assets/line-BE4yoTuW.js +1 -0
  69. package/dist/client/assets/linear-BYVhmsFj.js +1 -0
  70. package/dist/client/assets/mermaid-parser.core-B2H_eqyg.js +4 -0
  71. package/dist/client/assets/mermaid.core-CU1B0VWF.js +9 -0
  72. package/dist/client/assets/mindmap-definition-RKZ34NQL-CG4XJeRx.js +96 -0
  73. package/dist/client/assets/ordinal-DIg8h6NI.js +1 -0
  74. package/dist/client/assets/packet-YPE3B663-DeVIMHV5.js +1 -0
  75. package/dist/client/assets/path-DfRbCp9y.js +1 -0
  76. package/dist/client/assets/pie-LRSECV5Y-ByRF4_cj.js +1 -0
  77. package/dist/client/assets/pieDiagram-4H26LBE5-CN5uHxOy.js +30 -0
  78. package/dist/client/assets/quadrantDiagram-W4KKPZXB-Bxov0SvH.js +7 -0
  79. package/dist/client/assets/radar-GUYGQ44K-XEreg8aR.js +1 -0
  80. package/dist/client/assets/requirementDiagram-4Y6WPE33-DWw4nY3R.js +84 -0
  81. package/dist/client/assets/rough.esm-DCvqWubr.js +1 -0
  82. package/dist/client/assets/sankeyDiagram-5OEKKPKP-CzRuy9FU.js +40 -0
  83. package/dist/client/assets/sequenceDiagram-3UESZ5HK-BLAdf9cH.js +162 -0
  84. package/dist/client/assets/src-BcaL9nCM.js +1 -0
  85. package/dist/client/assets/stateDiagram-AJRCARHV-Dbwp6kCy.js +1 -0
  86. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BWC0_Q2v.js +1 -0
  87. package/dist/client/assets/timeline-definition-PNZ67QCA-HajxAhbq.js +120 -0
  88. package/dist/client/assets/treeView-BLDUP644-D85P2Ji3.js +1 -0
  89. package/dist/client/assets/treemap-LRROVOQU-BnXG5utQ.js +1 -0
  90. package/dist/client/assets/vennDiagram-CIIHVFJN-DWaZcpRa.js +34 -0
  91. package/dist/client/assets/wardley-L42UT6IY-Ct9qHtJP.js +1 -0
  92. package/dist/client/assets/wardleyDiagram-YWT4CUSO-BPhQM7CW.js +78 -0
  93. package/dist/client/assets/xychartDiagram-2RQKCTM6-CITmODsS.js +7 -0
  94. package/dist/client/index.html +3 -4
  95. package/dist/server/db.js +90 -0
  96. package/dist/server/db.js.map +1 -1
  97. package/dist/server/index.js +384 -123
  98. package/dist/server/index.js.map +1 -1
  99. package/dist/server/lib/agent.js +462 -0
  100. package/dist/server/lib/agent.js.map +1 -1
  101. package/dist/server/lib/attachments.js +146 -0
  102. package/dist/server/lib/attachments.js.map +1 -1
  103. package/dist/server/lib/buildFlow.js +2 -1
  104. package/dist/server/lib/buildFlow.js.map +1 -1
  105. package/dist/server/lib/chatOperations.js +2 -0
  106. package/dist/server/lib/chatOperations.js.map +1 -1
  107. package/dist/server/lib/chats.js +9 -4
  108. package/dist/server/lib/chats.js.map +1 -1
  109. package/dist/server/lib/externalSource.js +32 -0
  110. package/dist/server/lib/externalSource.js.map +1 -0
  111. package/dist/server/lib/httpError.js +9 -0
  112. package/dist/server/lib/httpError.js.map +1 -0
  113. package/dist/server/lib/mobileAccess.js +3 -0
  114. package/dist/server/lib/mobileAccess.js.map +1 -1
  115. package/dist/server/lib/specArtifact.js +256 -0
  116. package/dist/server/lib/specArtifact.js.map +1 -0
  117. package/dist/server/lib/specDraft.js +33 -0
  118. package/dist/server/lib/specDraft.js.map +1 -0
  119. package/dist/server/lib/specExport.js +70 -0
  120. package/dist/server/lib/specExport.js.map +1 -0
  121. package/dist/server/lib/specFormatting.js +26 -0
  122. package/dist/server/lib/specFormatting.js.map +1 -0
  123. package/dist/server/lib/specMessages.js +47 -0
  124. package/dist/server/lib/specMessages.js.map +1 -0
  125. package/dist/server/lib/specOperations.js +150 -0
  126. package/dist/server/lib/specOperations.js.map +1 -0
  127. package/dist/server/lib/specSections.js +82 -0
  128. package/dist/server/lib/specSections.js.map +1 -0
  129. package/dist/server/lib/specs.js +318 -0
  130. package/dist/server/lib/specs.js.map +1 -0
  131. package/dist/server/lib/thinkingState.js +26 -0
  132. package/dist/server/lib/thinkingState.js.map +1 -1
  133. package/dist/server/lib/ticketBatch.js +55 -0
  134. package/dist/server/lib/ticketBatch.js.map +1 -0
  135. package/dist/server/lib/ticketDescriptionContract.js +52 -0
  136. package/dist/server/lib/ticketDescriptionContract.js.map +1 -0
  137. package/dist/server/lib/tickets.js +7 -3
  138. package/dist/server/lib/tickets.js.map +1 -1
  139. package/dist/server/workers/build.js +10 -1
  140. package/dist/server/workers/build.js.map +1 -1
  141. package/dist/server/workers/chat.js +10 -1
  142. package/dist/server/workers/chat.js.map +1 -1
  143. package/dist/server/workers/followUp.js +10 -1
  144. package/dist/server/workers/followUp.js.map +1 -1
  145. package/dist/server/workers/plan.js +10 -32
  146. package/dist/server/workers/plan.js.map +1 -1
  147. package/dist/server/workers/planFollowUp.js +10 -0
  148. package/dist/server/workers/planFollowUp.js.map +1 -1
  149. package/dist/server/workers/review.js +10 -1
  150. package/dist/server/workers/review.js.map +1 -1
  151. package/dist/server/workers/specSession.js +418 -0
  152. package/dist/server/workers/specSession.js.map +1 -0
  153. package/package.json +1 -1
  154. package/dist/client/assets/TestsDialog-1JPVtcz7.js +0 -5
  155. package/dist/client/assets/dropdown-menu-BULYW006.js +0 -43
  156. package/dist/client/assets/index-DGoXllNX.js +0 -150
  157. package/dist/client/assets/index-DoNUd8CK.css +0 -2
  158. /package/dist/client/assets/{rolldown-runtime-BYbx6iT9.js → chunk-BNv3lrIs.js} +0 -0
@@ -0,0 +1,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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,gCAAgC,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAOpD,MAAM,0BAA0B,GAAG,UAAU,CAAA;AAE7C,MAAM,uBAAuB,GAAG;;;;;EAK9B,CAAA;AAEF,MAAM,mBAAmB,GAAG;;;;EAI1B,CAAA;AAEF,MAAM,gBAAgB,GAAG,YAAY,mBAAmB,6BAA6B,CAAA;AAErF,MAAM,6BAA6B,GAAG;;;;;;;EAOpC,CAAA;AAEF,MAAM,yBAAyB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;WAOlC,6BAA6B;WAC7B,uBAAuB;WACvB,gBAAgB;;;;CAI1B,CAAC,CAAA;AAEF,MAAM,uBAAuB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;WAOhC,6BAA6B;WAC7B,uBAAuB;WACvB,gBAAgB;;;CAG1B,CAAC,CAAA;AAEF,MAAM,0BAA0B,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;CAO7C,CAAC,CAAA;AAEF,MAAM,mCAAmC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAItD,CAAC,CAAA;AAEF,MAAM,gCAAgC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAInD,CAAC,CAAA;AAEF,MAAM,8BAA8B,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAIjD,CAAC,CAAA;AAEF,MAAM,gCAAgC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAInD,CAAC,CAAA;AAEF,MAAM,uCAAuC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;CAY1D,CAAC,CAAA;AAEF,MAAM,wCAAwC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAI3D,CAAC,CAAA;AAEF,MAAM,+BAA+B,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAIlD,CAAC,CAAA;AAEF,MAAM,0BAA0B,GAAG,EAAE,CAAC,OAAO,CAAC;;;CAG7C,CAAC,CAAA;AAEF,MAAM,+BAA+B,GAAG,EAAE,CAAC,OAAO,CAAC;;;CAGlD,CAAC,CAAA;AAEF,MAAM,2BAA2B,GAAG,EAAE,CAAC,OAAO,CAAC;;;CAG9C,CAAC,CAAA;AAEF,MAAM,wBAAwB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAI3C,CAAC,CAAA;AAEF,MAAM,eAAe,GAAG,CAAC,KAAgC,EAAE,EAAE;IAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAA;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAA;QACX,CAAC;QAED,OAAO,MAAM;aACV,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;aAC7D,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;aAC1B,MAAM,CAAC,OAAO,CAAC;aACf,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAC,GAA2H,EAA+B,EAAE;IAC3L,IACE,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,IAAI,GAAG,CAAC,iBAAiB,KAAK,QAAQ,CAAC;WACrE,CAAC,GAAG,CAAC,WAAW;WAChB,CAAC,GAAG,CAAC,YAAY,EACpB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,QAAQ,GAAmC,IAAI,CAAA;IACnD,IAAI,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAA4B,CAAA;YAChF,QAAQ,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;QAC3F,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,IAAI,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,iBAAsC;QACpD,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,IAAI;QACtC,QAAQ;KACT,CAAA;AACH,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,CAAC,GAA+B,EAAE,UAAuC,EAAE,EAAsB,EAAE;IAC9H,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC;QACxC,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,IAAI;QAC9C,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,IAAI,IAAI;QAClD,yBAAyB,EAAE,GAAG,CAAC,yBAAyB,IAAI,IAAI;QAChE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;QAC1C,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,IAAI,IAAI;QAClD,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;QACxC,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,0BAA0B,EAAE,GAAG,CAAC,0BAA0B,IAAI,IAAI;QAClE,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,oBAAoB,EAAE,GAAG,CAAC,oBAAoB,IAAI,IAAI;QACtD,eAAe,EAAE,uBAAuB,CAAC,GAAG,CAAC;QAC7C,6BAA6B,EAAE,GAAG,CAAC,6BAA6B,IAAI,IAAI;QACxE,gCAAgC,EAAE,GAAG,CAAC,gCAAgC,IAAI,IAAI;QAC9E,2BAA2B,EAAE,GAAG,CAAC,2BAA2B,IAAI,IAAI;QACpE,2BAA2B,EAAE,GAAG,CAAC,2BAA2B,IAAI,IAAI;QACpE,4BAA4B,EAAE,GAAG,CAAC,4BAA4B,IAAI,IAAI;QACtE,gCAAgC,EAAE,GAAG,CAAC,gCAAgC,IAAI,IAAI;QAC9E,+BAA+B,EAAE,GAAG,CAAC,+BAA+B,IAAI,IAAI;QAC5E,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,IAAI,IAAI;QACpD,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;KACL,CAAA;IAEvB,OAAO,OAAO,CAAC,eAAe;QAC5B,CAAC,CAAC;YACE,GAAG,WAAW;YACd,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC;SACnD;QACH,CAAC,CAAC,WAAW,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,EAAE,CAAC,0BAA0B,CAAA;AAE1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAc,EAAE,EAAE;IACvD,MAAM,UAAU,GAAG,MAAM;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAA;IAET,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,0BAA0B,CAAA;IACnC,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,CAAA;AACxF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,EAAE;IACpD,OAAQ,yBAAyB,CAAC,GAAG,CAAC,SAAS,CAAsB;SAClE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;SACrC,MAAM,CAAC,CAAC,OAAO,EAA0B,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAU,EAAE,UAAuC,EAAE,EAAE,EAAE;IACtF,OAAO,oBAAoB,CAAC,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAA+B,EAAE,OAAO,CAAC,CAAA;AACrG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAChC,SAAS,EACT,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,KAAK,GAAG,0BAA0B,EAClC,cAAc,GAAG,IAAI,GAStB,EAAE,EAAE;IACH,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;IAEvB,0BAA0B,CAAC,GAAG,CAC5B,EAAE,EACF,SAAS,EACT,KAAK,CAAC,IAAI,EAAE,IAAI,0BAA0B,EAC1C,IAAI,EACJ,KAAK,EACL,OAAO,EACP,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAC5B,cAAc,EAAE,QAAQ,IAAI,IAAI,EAChC,cAAc,EAAE,WAAW,IAAI,IAAI,EACnC,cAAc,EAAE,YAAY,IAAI,IAAI,EACpC,cAAc,EAAE,YAAY,IAAI,IAAI,EACpC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAC1E,CAAA;IAED,OAAO,cAAc,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAA;AACtD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,aAAqB,EAAE,KAAa,EAAE,EAAE;IAC7E,+BAA+B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,0BAA0B,EAAE,aAAa,CAAC,CAAA;AAChG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,EACzC,aAAa,EACb,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,GAOP,EAAE,EAAE;IACH,mCAAmC,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAA;AACtG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,aAAqB,EACrB,MAAmB,EACnB,GAAkB,EAClB,iBAAgC,EAChC,EAAE;IACF,gCAAgC,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAA;AACrF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,aAAqB,EAAE,EAAE;IACzE,EAAE,CAAC,OAAO,CACR,iGAAiG,CAClG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,aAAqB,EAAE,IAAc,EAAE,SAAiB,EAAE,EAAE;IACpG,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,8BAA8B,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;QAC5D,OAAM;IACR,CAAC;IAED,gCAAgC,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;AAChE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,aAAqB,EAAE,KAAwB,EAAE,EAAE;IAChG,uCAAuC,CAAC,GAAG,CACzC,KAAK,CAAC,6BAA6B,EACnC,KAAK,CAAC,gCAAgC,EACtC,KAAK,CAAC,2BAA2B,EACjC,KAAK,CAAC,2BAA2B,EACjC,KAAK,CAAC,4BAA4B,EAClC,KAAK,CAAC,gCAAgC,EACtC,KAAK,CAAC,+BAA+B,EACrC,KAAK,CAAC,mBAAmB,EACzB,aAAa,CACd,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,aAAqB,EAAE,UAAkB,EAAE,EAAE;IAC3F,wCAAwC,CAAC,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AACzE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,aAAqB,EAAE,EAAE;IACzD,gCAAgC,CAAC,aAAa,CAAC,CAAA;IAC/C,+BAA+B,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAClD,0BAA0B,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,EACjC,aAAa,EACb,OAAO,EACP,WAAW,EACX,aAAa,EACb,WAAW,EACX,OAAO,EACP,YAAY,EACZ,OAAO,EACP,MAAM,EACN,QAAQ,GAYT,EAAE,EAAE;IACH,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;IACvB,2BAA2B,CAAC,GAAG,CAC7B,EAAE,EACF,aAAa,EACb,OAAO,EACP,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAC3B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAC7B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAC3B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EACvB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAC5B,OAAO,EACP,MAAM,EACN,QAAQ,CACT,CAAA;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAuB,EAAE;IACzE,MAAM,GAAG,GAAG,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAgC,CAAA;IACnF,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;QAC1B,WAAW,EAAE,sBAAsB,CAAC,GAAG,CAAC,gBAAgB,CAAa;QACrE,cAAc,EAAE,sBAAsB,CAAC,GAAG,CAAC,mBAAmB,CAAa;QAC3E,YAAY,EAAE,sBAAsB,CAAC,GAAG,CAAC,iBAAiB,CAAiC;QAC3F,OAAO,EAAE,sBAAsB,CAAC,GAAG,CAAC,YAAY,CAA4B;QAC5E,YAAY,EAAE,sBAAsB,CAAC,GAAG,CAAC,iBAAiB,CAAiC;QAC3F,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;QAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAA;AACH,CAAC,CAAA;AAED,MAAM,uCAAuC,GAAG,EAAE,CAAC,OAAO,CACxD,+GAA+G,CAChH,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,UAAkB,EAAE,SAAiB,EAAY,EAAE;IAChG,MAAM,IAAI,GAAG,uCAAuC,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAA0B,CAAA;IACxG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAChC,CAAC,CAAA;AAED,MAAM,yCAAyC,GAAG,EAAE,CAAC,OAAO,CAC1D,yDAAyD,CAC1D,CAAA;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,aAAqB,EAAY,EAAE;IAClF,MAAM,IAAI,GAAG,yCAAyC,CAAC,GAAG,CAAC,aAAa,CAA0B,CAAA;IAClG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAChC,CAAC,CAAA;AAED,MAAM,8CAA8C,GAAG,EAAE,CAAC,OAAO,CAC/D,+DAA+D,CAChE,CAAA;AAED,MAAM,CAAC,MAAM,qCAAqC,GAAG,CAAC,aAAqB,EAAY,EAAE;IACvF,MAAM,IAAI,GAAG,8CAA8C,CAAC,GAAG,CAAC,aAAa,CAA0B,CAAA;IACvG,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AAChC,CAAC,CAAA;AAED,MAAM,2CAA2C,GAAG,EAAE,CAAC,OAAO,CAC5D,mHAAmH,CACpH,CAAA;AAED,MAAM,gDAAgD,GAAG,EAAE,CAAC,OAAO,CACjE,yHAAyH,CAC1H,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,aAAqB,EAAQ,EAAE;IACvE,2CAA2C,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC9D,gDAAgD,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;AACrE,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,CAAC,KAAoB,EAAa,EAAE;IACjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAY,CAAA;QAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC,CAAA"}
@@ -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
- ) 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);
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
  };