@inharness-ai/claude4spec 1.0.3 → 1.0.5

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 (116) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/bin/c4s/commands/ask.d.ts +13 -0
  3. package/dist/bin/c4s/commands/ask.js +167 -0
  4. package/dist/bin/c4s/commands/ask.js.map +1 -0
  5. package/dist/bin/c4s/errors.d.ts +1 -1
  6. package/dist/bin/c4s/errors.js.map +1 -1
  7. package/dist/bin/c4s/project.d.ts +6 -0
  8. package/dist/bin/c4s/project.js +25 -0
  9. package/dist/bin/c4s/project.js.map +1 -1
  10. package/dist/bin/c4s.js +12 -6
  11. package/dist/bin/c4s.js.map +1 -1
  12. package/dist/client/assets/{arc-D8brDDag.js → arc-grMo2vzL.js} +1 -1
  13. package/dist/client/assets/{architectureDiagram-3BPJPVTR-Bmh1uTQZ.js → architectureDiagram-3BPJPVTR-Fp_VHONq.js} +1 -1
  14. package/dist/client/assets/{blockDiagram-GPEHLZMM-55jaVWwd.js → blockDiagram-GPEHLZMM-CIwVG0sx.js} +1 -1
  15. package/dist/client/assets/{c4Diagram-AAUBKEIU-Dxm0tLsZ.js → c4Diagram-AAUBKEIU-tysuJyz0.js} +1 -1
  16. package/dist/client/assets/channel-B30S19wt.js +1 -0
  17. package/dist/client/assets/{chunk-2J33WTMH-vDJ1slcJ.js → chunk-2J33WTMH-DZFNNwID.js} +1 -1
  18. package/dist/client/assets/{chunk-4BX2VUAB-DP6CC-Qn.js → chunk-4BX2VUAB-CsnJG7Pv.js} +1 -1
  19. package/dist/client/assets/{chunk-55IACEB6-SgOSJYkL.js → chunk-55IACEB6-MhREYXzo.js} +1 -1
  20. package/dist/client/assets/{chunk-727SXJPM-BtRfbjBO.js → chunk-727SXJPM-BjvyGtK3.js} +1 -1
  21. package/dist/client/assets/{chunk-AQP2D5EJ-yIRaTgFg.js → chunk-AQP2D5EJ-zfcfKNbO.js} +1 -1
  22. package/dist/client/assets/{chunk-FMBD7UC4-B_VD4t8N.js → chunk-FMBD7UC4-Ckx-Hc8U.js} +1 -1
  23. package/dist/client/assets/{chunk-ND2GUHAM-BvJdtX82.js → chunk-ND2GUHAM-DSIVVmYM.js} +1 -1
  24. package/dist/client/assets/{chunk-QZHKN3VN-BLNWKymD.js → chunk-QZHKN3VN-EcIM6ZdS.js} +1 -1
  25. package/dist/client/assets/classDiagram-4FO5ZUOK-Bm4SZLsb.js +1 -0
  26. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Bm4SZLsb.js +1 -0
  27. package/dist/client/assets/{cose-bilkent-S5V4N54A-BQyA-r-y.js → cose-bilkent-S5V4N54A-DC8DVe0z.js} +1 -1
  28. package/dist/client/assets/{dagre-BM42HDAG-CAh0mTzA.js → dagre-BM42HDAG-BQjcdXnw.js} +1 -1
  29. package/dist/client/assets/{diagram-2AECGRRQ-C83TGK4o.js → diagram-2AECGRRQ-BUPeBMwt.js} +1 -1
  30. package/dist/client/assets/{diagram-5GNKFQAL-2L6uowvf.js → diagram-5GNKFQAL-I_Q-Pnp6.js} +1 -1
  31. package/dist/client/assets/{diagram-KO2AKTUF-Cj5n4jdq.js → diagram-KO2AKTUF-B8WbbWJu.js} +1 -1
  32. package/dist/client/assets/{diagram-LMA3HP47-Bp5SDMjg.js → diagram-LMA3HP47-CsACxgW7.js} +1 -1
  33. package/dist/client/assets/{diagram-OG6HWLK6-cFsDQ8Qk.js → diagram-OG6HWLK6-lPuJxQED.js} +1 -1
  34. package/dist/client/assets/{erDiagram-TEJ5UH35-D8G5xpg3.js → erDiagram-TEJ5UH35-cU5ZGREz.js} +1 -1
  35. package/dist/client/assets/{flowDiagram-I6XJVG4X-CuNudlCD.js → flowDiagram-I6XJVG4X-Dr-vZTBV.js} +1 -1
  36. package/dist/client/assets/{ganttDiagram-6RSMTGT7-CtFlsB15.js → ganttDiagram-6RSMTGT7-CXiWZ0R8.js} +1 -1
  37. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-h66Tso4O.js → gitGraphDiagram-PVQCEYII-PDvLBbvz.js} +1 -1
  38. package/dist/client/assets/{index-aPVup1Re.js → index-BQltseJ-.js} +1 -1
  39. package/dist/client/assets/{index-aJE-l7h7.js → index-RMlMPKY7.js} +1 -1
  40. package/dist/client/assets/{index-D5ljIkCJ.js → index-YFPhJxE5.js} +184 -174
  41. package/dist/client/assets/{index-CZOpb3O7.css → index-zpHL2aYW.css} +1 -1
  42. package/dist/client/assets/{infoDiagram-5YYISTIA-CO_BLfuW.js → infoDiagram-5YYISTIA-Re9fOUPS.js} +1 -1
  43. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-D4rSRnQA.js → ishikawaDiagram-YF4QCWOH-BTazB_7p.js} +1 -1
  44. package/dist/client/assets/{journeyDiagram-JHISSGLW-GyHI6dB8.js → journeyDiagram-JHISSGLW-pGUoqxHl.js} +1 -1
  45. package/dist/client/assets/{kanban-definition-UN3LZRKU-CrH33WLe.js → kanban-definition-UN3LZRKU-C2RzCJrM.js} +1 -1
  46. package/dist/client/assets/{linear-Dh1OyvSm.js → linear-Be3WPYKf.js} +1 -1
  47. package/dist/client/assets/{mermaid.core-C45sMDhS.js → mermaid.core-GdPXct3q.js} +4 -4
  48. package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bgwb0vwA.js → mindmap-definition-RKZ34NQL-DvktVTUU.js} +1 -1
  49. package/dist/client/assets/{pieDiagram-4H26LBE5-l9cCpVfG.js → pieDiagram-4H26LBE5-DvC_m4m5.js} +1 -1
  50. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BCPSUbC3.js → quadrantDiagram-W4KKPZXB-SWtidcZL.js} +1 -1
  51. package/dist/client/assets/{requirementDiagram-4Y6WPE33-TEGOe-vV.js → requirementDiagram-4Y6WPE33-CQEHDx1W.js} +1 -1
  52. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C69pv_7D.js → sankeyDiagram-5OEKKPKP-C0PTA3gP.js} +1 -1
  53. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-arinzeCk.js → sequenceDiagram-3UESZ5HK-D-x7SXoo.js} +1 -1
  54. package/dist/client/assets/{stateDiagram-AJRCARHV-C2YENpmw.js → stateDiagram-AJRCARHV-BhcGVfs1.js} +1 -1
  55. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-2vcyLY1V.js +1 -0
  56. package/dist/client/assets/{timeline-definition-PNZ67QCA-h5qtI99f.js → timeline-definition-PNZ67QCA-JYTlKPB-.js} +1 -1
  57. package/dist/client/assets/{vennDiagram-CIIHVFJN-CnuK75Ut.js → vennDiagram-CIIHVFJN-KjNL1Qpz.js} +1 -1
  58. package/dist/client/assets/{wardley-L42UT6IY-B4bQ0Xyy.js → wardley-L42UT6IY-DcljmmEY.js} +1 -1
  59. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-apV8olQc.js → wardleyDiagram-YWT4CUSO-Pbq6ALgg.js} +1 -1
  60. package/dist/client/assets/{xychartDiagram-2RQKCTM6-OTP6zeEy.js → xychartDiagram-2RQKCTM6-G_r_2Cvk.js} +1 -1
  61. package/dist/client/index.html +2 -2
  62. package/dist/server/config.d.ts +6 -0
  63. package/dist/server/config.js +6 -0
  64. package/dist/server/config.js.map +1 -1
  65. package/dist/server/db/migrate.js +28 -11
  66. package/dist/server/db/migrate.js.map +1 -1
  67. package/dist/server/db/migrations/028_page_version_kind_patch.sql +43 -0
  68. package/dist/server/db/migrations/029_chat_thread_patch.sql +64 -0
  69. package/dist/server/external-skills/brief-implementer-template.d.ts +1 -1
  70. package/dist/server/external-skills/brief-implementer-template.js +14 -0
  71. package/dist/server/external-skills/brief-implementer-template.js.map +1 -1
  72. package/dist/server/external-skills/spec-reader-template.d.ts +1 -1
  73. package/dist/server/external-skills/spec-reader-template.js +12 -0
  74. package/dist/server/external-skills/spec-reader-template.js.map +1 -1
  75. package/dist/server/index.js +111 -37
  76. package/dist/server/index.js.map +1 -1
  77. package/dist/server/routes/agent-turn.d.ts +92 -0
  78. package/dist/server/routes/agent-turn.js +379 -0
  79. package/dist/server/routes/agent-turn.js.map +1 -0
  80. package/dist/server/routes/chat.d.ts +2 -28
  81. package/dist/server/routes/chat.js +33 -382
  82. package/dist/server/routes/chat.js.map +1 -1
  83. package/dist/server/routes/errors.js +4 -0
  84. package/dist/server/routes/errors.js.map +1 -1
  85. package/dist/server/routes/patches.d.ts +8 -0
  86. package/dist/server/routes/patches.js +106 -0
  87. package/dist/server/routes/patches.js.map +1 -0
  88. package/dist/server/routes/threads.d.ts +2 -2
  89. package/dist/server/routes/threads.js +51 -1
  90. package/dist/server/routes/threads.js.map +1 -1
  91. package/dist/server/services/brief.js +0 -1
  92. package/dist/server/services/brief.js.map +1 -1
  93. package/dist/server/services/chat-context.d.ts +3 -1
  94. package/dist/server/services/chat-context.js +32 -1
  95. package/dist/server/services/chat-context.js.map +1 -1
  96. package/dist/server/services/chat.d.ts +5 -2
  97. package/dist/server/services/chat.js +35 -7
  98. package/dist/server/services/chat.js.map +1 -1
  99. package/dist/server/services/page-version.d.ts +11 -4
  100. package/dist/server/services/page-version.js +19 -11
  101. package/dist/server/services/page-version.js.map +1 -1
  102. package/dist/server/services/pages-frontmatter-indexer.d.ts +4 -1
  103. package/dist/server/services/pages-frontmatter-indexer.js +19 -9
  104. package/dist/server/services/pages-frontmatter-indexer.js.map +1 -1
  105. package/dist/server/services/patch.d.ts +66 -0
  106. package/dist/server/services/patch.js +196 -0
  107. package/dist/server/services/patch.js.map +1 -0
  108. package/dist/shared/entities.d.ts +62 -2
  109. package/dist/shared/entities.js +11 -0
  110. package/dist/shared/entities.js.map +1 -1
  111. package/dist/shared/types.d.ts +5 -2
  112. package/package.json +1 -1
  113. package/dist/client/assets/channel-ArVcv4Yl.js +0 -1
  114. package/dist/client/assets/classDiagram-4FO5ZUOK-B3nmPR7w.js +0 -1
  115. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B3nmPR7w.js +0 -1
  116. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CS6ocDH6.js +0 -1
