@cursor/july 0.1.9 → 0.1.11
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 +1 -0
- package/dist/bin/agent-serve.js +26 -3
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +2 -1
- package/dist/channels/github/types.d.ts +4 -0
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/slack/cursor-account.d.ts.map +1 -1
- package/dist/channels/slack/cursor-account.js +1 -1
- package/dist/channels/slack/dispatch.d.ts +13 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +36 -11
- package/dist/channels/slack/eval-directive.d.ts +63 -0
- package/dist/channels/slack/eval-directive.d.ts.map +1 -0
- package/dist/channels/slack/eval-directive.js +283 -0
- package/dist/channels/slack/index.d.ts +1 -0
- package/dist/channels/slack/index.d.ts.map +1 -1
- package/dist/channels/slack/index.js +1 -0
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +4 -2
- package/dist/channels/slack/types.d.ts +7 -0
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/connections.d.ts +10 -5
- package/dist/connections.d.ts.map +1 -1
- package/dist/connections.js +10 -5
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.Ciosf24M.js → app.BcXUGca7.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BIbvK8M1.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.BcRDly7n.js → VPLocalSearchBox.CWur6XGZ.js} +1 -1
- package/dist/docs/assets/chunks/{theme.CMpbjdfx.js → theme.BnvulOX2.js} +2 -2
- package/dist/docs/assets/{deployment.md.DC5-ImcM.js → deployment.md.TecHo0_2.js} +3 -3
- package/dist/docs/assets/{deployment.md.DC5-ImcM.lean.js → deployment.md.TecHo0_2.lean.js} +1 -1
- package/dist/docs/assets/guides_mcp-oauth.md.DqmEOQY1.js +29 -0
- package/dist/docs/assets/guides_mcp-oauth.md.DqmEOQY1.lean.js +1 -0
- package/dist/docs/assets/{index.md.COiu-1jL.js → index.md.t0TM2Qzz.js} +3 -3
- package/dist/docs/assets/{index.md.COiu-1jL.lean.js → index.md.t0TM2Qzz.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.D189RBCH.js → reference_cli.md.B74NrVzb.js} +5 -4
- package/dist/docs/assets/{reference_cli.md.D189RBCH.lean.js → reference_cli.md.B74NrVzb.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.zaEYCLHT.js → reference_connections.md.CsSr3rDz.js} +9 -4
- package/dist/docs/assets/{reference_connections.md.zaEYCLHT.lean.js → reference_connections.md.CsSr3rDz.lean.js} +1 -1
- package/dist/docs/assets/reference_prompt.md.BaiweQxE.js +1 -0
- package/dist/docs/assets/reference_prompt.md.BaiweQxE.lean.js +1 -0
- package/dist/docs/assets/{reference_tools.md.CqgJroI0.js → reference_tools.md.BRSDnTbN.js} +16 -3
- package/dist/docs/assets/{reference_tools.md.CqgJroI0.lean.js → reference_tools.md.BRSDnTbN.lean.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.DkovjS7h.js → troubleshooting.md.CmQkmnzC.js} +1 -1
- package/dist/docs/assets/{troubleshooting.md.DkovjS7h.lean.js → troubleshooting.md.CmQkmnzC.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +7 -7
- package/dist/docs/evals.html +4 -4
- package/dist/docs/example-agents/approval-buddy.html +4 -4
- package/dist/docs/example-agents/benny.html +4 -4
- package/dist/docs/example-agents/bugbot.html +4 -4
- package/dist/docs/example-agents/codebase-wiki.html +4 -4
- package/dist/docs/example-agents/codeowners-review.html +4 -4
- package/dist/docs/example-agents/concierge.html +4 -4
- package/dist/docs/example-agents/fsd.html +4 -4
- package/dist/docs/example-agents/index.html +4 -4
- package/dist/docs/example-agents/knowledge-base.html +4 -4
- package/dist/docs/example-agents/oncall.html +4 -4
- package/dist/docs/example-agents/security-reviewer.html +4 -4
- package/dist/docs/example-agents/slack-agent.html +4 -4
- package/dist/docs/example-agents/weather-agent.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/github.html +4 -4
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +53 -0
- package/dist/docs/guides/slack.html +4 -4
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +8 -7
- package/dist/docs/reference/connections.html +13 -8
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +4 -4
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +33 -0
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +4 -4
- package/dist/docs/reference/skills.html +5 -5
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +20 -7
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/evals.d.ts +39 -0
- package/dist/evals.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +7 -4
- package/dist/internal/cli-mcp-oauth.d.ts +16 -0
- package/dist/internal/cli-mcp-oauth.d.ts.map +1 -0
- package/dist/internal/cli-mcp-oauth.js +194 -0
- package/dist/internal/cli-mcp.d.ts +4 -1
- package/dist/internal/cli-mcp.d.ts.map +1 -1
- package/dist/internal/cli-mcp.js +19 -1
- package/dist/internal/corp-ca.d.ts +9 -0
- package/dist/internal/corp-ca.d.ts.map +1 -0
- package/dist/internal/corp-ca.js +44 -0
- package/dist/internal/cursor/account-mcp.d.ts +17 -4
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +105 -17
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +64 -10
- package/dist/internal/distribution.d.ts.map +1 -1
- package/dist/internal/distribution.js +1 -0
- package/dist/internal/logs-client.js +1 -1
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +49 -26
- package/dist/internal/mcp-oauth.d.ts +88 -0
- package/dist/internal/mcp-oauth.d.ts.map +1 -0
- package/dist/internal/mcp-oauth.js +385 -0
- package/dist/internal/resolved-connections.d.ts +6 -0
- package/dist/internal/resolved-connections.d.ts.map +1 -1
- package/dist/internal/resolved-connections.js +10 -3
- package/dist/internal/sdk-runner.d.ts +9 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +28 -2
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +24 -6
- package/dist/internal/session-engine.d.ts +30 -10
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +166 -74
- package/dist/internal/sessions-client.d.ts +16 -2
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +30 -13
- package/dist/internal/storage-coordinator.d.ts +11 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +30 -0
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +8 -4
- package/dist/internal/turn-governor.d.ts +54 -0
- package/dist/internal/turn-governor.d.ts.map +1 -0
- package/dist/internal/turn-governor.js +111 -0
- package/dist/playground/assets/{index-C0-QEG4O.js → index-BIGLubwK.js} +46 -46
- package/dist/playground/assets/{index-z3JY9O2x.css → index-C17ZQKDG.css} +1 -1
- package/dist/playground/index.html +2 -2
- package/dist/prompt.d.ts +39 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +70 -0
- package/dist/storage-backends/cursor-hosted.d.ts +10 -0
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +14 -0
- package/dist/types.d.ts +93 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/docs/README.md +4 -0
- package/docs/deployment.md +6 -1
- package/docs/guides/mcp-oauth.md +157 -0
- package/docs/reference/cli.md +30 -0
- package/docs/reference/connections.md +32 -2
- package/docs/reference/prompt.md +47 -0
- package/docs/reference/tools.md +21 -0
- package/docs/troubleshooting.md +11 -0
- package/package.json +9 -2
- package/skills/create-agent/SKILL.md +7 -3
- package/skills/framework-map/SKILL.md +1 -0
- package/skills/mcp-auth/SKILL.md +138 -0
- package/src/bin/agent-serve.ts +30 -3
- package/src/channels/github/github-channel.ts +2 -0
- package/src/channels/github/types.ts +4 -0
- package/src/channels/slack/cursor-account.ts +2 -0
- package/src/channels/slack/dispatch.ts +49 -0
- package/src/channels/slack/eval-directive.ts +348 -0
- package/src/channels/slack/index.ts +1 -0
- package/src/channels/slack/slack-channel.ts +3 -0
- package/src/channels/slack/types.ts +7 -0
- package/src/connections.ts +10 -5
- package/src/evals.ts +43 -0
- package/src/index.ts +3 -0
- package/src/internal/cli-ax.ts +10 -4
- package/src/internal/cli-mcp-oauth.ts +254 -0
- package/src/internal/cli-mcp.ts +25 -2
- package/src/internal/cursor/account-mcp.ts +153 -41
- package/src/internal/discovery.ts +70 -8
- package/src/internal/distribution.ts +1 -0
- package/src/internal/logs-client.ts +1 -1
- package/src/internal/mcp-host.ts +33 -9
- package/src/internal/mcp-oauth.ts +496 -0
- package/src/internal/resolved-connections.ts +20 -5
- package/src/internal/sdk-runner.ts +37 -1
- package/src/internal/server.ts +28 -6
- package/src/internal/session-engine.ts +192 -76
- package/src/internal/sessions-client.ts +51 -15
- package/src/internal/storage-coordinator.ts +36 -0
- package/src/internal/stream-progress.ts +8 -0
- package/src/internal/turn-governor.ts +145 -0
- package/src/prompt.ts +83 -0
- package/src/storage-backends/cursor-hosted.ts +21 -0
- package/src/types.ts +92 -6
- package/dist/docs/assets/chunks/@localSearchIndexroot.D154Detj.js +0 -1
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* event handlers and hooks.
|
|
8
8
|
*/
|
|
9
9
|
import { SlackAskDedupeStore, SlackNudgeStore } from "../channels/slack/nudge-store.js";
|
|
10
|
-
import { type AgentProject, type ApprovalDecision, type AuthContext, type CallToolOptions, type ChannelDefinition, type ChannelSession, type HostContext, type HttpChannelDefinition, type PendingApproval, type ReceiveInput, type SendMessageOptions, type SessionEvent, type SessionInfo, type SessionRecord, type SessionSummary, type ToolCallOutcome, type TurnOutcome } from "../types.js";
|
|
10
|
+
import { type AgentProject, type ApprovalDecision, type AuthContext, type CallToolOptions, type ChannelDefinition, type ChannelSession, type HostContext, type HttpChannelDefinition, type PendingApproval, type ReceiveInput, type SendMessageOptions, type SessionEvent, type SessionInfo, type SessionListSource, type SessionRecord, type SessionSummary, type ToolCallOutcome, type TurnOutcome } from "../types.js";
|
|
11
11
|
import { type ABSnapshot } from "./ab-snapshot.js";
|
|
12
12
|
import { type HostPlatforms } from "./host-platforms.js";
|
|
13
13
|
import type { AgentRunner } from "./sdk-runner.js";
|
|
@@ -110,6 +110,8 @@ export declare class SessionEngine {
|
|
|
110
110
|
private readonly turnAborts;
|
|
111
111
|
/** Serializes turn admission per session (latest follow-up wins). */
|
|
112
112
|
private readonly admissionChains;
|
|
113
|
+
/** FIFO turn slots under `concurrency.maxRunningTurns` (unlimited when unset). */
|
|
114
|
+
private readonly turnGovernor;
|
|
113
115
|
/**
|
|
114
116
|
* Per-session coalesce queue for `admission: "coalesce"` (Slack). Drained
|
|
115
117
|
* into one follow-up turn when the active turn finishes without interrupt.
|
|
@@ -129,6 +131,7 @@ export declare class SessionEngine {
|
|
|
129
131
|
private readonly approvals;
|
|
130
132
|
private readonly abCollector;
|
|
131
133
|
private reminderApi;
|
|
134
|
+
private evalsApi;
|
|
132
135
|
private readonly kvApi;
|
|
133
136
|
/** Serve-time resolved connections (see {@link setResolvedConnections}). */
|
|
134
137
|
private resolvedConnections;
|
|
@@ -140,11 +143,13 @@ export declare class SessionEngine {
|
|
|
140
143
|
* (`ctx.host.mcp`, always loopback).
|
|
141
144
|
*/
|
|
142
145
|
setResolvedConnections(connections: EngineResolvedConnection[]): void;
|
|
143
|
-
/** Shared host services (MCP / GitHub / Slack / reminders / kv / Slack nudges). */
|
|
146
|
+
/** Shared host services (MCP / GitHub / Slack / reminders / evals / kv / Slack nudges). */
|
|
144
147
|
get host(): HostContext;
|
|
145
148
|
private slackNudgeHostApi;
|
|
146
149
|
/** Attach the serve-host reminder API (called from startServer). */
|
|
147
150
|
setReminders(api: HostContext["reminders"]): void;
|
|
151
|
+
/** Attach the serve-host playground evals API (called from startServer). */
|
|
152
|
+
setEvals(api: HostContext["evals"]): void;
|
|
148
153
|
/**
|
|
149
154
|
* Start or resume a session on a channel. When `continuationToken`
|
|
150
155
|
* addresses an existing session this is a follow-up turn; otherwise a new
|
|
@@ -234,14 +239,7 @@ export declare class SessionEngine {
|
|
|
234
239
|
private scaffoldDir;
|
|
235
240
|
private executeTurn;
|
|
236
241
|
private buildTurnRequest;
|
|
237
|
-
/**
|
|
238
|
-
* MCP servers for a turn: authored concrete connections plus resolved
|
|
239
|
-
* serve-time resolved connections (peers, Cursor account bridge).
|
|
240
|
-
* Resolved connections pick their URL by runtime — loopback for local
|
|
241
|
-
* turns, `cloudUrl` for cloud turns — and are omitted from cloud turns
|
|
242
|
-
* when no cloud URL exists unless a `servers` filter requires the bridge
|
|
243
|
-
* (see {@link assertCloudCanHonorAccountServersFilters}).
|
|
244
|
-
*/
|
|
242
|
+
/** Authored + resolved MCP servers for a turn; skips `hostOnly`. */
|
|
245
243
|
private buildMcpServers;
|
|
246
244
|
private buildCustomTools;
|
|
247
245
|
/**
|
|
@@ -300,10 +298,32 @@ export declare class SessionEngine {
|
|
|
300
298
|
* observability surface across every principal (channel-driven runs,
|
|
301
299
|
* schedule/task sessions, other callers). The route auth chain still
|
|
302
300
|
* gates who may call this at all.
|
|
301
|
+
*
|
|
302
|
+
* When the project uses `cursorHostedStorage`, prefers durable Bugbot rows
|
|
303
|
+
* (merged with any newer local records not flushed yet). Falls back to the
|
|
304
|
+
* local `--state-root` store when the sink is unavailable.
|
|
303
305
|
*/
|
|
304
306
|
listSessions(caller: AuthContext | null, options?: {
|
|
305
307
|
includeAll?: boolean;
|
|
306
308
|
}): Promise<SessionSummary[]>;
|
|
309
|
+
/**
|
|
310
|
+
* Same as {@link listSessions}, plus which store answered
|
|
311
|
+
* (`cursor-hosted` = durable DB via the control-plane proxy; `local` =
|
|
312
|
+
* `--state-root`).
|
|
313
|
+
*/
|
|
314
|
+
listSessionsWithSource(caller: AuthContext | null, options?: {
|
|
315
|
+
includeAll?: boolean;
|
|
316
|
+
}): Promise<{
|
|
317
|
+
sessions: SessionSummary[];
|
|
318
|
+
source: SessionListSource;
|
|
319
|
+
}>;
|
|
320
|
+
/**
|
|
321
|
+
* Durable sink rows plus local records (local wins on the same id when
|
|
322
|
+
* newer — covers debounce windows that have not flushed yet). Newest
|
|
323
|
+
* `updatedAt` first.
|
|
324
|
+
*/
|
|
325
|
+
private mergeStoredAndLocalSessions;
|
|
326
|
+
private summarizeSessionRecords;
|
|
307
327
|
/**
|
|
308
328
|
* Fold durable session streams into per-session A/B assignments and
|
|
309
329
|
* aggregate arm metrics (`GET /v1/abs`). Collector-independent: always
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-engine.d.ts","sourceRoot":"","sources":["../../src/internal/session-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAYH,OAAO,EACL,mBAAmB,EACnB,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EAInB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAG1B,KAAK,eAAe,EACpB,KAAK,YAAY,EAIjB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAEjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,cAAc,EAEnB,KAAK,eAAe,EAGpB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAQpE,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAc9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"session-engine.d.ts","sourceRoot":"","sources":["../../src/internal/session-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,7 @@ import { assertCloudCanHonorAccountServersFilters } from "./resolved-connections
|
|
|
51
51
|
import { SessionStore } from "./session-store.js";
|
|
52
52
|
import { StorageCoordinator } from "./storage-coordinator.js";
|
|
53
53
|
import { normalizeToolResult, toolCallErrorMessage } from "./tool-result.js";
|
|
54
|
+
import { TurnGovernor } from "./turn-governor.js";
|
|
54
55
|
import { buildAgentsMdContent, isNestedInGitRepo, materializeWorkspace, writeWorkspaceFiles, } from "./workspace.js";
|
|
55
56
|
export const HTTP_CHANNEL_ID = "http";
|
|
56
57
|
export { SCHEDULE_CHANNEL_PREFIX } from "./prompt-context.js";
|
|
@@ -143,6 +144,7 @@ export class SessionEngine {
|
|
|
143
144
|
this.stateRoot = options.stateRoot;
|
|
144
145
|
this.runner = options.runner;
|
|
145
146
|
this.logger = (_a = options.logger) !== null && _a !== void 0 ? _a : (() => { });
|
|
147
|
+
this.turnGovernor = new TurnGovernor(options.project.agent.concurrency);
|
|
146
148
|
this.sessions = new SessionStore(join(options.stateRoot, "sessions"));
|
|
147
149
|
this.nudgeStore = new SlackNudgeStore(join(options.stateRoot, "slack-nudges"));
|
|
148
150
|
this.askDedupe = new SlackAskDedupeStore(join(options.stateRoot, "slack-asks"));
|
|
@@ -186,13 +188,14 @@ export class SessionEngine {
|
|
|
186
188
|
});
|
|
187
189
|
}
|
|
188
190
|
}
|
|
189
|
-
/** Shared host services (MCP / GitHub / Slack / reminders / kv / Slack nudges). */
|
|
191
|
+
/** Shared host services (MCP / GitHub / Slack / reminders / evals / kv / Slack nudges). */
|
|
190
192
|
get host() {
|
|
191
193
|
return {
|
|
192
194
|
mcp: this.mcpHost,
|
|
193
195
|
github: this.platforms.github,
|
|
194
196
|
slack: this.platforms.slack,
|
|
195
197
|
reminders: this.reminderApi,
|
|
198
|
+
evals: this.evalsApi,
|
|
196
199
|
kv: this.kvApi,
|
|
197
200
|
slackNudges: this.slackNudgeHostApi(),
|
|
198
201
|
};
|
|
@@ -212,6 +215,10 @@ export class SessionEngine {
|
|
|
212
215
|
setReminders(api) {
|
|
213
216
|
this.reminderApi = api;
|
|
214
217
|
}
|
|
218
|
+
/** Attach the serve-host playground evals API (called from startServer). */
|
|
219
|
+
setEvals(api) {
|
|
220
|
+
this.evalsApi = api;
|
|
221
|
+
}
|
|
215
222
|
// ==========================================================================
|
|
216
223
|
// Sending messages
|
|
217
224
|
// ==========================================================================
|
|
@@ -520,11 +527,8 @@ export class SessionEngine {
|
|
|
520
527
|
turnId,
|
|
521
528
|
data: { text: message },
|
|
522
529
|
});
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
turnId,
|
|
526
|
-
data: {},
|
|
527
|
-
});
|
|
530
|
+
// `turn.started` is appended by executeTurn once the turn holds a
|
|
531
|
+
// governor slot; saturated engines emit `turn.queued` first.
|
|
528
532
|
const abort = new AbortController();
|
|
529
533
|
this.turnAborts.set(sessionId, abort);
|
|
530
534
|
// Lifecycle promise includes post-turn coalesce drain so waiters and
|
|
@@ -707,54 +711,77 @@ export class SessionEngine {
|
|
|
707
711
|
}
|
|
708
712
|
};
|
|
709
713
|
const mapper = new TurnEventMapper(emit);
|
|
714
|
+
// Take a turn slot before any work happens. When every slot is busy the
|
|
715
|
+
// turn waits FIFO — durable `turn.queued` marks the wait — and a
|
|
716
|
+
// preempting follow-up (or interrupt) resolves the wait as cancelled
|
|
717
|
+
// without the turn ever running.
|
|
718
|
+
const permit = yield this.turnGovernor.acquire({
|
|
719
|
+
sessionId,
|
|
720
|
+
signal,
|
|
721
|
+
onQueued: (position) => {
|
|
722
|
+
var _a;
|
|
723
|
+
const maxRunningTurns = (_a = this.turnGovernor.maxRunningTurns) !== null && _a !== void 0 ? _a : 0;
|
|
724
|
+
emit({ type: "turn.queued", data: { position, maxRunningTurns } });
|
|
725
|
+
this.logger(`[session] ${sessionId} ${turnId} queued at position ${position} (${maxRunningTurns} turn slot(s) busy)`);
|
|
726
|
+
},
|
|
727
|
+
});
|
|
710
728
|
let outcome;
|
|
711
|
-
|
|
712
|
-
//
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
return rest;
|
|
729
|
+
if (permit === undefined) {
|
|
730
|
+
// Preempted while waiting for a slot; settle as an interrupted turn.
|
|
731
|
+
outcome = { status: "cancelled" };
|
|
732
|
+
}
|
|
733
|
+
else {
|
|
734
|
+
emit({ type: "turn.started", data: {} });
|
|
735
|
+
try {
|
|
736
|
+
// Scaffold agent files into the session workspace even when the harness
|
|
737
|
+
// cwd is overridden (e.g. a PR worktree). A/B variant instruction
|
|
738
|
+
// overlays are applied via agentForSession.
|
|
739
|
+
const agent = this.agentForSession(record);
|
|
740
|
+
yield materializeWorkspace({
|
|
741
|
+
agent,
|
|
742
|
+
workspaceDir,
|
|
743
|
+
seed: isFirstTurn,
|
|
727
744
|
});
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
(yield isNestedInGitRepo(harnessCwd)));
|
|
737
|
-
const request = this.buildTurnRequest(record, agent, turnId, message, isFirstTurn, instructionsInvisibleToHarness, emit, (update) => __awaiter(this, void 0, void 0, function* () {
|
|
738
|
-
mapper.handleUpdate(update);
|
|
739
|
-
// Yield so the HTTP NDJSON writer can flush tool start/result
|
|
740
|
-
// events while sibling parallel tools are still executing.
|
|
741
|
-
if (update.type === "tool-call-started" ||
|
|
742
|
-
update.type === "tool-call-completed" ||
|
|
743
|
-
// Nested subagent progress (newer SDKs); string check keeps
|
|
744
|
-
// typecheck green against older published `@cursor/sdk` pins.
|
|
745
|
-
update.type === "tool-call-delta") {
|
|
746
|
-
yield yieldEventLoop();
|
|
745
|
+
const pendingFiles = record.pendingWorkspaceFiles;
|
|
746
|
+
if (pendingFiles !== undefined &&
|
|
747
|
+
Object.keys(pendingFiles).length > 0) {
|
|
748
|
+
yield writeWorkspaceFiles(harnessCwd, pendingFiles);
|
|
749
|
+
yield this.updateRecord(sessionId, (current) => {
|
|
750
|
+
const { pendingWorkspaceFiles: _cleared } = current, rest = __rest(current, ["pendingWorkspaceFiles"]);
|
|
751
|
+
return rest;
|
|
752
|
+
});
|
|
747
753
|
}
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
754
|
+
// The harness only loads the scaffolded AGENTS.md when the session
|
|
755
|
+
// workspace is its own project root. With a per-session cwd override
|
|
756
|
+
// (PR worktree) the scaffold lands elsewhere, and a workspace nested
|
|
757
|
+
// inside a git repo re-roots harness rules at that repo — in both
|
|
758
|
+
// cases deliver instructions inline on the first turn instead.
|
|
759
|
+
const instructionsInvisibleToHarness = isFirstTurn &&
|
|
760
|
+
(record.workspaceOverride !== undefined ||
|
|
761
|
+
(yield isNestedInGitRepo(harnessCwd)));
|
|
762
|
+
const request = this.buildTurnRequest(record, agent, turnId, message, isFirstTurn, instructionsInvisibleToHarness, emit, (update) => __awaiter(this, void 0, void 0, function* () {
|
|
763
|
+
mapper.handleUpdate(update);
|
|
764
|
+
// Yield so the HTTP NDJSON writer can flush tool start/result
|
|
765
|
+
// events while sibling parallel tools are still executing.
|
|
766
|
+
if (update.type === "tool-call-started" ||
|
|
767
|
+
update.type === "tool-call-completed" ||
|
|
768
|
+
// Nested subagent progress (newer SDKs); string check keeps
|
|
769
|
+
// typecheck green against older published `@cursor/sdk` pins.
|
|
770
|
+
update.type === "tool-call-delta") {
|
|
771
|
+
yield yieldEventLoop();
|
|
772
|
+
}
|
|
773
|
+
}), signal);
|
|
774
|
+
outcome = yield this.runner.runTurn(request);
|
|
775
|
+
}
|
|
776
|
+
catch (error) {
|
|
777
|
+
this.approvals.cancelSession(sessionId, "deny");
|
|
778
|
+
outcome = { status: "error", errorMessage: describeError(error) };
|
|
779
|
+
}
|
|
780
|
+
finally {
|
|
781
|
+
permit.release();
|
|
782
|
+
this.approvals.cancelSession(sessionId, "deny");
|
|
783
|
+
yield this.clearPendingApprovals(sessionId);
|
|
784
|
+
}
|
|
758
785
|
}
|
|
759
786
|
mapper.finish();
|
|
760
787
|
if (mapper.title !== undefined) {
|
|
@@ -867,34 +894,37 @@ export class SessionEngine {
|
|
|
867
894
|
});
|
|
868
895
|
}) });
|
|
869
896
|
}
|
|
870
|
-
/**
|
|
871
|
-
* MCP servers for a turn: authored concrete connections plus resolved
|
|
872
|
-
* serve-time resolved connections (peers, Cursor account bridge).
|
|
873
|
-
* Resolved connections pick their URL by runtime — loopback for local
|
|
874
|
-
* turns, `cloudUrl` for cloud turns — and are omitted from cloud turns
|
|
875
|
-
* when no cloud URL exists unless a `servers` filter requires the bridge
|
|
876
|
-
* (see {@link assertCloudCanHonorAccountServersFilters}).
|
|
877
|
-
*/
|
|
897
|
+
/** Authored + resolved MCP servers for a turn; skips `hostOnly`. */
|
|
878
898
|
buildMcpServers(runtime) {
|
|
899
|
+
const hostOnlyNames = new Set(this.project.agent.connections
|
|
900
|
+
.filter((connection) => connection.hostOnly === true)
|
|
901
|
+
.map((connection) => connection.name));
|
|
879
902
|
assertCloudCanHonorAccountServersFilters({
|
|
880
903
|
runtime,
|
|
881
|
-
resolvedConnections: this.resolvedConnections,
|
|
904
|
+
resolvedConnections: this.resolvedConnections.filter((resolved) => !hostOnlyNames.has(resolved.name)),
|
|
882
905
|
});
|
|
883
906
|
const servers = {};
|
|
884
907
|
for (const connection of this.project.agent.connections) {
|
|
908
|
+
if (hostOnlyNames.has(connection.name)) {
|
|
909
|
+
continue;
|
|
910
|
+
}
|
|
885
911
|
if (isSymbolicConnectionTransport(connection.transport)) {
|
|
886
912
|
continue;
|
|
887
913
|
}
|
|
888
914
|
servers[connection.name] = connection.transport;
|
|
889
915
|
}
|
|
890
916
|
for (const resolved of this.resolvedConnections) {
|
|
917
|
+
if (hostOnlyNames.has(resolved.name)) {
|
|
918
|
+
continue;
|
|
919
|
+
}
|
|
891
920
|
const url = runtime === "cloud" ? resolved.cloudUrl : resolved.localUrl;
|
|
892
921
|
if (url === undefined) {
|
|
893
922
|
continue;
|
|
894
923
|
}
|
|
895
|
-
servers[resolved.name] =
|
|
896
|
-
|
|
897
|
-
|
|
924
|
+
servers[resolved.name] = {
|
|
925
|
+
url,
|
|
926
|
+
headers: resolved.headers,
|
|
927
|
+
};
|
|
898
928
|
}
|
|
899
929
|
return servers;
|
|
900
930
|
}
|
|
@@ -1361,22 +1391,84 @@ export class SessionEngine {
|
|
|
1361
1391
|
* observability surface across every principal (channel-driven runs,
|
|
1362
1392
|
* schedule/task sessions, other callers). The route auth chain still
|
|
1363
1393
|
* gates who may call this at all.
|
|
1394
|
+
*
|
|
1395
|
+
* When the project uses `cursorHostedStorage`, prefers durable Bugbot rows
|
|
1396
|
+
* (merged with any newer local records not flushed yet). Falls back to the
|
|
1397
|
+
* local `--state-root` store when the sink is unavailable.
|
|
1364
1398
|
*/
|
|
1365
1399
|
listSessions(caller, options) {
|
|
1400
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1401
|
+
return (yield this.listSessionsWithSource(caller, options)).sessions;
|
|
1402
|
+
});
|
|
1403
|
+
}
|
|
1404
|
+
/**
|
|
1405
|
+
* Same as {@link listSessions}, plus which store answered
|
|
1406
|
+
* (`cursor-hosted` = durable DB via the control-plane proxy; `local` =
|
|
1407
|
+
* `--state-root`).
|
|
1408
|
+
*/
|
|
1409
|
+
listSessionsWithSource(caller, options) {
|
|
1366
1410
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1367
1411
|
var _a;
|
|
1368
|
-
|
|
1412
|
+
var _b;
|
|
1413
|
+
const includeAll = (_b = options === null || options === void 0 ? void 0 : options.includeAll) !== null && _b !== void 0 ? _b : false;
|
|
1414
|
+
if (((_a = this.storage) === null || _a === void 0 ? void 0 : _a.isCursorHosted) === true) {
|
|
1415
|
+
try {
|
|
1416
|
+
const records = yield this.mergeStoredAndLocalSessions();
|
|
1417
|
+
return {
|
|
1418
|
+
sessions: this.summarizeSessionRecords(records, caller, includeAll),
|
|
1419
|
+
source: "cursor-hosted",
|
|
1420
|
+
};
|
|
1421
|
+
}
|
|
1422
|
+
catch (error) {
|
|
1423
|
+
this.logger(`[agentkit] cursor-hosted session list failed; falling back to local: ${describeError(error)}`);
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1369
1426
|
const records = yield this.sessions.list();
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
.
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1427
|
+
// Local store is createdAt-asc; reverse so newest created leads.
|
|
1428
|
+
return {
|
|
1429
|
+
sessions: this.summarizeSessionRecords([...records].reverse(), caller, includeAll),
|
|
1430
|
+
source: "local",
|
|
1431
|
+
};
|
|
1432
|
+
});
|
|
1433
|
+
}
|
|
1434
|
+
/**
|
|
1435
|
+
* Durable sink rows plus local records (local wins on the same id when
|
|
1436
|
+
* newer — covers debounce windows that have not flushed yet). Newest
|
|
1437
|
+
* `updatedAt` first.
|
|
1438
|
+
*/
|
|
1439
|
+
mergeStoredAndLocalSessions() {
|
|
1440
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1441
|
+
const storage = this.storage;
|
|
1442
|
+
if (storage === undefined) {
|
|
1443
|
+
throw new Error("storage is not configured");
|
|
1444
|
+
}
|
|
1445
|
+
const stored = yield storage.listSessionsFromSink();
|
|
1446
|
+
const local = yield this.sessions.list();
|
|
1447
|
+
const byId = new Map();
|
|
1448
|
+
for (const record of stored) {
|
|
1449
|
+
byId.set(record.sessionId, record);
|
|
1450
|
+
}
|
|
1451
|
+
for (const record of local) {
|
|
1452
|
+
const existing = byId.get(record.sessionId);
|
|
1453
|
+
if (existing === undefined ||
|
|
1454
|
+
record.updatedAt.localeCompare(existing.updatedAt) >= 0) {
|
|
1455
|
+
byId.set(record.sessionId, record);
|
|
1456
|
+
}
|
|
1457
|
+
}
|
|
1458
|
+
return [...byId.values()].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
1459
|
+
});
|
|
1460
|
+
}
|
|
1461
|
+
summarizeSessionRecords(records, caller, includeAll) {
|
|
1462
|
+
return records
|
|
1463
|
+
.filter((record) => includeAll || samePrincipal(record.auth, caller))
|
|
1464
|
+
.map((record) => {
|
|
1465
|
+
const externalUrl = externalUrlForSession(record);
|
|
1466
|
+
return Object.assign(Object.assign(Object.assign({ sessionId: record.sessionId, channelId: record.channelId, mode: record.mode }, (record.title === undefined ? {} : { title: record.title })), { turnCount: record.turnCount, running: this.activeTurns.has(record.sessionId) ||
|
|
1467
|
+
this.pendingTurns.has(record.sessionId), queued: this.turnGovernor.limited
|
|
1468
|
+
? this.turnGovernor.isQueued(record.sessionId)
|
|
1469
|
+
: undefined, createdAt: record.createdAt, updatedAt: record.updatedAt, continuationToken: record.continuationKey === null
|
|
1470
|
+
? null
|
|
1471
|
+
: formatContinuationToken(record.channelId, record.continuationKey) }), (externalUrl === undefined ? {} : { externalUrl }));
|
|
1380
1472
|
});
|
|
1381
1473
|
}
|
|
1382
1474
|
/**
|
|
@@ -3,13 +3,23 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Customer-facing errors never include hosting URLs or infra jargon.
|
|
5
5
|
*/
|
|
6
|
-
import type { SessionEvent, SessionSummary } from "../types.js";
|
|
6
|
+
import type { SessionEvent, SessionListSource, SessionSummary } from "../types.js";
|
|
7
7
|
import { type RequestAuth } from "./request-headers.js";
|
|
8
|
+
export interface ListedSessions {
|
|
9
|
+
sessions: SessionSummary[];
|
|
10
|
+
/** Present when the server reports which store answered. */
|
|
11
|
+
source?: SessionListSource;
|
|
12
|
+
}
|
|
8
13
|
export declare function listSessions(args: {
|
|
9
14
|
baseUrl: string;
|
|
10
15
|
auth?: RequestAuth;
|
|
11
16
|
fetchImpl?: typeof fetch;
|
|
12
17
|
}): Promise<SessionSummary[]>;
|
|
18
|
+
export declare function listSessionsWithSource(args: {
|
|
19
|
+
baseUrl: string;
|
|
20
|
+
auth?: RequestAuth;
|
|
21
|
+
fetchImpl?: typeof fetch;
|
|
22
|
+
}): Promise<ListedSessions>;
|
|
13
23
|
export declare function fetchSessionEvents(args: {
|
|
14
24
|
baseUrl: string;
|
|
15
25
|
sessionId: string;
|
|
@@ -29,6 +39,10 @@ export declare function resolvePreviousSessionId(args: {
|
|
|
29
39
|
auth?: RequestAuth;
|
|
30
40
|
fetchImpl?: typeof fetch;
|
|
31
41
|
}): Promise<string | undefined>;
|
|
42
|
+
/** Human label for {@link SessionListSource} in CLI output. */
|
|
43
|
+
export declare function formatSessionListSource(source: SessionListSource): string;
|
|
32
44
|
/** Format a sessions table (id, channel, mode, turns, running, updated). */
|
|
33
|
-
export declare function formatSessionsTable(sessions: SessionSummary[]
|
|
45
|
+
export declare function formatSessionsTable(sessions: SessionSummary[], options?: {
|
|
46
|
+
source?: SessionListSource;
|
|
47
|
+
}): string;
|
|
34
48
|
//# sourceMappingURL=sessions-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions-client.d.ts","sourceRoot":"","sources":["../../src/internal/sessions-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sessions-client.d.ts","sourceRoot":"","sources":["../../src/internal/sessions-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAE5B;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,cAAc,CAAC,CAiC1B;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAuE1B;AAiCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,SAAS,cAAc,EAAE,GAClC,cAAc,GAAG,SAAS,CAU5B;AAED,+DAA+D;AAC/D,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAO9B;AAED,+DAA+D;AAC/D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAIzE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACvC,MAAM,CAkBR"}
|
|
@@ -15,6 +15,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
15
15
|
import { sanitizeCustomerError } from "./logs-client.js";
|
|
16
16
|
import { mergeRequestHeaders } from "./request-headers.js";
|
|
17
17
|
export function listSessions(args) {
|
|
18
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
return (yield listSessionsWithSource(args)).sessions;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function listSessionsWithSource(args) {
|
|
18
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
19
24
|
var _a;
|
|
20
25
|
const baseUrl = args.baseUrl.replace(/\/$/, "");
|
|
@@ -32,17 +37,19 @@ export function listSessions(args) {
|
|
|
32
37
|
throw new Error(`Could not list sessions (HTTP ${resp.status}).`);
|
|
33
38
|
}
|
|
34
39
|
const body = (yield resp.json());
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
out.push(parsed);
|
|
40
|
+
const sessions = [];
|
|
41
|
+
if (Array.isArray(body.sessions)) {
|
|
42
|
+
for (const row of body.sessions) {
|
|
43
|
+
const parsed = parseSessionSummary(row);
|
|
44
|
+
if (parsed !== undefined) {
|
|
45
|
+
sessions.push(parsed);
|
|
46
|
+
}
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
|
-
|
|
49
|
+
const source = body.source === "cursor-hosted" || body.source === "local"
|
|
50
|
+
? body.source
|
|
51
|
+
: undefined;
|
|
52
|
+
return source === undefined ? { sessions } : { sessions, source };
|
|
46
53
|
});
|
|
47
54
|
}
|
|
48
55
|
export function fetchSessionEvents(args) {
|
|
@@ -136,6 +143,7 @@ function parseSessionSummary(value) {
|
|
|
136
143
|
title: typeof row.title === "string" ? row.title : undefined,
|
|
137
144
|
turnCount: typeof row.turnCount === "number" ? row.turnCount : 0,
|
|
138
145
|
running: row.running === true,
|
|
146
|
+
queued: typeof row.queued === "boolean" ? row.queued : undefined,
|
|
139
147
|
createdAt: typeof row.createdAt === "string" ? row.createdAt : "",
|
|
140
148
|
updatedAt: typeof row.updatedAt === "string" ? row.updatedAt : "",
|
|
141
149
|
continuationToken,
|
|
@@ -167,10 +175,19 @@ export function resolvePreviousSessionId(args) {
|
|
|
167
175
|
return (_a = pickPreviousSession(sessions)) === null || _a === void 0 ? void 0 : _a.sessionId;
|
|
168
176
|
});
|
|
169
177
|
}
|
|
178
|
+
/** Human label for {@link SessionListSource} in CLI output. */
|
|
179
|
+
export function formatSessionListSource(source) {
|
|
180
|
+
return source === "cursor-hosted"
|
|
181
|
+
? "Listing from cursor-hosted storage (durable DB)."
|
|
182
|
+
: "Listing from local session store.";
|
|
183
|
+
}
|
|
170
184
|
/** Format a sessions table (id, channel, mode, turns, running, updated). */
|
|
171
|
-
export function formatSessionsTable(sessions) {
|
|
185
|
+
export function formatSessionsTable(sessions, options) {
|
|
186
|
+
const sourceLine = (options === null || options === void 0 ? void 0 : options.source) === undefined
|
|
187
|
+
? ""
|
|
188
|
+
: `${formatSessionListSource(options.source)}\n`;
|
|
172
189
|
if (sessions.length === 0) {
|
|
173
|
-
return
|
|
190
|
+
return `${sourceLine}No sessions.\n`;
|
|
174
191
|
}
|
|
175
192
|
const header = ["SESSION", "CHANNEL", "MODE", "TURNS", "RUNNING", "UPDATED"];
|
|
176
193
|
const rows = sessions.map((s) => [
|
|
@@ -178,10 +195,10 @@ export function formatSessionsTable(sessions) {
|
|
|
178
195
|
s.channelId,
|
|
179
196
|
s.mode,
|
|
180
197
|
String(s.turnCount),
|
|
181
|
-
s.running ? "yes" : "no",
|
|
198
|
+
s.queued === true ? "queued" : s.running ? "yes" : "no",
|
|
182
199
|
s.updatedAt,
|
|
183
200
|
]);
|
|
184
|
-
return `${renderTable(header, rows)}\n`;
|
|
201
|
+
return `${sourceLine}${renderTable(header, rows)}\n`;
|
|
185
202
|
}
|
|
186
203
|
function renderTable(header, rows) {
|
|
187
204
|
const widths = header.map((h, i) => Math.max(h.length, ...rows.map((row) => { var _a; return ((_a = row[i]) !== null && _a !== void 0 ? _a : "").length; })));
|
|
@@ -73,12 +73,23 @@ export declare class StorageCoordinator {
|
|
|
73
73
|
private deleteOp;
|
|
74
74
|
/** Whether the sink can serve the startup bulk restore (`list`). */
|
|
75
75
|
get canBulkRestore(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* True when the authored sink is `cursorHostedStorage` (Bugbot via the
|
|
78
|
+
* control-plane proxy). `GET /v1/sessions` prefers this durable list.
|
|
79
|
+
*/
|
|
80
|
+
get isCursorHosted(): boolean;
|
|
76
81
|
/**
|
|
77
82
|
* Saved session records for this agent (startup restore). Errors are
|
|
78
83
|
* logged and read as "nothing saved" — a broken store must never block
|
|
79
84
|
* serve start.
|
|
80
85
|
*/
|
|
81
86
|
listSessions(): Promise<SessionRecord[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Session records from the sink for the sessions API. Unlike
|
|
89
|
+
* {@link listSessions}, missing `list` or a thrown sink error **propagates**
|
|
90
|
+
* so the caller can fall back to the local session store.
|
|
91
|
+
*/
|
|
92
|
+
listSessionsFromSink(): Promise<SessionRecord[]>;
|
|
82
93
|
/**
|
|
83
94
|
* Saved event stream for one session: chunk values concatenated in key
|
|
84
95
|
* order (chunks are keyed by their first event's index, zero-padded, so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,cAAc,EACnB,KAAK,iBAAiB,EAEvB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"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"}
|