@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.
- package/dist/server/server/agent/agent-loading.js +24 -3
- package/dist/server/server/agent/agent-manager.d.ts +22 -0
- package/dist/server/server/agent/agent-manager.js +36 -0
- package/dist/server/server/agent/agent-storage.d.ts +9 -0
- package/dist/server/server/agent/blocker-log.d.ts +81 -0
- package/dist/server/server/agent/blocker-log.js +113 -0
- package/dist/server/server/agent/card-move-log.d.ts +66 -0
- package/dist/server/server/agent/card-move-log.js +113 -0
- package/dist/server/server/agent/jarvis-judge.d.ts +121 -0
- package/dist/server/server/agent/jarvis-judge.js +225 -0
- package/dist/server/server/agent/judge-relay-gate.d.ts +70 -0
- package/dist/server/server/agent/judge-relay-gate.js +92 -0
- package/dist/server/server/agent/mcp-server.js +9 -0
- package/dist/server/server/agent/mcp-shared.d.ts +5 -0
- package/dist/server/server/agent/providers/claude/agent.js +38 -0
- package/dist/server/server/agent/providers/claude/transport/redact.d.ts +6 -0
- package/dist/server/server/agent/providers/claude/transport/redact.js +29 -1
- package/dist/server/server/agent/providers/claude/transport/transcript-sdk-reader.js +42 -3
- package/dist/server/server/agent/session-digest-generator.d.ts +27 -0
- package/dist/server/server/agent/session-digest-generator.js +208 -17
- package/dist/server/server/agent/tools/paseo-tools.d.ts +12 -0
- package/dist/server/server/agent/tools/paseo-tools.js +48 -0
- package/dist/server/server/agent/tools/read-only-surface.d.ts +52 -0
- package/dist/server/server/agent/tools/read-only-surface.js +68 -0
- package/dist/server/server/agent/tools/types.d.ts +5 -0
- package/dist/server/server/bootstrap.js +73 -0
- package/dist/server/web-ui/_expo/static/js/web/{index-2cc86a7b26f9ded75a76c1d06ce8197c.js → index-5a54792f78b8475572ccfac9808dd926.js} +6 -6
- package/dist/server/web-ui/_expo/static/js/web/index-5a54792f78b8475572ccfac9808dd926.js.br +0 -0
- package/dist/server/web-ui/_expo/static/js/web/index-5a54792f78b8475572ccfac9808dd926.js.gz +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{index-2cc86a7b26f9ded75a76c1d06ce8197c.js.map.br → index-5a54792f78b8475572ccfac9808dd926.js.map.br} +0 -0
- package/dist/server/web-ui/_expo/static/js/web/{index-2cc86a7b26f9ded75a76c1d06ce8197c.js.map.gz → index-5a54792f78b8475572ccfac9808dd926.js.map.gz} +0 -0
- package/dist/server/web-ui/index.html +1 -1
- package/dist/server/web-ui/index.html.br +0 -0
- package/dist/server/web-ui/index.html.gz +0 -0
- package/package.json +6 -6
- package/dist/server/web-ui/_expo/static/js/web/index-2cc86a7b26f9ded75a76c1d06ce8197c.js.br +0 -0
- 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,
|