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.
- package/README.md +4 -4
- package/dist/apps/panel/index.html +355 -86
- package/dist/src/adapters/pi/extension.js +130 -0
- package/dist/src/adapters/pi/extension.js.map +1 -1
- package/dist/src/branding.js +1 -0
- package/dist/src/branding.js.map +1 -1
- package/dist/src/panel/extension.js +41 -3
- package/dist/src/panel/extension.js.map +1 -1
- package/dist/src/panel/hub.d.ts +81 -0
- package/dist/src/panel/hub.js +122 -0
- package/dist/src/panel/hub.js.map +1 -0
- package/dist/src/panel/server.d.ts +3 -0
- package/dist/src/panel/server.js +77 -1
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/panel/workbench.js +8 -1
- package/dist/src/panel/workbench.js.map +1 -1
- package/dist/src/session/help.js +2 -1
- package/dist/src/session/help.js.map +1 -1
- package/dist/src/tui/wake-options.d.ts +33 -0
- package/dist/src/tui/wake-options.js +131 -0
- package/dist/src/tui/wake-options.js.map +1 -0
- package/dist/src/wake-options/runtime.d.ts +30 -0
- package/dist/src/wake-options/runtime.js +70 -0
- package/dist/src/wake-options/runtime.js.map +1 -0
- package/package.json +1 -1
package/dist/src/branding.js.map
CHANGED
|
@@ -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
|
|
31
|
-
|
|
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;
|
|
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. */
|
package/dist/src/panel/server.js
CHANGED
|
@@ -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 = [
|
|
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" });
|