@code-yeongyu/senpi-ai 2026.8.16 → 2026.8.17
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 +3 -2
- package/dist/api/cursor-agent/deterministic-id.d.ts +17 -0
- package/dist/api/cursor-agent/deterministic-id.d.ts.map +1 -0
- package/dist/api/cursor-agent/deterministic-id.js +14 -0
- package/dist/api/cursor-agent/deterministic-id.js.map +1 -0
- package/dist/api/cursor-agent/exec-lifecycle.d.ts +13 -0
- package/dist/api/cursor-agent/exec-lifecycle.d.ts.map +1 -0
- package/dist/api/cursor-agent/exec-lifecycle.js +33 -0
- package/dist/api/cursor-agent/exec-lifecycle.js.map +1 -0
- package/dist/api/cursor-agent/exec-modern.d.ts +79 -0
- package/dist/api/cursor-agent/exec-modern.d.ts.map +1 -0
- package/dist/api/cursor-agent/exec-modern.js +360 -0
- package/dist/api/cursor-agent/exec-modern.js.map +1 -0
- package/dist/api/cursor-agent/gen/agent_pb.d.ts +16797 -0
- package/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -0
- package/dist/api/cursor-agent/gen/agent_pb.js +3828 -0
- package/dist/api/cursor-agent/gen/agent_pb.js.map +1 -0
- package/dist/api/cursor-agent/pi-args.d.ts +55 -0
- package/dist/api/cursor-agent/pi-args.d.ts.map +1 -0
- package/dist/api/cursor-agent/pi-args.js +76 -0
- package/dist/api/cursor-agent/pi-args.js.map +1 -0
- package/dist/api/cursor-agent/types.d.ts +116 -0
- package/dist/api/cursor-agent/types.d.ts.map +1 -0
- package/dist/api/cursor-agent/types.js +16 -0
- package/dist/api/cursor-agent/types.js.map +1 -0
- package/dist/api/cursor-agent.d.ts +191 -0
- package/dist/api/cursor-agent.d.ts.map +1 -0
- package/dist/api/cursor-agent.js +3316 -0
- package/dist/api/cursor-agent.js.map +1 -0
- package/dist/api/cursor-agent.lazy.d.ts +29 -0
- package/dist/api/cursor-agent.lazy.d.ts.map +1 -0
- package/dist/api/cursor-agent.lazy.js +33 -0
- package/dist/api/cursor-agent.lazy.js.map +1 -0
- package/dist/compat.d.ts +1 -0
- package/dist/compat.d.ts.map +1 -1
- package/dist/compat.js +3 -0
- package/dist/compat.js.map +1 -1
- package/dist/cursor-agent-provider.d.ts +11 -0
- package/dist/cursor-agent-provider.d.ts.map +1 -0
- package/dist/cursor-agent-provider.js +11 -0
- package/dist/cursor-agent-provider.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +6 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js.map +1 -1
- package/dist/providers/cursor.d.ts +6 -9
- package/dist/providers/cursor.d.ts.map +1 -1
- package/dist/providers/cursor.js +42 -9
- package/dist/providers/cursor.js.map +1 -1
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/amazon-bedrock.json +1 -1
- package/dist/providers/data/cerebras.json +1 -1
- package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
- package/dist/providers/data/cloudflare-workers-ai.json +1 -1
- package/dist/providers/data/huggingface.json +1 -1
- package/dist/providers/data/openai-codex.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/providers/data/together.json +1 -1
- package/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/block-symbols.d.ts +57 -0
- package/dist/utils/block-symbols.d.ts.map +1 -0
- package/dist/utils/block-symbols.js +57 -0
- package/dist/utils/block-symbols.js.map +1 -0
- package/dist/utils/event-stream.d.ts +10 -0
- package/dist/utils/event-stream.d.ts.map +1 -1
- package/dist/utils/event-stream.js +22 -0
- package/dist/utils/event-stream.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -90,7 +90,7 @@ Unified LLM API with provider collections, automatic auth resolution, token and
|
|
|
90
90
|
- **Qwen Token Plan** (separate Individual and existing catalogs, with a separate China provider)
|
|
91
91
|
- **Xiaomi MiMo** (defaults to API billing endpoint, with separate Token Plan providers for `cn`/`ams`/`sgp` regions)
|
|
92
92
|
- **Alibaba Token Plan** (Alibaba Cloud Model Studio prepaid Token Plan, OpenAI-compatible `ap-southeast-1` endpoint)
|
|
93
|
-
- **Cursor** (Pro/Ultra/Teams subscription
|
|
93
|
+
- **Cursor** (Pro/Ultra/Teams subscription; native `cursor-agent` protocol with full chat + server-driven tool calling, per-account dynamic catalog, requires OAuth, see below)
|
|
94
94
|
- **Any other OpenAI-compatible API**: local Ollama, vLLM, LM Studio, etc.
|
|
95
95
|
|
|
96
96
|
## Installation
|
|
@@ -1162,6 +1162,7 @@ Built-in API implementations live under `./api/<api-id>`:
|
|
|
1162
1162
|
| `openai-completions` | `OpenAICompletionsOptions` |
|
|
1163
1163
|
| `openai-responses` | `OpenAIResponsesOptions` |
|
|
1164
1164
|
| `openai-codex-responses` | `OpenAICodexResponsesOptions` |
|
|
1165
|
+
| `cursor-agent` | `CursorAgentOptions` |
|
|
1165
1166
|
| `azure-openai-responses` | `AzureOpenAIResponsesOptions` |
|
|
1166
1167
|
| `google-generative-ai` | `GoogleOptions` |
|
|
1167
1168
|
| `google-vertex` | `GoogleVertexOptions` |
|
|
@@ -1484,7 +1485,7 @@ Several providers support OAuth authentication instead of static API keys:
|
|
|
1484
1485
|
- **OpenAI Codex** (ChatGPT Plus/Pro subscription, access to GPT-5.x Codex models)
|
|
1485
1486
|
- **GitHub Copilot** (Copilot subscription)
|
|
1486
1487
|
- **OpenRouter** (OAuth PKCE that mints a user-controlled API key)
|
|
1487
|
-
- **Cursor** (Pro/Ultra/Teams subscription; browser deep-link + poll flow.
|
|
1488
|
+
- **Cursor** (Pro/Ultra/Teams subscription; browser deep-link + poll flow. After login, the per-account model catalog is discovered through `GetUsableModels` and chat streams over the native `cursor-agent` protocol with in-band tool execution — hosts supply `CursorAgentOptions.execHandlers` to bridge Cursor's server-driven tool calls onto local tools)
|
|
1488
1489
|
|
|
1489
1490
|
Each of these providers carries an `OAuthAuth` on `provider.auth.oauth` with three operations: `login(interaction)` uses the provider-neutral `AuthInteraction.prompt()`/`notify()` protocol and returns a credential, `refresh(credential, signal)` refreshes expiring credentials when applicable, and `toAuth(credential)` derives request auth (GitHub Copilot's per-account base URL comes from here). Provider login interactions and refresh calls always carry a concrete abort signal. Refresh is automatic: `models.getAuth(providerId)` and request paths refresh expired tokens under a credential-store lock, so concurrent requests and processes cannot double-refresh. OpenRouter's OAuth flow instead returns a permanent API key, so its refresh operation is a no-op.
|
|
1490
1491
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A UUID-shaped string: five hex groups in the canonical 8-4-4-4-12 layout.
|
|
3
|
+
*
|
|
4
|
+
* NOT a spec-compliant RFC 4122 UUID — the version/variant nibbles are left as
|
|
5
|
+
* raw hash output — but the shape passes everywhere a UUID string is expected.
|
|
6
|
+
*/
|
|
7
|
+
export type DeterministicUuid = `${string}-${string}-${string}-${string}-${string}`;
|
|
8
|
+
/**
|
|
9
|
+
* Format the leading 128 bits of `seed`'s SHA-256 digest as a v4-shape UUID
|
|
10
|
+
* (8-4-4-4-12 hex groups).
|
|
11
|
+
*
|
|
12
|
+
* Deterministic: identical seeds always map to the same id, so callers get
|
|
13
|
+
* stable ids across requests / conversation turns (reusing message-blob ids,
|
|
14
|
+
* keying prompt caches) without persisting a seed→id mapping.
|
|
15
|
+
*/
|
|
16
|
+
export declare function deterministicUuid(seed: string): DeterministicUuid;
|
|
17
|
+
//# sourceMappingURL=deterministic-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deterministic-id.d.ts","sourceRoot":"","sources":["../../../src/api/cursor-agent/deterministic-id.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAEpF;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAGjE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* Format the leading 128 bits of `seed`'s SHA-256 digest as a v4-shape UUID
|
|
4
|
+
* (8-4-4-4-12 hex groups).
|
|
5
|
+
*
|
|
6
|
+
* Deterministic: identical seeds always map to the same id, so callers get
|
|
7
|
+
* stable ids across requests / conversation turns (reusing message-blob ids,
|
|
8
|
+
* keying prompt caches) without persisting a seed→id mapping.
|
|
9
|
+
*/
|
|
10
|
+
export function deterministicUuid(seed) {
|
|
11
|
+
const hex = createHash("sha256").update(seed).digest("hex");
|
|
12
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=deterministic-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deterministic-id.js","sourceRoot":"","sources":["../../../src/api/cursor-agent/deterministic-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAUzC;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;AAChH,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\n\n/**\n * A UUID-shaped string: five hex groups in the canonical 8-4-4-4-12 layout.\n *\n * NOT a spec-compliant RFC 4122 UUID — the version/variant nibbles are left as\n * raw hash output — but the shape passes everywhere a UUID string is expected.\n */\nexport type DeterministicUuid = `${string}-${string}-${string}-${string}-${string}`;\n\n/**\n * Format the leading 128 bits of `seed`'s SHA-256 digest as a v4-shape UUID\n * (8-4-4-4-12 hex groups).\n *\n * Deterministic: identical seeds always map to the same id, so callers get\n * stable ids across requests / conversation turns (reusing message-blob ids,\n * keying prompt caches) without persisting a seed→id mapping.\n */\nexport function deterministicUuid(seed: string): DeterministicUuid {\n\tconst hex = createHash(\"sha256\").update(seed).digest(\"hex\");\n\treturn `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type ExecHeartbeatOptions = {
|
|
2
|
+
readonly intervalMs: number;
|
|
3
|
+
readonly isClosed: () => boolean;
|
|
4
|
+
readonly writeHeartbeat: (onComplete: (error?: Error | null) => void) => void;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Arm one exec-scoped heartbeat at a time.
|
|
8
|
+
*
|
|
9
|
+
* The next timer starts only after the current write callback succeeds, so a
|
|
10
|
+
* slow HTTP/2 write can never accumulate overlapping heartbeat frames.
|
|
11
|
+
*/
|
|
12
|
+
export declare function armExecHeartbeat(options: ExecHeartbeatOptions): () => void;
|
|
13
|
+
//# sourceMappingURL=exec-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/api/cursor-agent/exec-lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;CAC9E,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,IAAI,CAwB1E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arm one exec-scoped heartbeat at a time.
|
|
3
|
+
*
|
|
4
|
+
* The next timer starts only after the current write callback succeeds, so a
|
|
5
|
+
* slow HTTP/2 write can never accumulate overlapping heartbeat frames.
|
|
6
|
+
*/
|
|
7
|
+
export function armExecHeartbeat(options) {
|
|
8
|
+
let active = true;
|
|
9
|
+
let timer;
|
|
10
|
+
const schedule = () => {
|
|
11
|
+
if (!active || options.isClosed())
|
|
12
|
+
return;
|
|
13
|
+
timer = setTimeout(() => {
|
|
14
|
+
timer = undefined;
|
|
15
|
+
if (!active || options.isClosed())
|
|
16
|
+
return;
|
|
17
|
+
options.writeHeartbeat((error) => {
|
|
18
|
+
if (error || !active || options.isClosed())
|
|
19
|
+
return;
|
|
20
|
+
schedule();
|
|
21
|
+
});
|
|
22
|
+
}, options.intervalMs);
|
|
23
|
+
};
|
|
24
|
+
schedule();
|
|
25
|
+
return () => {
|
|
26
|
+
active = false;
|
|
27
|
+
if (timer !== undefined) {
|
|
28
|
+
clearTimeout(timer);
|
|
29
|
+
timer = undefined;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=exec-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-lifecycle.js","sourceRoot":"","sources":["../../../src/api/cursor-agent/exec-lifecycle.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA6B;IAC7D,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,KAAiC,CAAC;IAEtC,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE;YAAE,OAAO;QAC1C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACvB,KAAK,GAAG,SAAS,CAAC;YAClB,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE;gBAAE,OAAO;YAC1C,OAAO,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChC,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE;oBAAE,OAAO;gBACnD,QAAQ,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACJ,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,QAAQ,EAAE,CAAC;IACX,OAAO,GAAG,EAAE;QACX,MAAM,GAAG,KAAK,CAAC;QACf,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,GAAG,SAAS,CAAC;QACnB,CAAC;IACF,CAAC,CAAC;AACH,CAAC","sourcesContent":["export type ExecHeartbeatOptions = {\n\treadonly intervalMs: number;\n\treadonly isClosed: () => boolean;\n\treadonly writeHeartbeat: (onComplete: (error?: Error | null) => void) => void;\n};\n\n/**\n * Arm one exec-scoped heartbeat at a time.\n *\n * The next timer starts only after the current write callback succeeds, so a\n * slow HTTP/2 write can never accumulate overlapping heartbeat frames.\n */\nexport function armExecHeartbeat(options: ExecHeartbeatOptions): () => void {\n\tlet active = true;\n\tlet timer: NodeJS.Timeout | undefined;\n\n\tconst schedule = () => {\n\t\tif (!active || options.isClosed()) return;\n\t\ttimer = setTimeout(() => {\n\t\t\ttimer = undefined;\n\t\t\tif (!active || options.isClosed()) return;\n\t\t\toptions.writeHeartbeat((error) => {\n\t\t\t\tif (error || !active || options.isClosed()) return;\n\t\t\t\tschedule();\n\t\t\t});\n\t\t}, options.intervalMs);\n\t};\n\n\tschedule();\n\treturn () => {\n\t\tactive = false;\n\t\tif (timer !== undefined) {\n\t\t\tclearTimeout(timer);\n\t\t\ttimer = undefined;\n\t\t}\n\t};\n}\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proto builders for the modern Cursor CLI exec frames (`ExecServerMessage`
|
|
3
|
+
* 27-31, 36-38, 40-55).
|
|
4
|
+
*
|
|
5
|
+
* Split out of `cursor-agent.ts` because these are pure `create(...)` shapes
|
|
6
|
+
* with no transport, stream, or block-state coupling: the dispatcher decides
|
|
7
|
+
* *which* answer a frame gets, this module knows *what* that answer looks
|
|
8
|
+
* like on the wire. Every builder returns a result whose oneof case is set —
|
|
9
|
+
* an `ExecClientMessage` carrying a result with an unset oneof is a fake
|
|
10
|
+
* success the server reads as "the tool ran and produced nothing".
|
|
11
|
+
*/
|
|
12
|
+
import type { ToolResultMessage } from "../../types.ts";
|
|
13
|
+
import { type ExecuteHookRequest, type ExecuteHookResult, type McpStateExecResult, type McpToolDefinition, type PiBashExecResult, type PiEditExecResult, type PiFindExecResult, type PiGrepExecResult, type PiLsExecResult, type PiReadExecResult, type PiTruncation, type PiWriteExecResult } from "./gen/agent_pb.ts";
|
|
14
|
+
/** Flatten a tool result's content into the single `output` string the Pi frames carry. */
|
|
15
|
+
export declare function piOutputText(toolResult: ToolResultMessage): string;
|
|
16
|
+
/**
|
|
17
|
+
* Translate a local tool's truncation summary into `PiTruncation`.
|
|
18
|
+
*
|
|
19
|
+
* Two shapes reach here: `details.truncation` (carries an explicit
|
|
20
|
+
* `truncated` boolean) and `details.meta.truncation` (whose presence *is* the
|
|
21
|
+
* signal). Returns `undefined` when nothing was truncated: the field is
|
|
22
|
+
* `optional` on every Pi success message, and emitting a zeroed
|
|
23
|
+
* `PiTruncation` would tell the server the output was trimmed to nothing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function piTruncation(toolResult: ToolResultMessage): PiTruncation | undefined;
|
|
26
|
+
export declare function buildPiReadResult(toolResult: ToolResultMessage): PiReadExecResult;
|
|
27
|
+
export declare function buildPiReadError(error: string): PiReadExecResult;
|
|
28
|
+
export declare function buildPiBashResult(toolResult: ToolResultMessage): PiBashExecResult;
|
|
29
|
+
export declare function buildPiBashError(error: string): PiBashExecResult;
|
|
30
|
+
/**
|
|
31
|
+
* `PiEditExecSuccess` requires `diff` and `patch` alongside `output`. The
|
|
32
|
+
* local `edit` tool reports them under `details`; when it does not, the
|
|
33
|
+
* strings stay empty rather than being faked from the output text.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildPiEditResult(toolResult: ToolResultMessage): PiEditExecResult;
|
|
36
|
+
export declare function buildPiEditError(error: string): PiEditExecResult;
|
|
37
|
+
/**
|
|
38
|
+
* A refusal is not an execution failure: `PiEditExecResult` models them as
|
|
39
|
+
* separate variants, and answering a denied call with `error` reads as "the
|
|
40
|
+
* edit ran and broke", which invites a retry of an operation that was never
|
|
41
|
+
* permitted.
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildPiEditRejected(reason: string): PiEditExecResult;
|
|
44
|
+
export declare function buildPiWriteResult(toolResult: ToolResultMessage): PiWriteExecResult;
|
|
45
|
+
export declare function buildPiWriteError(error: string): PiWriteExecResult;
|
|
46
|
+
/** Same variant split as {@link buildPiEditRejected}. */
|
|
47
|
+
export declare function buildPiWriteRejected(reason: string): PiWriteExecResult;
|
|
48
|
+
export declare function buildPiGrepResult(toolResult: ToolResultMessage): PiGrepExecResult;
|
|
49
|
+
export declare function buildPiGrepError(error: string): PiGrepExecResult;
|
|
50
|
+
export declare function buildPiFindResult(toolResult: ToolResultMessage): PiFindExecResult;
|
|
51
|
+
export declare function buildPiFindError(error: string): PiFindExecResult;
|
|
52
|
+
export declare function buildPiLsResult(toolResult: ToolResultMessage): PiLsExecResult;
|
|
53
|
+
export declare function buildPiLsError(error: string): PiLsExecResult;
|
|
54
|
+
/**
|
|
55
|
+
* Answer `mcpStateExecArgs` (frame 36) from the catalog already advertised in
|
|
56
|
+
* `RequestContext.tools`.
|
|
57
|
+
*
|
|
58
|
+
* This client hosts no MCP servers of its own: every forwarded tool is a
|
|
59
|
+
* local tool published under a synthetic `providerIdentifier`. Regrouping the
|
|
60
|
+
* same list keeps the server's view of "which servers exist and what do they
|
|
61
|
+
* expose" consistent with what it was told at context time.
|
|
62
|
+
*
|
|
63
|
+
* `serverIdentifiers` filters the answer when the server asks about specific
|
|
64
|
+
* servers. A restart request is answered with the same state rather than an
|
|
65
|
+
* error — there is nothing to restart.
|
|
66
|
+
*/
|
|
67
|
+
export declare function buildMcpStateResult(tools: McpToolDefinition[], serverIdentifiers: readonly string[]): McpStateExecResult;
|
|
68
|
+
/**
|
|
69
|
+
* Build the neutral response for a hook query: the matching response case
|
|
70
|
+
* with every field unset.
|
|
71
|
+
*
|
|
72
|
+
* This client runs no Cursor hooks, and every field of every response variant
|
|
73
|
+
* is `optional` — so an empty response of the right case means "no hook had
|
|
74
|
+
* anything to say", which is exactly true. Returns `null` for a request case
|
|
75
|
+
* this build does not model, which the dispatcher answers with
|
|
76
|
+
* `ExecClientThrow` rather than guessing a case.
|
|
77
|
+
*/
|
|
78
|
+
export declare function buildNeutralHookResult(request: ExecuteHookRequest | undefined): ExecuteHookResult | null;
|
|
79
|
+
//# sourceMappingURL=exec-modern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-modern.d.ts","sourceRoot":"","sources":["../../../src/api/cursor-agent/exec-modern.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAIN,KAAK,kBAAkB,EAGvB,KAAK,iBAAiB,EAEtB,KAAK,kBAAkB,EAIvB,KAAK,iBAAiB,EAEtB,KAAK,gBAAgB,EAKrB,KAAK,gBAAgB,EAIrB,KAAK,gBAAgB,EAIrB,KAAK,gBAAgB,EAIrB,KAAK,cAAc,EAInB,KAAK,gBAAgB,EAGrB,KAAK,YAAY,EAIjB,KAAK,iBAAiB,EAUtB,MAAM,mBAAmB,CAAC;AAE3B,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM,CAElE;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,YAAY,GAAG,SAAS,CAmBpF;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,GAAG,gBAAgB,CASjF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAIhE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,GAAG,gBAAgB,CAiBjF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAIhE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,GAAG,gBAAgB,CAgBjF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAIhE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAIpE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,iBAAiB,GAAG,iBAAiB,CAMnF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAIlE;AAED,yDAAyD;AACzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAItE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,GAAG,gBAAgB,CAejF;AAyBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAIhE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,GAAG,gBAAgB,CAajF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAIhE;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,iBAAiB,GAAG,cAAc,CAa7E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAI5D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAClC,kBAAkB,CA0BpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,CAyDxG"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proto builders for the modern Cursor CLI exec frames (`ExecServerMessage`
|
|
3
|
+
* 27-31, 36-38, 40-55).
|
|
4
|
+
*
|
|
5
|
+
* Split out of `cursor-agent.ts` because these are pure `create(...)` shapes
|
|
6
|
+
* with no transport, stream, or block-state coupling: the dispatcher decides
|
|
7
|
+
* *which* answer a frame gets, this module knows *what* that answer looks
|
|
8
|
+
* like on the wire. Every builder returns a result whose oneof case is set —
|
|
9
|
+
* an `ExecClientMessage` carrying a result with an unset oneof is a fake
|
|
10
|
+
* success the server reads as "the tool ran and produced nothing".
|
|
11
|
+
*/
|
|
12
|
+
import { create } from "@bufbuild/protobuf";
|
|
13
|
+
import { AfterAgentResponseRequestResponseSchema, AfterAgentThoughtRequestResponseSchema, BeforeSubmitPromptRequestResponseSchema, ExecuteHookResponseSchema, ExecuteHookResultSchema, McpStateExecResultSchema, McpStateServerSchema, McpStateSuccessSchema, PiBashExecErrorSchema, PiBashExecResultSchema, PiBashExecSuccessSchema, PiEditExecErrorSchema, PiEditExecRejectedSchema, PiEditExecResultSchema, PiEditExecSuccessSchema, PiFindExecErrorSchema, PiFindExecResultSchema, PiFindExecSuccessSchema, PiGrepExecErrorSchema, PiGrepExecResultSchema, PiGrepExecSuccessSchema, PiLsExecErrorSchema, PiLsExecResultSchema, PiLsExecSuccessSchema, PiReadExecErrorSchema, PiReadExecResultSchema, PiReadExecSuccessSchema, PiTruncationSchema, PiWriteExecErrorSchema, PiWriteExecRejectedSchema, PiWriteExecResultSchema, PiWriteExecSuccessSchema, PostToolUseFailureRequestResponseSchema, PostToolUseRequestResponseSchema, PreCompactRequestResponseSchema, PreToolUseRequestResponseSchema, StopRequestResponseSchema, SubagentStartRequestResponseSchema, SubagentStopRequestResponseSchema, } from "./gen/agent_pb.js";
|
|
14
|
+
/** Flatten a tool result's content into the single `output` string the Pi frames carry. */
|
|
15
|
+
export function piOutputText(toolResult) {
|
|
16
|
+
return toolResult.content.map((item) => (item.type === "text" ? item.text : `[${item.mimeType} image]`)).join("\n");
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Read one field off a tool result's `details` bag, or off a nested object
|
|
20
|
+
* inside it. `details` is `unknown` by design — every tool ships its own
|
|
21
|
+
* shape — so each read is narrowed rather than asserted.
|
|
22
|
+
*/
|
|
23
|
+
function bagValue(bag, key) {
|
|
24
|
+
if (!bag || typeof bag !== "object" || !(key in bag))
|
|
25
|
+
return undefined;
|
|
26
|
+
return Reflect.get(bag, key);
|
|
27
|
+
}
|
|
28
|
+
function detailCount(toolResult, key) {
|
|
29
|
+
const value = bagValue(toolResult.details, key);
|
|
30
|
+
return positiveCount(value);
|
|
31
|
+
}
|
|
32
|
+
function positiveCount(value) {
|
|
33
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;
|
|
34
|
+
}
|
|
35
|
+
/** The entry cap a listing hit, from either shape a local tool records it in. */
|
|
36
|
+
function resultLimitReached(toolResult) {
|
|
37
|
+
const flat = detailCount(toolResult, "resultLimitReached");
|
|
38
|
+
if (flat !== undefined)
|
|
39
|
+
return flat;
|
|
40
|
+
const limits = bagValue(bagValue(toolResult.details, "meta"), "limits");
|
|
41
|
+
return positiveCount(bagValue(bagValue(limits, "resultLimit"), "reached"));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Translate a local tool's truncation summary into `PiTruncation`.
|
|
45
|
+
*
|
|
46
|
+
* Two shapes reach here: `details.truncation` (carries an explicit
|
|
47
|
+
* `truncated` boolean) and `details.meta.truncation` (whose presence *is* the
|
|
48
|
+
* signal). Returns `undefined` when nothing was truncated: the field is
|
|
49
|
+
* `optional` on every Pi success message, and emitting a zeroed
|
|
50
|
+
* `PiTruncation` would tell the server the output was trimmed to nothing.
|
|
51
|
+
*/
|
|
52
|
+
export function piTruncation(toolResult) {
|
|
53
|
+
const direct = bagValue(toolResult.details, "truncation");
|
|
54
|
+
const truncation = direct !== undefined ? direct : bagValue(bagValue(toolResult.details, "meta"), "truncation");
|
|
55
|
+
if (truncation === undefined || truncation === null)
|
|
56
|
+
return undefined;
|
|
57
|
+
const flag = bagValue(truncation, "truncated");
|
|
58
|
+
if (flag !== undefined && flag !== true)
|
|
59
|
+
return undefined;
|
|
60
|
+
const truncatedBy = bagValue(truncation, "truncatedBy");
|
|
61
|
+
const totalLines = bagValue(truncation, "totalLines");
|
|
62
|
+
const outputLines = bagValue(truncation, "outputLines");
|
|
63
|
+
const outputBytes = bagValue(truncation, "outputBytes");
|
|
64
|
+
return create(PiTruncationSchema, {
|
|
65
|
+
truncated: true,
|
|
66
|
+
truncatedBy: typeof truncatedBy === "string" ? truncatedBy : "",
|
|
67
|
+
totalLines: typeof totalLines === "number" ? totalLines : 0,
|
|
68
|
+
outputLines: typeof outputLines === "number" ? outputLines : 0,
|
|
69
|
+
outputBytes: typeof outputBytes === "number" ? outputBytes : 0,
|
|
70
|
+
firstLineExceedsLimit: bagValue(truncation, "firstLineExceedsLimit") === true,
|
|
71
|
+
lastLinePartial: bagValue(truncation, "lastLinePartial") === true,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
export function buildPiReadResult(toolResult) {
|
|
75
|
+
const text = piOutputText(toolResult);
|
|
76
|
+
if (toolResult.isError)
|
|
77
|
+
return buildPiReadError(text || "Read failed");
|
|
78
|
+
return create(PiReadExecResultSchema, {
|
|
79
|
+
result: {
|
|
80
|
+
case: "success",
|
|
81
|
+
value: create(PiReadExecSuccessSchema, { output: text, truncation: piTruncation(toolResult) }),
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
export function buildPiReadError(error) {
|
|
86
|
+
return create(PiReadExecResultSchema, {
|
|
87
|
+
result: { case: "error", value: create(PiReadExecErrorSchema, { error }) },
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
export function buildPiBashResult(toolResult) {
|
|
91
|
+
const text = piOutputText(toolResult);
|
|
92
|
+
const truncation = piTruncation(toolResult);
|
|
93
|
+
if (toolResult.isError) {
|
|
94
|
+
return create(PiBashExecResultSchema, {
|
|
95
|
+
result: {
|
|
96
|
+
case: "error",
|
|
97
|
+
value: create(PiBashExecErrorSchema, { error: text || "Command failed", truncation }),
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return create(PiBashExecResultSchema, {
|
|
102
|
+
result: {
|
|
103
|
+
case: "success",
|
|
104
|
+
value: create(PiBashExecSuccessSchema, { output: text, truncation }),
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
export function buildPiBashError(error) {
|
|
109
|
+
return create(PiBashExecResultSchema, {
|
|
110
|
+
result: { case: "error", value: create(PiBashExecErrorSchema, { error }) },
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* `PiEditExecSuccess` requires `diff` and `patch` alongside `output`. The
|
|
115
|
+
* local `edit` tool reports them under `details`; when it does not, the
|
|
116
|
+
* strings stay empty rather than being faked from the output text.
|
|
117
|
+
*/
|
|
118
|
+
export function buildPiEditResult(toolResult) {
|
|
119
|
+
const text = piOutputText(toolResult);
|
|
120
|
+
if (toolResult.isError)
|
|
121
|
+
return buildPiEditError(text || "Edit failed");
|
|
122
|
+
const diff = bagValue(toolResult.details, "diff");
|
|
123
|
+
const patch = bagValue(toolResult.details, "patch");
|
|
124
|
+
return create(PiEditExecResultSchema, {
|
|
125
|
+
result: {
|
|
126
|
+
case: "success",
|
|
127
|
+
value: create(PiEditExecSuccessSchema, {
|
|
128
|
+
output: text,
|
|
129
|
+
diff: typeof diff === "string" ? diff : "",
|
|
130
|
+
patch: typeof patch === "string" ? patch : "",
|
|
131
|
+
firstChangedLine: detailCount(toolResult, "firstChangedLine"),
|
|
132
|
+
}),
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
export function buildPiEditError(error) {
|
|
137
|
+
return create(PiEditExecResultSchema, {
|
|
138
|
+
result: { case: "error", value: create(PiEditExecErrorSchema, { error }) },
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* A refusal is not an execution failure: `PiEditExecResult` models them as
|
|
143
|
+
* separate variants, and answering a denied call with `error` reads as "the
|
|
144
|
+
* edit ran and broke", which invites a retry of an operation that was never
|
|
145
|
+
* permitted.
|
|
146
|
+
*/
|
|
147
|
+
export function buildPiEditRejected(reason) {
|
|
148
|
+
return create(PiEditExecResultSchema, {
|
|
149
|
+
result: { case: "rejected", value: create(PiEditExecRejectedSchema, { reason }) },
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
export function buildPiWriteResult(toolResult) {
|
|
153
|
+
const text = piOutputText(toolResult);
|
|
154
|
+
if (toolResult.isError)
|
|
155
|
+
return buildPiWriteError(text || "Write failed");
|
|
156
|
+
return create(PiWriteExecResultSchema, {
|
|
157
|
+
result: { case: "success", value: create(PiWriteExecSuccessSchema, { output: text }) },
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
export function buildPiWriteError(error) {
|
|
161
|
+
return create(PiWriteExecResultSchema, {
|
|
162
|
+
result: { case: "error", value: create(PiWriteExecErrorSchema, { error }) },
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/** Same variant split as {@link buildPiEditRejected}. */
|
|
166
|
+
export function buildPiWriteRejected(reason) {
|
|
167
|
+
return create(PiWriteExecResultSchema, {
|
|
168
|
+
result: { case: "rejected", value: create(PiWriteExecRejectedSchema, { reason }) },
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
export function buildPiGrepResult(toolResult) {
|
|
172
|
+
const text = piOutputText(toolResult);
|
|
173
|
+
if (toolResult.isError)
|
|
174
|
+
return buildPiGrepError(text || "Grep failed");
|
|
175
|
+
const matchLimitReached = detailCount(toolResult, "perFileLimitReached");
|
|
176
|
+
return create(PiGrepExecResultSchema, {
|
|
177
|
+
result: {
|
|
178
|
+
case: "success",
|
|
179
|
+
value: create(PiGrepExecSuccessSchema, {
|
|
180
|
+
output: text,
|
|
181
|
+
truncation: piTruncation(toolResult) ?? grepInternalCapTruncation(toolResult, text, matchLimitReached),
|
|
182
|
+
matchLimitReached,
|
|
183
|
+
linesTruncated: bagValue(toolResult.details, "linesTruncated") === true,
|
|
184
|
+
}),
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* The one grep cap that reaches Cursor through no other field: a search that
|
|
190
|
+
* hit the tool's own total cap sets only the flat `details.truncated` flag,
|
|
191
|
+
* answering as an unqualified success over incomplete results otherwise.
|
|
192
|
+
*/
|
|
193
|
+
function grepInternalCapTruncation(toolResult, text, matchLimitReached) {
|
|
194
|
+
if (matchLimitReached !== undefined)
|
|
195
|
+
return undefined;
|
|
196
|
+
if (bagValue(toolResult.details, "truncated") !== true)
|
|
197
|
+
return undefined;
|
|
198
|
+
return create(PiTruncationSchema, {
|
|
199
|
+
truncated: true,
|
|
200
|
+
truncatedBy: "matches",
|
|
201
|
+
totalLines: 0,
|
|
202
|
+
outputLines: text ? text.split("\n").length : 0,
|
|
203
|
+
outputBytes: Buffer.byteLength(text, "utf-8"),
|
|
204
|
+
firstLineExceedsLimit: false,
|
|
205
|
+
lastLinePartial: false,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
export function buildPiGrepError(error) {
|
|
209
|
+
return create(PiGrepExecResultSchema, {
|
|
210
|
+
result: { case: "error", value: create(PiGrepExecErrorSchema, { error }) },
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
export function buildPiFindResult(toolResult) {
|
|
214
|
+
const text = piOutputText(toolResult);
|
|
215
|
+
if (toolResult.isError)
|
|
216
|
+
return buildPiFindError(text || "Find failed");
|
|
217
|
+
return create(PiFindExecResultSchema, {
|
|
218
|
+
result: {
|
|
219
|
+
case: "success",
|
|
220
|
+
value: create(PiFindExecSuccessSchema, {
|
|
221
|
+
output: text,
|
|
222
|
+
truncation: piTruncation(toolResult),
|
|
223
|
+
resultLimitReached: resultLimitReached(toolResult),
|
|
224
|
+
}),
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
export function buildPiFindError(error) {
|
|
229
|
+
return create(PiFindExecResultSchema, {
|
|
230
|
+
result: { case: "error", value: create(PiFindExecErrorSchema, { error }) },
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
export function buildPiLsResult(toolResult) {
|
|
234
|
+
const text = piOutputText(toolResult);
|
|
235
|
+
if (toolResult.isError)
|
|
236
|
+
return buildPiLsError(text || "Ls failed");
|
|
237
|
+
return create(PiLsExecResultSchema, {
|
|
238
|
+
result: {
|
|
239
|
+
case: "success",
|
|
240
|
+
value: create(PiLsExecSuccessSchema, {
|
|
241
|
+
output: text,
|
|
242
|
+
truncation: piTruncation(toolResult),
|
|
243
|
+
entryLimitReached: resultLimitReached(toolResult),
|
|
244
|
+
}),
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
export function buildPiLsError(error) {
|
|
249
|
+
return create(PiLsExecResultSchema, {
|
|
250
|
+
result: { case: "error", value: create(PiLsExecErrorSchema, { error }) },
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Answer `mcpStateExecArgs` (frame 36) from the catalog already advertised in
|
|
255
|
+
* `RequestContext.tools`.
|
|
256
|
+
*
|
|
257
|
+
* This client hosts no MCP servers of its own: every forwarded tool is a
|
|
258
|
+
* local tool published under a synthetic `providerIdentifier`. Regrouping the
|
|
259
|
+
* same list keeps the server's view of "which servers exist and what do they
|
|
260
|
+
* expose" consistent with what it was told at context time.
|
|
261
|
+
*
|
|
262
|
+
* `serverIdentifiers` filters the answer when the server asks about specific
|
|
263
|
+
* servers. A restart request is answered with the same state rather than an
|
|
264
|
+
* error — there is nothing to restart.
|
|
265
|
+
*/
|
|
266
|
+
export function buildMcpStateResult(tools, serverIdentifiers) {
|
|
267
|
+
const byProvider = new Map();
|
|
268
|
+
for (const tool of tools) {
|
|
269
|
+
const identifier = tool.providerIdentifier;
|
|
270
|
+
const existing = byProvider.get(identifier);
|
|
271
|
+
if (existing)
|
|
272
|
+
existing.push(tool);
|
|
273
|
+
else
|
|
274
|
+
byProvider.set(identifier, [tool]);
|
|
275
|
+
}
|
|
276
|
+
const wanted = serverIdentifiers.length > 0 ? new Set(serverIdentifiers) : undefined;
|
|
277
|
+
const servers = [];
|
|
278
|
+
for (const [identifier, serverTools] of byProvider) {
|
|
279
|
+
if (wanted && !wanted.has(identifier))
|
|
280
|
+
continue;
|
|
281
|
+
servers.push(create(McpStateServerSchema, {
|
|
282
|
+
serverName: identifier,
|
|
283
|
+
serverIdentifier: identifier,
|
|
284
|
+
tools: serverTools,
|
|
285
|
+
status: "connected",
|
|
286
|
+
}));
|
|
287
|
+
}
|
|
288
|
+
return create(McpStateExecResultSchema, {
|
|
289
|
+
result: { case: "success", value: create(McpStateSuccessSchema, { servers }) },
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Build the neutral response for a hook query: the matching response case
|
|
294
|
+
* with every field unset.
|
|
295
|
+
*
|
|
296
|
+
* This client runs no Cursor hooks, and every field of every response variant
|
|
297
|
+
* is `optional` — so an empty response of the right case means "no hook had
|
|
298
|
+
* anything to say", which is exactly true. Returns `null` for a request case
|
|
299
|
+
* this build does not model, which the dispatcher answers with
|
|
300
|
+
* `ExecClientThrow` rather than guessing a case.
|
|
301
|
+
*/
|
|
302
|
+
export function buildNeutralHookResult(request) {
|
|
303
|
+
let response;
|
|
304
|
+
switch (request?.request.case) {
|
|
305
|
+
case "preCompact":
|
|
306
|
+
response = create(ExecuteHookResponseSchema, {
|
|
307
|
+
response: { case: "preCompact", value: create(PreCompactRequestResponseSchema, {}) },
|
|
308
|
+
});
|
|
309
|
+
break;
|
|
310
|
+
case "subagentStart":
|
|
311
|
+
response = create(ExecuteHookResponseSchema, {
|
|
312
|
+
response: { case: "subagentStart", value: create(SubagentStartRequestResponseSchema, {}) },
|
|
313
|
+
});
|
|
314
|
+
break;
|
|
315
|
+
case "subagentStop":
|
|
316
|
+
response = create(ExecuteHookResponseSchema, {
|
|
317
|
+
response: { case: "subagentStop", value: create(SubagentStopRequestResponseSchema, {}) },
|
|
318
|
+
});
|
|
319
|
+
break;
|
|
320
|
+
case "preToolUse":
|
|
321
|
+
response = create(ExecuteHookResponseSchema, {
|
|
322
|
+
response: { case: "preToolUse", value: create(PreToolUseRequestResponseSchema, {}) },
|
|
323
|
+
});
|
|
324
|
+
break;
|
|
325
|
+
case "postToolUse":
|
|
326
|
+
response = create(ExecuteHookResponseSchema, {
|
|
327
|
+
response: { case: "postToolUse", value: create(PostToolUseRequestResponseSchema, {}) },
|
|
328
|
+
});
|
|
329
|
+
break;
|
|
330
|
+
case "postToolUseFailure":
|
|
331
|
+
response = create(ExecuteHookResponseSchema, {
|
|
332
|
+
response: { case: "postToolUseFailure", value: create(PostToolUseFailureRequestResponseSchema, {}) },
|
|
333
|
+
});
|
|
334
|
+
break;
|
|
335
|
+
case "beforeSubmitPrompt":
|
|
336
|
+
response = create(ExecuteHookResponseSchema, {
|
|
337
|
+
response: { case: "beforeSubmitPrompt", value: create(BeforeSubmitPromptRequestResponseSchema, {}) },
|
|
338
|
+
});
|
|
339
|
+
break;
|
|
340
|
+
case "afterAgentResponse":
|
|
341
|
+
response = create(ExecuteHookResponseSchema, {
|
|
342
|
+
response: { case: "afterAgentResponse", value: create(AfterAgentResponseRequestResponseSchema, {}) },
|
|
343
|
+
});
|
|
344
|
+
break;
|
|
345
|
+
case "afterAgentThought":
|
|
346
|
+
response = create(ExecuteHookResponseSchema, {
|
|
347
|
+
response: { case: "afterAgentThought", value: create(AfterAgentThoughtRequestResponseSchema, {}) },
|
|
348
|
+
});
|
|
349
|
+
break;
|
|
350
|
+
case "stop":
|
|
351
|
+
response = create(ExecuteHookResponseSchema, {
|
|
352
|
+
response: { case: "stop", value: create(StopRequestResponseSchema, {}) },
|
|
353
|
+
});
|
|
354
|
+
break;
|
|
355
|
+
default:
|
|
356
|
+
return null;
|
|
357
|
+
}
|
|
358
|
+
return create(ExecuteHookResultSchema, { response });
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=exec-modern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-modern.js","sourceRoot":"","sources":["../../../src/api/cursor-agent/exec-modern.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Proto builders for the modern Cursor CLI exec frames (`ExecServerMessage`\n * 27-31, 36-38, 40-55).\n *\n * Split out of `cursor-agent.ts` because these are pure `create(...)` shapes\n * with no transport, stream, or block-state coupling: the dispatcher decides\n * *which* answer a frame gets, this module knows *what* that answer looks\n * like on the wire. Every builder returns a result whose oneof case is set —\n * an `ExecClientMessage` carrying a result with an unset oneof is a fake\n * success the server reads as \"the tool ran and produced nothing\".\n */\n\nimport { create } from \"@bufbuild/protobuf\";\nimport type { ToolResultMessage } from \"../../types.ts\";\nimport {\n\tAfterAgentResponseRequestResponseSchema,\n\tAfterAgentThoughtRequestResponseSchema,\n\tBeforeSubmitPromptRequestResponseSchema,\n\ttype ExecuteHookRequest,\n\ttype ExecuteHookResponse,\n\tExecuteHookResponseSchema,\n\ttype ExecuteHookResult,\n\tExecuteHookResultSchema,\n\ttype McpStateExecResult,\n\tMcpStateExecResultSchema,\n\tMcpStateServerSchema,\n\tMcpStateSuccessSchema,\n\ttype McpToolDefinition,\n\tPiBashExecErrorSchema,\n\ttype PiBashExecResult,\n\tPiBashExecResultSchema,\n\tPiBashExecSuccessSchema,\n\tPiEditExecErrorSchema,\n\tPiEditExecRejectedSchema,\n\ttype PiEditExecResult,\n\tPiEditExecResultSchema,\n\tPiEditExecSuccessSchema,\n\tPiFindExecErrorSchema,\n\ttype PiFindExecResult,\n\tPiFindExecResultSchema,\n\tPiFindExecSuccessSchema,\n\tPiGrepExecErrorSchema,\n\ttype PiGrepExecResult,\n\tPiGrepExecResultSchema,\n\tPiGrepExecSuccessSchema,\n\tPiLsExecErrorSchema,\n\ttype PiLsExecResult,\n\tPiLsExecResultSchema,\n\tPiLsExecSuccessSchema,\n\tPiReadExecErrorSchema,\n\ttype PiReadExecResult,\n\tPiReadExecResultSchema,\n\tPiReadExecSuccessSchema,\n\ttype PiTruncation,\n\tPiTruncationSchema,\n\tPiWriteExecErrorSchema,\n\tPiWriteExecRejectedSchema,\n\ttype PiWriteExecResult,\n\tPiWriteExecResultSchema,\n\tPiWriteExecSuccessSchema,\n\tPostToolUseFailureRequestResponseSchema,\n\tPostToolUseRequestResponseSchema,\n\tPreCompactRequestResponseSchema,\n\tPreToolUseRequestResponseSchema,\n\tStopRequestResponseSchema,\n\tSubagentStartRequestResponseSchema,\n\tSubagentStopRequestResponseSchema,\n} from \"./gen/agent_pb.ts\";\n\n/** Flatten a tool result's content into the single `output` string the Pi frames carry. */\nexport function piOutputText(toolResult: ToolResultMessage): string {\n\treturn toolResult.content.map((item) => (item.type === \"text\" ? item.text : `[${item.mimeType} image]`)).join(\"\\n\");\n}\n\n/**\n * Read one field off a tool result's `details` bag, or off a nested object\n * inside it. `details` is `unknown` by design — every tool ships its own\n * shape — so each read is narrowed rather than asserted.\n */\nfunction bagValue(bag: unknown, key: string): unknown {\n\tif (!bag || typeof bag !== \"object\" || !(key in bag)) return undefined;\n\treturn Reflect.get(bag, key);\n}\n\nfunction detailCount(toolResult: ToolResultMessage, key: string): number | undefined {\n\tconst value = bagValue(toolResult.details, key);\n\treturn positiveCount(value);\n}\n\nfunction positiveCount(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) && value > 0 ? Math.floor(value) : undefined;\n}\n\n/** The entry cap a listing hit, from either shape a local tool records it in. */\nfunction resultLimitReached(toolResult: ToolResultMessage): number | undefined {\n\tconst flat = detailCount(toolResult, \"resultLimitReached\");\n\tif (flat !== undefined) return flat;\n\tconst limits = bagValue(bagValue(toolResult.details, \"meta\"), \"limits\");\n\treturn positiveCount(bagValue(bagValue(limits, \"resultLimit\"), \"reached\"));\n}\n\n/**\n * Translate a local tool's truncation summary into `PiTruncation`.\n *\n * Two shapes reach here: `details.truncation` (carries an explicit\n * `truncated` boolean) and `details.meta.truncation` (whose presence *is* the\n * signal). Returns `undefined` when nothing was truncated: the field is\n * `optional` on every Pi success message, and emitting a zeroed\n * `PiTruncation` would tell the server the output was trimmed to nothing.\n */\nexport function piTruncation(toolResult: ToolResultMessage): PiTruncation | undefined {\n\tconst direct = bagValue(toolResult.details, \"truncation\");\n\tconst truncation = direct !== undefined ? direct : bagValue(bagValue(toolResult.details, \"meta\"), \"truncation\");\n\tif (truncation === undefined || truncation === null) return undefined;\n\tconst flag = bagValue(truncation, \"truncated\");\n\tif (flag !== undefined && flag !== true) return undefined;\n\tconst truncatedBy = bagValue(truncation, \"truncatedBy\");\n\tconst totalLines = bagValue(truncation, \"totalLines\");\n\tconst outputLines = bagValue(truncation, \"outputLines\");\n\tconst outputBytes = bagValue(truncation, \"outputBytes\");\n\treturn create(PiTruncationSchema, {\n\t\ttruncated: true,\n\t\ttruncatedBy: typeof truncatedBy === \"string\" ? truncatedBy : \"\",\n\t\ttotalLines: typeof totalLines === \"number\" ? totalLines : 0,\n\t\toutputLines: typeof outputLines === \"number\" ? outputLines : 0,\n\t\toutputBytes: typeof outputBytes === \"number\" ? outputBytes : 0,\n\t\tfirstLineExceedsLimit: bagValue(truncation, \"firstLineExceedsLimit\") === true,\n\t\tlastLinePartial: bagValue(truncation, \"lastLinePartial\") === true,\n\t});\n}\n\nexport function buildPiReadResult(toolResult: ToolResultMessage): PiReadExecResult {\n\tconst text = piOutputText(toolResult);\n\tif (toolResult.isError) return buildPiReadError(text || \"Read failed\");\n\treturn create(PiReadExecResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(PiReadExecSuccessSchema, { output: text, truncation: piTruncation(toolResult) }),\n\t\t},\n\t});\n}\n\nexport function buildPiReadError(error: string): PiReadExecResult {\n\treturn create(PiReadExecResultSchema, {\n\t\tresult: { case: \"error\", value: create(PiReadExecErrorSchema, { error }) },\n\t});\n}\n\nexport function buildPiBashResult(toolResult: ToolResultMessage): PiBashExecResult {\n\tconst text = piOutputText(toolResult);\n\tconst truncation = piTruncation(toolResult);\n\tif (toolResult.isError) {\n\t\treturn create(PiBashExecResultSchema, {\n\t\t\tresult: {\n\t\t\t\tcase: \"error\",\n\t\t\t\tvalue: create(PiBashExecErrorSchema, { error: text || \"Command failed\", truncation }),\n\t\t\t},\n\t\t});\n\t}\n\treturn create(PiBashExecResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(PiBashExecSuccessSchema, { output: text, truncation }),\n\t\t},\n\t});\n}\n\nexport function buildPiBashError(error: string): PiBashExecResult {\n\treturn create(PiBashExecResultSchema, {\n\t\tresult: { case: \"error\", value: create(PiBashExecErrorSchema, { error }) },\n\t});\n}\n\n/**\n * `PiEditExecSuccess` requires `diff` and `patch` alongside `output`. The\n * local `edit` tool reports them under `details`; when it does not, the\n * strings stay empty rather than being faked from the output text.\n */\nexport function buildPiEditResult(toolResult: ToolResultMessage): PiEditExecResult {\n\tconst text = piOutputText(toolResult);\n\tif (toolResult.isError) return buildPiEditError(text || \"Edit failed\");\n\tconst diff = bagValue(toolResult.details, \"diff\");\n\tconst patch = bagValue(toolResult.details, \"patch\");\n\treturn create(PiEditExecResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(PiEditExecSuccessSchema, {\n\t\t\t\toutput: text,\n\t\t\t\tdiff: typeof diff === \"string\" ? diff : \"\",\n\t\t\t\tpatch: typeof patch === \"string\" ? patch : \"\",\n\t\t\t\tfirstChangedLine: detailCount(toolResult, \"firstChangedLine\"),\n\t\t\t}),\n\t\t},\n\t});\n}\n\nexport function buildPiEditError(error: string): PiEditExecResult {\n\treturn create(PiEditExecResultSchema, {\n\t\tresult: { case: \"error\", value: create(PiEditExecErrorSchema, { error }) },\n\t});\n}\n\n/**\n * A refusal is not an execution failure: `PiEditExecResult` models them as\n * separate variants, and answering a denied call with `error` reads as \"the\n * edit ran and broke\", which invites a retry of an operation that was never\n * permitted.\n */\nexport function buildPiEditRejected(reason: string): PiEditExecResult {\n\treturn create(PiEditExecResultSchema, {\n\t\tresult: { case: \"rejected\", value: create(PiEditExecRejectedSchema, { reason }) },\n\t});\n}\n\nexport function buildPiWriteResult(toolResult: ToolResultMessage): PiWriteExecResult {\n\tconst text = piOutputText(toolResult);\n\tif (toolResult.isError) return buildPiWriteError(text || \"Write failed\");\n\treturn create(PiWriteExecResultSchema, {\n\t\tresult: { case: \"success\", value: create(PiWriteExecSuccessSchema, { output: text }) },\n\t});\n}\n\nexport function buildPiWriteError(error: string): PiWriteExecResult {\n\treturn create(PiWriteExecResultSchema, {\n\t\tresult: { case: \"error\", value: create(PiWriteExecErrorSchema, { error }) },\n\t});\n}\n\n/** Same variant split as {@link buildPiEditRejected}. */\nexport function buildPiWriteRejected(reason: string): PiWriteExecResult {\n\treturn create(PiWriteExecResultSchema, {\n\t\tresult: { case: \"rejected\", value: create(PiWriteExecRejectedSchema, { reason }) },\n\t});\n}\n\nexport function buildPiGrepResult(toolResult: ToolResultMessage): PiGrepExecResult {\n\tconst text = piOutputText(toolResult);\n\tif (toolResult.isError) return buildPiGrepError(text || \"Grep failed\");\n\tconst matchLimitReached = detailCount(toolResult, \"perFileLimitReached\");\n\treturn create(PiGrepExecResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(PiGrepExecSuccessSchema, {\n\t\t\t\toutput: text,\n\t\t\t\ttruncation: piTruncation(toolResult) ?? grepInternalCapTruncation(toolResult, text, matchLimitReached),\n\t\t\t\tmatchLimitReached,\n\t\t\t\tlinesTruncated: bagValue(toolResult.details, \"linesTruncated\") === true,\n\t\t\t}),\n\t\t},\n\t});\n}\n\n/**\n * The one grep cap that reaches Cursor through no other field: a search that\n * hit the tool's own total cap sets only the flat `details.truncated` flag,\n * answering as an unqualified success over incomplete results otherwise.\n */\nfunction grepInternalCapTruncation(\n\ttoolResult: ToolResultMessage,\n\ttext: string,\n\tmatchLimitReached: number | undefined,\n): PiTruncation | undefined {\n\tif (matchLimitReached !== undefined) return undefined;\n\tif (bagValue(toolResult.details, \"truncated\") !== true) return undefined;\n\treturn create(PiTruncationSchema, {\n\t\ttruncated: true,\n\t\ttruncatedBy: \"matches\",\n\t\ttotalLines: 0,\n\t\toutputLines: text ? text.split(\"\\n\").length : 0,\n\t\toutputBytes: Buffer.byteLength(text, \"utf-8\"),\n\t\tfirstLineExceedsLimit: false,\n\t\tlastLinePartial: false,\n\t});\n}\n\nexport function buildPiGrepError(error: string): PiGrepExecResult {\n\treturn create(PiGrepExecResultSchema, {\n\t\tresult: { case: \"error\", value: create(PiGrepExecErrorSchema, { error }) },\n\t});\n}\n\nexport function buildPiFindResult(toolResult: ToolResultMessage): PiFindExecResult {\n\tconst text = piOutputText(toolResult);\n\tif (toolResult.isError) return buildPiFindError(text || \"Find failed\");\n\treturn create(PiFindExecResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(PiFindExecSuccessSchema, {\n\t\t\t\toutput: text,\n\t\t\t\ttruncation: piTruncation(toolResult),\n\t\t\t\tresultLimitReached: resultLimitReached(toolResult),\n\t\t\t}),\n\t\t},\n\t});\n}\n\nexport function buildPiFindError(error: string): PiFindExecResult {\n\treturn create(PiFindExecResultSchema, {\n\t\tresult: { case: \"error\", value: create(PiFindExecErrorSchema, { error }) },\n\t});\n}\n\nexport function buildPiLsResult(toolResult: ToolResultMessage): PiLsExecResult {\n\tconst text = piOutputText(toolResult);\n\tif (toolResult.isError) return buildPiLsError(text || \"Ls failed\");\n\treturn create(PiLsExecResultSchema, {\n\t\tresult: {\n\t\t\tcase: \"success\",\n\t\t\tvalue: create(PiLsExecSuccessSchema, {\n\t\t\t\toutput: text,\n\t\t\t\ttruncation: piTruncation(toolResult),\n\t\t\t\tentryLimitReached: resultLimitReached(toolResult),\n\t\t\t}),\n\t\t},\n\t});\n}\n\nexport function buildPiLsError(error: string): PiLsExecResult {\n\treturn create(PiLsExecResultSchema, {\n\t\tresult: { case: \"error\", value: create(PiLsExecErrorSchema, { error }) },\n\t});\n}\n\n/**\n * Answer `mcpStateExecArgs` (frame 36) from the catalog already advertised in\n * `RequestContext.tools`.\n *\n * This client hosts no MCP servers of its own: every forwarded tool is a\n * local tool published under a synthetic `providerIdentifier`. Regrouping the\n * same list keeps the server's view of \"which servers exist and what do they\n * expose\" consistent with what it was told at context time.\n *\n * `serverIdentifiers` filters the answer when the server asks about specific\n * servers. A restart request is answered with the same state rather than an\n * error — there is nothing to restart.\n */\nexport function buildMcpStateResult(\n\ttools: McpToolDefinition[],\n\tserverIdentifiers: readonly string[],\n): McpStateExecResult {\n\tconst byProvider = new Map<string, McpToolDefinition[]>();\n\tfor (const tool of tools) {\n\t\tconst identifier = tool.providerIdentifier;\n\t\tconst existing = byProvider.get(identifier);\n\t\tif (existing) existing.push(tool);\n\t\telse byProvider.set(identifier, [tool]);\n\t}\n\n\tconst wanted = serverIdentifiers.length > 0 ? new Set(serverIdentifiers) : undefined;\n\tconst servers = [];\n\tfor (const [identifier, serverTools] of byProvider) {\n\t\tif (wanted && !wanted.has(identifier)) continue;\n\t\tservers.push(\n\t\t\tcreate(McpStateServerSchema, {\n\t\t\t\tserverName: identifier,\n\t\t\t\tserverIdentifier: identifier,\n\t\t\t\ttools: serverTools,\n\t\t\t\tstatus: \"connected\",\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn create(McpStateExecResultSchema, {\n\t\tresult: { case: \"success\", value: create(McpStateSuccessSchema, { servers }) },\n\t});\n}\n\n/**\n * Build the neutral response for a hook query: the matching response case\n * with every field unset.\n *\n * This client runs no Cursor hooks, and every field of every response variant\n * is `optional` — so an empty response of the right case means \"no hook had\n * anything to say\", which is exactly true. Returns `null` for a request case\n * this build does not model, which the dispatcher answers with\n * `ExecClientThrow` rather than guessing a case.\n */\nexport function buildNeutralHookResult(request: ExecuteHookRequest | undefined): ExecuteHookResult | null {\n\tlet response: ExecuteHookResponse;\n\tswitch (request?.request.case) {\n\t\tcase \"preCompact\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"preCompact\", value: create(PreCompactRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"subagentStart\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"subagentStart\", value: create(SubagentStartRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"subagentStop\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"subagentStop\", value: create(SubagentStopRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"preToolUse\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"preToolUse\", value: create(PreToolUseRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"postToolUse\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"postToolUse\", value: create(PostToolUseRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"postToolUseFailure\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"postToolUseFailure\", value: create(PostToolUseFailureRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"beforeSubmitPrompt\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"beforeSubmitPrompt\", value: create(BeforeSubmitPromptRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"afterAgentResponse\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"afterAgentResponse\", value: create(AfterAgentResponseRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"afterAgentThought\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"afterAgentThought\", value: create(AfterAgentThoughtRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"stop\":\n\t\t\tresponse = create(ExecuteHookResponseSchema, {\n\t\t\t\tresponse: { case: \"stop\", value: create(StopRequestResponseSchema, {}) },\n\t\t\t});\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n\treturn create(ExecuteHookResultSchema, { response });\n}\n"]}
|