@stigmer/runner 3.5.3 → 3.7.0
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/.build-fingerprint +1 -1
- package/dist/activities/call-agent.js +85 -10
- package/dist/activities/call-agent.js.map +1 -1
- package/dist/activities/discover-mcp-server.js +9 -1
- package/dist/activities/discover-mcp-server.js.map +1 -1
- package/dist/activities/execute-cursor/index.d.ts +5 -0
- package/dist/activities/execute-cursor/index.js +88 -14
- package/dist/activities/execute-cursor/index.js.map +1 -1
- package/dist/activities/execute-cursor/model-pricing.d.ts +9 -0
- package/dist/activities/execute-cursor/model-pricing.js +19 -0
- package/dist/activities/execute-cursor/model-pricing.js.map +1 -1
- package/dist/activities/execute-cursor/prompt-builder.d.ts +7 -0
- package/dist/activities/execute-cursor/prompt-builder.js +9 -0
- package/dist/activities/execute-cursor/prompt-builder.js.map +1 -1
- package/dist/activities/execute-cursor/service-tier.d.ts +68 -0
- package/dist/activities/execute-cursor/service-tier.js +187 -0
- package/dist/activities/execute-cursor/service-tier.js.map +1 -0
- package/dist/activities/execute-cursor/session-lifecycle.d.ts +16 -1
- package/dist/activities/execute-cursor/session-lifecycle.js +12 -4
- package/dist/activities/execute-cursor/session-lifecycle.js.map +1 -1
- package/dist/activities/execute-cursor/usage-accumulator.d.ts +21 -1
- package/dist/activities/execute-cursor/usage-accumulator.js +23 -3
- package/dist/activities/execute-cursor/usage-accumulator.js.map +1 -1
- package/dist/activities/execute-deep-agent/prompt-builder.d.ts +6 -0
- package/dist/activities/execute-deep-agent/prompt-builder.js +3 -0
- package/dist/activities/execute-deep-agent/prompt-builder.js.map +1 -1
- package/dist/activities/execute-deep-agent/setup.js +45 -9
- package/dist/activities/execute-deep-agent/setup.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +32 -1
- package/dist/client/stigmer-client.js +42 -2
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/main.js +18 -0
- package/dist/main.js.map +1 -1
- package/dist/runner.js +48 -0
- package/dist/runner.js.map +1 -1
- package/dist/sandbox-token-renewal.d.ts +65 -0
- package/dist/sandbox-token-renewal.js +169 -0
- package/dist/sandbox-token-renewal.js.map +1 -0
- package/dist/shared/artifact-storage.d.ts +17 -3
- package/dist/shared/artifact-storage.js +22 -4
- package/dist/shared/artifact-storage.js.map +1 -1
- package/dist/shared/caller-identity.d.ts +89 -0
- package/dist/shared/caller-identity.js +124 -0
- package/dist/shared/caller-identity.js.map +1 -0
- package/dist/shared/channel-attachment.d.ts +85 -0
- package/dist/shared/channel-attachment.js +203 -0
- package/dist/shared/channel-attachment.js.map +1 -0
- package/dist/shared/datastore-attachment.d.ts +2 -25
- package/dist/shared/datastore-attachment.js +1 -28
- package/dist/shared/datastore-attachment.js.map +1 -1
- package/dist/shared/synthesized-attachment.d.ts +51 -0
- package/dist/shared/synthesized-attachment.js +45 -0
- package/dist/shared/synthesized-attachment.js.map +1 -0
- package/dist/workflow-engine/loader.js +99 -2
- package/dist/workflow-engine/loader.js.map +1 -1
- package/dist/workflow-engine/tasks/call-agent.d.ts +0 -2
- package/dist/workflow-engine/tasks/call-agent.js +0 -2
- package/dist/workflow-engine/tasks/call-agent.js.map +1 -1
- package/dist/workflow-engine/types.d.ts +39 -7
- package/dist/workflow-engine/types.js.map +1 -1
- package/dist/workflows/call-agent-orchestrator.d.ts +3 -2
- package/dist/workflows/call-agent-orchestrator.js +8 -2
- package/dist/workflows/call-agent-orchestrator.js.map +1 -1
- package/package.json +2 -2
- package/src/__test-utils__/mock-client.ts +4 -0
- package/src/__tests__/sandbox-token-renewal.test.ts +174 -0
- package/src/activities/__tests__/call-agent-contracts.test.ts +4 -4
- package/src/activities/__tests__/call-agent.test.ts +219 -4
- package/src/activities/__tests__/discover-mcp-server.test.ts +49 -0
- package/src/activities/call-agent.ts +94 -10
- package/src/activities/discover-mcp-server.ts +13 -1
- package/src/activities/execute-cursor/__tests__/model-pricing.test.ts +20 -0
- package/src/activities/execute-cursor/__tests__/service-tier.test.ts +170 -0
- package/src/activities/execute-cursor/__tests__/usage-accumulator.test.ts +87 -1
- package/src/activities/execute-cursor/index.ts +121 -20
- package/src/activities/execute-cursor/model-pricing.ts +23 -0
- package/src/activities/execute-cursor/prompt-builder.ts +19 -0
- package/src/activities/execute-cursor/service-tier.ts +244 -0
- package/src/activities/execute-cursor/session-lifecycle.ts +33 -5
- package/src/activities/execute-cursor/usage-accumulator.ts +35 -3
- package/src/activities/execute-deep-agent/prompt-builder.ts +10 -0
- package/src/activities/execute-deep-agent/setup.ts +66 -10
- package/src/client/stigmer-client.ts +57 -4
- package/src/main.ts +20 -0
- package/src/runner.ts +62 -0
- package/src/sandbox-token-renewal.ts +212 -0
- package/src/shared/__tests__/caller-identity.test.ts +159 -0
- package/src/shared/__tests__/channel-attachment.test.ts +276 -0
- package/src/shared/__tests__/datastore-attachment.test.ts +4 -4
- package/src/shared/artifact-storage.ts +32 -7
- package/src/shared/caller-identity.ts +161 -0
- package/src/shared/channel-attachment.ts +237 -0
- package/src/shared/datastore-attachment.ts +2 -54
- package/src/shared/synthesized-attachment.ts +77 -0
- package/src/workflow-engine/__tests__/golden-execution.test.ts +8 -8
- package/src/workflow-engine/__tests__/loader.test.ts +192 -7
- package/src/workflow-engine/__tests__/tasks/call-agent.test.ts +9 -9
- package/src/workflow-engine/loader.ts +113 -2
- package/src/workflow-engine/tasks/call-agent.ts +0 -2
- package/src/workflow-engine/types.ts +40 -7
- package/src/workflows/call-agent-orchestrator.ts +8 -2
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-tier → Cursor variant-parameter translation (stigmer/stigmer#357).
|
|
3
|
+
*
|
|
4
|
+
* The platform contract: an execution's model selection is ALWAYS explicit.
|
|
5
|
+
* A bare `{ id }` lets the Cursor catalog's default variant decide the price
|
|
6
|
+
* (observed 2026-08-06: composer-2.5 defaults to fast=true at ~4x base
|
|
7
|
+
* rates, claude-haiku-4-5 to thinking=true), and that default follows an
|
|
8
|
+
* out-of-band account setting. This module pins every price-bearing variant
|
|
9
|
+
* parameter the model declares, so the billed variant is a deterministic
|
|
10
|
+
* function of ExecutionConfig.service_tier:
|
|
11
|
+
*
|
|
12
|
+
* - STANDARD: every price-bearing boolean pinned to its base value
|
|
13
|
+
* (fast=false, thinking=false where the parameter exists).
|
|
14
|
+
* - FAST: fast=true, thinking still pinned false.
|
|
15
|
+
* - Price-neutral parameters (e.g. effort) are deliberately NOT pinned —
|
|
16
|
+
* they follow the catalog default and do not change the bill.
|
|
17
|
+
*
|
|
18
|
+
* Parameter bundles come from Cursor.models.list() (worker-cached): the
|
|
19
|
+
* catalog is the only source of a model's parameter ids, and the fetch
|
|
20
|
+
* rides the same proxy fetch-interceptor as every other SDK call, so it
|
|
21
|
+
* works identically in proxy and direct modes.
|
|
22
|
+
*
|
|
23
|
+
* UNSPECIFIED resolves to STANDARD here and ONLY here — every upstream
|
|
24
|
+
* layer preserves the caller's raw enum so "user chose standard" stays
|
|
25
|
+
* distinguishable from "platform default" all the way to the ledger.
|
|
26
|
+
*/
|
|
27
|
+
import { Cursor } from "@cursor/sdk";
|
|
28
|
+
import { ServiceTier } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
29
|
+
/**
|
|
30
|
+
* Catalog ids that mean "Cursor picks the model" (Auto). Auto's single
|
|
31
|
+
* catalog variant has an empty parameter set — there is no tier dimension
|
|
32
|
+
* to pin, a documented v1 limitation. Create-time validation refuses FAST
|
|
33
|
+
* without a pinned model, so FAST can only reach Auto through registry
|
|
34
|
+
* drift — handled as a loud failure below.
|
|
35
|
+
*/
|
|
36
|
+
const AUTO_MODEL_IDS = new Set(["default", "auto"]);
|
|
37
|
+
/**
|
|
38
|
+
* Variant parameter ids that change the per-token price. Pinning exactly
|
|
39
|
+
* these keeps the bill deterministic while leaving latency/effort knobs on
|
|
40
|
+
* their catalog defaults. Sourced from the Cursor catalog survey
|
|
41
|
+
* (stigmer-cloud _projects/2026-08/20260806.04.model-service-tier).
|
|
42
|
+
*/
|
|
43
|
+
const FAST_PARAM_ID = "fast";
|
|
44
|
+
const THINKING_PARAM_ID = "thinking";
|
|
45
|
+
const CATALOG_CACHE_TTL_MS = 3_600_000; // 1 hour, matching the pricing table TTL
|
|
46
|
+
let catalogCache = null;
|
|
47
|
+
// Keyed by apiKey: a worker normally serves one org's key, but nothing
|
|
48
|
+
// enforces that — handing execution A a catalog fetched under execution B's
|
|
49
|
+
// key would leak another account's model availability into A's translation.
|
|
50
|
+
let inflightCatalogFetch = null;
|
|
51
|
+
/** Test-only: drop the worker-level catalog cache. */
|
|
52
|
+
export function resetCatalogCacheForTests() {
|
|
53
|
+
catalogCache = null;
|
|
54
|
+
inflightCatalogFetch = null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the configured tier to its effective value. The single place in
|
|
58
|
+
* the platform where UNSPECIFIED becomes STANDARD.
|
|
59
|
+
*/
|
|
60
|
+
export function resolveEffectiveServiceTier(configured) {
|
|
61
|
+
return configured === ServiceTier.FAST ? ServiceTier.FAST : ServiceTier.STANDARD;
|
|
62
|
+
}
|
|
63
|
+
/** Human-readable tier label for logs and error messages. */
|
|
64
|
+
export function serviceTierLabel(tier) {
|
|
65
|
+
switch (tier) {
|
|
66
|
+
case ServiceTier.FAST:
|
|
67
|
+
return "fast";
|
|
68
|
+
case ServiceTier.STANDARD:
|
|
69
|
+
return "standard";
|
|
70
|
+
default:
|
|
71
|
+
return "unspecified";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async function listCatalogModels(apiKey) {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
if (catalogCache && catalogCache.apiKey === apiKey && catalogCache.expiresAt > now) {
|
|
77
|
+
return catalogCache.models;
|
|
78
|
+
}
|
|
79
|
+
if (inflightCatalogFetch?.apiKey === apiKey)
|
|
80
|
+
return inflightCatalogFetch.promise;
|
|
81
|
+
let entry = null;
|
|
82
|
+
const promise = (async () => {
|
|
83
|
+
try {
|
|
84
|
+
const models = await Cursor.models.list({ apiKey });
|
|
85
|
+
catalogCache = { apiKey, models, expiresAt: Date.now() + CATALOG_CACHE_TTL_MS };
|
|
86
|
+
return models;
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
// Clear only our own entry — a concurrent fetch under another key may
|
|
90
|
+
// have replaced it.
|
|
91
|
+
if (inflightCatalogFetch === entry) {
|
|
92
|
+
inflightCatalogFetch = null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
96
|
+
entry = { apiKey, promise };
|
|
97
|
+
inflightCatalogFetch = entry;
|
|
98
|
+
return promise;
|
|
99
|
+
}
|
|
100
|
+
function findCatalogModel(models, modelId) {
|
|
101
|
+
return models.find((m) => m.id === modelId || m.aliases?.includes(modelId));
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Translate the effective tier into the explicit variant parameters to send
|
|
105
|
+
* with every Agent.create/resume for this execution.
|
|
106
|
+
*
|
|
107
|
+
* Fail-closed posture: FAST with no pinnable fast dimension is an error,
|
|
108
|
+
* never a silent downgrade — create-time validation makes this unreachable
|
|
109
|
+
* unless the registry and the provider catalog have drifted, and that drift
|
|
110
|
+
* must be heard about, not absorbed.
|
|
111
|
+
*
|
|
112
|
+
* STANDARD degrades to empty params on catalog failures rather than failing
|
|
113
|
+
* the execution — but be clear about what that costs: an unpinned selection
|
|
114
|
+
* falls to the catalog default variant, which for several models IS the
|
|
115
|
+
* fast/thinking variant at multiples of base rates (the incident this module
|
|
116
|
+
* exists to prevent). Failing every standard execution whenever the catalog
|
|
117
|
+
* endpoint blips would be the worse trade; the WARN below plus billing's
|
|
118
|
+
* requested-vs-billed mismatch alarm (which catches exactly this window)
|
|
119
|
+
* are the compensating controls.
|
|
120
|
+
*/
|
|
121
|
+
export async function resolveServiceTierParams(options) {
|
|
122
|
+
const { apiKey, modelId, tier, executionId } = options;
|
|
123
|
+
const tierName = serviceTierLabel(tier);
|
|
124
|
+
if (AUTO_MODEL_IDS.has(modelId)) {
|
|
125
|
+
if (tier === ServiceTier.FAST) {
|
|
126
|
+
throw new Error(`service_tier=fast requires a pinned model — Auto ("${modelId}") has no ` +
|
|
127
|
+
`tier dimension. Execution ${executionId} should have been refused at ` +
|
|
128
|
+
`create time; the model registry and provider catalog may have drifted.`);
|
|
129
|
+
}
|
|
130
|
+
console.log(`ServiceTier: execution=${executionId} model=${modelId} tier=${tierName} — ` +
|
|
131
|
+
`Auto has no variant parameters; Cursor picks the model and variant ` +
|
|
132
|
+
`(documented v1 limitation).`);
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
let models;
|
|
136
|
+
try {
|
|
137
|
+
models = await listCatalogModels(apiKey);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
if (tier === ServiceTier.FAST) {
|
|
141
|
+
throw new Error(`service_tier=fast for execution ${executionId} needs the Cursor model ` +
|
|
142
|
+
`catalog to resolve variant params for "${modelId}", and the catalog ` +
|
|
143
|
+
`fetch failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
144
|
+
}
|
|
145
|
+
console.warn(`ServiceTier UNPINNED: execution=${executionId} model=${modelId} tier=${tierName} — ` +
|
|
146
|
+
`catalog fetch failed (${err instanceof Error ? err.message : err}); ` +
|
|
147
|
+
`sending no variant params, so the catalog DEFAULT variant decides the ` +
|
|
148
|
+
`price for this execution (fast/thinking on several models — the ` +
|
|
149
|
+
`expensive direction). Billing's requested-vs-billed mismatch alarm ` +
|
|
150
|
+
`covers this window.`);
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
const model = findCatalogModel(models, modelId);
|
|
154
|
+
if (!model) {
|
|
155
|
+
if (tier === ServiceTier.FAST) {
|
|
156
|
+
throw new Error(`service_tier=fast requested for "${modelId}" (execution ${executionId}) ` +
|
|
157
|
+
`but the Cursor catalog does not list that model — cannot pin a fast ` +
|
|
158
|
+
`variant. The model registry and provider catalog have drifted.`);
|
|
159
|
+
}
|
|
160
|
+
console.warn(`ServiceTier UNPINNED: execution=${executionId} model=${modelId} tier=${tierName} — ` +
|
|
161
|
+
`model not in the Cursor catalog; sending no variant params, so the ` +
|
|
162
|
+
`catalog DEFAULT variant decides the price for this execution.`);
|
|
163
|
+
return [];
|
|
164
|
+
}
|
|
165
|
+
const params = [];
|
|
166
|
+
for (const def of model.parameters ?? []) {
|
|
167
|
+
if (def.id === FAST_PARAM_ID) {
|
|
168
|
+
params.push({ id: FAST_PARAM_ID, value: tier === ServiceTier.FAST ? "true" : "false" });
|
|
169
|
+
}
|
|
170
|
+
else if (def.id === THINKING_PARAM_ID) {
|
|
171
|
+
params.push({ id: THINKING_PARAM_ID, value: "false" });
|
|
172
|
+
}
|
|
173
|
+
// Any other parameter (e.g. effort) is price-neutral: left to the
|
|
174
|
+
// catalog default variant on purpose.
|
|
175
|
+
}
|
|
176
|
+
if (tier === ServiceTier.FAST && !params.some((p) => p.id === FAST_PARAM_ID)) {
|
|
177
|
+
throw new Error(`service_tier=fast requested for "${modelId}" (execution ${executionId}) ` +
|
|
178
|
+
`but the Cursor catalog declares no "fast" parameter for it. The model ` +
|
|
179
|
+
`registry prices a fast variant the provider no longer offers — refusing ` +
|
|
180
|
+
`rather than silently billing an unknown variant.`);
|
|
181
|
+
}
|
|
182
|
+
params.sort((a, b) => a.id.localeCompare(b.id));
|
|
183
|
+
console.log(`ServiceTier: execution=${executionId} model=${modelId} tier=${tierName} ` +
|
|
184
|
+
`params=${JSON.stringify(params)}`);
|
|
185
|
+
return params;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=service-tier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-tier.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/service-tier.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,11 +35,20 @@
|
|
|
35
35
|
* the user message plus re-injected instructions — there is no separate
|
|
36
36
|
* continuation store.
|
|
37
37
|
*/
|
|
38
|
-
import type { SDKAgent, CursorAgentPlatformOptions, AgentDefinition } from "@cursor/sdk";
|
|
38
|
+
import type { SDKAgent, CursorAgentPlatformOptions, AgentDefinition, ModelParameterValue } from "@cursor/sdk";
|
|
39
39
|
import type { CursorMcpServerConfig } from "./mcp-resolver.js";
|
|
40
40
|
export interface CreateAgentOptions {
|
|
41
41
|
apiKey: string;
|
|
42
42
|
model: string;
|
|
43
|
+
/**
|
|
44
|
+
* Explicit variant parameters sent with the model selection on every
|
|
45
|
+
* create AND resume (stigmer/stigmer#357). A bare `{ id }` lets the
|
|
46
|
+
* Cursor catalog's default variant pick the price, so the caller always
|
|
47
|
+
* supplies the pinned params from resolveServiceTierParams — possibly
|
|
48
|
+
* empty (Auto, or a model with no price-bearing parameters), but never
|
|
49
|
+
* absent by accident.
|
|
50
|
+
*/
|
|
51
|
+
modelParams?: ModelParameterValue[];
|
|
43
52
|
workspaceDirs: string[];
|
|
44
53
|
sessionId: string;
|
|
45
54
|
/** Durable workspace volume root; the SDK state store lives under it. */
|
|
@@ -68,6 +77,8 @@ export interface ResumeAgentOptions {
|
|
|
68
77
|
/** Durable workspace volume root; the SDK state store lives under it. */
|
|
69
78
|
workspaceRootDir: string;
|
|
70
79
|
model?: string;
|
|
80
|
+
/** Explicit variant parameters — see {@link CreateAgentOptions.modelParams}. */
|
|
81
|
+
modelParams?: ModelParameterValue[];
|
|
71
82
|
mcpServers?: Record<string, CursorMcpServerConfig>;
|
|
72
83
|
/** Custom sub-agents — see {@link CreateAgentOptions.agents}. */
|
|
73
84
|
agents?: Record<string, AgentDefinition>;
|
|
@@ -79,6 +90,8 @@ export interface CloudRepo {
|
|
|
79
90
|
export interface CreateCloudAgentOptions {
|
|
80
91
|
apiKey: string;
|
|
81
92
|
model?: string;
|
|
93
|
+
/** Explicit variant parameters — see {@link CreateAgentOptions.modelParams}. */
|
|
94
|
+
modelParams?: ModelParameterValue[];
|
|
82
95
|
repos: CloudRepo[];
|
|
83
96
|
sessionId: string;
|
|
84
97
|
mcpServers?: Record<string, CursorMcpServerConfig>;
|
|
@@ -89,6 +102,8 @@ export interface ResumeCloudAgentOptions {
|
|
|
89
102
|
apiKey: string;
|
|
90
103
|
agentId: string;
|
|
91
104
|
model?: string;
|
|
105
|
+
/** Explicit variant parameters — see {@link CreateAgentOptions.modelParams}. */
|
|
106
|
+
modelParams?: ModelParameterValue[];
|
|
92
107
|
mcpServers?: Record<string, CursorMcpServerConfig>;
|
|
93
108
|
/** Custom sub-agents — see {@link CreateAgentOptions.agents}. */
|
|
94
109
|
agents?: Record<string, AgentDefinition>;
|
|
@@ -122,7 +122,9 @@ export async function createAgent(options) {
|
|
|
122
122
|
`stateRoot=${platform.stateRoot}, process.cwd=${process.cwd()}`);
|
|
123
123
|
return Agent.create({
|
|
124
124
|
apiKey: options.apiKey,
|
|
125
|
-
|
|
125
|
+
// Always a full selection — id AND params. A bare { id } would let the
|
|
126
|
+
// catalog's default variant (account-influenced) pick the price (#357).
|
|
127
|
+
model: { id: options.model, params: options.modelParams },
|
|
126
128
|
local: { cwd, settingSources: [...LOCAL_SETTING_SOURCES] },
|
|
127
129
|
mcpServers: options.mcpServers,
|
|
128
130
|
agents: options.agents,
|
|
@@ -145,7 +147,11 @@ export async function resumeAgent(options) {
|
|
|
145
147
|
`process.cwd=${process.cwd()}`);
|
|
146
148
|
return Agent.resume(options.agentId, {
|
|
147
149
|
apiKey: options.apiKey,
|
|
148
|
-
|
|
150
|
+
// Variant params must be re-supplied on resume exactly like mcpServers:
|
|
151
|
+
// explicit params hold across resume (verified against the billing
|
|
152
|
+
// ledger, #357), but an id-only resume would fall back to the catalog
|
|
153
|
+
// default variant for the new turns.
|
|
154
|
+
model: options.model ? { id: options.model, params: options.modelParams } : undefined,
|
|
149
155
|
// Neither cwd nor settingSources survive Agent.resume(); both must be
|
|
150
156
|
// re-supplied every turn. Omitting cwd makes the SDK fall back to
|
|
151
157
|
// process.cwd(), which re-roots the agent in the runner's own working
|
|
@@ -174,7 +180,7 @@ export async function createCloudAgent(options) {
|
|
|
174
180
|
`repos=${options.repos.map((r) => r.url).join(", ")}`);
|
|
175
181
|
return Agent.create({
|
|
176
182
|
apiKey: options.apiKey,
|
|
177
|
-
model: options.model ? { id: options.model } : undefined,
|
|
183
|
+
model: options.model ? { id: options.model, params: options.modelParams } : undefined,
|
|
178
184
|
cloud: { repos: options.repos },
|
|
179
185
|
mcpServers: options.mcpServers,
|
|
180
186
|
agents: options.agents,
|
|
@@ -191,7 +197,7 @@ export async function resumeCloudAgent(options) {
|
|
|
191
197
|
console.log(`resumeCloudAgent: agentId=${options.agentId}`);
|
|
192
198
|
return Agent.resume(options.agentId, {
|
|
193
199
|
apiKey: options.apiKey,
|
|
194
|
-
model: options.model ? { id: options.model } : undefined,
|
|
200
|
+
model: options.model ? { id: options.model, params: options.modelParams } : undefined,
|
|
195
201
|
mcpServers: options.mcpServers,
|
|
196
202
|
agents: options.agents,
|
|
197
203
|
});
|
|
@@ -229,6 +235,7 @@ export async function resolveAgent(harnessStateId, options, mode = "local") {
|
|
|
229
235
|
apiKey: options.apiKey,
|
|
230
236
|
agentId: harnessStateId,
|
|
231
237
|
model: options.model,
|
|
238
|
+
modelParams: options.modelParams,
|
|
232
239
|
mcpServers: options.mcpServers,
|
|
233
240
|
agents: options.agents,
|
|
234
241
|
})
|
|
@@ -239,6 +246,7 @@ export async function resolveAgent(harnessStateId, options, mode = "local") {
|
|
|
239
246
|
workspaceDirs: options.workspaceDirs,
|
|
240
247
|
workspaceRootDir: options.workspaceRootDir,
|
|
241
248
|
model: options.model,
|
|
249
|
+
modelParams: options.modelParams,
|
|
242
250
|
mcpServers: options.mcpServers,
|
|
243
251
|
agents: options.agents,
|
|
244
252
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/session-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/session-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* BiDi proxy (CursorBidiStreamHandler) which will record usage from the
|
|
13
13
|
* wire via ProxyUsageReporter once traffic routing (Task 5B) is complete.
|
|
14
14
|
*/
|
|
15
|
+
import type { ModelParameterValue } from "@cursor/sdk";
|
|
16
|
+
import { ServiceTier } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
15
17
|
export interface TurnUsage {
|
|
16
18
|
readonly inputTokens?: number;
|
|
17
19
|
readonly outputTokens?: number;
|
|
@@ -28,6 +30,10 @@ export interface UsageSnapshot {
|
|
|
28
30
|
readonly estimatedCostUsd: number;
|
|
29
31
|
readonly model: string;
|
|
30
32
|
readonly observedAt: string;
|
|
33
|
+
/** Tier the runner requested — always explicit post-translation (#357). */
|
|
34
|
+
readonly requestedServiceTier: ServiceTier;
|
|
35
|
+
/** JSON-encoded ModelSelection.params the runner sent; "" when none. */
|
|
36
|
+
readonly requestedModelParams: string;
|
|
31
37
|
}
|
|
32
38
|
export interface TurnRecord {
|
|
33
39
|
readonly sequence: number;
|
|
@@ -38,6 +44,12 @@ export interface TurnRecord {
|
|
|
38
44
|
}
|
|
39
45
|
export declare class UsageAccumulator {
|
|
40
46
|
private readonly model;
|
|
47
|
+
/**
|
|
48
|
+
* The explicit tier the runner requested from the provider. Recorded
|
|
49
|
+
* verbatim into status as the audit trail that the account default was
|
|
50
|
+
* never left in control (#357).
|
|
51
|
+
*/
|
|
52
|
+
private readonly requestedServiceTier;
|
|
41
53
|
private inputTokens;
|
|
42
54
|
private outputTokens;
|
|
43
55
|
private cacheReadTokens;
|
|
@@ -46,7 +58,15 @@ export declare class UsageAccumulator {
|
|
|
46
58
|
private estimatedCostUsd;
|
|
47
59
|
private observedAt;
|
|
48
60
|
private readonly turnRecords;
|
|
49
|
-
|
|
61
|
+
/** JSON-encoded params the runner sent with the model selection (#357). */
|
|
62
|
+
private readonly requestedModelParams;
|
|
63
|
+
constructor(model: string,
|
|
64
|
+
/**
|
|
65
|
+
* The explicit tier the runner requested from the provider. Recorded
|
|
66
|
+
* verbatim into status as the audit trail that the account default was
|
|
67
|
+
* never left in control (#357).
|
|
68
|
+
*/
|
|
69
|
+
requestedServiceTier?: ServiceTier, requestedModelParams?: readonly ModelParameterValue[]);
|
|
50
70
|
addTurn(usage: TurnUsage): void;
|
|
51
71
|
get hasTurns(): boolean;
|
|
52
72
|
get modelName(): string;
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
* BiDi proxy (CursorBidiStreamHandler) which will record usage from the
|
|
13
13
|
* wire via ProxyUsageReporter once traffic routing (Task 5B) is complete.
|
|
14
14
|
*/
|
|
15
|
-
import {
|
|
15
|
+
import { ServiceTier } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
16
|
+
import { getCursorModelPricingForVariant, computeTurnCost } from "./model-pricing.js";
|
|
16
17
|
const EMPTY_SNAPSHOT = {
|
|
17
18
|
inputTokens: 0n,
|
|
18
19
|
outputTokens: 0n,
|
|
@@ -23,9 +24,12 @@ const EMPTY_SNAPSHOT = {
|
|
|
23
24
|
estimatedCostUsd: 0,
|
|
24
25
|
model: "",
|
|
25
26
|
observedAt: "",
|
|
27
|
+
requestedServiceTier: ServiceTier.UNSPECIFIED,
|
|
28
|
+
requestedModelParams: "",
|
|
26
29
|
};
|
|
27
30
|
export class UsageAccumulator {
|
|
28
31
|
model;
|
|
32
|
+
requestedServiceTier;
|
|
29
33
|
inputTokens = 0;
|
|
30
34
|
outputTokens = 0;
|
|
31
35
|
cacheReadTokens = 0;
|
|
@@ -34,8 +38,19 @@ export class UsageAccumulator {
|
|
|
34
38
|
estimatedCostUsd = 0;
|
|
35
39
|
observedAt = "";
|
|
36
40
|
turnRecords = [];
|
|
37
|
-
|
|
41
|
+
/** JSON-encoded params the runner sent with the model selection (#357). */
|
|
42
|
+
requestedModelParams;
|
|
43
|
+
constructor(model,
|
|
44
|
+
/**
|
|
45
|
+
* The explicit tier the runner requested from the provider. Recorded
|
|
46
|
+
* verbatim into status as the audit trail that the account default was
|
|
47
|
+
* never left in control (#357).
|
|
48
|
+
*/
|
|
49
|
+
requestedServiceTier = ServiceTier.UNSPECIFIED, requestedModelParams = []) {
|
|
38
50
|
this.model = model;
|
|
51
|
+
this.requestedServiceTier = requestedServiceTier;
|
|
52
|
+
this.requestedModelParams =
|
|
53
|
+
requestedModelParams.length > 0 ? JSON.stringify(requestedModelParams) : "";
|
|
39
54
|
}
|
|
40
55
|
addTurn(usage) {
|
|
41
56
|
const input = usage.inputTokens ?? 0;
|
|
@@ -55,7 +70,10 @@ export class UsageAccumulator {
|
|
|
55
70
|
cacheReadTokens: cacheRead,
|
|
56
71
|
cacheWriteTokens: cacheWrite,
|
|
57
72
|
});
|
|
58
|
-
|
|
73
|
+
// Estimate at the rates of the variant we explicitly requested — a
|
|
74
|
+
// FAST run priced at base rates would understate the display estimate
|
|
75
|
+
// ~4x relative to the authoritative bill (#357).
|
|
76
|
+
const pricing = getCursorModelPricingForVariant(this.model, this.requestedServiceTier === ServiceTier.FAST ? "fast" : null);
|
|
59
77
|
this.estimatedCostUsd += computeTurnCost(pricing, input, output, cacheWrite, cacheRead);
|
|
60
78
|
}
|
|
61
79
|
get hasTurns() {
|
|
@@ -85,6 +103,8 @@ export class UsageAccumulator {
|
|
|
85
103
|
estimatedCostUsd: this.estimatedCostUsd,
|
|
86
104
|
model: this.model,
|
|
87
105
|
observedAt: this.observedAt,
|
|
106
|
+
requestedServiceTier: this.requestedServiceTier,
|
|
107
|
+
requestedModelParams: this.requestedModelParams,
|
|
88
108
|
};
|
|
89
109
|
}
|
|
90
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage-accumulator.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/usage-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"usage-accumulator.js","sourceRoot":"","sources":["../../../src/activities/execute-cursor/usage-accumulator.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,12 @@ export interface PromptBuilderInput {
|
|
|
18
18
|
* formatDatastoresSection); empty when the agent uses no datastores.
|
|
19
19
|
*/
|
|
20
20
|
datastoresPromptSection?: string;
|
|
21
|
+
/**
|
|
22
|
+
* The `<available_channel_templates>` section
|
|
23
|
+
* (shared/channel-attachment.ts formatChannelTemplatesSection); absent
|
|
24
|
+
* when the agent serves no proactive channel or nothing is sendable.
|
|
25
|
+
*/
|
|
26
|
+
channelTemplatesPromptSection?: string;
|
|
21
27
|
workspaceFileRefs: string[];
|
|
22
28
|
workspaceRoot: string;
|
|
23
29
|
injectedFiles: InjectedFile[];
|
|
@@ -93,6 +93,9 @@ export function buildEnhancedSystemPrompt(input) {
|
|
|
93
93
|
if (input.datastoresPromptSection) {
|
|
94
94
|
prompt += "\n\n" + input.datastoresPromptSection;
|
|
95
95
|
}
|
|
96
|
+
if (input.channelTemplatesPromptSection) {
|
|
97
|
+
prompt += "\n\n" + input.channelTemplatesPromptSection;
|
|
98
|
+
}
|
|
96
99
|
if (input.workspaceFileRefs.length > 0) {
|
|
97
100
|
const refSection = buildReferencedFilesSection(input.workspaceFileRefs, input.workspaceRoot);
|
|
98
101
|
if (refSection) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/prompt-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,8DAA8D,CAAC;AAE/F,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EACL,wBAAwB,GAEzB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAE/C,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;CAmBtB,CAAC;AAEF,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CvB,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../../src/activities/execute-deep-agent/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,12 +13,15 @@ import { TimingRecorder, emitTimingLog } from "../../shared/cold-start-timing.js
|
|
|
13
13
|
import { createCheckpointer } from "../../shared/checkpointer/factory.js";
|
|
14
14
|
import { readContextBridge } from "../../shared/context-bridge.js";
|
|
15
15
|
import { readSenderIdentity } from "../../shared/sender-identity.js";
|
|
16
|
+
import { injectCallerIdentityEnv, resolveCallerIdentity, } from "../../shared/caller-identity.js";
|
|
16
17
|
import { readSessionContext } from "../../shared/session-context.js";
|
|
17
18
|
import { connectMcpServers } from "../../shared/mcp-manager.js";
|
|
18
19
|
import { resolveMcpServers } from "../../shared/mcp-resolver.js";
|
|
19
20
|
import { resolveMcpTransportPosture } from "../../shared/mcp-transport-guard.js";
|
|
20
21
|
import { backfillMcpServersIfNeeded } from "../../shared/connect-backfill.js";
|
|
21
|
-
import { formatDatastoresSection,
|
|
22
|
+
import { formatDatastoresSection, synthesizeDatastoreAttachment, } from "../../shared/datastore-attachment.js";
|
|
23
|
+
import { discoverChannelMessaging, formatChannelTemplatesSection, synthesizeChannelAttachment, } from "../../shared/channel-attachment.js";
|
|
24
|
+
import { injectSynthesizedAttachment } from "../../shared/synthesized-attachment.js";
|
|
22
25
|
import { WorkspaceProvisioner } from "../../shared/workspace/provisioner.js";
|
|
23
26
|
import { LocalWorkspaceBackend } from "../../shared/workspace/local-backend.js";
|
|
24
27
|
import { createCasCaptureBackend } from "./cas-capture-backend.js";
|
|
@@ -160,29 +163,57 @@ export async function performSetup(deps) {
|
|
|
160
163
|
...(session.spec.mcpServerUsages || []),
|
|
161
164
|
];
|
|
162
165
|
const datastoreUsages = agent.spec.datastoreUsages || [];
|
|
166
|
+
// The synthesized attachments' credential story (DD-006 D4): the
|
|
167
|
+
// exchanged token authenticates the discovery reads per-call (the
|
|
168
|
+
// messaging reach refuses a desktop runner's ambient embedded_runner
|
|
169
|
+
// credential; undefined lets the ambient credential apply). The
|
|
170
|
+
// attachment header falls back to the ambient credential.
|
|
171
|
+
const exchangedRunnerToken = await client.acquireScopedRunnerToken({ agentExecutionId: executionId });
|
|
172
|
+
const attachmentCredential = exchangedRunnerToken
|
|
173
|
+
?? config.stigmerTokenRef?.current
|
|
174
|
+
?? config.stigmerToken;
|
|
175
|
+
// The channel discovery read runs BEFORE the MCP gate below: an
|
|
176
|
+
// agent whose ONLY tool source is a proactive channel would
|
|
177
|
+
// otherwise never enter MCP resolution and never connect the
|
|
178
|
+
// attachment (DD-006 D7). Every failure mode degrades to an empty
|
|
179
|
+
// answer — no tool, no section, execution unharmed.
|
|
180
|
+
const channelMessaging = await discoverChannelMessaging(client, exchangedRunnerToken);
|
|
163
181
|
let resolvedMcpServers = null;
|
|
164
|
-
if (mcpServerUsages.length > 0 || datastoreUsages.length > 0) {
|
|
182
|
+
if (mcpServerUsages.length > 0 || datastoreUsages.length > 0 || channelMessaging.length > 0) {
|
|
165
183
|
await reportSetupProgress(client, executionId, "Connecting tools…");
|
|
166
184
|
const transportPosture = resolveMcpTransportPosture(config.mode);
|
|
167
|
-
|
|
185
|
+
// The MCP-bound env map (and ONLY it) carries the reserved
|
|
186
|
+
// caller-identity keys — mirror of the Cursor harness's Phase 4
|
|
187
|
+
// injection; filterEnvToDeclaredKeys keeps undeclared servers blind.
|
|
188
|
+
const mcpEnvVars = injectCallerIdentityEnv(envResult.mergedEnvVars, resolveCallerIdentity(session.spec.metadata, session.status?.audit?.specAudit?.createdBy), sessionId);
|
|
189
|
+
resolvedMcpServers = await resolveMcpServers(client, mcpServerUsages, mcpEnvVars, transportPosture);
|
|
168
190
|
timing.mark("resolve_mcp_servers");
|
|
169
191
|
const sessionOrg = session.metadata?.org ?? "";
|
|
170
|
-
let backfilledServers = await backfillMcpServersIfNeeded(client, resolvedMcpServers.resolvedServers, mcpServerUsages,
|
|
192
|
+
let backfilledServers = await backfillMcpServersIfNeeded(client, resolvedMcpServers.resolvedServers, mcpServerUsages, mcpEnvVars, sessionOrg, transportPosture, undefined, envResult.secretKeys);
|
|
171
193
|
// The datastore records attachment (T05) — injected AFTER resolve +
|
|
172
194
|
// backfill so the destructiveHint tightener can never gate it; empty
|
|
173
195
|
// approval maps keep it approval-free by construction (see
|
|
174
196
|
// shared/datastore-attachment.ts).
|
|
175
197
|
if (datastoreUsages.length > 0) {
|
|
176
|
-
const scopedCredential = (await client.acquireScopedRunnerToken({ agentExecutionId: executionId }))
|
|
177
|
-
?? config.stigmerTokenRef?.current
|
|
178
|
-
?? config.stigmerToken;
|
|
179
198
|
const attachment = synthesizeDatastoreAttachment(datastoreUsages, {
|
|
180
199
|
bridgeEndpoint: config.mcpBridgeEndpoint,
|
|
181
|
-
credential:
|
|
200
|
+
credential: attachmentCredential,
|
|
182
201
|
backendEndpoint: config.stigmerBackendEndpoint,
|
|
183
202
|
});
|
|
184
203
|
if (attachment) {
|
|
185
|
-
backfilledServers =
|
|
204
|
+
backfilledServers = injectSynthesizedAttachment(backfilledServers, attachment, "datastore records");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// The channel messaging attachment (DD-006 D7/D8) — the records
|
|
208
|
+
// attachment's twin, injected under the same after-backfill rule.
|
|
209
|
+
if (channelMessaging.length > 0) {
|
|
210
|
+
const attachment = synthesizeChannelAttachment(channelMessaging, {
|
|
211
|
+
bridgeEndpoint: config.mcpBridgeEndpoint,
|
|
212
|
+
credential: attachmentCredential,
|
|
213
|
+
backendEndpoint: config.stigmerBackendEndpoint,
|
|
214
|
+
});
|
|
215
|
+
if (attachment) {
|
|
216
|
+
backfilledServers = injectSynthesizedAttachment(backfilledServers, attachment, "channel messaging");
|
|
186
217
|
}
|
|
187
218
|
}
|
|
188
219
|
resolvedMcpServers = { resolvedServers: backfilledServers };
|
|
@@ -243,6 +274,11 @@ export async function performSetup(deps) {
|
|
|
243
274
|
datastoresPromptSection: datastoreUsages.length > 0
|
|
244
275
|
? formatDatastoresSection(datastoreUsages)
|
|
245
276
|
: undefined,
|
|
277
|
+
// "" (nothing sendable) threads as undefined: the tool alone still
|
|
278
|
+
// serves text sends inside a 24-hour window (DD-006 D6).
|
|
279
|
+
channelTemplatesPromptSection: channelMessaging.length > 0
|
|
280
|
+
? formatChannelTemplatesSection(channelMessaging) || undefined
|
|
281
|
+
: undefined,
|
|
246
282
|
workspaceFileRefs: execution.spec.workspaceFileRefs || [],
|
|
247
283
|
workspaceRoot: workspaceBackend.rootDir,
|
|
248
284
|
injectedFiles,
|