@chatpanel/gateway 0.6.83 → 0.6.84

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chatpanel/gateway",
3
- "version": "0.6.83",
3
+ "version": "0.6.84",
4
4
  "description": "Local privacy gateway \u2014 redacts PII out of OpenAI/Anthropic API traffic before it reaches a model, then restores it in the reply. Point opencode, codex, aider, Claude Code, etc. at it.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/server.js CHANGED
@@ -58,7 +58,7 @@ import * as openai from './openai.js';
58
58
  import * as responses from './responses.js';
59
59
  import * as anthropic from './anthropic.js';
60
60
 
61
- export const VERSION = '0.6.83';
61
+ export const VERSION = '0.6.84';
62
62
 
63
63
  // WARM search tier — SQLite + FTS5 record store (falls back to an encrypted-JSON
64
64
  // store if SQLite can't load), fed by the extension's ingest sync + backup-ingest.
package/src/toolrelay.js CHANGED
@@ -40,7 +40,7 @@ export function toolsToSpecs(tools) {
40
40
  // not time since the turn began: a flat 135 s from the start killed every relayed turn
41
41
  // with more than a handful of tool rounds, at 135.1 s exactly, and the client read the
42
42
  // empty resume as "the model returned no answer". A team member's turn is many rounds.
43
- export const RELAY_IDLE_MS = 135_000; // the bridge's own tool-call timeout is 120 s
43
+ export const RELAY_IDLE_MS = 200_000; // longer than the bridge's own idle (180 s), which is the authority
44
44
 
45
45
  export function createRelaySession({ vault, redactOpts, bridgeUrl, token, harness = null, idleMs = RELAY_IDLE_MS }) {
46
46
  const id = randomUUID().slice(0, 8);
@@ -81,6 +81,10 @@ export async function pumpBridgeStream(s, handlers) {
81
81
  const payload = t.slice(5).trim();
82
82
  if (!payload || payload === '[DONE]') continue;
83
83
  let evt; try { evt = JSON.parse(payload); } catch { continue; }
84
+ // Anything the bridge sends is life: an agent running its own tools for two minutes
85
+ // sends only status events, and a session that counts only text and tool requests
86
+ // as activity ended those turns mid-work.
87
+ touchRelaySession(s.id);
84
88
  if (evt.type === 'delta' && typeof evt.text === 'string') {
85
89
  handlers.onText(evt.text);
86
90
  } else if (evt.type === 'tool_request') {