@@ -0,0 +1,379 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import { createAdapter, observeStream, AdapterAbortError, AdapterInitError, AdapterTimeoutError, } from '@inharness-ai/agent-adapters';
3
+ import { buildPlanToolsServer } from '../mcp/plan-tools.js';
4
+ import { buildBriefToolsServer } from '../mcp/brief-tools.js';
5
+ import { buildSystemPrompt } from '../services/chat-context.js';
6
+ import { readConfig } from '../config.js';
7
+ import { pluginHost } from '../core/plugin-host/host.js';
8
+ /** M21 m05ctxreg: tools whitelist per context_type. Brief threads get only
9
+ * brief-tools (per-thread, mounted below) + release-tools (read-only).
10
+ * All other plugin servers (endpoint-tools, dto-tools, ui-view-tools,
11
+ * database-table-tools, plan-tools, reference-tools) are NOT mounted. */
12
+ const BRIEF_ALLOWED_PLUGIN_MCP = new Set(['release-tools']);
13
+ export const ALLOWED_MODELS = ['sonnet-4.6', 'opus-4.7', 'haiku-4.5'];
14
+ // Wspoldzielone rejestry — keyed by threadId, jeden aktywny adapter per watek.
15
+ // `POST /api/chat` i `POST /api/threads/:id/ask` importuja te same instancje:
16
+ // drugi POST/ask na ten sam watek dostaje 409, a GET /api/chat/stream/:threadId
17
+ // dolacza do zywego streamu niezaleznie od tego, ktory endpoint go uruchomil.
18
+ export const activeAdapters = new Map();
19
+ export const pendingInputs = new Map();
20
+ export function cancelPendingForRequest(requestId) {
21
+ for (const [inputId, pending] of pendingInputs) {
22
+ if (pending.requestIdsForRequest === requestId) {
23
+ pending.reject(new Error('stream aborted'));
24
+ pendingInputs.delete(inputId);
25
+ }
26
+ }
27
+ }
28
+ /** Typed blad tury — pozwala konsumentom (headless `ask`) zmapowac powod
29
+ * zakonczenia na status HTTP. Te same kody co SSE `event: error`. */
30
+ export class AgentTurnError extends Error {
31
+ code;
32
+ constructor(code, message) {
33
+ super(message);
34
+ this.code = code;
35
+ this.name = 'AgentTurnError';
36
+ }
37
+ }
38
+ /**
39
+ * Uruchamia jedna ture agenta dla istniejacego watku: wstawia wiadomosc user,
40
+ * buduje runtime przez rejestr `context_type`, wykonuje `adapter.execute(...)`,
41
+ * persystuje eventy mapperem `UnifiedEvent → chat_message`. Caller wybiera
42
+ * transport przez `onEvent` (SSE vs collapse). Zwraca `{ threadId, answer }`,
43
+ * gdzie `answer` to skolapsowany tekst assistant tej tury.
44
+ *
45
+ * Pre-flight `activeAdapters.has` (→ 409) NALEZY do callera; ta funkcja
46
+ * rejestruje adapter w `activeAdapters` i zwalnia go w `finally`.
47
+ */
48
+ export async function runAgentTurn(deps, input) {
49
+ const { thread, prompt, requestId } = input;
50
+ const annotations = input.annotations ?? [];
51
+ const currentPage = input.currentPage ?? null;
52
+ const planMode = thread.planMode;
53
+ const adapter = createAdapter('claude-code');
54
+ const emitter = new EventEmitter();
55
+ activeAdapters.set(thread.id, { requestId, adapter, emitter });
56
+ // `onEvent` to transport callera; `emitter` zasila GET /api/chat/stream/:threadId.
57
+ const emit = (event) => {
58
+ input.onEvent(event);
59
+ emitter.emit('event', event);
60
+ };
61
+ emit({ type: 'connected', requestId, threadId: thread.id });
62
+ let assistantBuf = '';
63
+ let thinkingBuf = '';
64
+ // Skolapsowana odpowiedz tury — wszystkie main-agent `text_delta` zlaczone.
65
+ // Nie resetowane przy flush; zwracane jako `answer` po terminalnym evencie.
66
+ let answerBuf = '';
67
+ const subagentBuffers = new Map();
68
+ let lastMainAssistantRowId = null;
69
+ let lastToolResultRowId = null;
70
+ let lastTurnUsage = null;
71
+ const getSubBuf = (taskId) => {
72
+ let buf = subagentBuffers.get(taskId);
73
+ if (!buf) {
74
+ buf = { text: '', thinking: '' };
75
+ subagentBuffers.set(taskId, buf);
76
+ }
77
+ return buf;
78
+ };
79
+ const flushSubBuf = (taskId) => {
80
+ const buf = subagentBuffers.get(taskId);
81
+ if (!buf)
82
+ return;
83
+ if (buf.text) {
84
+ deps.chatService.addMessage(thread.id, 'assistant', JSON.stringify({ text: buf.text }), null, null, taskId);
85
+ buf.text = '';
86
+ }
87
+ if (buf.thinking) {
88
+ deps.chatService.addMessage(thread.id, 'assistant', JSON.stringify({ text: buf.thinking, thinking: true }), null, null, taskId);
89
+ buf.thinking = '';
90
+ }
91
+ };
92
+ const flushMainBuf = () => {
93
+ if (assistantBuf) {
94
+ const row = deps.chatService.addMessage(thread.id, 'assistant', JSON.stringify({ text: assistantBuf }));
95
+ lastMainAssistantRowId = row.id;
96
+ assistantBuf = '';
97
+ }
98
+ if (thinkingBuf) {
99
+ deps.chatService.addMessage(thread.id, 'assistant', JSON.stringify({ text: thinkingBuf, thinking: true }));
100
+ thinkingBuf = '';
101
+ }
102
+ };
103
+ try {
104
+ deps.chatService.addMessage(thread.id, 'user', JSON.stringify({ text: prompt, annotations }), null, null, null, planMode);
105
+ if (!thread.title) {
106
+ const title = prompt.slice(0, 60) + (prompt.length > 60 ? '...' : '');
107
+ deps.chatService.updateTitle(thread.id, title || '(annotations only)');
108
+ }
109
+ const isBrief = thread.contextType === 'brief';
110
+ // M23: patch threads keep the FULL spec-editing toolset (isBrief stays
111
+ // false) — their job is to edit the spec. Only the system prompt differs.
112
+ const isPatch = thread.contextType === 'patch';
113
+ // M21: dla brief context czytamy aktualny snapshot brief'u (frontmatter+body+hash)
114
+ // i wkladamy do system promptu. Skip kosztownych obliczen pageCount/entityCounts.
115
+ let briefSnapshot = null;
116
+ if (isBrief && thread.briefPath) {
117
+ try {
118
+ briefSnapshot = await deps.briefService.getBrief(thread.briefPath);
119
+ }
120
+ catch (err) {
121
+ console.warn(`[chat] brief read failed for ${thread.briefPath}:`, err.message);
122
+ }
123
+ }
124
+ // M23: dla patch context czytamy snapshot patcha i wkladamy do system promptu.
125
+ let patchSnapshot = null;
126
+ if (isPatch && thread.patchPath) {
127
+ try {
128
+ patchSnapshot = await deps.patchService.getPatch(thread.patchPath);
129
+ }
130
+ catch (err) {
131
+ console.warn(`[chat] patch read failed for ${thread.patchPath}:`, err.message);
132
+ }
133
+ }
134
+ let currentPageBody = null;
135
+ if (!isBrief && currentPage) {
136
+ try {
137
+ const page = await deps.pagesService.read(currentPage);
138
+ currentPageBody = page.body;
139
+ }
140
+ catch {
141
+ currentPageBody = null;
142
+ }
143
+ }
144
+ // Stale-plan reminder MUSI byc sprawdzony PRZED markPlanSeenByThread —
145
+ // ten ostatni bumpuje last_seen_plan_version i zapodaje sygnal "synced".
146
+ const isFirstTurn = !thread.hasSystemPrompt;
147
+ const stalePlanReminder = isBrief ? null : deps.planService.getStalePlanReminder(thread.id);
148
+ const currentPlan = isBrief ? null : deps.planService.getByThread(thread.id);
149
+ // Skill resolution: writing-style (config.writingStyle, M15) ladowany
150
+ // niezaleznie od kontekstu. Dla brief context dokladamy bundled `brief-author`.
151
+ const writingStyleSkills = deps.skillResolver.resolve();
152
+ const writingStyle = writingStyleSkills[0]
153
+ ? {
154
+ slug: writingStyleSkills[0].name,
155
+ title: String(writingStyleSkills[0].metadata?.title ?? writingStyleSkills[0].name),
156
+ }
157
+ : null;
158
+ const inlineSkills = [...writingStyleSkills];
159
+ if (isBrief && deps.skillRegistry.has('brief-author')) {
160
+ const skill = deps.skillRegistry.resolve('brief-author');
161
+ inlineSkills.push({
162
+ name: skill.metadata.slug,
163
+ description: skill.metadata.description,
164
+ content: skill.content,
165
+ files: skill.files,
166
+ metadata: {
167
+ version: skill.metadata.version,
168
+ language: skill.metadata.language,
169
+ title: skill.metadata.title,
170
+ },
171
+ });
172
+ }
173
+ const pageCount = isBrief ? 0 : countPages(await deps.pagesService.listTree());
174
+ const systemPrompt = buildSystemPrompt({
175
+ projectName: readConfig(deps.cwd).name,
176
+ cwd: deps.cwd,
177
+ pagesDir: deps.pagesDir,
178
+ currentPagePath: currentPage,
179
+ currentPageBody,
180
+ pageCount,
181
+ entityCounts: isBrief ? {} : pluginHost.computeEntityCounts(deps.db.handle),
182
+ tagCount: isBrief ? 0 : deps.tagsService.list().length,
183
+ sectionCount: isBrief ? 0 : deps.sectionsService.count(),
184
+ annotations,
185
+ planMode,
186
+ currentPlan,
187
+ planToolsAvailable: !isBrief,
188
+ writingStyle,
189
+ contextType: thread.contextType,
190
+ brief: briefSnapshot,
191
+ patch: patchSnapshot,
192
+ });
193
+ // claude-code CLI po resumeSessionId ignoruje kolejne systemPrompty —
194
+ // wiążący dla audytu jest tylko pierwszy. UPDATE idempotentny (no-op na 2.+ turze).
195
+ deps.chatService.setInitialSystemPrompt(thread.id, systemPrompt);
196
+ if (isFirstTurn && currentPlan) {
197
+ deps.planService.markPlanSeenByThread(thread.id);
198
+ }
199
+ // M21 m05ctxreg: per-thread MCP servers depend on context_type.
200
+ const planTools = isBrief
201
+ ? null
202
+ : buildPlanToolsServer({
203
+ threadId: thread.id,
204
+ planService: deps.planService,
205
+ });
206
+ const briefTools = isBrief && thread.briefPath
207
+ ? buildBriefToolsServer({
208
+ threadId: thread.id,
209
+ briefPath: thread.briefPath,
210
+ briefService: deps.briefService,
211
+ pageVersions: deps.pageVersions,
212
+ })
213
+ : null;
214
+ const pluginMcpEntries = pluginHost
215
+ .listMcpServers()
216
+ .filter(({ name }) => (isBrief ? BRIEF_ALLOWED_PLUGIN_MCP.has(name) : true))
217
+ .map(({ name, server }) => [name, server.config]);
218
+ const mcpServers = Object.fromEntries(pluginMcpEntries);
219
+ if (planTools)
220
+ mcpServers['plan-tools'] = planTools.config;
221
+ if (briefTools)
222
+ mcpServers['brief-tools'] = briefTools.config;
223
+ const effectivePrompt = stalePlanReminder ? `${stalePlanReminder}\n\n${prompt}` : prompt;
224
+ const stream = adapter.execute({
225
+ prompt: effectivePrompt,
226
+ systemPrompt,
227
+ model: input.model,
228
+ cwd: deps.cwd,
229
+ mcpServers,
230
+ skills: inlineSkills,
231
+ resumeSessionId: thread.lastSessionId ?? undefined,
232
+ architectureConfig: input.architectureConfig,
233
+ planMode,
234
+ onUserInput: input.onUserInput,
235
+ });
236
+ const observed = input.consoleObserver
237
+ ? observeStream(stream, [input.consoleObserver])
238
+ : stream;
239
+ for await (const event of observed) {
240
+ emit(event);
241
+ switch (event.type) {
242
+ case 'text_delta':
243
+ if (event.isSubagent && event.subagentTaskId) {
244
+ getSubBuf(event.subagentTaskId).text += event.text;
245
+ }
246
+ else if (!event.isSubagent) {
247
+ assistantBuf += event.text;
248
+ answerBuf += event.text;
249
+ }
250
+ break;
251
+ case 'thinking':
252
+ if (event.isSubagent && event.subagentTaskId) {
253
+ getSubBuf(event.subagentTaskId).thinking += event.text;
254
+ }
255
+ else if (!event.isSubagent) {
256
+ thinkingBuf += event.text;
257
+ }
258
+ break;
259
+ case 'assistant_message': {
260
+ if (!event.message.subagentTaskId && event.message.usage) {
261
+ lastTurnUsage = event.message.usage;
262
+ deps.chatService.setLastUsage(thread.id, event.message.usage);
263
+ }
264
+ break;
265
+ }
266
+ case 'tool_use': {
267
+ const taskId = event.subagentTaskId ?? null;
268
+ if (taskId)
269
+ flushSubBuf(taskId);
270
+ else
271
+ flushMainBuf();
272
+ deps.chatService.addMessage(thread.id, 'tool_use', JSON.stringify({ input: event.input }), event.toolName, event.toolUseId, taskId, planMode, 'streaming');
273
+ break;
274
+ }
275
+ case 'tool_result': {
276
+ const taskId = event.subagentTaskId ?? null;
277
+ deps.chatService.markToolUseComplete(thread.id, event.toolUseId);
278
+ const row = deps.chatService.addMessage(thread.id, 'tool_result', JSON.stringify({ summary: event.summary, isError: event.isError }), null, event.toolUseId, taskId);
279
+ if (taskId === null)
280
+ lastToolResultRowId = row.id;
281
+ break;
282
+ }
283
+ case 'subagent_started':
284
+ flushMainBuf();
285
+ deps.chatService.startSubagentTask(thread.id, event.taskId, event.description, event.toolUseId ?? null);
286
+ break;
287
+ case 'subagent_progress':
288
+ deps.chatService.updateSubagentTaskProgress(thread.id, event.taskId, event.description);
289
+ break;
290
+ case 'subagent_completed':
291
+ flushSubBuf(event.taskId);
292
+ deps.chatService.completeSubagentTask(thread.id, event.taskId, event.status, event.summary ?? null);
293
+ break;
294
+ case 'result': {
295
+ flushMainBuf();
296
+ for (const tid of Array.from(subagentBuffers.keys()))
297
+ flushSubBuf(tid);
298
+ if (event.sessionId)
299
+ deps.chatService.setLastSessionId(thread.id, event.sessionId);
300
+ const turnAnchor = lastMainAssistantRowId ?? lastToolResultRowId;
301
+ if (lastTurnUsage) {
302
+ deps.chatService.setLastUsage(thread.id, lastTurnUsage);
303
+ if (turnAnchor !== null) {
304
+ deps.chatService.attachTurnUsage(thread.id, turnAnchor, lastTurnUsage);
305
+ }
306
+ }
307
+ if (typeof event.contextSize === 'number') {
308
+ deps.chatService.setLastContextSize(thread.id, event.contextSize);
309
+ if (turnAnchor !== null) {
310
+ deps.chatService.attachTurnContextSize(thread.id, turnAnchor, event.contextSize);
311
+ }
312
+ }
313
+ break;
314
+ }
315
+ case 'todo_list_updated':
316
+ if (!event.isSubagent) {
317
+ deps.chatService.updateCurrentTodoItems(thread.id, event.items);
318
+ }
319
+ break;
320
+ case 'warning':
321
+ console.warn('[agent warning]', event.message);
322
+ break;
323
+ }
324
+ }
325
+ // Terminal `done`/`error` ida tylko transportem callera (`onEvent`).
326
+ // Emitter dla GET /stream/:threadId dostaje `done` raz, w `finally`.
327
+ input.onEvent({ type: 'done' });
328
+ }
329
+ catch (err) {
330
+ // Mapuj na typed blad — `onEvent` dostaje `event: error` (parytet z SSE),
331
+ // a caller (headless `ask`) lapie `AgentTurnError` i mapuje na status HTTP.
332
+ let turnErr;
333
+ if (err instanceof AdapterAbortError) {
334
+ turnErr = new AgentTurnError('ABORTED', 'Aborted by user');
335
+ }
336
+ else if (err instanceof AdapterTimeoutError) {
337
+ turnErr = new AgentTurnError('TIMEOUT', 'Agent took too long to respond');
338
+ }
339
+ else if (err instanceof AdapterInitError) {
340
+ turnErr = new AgentTurnError('AGENT_UNAVAILABLE', 'Claude CLI not found or not logged in. Run `claude login` first.');
341
+ }
342
+ else {
343
+ turnErr = new AgentTurnError('AGENT_ERROR', err instanceof Error ? err.message : String(err));
344
+ }
345
+ input.onEvent({ type: 'error', code: turnErr.code, error: turnErr.message });
346
+ throw turnErr;
347
+ }
348
+ finally {
349
+ try {
350
+ flushMainBuf();
351
+ for (const tid of Array.from(subagentBuffers.keys()))
352
+ flushSubBuf(tid);
353
+ }
354
+ catch (flushErr) {
355
+ console.error('[chat] final flush failed', flushErr);
356
+ }
357
+ try {
358
+ deps.chatService.finalizeStreamingRows(thread.id);
359
+ }
360
+ catch (finalizeErr) {
361
+ console.error('[chat] finalizeStreamingRows failed', finalizeErr);
362
+ }
363
+ emitter.emit('event', { type: 'done' });
364
+ activeAdapters.delete(thread.id);
365
+ cancelPendingForRequest(requestId);
366
+ }
367
+ return { threadId: thread.id, answer: answerBuf.trim() };
368
+ }
369
+ export function countPages(tree) {
370
+ let n = 0;
371
+ for (const node of tree) {
372
+ if (node.type === 'file')
373
+ n++;
374
+ else if (Array.isArray(node.children))
375
+ n += countPages(node.children);
376
+ }
377
+ return n;
378
+ }
379
+ //# sourceMappingURL=agent-turn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-turn.js","sourceRoot":"","sources":["../../../src/server/routes/agent-turn.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,3 @@
1
1
  import { Router } from 'express';
