psyclaw 0.29.9 → 0.29.10

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.
@@ -1 +1 @@
1
- {"version":3,"file":"branding.js","sourceRoot":"","sources":["../../src/branding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"branding.js","sourceRoot":"","sources":["../../src/branding.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import { closeResearchWorkbench, openResearchWorkbench } from "./workbench.js";
2
+ import { extractAssistantDelta, extractAssistantText, messageIdOf, panelHub, } from "./hub.js";
2
3
  /**
3
4
  * Optional Pi extension for the local web projection. Binding is always loopback.
4
5
  */
5
6
  export default function psyclawPanelExtension(pi) {
7
+ let streamSeq = 0;
6
8
  pi.registerCommand("panel", {
7
9
  description: "打开科研工作台(浏览器)",
8
10
  handler: async (args, ctx) => {
@@ -27,8 +29,44 @@ export default function psyclawPanelExtension(pi) {
27
29
  }
28
30
  },
29
31
  });
30
- pi.on("session_shutdown", async () => {
31
- await closeResearchWorkbench();
32
- });
32
+ if (typeof pi.on === "function") {
33
+ pi.on("message_start", (event) => {
34
+ const message = event.message;
35
+ if (message?.role !== "assistant")
36
+ return;
37
+ const messageId = messageIdOf(event.message, `msg_${++streamSeq}`);
38
+ panelHub.broadcast({ type: "assistant_start", messageId });
39
+ });
40
+ pi.on("message_update", (event) => {
41
+ const message = event.message;
42
+ if (message?.role !== "assistant")
43
+ return;
44
+ const messageId = messageIdOf(event.message, `msg_${streamSeq || ++streamSeq}`);
45
+ const text = extractAssistantText(event.message);
46
+ const delta = extractAssistantDelta(event.assistantMessageEvent);
47
+ if (!delta && !text)
48
+ return;
49
+ panelHub.broadcast({
50
+ type: "assistant_delta",
51
+ messageId,
52
+ delta: delta || "",
53
+ text,
54
+ });
55
+ });
56
+ pi.on("message_end", (event) => {
57
+ const message = event.message;
58
+ if (message?.role !== "assistant")
59
+ return;
60
+ const messageId = messageIdOf(event.message, `msg_${streamSeq || ++streamSeq}`);
61
+ const text = extractAssistantText(event.message);
62
+ panelHub.broadcast({ type: "assistant_end", messageId, text });
63
+ });
64
+ pi.on("agent_settled", () => {
65
+ panelHub.broadcast({ type: "agent_settled" });
66
+ });
67
+ pi.on("session_shutdown", async () => {
68
+ await closeResearchWorkbench();
69
+ });
70
+ }
33
71
  }
34
72
  //# sourceMappingURL=extension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/panel/extension.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE/E;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,EAAgB;IAC5D,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE;QAC1B,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,OAAO,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;gBACjD,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,qBAAqB,CAAC;oBAClD,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,gBAAgB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,gBAAgB,EAAE;oBAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE;oBAC1B,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;iBAClF,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzB,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,MAAM,CAAC,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,gBAAgB,GAAG,EAAE,EAClD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAC5B,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACtE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;QACnC,MAAM,sBAAsB,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../src/panel/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { ServerResponse } from "node:http";
2
+ export type WakeOptionsMode = "choice" | "checklist";
3
+ export interface WakeOptionItem {
4
+ id: string;
5
+ label: string;
6
+ description?: string;
7
+ /** Pre-checked for checklist mode. */
8
+ checked?: boolean;
9
+ }
10
+ export interface WakeOptionsPrompt {
11
+ id: string;
12
+ title: string;
13
+ prompt?: string;
14
+ mode: WakeOptionsMode;
15
+ options: WakeOptionItem[];
16
+ allowMultiple?: boolean;
17
+ minSelections?: number;
18
+ /** When true (default for checklist), apply selections to `.psyclaw/verify-checklist.json`. */
19
+ syncVerify?: boolean;
20
+ createdAt: string;
21
+ expiresAt: string;
22
+ }
23
+ export interface WakeOptionsAnswer {
24
+ promptId: string;
25
+ selectedIds: string[];
26
+ source: "panel" | "cli" | "timeout" | "cancel";
27
+ notes?: string;
28
+ }
29
+ export type PanelHubEvent = {
30
+ type: "assistant_start";
31
+ messageId: string;
32
+ } | {
33
+ type: "assistant_delta";
34
+ messageId: string;
35
+ delta: string;
36
+ text: string;
37
+ } | {
38
+ type: "assistant_end";
39
+ messageId: string;
40
+ text: string;
41
+ } | {
42
+ type: "agent_settled";
43
+ } | {
44
+ type: "user_echo";
45
+ text: string;
46
+ } | {
47
+ type: "wake_options";
48
+ prompt: WakeOptionsPrompt;
49
+ } | {
50
+ type: "wake_options_resolved";
51
+ promptId: string;
52
+ answer: WakeOptionsAnswer;
53
+ } | {
54
+ type: "ping";
55
+ at: string;
56
+ };
57
+ /**
58
+ * In-process hub bridging the Pi CLI session and Panel SSE clients.
59
+ * One process owns both the interactive session and the loopback Panel.
60
+ */
61
+ export declare class PanelHub {
62
+ private readonly clients;
63
+ private readonly wakeWaiters;
64
+ private pendingWake;
65
+ subscriberCount(): number;
66
+ /** True when at least one Panel browser tab is listening on SSE. */
67
+ hasPanelClients(): boolean;
68
+ getPendingWake(): WakeOptionsPrompt | undefined;
69
+ subscribe(response: ServerResponse): () => void;
70
+ broadcast(event: PanelHubEvent): void;
71
+ publishWake(prompt: WakeOptionsPrompt, timeoutMs: number): Promise<WakeOptionsAnswer>;
72
+ resolveWake(answer: WakeOptionsAnswer): boolean;
73
+ cancelWake(promptId: string, source?: "panel" | "cli" | "cancel"): boolean;
74
+ }
75
+ /** Process-wide hub shared by workbench server and Pi panel extension. */
76
+ export declare const panelHub: PanelHub;
77
+ /** Extract plain assistant text from a Pi AgentMessage-shaped object. */
78
+ export declare function extractAssistantText(message: unknown): string;
79
+ /** Extract streaming text delta from Pi assistantMessageEvent when present. */
80
+ export declare function extractAssistantDelta(assistantMessageEvent: unknown): string;
81
+ export declare function messageIdOf(message: unknown, fallback: string): string;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * In-process hub bridging the Pi CLI session and Panel SSE clients.
3
+ * One process owns both the interactive session and the loopback Panel.
4
+ */
5
+ export class PanelHub {
6
+ clients = new Set();
7
+ wakeWaiters = new Map();
8
+ pendingWake;
9
+ subscriberCount() {
10
+ return this.clients.size;
11
+ }
12
+ /** True when at least one Panel browser tab is listening on SSE. */
13
+ hasPanelClients() {
14
+ return this.clients.size > 0;
15
+ }
16
+ getPendingWake() {
17
+ return this.pendingWake;
18
+ }
19
+ subscribe(response) {
20
+ this.clients.add(response);
21
+ response.write(`event: ready\ndata: ${JSON.stringify({ ok: true, at: new Date().toISOString() })}\n\n`);
22
+ if (this.pendingWake) {
23
+ response.write(`event: wake_options\ndata: ${JSON.stringify({ type: "wake_options", prompt: this.pendingWake })}\n\n`);
24
+ }
25
+ return () => {
26
+ this.clients.delete(response);
27
+ };
28
+ }
29
+ broadcast(event) {
30
+ const name = event.type;
31
+ const payload = `event: ${name}\ndata: ${JSON.stringify(event)}\n\n`;
32
+ for (const client of this.clients) {
33
+ try {
34
+ client.write(payload);
35
+ }
36
+ catch {
37
+ this.clients.delete(client);
38
+ }
39
+ }
40
+ }
41
+ publishWake(prompt, timeoutMs) {
42
+ if (this.wakeWaiters.has(prompt.id)) {
43
+ return Promise.reject(new Error(`wake-options id already pending: ${prompt.id}`));
44
+ }
45
+ this.pendingWake = prompt;
46
+ this.broadcast({ type: "wake_options", prompt });
47
+ return new Promise((resolve, reject) => {
48
+ const timer = setTimeout(() => {
49
+ this.wakeWaiters.delete(prompt.id);
50
+ if (this.pendingWake?.id === prompt.id)
51
+ this.pendingWake = undefined;
52
+ const answer = {
53
+ promptId: prompt.id,
54
+ selectedIds: [],
55
+ source: "timeout",
56
+ };
57
+ this.broadcast({ type: "wake_options_resolved", promptId: prompt.id, answer });
58
+ resolve(answer);
59
+ }, timeoutMs);
60
+ this.wakeWaiters.set(prompt.id, { resolve, reject, timer });
61
+ });
62
+ }
63
+ resolveWake(answer) {
64
+ const waiter = this.wakeWaiters.get(answer.promptId);
65
+ if (!waiter)
66
+ return false;
67
+ clearTimeout(waiter.timer);
68
+ this.wakeWaiters.delete(answer.promptId);
69
+ if (this.pendingWake?.id === answer.promptId)
70
+ this.pendingWake = undefined;
71
+ this.broadcast({ type: "wake_options_resolved", promptId: answer.promptId, answer });
72
+ waiter.resolve(answer);
73
+ return true;
74
+ }
75
+ cancelWake(promptId, source = "cancel") {
76
+ return this.resolveWake({ promptId, selectedIds: [], source });
77
+ }
78
+ }
79
+ /** Process-wide hub shared by workbench server and Pi panel extension. */
80
+ export const panelHub = new PanelHub();
81
+ /** Extract plain assistant text from a Pi AgentMessage-shaped object. */
82
+ export function extractAssistantText(message) {
83
+ if (!message || typeof message !== "object")
84
+ return "";
85
+ const row = message;
86
+ if (row.role !== undefined && row.role !== "assistant")
87
+ return "";
88
+ if (typeof row.content === "string")
89
+ return row.content;
90
+ if (!Array.isArray(row.content))
91
+ return "";
92
+ return row.content.map((part) => {
93
+ if (typeof part === "string")
94
+ return part;
95
+ if (!part || typeof part !== "object")
96
+ return "";
97
+ const item = part;
98
+ if (item.type === "text" && typeof item.text === "string")
99
+ return item.text;
100
+ return "";
101
+ }).join("");
102
+ }
103
+ /** Extract streaming text delta from Pi assistantMessageEvent when present. */
104
+ export function extractAssistantDelta(assistantMessageEvent) {
105
+ if (!assistantMessageEvent || typeof assistantMessageEvent !== "object")
106
+ return "";
107
+ const event = assistantMessageEvent;
108
+ if (event.type === "text_delta" && typeof event.delta === "string")
109
+ return event.delta;
110
+ if (typeof event.delta === "string")
111
+ return event.delta;
112
+ return "";
113
+ }
114
+ export function messageIdOf(message, fallback) {
115
+ if (message && typeof message === "object") {
116
+ const row = message;
117
+ if (typeof row.id === "string" && row.id.trim())
118
+ return row.id;
119
+ }
120
+ return fallback;
121
+ }
122
+ //# sourceMappingURL=hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub.js","sourceRoot":"","sources":["../../../src/panel/hub.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { type Server } from "node:http";
2
+ import { type PanelHub } from "./hub.js";
2
3
  export { verifyDoi } from "../core/doi.js";
3
4
  export interface ProjectDocument {
4
5
  path: string;
@@ -37,6 +38,8 @@ export interface PanelServerOptions {
37
38
  assistant?: (message: string) => Promise<{
38
39
  text: string;
39
40
  }>;
41
+ /** Shared SSE / wake-options hub (defaults to process singleton). */
42
+ hub?: PanelHub;
40
43
  /** Queue an approved installation task into the current PsyClaw model session. */
41
44
  installSkill?: (task: string) => Promise<void>;
42
45
  /** Queue an explicitly requested external-tool installation task. */
@@ -8,6 +8,7 @@ import { getAgentDir } from "@earendil-works/pi-coding-agent";
8
8
  import { listRuns, projectRunSnapshot } from "./projection.js";
9
9
  import { readSessionUsage } from "./usage.js";
10
10
  import { buildClaimLiteratureMap } from "./literature-map.js";
11
+ import { panelHub } from "./hub.js";
11
12
  import { discoverAgents } from "../agents/discover.js";
12
13
  import { KNOWN_AGENTS } from "../agents/catalog.js";
13
14
  import { recommendedAgentsForPanel } from "../agents/recommended-personas.js";
@@ -780,13 +781,22 @@ export function createPanelServer(root, options = {}) {
780
781
  // `dist/apps/panel`, keeping the same relative layout in src and dist.
781
782
  const panelHtmlPath = options.panelHtmlPath ??
782
783
  join(dirname(fileURLToPath(import.meta.url)), "..", "..", "apps", "panel", "index.html");
784
+ const hub = options.hub ?? panelHub;
783
785
  return createServer(async (request, response) => {
784
786
  const url = new URL(request.url ?? "/", "http://localhost");
785
787
  // Read-only surface: any write method is rejected before routing.
786
788
  // The panel is intentionally limited to ecosystem management and Provider
787
789
  // configuration. Project files, runs, evidence and manuscripts are read
788
790
  // only projections; legacy mutation routes remain unavailable over HTTP.
789
- const panelWriteRoutes = ["/api/provider-config", "/api/recommendation-state", "/api/install/execute", "/api/active-provider", "/api/assistant"];
791
+ const panelWriteRoutes = [
792
+ "/api/provider-config",
793
+ "/api/recommendation-state",
794
+ "/api/install/execute",
795
+ "/api/active-provider",
796
+ "/api/assistant",
797
+ "/api/crosscheck",
798
+ "/api/wake-options/respond",
799
+ ];
790
800
  // Kept false for source compatibility with the legacy handler below; the
791
801
  // method gate above makes pause/resume unreachable from the panel API.
792
802
  const runAction = false;
@@ -796,6 +806,72 @@ export function createPanelServer(root, options = {}) {
796
806
  return;
797
807
  }
798
808
  try {
809
+ if (url.pathname === "/api/assistant/stream") {
810
+ response.writeHead(200, {
811
+ "content-type": "text/event-stream; charset=utf-8",
812
+ "cache-control": "no-cache, no-transform",
813
+ connection: "keep-alive",
814
+ "x-accel-buffering": "no",
815
+ });
816
+ response.write(":\n\n");
817
+ const unsubscribe = hub.subscribe(response);
818
+ const heartbeat = setInterval(() => {
819
+ try {
820
+ response.write(`event: ping\ndata: ${JSON.stringify({ type: "ping", at: new Date().toISOString() })}\n\n`);
821
+ }
822
+ catch {
823
+ clearInterval(heartbeat);
824
+ unsubscribe();
825
+ }
826
+ }, 15_000);
827
+ request.on("close", () => {
828
+ clearInterval(heartbeat);
829
+ unsubscribe();
830
+ });
831
+ return;
832
+ }
833
+ if (url.pathname === "/api/wake-options/pending") {
834
+ const prompt = hub.getPendingWake();
835
+ response.writeHead(200, { "content-type": "application/json" });
836
+ response.end(JSON.stringify({
837
+ schemaVersion: "psyclaw/wake-options-pending/v1",
838
+ prompt: prompt ?? null,
839
+ panelClients: hub.subscriberCount(),
840
+ }));
841
+ return;
842
+ }
843
+ if (url.pathname === "/api/wake-options/respond") {
844
+ if (request.method !== "POST") {
845
+ response.writeHead(405, { "content-type": "application/json", allow: "POST" });
846
+ response.end(JSON.stringify({ error: "method not allowed" }));
847
+ return;
848
+ }
849
+ const body = await readJsonBody(request);
850
+ const promptId = String(body.promptId ?? "").trim();
851
+ const selectedIds = Array.isArray(body.selectedIds)
852
+ ? body.selectedIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean)
853
+ : [];
854
+ const cancelled = body.cancel === true;
855
+ if (!promptId) {
856
+ response.writeHead(400, { "content-type": "application/json" });
857
+ response.end(JSON.stringify({ error: "promptId is required" }));
858
+ return;
859
+ }
860
+ const answer = {
861
+ promptId,
862
+ selectedIds: cancelled ? [] : selectedIds,
863
+ source: cancelled ? "cancel" : "panel",
864
+ ...(typeof body.notes === "string" && body.notes.trim() ? { notes: body.notes.trim() } : {}),
865
+ };
866
+ const ok = hub.resolveWake(answer);
867
+ response.writeHead(ok ? 200 : 409, { "content-type": "application/json" });
868
+ response.end(JSON.stringify({
869
+ schemaVersion: "psyclaw/wake-options-receipt/v1",
870
+ ok,
871
+ answer,
872
+ }));
873
+ return;
874
+ }
799
875
  if (url.pathname === "/api/runs") {
800
876
  const runs = await listRuns(root);
801
877
  response.writeHead(200, { "content-type": "application/json" });