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,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Fetch wrapper around the daemon REST API on http://127.0.0.1:7707.
|
|
4
|
+
* Handles connection errors with user-friendly guidance.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.daemonFetch = daemonFetch;
|
|
8
|
+
exports.streamChat = streamChat;
|
|
9
|
+
const zod_1 = require("zod");
|
|
10
|
+
const DAEMON_BASE = "http://127.0.0.1:7707";
|
|
11
|
+
const API_PREFIX = "/api/v1";
|
|
12
|
+
/**
|
|
13
|
+
* Prepend /api/v1 to a daemon path unless the caller already supplied
|
|
14
|
+
* it. Normalise leading-slash first so `api/v1/foo` (no slash) doesn't
|
|
15
|
+
* double-prefix to `/api/v1/api/v1/foo`. Exact-segment match required
|
|
16
|
+
* — a naive startsWith would treat `/api/v10/...` or `/api/v1foo/...`
|
|
17
|
+
* as already-prefixed.
|
|
18
|
+
*/
|
|
19
|
+
function v1(path) {
|
|
20
|
+
const normalised = path.startsWith("/") ? path : `/${path}`;
|
|
21
|
+
if (normalised === API_PREFIX || normalised.startsWith(`${API_PREFIX}/`)) {
|
|
22
|
+
return normalised;
|
|
23
|
+
}
|
|
24
|
+
return `${API_PREFIX}${normalised}`;
|
|
25
|
+
}
|
|
26
|
+
const ApiResponseSchema = zod_1.z.object({
|
|
27
|
+
ok: zod_1.z.boolean(),
|
|
28
|
+
data: zod_1.z.unknown().optional(),
|
|
29
|
+
error: zod_1.z
|
|
30
|
+
.object({
|
|
31
|
+
code: zod_1.z.string(),
|
|
32
|
+
message: zod_1.z.string(),
|
|
33
|
+
})
|
|
34
|
+
.optional(),
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Fetch JSON from daemon, parse response, handle errors.
|
|
38
|
+
* Throws an error if daemon is unreachable or response is invalid.
|
|
39
|
+
*/
|
|
40
|
+
async function daemonFetch(path, options) {
|
|
41
|
+
const url = `${DAEMON_BASE}${v1(path)}`;
|
|
42
|
+
let response;
|
|
43
|
+
try {
|
|
44
|
+
response = await fetch(url, {
|
|
45
|
+
...options,
|
|
46
|
+
headers: {
|
|
47
|
+
"Content-Type": "application/json",
|
|
48
|
+
...options?.headers,
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// Connection refused or network error
|
|
54
|
+
if (error instanceof Error && error.message.includes("ECONNREFUSED")) {
|
|
55
|
+
throw new Error("Chorus daemon not running. Run 'chorus start' first.");
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
// Parse the JSON envelope FIRST, regardless of HTTP status. The
|
|
60
|
+
// daemon now returns 4xx for client errors (validation/not_found/
|
|
61
|
+
// conflict) per the v0.7 shape-freeze; without this, MCP consumers
|
|
62
|
+
// would see ugly raw-text errors like `Daemon returned 400: {...}`
|
|
63
|
+
// instead of the nice `error.message` they get on 200+ok:false.
|
|
64
|
+
let json;
|
|
65
|
+
try {
|
|
66
|
+
json = await response.json();
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
throw new Error(`Daemon returned ${response.status} ${response.statusText} with non-JSON body`);
|
|
70
|
+
}
|
|
71
|
+
const parsed = ApiResponseSchema.parse(json);
|
|
72
|
+
if (!parsed.ok) {
|
|
73
|
+
throw new Error(parsed.error?.message || "Daemon returned an error with no message");
|
|
74
|
+
}
|
|
75
|
+
return parsed.data;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Consume SSE stream and emit progress events.
|
|
79
|
+
* Yields one item per event until the stream closes or timeout expires.
|
|
80
|
+
*/
|
|
81
|
+
async function* streamChat(chatId, timeoutSec = 600) {
|
|
82
|
+
const url = `${DAEMON_BASE}${v1(`/chats/${chatId}/stream`)}`;
|
|
83
|
+
const controller = new AbortController();
|
|
84
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutSec * 1000);
|
|
85
|
+
try {
|
|
86
|
+
const response = await fetch(url, {
|
|
87
|
+
signal: controller.signal,
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
throw new Error(`Stream returned ${response.status}: ${response.statusText}`);
|
|
91
|
+
}
|
|
92
|
+
if (!response.body) {
|
|
93
|
+
throw new Error("Stream response has no body");
|
|
94
|
+
}
|
|
95
|
+
const reader = response.body.getReader();
|
|
96
|
+
const decoder = new TextDecoder();
|
|
97
|
+
let buffer = "";
|
|
98
|
+
while (true) {
|
|
99
|
+
const { done, value } = await reader.read();
|
|
100
|
+
if (done)
|
|
101
|
+
break;
|
|
102
|
+
buffer += decoder.decode(value, { stream: true });
|
|
103
|
+
const lines = buffer.split("\n");
|
|
104
|
+
buffer = lines.pop() || "";
|
|
105
|
+
for (const line of lines) {
|
|
106
|
+
if (line.startsWith("data: ")) {
|
|
107
|
+
const data = line.slice(6);
|
|
108
|
+
if (data) {
|
|
109
|
+
try {
|
|
110
|
+
yield JSON.parse(data);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Ignore malformed lines
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Flush remaining buffer
|
|
120
|
+
if (buffer) {
|
|
121
|
+
if (buffer.startsWith("data: ")) {
|
|
122
|
+
const data = buffer.slice(6);
|
|
123
|
+
if (data) {
|
|
124
|
+
try {
|
|
125
|
+
yield JSON.parse(data);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Ignore malformed lines
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
clearTimeout(timeoutId);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAqCH,kCAgDC;AAMD,gCAiEC;AA1JD,6BAAwB;AAExB,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAC5C,MAAM,UAAU,GAAG,SAAS,CAAC;AAE7B;;;;;;GAMG;AACH,SAAS,EAAE,CAAC,IAAY;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAC5D,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE;IACf,IAAI,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,KAAK,EAAE,OAAC;SACL,MAAM,CAAC;QACN,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;KACpB,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH;;;GAGG;AACI,KAAK,UAAU,WAAW,CAC/B,IAAY,EACZ,OAAqB;IAErB,MAAM,GAAG,GAAG,GAAG,WAAW,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;IAExC,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC1B,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,OAAO,EAAE,OAAO;aACpB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,sCAAsC;QACtC,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CACb,sDAAsD,CACvD,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,kEAAkE;IAClE,mEAAmE;IACnE,mEAAmE;IACnE,gEAAgE;IAChE,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,qBAAqB,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,0CAA0C,CACpE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,IAAS,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACI,KAAK,SAAS,CAAC,CAAC,UAAU,CAC/B,MAAc,EACd,aAAqB,GAAG;IAExB,MAAM,GAAG,GAAG,GAAG,WAAW,GAAG,EAAE,CAAC,UAAU,MAAM,SAAS,CAAC,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,GAAG,IAAI,CAAC,CAAC;IAE1E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,mBAAmB,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAC7D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC3B,IAAI,IAAI,EAAE,CAAC;wBACT,IAAI,CAAC;4BACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACzB,CAAC;wBAAC,MAAM,CAAC;4BACP,yBAAyB;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,IAAI,EAAE,CAAC;oBACT,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC;oBAAC,MAAM,CAAC;wBACP,yBAAyB;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Chorus MCP stdio server.
|
|
5
|
+
* Exposes 9 tools to orchestrators (Claude Code, Codex, Cursor).
|
|
6
|
+
* Each tool calls the daemon REST API on http://127.0.0.1:7707.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
10
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
11
|
+
const tools_js_1 = require("./tools.js");
|
|
12
|
+
const mcpServer = new mcp_js_1.McpServer({
|
|
13
|
+
name: "chorus",
|
|
14
|
+
version: "0.7.0",
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* Register the 7 MCP tools.
|
|
18
|
+
*/
|
|
19
|
+
mcpServer.registerTool("create_chat", {
|
|
20
|
+
description: "Create a new chat. Returns immediately with chatId, status, and URL. Reviewers run async. " +
|
|
21
|
+
"For review-only templates (e.g. template='review-only'), supply `artifact` with the text/diff to review — `work` becomes the framing brief.",
|
|
22
|
+
inputSchema: tools_js_1.CreateChatSchema,
|
|
23
|
+
}, async (input) => {
|
|
24
|
+
const result = await (0, tools_js_1.createChat)(input);
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
mcpServer.registerTool("wait_for_chat", {
|
|
30
|
+
description: "Long-poll a chat until terminal state. Blocks until status is approved, merged, blocked, cancelled, or failed.",
|
|
31
|
+
inputSchema: tools_js_1.WaitForChatSchema,
|
|
32
|
+
}, async (input, extra) => {
|
|
33
|
+
const progressEvents = [];
|
|
34
|
+
// The MCP SDK enforces a 60s default request timeout (DEFAULT_REQUEST_TIMEOUT_MSEC).
|
|
35
|
+
// Long chorus chats routinely exceed that — we previously surfaced as
|
|
36
|
+
// "Connection closed -32000" on the client. The MCP spec's progress
|
|
37
|
+
// notification mechanism resets the timeout per `resetTimeoutOnProgress`
|
|
38
|
+
// when the client opted into it AND we send `notifications/progress`
|
|
39
|
+
// referencing the request's progressToken (passed in via _meta).
|
|
40
|
+
//
|
|
41
|
+
// We send a progress notification on every chat event AND on a fixed
|
|
42
|
+
// ~25s heartbeat so a stalled chat (mid-LLM-stream, low SSE event
|
|
43
|
+
// density) still keeps the client awake. The progress field is a
|
|
44
|
+
// monotonically-increasing counter — the spec mandates monotonicity
|
|
45
|
+
// even though most clients don't enforce it.
|
|
46
|
+
const progressToken = extra._meta?.progressToken;
|
|
47
|
+
let progressCounter = 0;
|
|
48
|
+
const sendProgress = async (message) => {
|
|
49
|
+
if (progressToken === undefined || progressToken === null)
|
|
50
|
+
return;
|
|
51
|
+
progressCounter += 1;
|
|
52
|
+
try {
|
|
53
|
+
await extra.sendNotification({
|
|
54
|
+
method: "notifications/progress",
|
|
55
|
+
params: {
|
|
56
|
+
progressToken,
|
|
57
|
+
progress: progressCounter,
|
|
58
|
+
...(message ? { message } : {}),
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Notification delivery is best-effort. A failed send doesn't
|
|
64
|
+
// imply the request is dead — let the await on the chat finish.
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
// Heartbeat keeps the timer alive between real chat events. 25s sits
|
|
68
|
+
// comfortably under the SDK default 60s; even if the SDK timeout is
|
|
69
|
+
// tuned tighter on a specific client, the heartbeat will land before
|
|
70
|
+
// most reasonable thresholds.
|
|
71
|
+
const heartbeat = setInterval(() => {
|
|
72
|
+
void sendProgress(`waiting on ${input.chatId}…`);
|
|
73
|
+
}, 25_000);
|
|
74
|
+
try {
|
|
75
|
+
const result = await (0, tools_js_1.waitForChat)(input, (event) => {
|
|
76
|
+
progressEvents.push(event);
|
|
77
|
+
// Fire progress immediately for every state-changing event the
|
|
78
|
+
// chat emits — most clients display the message field, which
|
|
79
|
+
// gives the user "still alive" feedback during a long review.
|
|
80
|
+
const status = typeof event === "object" && event !== null
|
|
81
|
+
? event.status
|
|
82
|
+
: undefined;
|
|
83
|
+
const phase = typeof event === "object" && event !== null
|
|
84
|
+
? event.phase
|
|
85
|
+
: undefined;
|
|
86
|
+
const msg = status && phase
|
|
87
|
+
? `${status} · ${phase}`
|
|
88
|
+
: status ?? "chat event";
|
|
89
|
+
void sendProgress(msg);
|
|
90
|
+
});
|
|
91
|
+
const response = {
|
|
92
|
+
...result,
|
|
93
|
+
events: progressEvents,
|
|
94
|
+
};
|
|
95
|
+
return {
|
|
96
|
+
content: [{ type: "text", text: JSON.stringify(response) }],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
clearInterval(heartbeat);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
mcpServer.registerTool("get_chat_status", {
|
|
104
|
+
description: "Get current chat status without blocking. Returns status, phase, progress, and blocked flag.",
|
|
105
|
+
inputSchema: tools_js_1.GetChatStatusSchema,
|
|
106
|
+
}, async (input) => {
|
|
107
|
+
const result = await (0, tools_js_1.getChatStatus)(input);
|
|
108
|
+
return {
|
|
109
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
mcpServer.registerTool("list_blocked", {
|
|
113
|
+
description: "List all chats currently waiting on user input. Lets you surface them in one prompt.",
|
|
114
|
+
inputSchema: tools_js_1.ListBlockedSchema,
|
|
115
|
+
}, async (input) => {
|
|
116
|
+
const result = await (0, tools_js_1.listBlocked)(input);
|
|
117
|
+
return {
|
|
118
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
119
|
+
};
|
|
120
|
+
});
|
|
121
|
+
mcpServer.registerTool("resume_chat", {
|
|
122
|
+
description: "Unblock a chat after the user has decided. Same effect as clicking the dashboard button.",
|
|
123
|
+
inputSchema: tools_js_1.ResumeChatSchema,
|
|
124
|
+
}, async (input) => {
|
|
125
|
+
const result = await (0, tools_js_1.resumeChat)(input);
|
|
126
|
+
return {
|
|
127
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
mcpServer.registerTool("cancel_chat", {
|
|
131
|
+
description: "Hard cancel — kills the tmux session, stops reviewers, marks chat cancelled.",
|
|
132
|
+
inputSchema: tools_js_1.CancelChatSchema,
|
|
133
|
+
}, async (input) => {
|
|
134
|
+
const result = await (0, tools_js_1.cancelChat)(input);
|
|
135
|
+
return {
|
|
136
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
mcpServer.registerTool("list_templates", {
|
|
140
|
+
description: "List all available templates (built-in and user-created). Use to discover templates for create_chat.",
|
|
141
|
+
inputSchema: tools_js_1.ListTemplatesSchema,
|
|
142
|
+
}, async (input) => {
|
|
143
|
+
const result = await (0, tools_js_1.listTemplates)(input);
|
|
144
|
+
return {
|
|
145
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
mcpServer.registerTool("list_personas", {
|
|
149
|
+
description: "List all reviewer personas (built-in and user-defined). Each persona is a worldview/role: e.g. Sentinel (security), Cartographer (cross-platform), Translator (UX). Use to discover the personaId for invoke_persona.",
|
|
150
|
+
inputSchema: tools_js_1.ListPersonasSchema,
|
|
151
|
+
}, async (input) => {
|
|
152
|
+
const result = await (0, tools_js_1.listPersonas)(input);
|
|
153
|
+
return {
|
|
154
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
mcpServer.registerTool("invoke_persona", {
|
|
158
|
+
description: "Fire a chat that wears a chosen persona. The persona's system prompt is prepended to your brief so the reviewer audits with that worldview (security / cross-platform / UX / cost / etc.). Use list_personas to discover ids. Returns chatId, status, and URL — work runs async.",
|
|
159
|
+
inputSchema: tools_js_1.InvokePersonaSchema,
|
|
160
|
+
}, async (input) => {
|
|
161
|
+
const result = await (0, tools_js_1.invokePersona)(input);
|
|
162
|
+
return {
|
|
163
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
/**
|
|
167
|
+
* Main entry point.
|
|
168
|
+
* Creates stdio transport and connects server.
|
|
169
|
+
*/
|
|
170
|
+
async function main() {
|
|
171
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
172
|
+
await mcpServer.connect(transport);
|
|
173
|
+
}
|
|
174
|
+
main().catch((error) => {
|
|
175
|
+
console.error("MCP server error:", error);
|
|
176
|
+
process.exit(1);
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|