diff --git a/internal/cloud/code-agent-agentrun-adapter.ts b/internal/cloud/code-agent-agentrun-adapter.ts index 59bd930c..4cfc68a7 100644 --- a/internal/cloud/code-agent-agentrun-adapter.ts +++ b/internal/cloud/code-agent-agentrun-adapter.ts @@ -20,6 +20,7 @@ const DEFAULT_RUNNER_NAMESPACE = "agentrun-v01"; const DEFAULT_TIMEOUT_MS = 1_200_000; const AGENTRUN_BACKENDS = Object.freeze(["codex", "deepseek"]); const THREAD_CONTINUITY_POLICY = "hwlab-agentrun-v01-new-runner-thread"; +const SESSION_POLICY_RUN_LOCAL = "hwlab-agentrun-v01-run-local-session"; export function codeAgentAgentRunAdapterEnabled(env = process.env) { const value = String(env.HWLAB_CODE_AGENT_ADAPTER ?? env.HWLAB_CODE_AGENT_PROVIDER ?? "").trim().toLowerCase(); @@ -36,7 +37,7 @@ export function initialAgentRunChatResult({ params = {}, options = {}, traceId } shortConnection: true, traceId, conversationId: safeConversationId(params.conversationId) || null, - sessionId: agentRunSessionId(params, traceId), + sessionId: safeSessionId(params.sessionId) || agentRunSessionId(traceId), threadId: safeOpaqueId(params.threadId) || null, messageId: `msg_${safeTraceId(traceId)?.slice(4) || randomUUID()}`, createdAt: timestamp, @@ -324,14 +325,16 @@ function buildAgentRunCreateRunInput({ params, env, traceId, backendProfile }) { valuesPrinted: false }, sessionRef: { - sessionId: agentRunSessionId(params, traceId), + sessionId: agentRunSessionId(traceId), ...(safeConversationId(params.conversationId) ? { conversationId: safeConversationId(params.conversationId) } : {}), metadata: { adapter: ADAPTER_ID, hwlabTraceId: traceId, hwlabApi: "/v1/agent/chat", + hwlabSessionId: safeSessionId(params.sessionId) || null, requestedThreadId: safeOpaqueId(params.threadId) || null, threadContinuityPolicy: THREAD_CONTINUITY_POLICY, + sessionPolicy: SESSION_POLICY_RUN_LOCAL, valuesPrinted: false } }, @@ -367,10 +370,12 @@ function buildAgentRunCommandInput({ params, traceId, backendProfile }) { message: prompt, traceId, conversationId: safeConversationId(params.conversationId) || null, - sessionId: agentRunSessionId(params, traceId), + sessionId: agentRunSessionId(traceId), + hwlabSessionId: safeSessionId(params.sessionId) || null, threadId: null, requestedThreadId: safeOpaqueId(params.threadId) || null, threadContinuityPolicy: THREAD_CONTINUITY_POLICY, + sessionPolicy: SESSION_POLICY_RUN_LOCAL, providerProfile: backendProfile, source: "hwlab-cloud-api", valuesPrinted: false @@ -655,8 +660,8 @@ function agentRunResultRefs(result = {}) { return refs; } -function agentRunSessionId(params, traceId) { - return safeSessionId(params.sessionId) || `ses_agentrun_${String(safeTraceId(traceId) || `trc_${randomUUID()}`).slice(4)}`; +function agentRunSessionId(traceId) { + return `ses_agentrun_${String(safeTraceId(traceId) || `trc_${randomUUID()}`).slice(4)}`; } function agentRunSessionSummary(base, status) { diff --git a/internal/cloud/server-agent-chat.test.ts b/internal/cloud/server-agent-chat.test.ts index 58f51d12..03ba970f 100644 --- a/internal/cloud/server-agent-chat.test.ts +++ b/internal/cloud/server-agent-chat.test.ts @@ -155,16 +155,23 @@ test("cloud api /v1/agent/chat delegates v0.2 turns to AgentRun v0.1 over adapte assert.equal(body.resourceBundleRef.repoUrl, "http://git-mirror-http.devops-infra.svc.cluster.local/pikasTech/HWLAB.git"); assert.equal(body.resourceBundleRef.commitId, "0123456789abcdef0123456789abcdef01234567"); assert.equal(Object.hasOwn(body.sessionRef, "threadId"), false); + assert.equal(body.sessionRef.sessionId, "ses_agentrun_server-test-agentrun-adapter"); + assert.notEqual(body.sessionRef.sessionId, "ses_server-test-agentrun"); + assert.equal(body.sessionRef.metadata.hwlabSessionId, "ses_server-test-agentrun"); assert.equal(body.sessionRef.metadata.requestedThreadId, "019e8078-db67-7750-a5d9-1a99f3abd445"); assert.equal(body.sessionRef.metadata.threadContinuityPolicy, "hwlab-agentrun-v01-new-runner-thread"); + assert.equal(body.sessionRef.metadata.sessionPolicy, "hwlab-agentrun-v01-run-local-session"); return send({ id: "run_hwlab_adapter", status: "pending", backendProfile: "deepseek", sessionRef: body.sessionRef, resourceBundleRef: body.resourceBundleRef }); } if (request.method === "POST" && url.pathname === "/api/v1/runs/run_hwlab_adapter/commands") { assert.equal(body.type, "turn"); assert.match(body.payload.prompt, /AgentRun adapter/u); + assert.equal(body.payload.sessionId, "ses_agentrun_server-test-agentrun-adapter"); + assert.equal(body.payload.hwlabSessionId, "ses_server-test-agentrun"); assert.equal(body.payload.threadId, null); assert.equal(body.payload.requestedThreadId, "019e8078-db67-7750-a5d9-1a99f3abd445"); assert.equal(body.payload.threadContinuityPolicy, "hwlab-agentrun-v01-new-runner-thread"); + assert.equal(body.payload.sessionPolicy, "hwlab-agentrun-v01-run-local-session"); return send({ id: "cmd_hwlab_adapter", runId: "run_hwlab_adapter", state: "pending", type: "turn", seq: 1 }); } if (request.method === "POST" && url.pathname === "/api/v1/runs/run_hwlab_adapter/runner-jobs") {