@hyperdrive.bot/paseo-server 0.3.9 → 0.3.11

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 (37) hide show
  1. package/dist/server/server/agent/agent-loading.js +24 -3
  2. package/dist/server/server/agent/agent-manager.d.ts +22 -0
  3. package/dist/server/server/agent/agent-manager.js +36 -0
  4. package/dist/server/server/agent/agent-storage.d.ts +9 -0
  5. package/dist/server/server/agent/blocker-log.d.ts +81 -0
  6. package/dist/server/server/agent/blocker-log.js +113 -0
  7. package/dist/server/server/agent/card-move-log.d.ts +66 -0
  8. package/dist/server/server/agent/card-move-log.js +113 -0
  9. package/dist/server/server/agent/jarvis-judge.d.ts +121 -0
  10. package/dist/server/server/agent/jarvis-judge.js +225 -0
  11. package/dist/server/server/agent/judge-relay-gate.d.ts +70 -0
  12. package/dist/server/server/agent/judge-relay-gate.js +92 -0
  13. package/dist/server/server/agent/mcp-server.js +9 -0
  14. package/dist/server/server/agent/mcp-shared.d.ts +5 -0
  15. package/dist/server/server/agent/providers/claude/agent.js +38 -0
  16. package/dist/server/server/agent/providers/claude/transport/redact.d.ts +6 -0
  17. package/dist/server/server/agent/providers/claude/transport/redact.js +29 -1
  18. package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.js +42 -3
  19. package/dist/server/server/agent/session-digest-generator.d.ts +27 -0
  20. package/dist/server/server/agent/session-digest-generator.js +208 -17
  21. package/dist/server/server/agent/tools/paseo-tools.d.ts +12 -0
  22. package/dist/server/server/agent/tools/paseo-tools.js +48 -0
  23. package/dist/server/server/agent/tools/read-only-surface.d.ts +52 -0
  24. package/dist/server/server/agent/tools/read-only-surface.js +68 -0
  25. package/dist/server/server/agent/tools/types.d.ts +5 -0
  26. package/dist/server/server/bootstrap.js +73 -0
  27. package/dist/server/web-ui/_expo/static/js/web/{index-2cc86a7b26f9ded75a76c1d06ce8197c.js → index-5a54792f78b8475572ccfac9808dd926.js} +6 -6
  28. package/dist/server/web-ui/_expo/static/js/web/index-5a54792f78b8475572ccfac9808dd926.js.br +0 -0
  29. package/dist/server/web-ui/_expo/static/js/web/index-5a54792f78b8475572ccfac9808dd926.js.gz +0 -0
  30. package/dist/server/web-ui/_expo/static/js/web/{index-2cc86a7b26f9ded75a76c1d06ce8197c.js.map.br → index-5a54792f78b8475572ccfac9808dd926.js.map.br} +0 -0
  31. package/dist/server/web-ui/_expo/static/js/web/{index-2cc86a7b26f9ded75a76c1d06ce8197c.js.map.gz → index-5a54792f78b8475572ccfac9808dd926.js.map.gz} +0 -0
  32. package/dist/server/web-ui/index.html +1 -1
  33. package/dist/server/web-ui/index.html.br +0 -0
  34. package/dist/server/web-ui/index.html.gz +0 -0
  35. package/package.json +6 -6
  36. package/dist/server/web-ui/_expo/static/js/web/index-2cc86a7b26f9ded75a76c1d06ce8197c.js.br +0 -0
  37. package/dist/server/web-ui/_expo/static/js/web/index-2cc86a7b26f9ded75a76c1d06ce8197c.js.gz +0 -0
@@ -91,6 +91,10 @@ import { getCaptureStreamWs } from "./meetings/capture-stream-ws.js";
91
91
  import { createSpeechService } from "./speech/speech-runtime.js";
92
92
  import { AgentManager } from "./agent/agent-manager.js";
93
93
  import { scheduleSessionDigestRefresh } from "./agent/session-digest-generator.js";
94
+ import { CardMoveLog } from "./agent/card-move-log.js";
95
+ import { BlockerLog } from "./agent/blocker-log.js";
96
+ import { JudgeRelayGate } from "./agent/judge-relay-gate.js";
97
+ import { JarvisJudge } from "./agent/jarvis-judge.js";
94
98
  import { registerAgentRoutes } from "./agent/agent-routes.js";
95
99
  import { AgentStorage } from "./agent/agent-storage.js";
96
100
  import { attachAgentStoragePersistence } from "./persistence-hooks.js";
@@ -560,11 +564,33 @@ export async function createPaseoDaemon(config, rootLogger) {
560
564
  isDev: config.isDev === true,
561
565
  extraClients: config.agentClients,
562
566
  });
567
+ // Jarvis substrate (JARVIS-V1-SPEC §3.2). Append-only kanban move history.
568
+ // Prospective only: nothing before this ships is recoverable, which is why the
569
+ // spec sequences it ahead of every other piece.
570
+ const cardMoveLog = new CardMoveLog({ dir: config.paseoHome, logger });
571
+ // Blocker history. Same prospective-only property as the move log, and it
572
+ // answers a different question: not "how often was this deferred" but "who or
573
+ // what has kept blocking it". mergeDigest overwrites digest.blockers on every
574
+ // derivation, so without this the signal is destroyed on each idle.
575
+ const blockerLog = new BlockerLog({ dir: config.paseoHome, logger });
576
+ // Jarvis judge config (§5, §9.1). Env-driven in v1 to avoid protocol churn
577
+ // while the feature is still being shaped.
578
+ // Gate for the judge's one mutating capability. Enabled only when the judge
579
+ // itself is, so an unconfigured deployment cannot expose relay_to_agent.
580
+ const judgeRelayGate = new JudgeRelayGate({
581
+ enabled: Boolean(process.env.PASEO_JARVIS_AGENT_ID?.trim()),
582
+ });
583
+ const jarvisJudgeConfig = {
584
+ agentId: process.env.PASEO_JARVIS_AGENT_ID?.trim() || null,
585
+ shadow: process.env.PASEO_JARVIS_SHADOW === "1",
586
+ };
563
587
  const initialAgentManagerState = providerSnapshotManager.getAgentManagerProviderState();