2
- import type { ChatService } from '../services/chat.js';
3
- import type { PagesService } from '../services/pages.js';
4
- import type { TagsService } from '../services/tags.js';
5
- import type { SectionsService } from '../services/sections.js';
6
- import type { PlanService } from '../services/plan.js';
7
- import type { BriefService } from '../services/brief.js';
8
- import type { PageVersionService } from '../services/page-version.js';
9
- import type { SkillResolver, SkillRegistry } from '../services/skill-registry.js';
10
- import type { WsGateway } from '../ws/gateway.js';
11
- import type { Db } from '../db/index.js';
12
- interface ChatRouterDeps {
13
- chatService: ChatService;
14
- pagesService: PagesService;
15
- tagsService: TagsService;
16
- sectionsService: SectionsService;
17
- planService: PlanService;
18
- briefService: BriefService;
19
- pageVersions: PageVersionService;
20
- skillResolver: SkillResolver;
21
- skillRegistry: SkillRegistry;
22
- ws: WsGateway;
23
- cwd: string;
24
- pagesDir: string;
25
- mode: 'dev' | 'prod';
26
- db: Db;
27
- }
28
- export declare function chatRouter(deps: ChatRouterDeps): Router;
29
- export {};
2
+ import { type AgentTurnDeps } from './agent-turn.js';
3
+ export declare function chatRouter(deps: AgentTurnDeps): Router;