chorus-codes 0.7.0 → 0.7.1
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/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/cache/.previewinfo +1 -1
- package/.next/cache/.rscinfo +1 -1
- package/.next/fallback-build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.html +1 -1
- package/.next/server/app/new.rsc +1 -1
- package/.next/server/app/new.segments/_full.segment.rsc +1 -1
- package/.next/server/app/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/new.segments/_index.segment.rsc +1 -1
- package/.next/server/app/new.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/new.segments/new.segment.rsc +1 -1
- package/.next/server/app/onboarding.html +1 -1
- package/.next/server/app/onboarding.rsc +1 -1
- package/.next/server/app/onboarding.segments/_full.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_index.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/.next/server/app/personas.html +1 -1
- package/.next/server/app/personas.rsc +1 -1
- package/.next/server/app/personas.segments/_full.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_index.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +1 -1
- package/.next/server/app/settings.segments/_full.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/templates.html +1 -1
- package/.next/server/app/templates.rsc +1 -1
- package/.next/server/app/templates.segments/_full.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_index.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
- package/.next/server/middleware-build-manifest.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/trace +1 -1
- package/.next/trace-build +1 -1
- package/dist/cli/commands/doctor.js +116 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.js +211 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.js +240 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.js +97 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/connect.js +108 -0
- package/dist/cli/connect.js.map +1 -0
- package/dist/cli/index.js +99 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/port-utils.js +260 -0
- package/dist/cli/port-utils.js.map +1 -0
- package/dist/cli/runtime-env.js +60 -0
- package/dist/cli/runtime-env.js.map +1 -0
- package/dist/cli/shared.js +54 -0
- package/dist/cli/shared.js.map +1 -0
- package/dist/cli/ui.js +60 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/daemon/agents/claude.js +98 -0
- package/dist/daemon/agents/claude.js.map +1 -0
- package/dist/daemon/agents/codex.js +160 -0
- package/dist/daemon/agents/codex.js.map +1 -0
- package/dist/daemon/agents/gemini.js +111 -0
- package/dist/daemon/agents/gemini.js.map +1 -0
- package/dist/daemon/agents/index.js +59 -0
- package/dist/daemon/agents/index.js.map +1 -0
- package/dist/daemon/agents/kimi.js +206 -0
- package/dist/daemon/agents/kimi.js.map +1 -0
- package/dist/daemon/agents/opencode.js +228 -0
- package/dist/daemon/agents/opencode.js.map +1 -0
- package/dist/daemon/agents/openrouter.js +274 -0
- package/dist/daemon/agents/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/claude.js +63 -0
- package/dist/daemon/agents/parsers/claude.js.map +1 -0
- package/dist/daemon/agents/parsers/codex.js +51 -0
- package/dist/daemon/agents/parsers/codex.js.map +1 -0
- package/dist/daemon/agents/parsers/gemini.js +144 -0
- package/dist/daemon/agents/parsers/gemini.js.map +1 -0
- package/dist/daemon/agents/parsers/index.js +31 -0
- package/dist/daemon/agents/parsers/index.js.map +1 -0
- package/dist/daemon/agents/parsers/kimi.js +8 -0
- package/dist/daemon/agents/parsers/kimi.js.map +1 -0
- package/dist/daemon/agents/parsers/opencode.js +105 -0
- package/dist/daemon/agents/parsers/opencode.js.map +1 -0
- package/dist/daemon/agents/parsers/openrouter.js +69 -0
- package/dist/daemon/agents/parsers/openrouter.js.map +1 -0
- package/dist/daemon/agents/parsers/shared.js +17 -0
- package/dist/daemon/agents/parsers/shared.js.map +1 -0
- package/dist/daemon/agents/preflight.js +83 -0
- package/dist/daemon/agents/preflight.js.map +1 -0
- package/dist/daemon/agents/quote.js +45 -0
- package/dist/daemon/agents/quote.js.map +1 -0
- package/dist/daemon/agents/sandbox-guard.js +69 -0
- package/dist/daemon/agents/sandbox-guard.js.map +1 -0
- package/dist/daemon/agents/types.js +6 -0
- package/dist/daemon/agents/types.js.map +1 -0
- package/dist/daemon/api-response.js +65 -0
- package/dist/daemon/api-response.js.map +1 -0
- package/dist/daemon/error-detector.js +329 -0
- package/dist/daemon/error-detector.js.map +1 -0
- package/dist/daemon/headless.js +533 -0
- package/dist/daemon/headless.js.map +1 -0
- package/dist/daemon/index.js +333 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/openrouter.js +192 -0
- package/dist/daemon/openrouter.js.map +1 -0
- package/dist/daemon/orchestrators/claude.js +163 -0
- package/dist/daemon/orchestrators/claude.js.map +1 -0
- package/dist/daemon/orchestrators/codex.js +101 -0
- package/dist/daemon/orchestrators/codex.js.map +1 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js +118 -0
- package/dist/daemon/orchestrators/cursor-windsurf.js.map +1 -0
- package/dist/daemon/orchestrators/gemini.js +108 -0
- package/dist/daemon/orchestrators/gemini.js.map +1 -0
- package/dist/daemon/orchestrators/index.js +90 -0
- package/dist/daemon/orchestrators/index.js.map +1 -0
- package/dist/daemon/orchestrators/kimi.js +108 -0
- package/dist/daemon/orchestrators/kimi.js.map +1 -0
- package/dist/daemon/orchestrators/opencode.js +152 -0
- package/dist/daemon/orchestrators/opencode.js.map +1 -0
- package/dist/daemon/orchestrators/shared.js +60 -0
- package/dist/daemon/orchestrators/shared.js.map +1 -0
- package/dist/daemon/output-watcher.js +131 -0
- package/dist/daemon/output-watcher.js.map +1 -0
- package/dist/daemon/participant-aborts.js +123 -0
- package/dist/daemon/participant-aborts.js.map +1 -0
- package/dist/daemon/reaper.js +46 -0
- package/dist/daemon/reaper.js.map +1 -0
- package/dist/daemon/routes/chats-events.js +62 -0
- package/dist/daemon/routes/chats-events.js.map +1 -0
- package/dist/daemon/routes/chats-stream.js +241 -0
- package/dist/daemon/routes/chats-stream.js.map +1 -0
- package/dist/daemon/routes/chats-validation.js +13 -0
- package/dist/daemon/routes/chats-validation.js.map +1 -0
- package/dist/daemon/routes/chats.js +545 -0
- package/dist/daemon/routes/chats.js.map +1 -0
- package/dist/daemon/routes/openrouter.js +103 -0
- package/dist/daemon/routes/openrouter.js.map +1 -0
- package/dist/daemon/routes/settings.js +199 -0
- package/dist/daemon/routes/settings.js.map +1 -0
- package/dist/daemon/routes/stats.js +155 -0
- package/dist/daemon/routes/stats.js.map +1 -0
- package/dist/daemon/routes/system.js +208 -0
- package/dist/daemon/routes/system.js.map +1 -0
- package/dist/daemon/routes/templates-personas.js +254 -0
- package/dist/daemon/routes/templates-personas.js.map +1 -0
- package/dist/daemon/routes/voices.js +139 -0
- package/dist/daemon/routes/voices.js.map +1 -0
- package/dist/daemon/runner/doer-driver.js +346 -0
- package/dist/daemon/runner/doer-driver.js.map +1 -0
- package/dist/daemon/runner/doer.js +336 -0
- package/dist/daemon/runner/doer.js.map +1 -0
- package/dist/daemon/runner/prior-round.js +140 -0
- package/dist/daemon/runner/prior-round.js.map +1 -0
- package/dist/daemon/runner/prompt-builder.js +292 -0
- package/dist/daemon/runner/prompt-builder.js.map +1 -0
- package/dist/daemon/runner/review-only-phase.js +103 -0
- package/dist/daemon/runner/review-only-phase.js.map +1 -0
- package/dist/daemon/runner/reviewer-driver.js +410 -0
- package/dist/daemon/runner/reviewer-driver.js.map +1 -0
- package/dist/daemon/runner/reviewer.js +384 -0
- package/dist/daemon/runner/reviewer.js.map +1 -0
- package/dist/daemon/runner/run-with-fallback.js +56 -0
- package/dist/daemon/runner/run-with-fallback.js.map +1 -0
- package/dist/daemon/runner/sanitize-name.js +8 -0
- package/dist/daemon/runner/sanitize-name.js.map +1 -0
- package/dist/daemon/runner/stream-file-writer.js +116 -0
- package/dist/daemon/runner/stream-file-writer.js.map +1 -0
- package/dist/daemon/runner/swap-sidecar.js +102 -0
- package/dist/daemon/runner/swap-sidecar.js.map +1 -0
- package/dist/daemon/runner/template-fallback.js +119 -0
- package/dist/daemon/runner/template-fallback.js.map +1 -0
- package/dist/daemon/runner/types.js +3 -0
- package/dist/daemon/runner/types.js.map +1 -0
- package/dist/daemon/runner/verdict.js +51 -0
- package/dist/daemon/runner/verdict.js.map +1 -0
- package/dist/daemon/runner-multiplex.js +364 -0
- package/dist/daemon/runner-multiplex.js.map +1 -0
- package/dist/daemon/runner.js +427 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/ship.js +340 -0
- package/dist/daemon/ship.js.map +1 -0
- package/dist/daemon/template-cache.js +37 -0
- package/dist/daemon/template-cache.js.map +1 -0
- package/dist/daemon/tmux-types.js +9 -0
- package/dist/daemon/tmux-types.js.map +1 -0
- package/dist/daemon/tmux.js +341 -0
- package/dist/daemon/tmux.js.map +1 -0
- package/dist/lib/atomic-write.js +55 -0
- package/dist/lib/atomic-write.js.map +1 -0
- package/dist/lib/chat-events-bus.js +27 -0
- package/dist/lib/chat-events-bus.js.map +1 -0
- package/dist/lib/chat-slug.js +105 -0
- package/dist/lib/chat-slug.js.map +1 -0
- package/dist/lib/cli-detect.js +388 -0
- package/dist/lib/cli-detect.js.map +1 -0
- package/dist/lib/cli-health.js +156 -0
- package/dist/lib/cli-health.js.map +1 -0
- package/dist/lib/cli-paths.js +113 -0
- package/dist/lib/cli-paths.js.map +1 -0
- package/dist/lib/cli-precheck.js +141 -0
- package/dist/lib/cli-precheck.js.map +1 -0
- package/dist/lib/db/chats.js +244 -0
- package/dist/lib/db/chats.js.map +1 -0
- package/dist/lib/db/connection.js +254 -0
- package/dist/lib/db/connection.js.map +1 -0
- package/dist/lib/db/index.js +34 -0
- package/dist/lib/db/index.js.map +1 -0
- package/dist/lib/db/personas.js +65 -0
- package/dist/lib/db/personas.js.map +1 -0
- package/dist/lib/db/phase-events.js +172 -0
- package/dist/lib/db/phase-events.js.map +1 -0
- package/dist/lib/db/secrets.js +53 -0
- package/dist/lib/db/secrets.js.map +1 -0
- package/dist/lib/db/settings.js +47 -0
- package/dist/lib/db/settings.js.map +1 -0
- package/dist/lib/db/templates.js +75 -0
- package/dist/lib/db/templates.js.map +1 -0
- package/dist/lib/db/voices.js +184 -0
- package/dist/lib/db/voices.js.map +1 -0
- package/dist/lib/lineage-maps.js +200 -0
- package/dist/lib/lineage-maps.js.map +1 -0
- package/dist/lib/logger.js +186 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/personas.js +117 -0
- package/dist/lib/personas.js.map +1 -0
- package/dist/lib/runtime-path.js +222 -0
- package/dist/lib/runtime-path.js.map +1 -0
- package/dist/lib/settings/billing.js +58 -0
- package/dist/lib/settings/billing.js.map +1 -0
- package/dist/lib/settings/permissions.js +81 -0
- package/dist/lib/settings/permissions.js.map +1 -0
- package/dist/lib/settings/transport.js +113 -0
- package/dist/lib/settings/transport.js.map +1 -0
- package/dist/lib/telemetry.js +290 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/template-schema.js +319 -0
- package/dist/lib/template-schema.js.map +1 -0
- package/dist/lib/template-validation.js +82 -0
- package/dist/lib/template-validation.js.map +1 -0
- package/dist/lib/voices.js +533 -0
- package/dist/lib/voices.js.map +1 -0
- package/dist/mcp/client.js +138 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/index.js +178 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.js +355 -0
- package/dist/mcp/tools.js.map +1 -0
- package/package.json +2 -1
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js +0 -6077
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0beh7rg._.js.map +0 -69
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js +0 -6318
- package/.next/dev/static/chunks/05w9_next_dist_shared_lib_0pjsj.j._.js.map +0 -71
- package/.next/dev/types/cache-life.d.ts +0 -145
- package/.next/dev/types/routes.d.ts +0 -84
- package/.next/dev/types/validator.ts +0 -178
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 8H2I8TTPlrKuWCV-SxY5f}/_buildManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 8H2I8TTPlrKuWCV-SxY5f}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{dJlbRLlhISA0JGtHKVqgQ → 8H2I8TTPlrKuWCV-SxY5f}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.isValidChatId = void 0;
|
|
40
|
+
exports.registerChatRoutes = registerChatRoutes;
|
|
41
|
+
const fs_1 = __importDefault(require("fs"));
|
|
42
|
+
const path_1 = __importDefault(require("path"));
|
|
43
|
+
const yaml_1 = __importDefault(require("yaml"));
|
|
44
|
+
const index_js_1 = require("../../lib/db/index.js");
|
|
45
|
+
const logger_js_1 = require("../../lib/logger.js");
|
|
46
|
+
const template_schema_js_1 = require("../../lib/template-schema.js");
|
|
47
|
+
const api_response_js_1 = require("../api-response.js");
|
|
48
|
+
const participantAborts = __importStar(require("../participant-aborts.js"));
|
|
49
|
+
const runner_multiplex_js_1 = require("../runner-multiplex.js");
|
|
50
|
+
const chats_stream_js_1 = require("./chats-stream.js");
|
|
51
|
+
const chats_validation_js_1 = require("./chats-validation.js");
|
|
52
|
+
Object.defineProperty(exports, "isValidChatId", { enumerable: true, get: function () { return chats_validation_js_1.isValidChatId; } });
|
|
53
|
+
const TERMINAL_STATUSES = [
|
|
54
|
+
'approved',
|
|
55
|
+
'merged',
|
|
56
|
+
'blocked',
|
|
57
|
+
'cancelled',
|
|
58
|
+
'failed',
|
|
59
|
+
'no_review',
|
|
60
|
+
];
|
|
61
|
+
const VALID_PHASE_KINDS = [
|
|
62
|
+
'plan',
|
|
63
|
+
'spec',
|
|
64
|
+
'tests',
|
|
65
|
+
'implement',
|
|
66
|
+
'review',
|
|
67
|
+
'verify',
|
|
68
|
+
'divergence',
|
|
69
|
+
];
|
|
70
|
+
function registerChatRoutes(fastify, { tmuxMgr, errorDetector }) {
|
|
71
|
+
fastify.get('/chats', async (request) => {
|
|
72
|
+
try {
|
|
73
|
+
const { status, limit, offset } = request.query;
|
|
74
|
+
const list = await index_js_1.chats.list({
|
|
75
|
+
status: status || undefined,
|
|
76
|
+
limit: limit ? parseInt(limit, 10) : undefined,
|
|
77
|
+
offset: offset ? parseInt(offset, 10) : undefined,
|
|
78
|
+
});
|
|
79
|
+
return (0, api_response_js_1.successResponse)((0, api_response_js_1.listEnvelope)(list));
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
83
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
fastify.get('/chats/:id', async (request, reply) => {
|
|
87
|
+
try {
|
|
88
|
+
if (!(0, chats_validation_js_1.isValidChatId)(request.params.id)) {
|
|
89
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
|
|
90
|
+
}
|
|
91
|
+
const chat = await index_js_1.chats.getBySlugOrId(request.params.id);
|
|
92
|
+
if (!chat) {
|
|
93
|
+
return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${request.params.id} not found`);
|
|
94
|
+
}
|
|
95
|
+
// phaseEvents.list keys by ULID, not slug. Use the resolved row's
|
|
96
|
+
// id so a /chats/<slug> request returns events correctly.
|
|
97
|
+
const events = await index_js_1.phaseEvents.list(chat.id);
|
|
98
|
+
return (0, api_response_js_1.successResponse)({ ...chat, events });
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
102
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
fastify.post('/chats', async (request, reply) => {
|
|
106
|
+
try {
|
|
107
|
+
const { work, templateId, files, repoPath, artifact, yolo } = request.body;
|
|
108
|
+
if (!work || !templateId) {
|
|
109
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'work and templateId are required');
|
|
110
|
+
}
|
|
111
|
+
// Validate repoPath — must be an absolute path to an existing
|
|
112
|
+
// directory.
|
|
113
|
+
//
|
|
114
|
+
// Symlink handling (Audit D2 BLOCKER): pre-fix `existsSync`
|
|
115
|
+
// followed symlinks silently, so a `repoPath` pointing at
|
|
116
|
+
// `~/innocent-link → /etc` would pass and the doer would spawn
|
|
117
|
+
// with `cwd=/etc`. We realpath-resolve and re-check the target
|
|
118
|
+
// is a directory. Storing the canonical path means a later swap
|
|
119
|
+
// of the symlink can't redirect the doer.
|
|
120
|
+
//
|
|
121
|
+
// Stricter checks (is-a-repo, gh-authed) happen when the ship
|
|
122
|
+
// phase runs.
|
|
123
|
+
// Resolve `repoPath` to its canonical (symlink-followed) form once
|
|
124
|
+
// so we can persist the canonical path on the chat row. Pre-fix
|
|
125
|
+
// we validated via realpath but stored the original `repoPath`,
|
|
126
|
+
// leaving the symlink-swap attack surface from Audit D2 partially
|
|
127
|
+
// open: a later swap of `~/innocent-link → /etc` would still
|
|
128
|
+
// redirect the runner. `canonicalRepoPath` is undefined when no
|
|
129
|
+
// repoPath was supplied — the chat creates without one.
|
|
130
|
+
let canonicalRepoPath;
|
|
131
|
+
if (repoPath !== undefined) {
|
|
132
|
+
if (typeof repoPath !== 'string' || !path_1.default.isAbsolute(repoPath)) {
|
|
133
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'repoPath must be an absolute path');
|
|
134
|
+
}
|
|
135
|
+
const resolved = path_1.default.resolve(repoPath);
|
|
136
|
+
try {
|
|
137
|
+
// realpathSync resolves symlinks AND verifies the path
|
|
138
|
+
// exists. Throws ENOENT if either link or target is missing.
|
|
139
|
+
canonicalRepoPath = fs_1.default.realpathSync(resolved);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', `repoPath does not exist: ${resolved}`);
|
|
143
|
+
}
|
|
144
|
+
let stat;
|
|
145
|
+
try {
|
|
146
|
+
stat = fs_1.default.statSync(canonicalRepoPath);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', `repoPath does not exist: ${canonicalRepoPath}`);
|
|
150
|
+
}
|
|
151
|
+
if (!stat.isDirectory()) {
|
|
152
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', `repoPath must be a directory: ${canonicalRepoPath}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// C4 — template existence check is the daemon-side invariant (the
|
|
156
|
+
// MCP layer also validates, but only this check is authoritative).
|
|
157
|
+
// Pre-fix, an unknown templateId silently fell through to chat
|
|
158
|
+
// creation and the runner stalled looking up a row that didn't
|
|
159
|
+
// exist; the user saw a chat stuck in 'drafting' forever.
|
|
160
|
+
const tmpl = await index_js_1.templates.getById(templateId);
|
|
161
|
+
if (!tmpl) {
|
|
162
|
+
const valid = (await index_js_1.templates.list()).map((t) => t.id);
|
|
163
|
+
return (0, api_response_js_1.sendError)(reply, 'not_found', `Unknown templateId "${templateId}". Valid IDs: ${valid.join(', ')}`, { validIds: valid });
|
|
164
|
+
}
|
|
165
|
+
// Parse the template up-front so we can branch on review-only vs
|
|
166
|
+
// standard. Two reads of the same template are tolerable (this
|
|
167
|
+
// path is request-scoped, not hot); the alternative is hand-rolling
|
|
168
|
+
// YAML parsing twice in the same handler.
|
|
169
|
+
let initialPhaseKind = 'plan';
|
|
170
|
+
let parsedTemplateForArtifactCheck = null;
|
|
171
|
+
try {
|
|
172
|
+
const rawParsed = yaml_1.default.parse(tmpl.yaml);
|
|
173
|
+
const safe = template_schema_js_1.TemplateSchema.safeParse(rawParsed);
|
|
174
|
+
if (safe.success) {
|
|
175
|
+
parsedTemplateForArtifactCheck = safe.data;
|
|
176
|
+
const firstKind = safe.data.phases[0]?.kind;
|
|
177
|
+
initialPhaseKind = firstKind;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// Fall back to a loose read so older malformed templates
|
|
181
|
+
// still produce an initial event with their declared kind.
|
|
182
|
+
const loose = rawParsed;
|
|
183
|
+
const firstKind = loose?.phases?.[0]?.kind;
|
|
184
|
+
if (firstKind === 'review_only')
|
|
185
|
+
initialPhaseKind = 'review_only';
|
|
186
|
+
else if (typeof firstKind === 'string' &&
|
|
187
|
+
VALID_PHASE_KINDS.includes(firstKind)) {
|
|
188
|
+
initialPhaseKind = firstKind;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
/* fall through with 'plan' default */
|
|
194
|
+
}
|
|
195
|
+
// Artifact validation — only meaningful for review-only templates.
|
|
196
|
+
if (parsedTemplateForArtifactCheck &&
|
|
197
|
+
(0, template_schema_js_1.templateRequiresArtifact)(parsedTemplateForArtifactCheck)) {
|
|
198
|
+
if (typeof artifact !== 'string' || artifact.trim().length === 0) {
|
|
199
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'artifact is required for review-only templates');
|
|
200
|
+
}
|
|
201
|
+
const firstPhase = parsedTemplateForArtifactCheck.phases[0];
|
|
202
|
+
if (firstPhase && (0, template_schema_js_1.isReviewOnlyPhase)(firstPhase)) {
|
|
203
|
+
const maxBytes = firstPhase.artifact.maxBytes;
|
|
204
|
+
const byteLen = Buffer.byteLength(artifact, 'utf-8');
|
|
205
|
+
if (byteLen > maxBytes) {
|
|
206
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', `artifact exceeds template limit (${byteLen} bytes > ${maxBytes} bytes)`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (artifact !== undefined && artifact !== null && artifact !== '') {
|
|
211
|
+
// Non-review-only templates: artifact is meaningless. Reject
|
|
212
|
+
// loudly so callers don't silently lose payload (e.g. mistyped
|
|
213
|
+
// templateId pointing at a full-pipeline template).
|
|
214
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'artifact is only valid for review-only templates');
|
|
215
|
+
}
|
|
216
|
+
const chat = await index_js_1.chats.create({
|
|
217
|
+
work,
|
|
218
|
+
template_id: templateId,
|
|
219
|
+
attached_files: files ? JSON.stringify(files) : undefined,
|
|
220
|
+
// Persist the canonical (realpath-resolved) repo path so a
|
|
221
|
+
// later swap of an intermediate symlink can't redirect the
|
|
222
|
+
// doer's cwd. See Audit D2 BLOCKER for the attack scenario.
|
|
223
|
+
repo_path: canonicalRepoPath,
|
|
224
|
+
artifact: artifact ?? undefined,
|
|
225
|
+
yolo: yolo === true,
|
|
226
|
+
});
|
|
227
|
+
await index_js_1.phaseEvents.create({
|
|
228
|
+
chat_id: chat.id,
|
|
229
|
+
phase_idx: 0,
|
|
230
|
+
phase_kind: initialPhaseKind,
|
|
231
|
+
role: 'doer',
|
|
232
|
+
agent_id: null,
|
|
233
|
+
state: 'drafting',
|
|
234
|
+
output: null,
|
|
235
|
+
cost_usd: 0,
|
|
236
|
+
tokens_in: 0,
|
|
237
|
+
tokens_out: 0,
|
|
238
|
+
started_at: Date.now(),
|
|
239
|
+
finished_at: null,
|
|
240
|
+
});
|
|
241
|
+
(0, logger_js_1.chatLogger)(chat.id).info({
|
|
242
|
+
templateId,
|
|
243
|
+
phaseKind: initialPhaseKind,
|
|
244
|
+
requestId: request.id,
|
|
245
|
+
hasArtifact: artifact !== undefined && artifact !== null && artifact !== '',
|
|
246
|
+
hasRepoPath: repoPath !== undefined,
|
|
247
|
+
attachedFileCount: files?.length ?? 0,
|
|
248
|
+
}, 'chat created');
|
|
249
|
+
// Auto-fire the runner. Earlier code left chats inert until a
|
|
250
|
+
// client hit /chats/:id/stream — fine for the cockpit (the run
|
|
251
|
+
// page subscribes on open), but the MCP path (autonomous batch
|
|
252
|
+
// reviews, scripts) had no way to trigger the run without a curl-
|
|
253
|
+
// trigger workaround. Fire-and-forget; the SSE route still attaches
|
|
254
|
+
// to the existing activeRuns entry rather than re-creating one.
|
|
255
|
+
//
|
|
256
|
+
// Skip when:
|
|
257
|
+
// - template parsing failed (nothing valid to run)
|
|
258
|
+
// - chat is already in a terminal state (defensive — a fresh
|
|
259
|
+
// row should always be drafting; rules out manual DB seeds and
|
|
260
|
+
// replay bugs)
|
|
261
|
+
//
|
|
262
|
+
// `yolo: false` is NOT checked because chat.status has no
|
|
263
|
+
// pre-run/pending state to pause at — yolo today only gates ship.
|
|
264
|
+
if (parsedTemplateForArtifactCheck &&
|
|
265
|
+
!TERMINAL_STATUSES.includes(chat.status)) {
|
|
266
|
+
// Chain `.catch` so an async rejection inside runChat doesn't
|
|
267
|
+
// escape as an unhandled promise rejection (Node.js >= 15
|
|
268
|
+
// terminates the process on those).
|
|
269
|
+
const entry = (0, runner_multiplex_js_1.runWithMultiplex)({
|
|
270
|
+
chatId: chat.id,
|
|
271
|
+
template: parsedTemplateForArtifactCheck,
|
|
272
|
+
chat,
|
|
273
|
+
tmuxMgr,
|
|
274
|
+
errorDetector,
|
|
275
|
+
});
|
|
276
|
+
entry.promise.catch((err) => {
|
|
277
|
+
(0, logger_js_1.chatLogger)(chat.id).error({ err: err instanceof Error ? err.message : String(err) }, 'auto-fired chat runner failed');
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return (0, api_response_js_1.successResponse)(chat);
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
284
|
+
logger_js_1.logger.error({ requestId: request.id, err: message, route: 'POST /chats' }, 'chat create failed');
|
|
285
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
fastify.post('/chats/:id/cancel', async (request, reply) => {
|
|
289
|
+
try {
|
|
290
|
+
const param = request.params.id;
|
|
291
|
+
if (!(0, chats_validation_js_1.isValidChatId)(param)) {
|
|
292
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
|
|
293
|
+
}
|
|
294
|
+
// Resolve slug → ULID first. Cancel/abort/tmux all key by ULID.
|
|
295
|
+
const existing = await index_js_1.chats.getBySlugOrId(param);
|
|
296
|
+
if (!existing) {
|
|
297
|
+
return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${param} not found`);
|
|
298
|
+
}
|
|
299
|
+
const chatId = existing.id;
|
|
300
|
+
const chat = await index_js_1.chats.cancel(chatId);
|
|
301
|
+
// Abort the active runner if there is one. This propagates into
|
|
302
|
+
// the runChat abortListener which fires chat_done(cancelled) once
|
|
303
|
+
// (latched by emitChatDone) — including killing any LLM CLI
|
|
304
|
+
// subprocesses via their AbortSignal. Without this, cancel only
|
|
305
|
+
// flipped the DB row and the runner kept burning tokens until
|
|
306
|
+
// natural termination.
|
|
307
|
+
(0, runner_multiplex_js_1.abortActiveRun)(chatId);
|
|
308
|
+
// Kill any tmux sessions associated with this chat (legacy transport).
|
|
309
|
+
const allSessions = tmuxMgr.list();
|
|
310
|
+
for (const session of allSessions) {
|
|
311
|
+
if (session.chatId === chatId) {
|
|
312
|
+
tmuxMgr.kill(session.name);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return (0, api_response_js_1.successResponse)(chat);
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
319
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
// Cancel a single participant (one reviewer or the doer) without
|
|
323
|
+
// collapsing the entire chat. Useful when one runner is stuck or the
|
|
324
|
+
// user wants to drop a low-value reviewer mid-flight.
|
|
325
|
+
//
|
|
326
|
+
// Path: POST /chats/:id/participants/:key/cancel
|
|
327
|
+
// `key` matches participantAborts.participantKey:
|
|
328
|
+
// `doer-<agentName>` or `reviewer-<agentName>-<idx>`
|
|
329
|
+
//
|
|
330
|
+
// Returns ok:true{aborted:bool}. aborted=false means the participant
|
|
331
|
+
// wasn't found in the registry (already finished, not yet started, or
|
|
332
|
+
// running on the legacy tmux transport which doesn't register).
|
|
333
|
+
fastify.post('/chats/:id/participants/:key/cancel', async (request, reply) => {
|
|
334
|
+
try {
|
|
335
|
+
const id = request.params.id;
|
|
336
|
+
if (!(0, chats_validation_js_1.isValidChatId)(id)) {
|
|
337
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
|
|
338
|
+
}
|
|
339
|
+
const key = request.params.key;
|
|
340
|
+
// Strict key shape — both prefixes the registry uses. Reject
|
|
341
|
+
// unrecognised shapes so a malformed URL can't side-channel
|
|
342
|
+
// arbitrary registry inspection by guessing keys. The agent name
|
|
343
|
+
// MUST start with an alphanumeric (not `-`/`_`) so a key like
|
|
344
|
+
// `reviewer--0` (empty agent name) is rejected.
|
|
345
|
+
if (!/^(doer-|reviewer-)[A-Za-z0-9][A-Za-z0-9_-]*(?:-\d+)?$/.test(key)) {
|
|
346
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid participant key');
|
|
347
|
+
}
|
|
348
|
+
const existing = await index_js_1.chats.getBySlugOrId(id);
|
|
349
|
+
if (!existing) {
|
|
350
|
+
return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${id} not found`);
|
|
351
|
+
}
|
|
352
|
+
const aborted = participantAborts.abortParticipant(existing.id, key);
|
|
353
|
+
return (0, api_response_js_1.successResponse)({ aborted });
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
357
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
358
|
+
}
|
|
359
|
+
});
|
|
360
|
+
// Re-run an existing chat. Creates a fresh chat row carrying over the
|
|
361
|
+
// same work + template_id + attached_files + repo_path + artifact, plus
|
|
362
|
+
// an initial phase event mirroring /chats POST. Intended for the
|
|
363
|
+
// cancelled/failed → Retry button on the run viewer; the original chat
|
|
364
|
+
// row stays untouched as history.
|
|
365
|
+
fastify.post('/chats/:id/rerun', async (request, reply) => {
|
|
366
|
+
try {
|
|
367
|
+
const param = request.params.id;
|
|
368
|
+
if (!(0, chats_validation_js_1.isValidChatId)(param)) {
|
|
369
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
|
|
370
|
+
}
|
|
371
|
+
const original = await index_js_1.chats.getBySlugOrId(param);
|
|
372
|
+
if (!original) {
|
|
373
|
+
return (0, api_response_js_1.sendError)(reply, 'not_found', `Chat ${param} not found`);
|
|
374
|
+
}
|
|
375
|
+
// Guard against rerun-on-active. The cockpit Retry button only
|
|
376
|
+
// renders for terminal statuses, but a direct API call could
|
|
377
|
+
// otherwise spawn a duplicate runner alongside the still-alive
|
|
378
|
+
// original. Reject loudly with a dedicated kind so the caller can
|
|
379
|
+
// distinguish from generic validation.
|
|
380
|
+
if (!TERMINAL_STATUSES.includes(original.status)) {
|
|
381
|
+
return (0, api_response_js_1.sendError)(reply, 'conflict', `Chat ${param} is still active (status=${original.status}). Cancel it first, then retry.`);
|
|
382
|
+
}
|
|
383
|
+
// Re-realpath on rerun even though create-side now persists the
|
|
384
|
+
// canonical path. Catches legacy rows from before that fix shipped
|
|
385
|
+
// AND defends against a swap that happened between the original
|
|
386
|
+
// chat's success and the rerun click.
|
|
387
|
+
let rerunRepoPath = original.repo_path ?? undefined;
|
|
388
|
+
if (rerunRepoPath) {
|
|
389
|
+
try {
|
|
390
|
+
rerunRepoPath = fs_1.default.realpathSync(rerunRepoPath);
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
// Original path no longer resolves — skip the rerun's repoPath
|
|
394
|
+
// rather than silently shipping with a broken cwd.
|
|
395
|
+
rerunRepoPath = undefined;
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
const newChat = await index_js_1.chats.create({
|
|
399
|
+
work: original.work,
|
|
400
|
+
template_id: original.template_id,
|
|
401
|
+
attached_files: original.attached_files ?? undefined,
|
|
402
|
+
repo_path: rerunRepoPath,
|
|
403
|
+
artifact: original.artifact ?? undefined,
|
|
404
|
+
});
|
|
405
|
+
// Mirror the create-path's initial phase_event so the cockpit
|
|
406
|
+
// gets a populated stepper from t=0.
|
|
407
|
+
let initialPhaseKind = 'plan';
|
|
408
|
+
try {
|
|
409
|
+
const tmpl = await index_js_1.templates.getById(original.template_id);
|
|
410
|
+
if (tmpl) {
|
|
411
|
+
const safe = template_schema_js_1.TemplateSchema.safeParse(yaml_1.default.parse(tmpl.yaml));
|
|
412
|
+
if (safe.success) {
|
|
413
|
+
const firstKind = safe.data.phases[0]?.kind;
|
|
414
|
+
if (firstKind)
|
|
415
|
+
initialPhaseKind = firstKind;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
/* keep default */
|
|
421
|
+
}
|
|
422
|
+
await index_js_1.phaseEvents.create({
|
|
423
|
+
chat_id: newChat.id,
|
|
424
|
+
phase_idx: 0,
|
|
425
|
+
phase_kind: initialPhaseKind,
|
|
426
|
+
role: 'doer',
|
|
427
|
+
agent_id: null,
|
|
428
|
+
state: 'drafting',
|
|
429
|
+
output: null,
|
|
430
|
+
cost_usd: 0,
|
|
431
|
+
tokens_in: 0,
|
|
432
|
+
tokens_out: 0,
|
|
433
|
+
started_at: Date.now(),
|
|
434
|
+
finished_at: null,
|
|
435
|
+
});
|
|
436
|
+
return (0, api_response_js_1.successResponse)(newChat);
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
440
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
441
|
+
}
|
|
442
|
+
});
|
|
443
|
+
// Hard-delete a chat (row + phase_events + filesystem artifacts).
|
|
444
|
+
// Cancels any active session first to avoid orphaned subprocesses
|
|
445
|
+
// writing to the dir we're about to nuke. Idempotent: returns 200
|
|
446
|
+
// even if the chat is already gone (allows the cockpit to retry
|
|
447
|
+
// without distinguishing races).
|
|
448
|
+
fastify.delete('/chats/:id', async (request, reply) => {
|
|
449
|
+
try {
|
|
450
|
+
const id = request.params.id;
|
|
451
|
+
if (!(0, chats_validation_js_1.isValidChatId)(id)) {
|
|
452
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
|
|
453
|
+
}
|
|
454
|
+
const existing = await index_js_1.chats.getBySlugOrId(id);
|
|
455
|
+
if (!existing) {
|
|
456
|
+
return (0, api_response_js_1.successResponse)({ id, deleted: false, reason: 'not_found' });
|
|
457
|
+
}
|
|
458
|
+
// Resolve to the row's authoritative ULID — every downstream key
|
|
459
|
+
// (activeRuns, tmux sessions, phase_events, chat dir on disk)
|
|
460
|
+
// uses the ULID, not the slug. Without this, the route partly
|
|
461
|
+
// worked when called by slug but failed to abort the runner /
|
|
462
|
+
// kill tmux.
|
|
463
|
+
const ulid = existing.id;
|
|
464
|
+
// 1. Cancel first if still active — flips status, signals abort.
|
|
465
|
+
if (existing.status === 'drafting' || existing.status === 'reviewing') {
|
|
466
|
+
try {
|
|
467
|
+
await index_js_1.chats.cancel(ulid);
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
/* best-effort */
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
// 1b. Abort the in-memory runner if one is active. Otherwise the
|
|
474
|
+
// runner could keep streaming events and write to a chat dir
|
|
475
|
+
// that we're about to rm -rf, plus it would re-create the row.
|
|
476
|
+
const active = (0, runner_multiplex_js_1.getActiveRun)(ulid);
|
|
477
|
+
if (active) {
|
|
478
|
+
active.abortController.abort();
|
|
479
|
+
// Wait for the runner to settle before proceeding with the
|
|
480
|
+
// delete. 5-second timeout to avoid hanging forever.
|
|
481
|
+
try {
|
|
482
|
+
await Promise.race([
|
|
483
|
+
active.promise.catch(() => { }),
|
|
484
|
+
new Promise((r) => setTimeout(r, 5000)),
|
|
485
|
+
]);
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
/* timeout or error — proceed with delete anyway */
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
// 2. Kill any tmux sessions tied to this chat.
|
|
492
|
+
try {
|
|
493
|
+
const allSessions = tmuxMgr.list();
|
|
494
|
+
for (const session of allSessions) {
|
|
495
|
+
if (session.chatId === ulid)
|
|
496
|
+
tmuxMgr.kill(session.name);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
/* tmuxMgr may not be ready in test paths */
|
|
501
|
+
}
|
|
502
|
+
// 3. Drop DB row + phase events.
|
|
503
|
+
await index_js_1.chats.delete(ulid);
|
|
504
|
+
// 4. Nuke chat artifacts directory.
|
|
505
|
+
const osModule = await import('os');
|
|
506
|
+
const chatDir = path_1.default.join(osModule.homedir(), '.chorus', 'chats', ulid);
|
|
507
|
+
if (fs_1.default.existsSync(chatDir)) {
|
|
508
|
+
try {
|
|
509
|
+
fs_1.default.rmSync(chatDir, { recursive: true, force: true });
|
|
510
|
+
}
|
|
511
|
+
catch (err) {
|
|
512
|
+
// Don't fail the request — DB row is already gone, dir is
|
|
513
|
+
// just disk-space cleanup.
|
|
514
|
+
console.warn(`[chorus] failed to remove ${chatDir}:`, err);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
return (0, api_response_js_1.successResponse)({ id: ulid, deleted: true });
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
521
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
522
|
+
}
|
|
523
|
+
});
|
|
524
|
+
// Resume — answer a blocking question.
|
|
525
|
+
fastify.post('/chats/:id/resume', async (request, reply) => {
|
|
526
|
+
try {
|
|
527
|
+
const chatId = request.params.id;
|
|
528
|
+
if (!(0, chats_validation_js_1.isValidChatId)(chatId)) {
|
|
529
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'invalid chat id');
|
|
530
|
+
}
|
|
531
|
+
const { answer } = request.body;
|
|
532
|
+
if (!answer) {
|
|
533
|
+
return (0, api_response_js_1.sendError)(reply, 'validation', 'answer is required');
|
|
534
|
+
}
|
|
535
|
+
const chat = await index_js_1.chats.update(chatId, { status: 'reviewing' });
|
|
536
|
+
return (0, api_response_js_1.successResponse)(chat);
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
540
|
+
return (0, api_response_js_1.errorResponse)('db_error', message);
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
(0, chats_stream_js_1.registerChatStreamRoute)(fastify, { tmuxMgr, errorDetector });
|
|
544
|
+
}
|
|
545
|
+
//# sourceMappingURL=chats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/daemon/routes/chats.ts"],"names":[],"mappings":"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"}
|