@kosuke-ai/cli 0.0.44 → 0.0.45
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 +94 -1
- package/claude.costs.json +34 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/kosuke/commands/build.d.ts +5 -1
- package/dist/kosuke/commands/build.d.ts.map +1 -1
- package/dist/kosuke/commands/build.js +297 -3
- package/dist/kosuke/commands/build.js.map +1 -1
- package/dist/kosuke/commands/migrate.d.ts +6 -1
- package/dist/kosuke/commands/migrate.d.ts.map +1 -1
- package/dist/kosuke/commands/migrate.js +124 -37
- package/dist/kosuke/commands/migrate.js.map +1 -1
- package/dist/kosuke/commands/plan.d.ts +4 -20
- package/dist/kosuke/commands/plan.d.ts.map +1 -1
- package/dist/kosuke/commands/plan.js +471 -679
- package/dist/kosuke/commands/plan.js.map +1 -1
- package/dist/kosuke/commands/requirements.js +2 -2
- package/dist/kosuke/commands/requirements.js.map +1 -1
- package/dist/kosuke/commands/review.d.ts +6 -1
- package/dist/kosuke/commands/review.d.ts.map +1 -1
- package/dist/kosuke/commands/review.js +168 -68
- package/dist/kosuke/commands/review.js.map +1 -1
- package/dist/kosuke/commands/serve.d.ts +9 -0
- package/dist/kosuke/commands/serve.d.ts.map +1 -0
- package/dist/kosuke/commands/serve.js +17 -0
- package/dist/kosuke/commands/serve.js.map +1 -0
- package/dist/kosuke/commands/ship.d.ts +6 -1
- package/dist/kosuke/commands/ship.d.ts.map +1 -1
- package/dist/kosuke/commands/ship.js +226 -67
- package/dist/kosuke/commands/ship.js.map +1 -1
- package/dist/kosuke/commands/test.d.ts +6 -1
- package/dist/kosuke/commands/test.d.ts.map +1 -1
- package/dist/kosuke/commands/test.js +171 -73
- package/dist/kosuke/commands/test.js.map +1 -1
- package/dist/kosuke/commands/tickets.d.ts +7 -15
- package/dist/kosuke/commands/tickets.d.ts.map +1 -1
- package/dist/kosuke/commands/tickets.js +14 -58
- package/dist/kosuke/commands/tickets.js.map +1 -1
- package/dist/kosuke/serve/middleware/error-handler.d.ts +13 -0
- package/dist/kosuke/serve/middleware/error-handler.d.ts.map +1 -0
- package/dist/kosuke/serve/middleware/error-handler.js +34 -0
- package/dist/kosuke/serve/middleware/error-handler.js.map +1 -0
- package/dist/kosuke/serve/middleware/validation.d.ts +13 -0
- package/dist/kosuke/serve/middleware/validation.d.ts.map +1 -0
- package/dist/kosuke/serve/middleware/validation.js +39 -0
- package/dist/kosuke/serve/middleware/validation.js.map +1 -0
- package/dist/kosuke/serve/routes/build.d.ts +6 -0
- package/dist/kosuke/serve/routes/build.d.ts.map +1 -0
- package/dist/kosuke/serve/routes/build.js +224 -0
- package/dist/kosuke/serve/routes/build.js.map +1 -0
- package/dist/kosuke/serve/routes/health.d.ts +6 -0
- package/dist/kosuke/serve/routes/health.d.ts.map +1 -0
- package/dist/kosuke/serve/routes/health.js +11 -0
- package/dist/kosuke/serve/routes/health.js.map +1 -0
- package/dist/kosuke/serve/routes/plan.d.ts +6 -0
- package/dist/kosuke/serve/routes/plan.d.ts.map +1 -0
- package/dist/kosuke/serve/routes/plan.js +104 -0
- package/dist/kosuke/serve/routes/plan.js.map +1 -0
- package/dist/kosuke/serve/server.d.ts +16 -0
- package/dist/kosuke/serve/server.d.ts.map +1 -0
- package/dist/kosuke/serve/server.js +63 -0
- package/dist/kosuke/serve/server.js.map +1 -0
- package/dist/kosuke/serve/validation/build.d.ts +41 -0
- package/dist/kosuke/serve/validation/build.d.ts.map +1 -0
- package/dist/kosuke/serve/validation/build.js +20 -0
- package/dist/kosuke/serve/validation/build.js.map +1 -0
- package/dist/kosuke/serve/validation/plan.d.ts +26 -0
- package/dist/kosuke/serve/validation/plan.d.ts.map +1 -0
- package/dist/kosuke/serve/validation/plan.js +15 -0
- package/dist/kosuke/serve/validation/plan.js.map +1 -0
- package/dist/kosuke/types.d.ts +205 -0
- package/dist/kosuke/types.d.ts.map +1 -1
- package/dist/kosuke/utils/claude-agent.d.ts +82 -6
- package/dist/kosuke/utils/claude-agent.d.ts.map +1 -1
- package/dist/kosuke/utils/claude-agent.js +381 -180
- package/dist/kosuke/utils/claude-agent.js.map +1 -1
- package/dist/lib.d.ts +4 -4
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +2 -1
- package/dist/lib.js.map +1 -1
- package/dist/package.json +6 -2
- package/package.json +6 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handling middleware
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 404 handler for unknown routes
|
|
6
|
+
*/
|
|
7
|
+
export function notFoundHandler(req, res) {
|
|
8
|
+
res.status(404).json({
|
|
9
|
+
error: 'Not Found',
|
|
10
|
+
message: `Route ${req.method} ${req.path} not found`,
|
|
11
|
+
availableRoutes: ['GET /health', 'POST /api/plan'],
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Global error handler (must be registered last)
|
|
16
|
+
*/
|
|
17
|
+
export function errorHandler(err, req, res, _next) {
|
|
18
|
+
// JSON parsing errors
|
|
19
|
+
if (err instanceof SyntaxError && 'body' in err) {
|
|
20
|
+
res.status(400).json({
|
|
21
|
+
error: 'Invalid JSON',
|
|
22
|
+
message: 'Request body contains invalid JSON syntax',
|
|
23
|
+
details: err.message,
|
|
24
|
+
});
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Generic error handler
|
|
28
|
+
console.error('Server error:', err);
|
|
29
|
+
res.status(500).json({
|
|
30
|
+
error: 'Internal Server Error',
|
|
31
|
+
message: err.message || 'An unexpected error occurred',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAa;IACzD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,SAAS,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,YAAY;QACpD,eAAe,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC;KACnD,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAU,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB;IACvF,sBAAsB;IACtB,IAAI,GAAG,YAAY,WAAW,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,2CAA2C;YACpD,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE,uBAAuB;QAC9B,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,8BAA8B;KACvD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic validation middleware
|
|
3
|
+
*/
|
|
4
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* Generic validation middleware factory
|
|
8
|
+
*
|
|
9
|
+
* Validates request body against a Zod schema and returns 400 if invalid.
|
|
10
|
+
* Replaces req.body with validated data on success.
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateRequest(schema: z.ZodSchema): (req: Request, res: Response, next: NextFunction) => void;
|
|
13
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,IACzC,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAAI,CA6B/D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic validation middleware
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generic validation middleware factory
|
|
6
|
+
*
|
|
7
|
+
* Validates request body against a Zod schema and returns 400 if invalid.
|
|
8
|
+
* Replaces req.body with validated data on success.
|
|
9
|
+
*/
|
|
10
|
+
export function validateRequest(schema) {
|
|
11
|
+
return (req, res, next) => {
|
|
12
|
+
try {
|
|
13
|
+
const result = schema.safeParse(req.body);
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
// Format Zod errors into readable format
|
|
16
|
+
const errors = result.error.issues.map((err) => ({
|
|
17
|
+
field: err.path.join('.'),
|
|
18
|
+
message: err.message,
|
|
19
|
+
}));
|
|
20
|
+
res.status(400).json({
|
|
21
|
+
error: 'Validation Error',
|
|
22
|
+
message: 'Request validation failed',
|
|
23
|
+
details: errors,
|
|
24
|
+
});
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Replace req.body with validated data
|
|
28
|
+
req.body = result.data;
|
|
29
|
+
next();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
res.status(500).json({
|
|
33
|
+
error: 'Internal Server Error',
|
|
34
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../kosuke/serve/middleware/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAmB;IACjD,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,yCAAyC;gBACzC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC/C,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;oBACzB,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC,CAAC;gBAEJ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,kBAAkB;oBACzB,OAAO,EAAE,2BAA2B;oBACpC,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,uCAAuC;YACvC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE,uBAAuB;gBAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/routes/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOjD,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2P3E"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build command SSE route
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { buildCoreStream } from '../../commands/build.js';
|
|
6
|
+
import { parseToolAction } from '../../utils/claude-agent.js';
|
|
7
|
+
export async function buildRoute(req, res) {
|
|
8
|
+
// Request body is already validated by middleware
|
|
9
|
+
const { cwd, ticketsFile, dbUrl, reset, review, url, headless, verbose, trace } = req.body;
|
|
10
|
+
// Verify directory exists
|
|
11
|
+
if (!existsSync(cwd)) {
|
|
12
|
+
res.status(400).json({
|
|
13
|
+
error: 'Invalid directory',
|
|
14
|
+
message: `Directory does not exist: ${cwd}`,
|
|
15
|
+
});
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Set SSE headers
|
|
19
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
20
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
21
|
+
res.setHeader('Connection', 'keep-alive');
|
|
22
|
+
const sendEvent = (event, data) => {
|
|
23
|
+
res.write(`event: ${event}\n`);
|
|
24
|
+
res.write(`data: ${JSON.stringify(data)}\n\n`);
|
|
25
|
+
};
|
|
26
|
+
try {
|
|
27
|
+
const options = {
|
|
28
|
+
directory: cwd,
|
|
29
|
+
ticketsFile,
|
|
30
|
+
dbUrl,
|
|
31
|
+
reset,
|
|
32
|
+
review,
|
|
33
|
+
url,
|
|
34
|
+
headless,
|
|
35
|
+
verbose,
|
|
36
|
+
trace,
|
|
37
|
+
// No askCommit/askConfirm in API mode (auto-commit everything)
|
|
38
|
+
};
|
|
39
|
+
const stream = buildCoreStream(options);
|
|
40
|
+
// Stream events to client
|
|
41
|
+
for await (const event of stream) {
|
|
42
|
+
switch (event.type) {
|
|
43
|
+
case 'build_started':
|
|
44
|
+
sendEvent('build_started', {
|
|
45
|
+
totalTickets: event.data.totalTickets,
|
|
46
|
+
ticketsFile: event.data.ticketsFile,
|
|
47
|
+
});
|
|
48
|
+
break;
|
|
49
|
+
case 'ticket_started':
|
|
50
|
+
sendEvent('ticket_started', {
|
|
51
|
+
ticket: event.data.ticket,
|
|
52
|
+
index: event.data.index,
|
|
53
|
+
total: event.data.total,
|
|
54
|
+
});
|
|
55
|
+
break;
|
|
56
|
+
case 'ticket_phase':
|
|
57
|
+
sendEvent('ticket_phase', {
|
|
58
|
+
phase: event.data.phase,
|
|
59
|
+
status: event.data.status,
|
|
60
|
+
});
|
|
61
|
+
break;
|
|
62
|
+
case 'ship_event':
|
|
63
|
+
// Handle nested ship events
|
|
64
|
+
if (event.data.type === 'message') {
|
|
65
|
+
const msg = event.data.data;
|
|
66
|
+
// Skip verbose tool results
|
|
67
|
+
if (msg.type === 'user' && 'tool_use_result' in msg) {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
// Skip system init
|
|
71
|
+
if (msg.type === 'system' && msg.subtype === 'init') {
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
// Extract tool calls and text from assistant messages
|
|
75
|
+
if (msg.type === 'assistant' && msg.message) {
|
|
76
|
+
const msgData = msg.message;
|
|
77
|
+
if (msgData.content && Array.isArray(msgData.content)) {
|
|
78
|
+
let hasText = false;
|
|
79
|
+
for (const block of msgData.content) {
|
|
80
|
+
if (block.type === 'tool_use' && block.name) {
|
|
81
|
+
// Send tool call event
|
|
82
|
+
const toolInput = block.input;
|
|
83
|
+
const parsed = parseToolAction(block.name, toolInput);
|
|
84
|
+
sendEvent('ship_tool_call', {
|
|
85
|
+
action: parsed.action,
|
|
86
|
+
params: parsed.params,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else if (block.type === 'text' && block.text) {
|
|
90
|
+
hasText = true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Only forward message if it has text (skip usage-only)
|
|
94
|
+
if (hasText) {
|
|
95
|
+
sendEvent('ship_message', msg);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Forward other ship events as-is
|
|
102
|
+
sendEvent(`ship_${event.data.type}`, event.data.data);
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
case 'test_event':
|
|
106
|
+
// Handle nested test events (uses Playwright MCP, different event structure)
|
|
107
|
+
if (event.data.type === 'tool_executed') {
|
|
108
|
+
// Send tool execution as tool_call
|
|
109
|
+
const toolData = event.data.data;
|
|
110
|
+
sendEvent('test_tool_call', {
|
|
111
|
+
action: toolData.toolName,
|
|
112
|
+
params: { success: toolData.success },
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
else if (event.data.type === 'assistant_message') {
|
|
116
|
+
// Send assistant message with text (skip if empty)
|
|
117
|
+
const msgData = event.data.data;
|
|
118
|
+
if (msgData.text && msgData.text.trim()) {
|
|
119
|
+
sendEvent('test_message', { text: msgData.text });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
// Forward other test events as-is
|
|
124
|
+
sendEvent(`test_${event.data.type}`, event.data.data);
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
case 'migrate_event':
|
|
128
|
+
// Handle nested migrate events
|
|
129
|
+
if (event.data.type === 'message') {
|
|
130
|
+
const msg = event.data.data;
|
|
131
|
+
// Skip verbose tool results
|
|
132
|
+
if (msg.type === 'user' && 'tool_use_result' in msg) {
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
// Skip system init
|
|
136
|
+
if (msg.type === 'system' && msg.subtype === 'init') {
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
// Extract tool calls and text from assistant messages
|
|
140
|
+
if (msg.type === 'assistant' && msg.message) {
|
|
141
|
+
const msgData = msg.message;
|
|
142
|
+
if (msgData.content && Array.isArray(msgData.content)) {
|
|
143
|
+
let hasText = false;
|
|
144
|
+
for (const block of msgData.content) {
|
|
145
|
+
if (block.type === 'tool_use' && block.name) {
|
|
146
|
+
// Send tool call event
|
|
147
|
+
const toolInput = block.input;
|
|
148
|
+
const parsed = parseToolAction(block.name, toolInput);
|
|
149
|
+
sendEvent('migrate_tool_call', {
|
|
150
|
+
action: parsed.action,
|
|
151
|
+
params: parsed.params,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else if (block.type === 'text' && block.text) {
|
|
155
|
+
hasText = true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Only forward message if it has text (skip usage-only)
|
|
159
|
+
if (hasText) {
|
|
160
|
+
sendEvent('migrate_message', msg);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
// Forward other migrate events as-is
|
|
167
|
+
sendEvent(`migrate_${event.data.type}`, event.data.data);
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
case 'test_retry':
|
|
171
|
+
sendEvent('test_retry', {
|
|
172
|
+
attempt: event.data.attempt,
|
|
173
|
+
maxRetries: event.data.maxRetries,
|
|
174
|
+
error: event.data.error,
|
|
175
|
+
});
|
|
176
|
+
break;
|
|
177
|
+
case 'ticket_completed':
|
|
178
|
+
sendEvent('ticket_completed', {
|
|
179
|
+
ticket: event.data.ticket,
|
|
180
|
+
result: event.data.result,
|
|
181
|
+
});
|
|
182
|
+
break;
|
|
183
|
+
case 'ticket_committed':
|
|
184
|
+
sendEvent('ticket_committed', {
|
|
185
|
+
ticket: event.data.ticket,
|
|
186
|
+
commitMessage: event.data.commitMessage,
|
|
187
|
+
});
|
|
188
|
+
break;
|
|
189
|
+
case 'progress':
|
|
190
|
+
sendEvent('progress', {
|
|
191
|
+
completed: event.data.completed,
|
|
192
|
+
total: event.data.total,
|
|
193
|
+
percentage: event.data.percentage,
|
|
194
|
+
});
|
|
195
|
+
break;
|
|
196
|
+
case 'done':
|
|
197
|
+
sendEvent('done', {
|
|
198
|
+
success: event.data.success,
|
|
199
|
+
ticketsProcessed: event.data.ticketsProcessed,
|
|
200
|
+
ticketsSucceeded: event.data.ticketsSucceeded,
|
|
201
|
+
ticketsFailed: event.data.ticketsFailed,
|
|
202
|
+
totalCost: event.data.totalCost,
|
|
203
|
+
tokensUsed: event.data.tokensUsed,
|
|
204
|
+
});
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
sendEvent('done', {
|
|
211
|
+
success: false,
|
|
212
|
+
ticketsProcessed: 0,
|
|
213
|
+
ticketsSucceeded: 0,
|
|
214
|
+
ticketsFailed: 0,
|
|
215
|
+
totalCost: 0,
|
|
216
|
+
tokensUsed: { input: 0, output: 0, cacheCreation: 0, cacheRead: 0 },
|
|
217
|
+
error: error instanceof Error ? error.message : String(error),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
res.end();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../kosuke/serve/routes/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAM9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../kosuke/serve/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,WAAW,CAAC,IAAa,EAAE,GAAa;IACtD,GAAG,CAAC,IAAI,CAAC;QACP,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/routes/plan.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOjD,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiH1E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plan command SSE route
|
|
3
|
+
*/
|
|
4
|
+
import { planCoreStream } from '../../commands/plan.js';
|
|
5
|
+
import { parseToolAction } from '../../utils/claude-agent.js';
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
export async function planRoute(req, res) {
|
|
8
|
+
// Request body is already validated by middleware
|
|
9
|
+
const { query, cwd, noTest, resume } = req.body;
|
|
10
|
+
// Verify directory exists
|
|
11
|
+
if (!existsSync(cwd)) {
|
|
12
|
+
res.status(400).json({
|
|
13
|
+
error: 'Invalid directory',
|
|
14
|
+
message: `Directory does not exist: ${cwd}`,
|
|
15
|
+
});
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Set SSE headers
|
|
19
|
+
res.setHeader('Content-Type', 'text/event-stream');
|
|
20
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
21
|
+
res.setHeader('Connection', 'keep-alive');
|
|
22
|
+
const sendEvent = (event, data) => {
|
|
23
|
+
res.write(`event: ${event}\n`);
|
|
24
|
+
res.write(`data: ${JSON.stringify(data)}\n\n`);
|
|
25
|
+
};
|
|
26
|
+
try {
|
|
27
|
+
const options = {
|
|
28
|
+
prompt: query,
|
|
29
|
+
directory: cwd,
|
|
30
|
+
noTest,
|
|
31
|
+
resume,
|
|
32
|
+
};
|
|
33
|
+
const stream = planCoreStream(options);
|
|
34
|
+
// Stream polished events (filter verbose content)
|
|
35
|
+
for await (const event of stream) {
|
|
36
|
+
if (event.type === 'tool_call') {
|
|
37
|
+
// Parse and send tool call event
|
|
38
|
+
const toolInput = event.data.input;
|
|
39
|
+
const parsed = parseToolAction(event.data.name, toolInput);
|
|
40
|
+
sendEvent('tool_call', {
|
|
41
|
+
action: parsed.action,
|
|
42
|
+
params: parsed.params,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else if (event.type === 'message') {
|
|
46
|
+
const msg = event.data;
|
|
47
|
+
// Skip verbose tool results (file contents, grep results)
|
|
48
|
+
if (msg.type === 'user' && 'tool_use_result' in msg) {
|
|
49
|
+
continue; // Don't send file contents to client
|
|
50
|
+
}
|
|
51
|
+
// Skip system init (too verbose)
|
|
52
|
+
if (msg.type === 'system' && msg.subtype === 'init') {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Send assistant messages (text only, tool calls handled separately)
|
|
56
|
+
if (msg.type === 'assistant') {
|
|
57
|
+
const polishedMsg = {
|
|
58
|
+
type: msg.type,
|
|
59
|
+
session_id: msg.session_id,
|
|
60
|
+
};
|
|
61
|
+
// Extract text content
|
|
62
|
+
const msgData = msg.message;
|
|
63
|
+
if (msgData.content && Array.isArray(msgData.content)) {
|
|
64
|
+
for (const block of msgData.content) {
|
|
65
|
+
if (block.type === 'text' && block.text) {
|
|
66
|
+
polishedMsg.text = block.text;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Include token usage
|
|
71
|
+
if (msgData.usage) {
|
|
72
|
+
polishedMsg.usage = msgData.usage;
|
|
73
|
+
}
|
|
74
|
+
// Only send if there's actual text content (skip usage-only messages)
|
|
75
|
+
if (polishedMsg.text) {
|
|
76
|
+
sendEvent('message', polishedMsg);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Skip result messages (usage-only, not useful for client)
|
|
80
|
+
}
|
|
81
|
+
else if (event.type === 'done') {
|
|
82
|
+
// Send final result
|
|
83
|
+
sendEvent('done', {
|
|
84
|
+
status: event.data.status,
|
|
85
|
+
ticketsFile: event.data.ticketsFile,
|
|
86
|
+
tokensUsed: event.data.tokensUsed,
|
|
87
|
+
cost: event.data.cost,
|
|
88
|
+
sessionId: event.data.sessionId,
|
|
89
|
+
error: event.data.error,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
sendEvent('done', {
|
|
96
|
+
status: 'error',
|
|
97
|
+
error: error instanceof Error ? error.message : String(error),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
res.end();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../kosuke/serve/routes/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express server for Kosuke CLI commands over HTTP with SSE
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express';
|
|
5
|
+
export interface ServeOptions {
|
|
6
|
+
port?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Create and configure Express server
|
|
10
|
+
*/
|
|
11
|
+
export declare function createServer(): express.Express;
|
|
12
|
+
/**
|
|
13
|
+
* Start the Kosuke server
|
|
14
|
+
*/
|
|
15
|
+
export declare function startServer(options?: ServeOptions): Promise<never>;
|
|
16
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../kosuke/serve/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAS9B,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAAC,OAAO,CAgB9C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,CAoC5E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express server for Kosuke CLI commands over HTTP with SSE
|
|
3
|
+
*/
|
|
4
|
+
import express from 'express';
|
|
5
|
+
import { healthRoute } from './routes/health.js';
|
|
6
|
+
import { planRoute } from './routes/plan.js';
|
|
7
|
+
import { buildRoute } from './routes/build.js';
|
|
8
|
+
import { validateRequest } from './middleware/validation.js';
|
|
9
|
+
import { errorHandler, notFoundHandler } from './middleware/error-handler.js';
|
|
10
|
+
import { planRequestSchema } from './validation/plan.js';
|
|
11
|
+
import { buildRequestSchema } from './validation/build.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create and configure Express server
|
|
14
|
+
*/
|
|
15
|
+
export function createServer() {
|
|
16
|
+
const app = express();
|
|
17
|
+
// Middleware
|
|
18
|
+
app.use(express.json());
|
|
19
|
+
// Routes
|
|
20
|
+
app.get('/health', healthRoute);
|
|
21
|
+
app.post('/api/plan', validateRequest(planRequestSchema), planRoute);
|
|
22
|
+
app.post('/api/build', validateRequest(buildRequestSchema), buildRoute);
|
|
23
|
+
// Error handlers (must be last)
|
|
24
|
+
app.use(notFoundHandler);
|
|
25
|
+
app.use(errorHandler);
|
|
26
|
+
return app;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Start the Kosuke server
|
|
30
|
+
*/
|
|
31
|
+
export async function startServer(options = {}) {
|
|
32
|
+
const port = options.port || 3000;
|
|
33
|
+
// Validate environment
|
|
34
|
+
if (!process.env.ANTHROPIC_API_KEY) {
|
|
35
|
+
throw new Error('ANTHROPIC_API_KEY environment variable is required');
|
|
36
|
+
}
|
|
37
|
+
if (!process.env.GITHUB_TOKEN) {
|
|
38
|
+
throw new Error('GITHUB_TOKEN environment variable is required for build command');
|
|
39
|
+
}
|
|
40
|
+
const app = createServer();
|
|
41
|
+
return new Promise((_, reject) => {
|
|
42
|
+
const server = app.listen(port, () => {
|
|
43
|
+
console.log(`
|
|
44
|
+
╔══════════════════════════════════════════════════════════════════════════════╗
|
|
45
|
+
║ Kosuke Server Running ║
|
|
46
|
+
╚══════════════════════════════════════════════════════════════════════════════╝
|
|
47
|
+
|
|
48
|
+
🚀 Server listening on http://localhost:${port}
|
|
49
|
+
|
|
50
|
+
📡 Available endpoints:
|
|
51
|
+
GET /health - Health check
|
|
52
|
+
POST /api/plan - Plan command with SSE
|
|
53
|
+
POST /api/build - Build command with SSE
|
|
54
|
+
|
|
55
|
+
Press Ctrl+C to stop the server.
|
|
56
|
+
`);
|
|
57
|
+
});
|
|
58
|
+
server.on('error', (error) => {
|
|
59
|
+
reject(error);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../kosuke/serve/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAM3D;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,aAAa;IACb,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,SAAS;IACT,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,iBAAiB,CAAC,EAAE,SAAS,CAAC,CAAC;IACrE,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC;IAExE,gCAAgC;IAChC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEtB,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAwB,EAAE;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;IAElC,uBAAuB;IACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAE3B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC;;;;;0CAKwB,IAAI;;;;;;;;CAQ7C,CAAC,CAAC;QACC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build command validation schemas
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* Build request validation schema
|
|
7
|
+
* Note: No askCommit/askConfirm in API mode (auto-commit everything)
|
|
8
|
+
*/
|
|
9
|
+
export declare const buildRequestSchema: z.ZodObject<{
|
|
10
|
+
cwd: z.ZodString;
|
|
11
|
+
ticketsFile: z.ZodOptional<z.ZodString>;
|
|
12
|
+
dbUrl: z.ZodOptional<z.ZodString>;
|
|
13
|
+
reset: z.ZodOptional<z.ZodBoolean>;
|
|
14
|
+
review: z.ZodOptional<z.ZodBoolean>;
|
|
15
|
+
url: z.ZodOptional<z.ZodString>;
|
|
16
|
+
headless: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
verbose: z.ZodOptional<z.ZodBoolean>;
|
|
18
|
+
trace: z.ZodOptional<z.ZodBoolean>;
|
|
19
|
+
}, "strip", z.ZodTypeAny, {
|
|
20
|
+
cwd: string;
|
|
21
|
+
verbose?: boolean | undefined;
|
|
22
|
+
url?: string | undefined;
|
|
23
|
+
review?: boolean | undefined;
|
|
24
|
+
dbUrl?: string | undefined;
|
|
25
|
+
trace?: boolean | undefined;
|
|
26
|
+
headless?: boolean | undefined;
|
|
27
|
+
ticketsFile?: string | undefined;
|
|
28
|
+
reset?: boolean | undefined;
|
|
29
|
+
}, {
|
|
30
|
+
cwd: string;
|
|
31
|
+
verbose?: boolean | undefined;
|
|
32
|
+
url?: string | undefined;
|
|
33
|
+
review?: boolean | undefined;
|
|
34
|
+
dbUrl?: string | undefined;
|
|
35
|
+
trace?: boolean | undefined;
|
|
36
|
+
headless?: boolean | undefined;
|
|
37
|
+
ticketsFile?: string | undefined;
|
|
38
|
+
reset?: boolean | undefined;
|
|
39
|
+
}>;
|
|
40
|
+
export type BuildRequest = z.infer<typeof buildRequestSchema>;
|
|
41
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../../kosuke/serve/validation/build.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
|