564
588
  const agentManager = new AgentManager({
565
589
  clients: initialAgentManagerState.clients,
566
590
  providerDefinitions: initialAgentManagerState.providerDefinitions,
567
591
  registry: agentStorage,
592
+ cardMoveLog,
593
+ blockerLog,
568
594
  appendSystemPrompt: config.appendSystemPrompt,
569
595
  onWorkspaceStateMayHaveChanged: ({ cwd }) => {
570
596
  workspaceGitService.onWorkspaceStateMayHaveChanged(cwd);
@@ -577,14 +603,49 @@ export async function createPaseoDaemon(config, rootLogger) {
577
603
  // and regenerate summary/accomplishments via the borrowed-provider rail (the
578
604
  // same one auto-title uses; the daemon holds no API key of its own). Debounced +
579
605
  // coalesced inside the scheduler; internal agents never broadcast attention.
606
+ // Jarvis judge (JARVIS-V1-SPEC §5.1). Constructed before the attention
607
+ // listener because the listener has to ORDER the two: see below.
608
+ const jarvisJudge = new JarvisJudge({
609
+ agentManager,
610
+ agentStorage,
611
+ cardMoveLog,
612
+ blockerLog,
613
+ relayGate: judgeRelayGate,
614
+ config: jarvisJudgeConfig,
615
+ logger,
616
+ });
617
+ if (jarvisJudge.enabled) {
618
+ logger.info({ judgeAgentId: jarvisJudgeConfig.agentId, shadow: jarvisJudgeConfig.shadow }, "Jarvis judge enabled");
619
+ }
580
620
  agentManager.addAgentAttentionListener((params) => {
621
+ // Never let a judge failure take down attention handling for everyone else.
622
+ const wakeJudge = () => {
623
+ void jarvisJudge.handleAttention({ agentId: params.agentId, reason: params.reason });
624
+ };
625
+ // `error` and `permission` have no derivation step, so nothing to wait for.
581
626
  if (params.reason !== "finished") {
627
+ if (jarvisJudge.enabled) {
628
+ wakeJudge();
629
+ }
582
630
  return;
583
631
  }
584
632
  const agent = agentManager.getAgent(params.agentId);
585
633
  if (!agent || agent.internal) {
586
634
  return;
587
635
  }
636
+ // ORDERING IS LOAD-BEARING, and getting it wrong is invisible.
637
+ //
638
+ // The digest refresh and the judge both hang off this one `finished` event.
639
+ // Fired in parallel, the judge wins the race every time and reads a digest
640
+ // that has not been written yet, so its briefing carries no summary, no
641
+ // blockers and no deadline. It then correctly concludes there is nothing
642
+ // worth saying and answers "quiet" forever. No error is raised anywhere: the
643
+ // feature looks healthy and delivers nothing. Verified live in the docker lab
644
+ // before this chaining existed.
645
+ //
646
+ // So the judge is woken from onSettled, which fires on success, skip AND
647
+ // failure. A judge that only ran on the happy path would go quiet exactly
648
+ // when something broke.
588
649
  scheduleSessionDigestRefresh({
589
650
  agentManager,
590
651
  agentId: params.agentId,
@@ -597,6 +658,7 @@ export async function createPaseoDaemon(config, rootLogger) {
597
658
  thinkingOptionId: agent.runtimeInfo?.thinkingOptionId ?? agent.config.thinkingOptionId ?? null,
598
659
  },
599
660
  logger,
661
+ onSettled: jarvisJudge.enabled ? wakeJudge : undefined,
600
662
  });
601
663
  });
602
664
  // Epic 1, Story 1.2 — first-class workflow entity. WorkflowManager orchestrates
@@ -849,6 +911,17 @@ export async function createPaseoDaemon(config, rootLogger) {
849
911
  callerAgentId: runtime.callerAgentId,
850
912
  enableVoiceTools: runtime.enableVoiceTools,
851
913
  voiceOnly: runtime.voiceOnly,
914
+ // JARVIS-V1-SPEC §6, HARD REQUIREMENT. The judge reads untrusted transcripts,
915
+ // so it must not hold a mutating tool. Keyed on identity rather than on a
916
+ // mode, because a mode is something the agent itself could change.
917
+ readOnly: runtime.readOnly ||
918
+ (jarvisJudgeConfig.agentId !== null && runtime.callerAgentId === jarvisJudgeConfig.agentId),
919
+ // Only the judge's own tool sessions get the relay tool, and even then its
920
+ // handler refuses unless a human turn is driving. Identity-keyed, like the
921
+ // read-only surface, so the agent cannot grant it to itself.
922
+ judgeRelayGate: jarvisJudgeConfig.agentId !== null && runtime.callerAgentId === jarvisJudgeConfig.agentId
923
+ ? judgeRelayGate
924
+ : undefined,
852
925
  resolveSpeakHandler: (agentId) => wsServer?.resolveVoiceSpeakHandler(agentId) ?? null,
853
926
  resolveCallerContext: (agentId) => wsServer?.resolveVoiceCallerContext(agentId) ?? null,
854
927
  logger,