@gotcos/glasses-server 6.51.0 → 6.52.3

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.
Files changed (34) hide show
  1. package/.env.example +16 -0
  2. package/CHANGELOG.md +86 -0
  3. package/README.md +56 -3
  4. package/managed-runtime-contract.json +1 -0
  5. package/package.json +1 -1
  6. package/server/index.ts +58 -9
  7. package/server/lib/activity-preview.ts +45 -2
  8. package/server/lib/agent-session-search.ts +3 -1
  9. package/server/lib/agent-session-store.ts +35 -5
  10. package/server/lib/agent-session-turns.ts +4 -1
  11. package/server/lib/claude-bridge.ts +9 -0
  12. package/server/lib/client-instance-claim.ts +22 -1
  13. package/server/lib/client-liveness.ts +50 -0
  14. package/server/lib/codex-bridge.ts +6 -0
  15. package/server/lib/cursor-bridge.ts +6 -0
  16. package/server/lib/job-trail.ts +758 -0
  17. package/server/lib/ollama-bridge.ts +17 -0
  18. package/server/lib/permission-broker.ts +1156 -0
  19. package/server/lib/query-job-coordinator.ts +17 -1
  20. package/server/lib/query-job-feature.ts +10 -0
  21. package/server/lib/query-job-runtime.ts +9 -1
  22. package/server/lib/query-job-store.ts +214 -5
  23. package/server/lib/query-job-types.ts +36 -0
  24. package/server/lib/session-signal-store.ts +42 -10
  25. package/server/lib/session-state-derive.ts +14 -4
  26. package/server/lib/session-stream-events.ts +629 -18
  27. package/server/lib/session-stream-producer.ts +25 -6
  28. package/server/lib/session-transcript-watcher.ts +120 -3
  29. package/server/routes/agent-sessions.ts +12 -1
  30. package/server/routes/client-instance.ts +12 -1
  31. package/server/routes/cursor-stop-followup.ts +14 -7
  32. package/server/routes/health.ts +24 -1
  33. package/server/routes/permission-broker.ts +176 -0
  34. package/server/routes/query-jobs.ts +84 -13
@@ -37,6 +37,7 @@ import {
37
37
  ollamaToolStatusLabel,
38
38
  parseToolArguments,
39
39
  } from './ollama-tools.js'
40
+ import { ollamaTrailOutcome, ollamaTrailStep, type JobTrailDraft } from './job-trail.js'
40
41
 
41
42
  const INACTIVITY_MS = 60_000
42
43
  const WALL_MAX_MS = 180_000
@@ -347,6 +348,14 @@ export async function callOllamaStreaming(
347
348
  let postCount = 0
348
349
  let toolsRetried = false
349
350
 
351
+ // 6.52.0, the Messages trail. This bridge owns its loop, so it reports each round's words
352
+ // and each tool call itself (there is no stdout to tee). A no-op without `onTrail`, and
353
+ // it never throws into the loop.
354
+ const trail = (draft: JobTrailDraft) => {
355
+ if (!callbacks.onTrail) return
356
+ try { callbacks.onTrail(draft) } catch { /* observation only */ }
357
+ }
358
+
350
359
  /** One POST + its stream. Returns what the round produced. */
351
360
  const runChatPost = async (sendTools: boolean): Promise<
352
361
  | { kind: 'text' }
@@ -446,8 +455,14 @@ export async function callOllamaStreaming(
446
455
 
447
456
  try {
448
457
  for (;;) {
458
+ const roundStart = fullText.length
449
459
  const round = await runChatPost(toolDefs.length > 0)
450
460
  if (round.kind === 'handled') return sid
461
+ // One prose entry per round: what the model wrote before its calls, or its answer.
462
+ if (callbacks.onTrail && (round.kind === 'text' || round.kind === 'tools')) {
463
+ const roundText = fullText.slice(roundStart)
464
+ if (roundText.trim()) trail({ kind: 'prose', text: roundText })
465
+ }
451
466
  if (round.kind === 'text') { await finalizeDone(); return sid }
452
467
 
453
468
  if (round.kind === 'empty') {
@@ -472,6 +487,7 @@ export async function callOllamaStreaming(
472
487
  if (finalized || abort.signal.aborted) break
473
488
  const name = call.function.name
474
489
  callbacks.onToolStatus?.(name)
490
+ if (callbacks.onTrail) trail(ollamaTrailStep(name, parseToolArguments(call.function.arguments)))
475
491
  toolHeartbeat = setInterval(bumpInactivity, TOOL_HEARTBEAT_MS)
476
492
  let result: string
477
493
  try {
@@ -483,6 +499,7 @@ export async function callOllamaStreaming(
483
499
  await finalizeError('ollama-bridge: tool call aborted.')
484
500
  return sid
485
501
  }
502
+ if (callbacks.onTrail) trail(ollamaTrailOutcome(result))
486
503
  messages.push({
487
504
  role: 'tool',
488
505
  content: result,