@cursor/july 0.1.27 → 0.1.29
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/dist/bin/agent-serve.js +32 -5
- package/dist/channels/slack/auth.d.ts +13 -13
- package/dist/channels/slack/auth.d.ts.map +1 -1
- package/dist/channels/slack/auth.js +19 -10
- package/dist/channels/slack/cursor-account.d.ts.map +1 -1
- package/dist/channels/slack/cursor-account.js +3 -1
- package/dist/channels/slack/defaults.d.ts +7 -4
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +14 -4
- package/dist/channels/slack/dispatch.d.ts +6 -0
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +59 -21
- package/dist/channels/slack/external-policy.d.ts +27 -0
- package/dist/channels/slack/external-policy.d.ts.map +1 -0
- package/dist/channels/slack/external-policy.js +53 -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/interactive.d.ts +6 -0
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +42 -15
- package/dist/channels/slack/slack-channel.d.ts +19 -1
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +48 -6
- package/dist/channels/slack/types.d.ts +10 -0
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +3 -3
- package/dist/docs/assets/{app.BICLoJYF.js → app.QdunVQKg.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DGe61XHA.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.wN4Ko9dT.js → VPLocalSearchBox.B6EpUXYf.js} +1 -1
- package/dist/docs/assets/chunks/{theme.dnnTE-Co.js → theme.BOTJVqh7.js} +2 -2
- package/dist/docs/assets/{guides_slack.md.D_xFKlnF.js → guides_slack.md.CjmJSvZS.js} +8 -4
- package/dist/docs/assets/guides_slack.md.CjmJSvZS.lean.js +1 -0
- package/dist/docs/assets/guides_webhooks.md.wSOYas3X.js +183 -0
- package/dist/docs/assets/{guides_webhooks.md.B1EswtUu.lean.js → guides_webhooks.md.wSOYas3X.lean.js} +1 -1
- package/dist/docs/assets/{index.md.Dfv5ic9t.js → index.md.CH_s5uZe.js} +1 -1
- package/dist/docs/assets/{reference_channels.md.DdmiKgqf.js → reference_channels.md.CDhTRfUz.js} +2 -2
- package/dist/docs/assets/{reference_channels.md.DdmiKgqf.lean.js → reference_channels.md.CDhTRfUz.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/example-agents/approval-buddy.html +3 -3
- package/dist/docs/example-agents/benny.html +3 -3
- package/dist/docs/example-agents/bugbot.html +3 -3
- package/dist/docs/example-agents/codebase-wiki.html +3 -3
- package/dist/docs/example-agents/codeowners-review.html +3 -3
- package/dist/docs/example-agents/concierge.html +3 -3
- package/dist/docs/example-agents/fsd.html +3 -3
- package/dist/docs/example-agents/index.html +3 -3
- package/dist/docs/example-agents/knowledge-base.html +3 -3
- package/dist/docs/example-agents/oncall.html +3 -3
- package/dist/docs/example-agents/security-reviewer.html +3 -3
- package/dist/docs/example-agents/slack-agent.html +3 -3
- package/dist/docs/example-agents/weather-agent.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/mcp-oauth.html +3 -3
- package/dist/docs/guides/slack.html +11 -7
- package/dist/docs/guides/webhooks.html +138 -5
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +3 -3
- package/dist/docs/index.html +5 -5
- package/dist/docs/quickstart.html +3 -3
- package/dist/docs/reference/agent-config.html +3 -3
- package/dist/docs/reference/channels.html +5 -5
- package/dist/docs/reference/cli.html +3 -3
- 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/prompt.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/cli-ax.d.ts +8 -0
- package/dist/internal/cli-ax.d.ts.map +1 -1
- package/dist/internal/cli-ax.js +116 -57
- package/dist/internal/cloud-turn-cost.d.ts +34 -0
- package/dist/internal/cloud-turn-cost.d.ts.map +1 -0
- package/dist/internal/cloud-turn-cost.js +106 -0
- package/dist/internal/cursor-slack-relay.d.ts +2 -0
- package/dist/internal/cursor-slack-relay.d.ts.map +1 -1
- package/dist/internal/cursor-slack-relay.js +1 -0
- package/dist/internal/deploy-client.d.ts +2 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +1 -0
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +9 -2
- package/dist/internal/event-log.d.ts +6 -0
- package/dist/internal/event-log.d.ts.map +1 -1
- package/dist/internal/event-log.js +16 -0
- package/dist/internal/host-platforms.d.ts +13 -0
- package/dist/internal/host-platforms.d.ts.map +1 -1
- package/dist/internal/host-platforms.js +25 -16
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +3 -1
- package/dist/internal/local-control-plane.d.ts +25 -0
- package/dist/internal/local-control-plane.d.ts.map +1 -0
- package/dist/internal/local-control-plane.js +172 -0
- package/dist/internal/platform-schedule-sync.d.ts +17 -0
- package/dist/internal/platform-schedule-sync.d.ts.map +1 -0
- package/dist/internal/platform-schedule-sync.js +72 -0
- package/dist/internal/platform-timers.d.ts +28 -0
- package/dist/internal/platform-timers.d.ts.map +1 -0
- package/dist/internal/platform-timers.js +120 -0
- package/dist/internal/reminder-runner.d.ts +16 -12
- package/dist/internal/reminder-runner.d.ts.map +1 -1
- package/dist/internal/reminder-runner.js +112 -61
- package/dist/internal/reminder-store.d.ts +5 -4
- package/dist/internal/reminder-store.d.ts.map +1 -1
- package/dist/internal/reminder-store.js +5 -4
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +44 -1
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +115 -16
- package/dist/internal/session-engine.d.ts +22 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +110 -4
- package/dist/internal/storage-coordinator.d.ts +4 -15
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +4 -30
- package/dist/playground/assets/index-CquRB-l0.js +85 -0
- package/dist/playground/assets/{index-Bul1WfrB.css → index-Dj0bWpkn.css} +1 -1
- package/dist/playground/index.html +2 -2
- package/dist/storage.d.ts +0 -3
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +0 -3
- package/dist/types.d.ts +11 -2
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +1 -0
- package/docs/guides/slack.md +32 -7
- package/docs/guides/webhooks.md +183 -0
- package/docs/reference/channels.md +2 -1
- package/package.json +1 -1
- package/skills/setup-slack/SKILL.md +3 -0
- package/src/bin/agent-serve.ts +33 -5
- package/src/channels/slack/auth.ts +29 -22
- package/src/channels/slack/cursor-account.ts +2 -0
- package/src/channels/slack/defaults.ts +24 -4
- package/src/channels/slack/dispatch.ts +42 -1
- package/src/channels/slack/external-policy.ts +62 -0
- package/src/channels/slack/index.ts +1 -0
- package/src/channels/slack/interactive.ts +42 -10
- package/src/channels/slack/slack-channel.ts +66 -3
- package/src/channels/slack/types.ts +12 -0
- package/src/internal/cli-ax.ts +110 -34
- package/src/internal/cloud-turn-cost.ts +158 -0
- package/src/internal/cursor-slack-relay.ts +3 -0
- package/src/internal/deploy-client.ts +3 -0
- package/src/internal/discovery.ts +9 -1
- package/src/internal/event-log.ts +17 -0
- package/src/internal/host-platforms.ts +40 -18
- package/src/internal/http-channel.ts +3 -1
- package/src/internal/local-control-plane.ts +188 -0
- package/src/internal/platform-schedule-sync.ts +81 -0
- package/src/internal/platform-timers.ts +173 -0
- package/src/internal/reminder-runner.ts +131 -67
- package/src/internal/reminder-store.ts +5 -4
- package/src/internal/sdk-runner.ts +49 -1
- package/src/internal/server.ts +130 -11
- package/src/internal/session-engine.ts +138 -3
- package/src/internal/storage-coordinator.ts +4 -41
- package/src/storage.ts +0 -5
- package/src/types.ts +11 -2
- package/dist/docs/assets/chunks/@localSearchIndexroot.CQJytDwU.js +0 -1
- package/dist/docs/assets/guides_slack.md.D_xFKlnF.lean.js +0 -1
- package/dist/docs/assets/guides_webhooks.md.B1EswtUu.js +0 -50
- package/dist/playground/assets/index-BDCeW4uc.js +0 -86
- /package/dist/docs/assets/{index.md.Dfv5ic9t.lean.js → index.md.CH_s5uZe.lean.js} +0 -0
package/dist/internal/server.js
CHANGED
|
@@ -54,10 +54,13 @@ import { collectGitHubTriggerTargets, handleAgentServeTrigger, } from "./handleA
|
|
|
54
54
|
import { createHostPlatforms, warmupHostGitHubAuth } from "./host-platforms.js";
|
|
55
55
|
import { buildHttpChannelRoutes, errorResponse, jsonResponse, readJsonObject, requireSessionOwner, } from "./http-channel.js";
|
|
56
56
|
import { validateToolInput } from "./json-schema.js";
|
|
57
|
+
import { createLocalControlPlane, } from "./local-control-plane.js";
|
|
57
58
|
import { createLogRing } from "./log-ring.js";
|
|
58
59
|
import { createAgentMcpEndpoint, MCP_ENDPOINT_PATH } from "./mcp-endpoint.js";
|
|
59
60
|
import { isLoopbackAddress } from "./net.js";
|
|
60
61
|
import { collectPeerConnections } from "./peer-connections.js";
|
|
62
|
+
import { PLATFORM_SCHEDULE_CATALOG_FILENAME, syncHostedPlatformSchedules, } from "./platform-schedule-sync.js";
|
|
63
|
+
import { createCursorHostedPlatformTimers } from "./platform-timers.js";
|
|
61
64
|
import { renderAgentsIndexHtml, renderPlaygroundAsset, renderPlaygroundIndexHtml, } from "./playground/static.js";
|
|
62
65
|
import { ensurePlaygroundBundle, playgroundDevBaseFromEnv, playgroundDevBasePath, startPlaygroundDevServer, } from "./playground/toolchain.js";
|
|
63
66
|
import { ReminderRunner, ReminderValidationError, UnknownReminderError, } from "./reminder-runner.js";
|
|
@@ -95,6 +98,7 @@ export function startServer(mounts_1) {
|
|
|
95
98
|
const logger = logRing.wrap((_d = options.logger) !== null && _d !== void 0 ? _d : ((line) => console.log(line)));
|
|
96
99
|
const dev = (_e = options.dev) !== null && _e !== void 0 ? _e : false;
|
|
97
100
|
const playground = (_f = options.playground) !== null && _f !== void 0 ? _f : true;
|
|
101
|
+
const noControlPlane = options.noControlPlane === true;
|
|
98
102
|
const runSchedules = (_g = options.schedules) !== null && _g !== void 0 ? _g : !dev;
|
|
99
103
|
const runReminders = (_h = options.reminders) !== null && _h !== void 0 ? _h : !dev;
|
|
100
104
|
// Identify this process to the Cursor backend as agentkit (the SDK reads
|
|
@@ -258,7 +262,20 @@ export function startServer(mounts_1) {
|
|
|
258
262
|
githubAuthWarmed = true;
|
|
259
263
|
}
|
|
260
264
|
const scheduleRunner = new ScheduleRunner(engine, project, logger);
|
|
261
|
-
|
|
265
|
+
let reminderRunner;
|
|
266
|
+
const localControlPlane = noControlPlane
|
|
267
|
+
? undefined
|
|
268
|
+
: yield createLocalControlPlane({
|
|
269
|
+
fireSchedule: (name) => scheduleRunner.dispatch(name),
|
|
270
|
+
fireReminder: (id, fireCount) => reminderRunner.dispatch(id, { expectedFireCount: fireCount }),
|
|
271
|
+
stateDir: join(stateRoot, "control-plane"),
|
|
272
|
+
armReminderClocks: runReminders,
|
|
273
|
+
logger,
|
|
274
|
+
});
|
|
275
|
+
const timerClient = noControlPlane
|
|
276
|
+
? createCursorHostedPlatformTimers()
|
|
277
|
+
: localControlPlane;
|
|
278
|
+
reminderRunner = new ReminderRunner(engine, logger, timerClient);
|
|
262
279
|
const evalRuns = new EvalRunStore(project.rootDir, logger,
|
|
263
280
|
// Playground eval history mirrors onto the defineStorage evals table.
|
|
264
281
|
(_b = engine.storage) === null || _b === void 0 ? void 0 : _b.evalRuns());
|
|
@@ -281,18 +298,19 @@ export function startServer(mounts_1) {
|
|
|
281
298
|
start: (input) => evalRuns.start(input),
|
|
282
299
|
cancel: (runId) => evalRuns.cancel(runId),
|
|
283
300
|
});
|
|
284
|
-
const runtime = {
|
|
285
|
-
slug,
|
|
301
|
+
const runtime = Object.assign({ slug,
|
|
286
302
|
project,
|
|
287
303
|
engine,
|
|
288
304
|
scheduleRunner,
|
|
289
305
|
reminderRunner,
|
|
290
|
-
evalRuns,
|
|
291
|
-
|
|
306
|
+
evalRuns }, (localControlPlane === undefined
|
|
307
|
+
? {}
|
|
308
|
+
: { controlPlane: localControlPlane }));
|
|
292
309
|
runtimes.push(runtime);
|
|
293
310
|
const accountRefs = accountRefsBySlug.get(slug);
|
|
294
311
|
mountAgentRoutes(router, runtime, Object.assign(Object.assign(Object.assign({ dev,
|
|
295
312
|
playground,
|
|
313
|
+
noControlPlane,
|
|
296
314
|
multi,
|
|
297
315
|
logger,
|
|
298
316
|
logRing }, (options.authToken === undefined
|
|
@@ -334,12 +352,18 @@ export function startServer(mounts_1) {
|
|
|
334
352
|
}
|
|
335
353
|
}
|
|
336
354
|
}
|
|
337
|
-
if (runSchedules) {
|
|
338
|
-
|
|
355
|
+
if (timerClient !== undefined && runSchedules) {
|
|
356
|
+
yield syncHostedPlatformSchedules({
|
|
357
|
+
timers: timerClient,
|
|
358
|
+
schedules: project.schedules,
|
|
359
|
+
catalogPath: join(stateRoot, PLATFORM_SCHEDULE_CATALOG_FILENAME),
|
|
360
|
+
logger,
|
|
361
|
+
});
|
|
339
362
|
}
|
|
340
|
-
if (
|
|
341
|
-
yield reminderRunner.
|
|
363
|
+
if (timerClient !== undefined) {
|
|
364
|
+
yield reminderRunner.hydrate();
|
|
342
365
|
}
|
|
366
|
+
localControlPlane === null || localControlPlane === void 0 ? void 0 : localControlPlane.startClocks();
|
|
343
367
|
}
|
|
344
368
|
if (docsSite) {
|
|
345
369
|
// The framework documentation site, mounted at /docs in both layouts
|
|
@@ -604,10 +628,12 @@ export function startServer(mounts_1) {
|
|
|
604
628
|
},
|
|
605
629
|
close: () => __awaiter(this, void 0, void 0, function* () {
|
|
606
630
|
var _a;
|
|
631
|
+
var _b;
|
|
607
632
|
playgroundDev === null || playgroundDev === void 0 ? void 0 : playgroundDev.stop();
|
|
608
633
|
yield cursorEventRelay === null || cursorEventRelay === void 0 ? void 0 : cursorEventRelay.stop();
|
|
609
634
|
yield cursorSlackRelay === null || cursorSlackRelay === void 0 ? void 0 : cursorSlackRelay.stop();
|
|
610
635
|
for (const runtime of runtimes) {
|
|
636
|
+
(_a = runtime.controlPlane) === null || _a === void 0 ? void 0 : _a.stop();
|
|
611
637
|
runtime.scheduleRunner.stop();
|
|
612
638
|
runtime.reminderRunner.stop();
|
|
613
639
|
// Before the engines close their storage coordinators, so the
|
|
@@ -620,7 +646,7 @@ export function startServer(mounts_1) {
|
|
|
620
646
|
}
|
|
621
647
|
catch (error) {
|
|
622
648
|
logger(`[agentkit] channel onStop failed: ${error instanceof Error
|
|
623
|
-
? ((
|
|
649
|
+
? ((_b = error.stack) !== null && _b !== void 0 ? _b : error.message)
|
|
624
650
|
: String(error)}`);
|
|
625
651
|
}
|
|
626
652
|
}
|
|
@@ -646,7 +672,7 @@ export function startServer(mounts_1) {
|
|
|
646
672
|
function mountAgentRoutes(router, runtime, args) {
|
|
647
673
|
var _a, _b, _c;
|
|
648
674
|
const { slug, project, engine, scheduleRunner, reminderRunner } = runtime;
|
|
649
|
-
const { dev, playground, multi, logger, logRing } = args;
|
|
675
|
+
const { dev, playground, noControlPlane, multi, logger, logRing } = args;
|
|
650
676
|
// "" (single) -> "/v1/..."; "my-agent" (multi) -> "/my-agent/v1/...".
|
|
651
677
|
const base = slug === "" ? "" : `/${slug}`;
|
|
652
678
|
// The Cursor account MCP bridge for this mount's account MCP connections:
|
|
@@ -674,6 +700,18 @@ function mountAgentRoutes(router, runtime, args) {
|
|
|
674
700
|
? [allowAll()]
|
|
675
701
|
: [localDevStrict()];
|
|
676
702
|
const httpAuth = (_a = project.httpChannel.auth) !== null && _a !== void 0 ? _a : defaultAuth;
|
|
703
|
+
// Temporal posts this marker on a direct pod port-token fetch. The alias
|
|
704
|
+
// proxy strips it, so webhook/playground tokens cannot present it.
|
|
705
|
+
const platformTimerFireAuth = (request) => {
|
|
706
|
+
if (request.headers.get("x-agent-serve-timed-work") === "1") {
|
|
707
|
+
return {
|
|
708
|
+
authenticator: "app",
|
|
709
|
+
principalId: "agent-serve:timed-work",
|
|
710
|
+
principalType: "runtime",
|
|
711
|
+
};
|
|
712
|
+
}
|
|
713
|
+
return null;
|
|
714
|
+
};
|
|
677
715
|
// Playground lists/opens Slack (and other channel) sessions across
|
|
678
716
|
// principals when `--dev` (loopback) or `--allow-anonymous` (trusted
|
|
679
717
|
// shared host, e.g. corp Okta ALB). Never when bearer / custom channel
|
|
@@ -1008,6 +1046,62 @@ function mountAgentRoutes(router, runtime, args) {
|
|
|
1008
1046
|
}
|
|
1009
1047
|
}),
|
|
1010
1048
|
});
|
|
1049
|
+
if (noControlPlane === true) {
|
|
1050
|
+
router.add({
|
|
1051
|
+
method: "POST",
|
|
1052
|
+
pattern: `${base}/v1/internal/schedules/:scheduleId/fire`,
|
|
1053
|
+
auth: [platformTimerFireAuth],
|
|
1054
|
+
handler: (_request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
1055
|
+
var _a;
|
|
1056
|
+
const scheduleId = (_a = ctx.params.scheduleId) !== null && _a !== void 0 ? _a : "";
|
|
1057
|
+
try {
|
|
1058
|
+
const { sessionIds } = yield scheduleRunner.dispatch(scheduleId);
|
|
1059
|
+
return jsonResponse({ scheduleId, sessionIds });
|
|
1060
|
+
}
|
|
1061
|
+
catch (error) {
|
|
1062
|
+
if (error instanceof UnknownScheduleError) {
|
|
1063
|
+
return jsonResponse({
|
|
1064
|
+
ok: false,
|
|
1065
|
+
error: "unknown_schedule",
|
|
1066
|
+
availableScheduleIds: error.availableScheduleIds,
|
|
1067
|
+
}, { status: 404 });
|
|
1068
|
+
}
|
|
1069
|
+
throw error;
|
|
1070
|
+
}
|
|
1071
|
+
}),
|
|
1072
|
+
});
|
|
1073
|
+
router.add({
|
|
1074
|
+
method: "POST",
|
|
1075
|
+
pattern: `${base}/v1/internal/reminders/:reminderId/fire`,
|
|
1076
|
+
auth: [platformTimerFireAuth],
|
|
1077
|
+
handler: (request, ctx) => __awaiter(this, void 0, void 0, function* () {
|
|
1078
|
+
var _a;
|
|
1079
|
+
const reminderId = (_a = ctx.params.reminderId) !== null && _a !== void 0 ? _a : "";
|
|
1080
|
+
const fireCountRaw = new URL(request.url).searchParams.get("fireCount");
|
|
1081
|
+
const expectedFireCount = fireCountRaw === null ? undefined : Number(fireCountRaw);
|
|
1082
|
+
try {
|
|
1083
|
+
const result = yield reminderRunner.dispatch(reminderId, expectedFireCount !== undefined &&
|
|
1084
|
+
Number.isInteger(expectedFireCount)
|
|
1085
|
+
? { expectedFireCount }
|
|
1086
|
+
: {});
|
|
1087
|
+
return jsonResponse(result);
|
|
1088
|
+
}
|
|
1089
|
+
catch (error) {
|
|
1090
|
+
if (error instanceof UnknownReminderError) {
|
|
1091
|
+
return jsonResponse({
|
|
1092
|
+
ok: false,
|
|
1093
|
+
error: "unknown_reminder",
|
|
1094
|
+
availableReminderIds: error.availableReminderIds,
|
|
1095
|
+
}, { status: 404 });
|
|
1096
|
+
}
|
|
1097
|
+
if (error instanceof ReminderValidationError) {
|
|
1098
|
+
return jsonResponse({ ok: false, error: "invalid_reminder", message: error.message }, { status: 400 });
|
|
1099
|
+
}
|
|
1100
|
+
throw error;
|
|
1101
|
+
}
|
|
1102
|
+
}),
|
|
1103
|
+
});
|
|
1104
|
+
}
|
|
1011
1105
|
if (dev) {
|
|
1012
1106
|
router.add({
|
|
1013
1107
|
method: "POST",
|
|
@@ -1349,11 +1443,16 @@ function startCursorSlackRelay(input) {
|
|
|
1349
1443
|
const stateDir = join(baseStateRoot, "cursor-slack");
|
|
1350
1444
|
// Optional fields may be undefined — the relay JSON-serializes the
|
|
1351
1445
|
// registration body, which drops them.
|
|
1352
|
-
const agents = targets.map((target) => {
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1446
|
+
const agents = targets.map((target) => {
|
|
1447
|
+
var _a, _b;
|
|
1448
|
+
const policy = target.accountRuntime.options.policy;
|
|
1449
|
+
return {
|
|
1450
|
+
name: target.agentName,
|
|
1451
|
+
iconUrl: (_a = target.accountRuntime.options.agentIcon) === null || _a === void 0 ? void 0 : _a.url,
|
|
1452
|
+
iconEmoji: (_b = target.accountRuntime.options.agentIcon) === null || _b === void 0 ? void 0 : _b.emoji,
|
|
1453
|
+
blockExternals: (policy === null || policy === void 0 ? void 0 : policy.blockExternals) === false ? false : undefined,
|
|
1454
|
+
};
|
|
1455
|
+
});
|
|
1357
1456
|
const targetByName = new Map(targets.map((target) => [target.agentName.toLowerCase(), target]));
|
|
1358
1457
|
const relay = new CursorSlackRelay({
|
|
1359
1458
|
baseUrl,
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { SlackAskDedupeStore, SlackNudgeStore } from "../channels/slack/nudge-store.js";
|
|
10
10
|
import { type AgentProject, type ApprovalDecision, type ArtifactListFilter, type ArtifactRecord, type ArtifactsApi, 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
|
+
import { type CloudAgentUsage } from "./cloud-turn-cost.js";
|
|
12
13
|
import { type HostPlatforms } from "./host-platforms.js";
|
|
13
14
|
import type { AgentRunner } from "./sdk-runner.js";
|
|
14
15
|
import { SessionStore } from "./session-store.js";
|
|
@@ -52,6 +53,12 @@ export interface SessionEngineOptions {
|
|
|
52
53
|
runner: AgentRunner;
|
|
53
54
|
logger?: (line: string) => void;
|
|
54
55
|
platforms?: HostPlatforms;
|
|
56
|
+
/**
|
|
57
|
+
* Test seam / override for cloud billed usage (`Agent.getUsage`). Used to
|
|
58
|
+
* backfill `turn.completed` rows that older engines persisted without
|
|
59
|
+
* usage/cost so the playground Trace tab can still show an estimate.
|
|
60
|
+
*/
|
|
61
|
+
getCloudUsage?: (sdkAgentId: string) => Promise<CloudAgentUsage | undefined>;
|
|
55
62
|
}
|
|
56
63
|
/**
|
|
57
64
|
* A connection the serve host resolved once it was listening — a **peer**
|
|
@@ -137,6 +144,11 @@ export declare class SessionEngine {
|
|
|
137
144
|
private readonly artifactsStore;
|
|
138
145
|
/** Serve-time resolved connections (see {@link setResolvedConnections}). */
|
|
139
146
|
private resolvedConnections;
|
|
147
|
+
private readonly getCloudUsage;
|
|
148
|
+
/** Sessions whose completed turns are fully priced (no further backfill). */
|
|
149
|
+
private readonly cloudCostBackfillDone;
|
|
150
|
+
/** Deduped in-flight cloud cost backfills, keyed by session id. */
|
|
151
|
+
private readonly cloudCostBackfill;
|
|
140
152
|
constructor(options: SessionEngineOptions);
|
|
141
153
|
/**
|
|
142
154
|
* Attach serve-time resolved connections (peers, Cursor account bridge).
|
|
@@ -390,7 +402,16 @@ export declare class SessionEngine {
|
|
|
390
402
|
*/
|
|
391
403
|
emitAssistantMessage(sessionId: string, text: string): Promise<void>;
|
|
392
404
|
/** Snapshot of recorded events (for download / offline trace). */
|
|
393
|
-
listEvents(sessionId: string, startIndex?: number
|
|
405
|
+
listEvents(sessionId: string, startIndex?: number, options?: {
|
|
406
|
+
backfillCloudCost?: boolean;
|
|
407
|
+
}): Promise<SessionEvent[]>;
|
|
408
|
+
/**
|
|
409
|
+
* Historical cloud turns may lack usage/cost on `turn.completed` (pre-0.1.29
|
|
410
|
+
* engines, or getUsage still zero at turn end). Fill them from billed usage
|
|
411
|
+
* before the playground replays the stream so Trace can show est. cost.
|
|
412
|
+
*/
|
|
413
|
+
private backfillCloudTurnCosts;
|
|
414
|
+
private runCloudTurnCostBackfill;
|
|
394
415
|
setContinuationToken(sessionId: string, token: string | null): Promise<void>;
|
|
395
416
|
isTurnRunning(sessionId: string): boolean;
|
|
396
417
|
sessionInfo(record: SessionRecord): SessionInfo;
|
|
@@ -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;
|
|
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;AAE1C,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,YAAY,EAEjB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EAKnB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAI1B,KAAK,eAAe,EACpB,KAAK,YAAY,EAKjB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EAEjB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,cAAc,EAEnB,KAAK,eAAe,EAGpB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,KAAK,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAKpE,OAAO,EAEL,KAAK,eAAe,EAIrB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAe7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAU9D,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,SAAS,EAAE,MAAM,EAK5B;CACF;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,SAAS,EAAE,MAAM,EAK5B;CACF;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,SAAS,EAAE,MAAM,EAG5B;CACF;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAGvC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,EAAE;IAFvC,YACE,QAAQ,EAAE,MAAM,EACP,kBAAkB,EAAE,MAAM,EAAE,EAItC;CACF;AAED,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,YAAY,QAAQ,EAAE,MAAM,EAK3B;CACF;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAGrD;CACF;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,SAAS,EAAE,MAAM,EAG5B;CACF;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAG5C;CACF;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,YAAY,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAK5C;CACF;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B;;;;OAIG;IACH,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;CAC9E;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,wBAAwB;IACvC,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAiBD,qBAAa,aAAa;IACxB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,sEAAsE;IACtE,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACjD,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG5B;IACJ,6EAA6E;IAC7E,OAAO,CAAC,kBAAkB,CAA8C;IAExE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IACrE,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2C;IACvE,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IACjE,qEAAqE;IACrE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuC;IACvE,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA4C;IAC3E;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoC;IACnE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAsB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,4EAA4E;IAC5E,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAEY;IAC1C,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAqB;IAC3D,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoC;IAEtE,YAAY,OAAO,EAAE,oBAAoB,EAwExC;IAED;;;;;OAKG;IACH,sBAAsB,CAAC,WAAW,EAAE,wBAAwB,EAAE,GAAG,IAAI,CAapE;IAED,2FAA2F;IAC3F,IAAI,IAAI,IAAI,WAAW,CAUtB;IAED,6EAA6E;IAC7E,IAAI,SAAS,IAAI,YAAY,CAE5B;IAED;;;;;;OAMG;IACH,YAAY,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAsB3E;IAED;;;;;;;OAOG;YACW,WAAW;IA4BzB,OAAO,CAAC,iBAAiB;IAiBzB,oEAAoE;IACpE,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,GAAG,IAAI,CAEhD;IAED,4EAA4E;IAC5E,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAExC;IAMD;;;;OAIG;IACG,IAAI,CACR,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAiGzB;IAED,8EAA8E;IACxE,sBAAsB,CAC1B,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC,CAYlB;IAED;;;;;;OAMG;YACW,SAAS;IAyCvB;;;OAGG;YACW,SAAS;IAmBvB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgBvB,oDAAoD;IAC9C,iBAAiB,CACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAMhC;IAED,qEAAqE;IAC/D,OAAO,CACX,OAAO,EAAE,iBAAiB,GAAG,qBAAqB,GAAG,MAAM,EAC3D,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,cAAc,CAAC,CA2BzB;IAED,+DAA+D;IACzD,OAAO,CAAC,IAAI,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,CAO7D;IAMD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,wBAAwB;YAoBlB,uBAAuB;YAgBvB,SAAS;IA0GvB;;;;OAIG;YACW,mBAAmB;IAYjC;;;;OAIG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAcnD;IAEK,kBAAkB,CACtB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC,CAelB;IAED;;;OAGG;IACG,+BAA+B,CACnC,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoB7B;IAEK,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,OAAO,CAAC,CAelB;IAED;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAaxC;IAED;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;;;;OAOG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC5C;IAED,gEAAgE;IAChE,OAAO,CAAC,WAAW;YAOL,WAAW;IA8LzB,OAAO,CAAC,gBAAgB;IA+FxB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAkDvB,OAAO,CAAC,gBAAgB;IA4GxB;;;;OAIG;YACW,eAAe;YA8Df,qBAAqB;IAenC,uEAAuE;IACjE,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAUxE;IAED;;;;;;;OAOG;IACG,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GACrC,OAAO,CAAC,eAAe,CAAC,CAqB1B;YAEa,qBAAqB;IAgBnC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,OAAY,EACnB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,eAAe,CAAC,CAoJ1B;YAMa,WAAW;IAUzB,OAAO,CAAC,aAAa;YAqBP,aAAa;IAiF3B,OAAO,CAAC,uBAAuB;IAazB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiB/D;IAED;;;;;;;;;;;OAWG;IACG,YAAY,CAChB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,cAAc,EAAE,CAAC,CAE3B;IAED;;;;;OAKG;IACG,aAAa,CACjB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,kBAAkB,CAAA;KAAE,GAC9D,OAAO,CAAC,cAAc,EAAE,CAAC,CAc3B;IAED;;;;OAIG;IACG,sBAAsB,CAC1B,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC;QAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAyBpE;IAED;;;;OAIG;YACW,2BAA2B;IAyBzC,OAAO,CAAC,uBAAuB;IAmC/B;;;;OAIG;IACG,UAAU,CACd,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACjC,OAAO,CAAC,UAAU,CAAC,CA6CrB;IAEK,WAAW,CACf,SAAS,EAAE,MAAM,EACjB,UAAU,SAAI,GACb,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAMrC;IAED;;;;OAIG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzE;IAED,kEAAkE;IAC5D,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,UAAU,SAAI,EACd,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GACxC,OAAO,CAAC,YAAY,EAAE,CAAC,CAMzB;IAED;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;YAqBhB,wBAAwB;IA0ChC,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,IAAI,CAAC,CAmBf;IAED,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CASxC;IAED,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAc9C;IAED,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,mBAAmB;IAc3B,sEAAsE;IACtE,OAAO,CAAC,YAAY;IA6BpB;;;;;;;;;;;OAWG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAc3C;YAEa,cAAc;IA4F5B;;;;;;;;OAQG;IACG,mBAAmB,CACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAMpC;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,4BAA4B;IAqBpC,OAAO,CAAC,kBAAkB;YAkBZ,gCAAgC;YAgBhC,sBAAsB;YAWtB,yBAAyB;IAmBvC;;;;;OAKG;YACW,kBAAkB;IAYhC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAO/C;IAED,yEAAyE;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAU3B;CACF"}
|
|
@@ -31,6 +31,7 @@ import { dirname, join } from "node:path";
|
|
|
31
31
|
import { mergeABInstructions, resolveABMaxPlaygroundSessions, resolveABSplit, } from "../ab.js";
|
|
32
32
|
import { slackThreadPermalink } from "../channels/slack/links.js";
|
|
33
33
|
import { SlackAskDedupeStore, SlackNudgeStore, } from "../channels/slack/nudge-store.js";
|
|
34
|
+
import { resolveDedicatedSlackHostBinding } from "../channels/slack/slack-channel.js";
|
|
34
35
|
import { DEFAULT_MODEL, DIRECT_TOOL_CALL_CHANNEL_ID, isHostOauthConnectionTransport, isSymbolicConnectionTransport, } from "../types.js";
|
|
35
36
|
import { ABCollector } from "./ab-collector.js";
|
|
36
37
|
import { foldABStream } from "./ab-fold.js";
|
|
@@ -39,11 +40,12 @@ import { ApprovalGate } from "./approval-gate.js";
|
|
|
39
40
|
import { ArtifactsStore } from "./artifacts-store.js";
|
|
40
41
|
import { samePrincipal } from "./auth.js";
|
|
41
42
|
import { mergeCloudOptions, resolveSessionRuntime } from "./cloud-merge.js";
|
|
43
|
+
import { applyCloudUsageToEvents, cloudSdkAgentIdFromEvents, isUnpricedCompletedTurn, mapSdkTokenUsage, } from "./cloud-turn-cost.js";
|
|
42
44
|
import { isDevMode } from "./dev-mode.js";
|
|
43
45
|
import { EventLogStore } from "./event-log.js";
|
|
44
46
|
import { TurnEventMapper } from "./event-mapper.js";
|
|
45
47
|
import { createHostKvApi } from "./host-kv.js";
|
|
46
|
-
import { createHostPlatforms } from "./host-platforms.js";
|
|
48
|
+
import { createHostPlatforms, createHostSlackClient, } from "./host-platforms.js";
|
|
47
49
|
import { formatContinuationToken, newContinuationKey, newSessionId, newToolCallId, } from "./ids.js";
|
|
48
50
|
import { validateToolInput } from "./json-schema.js";
|
|
49
51
|
import { McpHost } from "./mcp-host.js";
|
|
@@ -114,7 +116,7 @@ export class ApprovalInterruptedError extends Error {
|
|
|
114
116
|
}
|
|
115
117
|
export class SessionEngine {
|
|
116
118
|
constructor(options) {
|
|
117
|
-
var _a, _b;
|
|
119
|
+
var _a, _b, _c;
|
|
118
120
|
/** In-flight lazy restores, deduped per channel + continuation key. */
|
|
119
121
|
this.restoreInFlight = new Map();
|
|
120
122
|
this.channelsById = new Map();
|
|
@@ -142,10 +144,15 @@ export class SessionEngine {
|
|
|
142
144
|
this.approvals = new ApprovalGate();
|
|
143
145
|
/** Serve-time resolved connections (see {@link setResolvedConnections}). */
|
|
144
146
|
this.resolvedConnections = [];
|
|
147
|
+
/** Sessions whose completed turns are fully priced (no further backfill). */
|
|
148
|
+
this.cloudCostBackfillDone = new Set();
|
|
149
|
+
/** Deduped in-flight cloud cost backfills, keyed by session id. */
|
|
150
|
+
this.cloudCostBackfill = new Map();
|
|
145
151
|
this.project = options.project;
|
|
146
152
|
this.stateRoot = options.stateRoot;
|
|
147
153
|
this.runner = options.runner;
|
|
148
154
|
this.logger = (_a = options.logger) !== null && _a !== void 0 ? _a : (() => { });
|
|
155
|
+
this.getCloudUsage = (_b = options.getCloudUsage) !== null && _b !== void 0 ? _b : defaultGetCloudUsage;
|
|
149
156
|
this.turnGovernor = new TurnGovernor(options.project.agent.concurrency);
|
|
150
157
|
this.sessions = new SessionStore(join(options.stateRoot, "sessions"));
|
|
151
158
|
this.nudgeStore = new SlackNudgeStore(join(options.stateRoot, "slack-nudges"));
|
|
@@ -173,7 +180,18 @@ export class SessionEngine {
|
|
|
173
180
|
// resolves them; the host-side MCP registry starts with the concrete
|
|
174
181
|
// connections and gains the rest via setResolvedConnections.
|
|
175
182
|
this.mcpHost = new McpHost(options.project.agent.connections.filter((connection) => !isSymbolicConnectionTransport(connection.transport)));
|
|
176
|
-
|
|
183
|
+
const basePlatforms = (_c = options.platforms) !== null && _c !== void 0 ? _c : createHostPlatforms();
|
|
184
|
+
const slackBinding = resolveDedicatedSlackHostBinding(options.project.channels);
|
|
185
|
+
this.platforms =
|
|
186
|
+
slackBinding === undefined
|
|
187
|
+
? basePlatforms
|
|
188
|
+
: {
|
|
189
|
+
github: basePlatforms.github,
|
|
190
|
+
slack: createHostSlackClient({
|
|
191
|
+
credentials: slackBinding.credentials,
|
|
192
|
+
envPrefix: slackBinding.envPrefix,
|
|
193
|
+
}),
|
|
194
|
+
};
|
|
177
195
|
for (const channel of options.project.channels) {
|
|
178
196
|
this.channelsById.set(channel.id, channel.definition);
|
|
179
197
|
}
|
|
@@ -1706,6 +1724,9 @@ export class SessionEngine {
|
|
|
1706
1724
|
}
|
|
1707
1725
|
eventStream(sessionId_1) {
|
|
1708
1726
|
return __awaiter(this, arguments, void 0, function* (sessionId, startIndex = 0) {
|
|
1727
|
+
// Playground Trace replays this stream; backfill before the snapshot
|
|
1728
|
+
// so historical Sherlock-style cloud turns can show est. cost.
|
|
1729
|
+
yield this.backfillCloudTurnCosts(sessionId);
|
|
1709
1730
|
const log = yield this.logs.get(sessionId);
|
|
1710
1731
|
return log.stream(startIndex);
|
|
1711
1732
|
});
|
|
@@ -1753,11 +1774,78 @@ export class SessionEngine {
|
|
|
1753
1774
|
}
|
|
1754
1775
|
/** Snapshot of recorded events (for download / offline trace). */
|
|
1755
1776
|
listEvents(sessionId_1) {
|
|
1756
|
-
return __awaiter(this, arguments, void 0, function* (sessionId, startIndex = 0) {
|
|
1777
|
+
return __awaiter(this, arguments, void 0, function* (sessionId, startIndex = 0, options) {
|
|
1778
|
+
if ((options === null || options === void 0 ? void 0 : options.backfillCloudCost) === true) {
|
|
1779
|
+
yield this.backfillCloudTurnCosts(sessionId);
|
|
1780
|
+
}
|
|
1757
1781
|
const log = yield this.logs.get(sessionId);
|
|
1758
1782
|
return log.snapshot(startIndex);
|
|
1759
1783
|
});
|
|
1760
1784
|
}
|
|
1785
|
+
/**
|
|
1786
|
+
* Historical cloud turns may lack usage/cost on `turn.completed` (pre-0.1.29
|
|
1787
|
+
* engines, or getUsage still zero at turn end). Fill them from billed usage
|
|
1788
|
+
* before the playground replays the stream so Trace can show est. cost.
|
|
1789
|
+
*/
|
|
1790
|
+
backfillCloudTurnCosts(sessionId) {
|
|
1791
|
+
if (this.cloudCostBackfillDone.has(sessionId)) {
|
|
1792
|
+
return Promise.resolve();
|
|
1793
|
+
}
|
|
1794
|
+
const pending = this.cloudCostBackfill.get(sessionId);
|
|
1795
|
+
if (pending !== undefined) {
|
|
1796
|
+
return pending;
|
|
1797
|
+
}
|
|
1798
|
+
const work = this.runCloudTurnCostBackfill(sessionId)
|
|
1799
|
+
.catch((error) => {
|
|
1800
|
+
this.logger(`[agentkit] cloud cost backfill failed for ${sessionId}: ${describeError(error)}`);
|
|
1801
|
+
})
|
|
1802
|
+
.finally(() => {
|
|
1803
|
+
this.cloudCostBackfill.delete(sessionId);
|
|
1804
|
+
});
|
|
1805
|
+
this.cloudCostBackfill.set(sessionId, work);
|
|
1806
|
+
return work;
|
|
1807
|
+
}
|
|
1808
|
+
runCloudTurnCostBackfill(sessionId) {
|
|
1809
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
1810
|
+
var _a, _b;
|
|
1811
|
+
const log = yield this.logs.get(sessionId);
|
|
1812
|
+
const events = log.snapshot(0);
|
|
1813
|
+
if (!events.some((event) => isUnpricedCompletedTurn(event))) {
|
|
1814
|
+
if (!this.isTurnRunning(sessionId) &&
|
|
1815
|
+
events.some((event) => event.type === "turn.completed")) {
|
|
1816
|
+
this.cloudCostBackfillDone.add(sessionId);
|
|
1817
|
+
}
|
|
1818
|
+
return;
|
|
1819
|
+
}
|
|
1820
|
+
const record = yield this.sessions.get(sessionId);
|
|
1821
|
+
const sdkAgentId = (_a = ((record === null || record === void 0 ? void 0 : record.sdkAgentId) !== undefined && record.sdkAgentId.startsWith("bc-")
|
|
1822
|
+
? record.sdkAgentId
|
|
1823
|
+
: undefined)) !== null && _a !== void 0 ? _a : cloudSdkAgentIdFromEvents(events);
|
|
1824
|
+
if (sdkAgentId === undefined) {
|
|
1825
|
+
return;
|
|
1826
|
+
}
|
|
1827
|
+
const billed = yield this.getCloudUsage(sdkAgentId);
|
|
1828
|
+
if (billed === undefined) {
|
|
1829
|
+
return;
|
|
1830
|
+
}
|
|
1831
|
+
const model = (_b = this.project.agent.model) !== null && _b !== void 0 ? _b : DEFAULT_MODEL;
|
|
1832
|
+
const patched = applyCloudUsageToEvents(events, billed, model);
|
|
1833
|
+
if (patched === undefined) {
|
|
1834
|
+
return;
|
|
1835
|
+
}
|
|
1836
|
+
for (let i = 0; i < patched.length; i++) {
|
|
1837
|
+
const next = patched[i];
|
|
1838
|
+
const prev = events[i];
|
|
1839
|
+
if (next === undefined || prev === next) {
|
|
1840
|
+
continue;
|
|
1841
|
+
}
|
|
1842
|
+
log.replace(i, next);
|
|
1843
|
+
}
|
|
1844
|
+
if (!log.snapshot(0).some((event) => isUnpricedCompletedTurn(event))) {
|
|
1845
|
+
this.cloudCostBackfillDone.add(sessionId);
|
|
1846
|
+
}
|
|
1847
|
+
});
|
|
1848
|
+
}
|
|
1761
1849
|
setContinuationToken(sessionId, token) {
|
|
1762
1850
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1763
1851
|
var _a;
|
|
@@ -2099,6 +2187,24 @@ function buildRunnerSubagents(agent) {
|
|
|
2099
2187
|
function describeError(error) {
|
|
2100
2188
|
return error instanceof Error ? error.message : String(error);
|
|
2101
2189
|
}
|
|
2190
|
+
function defaultGetCloudUsage(sdkAgentId) {
|
|
2191
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
2192
|
+
try {
|
|
2193
|
+
const { Agent } = yield import("@cursor/sdk");
|
|
2194
|
+
const billed = yield Agent.getUsage(sdkAgentId);
|
|
2195
|
+
return {
|
|
2196
|
+
usage: mapSdkTokenUsage(billed.usage),
|
|
2197
|
+
runs: billed.runs.map((run) => ({
|
|
2198
|
+
runId: run.runId,
|
|
2199
|
+
usage: mapSdkTokenUsage(run.usage),
|
|
2200
|
+
})),
|
|
2201
|
+
};
|
|
2202
|
+
}
|
|
2203
|
+
catch (_a) {
|
|
2204
|
+
return undefined;
|
|
2205
|
+
}
|
|
2206
|
+
});
|
|
2207
|
+
}
|
|
2102
2208
|
/** Detects the `{ content, isError: true }` rich-result error envelope. */
|
|
2103
2209
|
function isErrorEnvelope(result) {
|
|
2104
2210
|
return (typeof result === "object" &&
|
|
@@ -10,16 +10,16 @@
|
|
|
10
10
|
* failures — a throwing sink is logged and its write dropped; storage
|
|
11
11
|
* must never stall or fail a turn.
|
|
12
12
|
*
|
|
13
|
-
* Scaling shape: sessions
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* Scaling shape: sessions reduce to keyed puts on the KV sink; eval runs
|
|
14
|
+
* and A/B metrics go to their dedicated tables (`evals` / `abs`).
|
|
15
|
+
* Reminder documents live on the control plane. Everything shares one
|
|
16
|
+
* bounded, serialized queue.
|
|
16
17
|
*/
|
|
17
18
|
import type { ABMetricSample } from "../ab.js";
|
|
18
19
|
import { type ResolvedStoragePolicy, type StorageContext, type StorageDefinition } from "../storage.js";
|
|
19
20
|
import type { JsonValue, SessionEvent, SessionRecord } from "../types.js";
|
|
20
21
|
import type { ABSnapshot } from "./ab-snapshot.js";
|
|
21
22
|
import type { EvalRunStorage } from "./eval-run-store.js";
|
|
22
|
-
import { type ReminderRecord } from "./reminder-store.js";
|
|
23
23
|
export interface StorageCoordinatorOptions {
|
|
24
24
|
definition: StorageDefinition;
|
|
25
25
|
agentName: string;
|
|
@@ -113,17 +113,6 @@ export declare class StorageCoordinator {
|
|
|
113
113
|
* `get`) resolves undefined.
|
|
114
114
|
*/
|
|
115
115
|
getSessionByContinuation(channelId: string, continuationKey: string): Promise<SessionRecord | undefined>;
|
|
116
|
-
/**
|
|
117
|
-
* Mirror one reminder record (create / fire / cancel / disarm). Local
|
|
118
|
-
* disk under `--state-root/reminders` remains the live source of truth;
|
|
119
|
-
* this is the durable copy for host replacement.
|
|
120
|
-
*/
|
|
121
|
-
reminder(record: ReminderRecord): void;
|
|
122
|
-
/**
|
|
123
|
-
* Saved reminder records for this agent (startup hydrate into local
|
|
124
|
-
* disk). Errors read as empty — same posture as session bulk restore.
|
|
125
|
-
*/
|
|
126
|
-
listReminders(): Promise<ReminderRecord[]>;
|
|
127
116
|
/**
|
|
128
117
|
* Whether the sink can serve awaited author reads/writes (`get` is
|
|
129
118
|
* required — `put` is always present on {@link StorageConfig}).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"storage-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/storage-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,9 +10,10 @@
|
|
|
10
10
|
* failures — a throwing sink is logged and its write dropped; storage
|
|
11
11
|
* must never stall or fail a turn.
|
|
12
12
|
*
|
|
13
|
-
* Scaling shape: sessions
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* Scaling shape: sessions reduce to keyed puts on the KV sink; eval runs
|
|
14
|
+
* and A/B metrics go to their dedicated tables (`evals` / `abs`).
|
|
15
|
+
* Reminder documents live on the control plane. Everything shares one
|
|
16
|
+
* bounded, serialized queue.
|
|
16
17
|
*/
|
|
17
18
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
19
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -26,7 +27,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
26
27
|
import { resolveStoragePolicy, storageKeys, } from "../storage.js";
|
|
27
28
|
import { isCursorHostedStorage } from "../storage-backends/cursor-hosted.js";
|
|
28
29
|
import { describeError } from "./describe-error.js";
|
|
29
|
-
import { isReminderRecord } from "./reminder-store.js";
|
|
30
30
|
/** Event types that close a unit of work — flush point for turn-end batching. */
|
|
31
31
|
const TURN_BOUNDARY_EVENTS = new Set([
|
|
32
32
|
"turn.completed",
|
|
@@ -321,32 +321,6 @@ export class StorageCoordinator {
|
|
|
321
321
|
});
|
|
322
322
|
}
|
|
323
323
|
// ==========================================================================
|
|
324
|
-
// Reminders
|
|
325
|
-
// ==========================================================================
|
|
326
|
-
/**
|
|
327
|
-
* Mirror one reminder record (create / fire / cancel / disarm). Local
|
|
328
|
-
* disk under `--state-root/reminders` remains the live source of truth;
|
|
329
|
-
* this is the durable copy for host replacement.
|
|
330
|
-
*/
|
|
331
|
-
reminder(record) {
|
|
332
|
-
if (this.closed) {
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
this.enqueue([
|
|
336
|
-
this.putOp(storageKeys.reminder(this.agentName, record.id), record),
|
|
337
|
-
], "policy");
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Saved reminder records for this agent (startup hydrate into local
|
|
341
|
-
* disk). Errors read as empty — same posture as session bulk restore.
|
|
342
|
-
*/
|
|
343
|
-
listReminders() {
|
|
344
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
345
|
-
const entries = yield this.tryList(storageKeys.reminderPrefix(this.agentName));
|
|
346
|
-
return entries.flatMap((entry) => isReminderRecord(entry.value) ? [entry.value] : []);
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
// ==========================================================================
|
|
350
324
|
// Author KV ({@link HostContext.kv})
|
|
351
325
|
// ==========================================================================
|
|
352
326
|
/**
|