@cursor/july 0.1.2 → 0.1.3
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/AGENTS.md +16 -5
- package/README.md +8 -9
- package/dist/bin/agent-serve.d.ts +3 -1
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +389 -152
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.Oje4vhlk.js → app.BR0RbIdx.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DtIOQzGj.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.H5XZ2zCB.js → VPLocalSearchBox.qjsVTneI.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CTR_TuaE.js → theme.2Kg8jIp_.js} +2 -2
- package/dist/docs/assets/{quickstart.md.CfU8_uTC.js → quickstart.md.BU6Iwi_9.js} +18 -6
- package/dist/docs/assets/{reference_cli.md.DA730zCu.js → reference_cli.md.Bv6pOxcF.js} +11 -6
- package/dist/docs/assets/{reference_cli.md.DA730zCu.lean.js → reference_cli.md.Bv6pOxcF.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +3 -3
- package/dist/docs/concepts.html +3 -3
- package/dist/docs/deployment.html +3 -3
- package/dist/docs/evals.html +3 -3
- package/dist/docs/guides/agent-to-agent.html +3 -3
- package/dist/docs/guides/cloud-runtime.html +3 -3
- package/dist/docs/guides/github.html +3 -3
- package/dist/docs/guides/human-in-the-loop.html +3 -3
- package/dist/docs/guides/slack.html +3 -3
- package/dist/docs/guides/webhooks.html +3 -3
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +3 -3
- package/dist/docs/index.html +3 -3
- package/dist/docs/quickstart.html +22 -10
- package/dist/docs/reference/agent-config.html +3 -3
- package/dist/docs/reference/channels.html +3 -3
- package/dist/docs/reference/cli.html +14 -9
- package/dist/docs/reference/connections.html +3 -3
- package/dist/docs/reference/hooks.html +3 -3
- package/dist/docs/reference/http-api.html +3 -3
- package/dist/docs/reference/instructions.html +3 -3
- package/dist/docs/reference/playground.html +3 -3
- package/dist/docs/reference/project-layout.html +3 -3
- package/dist/docs/reference/schedules.html +3 -3
- package/dist/docs/reference/sessions.html +3 -3
- package/dist/docs/reference/skills.html +3 -3
- package/dist/docs/reference/subagents.html +3 -3
- package/dist/docs/reference/tools.html +3 -3
- package/dist/docs/scaffolding-agents.html +3 -3
- package/dist/docs/storage.html +3 -3
- package/dist/docs/troubleshooting.html +3 -3
- package/dist/internal/chat-client.d.ts +29 -3
- package/dist/internal/chat-client.d.ts.map +1 -1
- package/dist/internal/chat-client.js +180 -27
- package/dist/internal/cli-ax.d.ts +75 -2
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +600 -52
- package/dist/internal/cli-cursor.d.ts.map +1 -1
- package/dist/internal/cli-cursor.js +8 -36
- package/dist/internal/cli-deploy.d.ts +59 -3
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +316 -38
- package/dist/internal/cursor/credentials.d.ts +9 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +12 -0
- package/dist/internal/deploy-client.d.ts +9 -1
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +23 -3
- package/dist/internal/deploy-source.d.ts +35 -0
- package/dist/internal/deploy-source.d.ts.map +1 -0
- package/dist/internal/deploy-source.js +118 -0
- package/dist/internal/discovery.d.ts +11 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +43 -14
- package/dist/internal/eval-run-store.d.ts.map +1 -1
- package/dist/internal/eval-run-store.js +2 -1
- package/dist/internal/eval-runner.d.ts +2 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +2 -0
- package/dist/internal/event-mapper.d.ts +54 -1
- package/dist/internal/event-mapper.d.ts.map +1 -1
- package/dist/internal/event-mapper.js +151 -41
- package/dist/internal/init-project.d.ts +88 -1
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +221 -31
- package/dist/internal/install-cursor-skills.d.ts +64 -0
- package/dist/internal/install-cursor-skills.d.ts.map +1 -0
- package/dist/internal/install-cursor-skills.js +274 -0
- package/dist/internal/logs-client.d.ts +60 -0
- package/dist/internal/logs-client.d.ts.map +1 -0
- package/dist/internal/logs-client.js +311 -0
- package/dist/internal/open-browser.d.ts +5 -0
- package/dist/internal/open-browser.d.ts.map +1 -0
- package/dist/internal/open-browser.js +34 -0
- package/dist/internal/playground/toolchain.d.ts.map +1 -1
- package/dist/internal/playground/toolchain.js +16 -11
- package/dist/internal/playground-proxy.d.ts +69 -0
- package/dist/internal/playground-proxy.d.ts.map +1 -0
- package/dist/internal/playground-proxy.js +468 -0
- package/dist/internal/prompt-context.d.ts +35 -0
- package/dist/internal/prompt-context.d.ts.map +1 -0
- package/dist/internal/prompt-context.js +71 -0
- package/dist/internal/request-headers.d.ts +11 -0
- package/dist/internal/request-headers.d.ts.map +1 -0
- package/dist/internal/request-headers.js +14 -0
- package/dist/internal/resolve-prod-target.d.ts +42 -0
- package/dist/internal/resolve-prod-target.d.ts.map +1 -0
- package/dist/internal/resolve-prod-target.js +111 -0
- package/dist/internal/run-client.d.ts +2 -2
- package/dist/internal/run-client.d.ts.map +1 -1
- package/dist/internal/run-client.js +38 -23
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +10 -4
- package/dist/internal/session-engine.d.ts +1 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +21 -6
- package/dist/internal/sessions-client.d.ts +21 -0
- package/dist/internal/sessions-client.d.ts.map +1 -0
- package/dist/internal/sessions-client.js +168 -0
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +31 -3
- package/dist/internal/terminal-style.d.ts +22 -0
- package/dist/internal/terminal-style.d.ts.map +1 -0
- package/dist/internal/terminal-style.js +49 -0
- package/dist/internal/trajectory.d.ts +10 -5
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +82 -10
- package/dist/internal/workspace.d.ts +11 -0
- package/dist/internal/workspace.d.ts.map +1 -1
- package/dist/internal/workspace.js +38 -4
- package/dist/playground/assets/index-D-vo2lV_.css +1 -0
- package/dist/playground/assets/index-x60b9q2j.js +312 -0
- package/dist/playground/index.html +2 -2
- package/dist/types.d.ts +26 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/quickstart.md +22 -7
- package/docs/reference/cli.md +51 -3
- package/package.json +3 -1
- package/skills/ab/SKILL.md +8 -8
- package/skills/create-agent/SKILL.md +28 -22
- package/skills/debug/SKILL.md +11 -11
- package/skills/evals/SKILL.md +16 -16
- package/skills/framework-map/SKILL.md +6 -6
- package/skills/github/SKILL.md +13 -13
- package/skills/hillclimb/SKILL.md +10 -10
- package/skills/setup-slack/SKILL.md +13 -13
- package/src/bin/agent-serve.ts +422 -188
- package/src/internal/chat-client.ts +252 -37
- package/src/internal/cli-ax.ts +722 -72
- package/src/internal/cli-cursor.ts +14 -42
- package/src/internal/cli-deploy.ts +428 -49
- package/src/internal/cursor/credentials.ts +14 -0
- package/src/internal/deploy-client.ts +45 -4
- package/src/internal/deploy-source.ts +133 -0
- package/src/internal/discovery.ts +53 -16
- package/src/internal/eval-run-store.ts +2 -1
- package/src/internal/eval-runner.ts +5 -0
- package/src/internal/event-mapper.ts +222 -42
- package/src/internal/init-project.ts +333 -51
- package/src/internal/install-cursor-skills.ts +327 -0
- package/src/internal/logs-client.ts +442 -0
- package/src/internal/open-browser.ts +41 -0
- package/src/internal/playground/toolchain.ts +15 -13
- package/src/internal/playground-proxy.ts +576 -0
- package/src/internal/prompt-context.ts +95 -0
- package/src/internal/request-headers.ts +23 -0
- package/src/internal/resolve-prod-target.ts +150 -0
- package/src/internal/run-client.ts +39 -36
- package/src/internal/server.ts +12 -3
- package/src/internal/session-engine.ts +22 -3
- package/src/internal/sessions-client.ts +182 -0
- package/src/internal/stream-progress.ts +36 -2
- package/src/internal/terminal-style.ts +74 -0
- package/src/internal/trajectory.ts +91 -13
- package/src/internal/workspace.ts +42 -4
- package/src/types.ts +42 -6
- package/dist/docs/assets/chunks/@localSearchIndexroot.zwQ9RCQ7.js +0 -1
- package/dist/playground/assets/index-B1Qc9h2u.css +0 -1
- package/dist/playground/assets/index-CpDYCj8W.js +0 -79
- /package/dist/docs/assets/{quickstart.md.CfU8_uTC.lean.js → quickstart.md.BU6Iwi_9.lean.js} +0 -0
|
@@ -21,7 +21,7 @@ export function createStreamProgress(options) {
|
|
|
21
21
|
const elapsed = (since) => `${Date.now() - since}ms`;
|
|
22
22
|
return {
|
|
23
23
|
onEvent(event) {
|
|
24
|
-
var _a, _b;
|
|
24
|
+
var _a, _b, _c;
|
|
25
25
|
switch (event.type) {
|
|
26
26
|
case "session.started": {
|
|
27
27
|
write(c.dim(`session ${event.sessionId}\n`));
|
|
@@ -49,6 +49,9 @@ export function createStreamProgress(options) {
|
|
|
49
49
|
break;
|
|
50
50
|
}
|
|
51
51
|
case "reasoning.appended": {
|
|
52
|
+
if (event.data.parentCallId !== undefined) {
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
52
55
|
if (!thinkingShown) {
|
|
53
56
|
thinkingShown = true;
|
|
54
57
|
write(c.dim(" · thinking…\n"));
|
|
@@ -56,6 +59,11 @@ export function createStreamProgress(options) {
|
|
|
56
59
|
break;
|
|
57
60
|
}
|
|
58
61
|
case "message.appended": {
|
|
62
|
+
// Nested subagent deltas stay inside the task chip/indent, not
|
|
63
|
+
// the parent agent stream.
|
|
64
|
+
if (event.data.parentCallId !== undefined) {
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
59
67
|
if (!assistantOpen) {
|
|
60
68
|
write(`${c.green("‹ agent")} `);
|
|
61
69
|
assistantOpen = true;
|
|
@@ -64,6 +72,9 @@ export function createStreamProgress(options) {
|
|
|
64
72
|
break;
|
|
65
73
|
}
|
|
66
74
|
case "message.completed": {
|
|
75
|
+
if (event.data.parentCallId !== undefined) {
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
67
78
|
closeAssistant();
|
|
68
79
|
break;
|
|
69
80
|
}
|
|
@@ -79,8 +90,16 @@ export function createStreamProgress(options) {
|
|
|
79
90
|
closeAssistant();
|
|
80
91
|
const now = Date.now();
|
|
81
92
|
for (const call of event.data.calls) {
|
|
93
|
+
if (call.toolName === "task" && call.parentCallId === undefined) {
|
|
94
|
+
// Covered by subagent.called; avoid a duplicate bare `task` line.
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
82
97
|
toolStartedAt.set(call.callId, now);
|
|
83
|
-
|
|
98
|
+
const indent = call.parentCallId !== undefined ||
|
|
99
|
+
event.data.parentCallId !== undefined
|
|
100
|
+
? " "
|
|
101
|
+
: " ";
|
|
102
|
+
write(`${indent}${c.magenta("⚙")} ${c.bold(call.toolName)}${c.dim(formatArgs(call.args))}\n`);
|
|
84
103
|
}
|
|
85
104
|
break;
|
|
86
105
|
}
|
|
@@ -95,11 +114,16 @@ export function createStreamProgress(options) {
|
|
|
95
114
|
break;
|
|
96
115
|
}
|
|
97
116
|
case "action.result": {
|
|
117
|
+
if (event.data.toolName === "task" &&
|
|
118
|
+
event.data.parentCallId === undefined) {
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
98
121
|
const started = toolStartedAt.get(event.data.callId);
|
|
99
122
|
toolStartedAt.delete(event.data.callId);
|
|
100
123
|
const dur = started === undefined ? "" : c.dim(` ${elapsed(started)}`);
|
|
101
124
|
const mark = event.data.isError ? c.red("✗") : c.magenta("✓");
|
|
102
|
-
|
|
125
|
+
const indent = event.data.parentCallId !== undefined ? " " : " ";
|
|
126
|
+
write(`${indent}${mark} ${c.bold(event.data.toolName)}${dur} ${c.dim(truncate(stringify(event.data.output), 90))}\n`);
|
|
103
127
|
break;
|
|
104
128
|
}
|
|
105
129
|
case "subagent.called": {
|
|
@@ -110,6 +134,10 @@ export function createStreamProgress(options) {
|
|
|
110
134
|
write(` ${c.magenta("task")} ${c.bold((_b = event.data.name) !== null && _b !== void 0 ? _b : "subagent")}${c.dim(detail)}\n`);
|
|
111
135
|
break;
|
|
112
136
|
}
|
|
137
|
+
case "subagent.completed": {
|
|
138
|
+
write(` ${c.magenta("✓")} ${c.bold((_c = event.data.name) !== null && _c !== void 0 ? _c : "subagent")} ${c.dim("done")}\n`);
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
113
141
|
case "turn.completed": {
|
|
114
142
|
closeAssistant();
|
|
115
143
|
const usage = event.data.usage;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny ANSI helpers for CLI progress output. Respects `NO_COLOR` and
|
|
3
|
+
* only enables when the target stream is a TTY.
|
|
4
|
+
*/
|
|
5
|
+
export interface TerminalPalette {
|
|
6
|
+
dim: (s: string) => string;
|
|
7
|
+
bold: (s: string) => string;
|
|
8
|
+
cyan: (s: string) => string;
|
|
9
|
+
green: (s: string) => string;
|
|
10
|
+
red: (s: string) => string;
|
|
11
|
+
magenta: (s: string) => string;
|
|
12
|
+
yellow: (s: string) => string;
|
|
13
|
+
}
|
|
14
|
+
export declare function colorEnabledFor(stream?: NodeJS.WriteStream): boolean;
|
|
15
|
+
export declare function makePalette(enabled: boolean): TerminalPalette;
|
|
16
|
+
/** Palette for human-facing stdout (init summaries, next steps). */
|
|
17
|
+
export declare function stdoutPalette(): TerminalPalette;
|
|
18
|
+
/** Palette for human-facing stderr (login progress, warnings). */
|
|
19
|
+
export declare function stderrPalette(): TerminalPalette;
|
|
20
|
+
/** Wipe the terminal before a `dev` Enter-to-restart cycle. */
|
|
21
|
+
export declare function clearTerminal(stream?: NodeJS.WriteStream): void;
|
|
22
|
+
//# sourceMappingURL=terminal-style.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-style.d.ts","sourceRoot":"","sources":["../../src/internal/terminal-style.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7B,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/B;AAcD,wBAAgB,eAAe,CAC7B,MAAM,GAAE,MAAM,CAAC,WAA4B,GAC1C,OAAO,CAET;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAiB7D;AAED,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,eAAe,CAE/C;AAED,kEAAkE;AAClE,wBAAgB,aAAa,IAAI,eAAe,CAE/C;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAC3B,MAAM,GAAE,MAAM,CAAC,WAA4B,GAC1C,IAAI,CAMN"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny ANSI helpers for CLI progress output. Respects `NO_COLOR` and
|
|
3
|
+
* only enables when the target stream is a TTY.
|
|
4
|
+
*/
|
|
5
|
+
import { clearScreenDown, cursorTo } from "node:readline";
|
|
6
|
+
const IDENTITY = (s) => s;
|
|
7
|
+
const PLAIN = {
|
|
8
|
+
dim: IDENTITY,
|
|
9
|
+
bold: IDENTITY,
|
|
10
|
+
cyan: IDENTITY,
|
|
11
|
+
green: IDENTITY,
|
|
12
|
+
red: IDENTITY,
|
|
13
|
+
magenta: IDENTITY,
|
|
14
|
+
yellow: IDENTITY,
|
|
15
|
+
};
|
|
16
|
+
export function colorEnabledFor(stream = process.stdout) {
|
|
17
|
+
return stream.isTTY === true && process.env.NO_COLOR === undefined;
|
|
18
|
+
}
|
|
19
|
+
export function makePalette(enabled) {
|
|
20
|
+
if (!enabled) {
|
|
21
|
+
return PLAIN;
|
|
22
|
+
}
|
|
23
|
+
const wrap = (code) => (s) => `\u001b[${code}m${s}\u001b[0m`;
|
|
24
|
+
return {
|
|
25
|
+
dim: wrap("2"),
|
|
26
|
+
bold: wrap("1"),
|
|
27
|
+
cyan: wrap("36"),
|
|
28
|
+
green: wrap("32"),
|
|
29
|
+
red: wrap("31"),
|
|
30
|
+
magenta: wrap("35"),
|
|
31
|
+
yellow: wrap("33"),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Palette for human-facing stdout (init summaries, next steps). */
|
|
35
|
+
export function stdoutPalette() {
|
|
36
|
+
return makePalette(colorEnabledFor(process.stdout));
|
|
37
|
+
}
|
|
38
|
+
/** Palette for human-facing stderr (login progress, warnings). */
|
|
39
|
+
export function stderrPalette() {
|
|
40
|
+
return makePalette(colorEnabledFor(process.stderr));
|
|
41
|
+
}
|
|
42
|
+
/** Wipe the terminal before a `dev` Enter-to-restart cycle. */
|
|
43
|
+
export function clearTerminal(stream = process.stdout) {
|
|
44
|
+
if (stream.isTTY !== true) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
cursorTo(stream, 0, 0);
|
|
48
|
+
clearScreenDown(stream);
|
|
49
|
+
}
|
|
@@ -14,6 +14,15 @@ export interface TrajectoryToolCall {
|
|
|
14
14
|
isError: boolean;
|
|
15
15
|
/** Present when the tool required human approval before execute. */
|
|
16
16
|
approvalDecision?: "approve" | "deny";
|
|
17
|
+
/** Parent task/subagent call id when this tool ran inside a subagent. */
|
|
18
|
+
parentCallId?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface TrajectorySubagent {
|
|
21
|
+
callId: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
/** Nested tool calls streamed while this subagent was running. */
|
|
25
|
+
toolCalls: TrajectoryToolCall[];
|
|
17
26
|
}
|
|
18
27
|
export interface TrajectoryTurn {
|
|
19
28
|
turnId: string;
|
|
@@ -21,11 +30,7 @@ export interface TrajectoryTurn {
|
|
|
21
30
|
assistantText: string;
|
|
22
31
|
reasoningText?: string;
|
|
23
32
|
toolCalls: TrajectoryToolCall[];
|
|
24
|
-
subagents:
|
|
25
|
-
callId: string;
|
|
26
|
-
name?: string;
|
|
27
|
-
description?: string;
|
|
28
|
-
}>;
|
|
33
|
+
subagents: TrajectorySubagent[];
|
|
29
34
|
usage?: TurnUsage;
|
|
30
35
|
result?: string;
|
|
31
36
|
failed: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/internal/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"trajectory.d.ts","sourceRoot":"","sources":["../../src/internal/trajectory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACtC,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,UAAU,CA4NlE;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAc9D;AAED,sDAAsD;AACtD,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAuDnE"}
|
|
@@ -20,7 +20,7 @@ import { readFile } from "node:fs/promises";
|
|
|
20
20
|
* folded into final assistant / reasoning text per turn.
|
|
21
21
|
*/
|
|
22
22
|
export function buildTrajectory(events) {
|
|
23
|
-
var _a;
|
|
23
|
+
var _a, _b;
|
|
24
24
|
let sessionId = "";
|
|
25
25
|
let sdkAgentId;
|
|
26
26
|
let agentUrl;
|
|
@@ -65,12 +65,20 @@ export function buildTrajectory(events) {
|
|
|
65
65
|
break;
|
|
66
66
|
}
|
|
67
67
|
case "message.completed": {
|
|
68
|
+
// Nested subagent text must not overwrite the parent turn reply.
|
|
69
|
+
if (event.data.parentCallId !== undefined) {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
68
72
|
if (event.turnId !== undefined && event.data.text !== "") {
|
|
69
73
|
ensureTurn(event.turnId).assistantText = event.data.text;
|
|
70
74
|
}
|
|
71
75
|
break;
|
|
72
76
|
}
|
|
73
77
|
case "reasoning.appended": {
|
|
78
|
+
// Nested subagent thinking stays off the parent turn transcript.
|
|
79
|
+
if (event.data.parentCallId !== undefined) {
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
74
82
|
if (event.turnId !== undefined) {
|
|
75
83
|
ensureTurn(event.turnId).reasoningText = event.data.text;
|
|
76
84
|
}
|
|
@@ -82,9 +90,29 @@ export function buildTrajectory(events) {
|
|
|
82
90
|
}
|
|
83
91
|
const turn = ensureTurn(event.turnId);
|
|
84
92
|
for (const call of event.data.calls) {
|
|
85
|
-
const
|
|
93
|
+
const parentCallId = (_a = call.parentCallId) !== null && _a !== void 0 ? _a : event.data.parentCallId;
|
|
94
|
+
// Keep bare top-level `task` in toolCalls so evals like
|
|
95
|
+
// `calledTool("task")` / `notCalledTool("task")` keep working.
|
|
96
|
+
// Nested progress also appears under `subagents`.
|
|
97
|
+
const entry = {
|
|
98
|
+
callId: call.callId,
|
|
99
|
+
toolName: call.toolName,
|
|
100
|
+
isError: false,
|
|
101
|
+
args: call.args,
|
|
102
|
+
parentCallId,
|
|
103
|
+
};
|
|
86
104
|
pendingCalls.set(call.callId, entry);
|
|
87
|
-
|
|
105
|
+
if (parentCallId !== undefined) {
|
|
106
|
+
let sub = turn.subagents.find((s) => s.callId === parentCallId);
|
|
107
|
+
if (sub === undefined) {
|
|
108
|
+
sub = { callId: parentCallId, toolCalls: [] };
|
|
109
|
+
turn.subagents.push(sub);
|
|
110
|
+
}
|
|
111
|
+
sub.toolCalls.push(entry);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
turn.toolCalls.push(entry);
|
|
115
|
+
}
|
|
88
116
|
}
|
|
89
117
|
break;
|
|
90
118
|
}
|
|
@@ -107,20 +135,47 @@ export function buildTrajectory(events) {
|
|
|
107
135
|
pending.toolName = event.data.toolName;
|
|
108
136
|
}
|
|
109
137
|
else if (event.turnId !== undefined) {
|
|
110
|
-
ensureTurn(event.turnId)
|
|
138
|
+
const turn = ensureTurn(event.turnId);
|
|
139
|
+
const entry = {
|
|
111
140
|
callId: event.data.callId,
|
|
112
141
|
toolName: event.data.toolName,
|
|
113
142
|
output: event.data.output,
|
|
114
143
|
isError: event.data.isError,
|
|
115
|
-
|
|
144
|
+
parentCallId: event.data.parentCallId,
|
|
145
|
+
};
|
|
146
|
+
if (event.data.parentCallId !== undefined) {
|
|
147
|
+
let sub = turn.subagents.find((s) => s.callId === event.data.parentCallId);
|
|
148
|
+
if (sub === undefined) {
|
|
149
|
+
sub = {
|
|
150
|
+
callId: event.data.parentCallId,
|
|
151
|
+
toolCalls: [],
|
|
152
|
+
};
|
|
153
|
+
turn.subagents.push(sub);
|
|
154
|
+
}
|
|
155
|
+
sub.toolCalls.push(entry);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
turn.toolCalls.push(entry);
|
|
159
|
+
}
|
|
116
160
|
}
|
|
117
161
|
break;
|
|
118
162
|
}
|
|
119
163
|
case "subagent.called": {
|
|
120
164
|
if (event.turnId !== undefined) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
165
|
+
const turn = ensureTurn(event.turnId);
|
|
166
|
+
const existing = turn.subagents.find((s) => s.callId === event.data.callId);
|
|
167
|
+
if (existing !== undefined) {
|
|
168
|
+
existing.name = event.data.name;
|
|
169
|
+
existing.description = event.data.description;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
turn.subagents.push({
|
|
173
|
+
callId: event.data.callId,
|
|
174
|
+
name: event.data.name,
|
|
175
|
+
description: event.data.description,
|
|
176
|
+
toolCalls: [],
|
|
177
|
+
});
|
|
178
|
+
}
|
|
124
179
|
}
|
|
125
180
|
break;
|
|
126
181
|
}
|
|
@@ -163,9 +218,11 @@ export function buildTrajectory(events) {
|
|
|
163
218
|
}
|
|
164
219
|
const turns = turnOrder.map((id) => turnsById.get(id));
|
|
165
220
|
const turnsFailed = turns.filter((t) => t.failed).length;
|
|
166
|
-
const toolCallCount = turns.reduce((n, t) => n +
|
|
221
|
+
const toolCallCount = turns.reduce((n, t) => n +
|
|
222
|
+
t.toolCalls.length +
|
|
223
|
+
t.subagents.reduce((m, s) => m + s.toolCalls.length, 0), 0);
|
|
167
224
|
const lastGood = [...turns].reverse().find((t) => t.assistantText !== "");
|
|
168
|
-
return Object.assign(Object.assign(Object.assign(Object.assign({ sessionId }, (sdkAgentId === undefined ? {} : { sdkAgentId })), (agentUrl === undefined ? {} : { agentUrl })), (channelId === undefined ? {} : { channelId })), { ok: turnsFailed === 0 && turns.length > 0, finalText: (
|
|
225
|
+
return Object.assign(Object.assign(Object.assign(Object.assign({ sessionId }, (sdkAgentId === undefined ? {} : { sdkAgentId })), (agentUrl === undefined ? {} : { agentUrl })), (channelId === undefined ? {} : { channelId })), { ok: turnsFailed === 0 && turns.length > 0, finalText: (_b = lastGood === null || lastGood === void 0 ? void 0 : lastGood.assistantText) !== null && _b !== void 0 ? _b : "", turnsFailed,
|
|
169
226
|
toolCallCount,
|
|
170
227
|
turns });
|
|
171
228
|
}
|
|
@@ -195,6 +252,7 @@ export function loadTrajectoryFromEventsFile(path) {
|
|
|
195
252
|
}
|
|
196
253
|
/** Human-readable one-line-per-turn dump (for non-JSON CLI output). */
|
|
197
254
|
export function formatTrajectoryText(trajectory) {
|
|
255
|
+
var _a;
|
|
198
256
|
const lines = [];
|
|
199
257
|
lines.push(`session ${trajectory.sessionId || "(unknown)"} ok=${trajectory.ok}`);
|
|
200
258
|
if (trajectory.sdkAgentId !== undefined) {
|
|
@@ -217,6 +275,20 @@ export function formatTrajectoryText(trajectory) {
|
|
|
217
275
|
lines.push(` ${truncate(stringify(call.output), 160)}`);
|
|
218
276
|
}
|
|
219
277
|
}
|
|
278
|
+
for (const sub of turn.subagents) {
|
|
279
|
+
const label = (_a = sub.name) !== null && _a !== void 0 ? _a : "subagent";
|
|
280
|
+
const detail = sub.description !== undefined
|
|
281
|
+
? ` — ${truncate(sub.description, 80)}`
|
|
282
|
+
: "";
|
|
283
|
+
lines.push(` task ${label}${detail}`);
|
|
284
|
+
for (const call of sub.toolCalls) {
|
|
285
|
+
const mark = call.isError ? "✗" : "→";
|
|
286
|
+
lines.push(` ${mark} ${call.toolName}${formatArgs(call.args)}`);
|
|
287
|
+
if (call.output !== undefined) {
|
|
288
|
+
lines.push(` ${truncate(stringify(call.output), 160)}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
220
292
|
if (turn.assistantText.length > 0) {
|
|
221
293
|
lines.push(` agent: ${truncate(turn.assistantText, 400)}`);
|
|
222
294
|
}
|
|
@@ -18,6 +18,17 @@ export interface MaterializeWorkspaceOptions {
|
|
|
18
18
|
}
|
|
19
19
|
/** Relative path of an agent-side tool script inside the session workspace. */
|
|
20
20
|
export declare function agentToolScriptPath(toolName: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Always-on identity line prepended when composing instructions. Sourced from
|
|
23
|
+
* {@link ResolvedAgent.name} (`defineAgent({ name })`, else package/dir name)
|
|
24
|
+
* so agents know who they are without restating it in authored prose.
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildIdentityPreamble(name: string): string;
|
|
27
|
+
/**
|
|
28
|
+
* Prepend {@link buildIdentityPreamble} to authored instructions. Used when
|
|
29
|
+
* loading `instructions.md` / `.ts` / dir into {@link ResolvedAgent.instructions}.
|
|
30
|
+
*/
|
|
31
|
+
export declare function withIdentityPreamble(name: string, instructions: string | undefined): string | undefined;
|
|
21
32
|
/**
|
|
22
33
|
* Markdown catalog of agent-side tools for AGENTS.md / cloud first prompt.
|
|
23
34
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/internal/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/internal/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,aAAa,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,IAAI,EAAE,OAAO,CAAC;CACf;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GAAG,SAAS,GAC/B,MAAM,GAAG,SAAS,CAapB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE;IAAE,cAAc,EAAE,OAAO,CAAA;CAA8B,GAC/D,MAAM,CA6CR;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAqCf;AAmDD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAO3D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -18,10 +18,42 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
18
18
|
import { chmod, copyFile, mkdir, stat, writeFile } from "node:fs/promises";
|
|
19
19
|
import { dirname, join, relative, resolve } from "node:path";
|
|
20
20
|
import { parseFrontmatter, serializeFrontmatter } from "./frontmatter.js";
|
|
21
|
+
import { buildIdentitySection } from "./prompt-context.js";
|
|
21
22
|
/** Relative path of an agent-side tool script inside the session workspace. */
|
|
22
23
|
export function agentToolScriptPath(toolName) {
|
|
23
24
|
return `.agent-serve/tools/${toolName}.sh`;
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Always-on identity line prepended when composing instructions. Sourced from
|
|
28
|
+
* {@link ResolvedAgent.name} (`defineAgent({ name })`, else package/dir name)
|
|
29
|
+
* so agents know who they are without restating it in authored prose.
|
|
30
|
+
*/
|
|
31
|
+
export function buildIdentityPreamble(name) {
|
|
32
|
+
const trimmed = name.trim();
|
|
33
|
+
if (trimmed === "") {
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
return `You are ${trimmed}. That is your name; use it when people ask who you are.`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Prepend {@link buildIdentityPreamble} to authored instructions. Used when
|
|
40
|
+
* loading `instructions.md` / `.ts` / dir into {@link ResolvedAgent.instructions}.
|
|
41
|
+
*/
|
|
42
|
+
export function withIdentityPreamble(name, instructions) {
|
|
43
|
+
var _a;
|
|
44
|
+
const preamble = buildIdentityPreamble(name);
|
|
45
|
+
const body = (_a = instructions === null || instructions === void 0 ? void 0 : instructions.trim()) !== null && _a !== void 0 ? _a : "";
|
|
46
|
+
if (preamble === "" && body === "") {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
if (preamble === "") {
|
|
50
|
+
return body === "" ? undefined : body;
|
|
51
|
+
}
|
|
52
|
+
if (body === "") {
|
|
53
|
+
return preamble;
|
|
54
|
+
}
|
|
55
|
+
return `${preamble}\n\n${body}`;
|
|
56
|
+
}
|
|
25
57
|
/**
|
|
26
58
|
* Markdown catalog of agent-side tools for AGENTS.md / cloud first prompt.
|
|
27
59
|
*
|
|
@@ -80,12 +112,14 @@ export function materializeWorkspace(options) {
|
|
|
80
112
|
const agentToolsSection = buildAgentToolsCatalog(agent.tools, {
|
|
81
113
|
includeScripts: false,
|
|
82
114
|
});
|
|
83
|
-
const agentsMd = [
|
|
115
|
+
const agentsMd = [
|
|
116
|
+
(_b = (_a = agent.instructions) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : "",
|
|
117
|
+
buildIdentitySection(agent),
|
|
118
|
+
agentToolsSection,
|
|
119
|
+
]
|
|
84
120
|
.filter((part) => part !== "")
|
|
85
121
|
.join("\n\n");
|
|
86
|
-
|
|
87
|
-
yield writeFile(join(workspaceDir, "AGENTS.md"), agentsMd, "utf8");
|
|
88
|
-
}
|
|
122
|
+
yield writeFile(join(workspaceDir, "AGENTS.md"), agentsMd, "utf8");
|
|
89
123
|
for (const tool of agent.tools) {
|
|
90
124
|
if (tool.execution !== "agent" || tool.script === undefined) {
|
|
91
125
|
continue;
|