@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,418 @@
|
|
|
1
|
+
import { formatAgentErrorForTranscript, runSpecAgent } from '../lib/agent.js';
|
|
2
|
+
import { deleteStagedSpecAttachments, linkSpecAttachmentsToMessage, stageSpecAttachmentsForAgent } from '../lib/attachments.js';
|
|
3
|
+
import { createSpecMessage } from '../lib/specMessages.js';
|
|
4
|
+
import { beginSpecSessionThinkingRun, bindSpecSessionThinkingMessage } from '../lib/thinkingState.js';
|
|
5
|
+
import { createSpecSnapshot, deriveSpecSessionTitle, getDefaultSpecSessionTitle, getSpecSession, getSpecSnapshot, updateSpecSessionLatestSnapshot, updateSpecSessionRunConfig, updateSpecSessionStatus, updateSpecSessionTitle, updateSpecSessionUsageSnapshot, } from '../lib/specs.js';
|
|
6
|
+
import { normalizeModelId } from '../lib/models.js';
|
|
7
|
+
import { PLAN_MODE_QUESTION_PROMPT_RULES } from '../lib/planModeQuestions.js';
|
|
8
|
+
import { getProjectMemoryPromptBlock } from '../lib/projectMemoryPrompt.js';
|
|
9
|
+
import { extractProjectMemorySuggestionsFromOutput, getProjectMemorySuggestionPromptRules, } from '../lib/projectMemorySuggestions.js';
|
|
10
|
+
import { enqueue, isRunning } from '../lib/queue.js';
|
|
11
|
+
import { getProjectById } from '../lib/projects.js';
|
|
12
|
+
import { extractSpecArtifactFromOutput, resolveCarriedForwardArtifacts, resolveCarriedForwardStructuredFields, stripMermaidBlocks } from '../lib/specArtifact.js';
|
|
13
|
+
import { IMPLEMENTATION_BODY_DEDUPLICATION_RULES, IMPLEMENTATION_DETAIL_RULES, IMPLEMENTATION_READY_DESCRIPTION_REQUIREMENTS, IMPLEMENTATION_READY_DESCRIPTION_SECTION_TEMPLATE, } from '../lib/ticketDescriptionContract.js';
|
|
14
|
+
const ATTACHMENT_ONLY_EMPTY_RESPONSE_FALLBACK = 'I reviewed the attached image input, but I could not produce a textual response. Please try again with a short note about what you want me to focus on in the image.';
|
|
15
|
+
const getErrorMessage = (error) => {
|
|
16
|
+
return error instanceof Error ? error.message : String(error);
|
|
17
|
+
};
|
|
18
|
+
const resolveSpecWorkerKey = (specSessionId) => `spec-session:${specSessionId}`;
|
|
19
|
+
/**
|
|
20
|
+
* Render the prior snapshot's structured fields as a compact text block the
|
|
21
|
+
* planner can anchor on. Only non-empty sections are included so the prompt
|
|
22
|
+
* stays small. Ticket descriptions are deliberately omitted (they are large and
|
|
23
|
+
* the planner only needs keys + titles to preserve ticket identity).
|
|
24
|
+
*/
|
|
25
|
+
const formatPreviousSpecStateBlock = (snapshot) => {
|
|
26
|
+
const lines = [`Summary: ${snapshot.summary}`];
|
|
27
|
+
if (snapshot.likely_files.length > 0) {
|
|
28
|
+
lines.push('Likely files:');
|
|
29
|
+
for (const file of snapshot.likely_files) {
|
|
30
|
+
lines.push(`- ${file.path} — ${file.reason}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (snapshot.assumptions.length > 0) {
|
|
34
|
+
lines.push('Assumptions:');
|
|
35
|
+
for (const assumption of snapshot.assumptions) {
|
|
36
|
+
lines.push(`- ${assumption}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (snapshot.open_questions.length > 0) {
|
|
40
|
+
lines.push('Open questions:');
|
|
41
|
+
for (const question of snapshot.open_questions) {
|
|
42
|
+
lines.push(`- ${question}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (snapshot.tickets.length > 0) {
|
|
46
|
+
lines.push('Tickets:');
|
|
47
|
+
for (const ticket of snapshot.tickets) {
|
|
48
|
+
lines.push(`- ${ticket.key} — ${ticket.title}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (snapshot.dependencies.length > 0) {
|
|
52
|
+
lines.push('Dependencies:');
|
|
53
|
+
for (const dep of snapshot.dependencies) {
|
|
54
|
+
lines.push(`- ${dep.blocker_key} -> ${dep.dependent_key}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return lines.join('\n');
|
|
58
|
+
};
|
|
59
|
+
const buildSpecPrompt = ({ projectName, projectPath, instruction, hasAttachments, projectMemory, memoryEnabled, previousSnapshot, }) => {
|
|
60
|
+
const trimmedInstruction = instruction.trim();
|
|
61
|
+
const attachmentPrompt = hasAttachments
|
|
62
|
+
? 'One or more user-attached images are included with this turn. Inspect them for requirements, visual constraints, and implementation context.'
|
|
63
|
+
: '';
|
|
64
|
+
const attachmentResponseInstruction = hasAttachments
|
|
65
|
+
? 'Always provide a textual response that references the attached images, even when the images are the only user input.'
|
|
66
|
+
: '';
|
|
67
|
+
const userRequest = trimmedInstruction
|
|
68
|
+
? `User request:\n${trimmedInstruction}`
|
|
69
|
+
: hasAttachments
|
|
70
|
+
? 'User request:\nThe user attached images without accompanying text. Base your response on those images and reply with concrete analysis or next-step guidance.'
|
|
71
|
+
: '';
|
|
72
|
+
const existingMermaid = Boolean(previousSnapshot?.mermaid);
|
|
73
|
+
const existingMockup = Boolean(previousSnapshot?.mockup);
|
|
74
|
+
const previousSpecBaseline = previousSnapshot
|
|
75
|
+
? [
|
|
76
|
+
'This spec already exists from prior turns. Treat the spec as accumulating: the artifact you emit this',
|
|
77
|
+
'turn must represent the COMPLETE current state of the spec, not a diff of what this turn changed. Evolve',
|
|
78
|
+
'the spec toward the right shape — never silently drop information that is still part of the plan, and do',
|
|
79
|
+
'not add per-turn commentary (e.g. "this turn only emits the mockup") to any field.',
|
|
80
|
+
'',
|
|
81
|
+
'Current spec baseline (carry each field forward unless this turn deliberately changes it):',
|
|
82
|
+
'```',
|
|
83
|
+
formatPreviousSpecStateBlock(previousSnapshot),
|
|
84
|
+
'```',
|
|
85
|
+
].join('\n')
|
|
86
|
+
: '';
|
|
87
|
+
return [
|
|
88
|
+
[
|
|
89
|
+
'Work in planning mode.',
|
|
90
|
+
'Focus on scoping, architecture, risks, sequencing, and concrete implementation guidance.',
|
|
91
|
+
'Do not claim code is implemented unless you actually changed code in this turn.',
|
|
92
|
+
PLAN_MODE_QUESTION_PROMPT_RULES,
|
|
93
|
+
].join(' '),
|
|
94
|
+
`Project: ${projectName}\nWorking directory: ${projectPath}`,
|
|
95
|
+
projectMemory,
|
|
96
|
+
previousSpecBaseline,
|
|
97
|
+
attachmentPrompt,
|
|
98
|
+
attachmentResponseInstruction,
|
|
99
|
+
userRequest,
|
|
100
|
+
[
|
|
101
|
+
'You are producing a structured specification. In your response include:',
|
|
102
|
+
'',
|
|
103
|
+
'1. Normal human-readable planning text explaining your analysis, trade-offs, and recommendations.',
|
|
104
|
+
' This text is for analysis only — never include meta-commentary about the emission process',
|
|
105
|
+
' (carry-forward status, prior-turn JSON bugs, re-emission rationale, or notes about what the',
|
|
106
|
+
' artifact "still contains"). The reader never needs to know that information was carried forward.',
|
|
107
|
+
'',
|
|
108
|
+
'2. When a diagram adds value to the plan (e.g. architecture, component relationships, dependency flows),',
|
|
109
|
+
' include a fenced `mermaid` block. Use `flowchart TD` (top-down) for hierarchical or architectural',
|
|
110
|
+
' diagrams — it reads better in a narrow artifact panel. Use `flowchart LR` (left-to-right) for timelines',
|
|
111
|
+
' or sequential flows where horizontal layout is genuinely clearer. For simple plans where a diagram would',
|
|
112
|
+
' be forced or unhelpful, skip it entirely.',
|
|
113
|
+
'',
|
|
114
|
+
'3. When (and only when) the plan involves a UI surface, optionally include a low-fidelity UI mockup as a',
|
|
115
|
+
' self-contained, generic, unstyled HTML wireframe inside a fenced `archon-mockup` block. Use plain',
|
|
116
|
+
' semantic HTML (headings, lists, buttons, form fields, layout via simple blocks). Do NOT mimic the',
|
|
117
|
+
' application\'s real styling, Tailwind classes, or theme — the wireframe is intentionally neutral and',
|
|
118
|
+
' will be rendered with an injected base stylesheet. Emit this block only when a UI surface is genuinely',
|
|
119
|
+
' part of the plan; never force it for backend-only or non-UI work. Skip it entirely when not applicable.',
|
|
120
|
+
'',
|
|
121
|
+
'4. A machine-readable artifact block with the spec structured data, using exactly these markers:',
|
|
122
|
+
' <archon-spec-artifact>',
|
|
123
|
+
' {"summary":"short plan summary","likely_files":[{"path":"src/foo.ts","reason":"Add bar helper"}],"tickets":[{"key":"add-foo-bar","title":"Add bar helper to foo module","description":"## Problem Statement\\nThe foo module is missing the `bar` helper, blocking downstream consumers from validating inputs consistently.\\n\\n## Acceptance Criteria\\n- [ ] A `bar(input)` function is exported from `src/foo.ts`.\\n- [ ] Invalid inputs throw a typed error with a clear message.\\n- [ ] All existing callers of foo continue to work unchanged.\\n\\n## Implementation Approach\\n1. Add `bar` to `src/foo.ts` following the existing `baz` helper signature pattern.\\n2. Reuse the project existing validation utilities instead of inlining checks.\\n3. Export `bar` from the module barrel file.\\n\\n## Edge Cases and Error Handling\\n- Empty string inputs should throw the same typed error as other invalid inputs.\\n- Preserve current behavior for `undefined`/`null` (do not coerce).\\n\\n## Constraints and Things to Avoid\\n- Do not introduce a new dependency.\\n- Do not change the public signature of existing exports."}]}',
|
|
124
|
+
' </archon-spec-artifact>',
|
|
125
|
+
'',
|
|
126
|
+
'The artifact represents the complete current state of the spec. On follow-up turns, re-emit every field',
|
|
127
|
+
'that is still part of the plan at its current best form — even fields this turn does not change.',
|
|
128
|
+
'',
|
|
129
|
+
'Fields:',
|
|
130
|
+
'- `summary` (required) — concise 1-3 sentence summary of the WHOLE plan as it now stands. Never describe',
|
|
131
|
+
' what this turn did, what was emitted, or what changed; the summary describes the plan itself.',
|
|
132
|
+
'- `assumptions` — array of assumptions that affect the plan.',
|
|
133
|
+
'- `open_questions` — array of unresolved questions needing clarification.',
|
|
134
|
+
'- `likely_files` — array of {"path": "...", "reason": "..."} objects for files you expect to create or',
|
|
135
|
+
' modify. If your human-readable text includes a table of files to change, include the same files here.',
|
|
136
|
+
' The `reason` should describe what change is needed, not just repeat the path.',
|
|
137
|
+
'- `tickets` (required) — proposed board tickets with stable kebab-case keys (always at least one).',
|
|
138
|
+
' Each ticket will later be implemented by a separate build agent that has no access to this planning',
|
|
139
|
+
' conversation, so every ticket `description` must be self-contained and implementation-ready.',
|
|
140
|
+
IMPLEMENTATION_READY_DESCRIPTION_SECTION_TEMPLATE.split('\n').map(line => ` ${line}`).join('\n'),
|
|
141
|
+
'The description must include:',
|
|
142
|
+
IMPLEMENTATION_READY_DESCRIPTION_REQUIREMENTS.split('\n').map(line => ` ${line}`).join('\n'),
|
|
143
|
+
' Additional detail requirements:',
|
|
144
|
+
IMPLEMENTATION_DETAIL_RULES.split('\n').map(line => ` ${line}`).join('\n'),
|
|
145
|
+
' Section de-duplication:',
|
|
146
|
+
IMPLEMENTATION_BODY_DEDUPLICATION_RULES.split('\n').map(line => ` ${line}`).join('\n'),
|
|
147
|
+
' Diagrams and UI mockups live at the spec level, never inside a ticket description.',
|
|
148
|
+
' Emit `mermaid` and `archon-mockup` blocks only as top-level fenced blocks in the planning text.',
|
|
149
|
+
' Ticket descriptions must be pure text — never embed fenced `mermaid` or `archon-mockup` blocks inside them.',
|
|
150
|
+
'- `dependencies` — array of direct dependencies between proposed tickets.',
|
|
151
|
+
'',
|
|
152
|
+
'For the optional array fields (assumptions, open_questions, likely_files, dependencies):',
|
|
153
|
+
'- OMIT a field to leave it unchanged from the prior snapshot — it is carried forward automatically.',
|
|
154
|
+
'- Emit an array to set the field to that exact value this turn. Emit `[]` ONLY to intentionally clear it.',
|
|
155
|
+
'- When the plan changes a field, re-emit it with the updated contents. Do not silently drop entries that',
|
|
156
|
+
' are still part of the plan.',
|
|
157
|
+
'',
|
|
158
|
+
'Do NOT include a `mermaid` field in the artifact JSON — the mermaid diagram is extracted',
|
|
159
|
+
'automatically from the fenced code block above.',
|
|
160
|
+
'Do NOT include the UI mockup in the artifact JSON — the `archon-mockup` block is extracted',
|
|
161
|
+
'automatically from its fenced code block above when present.',
|
|
162
|
+
'',
|
|
163
|
+
'Rules:',
|
|
164
|
+
'- The JSON must be valid and must not be wrapped in code fences.',
|
|
165
|
+
'- Escape all newlines inside string values as \\n (literal newlines break JSON parsing).',
|
|
166
|
+
'- Re-emit every field that is still part of the plan on every turn; omitted optional array fields are',
|
|
167
|
+
' carried forward, not cleared.',
|
|
168
|
+
'- Always include at least one ticket. If the plan has natural phases, propose multiple tickets with dependencies.',
|
|
169
|
+
'- If the artifact block is missing or malformed, no specification snapshot will be saved.',
|
|
170
|
+
].join('\n'),
|
|
171
|
+
(existingMermaid || existingMockup)
|
|
172
|
+
? [
|
|
173
|
+
'A `mermaid` diagram and/or `archon-mockup` UI wireframe has already been established for this spec',
|
|
174
|
+
'in a prior turn and is preserved automatically across turns. Do NOT regenerate either fenced block',
|
|
175
|
+
'unless this turn materially changes the architecture or UI it depicts — re-emitting unchanged content',
|
|
176
|
+
'wastes tokens. Omit the `mermaid` and/or `archon-mockup` blocks on this turn when they would be',
|
|
177
|
+
'unchanged; they will be carried forward from the previous snapshot automatically.',
|
|
178
|
+
].join('\n')
|
|
179
|
+
: '',
|
|
180
|
+
getProjectMemorySuggestionPromptRules(memoryEnabled),
|
|
181
|
+
]
|
|
182
|
+
.filter(Boolean)
|
|
183
|
+
.join('\n\n');
|
|
184
|
+
};
|
|
185
|
+
const emitUpdatedSpecSession = (specSessionId, io) => {
|
|
186
|
+
const specSession = getSpecSession(specSessionId, { includeMessages: true });
|
|
187
|
+
if (specSession) {
|
|
188
|
+
io.emit('spec-session:updated', specSession);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
export const startSpecSessionTurn = ({ specSessionId, instruction, attachments = [], tool, model, variant, skills = [], io, }) => {
|
|
192
|
+
const specSession = getSpecSession(specSessionId, { includeMessages: true });
|
|
193
|
+
if (!specSession) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
const project = getProjectById(specSession.project_id);
|
|
197
|
+
if (!project) {
|
|
198
|
+
updateSpecSessionStatus(specSessionId, 'error', 'Spec project no longer exists', null);
|
|
199
|
+
emitUpdatedSpecSession(specSessionId, io);
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
const trimmedInstruction = instruction.trim();
|
|
203
|
+
if (!trimmedInstruction && attachments.length === 0) {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
const jobKey = resolveSpecWorkerKey(specSessionId);
|
|
207
|
+
if (specSession.agent_status === 'running' || isRunning(jobKey)) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
const userMessageId = createSpecMessage({
|
|
211
|
+
specSessionId,
|
|
212
|
+
role: 'user',
|
|
213
|
+
kind: 'prompt',
|
|
214
|
+
content: trimmedInstruction,
|
|
215
|
+
});
|
|
216
|
+
if (attachments.length > 0) {
|
|
217
|
+
linkSpecAttachmentsToMessage({
|
|
218
|
+
specMessageId: userMessageId,
|
|
219
|
+
attachments,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
const resolvedTool = tool;
|
|
223
|
+
const resolvedModel = resolvedTool === 'opencode' ? normalizeModelId(model) || null : null;
|
|
224
|
+
const resolvedVariant = resolvedTool === 'opencode' && resolvedModel ? variant ?? null : null;
|
|
225
|
+
const resolvedSkills = skills;
|
|
226
|
+
updateSpecSessionRunConfig({
|
|
227
|
+
specSessionId,
|
|
228
|
+
tool: resolvedTool,
|
|
229
|
+
model: resolvedModel,
|
|
230
|
+
variant: resolvedVariant,
|
|
231
|
+
skills: resolvedSkills,
|
|
232
|
+
});
|
|
233
|
+
if (resolvedTool !== 'opencode' && specSession.title === getDefaultSpecSessionTitle()) {
|
|
234
|
+
updateSpecSessionTitle(specSessionId, deriveSpecSessionTitle(trimmedInstruction));
|
|
235
|
+
}
|
|
236
|
+
beginSpecSessionThinkingRun(specSessionId);
|
|
237
|
+
updateSpecSessionStatus(specSessionId, 'running', null, null);
|
|
238
|
+
emitUpdatedSpecSession(specSessionId, io);
|
|
239
|
+
enqueue(jobKey, async () => {
|
|
240
|
+
let stagedAgentAttachmentsDirectoryPath = null;
|
|
241
|
+
try {
|
|
242
|
+
const latestSession = getSpecSession(specSessionId);
|
|
243
|
+
if (!latestSession) {
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
// The prior snapshot (if any) is read once and reused both to guide the
|
|
247
|
+
// prompt (don't redraw established artifacts) and to carry its mermaid/
|
|
248
|
+
// mockup forward when the current turn omits them. No new snapshot is
|
|
249
|
+
// created mid-run, so this reference stays valid through the done path.
|
|
250
|
+
const previousSnapshot = latestSession.latest_snapshot_id
|
|
251
|
+
? getSpecSnapshot(latestSession.latest_snapshot_id)
|
|
252
|
+
: null;
|
|
253
|
+
const promptContext = latestSession.title === getDefaultSpecSessionTitle()
|
|
254
|
+
? null
|
|
255
|
+
: latestSession.title;
|
|
256
|
+
const projectMemory = getProjectMemoryPromptBlock(project.id, {
|
|
257
|
+
stage: 'plan',
|
|
258
|
+
title: trimmedInstruction || 'Attached images only',
|
|
259
|
+
description: promptContext,
|
|
260
|
+
});
|
|
261
|
+
const cwd = project.repo_path;
|
|
262
|
+
const stagedAgentAttachments = resolvedTool === 'opencode'
|
|
263
|
+
? stageSpecAttachmentsForAgent({
|
|
264
|
+
specSessionId,
|
|
265
|
+
cwd,
|
|
266
|
+
attachments,
|
|
267
|
+
})
|
|
268
|
+
: { directoryPath: null, files: [] };
|
|
269
|
+
stagedAgentAttachmentsDirectoryPath = stagedAgentAttachments.directoryPath;
|
|
270
|
+
const specRunResult = await runSpecAgent({
|
|
271
|
+
specSessionId,
|
|
272
|
+
tool: resolvedTool,
|
|
273
|
+
prompt: buildSpecPrompt({
|
|
274
|
+
projectName: project.name,
|
|
275
|
+
projectPath: cwd,
|
|
276
|
+
instruction: trimmedInstruction,
|
|
277
|
+
hasAttachments: attachments.length > 0,
|
|
278
|
+
projectMemory,
|
|
279
|
+
memoryEnabled: Boolean(project.memory_enabled),
|
|
280
|
+
previousSnapshot,
|
|
281
|
+
}),
|
|
282
|
+
cwd,
|
|
283
|
+
files: stagedAgentAttachments.files,
|
|
284
|
+
io,
|
|
285
|
+
model: resolvedModel,
|
|
286
|
+
variant: resolvedVariant,
|
|
287
|
+
resumeSessionId: resolvedTool === 'claude'
|
|
288
|
+
? latestSession.claude_session_id
|
|
289
|
+
: latestSession.opencode_session_id,
|
|
290
|
+
});
|
|
291
|
+
if (specRunResult.completionStatus === 'stopped') {
|
|
292
|
+
const interruptedSession = getSpecSession(specSessionId);
|
|
293
|
+
const interruptedResponse = interruptedSession?.streaming_response?.trim()
|
|
294
|
+
|| specRunResult.finalResponse?.trim()
|
|
295
|
+
|| '';
|
|
296
|
+
if (resolvedTool === 'opencode' && interruptedSession?.title === getDefaultSpecSessionTitle()) {
|
|
297
|
+
updateSpecSessionTitle(specSessionId, deriveSpecSessionTitle(trimmedInstruction));
|
|
298
|
+
}
|
|
299
|
+
if (interruptedResponse) {
|
|
300
|
+
const messageId = createSpecMessage({
|
|
301
|
+
specSessionId,
|
|
302
|
+
role: 'assistant',
|
|
303
|
+
kind: 'final_response',
|
|
304
|
+
content: interruptedResponse,
|
|
305
|
+
});
|
|
306
|
+
if (messageId) {
|
|
307
|
+
bindSpecSessionThinkingMessage(specSessionId, messageId);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
updateSpecSessionUsageSnapshot(specSessionId, specRunResult.usageSnapshot);
|
|
311
|
+
updateSpecSessionStatus(specSessionId, 'stopped', interruptedSession?.agent_log ?? null, null);
|
|
312
|
+
emitUpdatedSpecSession(specSessionId, io);
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
// Done path: process the completed response.
|
|
316
|
+
const latestCompletedSession = getSpecSession(specSessionId);
|
|
317
|
+
const streamedAssistantMessage = latestCompletedSession?.streaming_response?.trim() ?? '';
|
|
318
|
+
const rawResponse = typeof specRunResult.finalResponse === 'string'
|
|
319
|
+
? specRunResult.finalResponse
|
|
320
|
+
: '';
|
|
321
|
+
const artifactResult = rawResponse
|
|
322
|
+
? extractSpecArtifactFromOutput(rawResponse)
|
|
323
|
+
: { cleanedOutput: '', artifact: null, error: null };
|
|
324
|
+
const parsedResponse = extractProjectMemorySuggestionsFromOutput(artifactResult.cleanedOutput);
|
|
325
|
+
const cleanedPlanText = stripMermaidBlocks(parsedResponse.cleanedOutput).trim()
|
|
326
|
+
|| stripMermaidBlocks(streamedAssistantMessage).trim();
|
|
327
|
+
let assistantMessage = cleanedPlanText
|
|
328
|
+
|| (attachments.length > 0 ? ATTACHMENT_ONLY_EMPTY_RESPONSE_FALLBACK : '');
|
|
329
|
+
// Create snapshot from artifact if present. Presence is populated
|
|
330
|
+
// alongside artifact by the extractor, so the two are non-null together.
|
|
331
|
+
if (artifactResult.artifact && artifactResult.presence) {
|
|
332
|
+
// A block re-emitted this turn overrides the previous snapshot's value;
|
|
333
|
+
// an omitted block is carried forward so established artifacts don't
|
|
334
|
+
// disappear when a follow-up turn omits the diagram/mockup.
|
|
335
|
+
const { mermaid: mermaidBlock, mockup: mockupBlock } = resolveCarriedForwardArtifacts({
|
|
336
|
+
rawResponse,
|
|
337
|
+
previousMermaid: previousSnapshot?.mermaid ?? null,
|
|
338
|
+
previousMockup: previousSnapshot?.mockup ?? null,
|
|
339
|
+
});
|
|
340
|
+
// Optional structured array fields use the same carry-forward contract:
|
|
341
|
+
// a field the LLM emitted this turn (including an explicit empty array)
|
|
342
|
+
// overrides the prior snapshot; a field the LLM omitted is carried
|
|
343
|
+
// forward unchanged so follow-up turns never silently drop information.
|
|
344
|
+
const carriedFields = resolveCarriedForwardStructuredFields({
|
|
345
|
+
artifact: artifactResult.artifact,
|
|
346
|
+
presence: artifactResult.presence,
|
|
347
|
+
previous: previousSnapshot
|
|
348
|
+
? {
|
|
349
|
+
assumptions: previousSnapshot.assumptions,
|
|
350
|
+
openQuestions: previousSnapshot.open_questions,
|
|
351
|
+
likelyFiles: previousSnapshot.likely_files,
|
|
352
|
+
dependencies: previousSnapshot.dependencies,
|
|
353
|
+
}
|
|
354
|
+
: null,
|
|
355
|
+
});
|
|
356
|
+
const snapshotId = createSpecSnapshot({
|
|
357
|
+
specSessionId,
|
|
358
|
+
summary: artifactResult.artifact.summary,
|
|
359
|
+
assumptions: carriedFields.assumptions,
|
|
360
|
+
openQuestions: carriedFields.openQuestions,
|
|
361
|
+
likelyFiles: carriedFields.likelyFiles,
|
|
362
|
+
tickets: artifactResult.artifact.tickets,
|
|
363
|
+
dependencies: carriedFields.dependencies,
|
|
364
|
+
mermaid: mermaidBlock,
|
|
365
|
+
mockup: mockupBlock,
|
|
366
|
+
planText: cleanedPlanText,
|
|
367
|
+
});
|
|
368
|
+
updateSpecSessionLatestSnapshot(specSessionId, snapshotId);
|
|
369
|
+
}
|
|
370
|
+
// Append artifact error note to the visible message if extraction failed.
|
|
371
|
+
if (artifactResult.error && assistantMessage) {
|
|
372
|
+
assistantMessage += `\n\n[Note: ${artifactResult.error}. No specification snapshot was saved. You can try refining the spec or asking the planner to regenerate the artifact.]`;
|
|
373
|
+
}
|
|
374
|
+
if (assistantMessage) {
|
|
375
|
+
const messageId = createSpecMessage({
|
|
376
|
+
specSessionId,
|
|
377
|
+
role: 'assistant',
|
|
378
|
+
kind: 'final_response',
|
|
379
|
+
content: assistantMessage,
|
|
380
|
+
});
|
|
381
|
+
if (messageId) {
|
|
382
|
+
bindSpecSessionThinkingMessage(specSessionId, messageId);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
if (resolvedTool === 'opencode' && latestCompletedSession?.title === getDefaultSpecSessionTitle()) {
|
|
386
|
+
updateSpecSessionTitle(specSessionId, deriveSpecSessionTitle(trimmedInstruction));
|
|
387
|
+
}
|
|
388
|
+
updateSpecSessionUsageSnapshot(specSessionId, specRunResult.usageSnapshot);
|
|
389
|
+
updateSpecSessionStatus(specSessionId, 'done', getSpecSession(specSessionId)?.agent_log ?? null, null);
|
|
390
|
+
emitUpdatedSpecSession(specSessionId, io);
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
const latestSession = getSpecSession(specSessionId);
|
|
394
|
+
if (resolvedTool === 'opencode' && latestSession?.title === getDefaultSpecSessionTitle()) {
|
|
395
|
+
updateSpecSessionTitle(specSessionId, deriveSpecSessionTitle(trimmedInstruction));
|
|
396
|
+
}
|
|
397
|
+
const errorContent = formatAgentErrorForTranscript(error);
|
|
398
|
+
if (errorContent) {
|
|
399
|
+
createSpecMessage({
|
|
400
|
+
specSessionId,
|
|
401
|
+
role: 'assistant',
|
|
402
|
+
kind: 'error',
|
|
403
|
+
content: errorContent,
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
updateSpecSessionStatus(specSessionId, 'error', getErrorMessage(error), null);
|
|
407
|
+
emitUpdatedSpecSession(specSessionId, io);
|
|
408
|
+
}
|
|
409
|
+
finally {
|
|
410
|
+
deleteStagedSpecAttachments(stagedAgentAttachmentsDirectoryPath);
|
|
411
|
+
}
|
|
412
|
+
}).catch(error => {
|
|
413
|
+
updateSpecSessionStatus(specSessionId, 'error', getErrorMessage(error), null);
|
|
414
|
+
emitUpdatedSpecSession(specSessionId, io);
|
|
415
|
+
});
|
|
416
|
+
return true;
|
|
417
|
+
};
|
|
418
|
+
//# sourceMappingURL=specSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specSession.js","sourceRoot":"","sources":["../../../server/workers/specSession.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./rolldown-runtime-BYbx6iT9.js";import{Bt as t,Ft as n,Kt as r,Mt as i,Pt as a,Vt as o,a as s,c,h as l,i as u,l as d,m as f,n as p,o as m,r as ee,s as te,t as h,u as g,yt as ne}from"./dropdown-menu-BULYW006.js";import{a as _,c as v,d as y,f as b,h as x,i as S,l as C,m as re,n as w,o as T,p as E,r as D,s as ie,t as O,u as ae}from"./index-DGoXllNX.js";var k=e(r(),1),oe=(e,t)=>o(n(`/projects/${e}/test-sessions`),{method:`POST`,body:t,fallbackErrorMessage:`Unable to open the test runner right now.`}),se=(e,t)=>o(n(`/tickets/${e}/test-sessions${t?`?project_id=${encodeURIComponent(t)}`:``}`),{method:`POST`,fallbackErrorMessage:`Unable to open the test runner right now.`}),ce=(e,t={})=>o(n(`/test-sessions/${e}/discovery${t.commandId?`?command_id=${encodeURIComponent(t.commandId)}`:``}`),{signal:t.signal,fallbackErrorMessage:`Unable to discover tests right now.`}),le=(e,t)=>o(n(`/test-sessions/${e}/run`),{method:`POST`,body:t,fallbackErrorMessage:`Unable to start the selected tests right now.`}),ue=e=>o(n(`/test-sessions/${e}/stop`),{method:`POST`,fallbackErrorMessage:`Unable to stop the test run right now.`}),A=e=>t(n(`/test-sessions/${e}`),{method:`DELETE`,fallbackErrorMessage:`Unable to close the test runner right now.`}),j=i(),M=256*1024,N=24,P=RegExp(`\x1B\\[[0-9;?]*[ -/]*[@-~]`,`g`),F=(e,t)=>m.t(`common:testsDialog.${e}`,t),de=(e,t)=>{let n=`${e}${t}`;return n.length<=M?n:n.slice(-M)},I=e=>e.replace(P,``),fe=e=>e.scrollHeight-e.scrollTop-e.clientHeight<=N,L=e=>{e.scrollTop=e.scrollHeight},pe=(e,t=!1)=>{L(e);let n=0,r=0;return n=window.requestAnimationFrame(()=>{L(e),t&&(r=window.requestAnimationFrame(()=>{L(e)}))}),()=>{window.cancelAnimationFrame(n),r!==0&&window.cancelAnimationFrame(r)}},me=e=>{if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.flatMap(e=>{if(!e||typeof e!=`object`||Array.isArray(e))return[];let t=e;if(typeof t.id!=`string`||typeof t.name!=`string`||typeof t.command!=`string`)return[];let n=t.runner===`vitest`||t.runner===`jest`||t.runner===`unknown`?t.runner:`auto`;return[{id:t.id,name:t.name,command:t.command,runner:n,...typeof t.cwd==`string`&&t.cwd.trim()!==``?{cwd:t.cwd}:{}}]}):[]}catch{return[]}},R=e=>e===`running`?`border-sky-400/40 bg-sky-500/10 text-sky-200`:e===`passed`?`border-emerald-400/40 bg-emerald-500/10 text-emerald-200`:e===`failed`||e===`error`?`border-rose-400/40 bg-rose-500/10 text-rose-200`:e===`stopped`?`border-amber-400/40 bg-amber-500/10 text-amber-200`:`border-border/70 bg-background/60 text-muted-foreground`,he=e=>e==null?null:e<1e3?`${e} ms`:`${(e/1e3).toFixed(e>=1e4?0:1)} s`,z=e=>{let t=e.split(`/`);return t[t.length-1]||e},B=e=>e.toLowerCase().trim().split(/\s+/).filter(Boolean),V=(e,t)=>e.length===0?!0:e.every(e=>t.some(t=>t.includes(e))),H=(e,t)=>{let n=B(t);return n.length===0?e:e.flatMap(e=>{let t=z(e.path);if(V(n,[t.toLowerCase(),e.path.toLowerCase()]))return[e];let r=e.cases.filter(r=>V(n,[t.toLowerCase(),e.path.toLowerCase(),r.name.toLowerCase()]));return r.length===0?[]:[{...e,cases:r}]})},U=e=>F(e===`passed`?`status.passed`:e===`failed`?`status.failed`:e===`running`?`status.running`:e===`error`?`status.error`:e===`stopped`?`status.stopped`:`status.idle`),ge=e=>e?.selection?e.selection.kind===`all`?F(`selection.allTests`):e.selection.kind===`case`?e.selection.name:z(e.selection.path):F(`selection.noRunYet`),W=e=>/(^|\s)(?:FAIL|✗)(\s|$)|\b(?:failed|error|stderr|Expected:|Received:)\b/i.test(e)?`failure`:/(^|\s)(?:PASS|✓)(\s|$)|\bpassed\b/i.test(e)?`success`:/\b(?:WARN|warning|skipped|todo|pending)\b/i.test(e)?`warning`:`default`,G=e=>e===`failure`?`text-rose-200`:e===`success`?`text-emerald-200`:e===`warning`?`text-amber-200`:`text-slate-200`,_e=(e,t)=>e===t?!0:e.length===t.length?e.every((e,n)=>{let r=t[n];return r!=null&&e.id===r.id&&e.name===r.name&&e.command===r.command&&e.cwd===r.cwd&&e.runner===r.runner}):!1,ve=`min-w-24 justify-center shadow-none transition-none disabled:opacity-100`,K=({line:e,tone:t})=>(0,j.jsx)(`div`,{"data-tone":t,className:l(`whitespace-pre-wrap break-words`,G(t)),children:e===``?` `:e}),q=(0,k.memo)(({canRunGranular:e,filePath:t,isActive:n,name:r,onRunCase:i})=>(0,j.jsxs)(`button`,{type:`button`,"aria-label":F(`caseRow.runAriaLabel`,{name:r}),title:r,className:l(`flex w-full min-w-0 items-center gap-2.5 rounded-xl px-2.5 py-1.5 text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/50`,e?`cursor-pointer hover:bg-sky-500/10`:`cursor-not-allowed opacity-60`,n&&`bg-sky-500/10`),disabled:!e,onClick:()=>{i(t,r)},children:[(0,j.jsx)(`span`,{className:`h-2 w-2 shrink-0 rounded-full bg-sky-300/80`}),(0,j.jsx)(`span`,{className:`truncate text-xs text-foreground`,children:r})]}));q.displayName=`TestCaseRow`;var J=(0,k.memo)(({activeSelectionKind:e,activeSelectionName:t,activeSelectionPath:n,canRunGranular:r,file:i,isExpanded:a,onRunCase:o,onRunFile:s,onToggleFile:c})=>{let u=e===`file`&&n===i.path,p=e===`case`&&n===i.path;return(0,j.jsx)(D,{open:a,onOpenChange:e=>{c(i.path,e)},children:(0,j.jsxs)(`div`,{className:`space-y-1`,children:[(0,j.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,j.jsx)(_,{asChild:!0,children:(0,j.jsx)(f,{type:`button`,variant:`ghost`,size:`icon-xs`,"aria-label":F(a?`fileRow.collapseAriaLabel`:`fileRow.expandAriaLabel`,{path:i.path}),className:`mt-1 shrink-0 text-muted-foreground hover:text-foreground`,children:(0,j.jsx)(d,{className:l(`h-4 w-4 transition-transform`,a&&`rotate-180`)})})}),(0,j.jsx)(`button`,{type:`button`,"aria-label":F(`fileRow.runAriaLabel`,{path:i.path}),className:l(`min-w-0 flex-1 rounded-xl border border-border/60 bg-background/20 px-2.5 py-2 text-left transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring/50`,r?`cursor-pointer hover:border-sky-400/35 hover:bg-sky-500/10`:`cursor-not-allowed opacity-60`,(u||p)&&`border-sky-400/45 bg-sky-500/10`),disabled:!r,onClick:()=>{s(i.path)},children:(0,j.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2.5`,children:[(0,j.jsx)(`span`,{className:`flex size-6 shrink-0 items-center justify-center rounded-md border border-border/70 bg-background/60 text-sky-200`,children:(0,j.jsx)(w,{className:`h-3.5 w-3.5`})}),(0,j.jsxs)(`span`,{className:`flex min-w-0 flex-1 items-start justify-between gap-3`,children:[(0,j.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,j.jsx)(`span`,{className:`block truncate text-xs font-medium text-foreground`,children:z(i.path)}),(0,j.jsx)(`span`,{className:`mt-0.5 block truncate text-[11px] text-muted-foreground`,children:i.path})]}),(0,j.jsx)(`span`,{className:`shrink-0 text-[11px] text-muted-foreground`,children:F(`fileRow.testCount`,{count:i.cases.length})})]})]})})]}),(0,j.jsx)(S,{children:(0,j.jsx)(`div`,{className:`ml-4 border-l border-border/60 pl-6`,children:i.cases.length===0?(0,j.jsx)(`p`,{className:`px-2.5 py-1.5 text-xs text-muted-foreground`,children:F(`fileRow.noNamedTests`)}):(0,j.jsx)(`div`,{className:`space-y-1`,children:i.cases.map(a=>{let s=e===`case`&&n===i.path&&t===a.name;return(0,j.jsx)(q,{canRunGranular:r,filePath:i.path,isActive:s,name:a.name,onRunCase:o},a.id)})})})})]})})});J.displayName=`DiscoveryFileRow`;var ye=(0,k.memo)(({activeSelectionKind:e,activeSelectionName:t,activeSelectionPath:n,availableCommands:r,canRunGranular:i,discovery:a,expandedFiles:o,fullSuiteOnlyNotice:s,isLoading:m,selectedCommandId:ne,selectedCommandName:_,sessionError:v,sessionStatus:y,shouldShowCommandSelector:b,onRunCase:x,onRunFile:S,onSelectCommand:C,onToggleFile:re})=>{let[w,T]=(0,k.useState)(``),E=(0,k.useMemo)(()=>H(a,w),[a,w]),D=(0,k.useMemo)(()=>E.reduce((e,t)=>e+t.cases.length,0),[E]),ie=B(w).length>0;return(0,j.jsx)(`aside`,{className:`min-h-0 border-b border-border/70 px-4 py-4 lg:border-r lg:border-b-0`,children:(0,j.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-3`,children:[b&&(0,j.jsxs)(`div`,{className:`space-y-2`,children:[(0,j.jsx)(`p`,{className:`text-xs uppercase tracking-[0.22em] text-muted-foreground`,children:F(`scope.label`)}),(0,j.jsxs)(h,{children:[(0,j.jsx)(u,{asChild:!0,children:(0,j.jsxs)(f,{type:`button`,variant:`outline`,className:`w-full justify-between rounded-xl border-border/70 bg-background/60`,"aria-label":F(`scope.selectedCommandAriaLabel`),disabled:r.length===0||y===`running`,children:[(0,j.jsx)(`span`,{className:`truncate`,children:_??F(`scope.selectTestScope`)}),(0,j.jsx)(d,{className:`h-4 w-4 text-muted-foreground`})]})}),(0,j.jsx)(p,{align:`start`,className:`w-72`,children:r.map(e=>(0,j.jsx)(ee,{className:l(ne===e.id&&`bg-accent text-accent-foreground`),onSelect:()=>{C(e.id)},children:(0,j.jsx)(`span`,{className:`truncate`,children:e.name})},e.id))})]})]}),s&&(0,j.jsx)(`div`,{className:`rounded-2xl border border-border/70 bg-background/30 px-4 py-3 text-sm text-muted-foreground`,children:s}),(a.length>0||w.length>0)&&(0,j.jsxs)(`div`,{className:`relative mt-1 shrink-0`,children:[(0,j.jsx)(g,{type:`search`,value:w,onChange:e=>{T(e.target.value)},placeholder:F(`filter.placeholder`),"aria-label":F(`filter.ariaLabel`),className:`pr-10`}),w.length>0&&(0,j.jsx)(f,{type:`button`,variant:`ghost`,size:`icon-sm`,"aria-label":F(`filter.clearAriaLabel`),className:`absolute right-1 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground`,onClick:()=>{T(``)},children:(0,j.jsx)(te,{className:`size-4`})})]}),!r.length&&(0,j.jsx)(`div`,{className:`rounded-2xl border border-dashed border-border/70 bg-background/20 px-4 py-4 text-sm text-muted-foreground`,children:F(`discovery.noCommands`)}),v&&(0,j.jsx)(`div`,{className:`rounded-2xl border border-rose-500/30 bg-rose-500/10 px-4 py-3 text-sm text-rose-200`,children:v}),(0,j.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-3 overflow-hidden rounded-2xl border border-border/70 bg-background/20 p-4`,children:[(0,j.jsxs)(`div`,{className:`shrink-0 flex items-start justify-between gap-3`,children:[(0,j.jsx)(`div`,{className:`min-w-0`,children:(0,j.jsxs)(`p`,{className:`text-sm text-muted-foreground`,children:[F(`discovery.fileCount`,{count:E.length}),`, `,F(`discovery.caseCount`,{count:D})]})}),m&&(0,j.jsx)(c,{className:`h-4 w-4 animate-spin text-muted-foreground`})]}),(0,j.jsx)(`div`,{className:`min-h-0 flex-1 space-y-2 overflow-y-auto pr-1`,children:a.length===0&&!m?(0,j.jsx)(`div`,{className:`rounded-2xl border border-dashed border-border/70 bg-background/20 px-4 py-5 text-sm text-muted-foreground`,children:F(`discovery.noFilesDetected`)}):E.length===0?(0,j.jsx)(`div`,{className:`rounded-2xl border border-dashed border-border/70 bg-background/20 px-4 py-5 text-sm text-muted-foreground`,children:F(`discovery.noFilterMatches`)}):E.map(r=>(0,j.jsx)(J,{activeSelectionKind:e,activeSelectionName:t,activeSelectionPath:n,canRunGranular:i,file:r,isExpanded:ie||(o[r.path]??!1),onRunCase:x,onRunFile:S,onToggleFile:re},r.path))})]})]})})});ye.displayName=`DiscoveryPane`;var be=(0,k.memo)(({durationMs:e,output:t,outputTruncated:n,selectionLabel:r,status:i,summaryCounts:a,viewportRef:o,onScroll:c})=>{let u=(0,k.useMemo)(()=>t?I(t).replaceAll(`\r
|
|
2
|
-
`,`
|
|
3
|
-
`).replaceAll(`\r`,`
|
|
4
|
-
`).split(`
|
|
5
|
-
`).map(e=>({line:e,tone:W(e)})):[],[t]);return(0,j.jsx)(`section`,{className:`min-h-0 px-4 py-4`,children:(0,j.jsxs)(`div`,{className:`flex h-full flex-col gap-3`,children:[(0,j.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 text-sm`,children:[(0,j.jsx)(`span`,{className:`font-medium text-foreground`,children:r}),i&&(0,j.jsx)(s,{variant:`outline`,className:l(`px-3 py-1 text-xs uppercase tracking-[0.2em]`,R(i)),children:U(i)}),a&&(0,j.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2 text-xs font-medium uppercase tracking-[0.18em]`,children:[(0,j.jsxs)(`span`,{className:`text-rose-200`,children:[a.failed.count,` `,a.failed.label]}),(0,j.jsxs)(`span`,{className:`text-emerald-200`,children:[a.passed.count,` `,a.passed.label]})]}),e!=null&&(0,j.jsx)(`span`,{className:`text-muted-foreground`,children:he(e)}),n&&(0,j.jsx)(s,{variant:`outline`,className:`border-amber-400/30 bg-amber-500/10 text-amber-200`,children:F(`output.trimmed`)})]}),(0,j.jsx)(`div`,{className:`min-h-0 flex-1 overflow-hidden rounded-2xl border border-border/70 bg-[#0d1017]`,children:(0,j.jsx)(`div`,{ref:o,"aria-label":F(`output.ariaLabel`),className:`h-full overflow-auto px-4 py-4`,onScroll:c,children:(0,j.jsx)(`div`,{className:`font-mono text-xs leading-5`,children:u.length>0?u.map((e,t)=>(0,j.jsx)(K,{line:e.line,tone:e.tone},`${t}:${e.line}`)):(0,j.jsx)(`div`,{className:`text-slate-200`,children:F(`output.empty`)})})})})]})})});be.displayName=`OutputPane`;var xe=({testCommands:e,onClose:t,...n})=>{let r=n.scope,i=n.projectId,o=n.scope===`ticket`?n.ticketId:null,s=n.scope===`project`?n.targetKind:null,c=n.scope===`project`?n.targetBundleId:null,[l,u]=(0,k.useState)(e),[d,p]=(0,k.useState)(null),[m,ee]=(0,k.useState)([]),[h,g]=(0,k.useState)(``),[_,S]=(0,k.useState)({}),[w,D]=(0,k.useState)(!0),[M,N]=(0,k.useState)(!1),[P,I]=(0,k.useState)(!1),[L,R]=(0,k.useState)(null),[he,z]=(0,k.useState)(!1),[B,V]=(0,k.useState)(!1),H=(0,k.useRef)(null),U=(0,k.useRef)(!1),W=(0,k.useRef)(null),G=(0,k.useRef)(!0),K=(0,k.useRef)(null),q=(0,k.useRef)(null),J=d?.selection?.kind??null,xe=d?.selection?.kind===`all`?null:d?.selection?.path??null,Se=d?.selection?.kind===`case`?d.selection.name:null,Y=d?.id??null,X=d?.status??null,Z=(0,k.useMemo)(()=>l.find(e=>e.id===h)??null,[l,h]),Ce=(0,k.useMemo)(()=>{if(d?.summary?.failed_count==null&&d?.summary?.passed_count==null&&d?.summary?.failed_file_count==null&&d?.summary?.passed_file_count==null)return null;let e=d?.summary?.failed_count==null&&d?.summary?.passed_count==null;return{failed:X===`failed`&&d?.summary?.failed_count==null&&d?.summary?.failed_file_count!=null||e?{count:d?.summary?.failed_file_count??0,label:F(`summaryCounts.filesFailed`)}:{count:d?.summary?.failed_count??0,label:F(`summaryCounts.failed`)},passed:e?{count:d?.summary?.passed_file_count??0,label:F(`summaryCounts.filesPassed`)}:{count:d?.summary?.passed_count??d?.summary?.passed_file_count??0,label:F(`summaryCounts.passed`)}}},[d?.summary?.failed_count,d?.summary?.passed_count,d?.summary?.failed_file_count,d?.summary?.passed_file_count,X]),we=Z?.runner===`unknown`?F(`scope.fullSuiteOnlyNotice`):null,Te=!!(Z&&d?.status!==`running`&&!M&&!P),Ee=Te,De=Te&&B,Oe=l.length>1;(0,k.useEffect)(()=>{h||l.length===0||g(l[0]?.id??``)},[l,h]),(0,k.useEffect)(()=>{e.length>0&&u(t=>_e(t,e)?t:e)},[e]),(0,k.useEffect)(()=>{if(l.length>0||!i)return;let e=new AbortController;return ne(e.signal).then(e=>{let t=e.find(e=>e.id===i);t&&u(e=>{let n=me(t.test_commands);return _e(e,n)?e:n})}).catch(()=>{}),()=>{e.abort()}},[l.length,i]),(0,k.useEffect)(()=>{let e=e=>{!e||e.id!==H.current||p(e)},t=e=>{!e||e.session_id!==H.current||p(t=>!t||t.id!==e.session_id?t:{...t,output:de(t.output,e.chunk),output_truncated:e.output_truncated})};return O.on(`test-session:updated`,e),O.on(`test-session:output`,t),()=>{O.off(`test-session:updated`,e),O.off(`test-session:output`,t)}},[]),(0,k.useEffect)(()=>{let e=W.current;if(!e){K.current=d?.output??null,q.current=d?.status??null;return}let t=K.current!==(d?.output??null),n=q.current!==`running`&&d?.status===`running`,r=q.current===`running`&&d?.status!==`running`;if(n&&(G.current=!0),n||t&&d?.status===`running`&&G.current||r&&G.current){let t=pe(e,r);return K.current=d?.output??null,q.current=d?.status??null,t}K.current=d?.output??null,q.current=d?.status??null},[d?.output,d?.status]),(0,k.useEffect)(()=>{let e=!1;return(async()=>{try{let t=r===`project`?await oe(i,{target_kind:s??`repo_root`,target_bundle_id:c??null}):await se(o??``,i);if(e)return;H.current=t.id,p(t)}catch(t){e||R(t instanceof a?t.message:F(`messages.loadRunnerError`))}finally{!e&&H.current==null&&D(!1)}})(),()=>{e=!0}},[i,r,c,s,o]),(0,k.useEffect)(()=>{if(!d?.id){V(!1);return}if(l.length>0&&!h){V(!1);return}let e=new AbortController,t=!1;return D(!0),V(!1),ce(d.id,{commandId:h||null,signal:e.signal}).then(e=>{t||(ee(e.files),V(e.supports_granular_selection))}).catch(n=>{t||e.signal.aborted||R(n instanceof a?n.message:F(`messages.discoverError`))}).finally(()=>{t||D(!1)}),()=>{t=!0,e.abort()}},[l.length,h,d?.id]),(0,k.useEffect)(()=>()=>{let e=H.current;!e||U.current||(U.current=!0,A(e).catch(()=>{}))},[]);let Q=(0,k.useCallback)(async e=>{if(!(!Y||X===`running`||!Z||M||P)){R(null),N(!0);try{p(await le(Y,{command_id:Z.id,selection:e}))}catch(e){R(e instanceof a?e.message:F(`messages.startError`))}finally{N(!1)}}},[M,P,Z,Y,X]),ke=(0,k.useCallback)(async()=>{if(!(!Y||X!==`running`||P)){R(null),I(!0);try{p(await ue(Y))}catch(e){R(e instanceof a?e.message:F(`messages.stopError`))}finally{I(!1)}}},[P,Y,X]),$=(0,k.useCallback)(()=>{let e=H.current;if(!e||U.current){t();return}U.current=!0,t(),A(e).catch(()=>{})},[t]),Ae=(0,k.useCallback)(()=>{if(X===`running`){z(!0);return}$()},[$,X]),je=(0,k.useCallback)(()=>{let e=W.current;e&&(G.current=fe(e))},[]),Me=(0,k.useCallback)(e=>{g(e)},[]),Ne=(0,k.useCallback)((e,t)=>{S(n=>(n[e]??!1)===t?n:{...n,[e]:t})},[]),Pe=(0,k.useCallback)(e=>{Q({kind:`file`,path:e})},[Q]),Fe=(0,k.useCallback)((e,t)=>{Q({kind:`case`,path:e,name:t})},[Q]);return(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(C,{open:!0,onOpenChange:e=>{e||Ae()},children:(0,j.jsxs)(y,{showCloseButton:!1,overlayClassName:`bg-black/70`,className:`flex h-[calc(100vh-2rem)] max-h-[58rem] w-full max-w-[calc(100%-1rem)] flex-col gap-0 overflow-hidden rounded-3xl border border-[#2a2a38] bg-[#16161f] p-0 shadow-2xl sm:max-w-7xl`,onInteractOutside:e=>e.preventDefault(),children:[(0,j.jsx)(x,{className:`sr-only`,children:F(`dialog.srTitle`)}),(0,j.jsx)(b,{className:`sr-only`,children:F(`dialog.srDescription`)}),(0,j.jsxs)(`div`,{className:`flex items-start justify-between gap-4 border-b border-border px-6 py-4`,children:[(0,j.jsx)(`div`,{className:`min-w-0`,children:(0,j.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,j.jsx)(`div`,{className:`flex size-10 shrink-0 items-center justify-center rounded-2xl border border-border/70 bg-background/60 text-sky-200`,children:(0,j.jsx)(v,{className:`h-5 w-5`})}),(0,j.jsxs)(`div`,{children:[(0,j.jsx)(`h2`,{className:`text-2xl font-semibold text-foreground`,children:F(`dialog.title`)}),(0,j.jsx)(`p`,{className:`mt-1 text-sm text-muted-foreground`,children:d?.target_label??F(`dialog.preparingTarget`)})]})]})}),(0,j.jsx)(ae,{asChild:!0,children:(0,j.jsx)(f,{type:`button`,"aria-label":F(`dialog.closeAriaLabel`),variant:`ghost`,size:`icon-sm`,className:`cursor-pointer text-muted-foreground hover:text-foreground`,children:(0,j.jsx)(te,{className:`h-4 w-4`})})})]}),(0,j.jsxs)(`div`,{className:`grid min-h-0 flex-1 gap-0 lg:grid-cols-[22rem_minmax(0,1fr)]`,children:[(0,j.jsx)(ye,{activeSelectionKind:J,activeSelectionName:Se,activeSelectionPath:xe,availableCommands:l,canRunGranular:De,discovery:m,expandedFiles:_,fullSuiteOnlyNotice:we,isLoading:w,selectedCommandId:h,selectedCommandName:Z?.name??null,sessionError:L,sessionStatus:X,shouldShowCommandSelector:Oe,onRunCase:Fe,onRunFile:Pe,onSelectCommand:Me,onToggleFile:Ne}),(0,j.jsx)(be,{durationMs:d?.duration_ms??null,output:d?.output??``,outputTruncated:d?.output_truncated??!1,selectionLabel:ge(d),status:X,summaryCounts:Ce,viewportRef:W,onScroll:je})]}),(0,j.jsx)(E,{className:`border-t border-border/70 px-6 py-4 sm:flex-row sm:items-center sm:justify-end`,children:(0,j.jsx)(`div`,{className:`flex items-center justify-end gap-2`,children:d?.status===`running`?(0,j.jsxs)(f,{type:`button`,variant:`destructive`,className:ve,onClick:()=>{ke()},disabled:P,children:[(0,j.jsx)(T,{className:`h-4 w-4`}),(0,j.jsx)(`span`,{children:F(`actions.stop`)})]}):(0,j.jsxs)(f,{type:`button`,variant:`success`,className:ve,disabled:!Ee,onClick:()=>{Q({kind:`all`})},children:[(0,j.jsx)(ie,{className:`h-4 w-4`}),(0,j.jsx)(`span`,{children:F(`actions.run`)})]})})})]})}),(0,j.jsx)(C,{open:he,onOpenChange:z,children:(0,j.jsxs)(y,{showCloseButton:!1,overlayClassName:`z-[60] bg-black/60`,className:`z-[60] max-w-md rounded-2xl border border-border bg-card p-6 shadow-2xl`,children:[(0,j.jsxs)(re,{children:[(0,j.jsx)(x,{className:`text-sm font-semibold uppercase tracking-widest text-muted-foreground`,children:F(`closeConfirmation.title`)}),(0,j.jsx)(b,{className:`text-sm text-foreground whitespace-pre-line`,children:F(`closeConfirmation.description`)})]}),(0,j.jsxs)(E,{className:`sm:flex-row sm:justify-end`,children:[(0,j.jsx)(f,{type:`button`,variant:`ghost`,onClick:()=>z(!1),children:F(`closeConfirmation.keepRunning`)}),(0,j.jsx)(f,{type:`button`,variant:`destructive`,onClick:()=>{z(!1),$()},children:F(`closeConfirmation.stopAndClose`)})]})]})})]})};export{xe as TestsDialog};
|