@straiffi/archon 1.0.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/README.md +224 -0
- package/dist/cli.js +216 -0
- package/dist/client/assets/index-8_-boBBA.css +2 -0
- package/dist/client/assets/index-s_jjeqha.js +176 -0
- package/dist/client/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/dist/client/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
- package/dist/client/favicon.svg +62 -0
- package/dist/client/icons.svg +24 -0
- package/dist/client/index.html +14 -0
- package/dist/server/db.js +764 -0
- package/dist/server/db.js.map +1 -0
- package/dist/server/index.js +5134 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lib/agent.js +1302 -0
- package/dist/server/lib/agent.js.map +1 -0
- package/dist/server/lib/buildChains.js +2 -0
- package/dist/server/lib/buildChains.js.map +1 -0
- package/dist/server/lib/buildFlow.js +59 -0
- package/dist/server/lib/buildFlow.js.map +1 -0
- package/dist/server/lib/buildSequences.js +599 -0
- package/dist/server/lib/buildSequences.js.map +1 -0
- package/dist/server/lib/bundleActivity.js +95 -0
- package/dist/server/lib/bundleActivity.js.map +1 -0
- package/dist/server/lib/bundlePullRequests.js +126 -0
- package/dist/server/lib/bundlePullRequests.js.map +1 -0
- package/dist/server/lib/chatMessages.js +60 -0
- package/dist/server/lib/chatMessages.js.map +1 -0
- package/dist/server/lib/chatTargets.js +123 -0
- package/dist/server/lib/chatTargets.js.map +1 -0
- package/dist/server/lib/chatTicketProposals.js +180 -0
- package/dist/server/lib/chatTicketProposals.js.map +1 -0
- package/dist/server/lib/chats.js +279 -0
- package/dist/server/lib/chats.js.map +1 -0
- package/dist/server/lib/config.js +3 -0
- package/dist/server/lib/config.js.map +1 -0
- package/dist/server/lib/cors.js +30 -0
- package/dist/server/lib/cors.js.map +1 -0
- package/dist/server/lib/directoryPicker.js +174 -0
- package/dist/server/lib/directoryPicker.js.map +1 -0
- package/dist/server/lib/git.js +1284 -0
- package/dist/server/lib/git.js.map +1 -0
- package/dist/server/lib/integrations/github.js +511 -0
- package/dist/server/lib/integrations/github.js.map +1 -0
- package/dist/server/lib/integrations/index.js +162 -0
- package/dist/server/lib/integrations/index.js.map +1 -0
- package/dist/server/lib/integrations/jira.js +283 -0
- package/dist/server/lib/integrations/jira.js.map +1 -0
- package/dist/server/lib/integrations/planning.js +27 -0
- package/dist/server/lib/integrations/planning.js.map +1 -0
- package/dist/server/lib/integrations/types.js +2 -0
- package/dist/server/lib/integrations/types.js.map +1 -0
- package/dist/server/lib/lightweightPrompt.js +88 -0
- package/dist/server/lib/lightweightPrompt.js.map +1 -0
- package/dist/server/lib/models.js +219 -0
- package/dist/server/lib/models.js.map +1 -0
- package/dist/server/lib/preview.js +377 -0
- package/dist/server/lib/preview.js.map +1 -0
- package/dist/server/lib/previewProxy.js +659 -0
- package/dist/server/lib/previewProxy.js.map +1 -0
- package/dist/server/lib/projectAutoConfig.js +682 -0
- package/dist/server/lib/projectAutoConfig.js.map +1 -0
- package/dist/server/lib/projectFileSuggestions.js +133 -0
- package/dist/server/lib/projectFileSuggestions.js.map +1 -0
- package/dist/server/lib/projectMemory.js +1519 -0
- package/dist/server/lib/projectMemory.js.map +1 -0
- package/dist/server/lib/projectMemoryPrompt.js +390 -0
- package/dist/server/lib/projectMemoryPrompt.js.map +1 -0
- package/dist/server/lib/projectMemoryScan.js +681 -0
- package/dist/server/lib/projectMemoryScan.js.map +1 -0
- package/dist/server/lib/projectMemorySuggestions.js +166 -0
- package/dist/server/lib/projectMemorySuggestions.js.map +1 -0
- package/dist/server/lib/projectMemoryTransfer.js +958 -0
- package/dist/server/lib/projectMemoryTransfer.js.map +1 -0
- package/dist/server/lib/projects.js +569 -0
- package/dist/server/lib/projects.js.map +1 -0
- package/dist/server/lib/promptSkills.js +28 -0
- package/dist/server/lib/promptSkills.js.map +1 -0
- package/dist/server/lib/queue.js +15 -0
- package/dist/server/lib/queue.js.map +1 -0
- package/dist/server/lib/reviewFindings.js +390 -0
- package/dist/server/lib/reviewFindings.js.map +1 -0
- package/dist/server/lib/run.js +416 -0
- package/dist/server/lib/run.js.map +1 -0
- package/dist/server/lib/runtimePaths.js +93 -0
- package/dist/server/lib/runtimePaths.js.map +1 -0
- package/dist/server/lib/shell.js +27 -0
- package/dist/server/lib/shell.js.map +1 -0
- package/dist/server/lib/skills.js +124 -0
- package/dist/server/lib/skills.js.map +1 -0
- package/dist/server/lib/startDev.js +18 -0
- package/dist/server/lib/startDev.js.map +1 -0
- package/dist/server/lib/staticClient.js +80 -0
- package/dist/server/lib/staticClient.js.map +1 -0
- package/dist/server/lib/terminal.js +366 -0
- package/dist/server/lib/terminal.js.map +1 -0
- package/dist/server/lib/ticketDependencies.js +174 -0
- package/dist/server/lib/ticketDependencies.js.map +1 -0
- package/dist/server/lib/ticketMessages.js +65 -0
- package/dist/server/lib/ticketMessages.js.map +1 -0
- package/dist/server/lib/ticketOpenQuestions.js +128 -0
- package/dist/server/lib/ticketOpenQuestions.js.map +1 -0
- package/dist/server/lib/ticketUndo.js +549 -0
- package/dist/server/lib/ticketUndo.js.map +1 -0
- package/dist/server/lib/tickets.js +981 -0
- package/dist/server/lib/tickets.js.map +1 -0
- package/dist/server/lib/types.js +2 -0
- package/dist/server/lib/types.js.map +1 -0
- package/dist/server/package.json +3 -0
- package/dist/server/workers/build.js +229 -0
- package/dist/server/workers/build.js.map +1 -0
- package/dist/server/workers/chat.js +190 -0
- package/dist/server/workers/chat.js.map +1 -0
- package/dist/server/workers/followUp.js +204 -0
- package/dist/server/workers/followUp.js.map +1 -0
- package/dist/server/workers/plan.js +1130 -0
- package/dist/server/workers/plan.js.map +1 -0
- package/dist/server/workers/planFollowUp.js +360 -0
- package/dist/server/workers/planFollowUp.js.map +1 -0
- package/dist/server/workers/review.js +167 -0
- package/dist/server/workers/review.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import db from '../db.js';
|
|
2
|
+
const dependencySelect = `
|
|
3
|
+
SELECT
|
|
4
|
+
ticket_dependencies.blocker_ticket_id,
|
|
5
|
+
ticket_dependencies.dependent_ticket_id,
|
|
6
|
+
ticket_dependencies.created_at,
|
|
7
|
+
ticket_dependencies.updated_at
|
|
8
|
+
FROM ticket_dependencies
|
|
9
|
+
`;
|
|
10
|
+
const serializeTicketDependency = (row) => {
|
|
11
|
+
if (!row) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
blocker_ticket_id: row.blocker_ticket_id,
|
|
16
|
+
dependent_ticket_id: row.dependent_ticket_id,
|
|
17
|
+
created_at: row.created_at,
|
|
18
|
+
updated_at: row.updated_at,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
const getTicketProjectRow = (ticketId) => {
|
|
22
|
+
return db.prepare('SELECT id, project_id FROM tickets WHERE id = ?').get(ticketId);
|
|
23
|
+
};
|
|
24
|
+
export const isTicketBuildComplete = (ticket) => {
|
|
25
|
+
if (!ticket) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
if (ticket.build_completed_at !== null && ticket.build_completed_at !== undefined) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
if (ticket.state === 'review') {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return ticket.state === 'build' && ticket.agent_status === 'done';
|
|
35
|
+
};
|
|
36
|
+
export const isTicketRunSetupReady = (ticket) => {
|
|
37
|
+
if (!ticket) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (ticket.run_setup_status === 'ready') {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return isTicketBuildComplete(ticket);
|
|
44
|
+
};
|
|
45
|
+
export const getOpenBlockers = (ticketId, projectId, options = {}) => {
|
|
46
|
+
if (!projectId) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
const ignoredTicketIds = new Set(options.ignoredTicketIds ?? []);
|
|
50
|
+
const rows = db.prepare(`
|
|
51
|
+
SELECT blocker_ticket.id, blocker_ticket.title, blocker_ticket.build_completed_at, blocker_ticket.project_id, blocker_ticket.state, blocker_ticket.agent_status
|
|
52
|
+
FROM ticket_dependencies
|
|
53
|
+
INNER JOIN tickets AS blocker_ticket
|
|
54
|
+
ON blocker_ticket.id = ticket_dependencies.blocker_ticket_id
|
|
55
|
+
INNER JOIN tickets AS dependent_ticket
|
|
56
|
+
ON dependent_ticket.id = ticket_dependencies.dependent_ticket_id
|
|
57
|
+
WHERE ticket_dependencies.dependent_ticket_id = ?
|
|
58
|
+
AND blocker_ticket.project_id = ?
|
|
59
|
+
AND dependent_ticket.project_id = ?
|
|
60
|
+
ORDER BY blocker_ticket.created_at ASC, blocker_ticket.title COLLATE NOCASE ASC, blocker_ticket.id ASC
|
|
61
|
+
`).all(ticketId, projectId, projectId);
|
|
62
|
+
return rows
|
|
63
|
+
.filter(row => !ignoredTicketIds.has(row.id))
|
|
64
|
+
.filter(row => !isTicketBuildComplete(row))
|
|
65
|
+
.map(row => ({
|
|
66
|
+
id: row.id,
|
|
67
|
+
title: row.title,
|
|
68
|
+
build_completed_at: row.build_completed_at,
|
|
69
|
+
}));
|
|
70
|
+
};
|
|
71
|
+
export const listTicketDependencies = (projectId) => {
|
|
72
|
+
const rows = db.prepare(`
|
|
73
|
+
${dependencySelect}
|
|
74
|
+
INNER JOIN tickets AS blocker_ticket
|
|
75
|
+
ON blocker_ticket.id = ticket_dependencies.blocker_ticket_id
|
|
76
|
+
INNER JOIN tickets AS dependent_ticket
|
|
77
|
+
ON dependent_ticket.id = ticket_dependencies.dependent_ticket_id
|
|
78
|
+
WHERE blocker_ticket.project_id = ?
|
|
79
|
+
AND dependent_ticket.project_id = ?
|
|
80
|
+
ORDER BY ticket_dependencies.created_at ASC, ticket_dependencies.blocker_ticket_id ASC, ticket_dependencies.dependent_ticket_id ASC
|
|
81
|
+
`).all(projectId, projectId);
|
|
82
|
+
return rows.map(row => serializeTicketDependency(row)).filter((dependency) => dependency !== null);
|
|
83
|
+
};
|
|
84
|
+
export const getTicketDependency = (blockerTicketId, dependentTicketId) => {
|
|
85
|
+
const row = db.prepare(`${dependencySelect} WHERE blocker_ticket_id = ? AND dependent_ticket_id = ?`).get(blockerTicketId, dependentTicketId);
|
|
86
|
+
return serializeTicketDependency(row);
|
|
87
|
+
};
|
|
88
|
+
export const ticketDependencyExists = (blockerTicketId, dependentTicketId) => {
|
|
89
|
+
return getTicketDependency(blockerTicketId, dependentTicketId) !== null;
|
|
90
|
+
};
|
|
91
|
+
export const wouldCreateTicketDependencyCycle = (blockerTicketId, dependentTicketId) => {
|
|
92
|
+
const row = db.prepare(`
|
|
93
|
+
WITH RECURSIVE dependency_path(ticket_id) AS (
|
|
94
|
+
SELECT dependent_ticket_id
|
|
95
|
+
FROM ticket_dependencies
|
|
96
|
+
WHERE blocker_ticket_id = ?
|
|
97
|
+
|
|
98
|
+
UNION
|
|
99
|
+
|
|
100
|
+
SELECT ticket_dependencies.dependent_ticket_id
|
|
101
|
+
FROM ticket_dependencies
|
|
102
|
+
INNER JOIN dependency_path ON ticket_dependencies.blocker_ticket_id = dependency_path.ticket_id
|
|
103
|
+
)
|
|
104
|
+
SELECT 1 AS has_cycle
|
|
105
|
+
FROM dependency_path
|
|
106
|
+
WHERE ticket_id = ?
|
|
107
|
+
LIMIT 1
|
|
108
|
+
`).get(dependentTicketId, blockerTicketId);
|
|
109
|
+
return row?.has_cycle === 1;
|
|
110
|
+
};
|
|
111
|
+
export const validateCreateTicketDependency = ({ blockerTicketId, dependentTicketId, projectId, }) => {
|
|
112
|
+
if (blockerTicketId === dependentTicketId) {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
error: 'A ticket cannot depend on itself.',
|
|
116
|
+
status: 400,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const blocker = getTicketProjectRow(blockerTicketId);
|
|
120
|
+
const dependent = getTicketProjectRow(dependentTicketId);
|
|
121
|
+
if (!blocker || !dependent) {
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
error: 'Both tickets must exist before creating a dependency.',
|
|
125
|
+
status: 404,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (blocker.project_id !== projectId || dependent.project_id !== projectId || blocker.project_id !== dependent.project_id) {
|
|
129
|
+
return {
|
|
130
|
+
ok: false,
|
|
131
|
+
error: 'Dependencies can only be created between tickets in the same project.',
|
|
132
|
+
status: 409,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
if (ticketDependencyExists(blockerTicketId, dependentTicketId)) {
|
|
136
|
+
return {
|
|
137
|
+
ok: false,
|
|
138
|
+
error: 'This dependency already exists.',
|
|
139
|
+
status: 409,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (wouldCreateTicketDependencyCycle(blockerTicketId, dependentTicketId)) {
|
|
143
|
+
return {
|
|
144
|
+
ok: false,
|
|
145
|
+
error: 'This dependency would create a cycle.',
|
|
146
|
+
status: 409,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
ok: true,
|
|
151
|
+
blocker,
|
|
152
|
+
dependent,
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
export const createTicketDependency = (blockerTicketId, dependentTicketId) => {
|
|
156
|
+
db.prepare(`
|
|
157
|
+
INSERT INTO ticket_dependencies (blocker_ticket_id, dependent_ticket_id)
|
|
158
|
+
VALUES (?, ?)
|
|
159
|
+
`).run(blockerTicketId, dependentTicketId);
|
|
160
|
+
return getTicketDependency(blockerTicketId, dependentTicketId);
|
|
161
|
+
};
|
|
162
|
+
export const deleteTicketDependency = (blockerTicketId, dependentTicketId) => {
|
|
163
|
+
return db.prepare(`
|
|
164
|
+
DELETE FROM ticket_dependencies
|
|
165
|
+
WHERE blocker_ticket_id = ? AND dependent_ticket_id = ?
|
|
166
|
+
`).run(blockerTicketId, dependentTicketId);
|
|
167
|
+
};
|
|
168
|
+
export const deleteTicketDependenciesForTicket = (ticketId) => {
|
|
169
|
+
db.prepare(`
|
|
170
|
+
DELETE FROM ticket_dependencies
|
|
171
|
+
WHERE blocker_ticket_id = ? OR dependent_ticket_id = ?
|
|
172
|
+
`).run(ticketId, ticketId);
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=ticketDependencies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketDependencies.js","sourceRoot":"","sources":["../../../server/lib/ticketDependencies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import db from '../db.js';
|
|
3
|
+
const listTicketMessagesStatement = db.prepare(`
|
|
4
|
+
SELECT id, ticket_id, role, kind, content, bundle_visible_at, created_at
|
|
5
|
+
FROM ticket_messages
|
|
6
|
+
WHERE ticket_id = ?
|
|
7
|
+
ORDER BY created_at ASC, rowid ASC
|
|
8
|
+
`);
|
|
9
|
+
const getDescriptionMessageStatement = db.prepare(`
|
|
10
|
+
SELECT id, ticket_id, role, kind, content, bundle_visible_at, created_at
|
|
11
|
+
FROM ticket_messages
|
|
12
|
+
WHERE ticket_id = ? AND kind = 'description'
|
|
13
|
+
ORDER BY created_at ASC, rowid ASC
|
|
14
|
+
LIMIT 1
|
|
15
|
+
`);
|
|
16
|
+
const insertTicketMessageStatement = db.prepare(`
|
|
17
|
+
INSERT INTO ticket_messages (id, ticket_id, role, kind, content)
|
|
18
|
+
VALUES (?, ?, ?, ?, ?)
|
|
19
|
+
`);
|
|
20
|
+
const updateTicketMessageContentStatement = db.prepare(`
|
|
21
|
+
UPDATE ticket_messages
|
|
22
|
+
SET content = ?
|
|
23
|
+
WHERE id = ?
|
|
24
|
+
`);
|
|
25
|
+
const markDescriptionVisibleInBundleStatement = db.prepare(`
|
|
26
|
+
UPDATE ticket_messages
|
|
27
|
+
SET bundle_visible_at = CURRENT_TIMESTAMP
|
|
28
|
+
WHERE ticket_id = ?
|
|
29
|
+
AND kind = 'description'
|
|
30
|
+
AND bundle_visible_at IS NULL
|
|
31
|
+
`);
|
|
32
|
+
const clearTicketStreamingResponseStatement = db.prepare(`
|
|
33
|
+
UPDATE tickets
|
|
34
|
+
SET streaming_response = NULL,
|
|
35
|
+
updated_at = CURRENT_TIMESTAMP
|
|
36
|
+
WHERE id = ?
|
|
37
|
+
`);
|
|
38
|
+
export const listTicketMessages = (ticketId) => {
|
|
39
|
+
return listTicketMessagesStatement.all(ticketId);
|
|
40
|
+
};
|
|
41
|
+
export const createTicketMessage = ({ ticketId, role, kind, content, }) => {
|
|
42
|
+
const id = randomUUID();
|
|
43
|
+
insertTicketMessageStatement.run(id, ticketId, role, kind, content);
|
|
44
|
+
return id;
|
|
45
|
+
};
|
|
46
|
+
export const upsertTicketDescriptionMessage = (ticketId, description) => {
|
|
47
|
+
const existing = getDescriptionMessageStatement.get(ticketId);
|
|
48
|
+
if (existing) {
|
|
49
|
+
updateTicketMessageContentStatement.run(description, existing.id);
|
|
50
|
+
return existing.id;
|
|
51
|
+
}
|
|
52
|
+
return createTicketMessage({
|
|
53
|
+
ticketId,
|
|
54
|
+
role: 'user',
|
|
55
|
+
kind: 'description',
|
|
56
|
+
content: description,
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
export const markTicketDescriptionVisibleInBundle = (ticketId) => {
|
|
60
|
+
markDescriptionVisibleInBundleStatement.run(ticketId);
|
|
61
|
+
};
|
|
62
|
+
export const clearTicketStreamingResponse = (ticketId) => {
|
|
63
|
+
clearTicketStreamingResponseStatement.run(ticketId);
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=ticketMessages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketMessages.js","sourceRoot":"","sources":["../../../server/lib/ticketMessages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,UAAU,CAAA;AAGzB,MAAM,2BAA2B,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAK9C,CAAC,CAAA;AAEF,MAAM,8BAA8B,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;CAMjD,CAAC,CAAA;AAEF,MAAM,4BAA4B,GAAG,EAAE,CAAC,OAAO,CAAC;;;CAG/C,CAAC,CAAA;AAEF,MAAM,mCAAmC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;CAItD,CAAC,CAAA;AAEF,MAAM,uCAAuC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;CAM1D,CAAC,CAAA;AAEF,MAAM,qCAAqC,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;CAKxD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAgB,EAAmB,EAAE;IACtE,OAAO,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAuB,CAAA;AACxE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,OAAO,GAMR,EAAE,EAAE;IACH,MAAM,EAAE,GAAG,UAAU,EAAE,CAAA;IACvB,4BAA4B,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACnE,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,QAAgB,EAAE,WAAmB,EAAE,EAAE;IACtF,MAAM,QAAQ,GAAG,8BAA8B,CAAC,GAAG,CAAC,QAAQ,CAAiC,CAAA;IAC7F,IAAI,QAAQ,EAAE,CAAC;QACb,mCAAmC,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QACjE,OAAO,QAAQ,CAAC,EAAE,CAAA;IACpB,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,QAAQ;QACR,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,WAAW;KACrB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,QAAgB,EAAE,EAAE;IACvE,uCAAuC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC/D,qCAAqC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AACrD,CAAC,CAAA"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { extractProjectMemorySuggestionsFromOutput } from './projectMemorySuggestions.js';
|
|
2
|
+
export const OPEN_QUESTIONS_RESPONSE_RULES = [
|
|
3
|
+
'After your normal response, append a final JSON object on the last line using this exact shape: {"open_questions":["optional question?"]}.',
|
|
4
|
+
'- Always produce the best complete implementation result first.',
|
|
5
|
+
'- If a material assumption still affects scope, implementation details, constraints, or verification, also surface it in `open_questions`.',
|
|
6
|
+
'- Use `open_questions` only for unresolved ticket-local refinements or assumptions the user may want to confirm.',
|
|
7
|
+
'- Every `open_questions` entry must be written as a direct question ending with `?`.',
|
|
8
|
+
'- Keep `open_questions` to 0-3 items.',
|
|
9
|
+
'- Prefer resolving questions in code or in the response instead of leaving them open when you can do so confidently.',
|
|
10
|
+
'- The JSON must be valid and must not be wrapped in code fences.',
|
|
11
|
+
].join('\n');
|
|
12
|
+
const stripSystemReminderBlocks = (output) => {
|
|
13
|
+
return output.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/g, '').trim();
|
|
14
|
+
};
|
|
15
|
+
const stripMarkdownCodeFence = (output) => {
|
|
16
|
+
const trimmedOutput = output.trim();
|
|
17
|
+
const fencedMatch = trimmedOutput.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i);
|
|
18
|
+
return fencedMatch ? fencedMatch[1].trim() : trimmedOutput;
|
|
19
|
+
};
|
|
20
|
+
const normalizeOpenQuestions = (value) => {
|
|
21
|
+
if (!Array.isArray(value)) {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
return value
|
|
25
|
+
.filter((entry) => typeof entry === 'string')
|
|
26
|
+
.map(entry => entry.trim())
|
|
27
|
+
.filter(question => question.endsWith('?'))
|
|
28
|
+
.filter(Boolean)
|
|
29
|
+
.filter((entry, index, values) => values.indexOf(entry) === index)
|
|
30
|
+
.slice(0, 3);
|
|
31
|
+
};
|
|
32
|
+
const findLastNonEmptyLineIndex = (lines) => {
|
|
33
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
34
|
+
if (lines[index].trim()) {
|
|
35
|
+
return index;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return -1;
|
|
39
|
+
};
|
|
40
|
+
export const buildOpenQuestionsPromptBlock = (openQuestions) => {
|
|
41
|
+
if (openQuestions.length === 0) {
|
|
42
|
+
return '';
|
|
43
|
+
}
|
|
44
|
+
return [
|
|
45
|
+
'Current unresolved open questions from earlier work:',
|
|
46
|
+
'<open_questions>',
|
|
47
|
+
...openQuestions.map((question, index) => `${index + 1}. ${question}`),
|
|
48
|
+
'</open_questions>',
|
|
49
|
+
'- Resolve a question in the implementation or response when you can do so confidently.',
|
|
50
|
+
'- Keep a question in the final `open_questions` array only if it still materially affects the implementation.',
|
|
51
|
+
].join('\n');
|
|
52
|
+
};
|
|
53
|
+
export const parseAgentResponseWithOpenQuestions = (output) => {
|
|
54
|
+
const normalizedOutput = stripMarkdownCodeFence(stripSystemReminderBlocks(output));
|
|
55
|
+
const { cleanedOutput, suggestions } = extractProjectMemorySuggestionsFromOutput(normalizedOutput);
|
|
56
|
+
const trimmedOutput = cleanedOutput.trim();
|
|
57
|
+
if (!trimmedOutput) {
|
|
58
|
+
return {
|
|
59
|
+
response: '',
|
|
60
|
+
openQuestions: [],
|
|
61
|
+
suggestions,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const lines = trimmedOutput.split('\n');
|
|
65
|
+
const lastNonEmptyLineIndex = findLastNonEmptyLineIndex(lines);
|
|
66
|
+
if (lastNonEmptyLineIndex < 0) {
|
|
67
|
+
return {
|
|
68
|
+
response: '',
|
|
69
|
+
openQuestions: [],
|
|
70
|
+
suggestions,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const trailingLine = lines[lastNonEmptyLineIndex].trim();
|
|
74
|
+
if (!trailingLine.startsWith('{') || !trailingLine.endsWith('}')) {
|
|
75
|
+
return {
|
|
76
|
+
response: trimmedOutput,
|
|
77
|
+
openQuestions: [],
|
|
78
|
+
suggestions,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(trailingLine);
|
|
83
|
+
if (!('open_questions' in parsed)) {
|
|
84
|
+
return {
|
|
85
|
+
response: trimmedOutput,
|
|
86
|
+
openQuestions: [],
|
|
87
|
+
suggestions,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
response: lines.slice(0, lastNonEmptyLineIndex).join('\n').trim(),
|
|
92
|
+
openQuestions: normalizeOpenQuestions(parsed.open_questions),
|
|
93
|
+
suggestions,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return {
|
|
98
|
+
response: trimmedOutput,
|
|
99
|
+
openQuestions: [],
|
|
100
|
+
suggestions,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
export const formatAssistantMessageWithOpenQuestions = ({ response, openQuestions, fallbackResponse = '', }) => {
|
|
105
|
+
const trimmedResponse = response.trim();
|
|
106
|
+
const questionsBlock = openQuestions.length > 0
|
|
107
|
+
? `Open questions:\n${openQuestions.map((question, index) => `${index + 1}. ${question}`).join('\n')}`
|
|
108
|
+
: '';
|
|
109
|
+
if (trimmedResponse && questionsBlock) {
|
|
110
|
+
return `${trimmedResponse}\n\n${questionsBlock}`;
|
|
111
|
+
}
|
|
112
|
+
if (trimmedResponse) {
|
|
113
|
+
return trimmedResponse;
|
|
114
|
+
}
|
|
115
|
+
if (questionsBlock) {
|
|
116
|
+
return questionsBlock;
|
|
117
|
+
}
|
|
118
|
+
return fallbackResponse;
|
|
119
|
+
};
|
|
120
|
+
export const createTicketOpenQuestionsContext = (ticket, openQuestions) => {
|
|
121
|
+
return {
|
|
122
|
+
source_kind: ticket.planning_context?.source_kind ?? 'single',
|
|
123
|
+
initiative_prompt: ticket.planning_context?.initiative_prompt?.trim() || ticket.description || ticket.title,
|
|
124
|
+
related_ticket_ids: ticket.planning_context?.related_ticket_ids ?? [ticket.id],
|
|
125
|
+
open_questions: normalizeOpenQuestions(openQuestions),
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=ticketOpenQuestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticketOpenQuestions.js","sourceRoot":"","sources":["../../../server/lib/ticketOpenQuestions.ts"],"names":[],"mappings":"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"}
|