1// Native Grok's v1 model-selection wire contract, kept independent of the v2 mock.
2import * as NodeFS from "node:fs";
3import * as NodeReadline from "node:readline";
4
5const sessionId = "grok-text-session";
6let currentModelId = "grok-mock-default";
7const models = ["grok-mock-default", "grok-mock-alt"];
8const write = (message) => process.stdout.write(`${JSON.stringify(message)}\n`);
9
10for await (const line of NodeReadline.createInterface({ input: process.stdin })) {
11 const request = JSON.parse(line);
12 if (process.env.T3_ACP_REQUEST_LOG_PATH) {
13 NodeFS.appendFileSync(process.env.T3_ACP_REQUEST_LOG_PATH, `${line}\n`);
14 }
15 if (request.id === undefined) continue;
16 let result;
17 switch (request.method) {
18 case "initialize":
19 result = {
20 protocolVersion: 1,
21 agentInfo: { name: "grok", version: "mock" },
22 agentCapabilities: {},
23 };
24 break;
25 case "session/new":
26 result = {
27 sessionId,
28 models: {
29 currentModelId,
30 availableModels: models.map((modelId) => ({ modelId, name: modelId })),
31 },
32 };
33 break;
34 case "session/set_model":
35 if (!models.includes(request.params.modelId)) {
36 write({
37 jsonrpc: "2.0",
38 id: request.id,
39 error: { code: -32602, message: "Unknown Grok model" },
40 });
41 continue;
42 }
43 currentModelId = request.params.modelId;
44 result = {};
45 break;
46 case "session/prompt":
47 write({
48 jsonrpc: "2.0",
49 method: "session/update",
50 params: {
51 sessionId,
52 update: {
53 sessionUpdate: "agent_message_chunk",
54 content: { type: "text", text: process.env.T3_ACP_PROMPT_RESPONSE_TEXT ?? "" },
55 },
56 },
57 });
58 result = { stopReason: "end_turn" };
59 break;
60 default:
61 write({
62 jsonrpc: "2.0",
63 id: request.id,
64 error: { code: -32601, message: "Method not found" },
65 });
66 continue;
67 }
68 write({ jsonrpc: "2.0", id: request.id, result });
69}