{"record":{"id":"a2396d590d9ad32e","repo":"paperclipai/paperclip","slug":"remote-session-budget-updates-require-a-connected","errorCode":null,"errorMessage":"remote session budget updates require a connected remote provider session","messagePattern":"remote session budget updates require a connected remote provider session","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/src/live/live-session.ts","lineNumber":2068,"sourceCode":"    this.#appendEvidence(\"session\", turnId, { action: \"stop_requested\", reason });\n    this.#emit({ turnId, kind: \"activity\", reason: \"stop_requested\" });\n    await this.#transport.request(\"turn/interrupt\", {\n      threadId: this.#providerThreadId,\n      turnId,\n    });\n    await this.#persist();\n    return this.snapshot();\n  }\n\n  async increaseManagedSessionBudget(\n    maxSessionListCostUsd: number,\n  ): Promise<CapabilityLiveSessionSnapshot> {\n    if (\n      (this.#config.provider !== \"claude_managed\" &&\n        this.#config.provider !== \"aws_agentcore\") ||\n      this.#transport === null\n    ) {\n      throw new Error(\n        \"remote session budget updates require a connected remote provider session\",\n      );\n    }\n    if (!Number.isFinite(maxSessionListCostUsd) || maxSessionListCostUsd <= 0) {\n      throw new Error(\"managed session spend ceiling must be positive\");\n    }\n    await this.#transport.request(\"session/budget/increase\", {\n      maxSessionListCostUsd,\n    });\n    if (this.#config.managedProfile) {\n      this.#config.managedProfile.maxSessionListCostUsd = maxSessionListCostUsd;\n    }\n    if (this.#config.agentCoreProfile) {\n      this.#config.agentCoreProfile.maxEstimatedSessionCostUsd =\n        maxSessionListCostUsd;\n    }\n    this.#status = this.#activeTurnId === null ? \"warm_idle\" : \"running\";\n    this.#appendEvidence(\"session\", this.#activeTurnId, {","sourceCodeStart":2050,"sourceCodeEnd":2086,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/src/live/live-session.ts#L2050-L2086","documentation":"The budget-update method only works for managed remote providers (claude_managed/aws_agentcore) with an active transport connection. Called on a local/mock provider session or before the transport is connected, it throws instead of silently no-oping the budget change.","triggerScenarios":"Calling updateManagedRemoteSessionBudget (or equivalent) when #config.provider is not claude_managed/aws_agentcore, or when #transport is still null (session created but remote connection not established).","commonSituations":"Calling budget updates right after create() before connect completes; assuming the method works on mock/local adapter sessions; race where the transport dropped and was set to null.","solutions":["Ensure the remote session is connected (await connect/startup) before updating the budget","Only call this method for claude_managed/aws_agentcore providers; skip or branch for other providers","Check connection state via the session snapshot before calling","Handle the throw to surface 'not connected' state to the UI/operator"],"exampleFix":"// before\nawait session.updateManagedRemoteSessionBudget(50); // may throw on local/disconnected\n// after\nif (session.provider === 'claude_managed' || session.provider === 'aws_agentcore') {\n  await session.ensureConnected();\n  await session.updateManagedRemoteSessionBudget(50);\n}","handlingStrategy":"try-catch","validationCode":"const isManaged = cfg.provider === 'claude_managed' || cfg.provider === 'aws_agentcore';\nif (!isManaged || !session.isConnected?.()) throw new Error('budget update needs a connected managed remote session');","typeGuard":null,"tryCatchPattern":"try {\n  await session.updateManagedRemoteSessionBudget(usd);\n} catch (err) {\n  if (err instanceof Error && err.message.includes('connected remote provider session')) {\n    // defer or reconnect, then retry\n  } else throw err;\n}","preventionTips":["Await connection establishment before managed-only calls","Branch on provider type before invoking managed-only methods","Track transport state in your own session wrapper"],"tags":["live-session","budget","connection-state"],"backgroundTag":"remote-session-not-connected","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-02T18:44:00.616Z","contentChangedAt":"2026-09-02T18:44:00.616Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}