pilotswarm-sdk 0.3.1 → 0.3.2
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/cms-migrations.d.ts.map +1 -1
- package/dist/cms-migrations.js +840 -1
- package/dist/cms-migrations.js.map +1 -1
- package/dist/cms.d.ts +31 -1
- package/dist/cms.d.ts.map +1 -1
- package/dist/cms.js +46 -1
- package/dist/cms.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/inspect-tools.d.ts.map +1 -1
- package/dist/inspect-tools.js +27 -0
- package/dist/inspect-tools.js.map +1 -1
- package/dist/managed-session.d.ts +1 -0
- package/dist/managed-session.d.ts.map +1 -1
- package/dist/managed-session.js +243 -21
- package/dist/managed-session.js.map +1 -1
- package/dist/management-client.d.ts +14 -1
- package/dist/management-client.d.ts.map +1 -1
- package/dist/management-client.js +49 -1
- package/dist/management-client.js.map +1 -1
- package/dist/orchestration/index.d.ts +2 -2
- package/dist/orchestration/index.js +1 -1
- package/dist/orchestration/lifecycle.d.ts.map +1 -1
- package/dist/orchestration/lifecycle.js +74 -4
- package/dist/orchestration/lifecycle.js.map +1 -1
- package/dist/orchestration/runtime.d.ts +1 -1
- package/dist/orchestration/state.d.ts +1 -0
- package/dist/orchestration/state.d.ts.map +1 -1
- package/dist/orchestration/state.js +1 -0
- package/dist/orchestration/state.js.map +1 -1
- package/dist/orchestration/turn.d.ts +11 -0
- package/dist/orchestration/turn.d.ts.map +1 -1
- package/dist/orchestration/turn.js +61 -4
- package/dist/orchestration/turn.js.map +1 -1
- package/dist/orchestration-registry.d.ts.map +1 -1
- package/dist/orchestration-registry.js +4 -2
- package/dist/orchestration-registry.js.map +1 -1
- package/dist/orchestration-version.d.ts +1 -1
- package/dist/orchestration-version.js +1 -1
- package/dist/orchestration.d.ts +2 -2
- package/dist/orchestration.js +1 -1
- package/dist/orchestration_1_0_46.d.ts +1 -1
- package/dist/orchestration_1_0_47.d.ts +1 -1
- package/dist/orchestration_1_0_48.d.ts +1 -1
- package/dist/orchestration_1_0_49.d.ts +1 -1
- package/dist/orchestration_1_0_50.d.ts +1 -1
- package/dist/orchestration_1_0_54/agents.d.ts +41 -0
- package/dist/orchestration_1_0_54/agents.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/agents.js +758 -0
- package/dist/orchestration_1_0_54/agents.js.map +1 -0
- package/dist/orchestration_1_0_54/index.d.ts +24 -0
- package/dist/orchestration_1_0_54/index.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/index.js +13 -0
- package/dist/orchestration_1_0_54/index.js.map +1 -0
- package/dist/orchestration_1_0_54/lifecycle.d.ts +41 -0
- package/dist/orchestration_1_0_54/lifecycle.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/lifecycle.js +510 -0
- package/dist/orchestration_1_0_54/lifecycle.js.map +1 -0
- package/dist/orchestration_1_0_54/queue.d.ts +7 -0
- package/dist/orchestration_1_0_54/queue.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/queue.js +644 -0
- package/dist/orchestration_1_0_54/queue.js.map +1 -0
- package/dist/orchestration_1_0_54/runtime.d.ts +29 -0
- package/dist/orchestration_1_0_54/runtime.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/runtime.js +194 -0
- package/dist/orchestration_1_0_54/runtime.js.map +1 -0
- package/dist/orchestration_1_0_54/state.d.ts +125 -0
- package/dist/orchestration_1_0_54/state.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/state.js +105 -0
- package/dist/orchestration_1_0_54/state.js.map +1 -0
- package/dist/orchestration_1_0_54/turn.d.ts +6 -0
- package/dist/orchestration_1_0_54/turn.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/turn.js +864 -0
- package/dist/orchestration_1_0_54/turn.js.map +1 -0
- package/dist/orchestration_1_0_54/utils.d.ts +22 -0
- package/dist/orchestration_1_0_54/utils.d.ts.map +1 -0
- package/dist/orchestration_1_0_54/utils.js +226 -0
- package/dist/orchestration_1_0_54/utils.js.map +1 -0
- package/dist/session-manager.d.ts +4 -0
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +22 -0
- package/dist/session-manager.js.map +1 -1
- package/dist/session-proxy.d.ts +12 -0
- package/dist/session-proxy.d.ts.map +1 -1
- package/dist/session-proxy.js +137 -13
- package/dist/session-proxy.js.map +1 -1
- package/dist/sweeper-tools.d.ts +1 -1
- package/dist/sweeper-tools.d.ts.map +1 -1
- package/dist/sweeper-tools.js +20 -75
- package/dist/sweeper-tools.js.map +1 -1
- package/dist/system-agents.d.ts +2 -0
- package/dist/system-agents.d.ts.map +1 -1
- package/dist/system-agents.js +3 -0
- package/dist/system-agents.js.map +1 -1
- package/dist/types.d.ts +14 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
- package/plugins/mgmt/agents/agent-tuner.agent.md +36 -2
- package/plugins/mgmt/agents/sweeper.agent.md +7 -7
- package/plugins/system/agents/default.agent.md +3 -1
package/dist/session-proxy.d.ts
CHANGED
|
@@ -5,6 +5,16 @@ import type { StorageConfig } from "./storage-config.js";
|
|
|
5
5
|
import { type SerializableSessionConfig } from "./types.js";
|
|
6
6
|
import type { AgentConfig } from "./agent-loader.js";
|
|
7
7
|
import { type CronAtSchedule } from "./cron-at.js";
|
|
8
|
+
export declare function prepareStickySessionTitleUpdate(catalog: Pick<SessionCatalog, "getSession">, sessionId: string, requestedTitle: unknown): Promise<{
|
|
9
|
+
ok: true;
|
|
10
|
+
updates: {
|
|
11
|
+
title: string;
|
|
12
|
+
titleLocked: true;
|
|
13
|
+
};
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
message: string;
|
|
17
|
+
}>;
|
|
8
18
|
export declare function createSessionProxy(ctx: any, sessionId: string, affinityKey: string, config: SerializableSessionConfig): {
|
|
9
19
|
runTurn(prompt: string, bootstrap?: boolean, turnIndex?: number, turnMeta?: {
|
|
10
20
|
parentSessionId?: string;
|
|
@@ -93,6 +103,8 @@ export declare function createSessionManagerProxy(ctx: any): {
|
|
|
93
103
|
deleteSession(sessionId: string, reason?: string): any;
|
|
94
104
|
/** Update a session's CMS state (e.g. "rejected" for policy violations). */
|
|
95
105
|
updateCmsState(sessionId: string, state: string, lastError?: string | null, waitReason?: string | null): any;
|
|
106
|
+
/** Persist this session's model metadata in CMS. */
|
|
107
|
+
updateSessionModel(sessionId: string, model: string, reasoningEffort?: string | null): any;
|
|
96
108
|
/** Get the worker's authoritative session policy + allowed agent names. */
|
|
97
109
|
getWorkerSessionPolicy(): any;
|
|
98
110
|
/** Load curated skills and open asks from the knowledge pipeline. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-proxy.d.ts","sourceRoot":"","sources":["../src/session-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAgC,KAAK,yBAAyB,EAA4C,MAAM,YAAY,CAAC;AACpI,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUrD,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"session-proxy.d.ts","sourceRoot":"","sources":["../src/session-proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/session-proxy.js
CHANGED
|
@@ -29,6 +29,7 @@ function normalizeJsonObject(value) {
|
|
|
29
29
|
return value;
|
|
30
30
|
}
|
|
31
31
|
const SUMMARY_STATE_TEMPLATE = '{"schemaVersion":1,"updatedAt":"2026-05-18T00:00:00.000Z","intent":"...","summary":"...","state":{},"openQuestions":[],"blockers":[],"nextActions":[],"links":[],"structureChangeLog":[]}';
|
|
32
|
+
const MAX_SESSION_TITLE_LENGTH = 60;
|
|
32
33
|
function normalizeSummaryArray(value) {
|
|
33
34
|
if (Array.isArray(value))
|
|
34
35
|
return value;
|
|
@@ -74,6 +75,42 @@ function normalizeSummaryState(value) {
|
|
|
74
75
|
},
|
|
75
76
|
};
|
|
76
77
|
}
|
|
78
|
+
function normalizeSessionTitleInput(title, maxLength = MAX_SESSION_TITLE_LENGTH) {
|
|
79
|
+
return String(title || "").trim().slice(0, maxLength);
|
|
80
|
+
}
|
|
81
|
+
function getNamedAgentTitlePrefix(session) {
|
|
82
|
+
if (!session?.agentId)
|
|
83
|
+
return null;
|
|
84
|
+
const currentTitle = String(session.title || "").trim();
|
|
85
|
+
if (!currentTitle)
|
|
86
|
+
return null;
|
|
87
|
+
const separatorIndex = currentTitle.indexOf(": ");
|
|
88
|
+
if (separatorIndex > 0)
|
|
89
|
+
return currentTitle.slice(0, separatorIndex).trim() || null;
|
|
90
|
+
return currentTitle || null;
|
|
91
|
+
}
|
|
92
|
+
function buildStickySessionTitle(session, requestedTitle) {
|
|
93
|
+
const normalizedTitle = normalizeSessionTitleInput(requestedTitle);
|
|
94
|
+
const prefix = getNamedAgentTitlePrefix(session);
|
|
95
|
+
if (!prefix)
|
|
96
|
+
return normalizedTitle;
|
|
97
|
+
const prefixLabel = `${prefix}: `;
|
|
98
|
+
const maxSuffixLength = Math.max(0, MAX_SESSION_TITLE_LENGTH - prefixLabel.length);
|
|
99
|
+
if (maxSuffixLength <= 0)
|
|
100
|
+
return prefix.slice(0, MAX_SESSION_TITLE_LENGTH);
|
|
101
|
+
return `${prefixLabel}${normalizedTitle.slice(0, maxSuffixLength)}`;
|
|
102
|
+
}
|
|
103
|
+
export async function prepareStickySessionTitleUpdate(catalog, sessionId, requestedTitle) {
|
|
104
|
+
const session = await catalog.getSession(sessionId);
|
|
105
|
+
if (!session)
|
|
106
|
+
return { ok: false, message: `Session ${sessionId.slice(0, 8)} was not found.` };
|
|
107
|
+
if (session.isSystem)
|
|
108
|
+
return { ok: false, message: "System session titles are fixed" };
|
|
109
|
+
const title = buildStickySessionTitle(session, requestedTitle);
|
|
110
|
+
if (!title)
|
|
111
|
+
return { ok: false, message: "Title cannot be empty" };
|
|
112
|
+
return { ok: true, updates: { title, titleLocked: true } };
|
|
113
|
+
}
|
|
77
114
|
function buildContractJson(contract, parentSessionId, childSessionId) {
|
|
78
115
|
const normalized = normalizeJsonObject(contract);
|
|
79
116
|
if (!normalized)
|
|
@@ -543,6 +580,10 @@ export function createSessionManagerProxy(ctx) {
|
|
|
543
580
|
payload.waitReason = waitReason;
|
|
544
581
|
return ctx.scheduleActivity("updateCmsState", payload);
|
|
545
582
|
},
|
|
583
|
+
/** Persist this session's model metadata in CMS. */
|
|
584
|
+
updateSessionModel(sessionId, model, reasoningEffort) {
|
|
585
|
+
return ctx.scheduleActivity("updateSessionModel", { sessionId, model, reasoningEffort });
|
|
586
|
+
},
|
|
546
587
|
/** Get the worker's authoritative session policy + allowed agent names. */
|
|
547
588
|
getWorkerSessionPolicy() {
|
|
548
589
|
return ctx.scheduleActivity("getWorkerSessionPolicy", {});
|
|
@@ -608,6 +649,7 @@ workerNodeId) {
|
|
|
608
649
|
toolNames: new Set(),
|
|
609
650
|
modelSummary: sessionManager.getModelSummary(),
|
|
610
651
|
};
|
|
652
|
+
const turnStartedAt = new Date();
|
|
611
653
|
const turnSpan = otelTrace.getTracer("pilotswarm-turns").startSpan("session.turn", {
|
|
612
654
|
attributes: {
|
|
613
655
|
"pilotswarm.session_id": input.sessionId,
|
|
@@ -992,6 +1034,38 @@ workerNodeId) {
|
|
|
992
1034
|
return `[SYSTEM: spawn_agent failed: ${err?.message || String(err)}]`;
|
|
993
1035
|
}
|
|
994
1036
|
},
|
|
1037
|
+
setSessionModel: async (args) => {
|
|
1038
|
+
try {
|
|
1039
|
+
const requestedModel = String(args.model || "").trim();
|
|
1040
|
+
if (!requestedModel)
|
|
1041
|
+
return "[SYSTEM: set_session_model failed: model is required.]";
|
|
1042
|
+
if (!storeUrl)
|
|
1043
|
+
return "[SYSTEM: set_session_model failed: no storeUrl is configured.]";
|
|
1044
|
+
const resolved = sessionManager.resolveModelSwitchConfig(requestedModel, "reasoning_effort" in args ? args.reasoning_effort ?? null : undefined);
|
|
1045
|
+
const sdkClient = new PilotSwarmClient(internalClientConfig());
|
|
1046
|
+
try {
|
|
1047
|
+
await sdkClient.start();
|
|
1048
|
+
await sdkClient.duroxideClient.enqueueEvent(`session-${input.sessionId}`, "messages", JSON.stringify({
|
|
1049
|
+
type: "cmd",
|
|
1050
|
+
cmd: "set_model",
|
|
1051
|
+
id: `set-model-tool-${randomUUID()}`,
|
|
1052
|
+
args: {
|
|
1053
|
+
model: resolved.model,
|
|
1054
|
+
reasoningEffort: resolved.reasoningEffort,
|
|
1055
|
+
source: "tool",
|
|
1056
|
+
},
|
|
1057
|
+
}));
|
|
1058
|
+
}
|
|
1059
|
+
finally {
|
|
1060
|
+
await sdkClient.stop().catch(() => { });
|
|
1061
|
+
}
|
|
1062
|
+
const effortText = resolved.reasoningEffort ? `:${resolved.reasoningEffort}` : "";
|
|
1063
|
+
return `[SYSTEM: Model switch accepted. Stop this turn now; the runtime will automatically continue on ${resolved.model}${effortText}.]`;
|
|
1064
|
+
}
|
|
1065
|
+
catch (err) {
|
|
1066
|
+
return `[SYSTEM: set_session_model failed: ${err?.message || String(err)}]`;
|
|
1067
|
+
}
|
|
1068
|
+
},
|
|
995
1069
|
messageAgent: async (args) => {
|
|
996
1070
|
try {
|
|
997
1071
|
const child = await resolveManagedChild(args.agent_id);
|
|
@@ -1128,11 +1202,33 @@ workerNodeId) {
|
|
|
1128
1202
|
return `[SYSTEM: update_session_summary is disabled for read-only agent-tuner sessions.]`;
|
|
1129
1203
|
if (!catalog)
|
|
1130
1204
|
return `[SYSTEM: update_session_summary failed: CMS catalog is unavailable.]`;
|
|
1131
|
-
const
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1205
|
+
const hasSummaryState = Object.prototype.hasOwnProperty.call(args ?? {}, "summary_state") && args.summary_state !== undefined && args.summary_state !== null;
|
|
1206
|
+
const hasTitle = Object.prototype.hasOwnProperty.call(args ?? {}, "title");
|
|
1207
|
+
if (!hasSummaryState && !hasTitle) {
|
|
1208
|
+
return `[SYSTEM: update_session_summary failed: summary_state or title is required.]`;
|
|
1209
|
+
}
|
|
1210
|
+
let normalizedSummary;
|
|
1211
|
+
if (hasSummaryState) {
|
|
1212
|
+
const summaryResult = normalizeSummaryState(args.summary_state);
|
|
1213
|
+
if (!summaryResult.ok)
|
|
1214
|
+
return `[SYSTEM: update_session_summary failed: ${summaryResult.message}]`;
|
|
1215
|
+
normalizedSummary = summaryResult;
|
|
1216
|
+
}
|
|
1217
|
+
const titleUpdate = hasTitle
|
|
1218
|
+
? await prepareStickySessionTitleUpdate(catalog, input.sessionId, args.title)
|
|
1219
|
+
: undefined;
|
|
1220
|
+
if (titleUpdate && !titleUpdate.ok)
|
|
1221
|
+
return `[SYSTEM: update_session_summary failed: ${titleUpdate.message}]`;
|
|
1222
|
+
const updated = [];
|
|
1223
|
+
if (normalizedSummary) {
|
|
1224
|
+
await catalog.updateSessionSummary(input.sessionId, normalizedSummary.summaryState, args.short_summary);
|
|
1225
|
+
updated.push("summary");
|
|
1226
|
+
}
|
|
1227
|
+
if (titleUpdate?.ok) {
|
|
1228
|
+
await catalog.updateSession(input.sessionId, titleUpdate.updates);
|
|
1229
|
+
updated.push("title");
|
|
1230
|
+
}
|
|
1231
|
+
return `[SYSTEM: Session ${updated.join(" and ")} updated.]`;
|
|
1136
1232
|
}
|
|
1137
1233
|
catch (err) {
|
|
1138
1234
|
return `[SYSTEM: update_session_summary failed: ${err?.message || String(err)}]`;
|
|
@@ -1343,7 +1439,6 @@ workerNodeId) {
|
|
|
1343
1439
|
turnTelemetry.tokensOutput += usageUpsert.tokensOutputIncrement ?? 0;
|
|
1344
1440
|
turnTelemetry.tokensCacheRead += usageUpsert.tokensCacheReadIncrement ?? 0;
|
|
1345
1441
|
turnTelemetry.tokensCacheWrite += usageUpsert.tokensCacheWriteIncrement ?? 0;
|
|
1346
|
-
void cmsRetryBestEffort(`runTurn.onEvent upsertSummary usage session=${input.sessionId}`, () => catalog.upsertSessionMetricSummary(input.sessionId, usageUpsert), (msg) => activityCtx.traceInfo(msg));
|
|
1347
1442
|
}
|
|
1348
1443
|
}
|
|
1349
1444
|
else if (event.eventType === "tool.execution_start") {
|
|
@@ -1514,7 +1609,8 @@ workerNodeId) {
|
|
|
1514
1609
|
};
|
|
1515
1610
|
}
|
|
1516
1611
|
activityCtx.traceInfo(`[runTurn] ManagedSession.runTurn completed for ${input.sessionId} type=${result.type}`);
|
|
1517
|
-
//
|
|
1612
|
+
// Drain event writes before the atomic post-turn writeback records
|
|
1613
|
+
// session.turn_completed.
|
|
1518
1614
|
//
|
|
1519
1615
|
// Ordering matters here: every per-event CMS write fired by the
|
|
1520
1616
|
// SDK's onEvent callback (assistant.message, tool calls, usage,
|
|
@@ -1543,10 +1639,6 @@ workerNodeId) {
|
|
|
1543
1639
|
if (pendingWritesAtBarrier.length > 0) {
|
|
1544
1640
|
await Promise.allSettled(pendingWritesAtBarrier);
|
|
1545
1641
|
}
|
|
1546
|
-
await cmsRetryBestEffort(`runTurn.recordEvent turn_completed session=${input.sessionId}`, () => catalog.recordEvents(input.sessionId, [{
|
|
1547
|
-
eventType: "session.turn_completed",
|
|
1548
|
-
data: { iteration: input.turnIndex ?? 0 },
|
|
1549
|
-
}], workerNodeId), (msg) => activityCtx.traceInfo(msg));
|
|
1550
1642
|
}
|
|
1551
1643
|
if (cancelled)
|
|
1552
1644
|
return { type: "cancelled" };
|
|
@@ -1591,8 +1683,32 @@ workerNodeId) {
|
|
|
1591
1683
|
updates.waitReason = null;
|
|
1592
1684
|
updates.lastError = null;
|
|
1593
1685
|
}
|
|
1594
|
-
const
|
|
1595
|
-
await cmsRetryBestEffort(`runTurn.postTurn
|
|
1686
|
+
const turnEndedAt = new Date();
|
|
1687
|
+
await cmsRetryBestEffort(`runTurn.postTurn completeTurnWriteback state=${updates.state} session=${input.sessionId}`, () => catalog.completeTurnWriteback({
|
|
1688
|
+
sessionId: input.sessionId,
|
|
1689
|
+
agentId: null,
|
|
1690
|
+
model: input.config.model ?? null,
|
|
1691
|
+
reasoningEffort: input.config.reasoningEffort ?? null,
|
|
1692
|
+
turnIndex: input.turnIndex ?? 0,
|
|
1693
|
+
startedAt: turnStartedAt,
|
|
1694
|
+
endedAt: turnEndedAt,
|
|
1695
|
+
durationMs: Math.max(0, turnEndedAt.getTime() - turnStartedAt.getTime()),
|
|
1696
|
+
tokensInput: turnTelemetry.tokensInput,
|
|
1697
|
+
tokensOutput: turnTelemetry.tokensOutput,
|
|
1698
|
+
tokensCacheRead: turnTelemetry.tokensCacheRead,
|
|
1699
|
+
tokensCacheWrite: turnTelemetry.tokensCacheWrite,
|
|
1700
|
+
toolCalls: turnTelemetry.toolCalls,
|
|
1701
|
+
toolErrors: turnTelemetry.toolErrors,
|
|
1702
|
+
toolNames: Array.from(turnTelemetry.toolNames).sort(),
|
|
1703
|
+
resultType: result.type,
|
|
1704
|
+
errorMessage: result.type === "error" ? (result.message ?? null) : null,
|
|
1705
|
+
workerNodeId: workerNodeId ?? null,
|
|
1706
|
+
state: updates.state ?? "idle",
|
|
1707
|
+
lastActiveAt: updates.lastActiveAt ?? turnEndedAt,
|
|
1708
|
+
lastError: updates.lastError ?? null,
|
|
1709
|
+
waitReason: updates.waitReason ?? null,
|
|
1710
|
+
currentIteration: input.turnIndex ?? 0,
|
|
1711
|
+
}), (msg) => activityCtx.traceInfo(msg));
|
|
1596
1712
|
}
|
|
1597
1713
|
return result;
|
|
1598
1714
|
}, { trace });
|
|
@@ -2110,6 +2226,7 @@ workerNodeId) {
|
|
|
2110
2226
|
parentSessionId: input.parentSessionId,
|
|
2111
2227
|
nestingLevel: input.nestingLevel,
|
|
2112
2228
|
model: input.config.model,
|
|
2229
|
+
reasoningEffort: input.config.reasoningEffort,
|
|
2113
2230
|
systemMessage: input.config.systemMessage,
|
|
2114
2231
|
boundAgentName: input.config.boundAgentName,
|
|
2115
2232
|
promptLayering: input.config.promptLayering,
|
|
@@ -2399,6 +2516,13 @@ workerNodeId) {
|
|
|
2399
2516
|
updates.waitReason = input.waitReason ?? null;
|
|
2400
2517
|
await cmsRetryCritical(`updateCmsState session=${input.sessionId} state=${input.state}`, () => catalog.updateSession(input.sessionId, { ...updates }), (msg) => activityCtx.traceInfo(msg));
|
|
2401
2518
|
});
|
|
2519
|
+
runtime.registerActivity("updateSessionModel", async (activityCtx, input) => {
|
|
2520
|
+
activityCtx.traceInfo(`[updateSessionModel] session=${input.sessionId} model=${input.model}`);
|
|
2521
|
+
await cmsRetryCritical(`updateSessionModel session=${input.sessionId}`, () => catalog.updateSession(input.sessionId, {
|
|
2522
|
+
model: input.model,
|
|
2523
|
+
reasoningEffort: input.reasoningEffort ?? null,
|
|
2524
|
+
}), (msg) => activityCtx.traceInfo(msg));
|
|
2525
|
+
});
|
|
2402
2526
|
}
|
|
2403
2527
|
// ── getWorkerSessionPolicy ──────────────────────────────
|
|
2404
2528
|
// Returns the worker's session policy and allowed agent names.
|