@pi-harness/client-web 0.1.1

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.
@@ -0,0 +1,102 @@
1
+ export interface ClientStatus {
2
+ readonly status: string;
3
+ readonly model: string;
4
+ readonly messages: number;
5
+ readonly events: number;
6
+ readonly sessionId: string;
7
+ readonly sessionFile?: string;
8
+ readonly cwd: string;
9
+ readonly agentDir: string;
10
+ readonly plugins: readonly string[];
11
+ }
12
+ export interface ClientSession {
13
+ readonly sessionId: string;
14
+ readonly sessionFile?: string;
15
+ readonly messages: readonly Record<string, unknown>[];
16
+ readonly entries: readonly unknown[];
17
+ readonly events: readonly Record<string, unknown>[];
18
+ }
19
+ export interface ClientModel {
20
+ readonly provider: string;
21
+ readonly id: string;
22
+ readonly name: string;
23
+ readonly reasoning: boolean;
24
+ readonly contextWindow: number | null;
25
+ readonly active: boolean;
26
+ }
27
+ export interface ClientPlugin {
28
+ readonly id: string;
29
+ readonly name: string;
30
+ readonly enabled: boolean;
31
+ readonly state: string;
32
+ }
33
+ export interface ClientProvider {
34
+ readonly provider: string;
35
+ readonly name: string;
36
+ readonly active: boolean;
37
+ readonly auth?: {
38
+ readonly configured?: boolean;
39
+ readonly source?: string;
40
+ readonly label?: string;
41
+ };
42
+ readonly activeModel?: ClientModel;
43
+ readonly models: readonly ClientModel[];
44
+ }
45
+ export interface ClientCommand {
46
+ readonly name: string;
47
+ readonly invocationName: string;
48
+ readonly description?: string;
49
+ readonly source?: string;
50
+ }
51
+ export interface ClientFile {
52
+ readonly path: string;
53
+ readonly status: string;
54
+ readonly label: string;
55
+ }
56
+ export interface ClientApi {
57
+ getStatus(): Promise<ClientStatus>;
58
+ getSession(): Promise<ClientSession>;
59
+ getFiles(): Promise<readonly ClientFile[]>;
60
+ getFileDiff(path: string): Promise<{
61
+ path: string;
62
+ diff: string;
63
+ }>;
64
+ commitFiles(paths: readonly string[], message: string): Promise<{
65
+ committed: boolean;
66
+ commit?: string;
67
+ message: string;
68
+ }>;
69
+ revertFiles(paths: readonly string[]): Promise<{
70
+ reverted: boolean;
71
+ paths: readonly string[];
72
+ }>;
73
+ prompt(value: string): Promise<{
74
+ reply: string;
75
+ messages: number;
76
+ }>;
77
+ abort(): Promise<{
78
+ aborted: boolean;
79
+ }>;
80
+ createSession(): Promise<ClientSession>;
81
+ openSession(path: string): Promise<ClientSession>;
82
+ listSessions(): Promise<readonly Record<string, unknown>[]>;
83
+ listModels(): Promise<readonly ClientModel[]>;
84
+ listProviders(): Promise<readonly ClientProvider[]>;
85
+ testProvider(provider: string): Promise<{
86
+ provider: string;
87
+ reachable: boolean;
88
+ auth?: unknown;
89
+ }>;
90
+ refreshProvider(provider: string): Promise<{
91
+ provider: string;
92
+ models: readonly ClientModel[];
93
+ }>;
94
+ listPlugins(): Promise<readonly ClientPlugin[]>;
95
+ listCommands(): Promise<readonly ClientCommand[]>;
96
+ selectModel(provider: string, model: string): Promise<{
97
+ model: ClientModel;
98
+ }>;
99
+ subscribeEvents(onEvent: (payload: Record<string, unknown>) => void): () => void;
100
+ }
101
+ export declare function createClientApi(): ClientApi;
102
+ //# sourceMappingURL=control-room.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-room.d.ts","sourceRoot":"","sources":["../src/control-room.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ function requestJson(path, init) { return fetch(path, init).then(async (response) => { const payload = await response.json(); if (!response.ok) {
2
+ const error = payload !== null && typeof payload === "object" && "error" in payload && typeof payload.error === "string" ? payload.error : `Request failed with status ${response.status}`;
3
+ throw new Error(error);
4
+ } return payload; }); }
5
+ export function createClientApi() { return { getStatus: () => requestJson("/api/status"), getSession: () => requestJson("/api/session"), getFiles: async () => (await requestJson("/api/files")).items, getFileDiff: (path) => requestJson(`/api/files/diff?path=${encodeURIComponent(path)}`), commitFiles: (paths, message) => requestJson("/api/files/commit", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ paths, message }) }), revertFiles: (paths) => requestJson("/api/files/revert", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ paths, confirm: true }) }), prompt: (value) => requestJson("/api/prompt", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ prompt: value }) }), abort: () => requestJson("/api/abort", { method: "POST" }), createSession: () => requestJson("/api/session/new", { method: "POST" }), openSession: (path) => requestJson("/api/session/open", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ path }) }), listSessions: async () => (await requestJson("/api/sessions")).items, listModels: async () => (await requestJson("/api/models")).items, listProviders: async () => (await requestJson("/api/providers")).items, testProvider: (provider) => requestJson("/api/providers/test", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ provider }) }), refreshProvider: (provider) => requestJson("/api/providers/refresh", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ provider }) }), listPlugins: async () => (await requestJson("/api/plugins")).items, listCommands: async () => (await requestJson("/api/commands")).items, selectModel: (provider, model) => requestJson("/api/model", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ provider, model }) }), subscribeEvents: (onEvent) => { if (typeof EventSource === "undefined")
6
+ return () => { }; const source = new EventSource("/api/events"); source.onmessage = (event) => { try {
7
+ const raw = event.data;
8
+ if (typeof raw === "string")
9
+ onEvent(JSON.parse(raw));
10
+ }
11
+ catch { /* Ignore malformed frames at the network boundary. */ } }; return () => source.close(); } }; }
12
+ //# sourceMappingURL=control-room.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-room.js","sourceRoot":"","sources":["../src/control-room.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ export interface DesignWorkspace {
2
+ readonly path: string;
3
+ readonly sessions: string;
4
+ readonly live: boolean;
5
+ readonly branch: string;
6
+ readonly dirty: string;
7
+ }
8
+ export interface DesignSession {
9
+ readonly id: string;
10
+ readonly title: string;
11
+ readonly meta: string;
12
+ readonly state: "running" | "ok" | "warn" | "error";
13
+ readonly group: "今天" | "昨天" | "更早";
14
+ readonly ws: string;
15
+ }
16
+ export interface DesignTurn {
17
+ readonly kind: "user" | "reasoning" | "plugin" | "tool" | "text" | "approval" | "subagent" | "todo" | "stats";
18
+ readonly text?: string;
19
+ readonly name?: string;
20
+ readonly hook?: string;
21
+ readonly target?: string;
22
+ readonly output?: string;
23
+ readonly dur?: string;
24
+ readonly stat?: string;
25
+ readonly statFg?: string;
26
+ readonly glyph?: string;
27
+ readonly isDiff?: boolean;
28
+ readonly diff?: readonly {
29
+ no: string;
30
+ sign: string;
31
+ text: string;
32
+ }[];
33
+ readonly preset?: string;
34
+ readonly goal?: string;
35
+ readonly lineage?: string;
36
+ readonly steps?: readonly {
37
+ tool: string;
38
+ target: string;
39
+ dur: string;
40
+ }[];
41
+ readonly verdict?: string;
42
+ readonly progress?: string;
43
+ readonly todos?: readonly {
44
+ text: string;
45
+ done: boolean;
46
+ }[];
47
+ readonly stats?: readonly string[];
48
+ }
49
+ export interface DesignEvent {
50
+ readonly ts: string;
51
+ readonly source: string;
52
+ readonly summary: string;
53
+ readonly by: string;
54
+ readonly dur: string;
55
+ }
56
+ export interface DesignPlugin {
57
+ readonly name: string;
58
+ readonly ver: string;
59
+ readonly capability: string;
60
+ readonly on: boolean;
61
+ readonly update: boolean;
62
+ readonly local?: boolean;
63
+ readonly desc: string;
64
+ readonly hooks: readonly string[];
65
+ }
66
+ export interface DesignProvider {
67
+ readonly id: string;
68
+ readonly name: string;
69
+ readonly state: string;
70
+ readonly ok: boolean;
71
+ readonly protocol: "openai" | "anthropic";
72
+ readonly baseUrl: string;
73
+ readonly key: string;
74
+ readonly models: readonly string[];
75
+ readonly latency: string;
76
+ readonly by: string;
77
+ }
78
+ export declare const DESIGN_WORKSPACES: readonly DesignWorkspace[];
79
+ export declare const DESIGN_SESSIONS: readonly DesignSession[];
80
+ export declare const DESIGN_TURNS: readonly DesignTurn[];
81
+ export declare const DESIGN_EVENTS: readonly DesignEvent[];
82
+ export declare const DESIGN_PLUGINS: readonly DesignPlugin[];
83
+ export declare const DESIGN_PROVIDERS: readonly DesignProvider[];
84
+ export declare const DESIGN_TOML = "# ~/.config/pi/pi.toml\n# \u4E00\u5207\u90FD\u662F\u5305\uFF1A\u6A21\u578B\u3001\u5DE5\u5177\u3001\u6C99\u7BB1\u3001\u5B58\u50A8\u3001\u754C\u9762\u90FD\u5728\u8FD9\u91CC\u88C5\u5378\u3002\n\n[agent]\npreset = \"coder\"\nmodel = \"ds-coder-v3\"\nmax_steps = 40\nbudget_usd = 1.50\nask_before = [\"write\", \"shell\", \"network\"]\n\n[sandbox]\nbackend = \"landlock\"\nwritable = [\".\"]\nnetwork = false\n\n[context]\nwindow = 64000\ncompact_at = 0.82\n\n[[packages]]\nname = \"context-repo-map\"\nversion = \"1.4.2\"\n\n[[packages]]\nname = \"guard-secret-scan\"\nversion = \"2.0.1\"\n\n[[packages]]\nname = \"subagent-review\"\nversion = \"0.8.5\"\n\n[[packages]]\npath = \"../pi-pkg-vision-handoff\" # \u672C\u5730\u5F00\u53D1\u4E2D\n\n[keys]\npalette = \"cmd+k\"\nsettings = \"cmd+,\"\ninterrupt = \"ctrl+c\"\n";
85
+ //# sourceMappingURL=design-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-contract.d.ts","sourceRoot":"","sources":["../src/design-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ export const DESIGN_WORKSPACES = [
2
+ { path: "~/work/checkout-svc", sessions: "6", live: true, branch: "fix/3ds-timeout", dirty: "4 处未提交" },
3
+ { path: "~/work/pi-harness", sessions: "12", live: false, branch: "main", dirty: "干净" },
4
+ { path: "~/scratch/spike-otel", sessions: "2", live: false, branch: "spike", dirty: "12 处未提交" },
5
+ ];
6
+ export const DESIGN_SESSIONS = [
7
+ { id: "s1", title: "修复 3DS 超时导致的支付失败", meta: "ds-coder-v3 · 14 步 · 4 分钟前", state: "running", group: "今天", ws: "~/work/checkout-svc" },
8
+ { id: "s2", title: "为 refund 模块补单测", meta: "ds-coder-v3 · 22 步 · 1 小时前", state: "ok", group: "今天", ws: "~/work/checkout-svc" },
9
+ { id: "s3", title: "梳理仓库结构与主要包", meta: "ds-chat · 6 步 · 3 小时前", state: "ok", group: "今天", ws: "~/work/pi-harness" },
10
+ { id: "s4", title: "把 webhook 重试改成指数退避", meta: "ds-coder-v3 · 31 步 · 昨天", state: "warn", group: "昨天", ws: "~/work/checkout-svc" },
11
+ { id: "s5", title: "升级 pnpm 到 10 并修构建", meta: "ds-coder-v3 · 48 步 · 昨天", state: "error", group: "昨天", ws: "~/work/pi-harness" },
12
+ { id: "s6", title: "给 CI 加 e2e 冒烟任务", meta: "ds-coder-v3 · 19 步 · 本周一", state: "ok", group: "更早", ws: "~/scratch/spike-otel" },
13
+ ];
14
+ export const DESIGN_TURNS = [
15
+ { kind: "user", text: "支付成功率从昨天上线后掉了很多,日志里全是 3DS challenge timeout。定位一下,能改就直接改,改完跑测试。" },
16
+ { kind: "reasoning", dur: "6s", text: "先找超时配置在哪定义,再看是不是 2.4.0 版本引入的默认值变化。优先只读检索,确认后再动代码。" },
17
+ { kind: "plugin", name: "context-repo-map", hook: "context_provider", text: "注入仓库地图与最近 3 次提交摘要(1,842 tok)" },
18
+ { kind: "tool", glyph: "⌕", name: "grep", target: "\"3DS\" src/**/*.ts", dur: "0.4s", stat: "12 命中", statFg: "#61666B", output: "src/payment/threeds.ts:41 const CHALLENGE_TIMEOUT_MS = 8_000\nsrc/payment/threeds.ts:88 if (elapsed > CHALLENGE_TIMEOUT_MS) throw new ChallengeTimeout\nsrc/payment/gateway.ts:114 retries: 0\ntest/payment/threeds.spec.ts:23 vi.advanceTimersByTime(8_100)" },
19
+ { kind: "tool", glyph: "▤", name: "read", target: "src/payment/threeds.ts:30-96", dur: "0.1s", stat: "66 行", statFg: "#61666B", output: "const CHALLENGE_TIMEOUT_MS = 8_000\n\nexport async function runChallenge(ctx: Ctx) {\n const started = now()\n const res = await sdk.challenge(ctx.token) // sdk 2.4.0\n const elapsed = now() - started\n if (elapsed > CHALLENGE_TIMEOUT_MS) throw new ChallengeTimeout()\n return res\n}" },
20
+ { kind: "text", text: "原因找到了:sdk 2.4.0 起 iOS 端 challenge 平均耗时从 3.1s 涨到 9.4s,而我们的超时仍是 8s,且 retries 为 0,一次超时就直接失败。\n\n我按两处改:超时放宽到 20s,并加一次带抖动的重试。" },
21
+ { kind: "tool", glyph: "✎", name: "edit", target: "src/payment/threeds.ts", dur: "0.2s", stat: "+9 −2", statFg: "#22C55E", isDiff: true, diff: [{ no: "41", sign: "-", text: "const CHALLENGE_TIMEOUT_MS = 8_000" }, { no: "41", sign: "+", text: "const CHALLENGE_TIMEOUT_MS = 20_000" }, { no: "42", sign: "+", text: "const CHALLENGE_MAX_ATTEMPTS = 2" }, { no: "86", sign: "-", text: " const res = await sdk.challenge(ctx.token)" }, { no: "86", sign: "+", text: " const res = await withRetry(CHALLENGE_MAX_ATTEMPTS, () =>" }, { no: "87", sign: "+", text: " sdk.challenge(ctx.token), { jitter: true })" }] },
22
+ { kind: "plugin", name: "guard-secret-scan", hook: "before_write", text: "改动无凭据外泄风险,放行" },
23
+ { kind: "approval", name: "bash — pnpm vitest run test/payment", text: "cd ~/work/checkout-svc && pnpm vitest run test/payment --reporter=dot" },
24
+ { kind: "tool", glyph: "$", name: "bash", target: "pnpm vitest run test/payment", dur: "12.4s", stat: "exit 0", statFg: "#22C55E", output: "···········\n Test Files 3 passed (3)\n Tests 27 passed (27)\n Duration 11.8s\n\n✓ threeds.spec.ts (9)\n✓ gateway.spec.ts (12)\n✓ webhook.spec.ts (6)" },
25
+ { kind: "subagent", name: "reviewer", preset: "read-only", goal: "复核 threeds.ts 的改动是否引入回归", dur: "8.1s", lineage: "session #s1 › turn 6 › subagent reviewer(继承 workspace,权限降级为只读)", steps: [{ tool: "read", target: "src/payment/threeds.ts", dur: "0.1s" }, { tool: "read", target: "src/payment/with-retry.ts", dur: "0.1s" }, { tool: "grep", target: "\"CHALLENGE_TIMEOUT_MS\" test/**", dur: "0.3s" }], verdict: "改动本身正确。两点提醒:test/payment/threeds.spec.ts:23 仍按 8s 断言,会在下次改动时误报通过;withRetry 的抖动上限没设,最坏情况下总耗时可能到 44s,建议加 maxTotalMs。" },
26
+ { kind: "todo", progress: "3 / 4", todos: [{ text: "定位超时来源", done: true }, { text: "放宽超时并加重试", done: true }, { text: "跑 payment 相关测试", done: true }, { text: "补一条针对 20s 边界的回归用例", done: false }] },
27
+ { kind: "text", text: "测试全绿。还剩一条回归用例没补:现有 spec 里 `advanceTimersByTime(8_100)` 断言的是旧阈值,需要改成 20s 边界并新增一条「首次超时后重试成功」的用例。要我继续补吗?" },
28
+ { kind: "stats", stats: ["输入 34.2k tok", "缓存命中 61%", "输出 4.8k tok", "用时 1m 42s", "$0.28"] },
29
+ ];
30
+ export const DESIGN_EVENTS = [
31
+ { ts: "02:14:01", source: "system_prompt", summary: "系统提示词组装(preset: coder)", by: "内置", dur: "12ms" },
32
+ { ts: "02:14:01", source: "context_injection", summary: "注入仓库地图与最近提交(1,842 tok)", by: "context-repo-map", dur: "88ms" },
33
+ { ts: "02:14:02", source: "user_message", summary: "支付成功率下降,定位并修复", by: "用户", dur: "—" },
34
+ { ts: "02:14:03", source: "reasoning", summary: "先只读检索超时配置,再判断是否与 sdk 版本相关", by: "ds-coder-v3", dur: "6.0s" },
35
+ { ts: "02:14:09", source: "tool_call", summary: "grep \"3DS\" src/**/*.ts", by: "内置", dur: "0.4s" },
36
+ { ts: "02:14:10", source: "tool_result", summary: "12 命中,定位 threeds.ts:41", by: "内置", dur: "—" },
37
+ { ts: "02:14:11", source: "tool_call", summary: "read src/payment/threeds.ts:30-96", by: "内置", dur: "0.1s" },
38
+ { ts: "02:14:14", source: "tool_call", summary: "edit src/payment/threeds.ts (+9 −2)", by: "内置", dur: "0.2s" },
39
+ { ts: "02:14:14", source: "plugin_hook", summary: "凭据扫描通过,放行写入", by: "guard-secret-scan", dur: "31ms" },
40
+ { ts: "02:14:15", source: "approval", summary: "用户允许一次:bash pnpm vitest", by: "用户", dur: "4.2s" },
41
+ { ts: "02:14:19", source: "tool_call", summary: "bash pnpm vitest run test/payment", by: "内置", dur: "12.4s" },
42
+ { ts: "02:14:32", source: "tool_result", summary: "27 passed,exit 0", by: "内置", dur: "—" },
43
+ { ts: "02:14:33", source: "subagent", summary: "派生 reviewer 子代理复核 diff", by: "subagent-review", dur: "8.1s" },
44
+ { ts: "02:14:41", source: "assistant_message", summary: "给出结论与剩余一条回归用例建议", by: "ds-coder-v3", dur: "2.6s" },
45
+ ];
46
+ export const DESIGN_PLUGINS = [
47
+ { name: "context-repo-map", ver: "1.4.2", capability: "上下文", on: true, update: false, desc: "把仓库结构、入口文件与最近提交压缩成上下文,超预算时自动裁剪", hooks: ["context_provider", "before_step"] },
48
+ { name: "guard-secret-scan", ver: "2.0.1", capability: "策略", on: true, update: true, desc: "写入与提交前扫描凭据、私钥、token,命中即拦截并说明位置", hooks: ["before_write", "before_commit"] },
49
+ { name: "subagent-review", ver: "0.8.5", capability: "子代理", on: true, update: false, desc: "改动落盘后派生只读 reviewer 子代理复核 diff,产出可执行意见", hooks: ["after_write"] },
50
+ { name: "sandbox-landlock", ver: "1.1.0", capability: "沙箱", on: true, update: false, desc: "Linux Landlock 限制子进程可写路径与出网,越权直接拒绝", hooks: ["shell_exec"] },
51
+ { name: "model-deepseek", ver: "3.2.0", capability: "模型", on: true, update: true, desc: "DeepSeek 官方模型路由,支持 prompt 缓存与推理内容透传", hooks: ["model_provider"] },
52
+ { name: "store-sqlite", ver: "1.0.7", capability: "存储", on: true, update: false, desc: "会话事件流落地到本地 SQLite,支持 resume、fork、replay", hooks: ["session_store"] },
53
+ { name: "vision-handoff", ver: "path", capability: "上下文", on: true, update: false, local: true, desc: "图片交给独立视觉模型描述后回填上下文,从本地路径加载(../pi-pkg-vision-handoff)", hooks: ["context_provider"] },
54
+ { name: "notify-webhook", ver: "0.3.1", capability: "通知", on: false, update: false, desc: "任务结束或需要确认时推送到自定义 webhook", hooks: ["after_turn"] },
55
+ ];
56
+ export const DESIGN_PROVIDERS = [
57
+ { id: "deepseek", name: "DeepSeek", state: "已连接", ok: true, protocol: "openai", baseUrl: "https://api.deepseek.com/v1", key: "sk-••••••••••••••••7f3a", models: ["ds-coder-v3", "ds-chat", "ds-reasoner"], latency: "41ms", by: "model-deepseek" },
58
+ { id: "anthropic", name: "Anthropic", state: "已连接", ok: true, protocol: "anthropic", baseUrl: "https://api.anthropic.com", key: "sk-ant-••••••••••2c91", models: ["claude-sonnet", "claude-haiku"], latency: "128ms", by: "model-anthropic" },
59
+ ];
60
+ export const DESIGN_TOML = `# ~/.config/pi/pi.toml
61
+ # 一切都是包:模型、工具、沙箱、存储、界面都在这里装卸。
62
+
63
+ [agent]
64
+ preset = "coder"
65
+ model = "ds-coder-v3"
66
+ max_steps = 40
67
+ budget_usd = 1.50
68
+ ask_before = ["write", "shell", "network"]
69
+
70
+ [sandbox]
71
+ backend = "landlock"
72
+ writable = ["."]
73
+ network = false
74
+
75
+ [context]
76
+ window = 64000
77
+ compact_at = 0.82
78
+
79
+ [[packages]]
80
+ name = "context-repo-map"
81
+ version = "1.4.2"
82
+
83
+ [[packages]]
84
+ name = "guard-secret-scan"
85
+ version = "2.0.1"
86
+
87
+ [[packages]]
88
+ name = "subagent-review"
89
+ version = "0.8.5"
90
+
91
+ [[packages]]
92
+ path = "../pi-pkg-vision-handoff" # 本地开发中
93
+
94
+ [keys]
95
+ palette = "cmd+k"
96
+ settings = "cmd+,"
97
+ interrupt = "ctrl+c"
98
+ `;
99
+ //# sourceMappingURL=design-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-contract.js","sourceRoot":"","sources":["../src/design-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Context } from "@deepseek-ai/cordis";
2
+ import { type ClientApi } from "./control-room.js";
3
+ declare module "@deepseek-ai/cordis" {
4
+ interface Context {
5
+ clientRoot: HTMLElement;
6
+ clientApi: ClientApi;
7
+ }
8
+ }
9
+ export declare class AppWebEntry {
10
+ #private;
11
+ readonly context: Context;
12
+ readonly root: HTMLElement;
13
+ constructor(root: HTMLElement);
14
+ run(): void;
15
+ dispose(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,QAAQ,qBAAqB,CAAC;IAAE,UAAU,OAAO;QAAG,UAAU,EAAE,WAAW,CAAC;QAAC,SAAS,EAAE,SAAS,CAAC;KAAE;CAAE;AAE7G,qBAAa,WAAW;;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;gBAEf,IAAI,EAAE,WAAW;IAC7B,GAAG,IAAI,IAAI;IAML,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAC/B"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import { createElement } from "react";
2
+ import { createRoot } from "react-dom/client";
3
+ import { Context } from "@deepseek-ai/cordis";
4
+ import { ControlRoomView } from "./react-room.js";
5
+ import { createClientApi } from "./control-room.js";
6
+ export class AppWebEntry {
7
+ context;
8
+ root;
9
+ #reactRoot;
10
+ constructor(root) { this.root = root; this.context = new Context(); }
11
+ run() {
12
+ this.context.provide("clientRoot", this.root);
13
+ this.context.provide("clientApi", createClientApi());
14
+ this.#reactRoot = createRoot(this.root);
15
+ this.#reactRoot.render(createElement(ControlRoomView, { api: this.context.clientApi }));
16
+ }
17
+ async dispose() { this.#reactRoot?.unmount(); await this.context.fiber.dispose(); }
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,UAAU,EAAa,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAkB,MAAM,mBAAmB,CAAC;AAIpE,MAAM,OAAO,WAAW;IACb,OAAO,CAAU;IACjB,IAAI,CAAc;IAC3B,UAAU,CAAQ;IAClB,YAAY,IAAiB,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;IAClF,GAAG;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IACD,KAAK,CAAC,OAAO,KAAoB,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;CACnG"}
@@ -0,0 +1,6 @@
1
+ import { type ClientApi } from "./control-room.js";
2
+ export type { ClientApi } from "./control-room.js";
3
+ export declare function ControlRoomView({ api }: {
4
+ api?: ClientApi;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=react-room.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-room.d.ts","sourceRoot":"","sources":["../src/react-room.tsx"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,SAAS,EAAwI,MAAM,mBAAmB,CAAC;AAE1M,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAoDnD,wBAAgB,eAAe,CAAC,EAAE,GAAuB,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,SAAS,CAAA;CAAE,2CAsB/E"}
@@ -0,0 +1,103 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from "react";
3
+ import { createClientApi } from "./control-room.js";
4
+ const value = (input, fallback = "—") => { if (input === undefined || input === null || input === "")
5
+ return fallback; if (typeof input === "string" || typeof input === "number" || typeof input === "boolean" || typeof input === "bigint")
6
+ return String(input); try {
7
+ return JSON.stringify(input);
8
+ }
9
+ catch {
10
+ return fallback;
11
+ } };
12
+ const messageText = (message) => { const content = message.content; if (typeof content === "string")
13
+ return content; if (Array.isArray(content))
14
+ return content.map((part) => typeof part === "string" ? part : typeof part === "object" && part !== null && typeof part.text === "string" ? part.text : "").join(""); return ""; };
15
+ const eventLabel = (event) => value(event.summary ?? event.message ?? event.toolName ?? event.type ?? event.event, "未命名事件");
16
+ const capability = (name) => name.includes("model") ? "模型" : name.includes("tool") ? "工具" : name.includes("session") ? "会话" : name.includes("resource") ? "资源" : name.includes("web") || name.includes("gateway") ? "界面" : "运行时";
17
+ function sessionGroups(sessions) { const now = new Date(); const start = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime(); const yesterday = start - 86_400_000; const groups = new Map(); for (const session of sessions) {
18
+ const raw = session.modified ?? session.created;
19
+ const timestamp = typeof raw === "number" ? raw : typeof raw === "string" ? Date.parse(raw) : Number.NaN;
20
+ const label = Number.isFinite(timestamp) && timestamp >= start ? "今天" : Number.isFinite(timestamp) && timestamp >= yesterday ? "昨天" : "更早";
21
+ groups.set(label, [...(groups.get(label) ?? []), session]);
22
+ } return ["今天", "昨天", "更早"].flatMap((label) => { const items = groups.get(label); return items?.length ? [[label, items]] : []; }); }
23
+ function RuntimeCard({ event }) {
24
+ const type = value(event.type, "event");
25
+ const output = event.output ?? event.result ?? event.message;
26
+ if (type === "tool_execution_start" || type === "tool_execution_end")
27
+ return _jsx("article", { className: "turn runtime-event", children: _jsxs("details", { className: "tool-card", open: type === "tool_execution_end", children: [_jsxs("summary", { className: "tool-head", children: [_jsxs("b", { children: [type === "tool_execution_end" ? "✓" : "▤", " ", value(event.toolName ?? event.name, "tool")] }), _jsx("span", { className: "tool-target", children: value(event.args ?? event.toolCallId ?? event.duration, "运行时工具") })] }), output !== undefined && _jsx("pre", { className: "tool-output", children: typeof output === "string" ? output : JSON.stringify(output, null, 2) })] }) });
28
+ if (type === "message_update" && typeof event.assistantMessageEvent === "object" && event.assistantMessageEvent !== null && event.assistantMessageEvent.type === "thinking_delta")
29
+ return _jsx("article", { className: "turn runtime-event", children: _jsxs("details", { className: "reasoning", children: [_jsx("summary", { className: "reasoning-head", children: "\u601D\u8003" }), _jsx("p", { className: "reasoning-body", children: value(event.assistantMessageEvent.delta, "") })] }) });
30
+ if (["agent_start", "turn_start"].includes(type))
31
+ return _jsx("article", { className: "turn runtime-event", children: _jsxs("div", { className: "plugin-event", children: ["\u25B7 ", type === "agent_start" ? "agent 开始" : "新一轮开始"] }) });
32
+ if (["agent_end", "agent_settled", "turn_end"].includes(type))
33
+ return _jsx("article", { className: "turn runtime-event", children: _jsxs("div", { className: "stats-row", children: ["\u2713 ", type === "agent_settled" ? "agent 已停止" : type === "agent_end" ? "agent 完成" : "本轮完成"] }) });
34
+ if (type === "queue_update")
35
+ return _jsxs("article", { className: "turn runtime-event", children: [_jsx("div", { className: "plugin-event", children: "\u961F\u5217\u66F4\u65B0" }), _jsxs("p", { className: "turn-meta", children: ["steering ", Array.isArray(event.steering) ? event.steering.length : value(event.steering, "0"), " \u00B7 follow-up ", Array.isArray(event.followUp) ? event.followUp.length : value(event.followUp, "0")] })] });
36
+ if (type.startsWith("compaction") || type.startsWith("auto_retry") || type.startsWith("summarization") || type === "bash_execution_update")
37
+ return _jsxs("article", { className: "turn runtime-event", children: [_jsxs("div", { className: "plugin-event", children: ["\u25C8 ", type] }), _jsx("p", { className: "turn-meta", children: typeof output === "string" ? output : JSON.stringify(event) })] });
38
+ return null;
39
+ }
40
+ function Workspace({ status, onCreate, onStarter, onToml }) {
41
+ const starters = [["定位问题", "分析当前仓库并给出根因"], ["修复并测试", "实现修复并运行相关测试"], ["审查改动", "只读检查未提交变更"], ["解释代码", "解释当前文件的关键逻辑"]];
42
+ return _jsxs("div", { className: "new-session-screen", children: [_jsx("span", { className: "pi-mark large", children: "\u03C0" }), _jsx("h2", { children: "\u65B0\u4F1A\u8BDD" }), _jsx("p", { children: "\u9009\u62E9\u5F53\u524D\u8FD0\u884C\u65F6\u5DE5\u4F5C\u533A\u540E\u5F00\u59CB\u771F\u5B9E\u4F1A\u8BDD\u3002" }), _jsxs("div", { className: "workspace-picker", children: [_jsxs("button", { className: "workspace-row", onClick: onCreate, type: "button", children: [_jsx("span", { className: "live", children: "\u25CF" }), _jsxs("span", { children: [_jsx("code", { children: status?.cwd ?? "加载工作区…" }), _jsx("small", { children: status ? `${status.sessionId} · ${status.model}` : "由 /api/status 返回" })] }), _jsx("span", { children: "\u203A" })] }), _jsxs("button", { className: "workspace-row", disabled: true, type: "button", children: [_jsx("span", { className: "offline", children: "\uFF0B" }), _jsxs("span", { children: [_jsx("code", { children: "\u6DFB\u52A0\u76EE\u5F55\u2026" }), _jsx("small", { children: "\u5F53\u524D API \u672A\u63D0\u4F9B\u5DE5\u4F5C\u533A\u7BA1\u7406\u63A5\u53E3" })] })] })] }), _jsxs("div", { className: "effective-config", children: [_jsx("code", { children: "pi.toml \u751F\u6548\u503C" }), _jsx("span", { children: status?.model ?? "由运行时提供" }), _jsx("span", { children: status ? `${status.messages} 条消息` : "—" }), _jsx("a", { href: "#", onClick: (event) => { event.preventDefault(); onToml(); }, children: "\u6539\u914D\u7F6E \u2318," })] }), _jsx("div", { className: "starter-grid", children: starters.map(([title, prompt]) => _jsxs("button", { className: "starter-card", onClick: () => onStarter(prompt), type: "button", children: [_jsx("strong", { children: title }), _jsx("small", { children: prompt })] }, title)) })] });
43
+ }
44
+ function Details({ event, onClose, onCopy }) {
45
+ if (!event)
46
+ return _jsxs("aside", { className: "details-panel", children: [_jsxs("header", { children: [_jsx("strong", { children: "\u4E8B\u4EF6\u8BE6\u60C5" }), _jsx("button", { onClick: onClose, type: "button", children: "\u00D7" })] }), _jsx("div", { className: "details-body", children: _jsx("div", { className: "empty-state", children: "\u9009\u62E9\u8F68\u8FF9\u4E2D\u7684\u4E8B\u4EF6\u67E5\u770B\u539F\u59CB\u6570\u636E\u3002" }) })] });
47
+ const output = event.output ?? event.result ?? event.message;
48
+ const stats = [["来源", value(event.type ?? event.source, "event")], ["产生者", value(event.by ?? event.source)], ["耗时", value(event.duration ?? event.dur)], ["时间", value(event.timestamp ?? event.ts ?? event.time)]];
49
+ return _jsxs("aside", { className: "details-panel", children: [_jsxs("header", { children: [_jsx("strong", { children: eventLabel(event) }), _jsx("button", { onClick: onClose, type: "button", children: "\u00D7" })] }), _jsxs("div", { className: "details-body", children: [_jsx("div", { className: "detail-stats", children: stats.map(([key, item]) => _jsxs("div", { children: [_jsx("small", { children: key }), _jsx("b", { children: item })] }, key)) }), output !== undefined && _jsxs("div", { className: "detail-section", children: [_jsx("small", { children: "\u8F93\u51FA" }), _jsx("pre", { className: "tool-output", children: typeof output === "string" ? output : JSON.stringify(output, null, 2) })] }), _jsxs("div", { className: "detail-section", children: [_jsx("small", { children: "\u7ECF\u8FC7\u7684\u63D2\u4EF6" }), _jsx("div", { className: "detail-plugin", children: "Cordis loader \u00B7 runtime event" })] }), _jsxs("div", { className: "detail-actions", children: [_jsx("button", { onClick: onCopy, type: "button", children: "\u590D\u5236 JSON" }), _jsx("button", { disabled: true, title: "\u5F53\u524D API \u672A\u63D0\u4F9B\u91CD\u653E\u63A5\u53E3", type: "button", children: "\u91CD\u653E" })] }), _jsxs("details", { className: "raw-json", children: [_jsx("summary", { children: "\u539F\u59CB JSON" }), _jsx("pre", { className: "raw-json-body", children: JSON.stringify(event, null, 2) })] })] })] });
50
+ }
51
+ function Trajectory({ events, onSelect }) {
52
+ const [filter, setFilter] = useState("all");
53
+ const counts = useMemo(() => { const map = new Map(); events.forEach((event) => { const type = value(event.type, "event"); map.set(type, (map.get(type) ?? 0) + 1); }); return map; }, [events]);
54
+ const visible = events.filter((event) => filter === "all" || value(event.type, "event") === filter);
55
+ return _jsxs("section", { className: "view-panel trajectory-view", children: [_jsxs("div", { className: "trajectory-summary", children: [_jsx("span", { children: "\u6309\u8F6E\u6B21" }), _jsxs("b", { children: [events.length, " \u4E2A\u4E8B\u4EF6"] }), _jsx("div", { className: "timeline", children: events.length ? events.map((event, index) => _jsx("span", { className: "timeline-turn", children: _jsx("i", { className: "timeline-strip", title: eventLabel(event) }) }, index)) : _jsx("span", { className: "timeline-empty", children: "\u7B49\u5F85\u771F\u5B9E\u4E8B\u4EF6\u2026" }) })] }), _jsxs("div", { className: "source-filters", children: [_jsxs("button", { className: `filter ${filter === "all" ? "active" : ""}`, onClick: () => setFilter("all"), type: "button", children: ["\u5168\u90E8 ", events.length] }), [...counts].map(([type, count]) => _jsxs("button", { className: `filter ${filter === type ? "active" : ""}`, onClick: () => setFilter(type), type: "button", children: [type, " ", count] }, type))] }), _jsxs("div", { className: "event-table", children: [_jsxs("div", { className: "event-head", children: [_jsx("span", { children: "\u65F6\u95F4" }), _jsx("span", { children: "\u6765\u6E90" }), _jsx("span", { children: "\u4E8B\u4EF6" }), _jsx("span", { children: "\u4EA7\u751F\u8005" }), _jsx("span", { children: "\u8017\u65F6" })] }), visible.map((event, index) => _jsxs("button", { className: "event-row", onClick: () => onSelect(event), type: "button", children: [_jsx("span", { children: value(event.timestamp ?? event.ts ?? event.time) }), _jsxs("span", { children: [_jsx("i", { className: "event-dot" }), value(event.type, "event")] }), _jsx("strong", { children: eventLabel(event) }), _jsx("span", { children: value(event.by ?? event.source) }), _jsx("span", { children: value(event.duration ?? event.dur) })] }, index)), !visible.length && _jsx("div", { className: "empty-state", children: "\u6682\u65E0\u8F68\u8FF9\u4E8B\u4EF6\u3002" })] })] });
56
+ }
57
+ function Files({ files, api, onDiff, onRefresh }) { const additions = files.filter((file) => file.status.includes("A") || file.status === "??").length; const deletions = files.filter((file) => file.status.includes("D")).length; const [message, setMessage] = useState(""); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); const commit = () => { const text = message.trim(); if (!text || busy)
58
+ return; setBusy(true); setError(""); void api.commitFiles(files.map((file) => file.path), text).then(() => { setMessage(""); onRefresh(); }).catch((cause) => setError(cause instanceof Error ? cause.message : String(cause))).finally(() => setBusy(false)); }; const revert = () => { if (!files.length || busy || !window.confirm("撤销这些未提交改动?此操作不可恢复。"))
59
+ return; setBusy(true); setError(""); void api.revertFiles(files.map((file) => file.path)).then(onRefresh).catch((cause) => setError(cause instanceof Error ? cause.message : String(cause))).finally(() => setBusy(false)); }; return _jsx("section", { className: "view-panel files-view", children: _jsxs("div", { className: "files-content", children: [_jsxs("div", { className: "files-title", children: [_jsx("strong", { children: "\u672C\u6B21\u4F1A\u8BDD\u6539\u52A8" }), _jsx("span", { children: "\u7531 /api/files \u63D0\u4F9B" })] }), _jsxs("div", { className: "file-summary", children: [files.length, " \u4E2A\u6587\u4EF6 \u00B7 ", additions, " \u4E2A\u65B0\u589E \u00B7 ", deletions, " \u4E2A\u5220\u9664"] }), _jsx("div", { className: "file-list", children: files.length ? files.map((file) => _jsxs("div", { className: "file-row", children: [_jsx("b", { className: `file-kind ${file.label === "untracked" ? "new" : ""}`, children: file.label }), _jsx("code", { children: file.path }), _jsx("span", { className: file.status.includes("D") ? "del" : "add", children: file.status }), _jsx("button", { className: "diff-button", onClick: () => onDiff(file.path), type: "button", children: "\u67E5\u770B\u5DEE\u5F02" })] }, file.path)) : _jsx("div", { className: "empty-state", children: "\u5DE5\u4F5C\u533A\u6CA1\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u3002" }) }), files.length > 0 && _jsxs("div", { className: "file-actions", children: [_jsx("input", { "aria-label": "\u63D0\u4EA4\u8BF4\u660E", onChange: (event) => setMessage(event.target.value), placeholder: "\u63D0\u4EA4\u8BF4\u660E", value: message }), _jsx("button", { className: "primary", disabled: busy || !message.trim(), onClick: commit, type: "button", children: busy ? "处理中…" : "提交这些改动" }), _jsx("button", { disabled: busy, onClick: revert, type: "button", children: "\u5168\u90E8\u64A4\u9500" })] }), error && _jsx("p", { className: "action-error", children: error })] }) }); }
60
+ function Plugins({ plugins, tab, onTab, onToml }) { const groups = useMemo(() => { const map = new Map(); plugins.forEach((plugin) => map.set(capability(plugin.name), [...(map.get(capability(plugin.name)) ?? []), plugin.name])); return map; }, [plugins]); return _jsx("section", { className: "view-panel plugins-view", children: _jsxs("div", { className: "plugins-page", children: [_jsxs("div", { className: "subnav", children: [_jsxs("div", { className: "segmented", children: [_jsx("button", { className: tab === "installed" ? "active" : "", onClick: () => onTab("installed"), type: "button", children: "\u5DF2\u5B89\u88C5" }), _jsx("button", { className: tab === "extensions" ? "active" : "", onClick: () => onTab("extensions"), type: "button", children: "\u6269\u5C55\u70B9" })] }), _jsx("span", { children: "\u8FD0\u884C\u65F6\u63D2\u4EF6\u6E05\u5355" }), _jsx("a", { href: "#", onClick: (event) => { event.preventDefault(); onToml(); }, children: "\u5728 pi.toml \u91CC\u770B\u8FD9\u4EFD\u6E05\u5355" })] }), _jsx("div", { className: "plugins-scroll", children: tab === "installed" ? _jsxs(_Fragment, { children: [_jsx("div", { className: "plugins-list", children: plugins.map((plugin) => _jsx("article", { className: "plugin-card", children: _jsxs("div", { className: "plugin-card-head", children: [_jsx("span", { className: "plugin-icon", children: "\u25C8" }), _jsxs("div", { className: "plugin-copy", children: [_jsxs("div", { className: "plugin-title", children: [_jsx("code", { children: plugin.name }), _jsx("small", { children: plugin.state }), _jsx("span", { className: "capability", children: capability(plugin.name) })] }), _jsx("p", { className: "plugin-description", children: plugin.enabled ? "由当前 Cordis loader 加载并启用,能力与 hook 由运行时注册。" : "由当前 Cordis loader 加载但已停用。" }), _jsxs("div", { className: "hook-list", children: [_jsx("span", { children: "loader" }), _jsx("span", { children: plugin.state === "active" ? "active" : `state:${plugin.state}` })] })] }), _jsx("span", { className: `switch ${plugin.enabled ? "on" : ""}`, children: _jsx("i", {}) })] }) }, plugin.id)) }), _jsxs("div", { className: "plugin-add", children: [_jsx("code", { children: "dsh plugin add" }), _jsx("input", { disabled: true, placeholder: "github:owner/repo" }), _jsx("button", { className: "primary", disabled: true, type: "button", children: "\u5B89\u88C5" })] })] }) : _jsxs(_Fragment, { children: [_jsx("p", { className: "extension-note", children: "\u6BCF\u4E2A\u6269\u5C55\u70B9\u7531\u54EA\u4E9B\u5305\u5360\u7528\uFF0C\u6309 Cordis loader \u7684\u6267\u884C\u987A\u5E8F\u6392\u5217\u3002" }), _jsxs("div", { className: "extension-table", children: [_jsxs("div", { className: "extension-row extension-head", children: [_jsx("span", { children: "\u6269\u5C55\u70B9" }), _jsx("span", { children: "\u5360\u7528\u8005\uFF08\u6309\u5E8F\uFF09" }), _jsx("span", { children: "\u6570\u91CF" })] }), [...groups].map(([point, owners]) => _jsxs("div", { className: "extension-row", children: [_jsx("code", { children: point }), _jsx("div", { className: "extension-owners", children: owners.map((owner) => _jsx("span", { children: owner }, owner)) }), _jsx("code", { children: owners.length })] }, point))] })] }) })] }) }); }
61
+ function Settings({ data, api, tab, onTab, onClose }) { const status = data.status; const [providerState, setProviderState] = useState({}); const runProviderAction = (provider, action) => { setProviderState((current) => ({ ...current, [provider]: action === "test" ? "测试中…" : "刷新中…" })); if (action === "test")
62
+ void api.testProvider(provider).then((result) => setProviderState((current) => ({ ...current, [provider]: result.reachable ? "连接正常" : "未检测到认证" }))).catch((cause) => setProviderState((current) => ({ ...current, [provider]: cause instanceof Error ? cause.message : String(cause) })));
63
+ else
64
+ void api.refreshProvider(provider).then((result) => setProviderState((current) => ({ ...current, [provider]: `${result.models.length} 个模型已刷新` }))).catch((cause) => setProviderState((current) => ({ ...current, [provider]: cause instanceof Error ? cause.message : String(cause) }))); }; return _jsx("div", { className: "settings-overlay", children: _jsxs("div", { className: "settings-dialog", children: [_jsxs("aside", { children: [_jsx("strong", { children: "\u8BBE\u7F6E" }), ["general", "plugins", "providers", "toml"].map((item) => _jsx("button", { className: `settings-tab ${tab === item ? "active" : ""}`, onClick: () => onTab(item), type: "button", children: item === "general" ? "通用" : item === "plugins" ? `插件 ${data.plugins.length}` : item === "providers" ? `提供商 ${data.providers.length}` : "pi.toml" }, item))] }), _jsxs("section", { children: [_jsxs("header", { children: [_jsx("strong", { children: tab === "general" ? "通用" : tab === "plugins" ? "插件" : tab === "providers" ? "提供商" : "pi.toml" }), _jsx("small", { children: tab === "toml" ? "配置即代码,改完重载" : "运行时状态与快捷键" }), _jsx("button", { onClick: onClose, type: "button", children: "\u00D7" })] }), _jsxs("div", { className: "settings-body", children: [tab === "general" && _jsxs(_Fragment, { children: [[["工作目录", status?.cwd], ["agent 目录", status?.agentDir], ["会话", status ? `${status.sessionId} · ${status.messages} 条消息` : "—"], ["快捷键", "⌘K 命令 · ⌘, 设置 · ⌃C 中断"], ["权限策略", "当前 API 未提供修改接口"]].map(([key, item]) => _jsx("div", { className: "general-row", children: _jsxs("div", { children: [_jsx("strong", { children: key }), _jsx("small", { children: value(item) })] }) }, key)), _jsxs("div", { className: "general-row", children: [_jsxs("div", { children: [_jsx("strong", { children: "\u4EFB\u52A1\u7ED3\u675F\u63D0\u9192" }), _jsx("small", { children: "\u7531 runtime \u63D2\u4EF6\u63D0\u4F9B" })] }), _jsx("span", { className: "switch", children: _jsx("i", {}) })] }), _jsxs("div", { className: "general-row", children: [_jsxs("div", { children: [_jsx("strong", { children: "\u81EA\u52A8\u538B\u7F29\u4E0A\u4E0B\u6587" }), _jsx("small", { children: "\u4E8B\u4EF6\u901A\u8FC7 SSE \u5B9E\u65F6\u5237\u65B0" })] }), _jsx("span", { className: "switch on", children: _jsx("i", {}) })] })] }), tab === "plugins" && data.plugins.map((plugin) => _jsxs("div", { className: "settings-plugin-row", children: ["\u25C8 ", _jsxs("code", { children: [plugin.name, " \u00B7 ", plugin.id, " \u00B7 ", plugin.state] })] }, plugin.id)), tab === "providers" && _jsxs(_Fragment, { children: [_jsx("small", { children: "\u8FD0\u884C\u65F6\u6CE8\u518C\u63D0\u4F9B\u5546 \u00B7 /api/providers" }), data.providers.length ? data.providers.map((provider) => _jsxs("article", { className: "provider-card", children: [_jsxs("div", { className: "provider-head", children: [_jsx("span", { className: "provider-dot", children: "\u25CF" }), _jsx("strong", { children: provider.name }), _jsx("span", { className: "provider-state", children: provider.active ? "当前会话" : value(provider.auth?.configured, "未配置") })] }), _jsxs("div", { className: "provider-field", children: [_jsx("code", { children: "provider" }), _jsx("input", { disabled: true, value: provider.provider, readOnly: true })] }), _jsxs("div", { className: "provider-field", children: [_jsx("code", { children: "model" }), _jsx("input", { disabled: true, value: provider.activeModel ? `${provider.activeModel.provider}/${provider.activeModel.id}` : provider.models.map((model) => model.id).join(", "), readOnly: true })] }), _jsxs("div", { className: "provider-field", children: [_jsx("code", { children: "api_key" }), _jsx("input", { disabled: true, value: "\u4E0D\u4F1A\u5728\u6D4F\u89C8\u5668\u663E\u793A", readOnly: true })] }), _jsxs("div", { className: "provider-footer", children: [_jsxs("code", { children: [provider.models.length, " \u4E2A\u6A21\u578B"] }), _jsx("button", { onClick: () => runProviderAction(provider.provider, "test"), type: "button", children: "\u6D4B\u8BD5\u8FDE\u63A5" }), _jsx("button", { className: "link-button", onClick: () => runProviderAction(provider.provider, "refresh"), type: "button", children: "\u62C9\u53D6\u6A21\u578B" })] }), providerState[provider.provider] && _jsx("small", { className: "provider-result", children: providerState[provider.provider] })] }, provider.provider)) : _jsx("div", { className: "empty-state", children: "\u8FD0\u884C\u65F6\u6CA1\u6709\u6CE8\u518C\u63D0\u4F9B\u5546\u3002" })] }), tab === "toml" && _jsxs(_Fragment, { children: [_jsxs("div", { className: "toml-toolbar", children: [_jsx("span", { children: "~/.config/pi/pi.toml" }), _jsx("button", { className: "active", type: "button", children: "\u8868\u5355" }), _jsx("button", { disabled: true, type: "button", children: "\u6E90\u7801" }), _jsx("button", { className: "primary", disabled: true, type: "button", children: "\u91CD\u8F7D" })] }), _jsx("div", { className: "toml", children: _jsx("div", { className: "empty-state", children: "pi.toml \u8BFB\u53D6\u4E0E\u5199\u5165 API \u5C1A\u672A\u63D0\u4F9B\u3002" }) })] })] })] })] }) }); }
65
+ function CommandPalette({ commands, onClose, onUse }) { const [query, setQuery] = useState(""); const visible = commands.filter((command) => `${command.invocationName} ${command.description ?? ""}`.toLowerCase().includes(query.toLowerCase())); return _jsx("div", { className: "command-palette", onClick: (event) => { if (event.target === event.currentTarget)
66
+ onClose(); }, children: _jsxs("div", { className: "palette-dialog", children: [_jsx("input", { autoFocus: true, onChange: (event) => setQuery(event.target.value), placeholder: "\u547D\u4EE4\u3001\u5305\u3001\u4F1A\u8BDD\u3001\u6587\u4EF6", value: query }), _jsxs("div", { className: "palette-group", children: [_jsx("small", { children: "COMMANDS \u00B7 RUNTIME REGISTRY" }), visible.length ? visible.map((command) => { const invocation = `/${command.invocationName}`; return _jsxs("button", { onClick: () => { onUse(invocation); onClose(); }, type: "button", children: [_jsx("code", { children: invocation }), _jsx("span", { children: command.description ?? command.source ?? "由当前运行时注册" })] }, `${command.invocationName}:${command.source ?? "runtime"}`); }) : _jsx("div", { className: "empty-state", children: commands.length ? "没有匹配的命令。" : "当前运行时没有可用的命令注册清单。" })] })] }) }); }
67
+ export function ControlRoomView({ api = createClientApi() }) {
68
+ const [data, setData] = useState({ sessions: [], files: [], models: [], providers: [], plugins: [], commands: [] });
69
+ const [view, setView] = useState("chat");
70
+ const [page, setPage] = useState("session");
71
+ const [pluginTab, setPluginTab] = useState("installed");
72
+ const [settings, setSettings] = useState();
73
+ const [details, setDetails] = useState({});
74
+ const [commandOpen, setCommandOpen] = useState(false);
75
+ const [sessionMenuOpen, setSessionMenuOpen] = useState(false);
76
+ const [draft, setDraft] = useState("");
77
+ const [search, setSearch] = useState("");
78
+ const [permission, setPermission] = useState(true);
79
+ const refresh = useCallback(async () => { const [status, session, sessions, files, models, providers, plugins, commands] = await Promise.allSettled([api.getStatus(), api.getSession(), api.listSessions(), api.getFiles(), api.listModels(), api.listProviders(), api.listPlugins(), api.listCommands()]); setData((current) => ({ status: status.status === "fulfilled" ? status.value : current.status, session: session.status === "fulfilled" ? session.value : current.session, sessions: sessions.status === "fulfilled" ? sessions.value : current.sessions, files: files.status === "fulfilled" ? files.value : current.files, models: models.status === "fulfilled" ? models.value : current.models, providers: providers.status === "fulfilled" ? providers.value : current.providers, plugins: plugins.status === "fulfilled" ? plugins.value : current.plugins, commands: commands.status === "fulfilled" ? commands.value : current.commands })); }, [api]);
80
+ useEffect(() => { void refresh(); const unsubscribe = api.subscribeEvents(() => void refresh()); const timer = window.setInterval(() => void refresh(), 5000); return () => { unsubscribe(); window.clearInterval(timer); }; }, [api, refresh]);
81
+ useEffect(() => { const onKeyDown = (event) => { if (event.key === "Escape") {
82
+ setCommandOpen(false);
83
+ setSessionMenuOpen(false);
84
+ setSettings(undefined);
85
+ } if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === "k") {
86
+ event.preventDefault();
87
+ setCommandOpen(true);
88
+ } if ((event.metaKey || event.ctrlKey) && event.key === ",") {
89
+ event.preventDefault();
90
+ setSettings("general");
91
+ } }; window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); }, []);
92
+ const events = data.session?.events ?? [];
93
+ const filteredSessions = data.sessions.filter((session) => !search || value(session.name ?? session.firstMessage, "未命名会话").toLowerCase().includes(search.toLowerCase()));
94
+ const submit = (event) => { event.preventDefault(); const prompt = draft.trim(); if (!prompt)
95
+ return; setDraft(""); void api.prompt(prompt).then(() => refresh()); };
96
+ const openSession = (session) => { const path = typeof session.path === "string" ? session.path : ""; if (path)
97
+ void api.openSession(path).then(refresh); };
98
+ const content = page === "plugins" ? _jsx(Plugins, { plugins: data.plugins, tab: pluginTab, onTab: setPluginTab, onToml: () => setSettings("toml") }) : view === "chat" ? _jsxs("section", { className: "view-panel chat-view", children: [_jsxs("div", { className: "chat-scroll", children: [data.session?.messages.length ? data.session.messages.map((message, index) => _jsx("article", { className: `turn ${message.role === "user" ? "user" : "text"}`, children: message.role === "user" ? _jsx("div", { className: "user-bubble", children: messageText(message) }) : _jsx("p", { className: "turn-text", children: messageText(message) }) }, index)) : _jsx(Workspace, { status: data.status, onCreate: () => void api.createSession().then(refresh), onStarter: setDraft, onToml: () => setSettings("toml") }), events.map((event, index) => _jsx(RuntimeCard, { event: event }, `${value(event.type, "event")}-${index}`))] }), _jsxs("div", { className: "composer-wrap", children: [_jsxs("div", { className: "context-line", children: [_jsxs("span", { children: ["\u4E0A\u4E0B\u6587 ", _jsx("b", { children: data.status ? `${data.status.messages} / ${data.status.model}` : "0 / —" })] }), _jsxs("div", { className: `context-bar ${permission ? "" : "expanded"}`, children: [_jsx("i", {}), _jsx("i", {}), _jsx("i", {})] }), _jsx("button", { onClick: () => setPermission((current) => !current), type: "button", children: permission ? "构成" : "收起" })] }), _jsxs("form", { className: "composer", onSubmit: submit, children: [_jsx("textarea", { "aria-label": "Prompt", onChange: (event) => setDraft(event.target.value), placeholder: "\u63CF\u8FF0\u8981\u505A\u7684\u6539\u52A8\uFF0C\u2318\u21B5 \u53D1\u9001\uFF1B@ \u5F15\u7528\u6587\u4EF6\uFF0C/ \u8C03\u7528\u547D\u4EE4", rows: 2, value: draft }), _jsxs("div", { className: "composer-tools", children: [_jsx("select", { "aria-label": "\u6A21\u578B", value: data.status?.model ?? "", onChange: (event) => { const [provider, model] = event.target.value.split("/"); if (provider && model)
99
+ void api.selectModel(provider, model); }, children: data.models.map((model) => _jsx("option", { value: `${model.provider}/${model.id}`, children: model.name === model.id ? `${model.provider}/${model.id}` : `${model.name} (${model.provider})` }, `${model.provider}/${model.id}`)) }), _jsxs("button", { className: "tool-chip", onClick: () => setPermission((current) => !current), type: "button", children: ["\u25CF ", permission ? "改动前询问" : "自动允许"] }), _jsx("button", { className: "tool-chip", onClick: () => setCommandOpen(true), type: "button", children: "\uFF0F \u547D\u4EE4" }), _jsx("span", { className: "composer-hint", children: "\u2318\u21B5 \u53D1\u9001 \u00B7 \u2318K \u547D\u4EE4 \u00B7 \u2303C \u4E2D\u65AD" }), _jsx("button", { className: "send-button", type: "submit", children: "\u2191" })] })] })] })] }) : view === "trajectory" ? _jsx(Trajectory, { events: events, onSelect: setDetails }) : _jsx(Files, { api: api, files: data.files, onDiff: (file) => void api.getFileDiff(file).then((diff) => setDetails({ type: "file_diff", path: diff.path, output: diff.diff })), onRefresh: () => void refresh() });
100
+ const groups = sessionGroups(filteredSessions);
101
+ return _jsxs("div", { className: "app-frame", children: [_jsxs("aside", { className: "sidebar", children: [_jsxs("header", { className: "brand-row", children: [_jsx("span", { className: "pi-mark", children: "\u03C0" }), _jsx("strong", { children: "pi harness" }), _jsx("span", { className: "version", children: "0.9.4" })] }), _jsxs("div", { className: "sidebar-actions", children: [_jsx("button", { className: "new-session", onClick: () => void api.createSession().then(refresh), type: "button", children: "\uFF0B \u65B0\u5EFA\u4F1A\u8BDD" }), _jsx("input", { onChange: (event) => setSearch(event.target.value), placeholder: "\u641C\u7D22\u4F1A\u8BDD\u4E0E\u4E8B\u4EF6", type: "search", value: search })] }), _jsx("div", { className: "sidebar-scroll", children: groups.length ? groups.map(([label, sessions]) => _jsxs("div", { className: "session-group", children: [_jsx("div", { className: "group-label", children: label }), sessions.map((session, index) => _jsxs("button", { className: `session-row ${session.sessionId === data.session?.sessionId ? "active" : ""}`, onClick: () => openSession(session), type: "button", children: [_jsx("span", { className: "session-dot ok" }), _jsxs("span", { className: "session-copy", children: [_jsx("strong", { children: value(session.name ?? session.firstMessage, "未命名会话") }), _jsxs("small", { children: [value(session.messageCount, "0"), " \u6761\u6D88\u606F"] })] })] }, index))] }, label)) : _jsx("div", { className: "empty-state", children: "\u6682\u65E0\u5DF2\u4FDD\u5B58\u4F1A\u8BDD" }) }), _jsxs("footer", { className: "sidebar-footer", children: [_jsxs("div", { className: "runtime-cells", children: [_jsxs("span", { children: ["model ", _jsx("b", { children: value(data.status?.model) })] }), _jsxs("span", { children: ["msgs ", _jsx("b", { children: data.status?.messages ?? 0 })] }), _jsxs("span", { children: ["status ", _jsx("b", { children: value(data.status?.status, "connecting") })] })] }), _jsxs("button", { className: `sidebar-link ${page === "plugins" ? "active" : ""}`, onClick: () => { setPage("plugins"); setSettings(undefined); }, type: "button", children: ["\u25C8 ", _jsx("span", { children: "\u63D2\u4EF6" }), _jsx("b", { children: data.plugins.length })] }), _jsxs("button", { className: "sidebar-link", onClick: () => setSettings("general"), type: "button", children: ["\u2699 ", _jsx("span", { children: "\u8BBE\u7F6E" })] }), _jsxs("button", { className: "sidebar-link", onClick: () => setCommandOpen(true), type: "button", children: [_jsx("span", { className: "link-glyph", children: "\u2318" }), _jsx("span", { children: "\u547D\u4EE4\u9762\u677F" }), _jsx("small", { children: "\u2318K" })] })] })] }), _jsxs("section", { className: "main-pane", children: [_jsxs("header", { className: "main-header", children: [_jsxs("div", { className: "active-heading", children: [_jsx("strong", { children: page === "plugins" ? "插件" : data.session?.messages.length ? data.session.sessionId.slice(0, 12) : "新会话" }), _jsx("small", { children: page === "plugins" ? "Cordis loader 运行时清单" : data.session?.sessionFile ?? "未选择工作区" })] }), _jsx("div", { className: "header-spacer" }), _jsxs("div", { className: "run-indicator", children: ["\u25CF ", data.status?.status === "running" ? "running · Pi agent" : "idle"] }), _jsx("button", { className: "stop-button", disabled: data.status?.status !== "running", onClick: () => void api.abort().then(refresh), type: "button", children: "\u505C\u6B62" }), page === "session" && _jsx("div", { className: "view-tabs", children: ["chat", "trajectory", "files"].map((item) => _jsx("button", { className: `view-tab ${view === item ? "active" : ""}`, onClick: () => setView(item), type: "button", children: item === "chat" ? "对话" : item === "trajectory" ? "轨迹" : "产出" }, item)) }), _jsx("button", { className: "session-menu", onClick: () => setSessionMenuOpen((current) => !current), type: "button", "aria-label": "\u4F1A\u8BDD\u64CD\u4F5C", children: "\u22EF" }), _jsx("button", { className: "details-toggle", onClick: () => setDetails(details ? undefined : {}), type: "button", children: "\u25E8 \u8BE6\u60C5" }), _jsx("span", { className: `status-pill ${data.status?.status === "running" ? "running" : "online"}`, children: value(data.status?.status, "connecting") }), sessionMenuOpen && _jsxs("div", { className: "session-menu-popover", children: [_jsxs("button", { className: "session-action", onClick: () => void api.createSession().then(refresh), type: "button", children: [_jsx("strong", { children: "\u65B0\u5EFA\u4F1A\u8BDD" }), _jsx("small", { children: "\u6E05\u7A7A\u5E76\u5F00\u59CB\u65B0\u7684\u8FD0\u884C\u65F6\u4F1A\u8BDD" })] }), _jsxs("button", { className: "session-action", onClick: () => window.location.reload(), type: "button", children: [_jsx("strong", { children: "\u5237\u65B0\u4F1A\u8BDD" }), _jsx("small", { children: "\u91CD\u65B0\u8BFB\u53D6\u8FD0\u884C\u65F6\u72B6\u6001" })] }), _jsxs("button", { className: "session-action", disabled: true, type: "button", children: [_jsx("strong", { children: "\u5BFC\u51FA\u4E8B\u4EF6" }), _jsx("small", { children: "API \u6682\u672A\u63D0\u4F9B\u5BFC\u51FA\u63A5\u53E3" })] }), _jsxs("button", { className: "session-action", disabled: true, type: "button", children: [_jsx("strong", { children: "\u5220\u9664\u4F1A\u8BDD" }), _jsx("small", { children: "API \u6682\u672A\u63D0\u4F9B\u5220\u9664\u63A5\u53E3" })] })] })] }), _jsx("div", { className: "view-host", children: content })] }), details !== undefined && _jsx(Details, { event: Object.keys(details).length ? details : undefined, onClose: () => setDetails(undefined), onCopy: () => void navigator.clipboard?.writeText(JSON.stringify(details, null, 2)) }), settings && _jsx(Settings, { api: api, data: data, tab: settings, onTab: setSettings, onClose: () => setSettings(undefined) }), commandOpen && _jsx(CommandPalette, { commands: data.commands, onClose: () => setCommandOpen(false), onUse: setDraft })] });
102
+ }
103
+ //# sourceMappingURL=react-room.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-room.js","sourceRoot":"","sources":["../src/react-room.tsx"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@pi-harness/client-web",
3
+ "version": "0.1.1",
4
+ "description": "Browser-side Cordis client plugins for the Pi Harness web surface",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "engines": {
18
+ "node": ">=22.19.0"
19
+ },
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.build.json",
22
+ "typecheck": "tsc -p tsconfig.json"
23
+ },
24
+ "dependencies": {
25
+ "@deepseek-ai/cordis": "4.0.1",
26
+ "react": "^19.1.1",
27
+ "react-dom": "^19.1.1"
28
+ }
29
+ }