thinkpool-pair 0.7.282 → 0.7.284

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/bridge.mjs CHANGED
@@ -1130,7 +1130,7 @@ const announce = () => {
1130
1130
  // laneStatusOf: authoritative busy/idle + last-action timestamp/age +
1131
1131
  // STUCK/BLOCKED alert. The bridge owns the turn and permission state, so
1132
1132
  // every roster consumer reads one status instead of reconstructing it.
1133
- ...[...sessions.entries()].map(([id, s]) => ({ id, cmd: s.cmd, kind: 'structured', runtime: s.runtime || 'claude', alive: true, ...laneStatusOf(s), hasTranscript: s.log.length > 0, commands: s.commands, mode: s.mode || undefined, effort: s.effort || undefined, name: termNames[id] || undefined, model: s.model || undefined, capabilities: { ...structuredRuntimeMetadata(s.runtime || 'claude'), modes: structuredModesForLane(s.runtime || 'claude', s) }, ...(s.runtime === 'codex' ? { approvalPolicy: codexConfigForMode(s.mode).approvalPolicy, models: s.models || [], canSteer: s.session?.canSteer ?? false } : s.runtime === 'hermes' ? { models: s.models || [], canSteer: s.session?.canSteer ?? false } : {}), ...(s.archiveOldestSeq != null ? { oldestSeq: s.archiveOldestSeq } : {}), ...(s.spawnedBy ? { spawned: true, spawnedBy: s.spawnedBy } : {}), ...(s.sideParent ? { sideParent: s.sideParent, sideTask: s.sideTask || undefined, sideHandback: !!s.sideHandback } : {}), ...(s.flowSessionId ? { flowId: s.flowSessionId, flowRole: s.flowTaskKey ? 'lane' : 'conductor' } : {}),
1133
+ ...[...sessions.entries()].map(([id, s]) => ({ id, cmd: s.cmd, kind: 'structured', runtime: s.runtime || 'claude', alive: true, ...laneStatusOf(s), ...(s.session?.turnActive && s._turnStart ? { turnStartedAt: s._turnStart } : {}), hasTranscript: s.log.length > 0, commands: s.commands, mode: s.mode || undefined, effort: s.effort || undefined, name: termNames[id] || undefined, model: s.model || undefined, capabilities: { ...structuredRuntimeMetadata(s.runtime || 'claude'), modes: structuredModesForLane(s.runtime || 'claude', s) }, ...(s.runtime === 'codex' ? { approvalPolicy: codexConfigForMode(s.mode).approvalPolicy, models: s.models || [], canSteer: s.session?.canSteer ?? false } : s.runtime === 'hermes' ? { models: s.models || [], canSteer: s.session?.canSteer ?? false } : {}), ...(s.archiveOldestSeq != null ? { oldestSeq: s.archiveOldestSeq } : {}), ...(s.spawnedBy ? { spawned: true, spawnedBy: s.spawnedBy } : {}), ...(s.sideParent ? { sideParent: s.sideParent, sideTask: s.sideTask || undefined, sideHandback: !!s.sideHandback } : {}), ...(s.flowSessionId ? { flowId: s.flowSessionId, flowRole: s.flowTaskKey ? 'lane' : 'conductor' } : {}),
1134
1134
  // provider: the registered LLM-provider this lane runs on, NAME-ONLY {id,name}
1135
1135
  // (NEVER the key or baseUrl). Additive; older clients ignore it. Omitted for the
1136
1136
  // built-in/default Claude path (no badge). Makes the lane's provider badge +
@@ -2910,7 +2910,7 @@ function openStructured({ id, runtime = 'claude', model, models, effort, resume,
2910
2910
  // usage needs an explicit persist() here to survive a bridge restart.
2911
2911
  if (evt.kind === 'usage') { entry.lastUsage = evt; persist() }
2912
2912
  if (evt.kind === 'effort') {
2913
- entry.effort = evt.effort ?? null
2913
+ entry.effort = evt.level ?? evt.effort ?? null
2914
2914
  persist()
2915
2915
  announce()
2916
2916
  }
@@ -431,7 +431,7 @@ export const spawnDecision = ({ hop = 0, spawnTimes = [], now = 0, spawnedLive =
431
431
  // host path, or mutable process object is copied into the preview.
432
432
  const DISPATCH_ARG_KEYS = Object.freeze(['mode', 'model', 'name', 'provider', 'runtime', 'sliceType', 'task'])
433
433
  const DISPATCH_MODES = new Set(['default', 'acceptEdits', 'bypassPermissions', 'plan'])
434
- const DISPATCH_RUNTIMES = new Set(['claude', 'codex'])
434
+ const DISPATCH_RUNTIMES = new Set(['claude', 'codex', 'hermes'])
435
435
  const DISPATCH_SLICES = new Set(['scaffold', 'feature', 'fix', 'review'])
436
436
  const secretValue = /((?<![a-z0-9])sk-[a-z0-9_-]{8,}|(?<![a-z0-9])gsk_[a-z0-9_-]{8,}|(?<![a-z0-9])AIza[a-z0-9_-]{8,}|bearer\s+[a-z0-9._-]{8,})/ig
437
437
  const hostPath = /(?:\/home\/|\/users\/|\/private\/|\/tmp\/|[a-z]:\\|\\\\)/ig
@@ -487,7 +487,9 @@ export function buildDispatchPreview ({ args, initiatorTerminalId, roomCode, bri
487
487
  // durable resolution/delivery-attempt events.
488
488
  const authority = Object.freeze({ initiatorTerminalId: String(initiatorTerminalId), roomCode: String(roomCode).toUpperCase(), bridgeAuthorityId: String(bridgeAuthorityId), localAuthorityId: String(localAuthorityId) })
489
489
  const fingerprint = sha256({ authority, exactArgs, caps })
490
- const provider = exactArgs.provider || (exactArgs.runtime === 'codex' ? 'OpenAI / Codex login' : 'Anthropic / host default')
490
+ const provider = exactArgs.provider || (exactArgs.runtime === 'codex'
491
+ ? 'OpenAI / Codex login'
492
+ : exactArgs.runtime === 'hermes' ? 'Hermes ACP profile' : 'Anthropic / host default')
491
493
  const model = exactArgs.model || context.resolvedModel || 'runtime default'
492
494
  const purpose = safeCopy(exactArgs.name || exactArgs.task?.split(/\r?\n/)[0] || 'Open one worker lane', 120)
493
495
  return Object.freeze({
@@ -479,7 +479,7 @@ export function startHermesSession({
479
479
  : new RegExp(`Session reasoning set to ${requested}`, 'i').test(mapper.text)
480
480
  if (confirmed) {
481
481
  activeEffort = requested === 'reset' ? null : requested
482
- emit({ kind: 'effort', effort: activeEffort })
482
+ emit({ kind: 'effort', level: activeEffort })
483
483
  }
484
484
  }
485
485
  // Reserve the idle-looking result boundary for the existing FIFO before
@@ -660,7 +660,7 @@ export function startHermesSession({
660
660
  const requested = String(nextEffort)
661
661
  void boot().then(() => client.request('session/set_config_option', { sessionId, configId: HERMES_EFFORT_CONFIG_ID, value: requested })).then(() => {
662
662
  activeEffort = requested
663
- emit({ kind: 'effort', effort: activeEffort })
663
+ emit({ kind: 'effort', level: activeEffort })
664
664
  }).catch((error) => emit({ kind: 'error', message: `Hermes reasoning change failed: ${error?.message || error}`, recoverable: true }))
665
665
  return true
666
666
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thinkpool-pair",
3
- "version": "0.7.282",
3
+ "version": "0.7.284",
4
4
  "description": "Share a local coding-agent CLI (Claude Code, Codex, Gemini, Aider, …) into a ThinkPool Code room, live.",
5
5
  "type": "module",
6
6
  "bin": {