pi-maestro-mobile 0.2.13 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/cli.js +85 -21
  2. package/dist/cli.js.map +1 -1
  3. package/dist/extension.d.ts.map +1 -1
  4. package/dist/extension.js +126 -96
  5. package/dist/extension.js.map +1 -1
  6. package/dist/host-controller.d.ts +3 -0
  7. package/dist/host-controller.d.ts.map +1 -1
  8. package/dist/host-controller.js +12 -0
  9. package/dist/host-controller.js.map +1 -1
  10. package/dist/jsonl-index.js +2 -2
  11. package/dist/jsonl-index.js.map +1 -1
  12. package/dist/jsonl-pager.d.ts.map +1 -1
  13. package/dist/jsonl-pager.js +68 -6
  14. package/dist/jsonl-pager.js.map +1 -1
  15. package/dist/jsonl-tail-watcher.d.ts +44 -0
  16. package/dist/jsonl-tail-watcher.d.ts.map +1 -0
  17. package/dist/jsonl-tail-watcher.js +275 -0
  18. package/dist/jsonl-tail-watcher.js.map +1 -0
  19. package/dist/live-sessions.d.ts.map +1 -1
  20. package/dist/live-sessions.js +22 -5
  21. package/dist/live-sessions.js.map +1 -1
  22. package/dist/maestro-state.d.ts.map +1 -1
  23. package/dist/maestro-state.js +19 -4
  24. package/dist/maestro-state.js.map +1 -1
  25. package/dist/mobile-ui-context.d.ts +17 -1
  26. package/dist/mobile-ui-context.d.ts.map +1 -1
  27. package/dist/mobile-ui-context.js +35 -7
  28. package/dist/mobile-ui-context.js.map +1 -1
  29. package/dist/pi/pi-sdk-runtime.d.ts.map +1 -1
  30. package/dist/pi/pi-sdk-runtime.js +8 -7
  31. package/dist/pi/pi-sdk-runtime.js.map +1 -1
  32. package/dist/server/helpers.d.ts +0 -11
  33. package/dist/server/helpers.d.ts.map +1 -1
  34. package/dist/server/helpers.js +24 -44
  35. package/dist/server/helpers.js.map +1 -1
  36. package/dist/server/mobile-host-server.d.ts +88 -1
  37. package/dist/server/mobile-host-server.d.ts.map +1 -1
  38. package/dist/server/mobile-host-server.js +434 -54
  39. package/dist/server/mobile-host-server.js.map +1 -1
  40. package/dist/session-runner.d.ts +22 -1
  41. package/dist/session-runner.d.ts.map +1 -1
  42. package/dist/session-runner.js +67 -5
  43. package/dist/session-runner.js.map +1 -1
  44. package/dist/types.d.ts +1 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/usage-reader.d.ts +6 -2
  47. package/dist/usage-reader.d.ts.map +1 -1
  48. package/dist/usage-reader.js +122 -27
  49. package/dist/usage-reader.js.map +1 -1
  50. package/dist/vendor/shared/protocol.d.ts +13 -0
  51. package/dist/vendor/shared/protocol.d.ts.map +1 -1
  52. package/dist/vendor/shared/protocol.js.map +1 -1
  53. package/dist/vendor/shared/validation.d.ts.map +1 -1
  54. package/dist/vendor/shared/validation.js +10 -0
  55. package/dist/vendor/shared/validation.js.map +1 -1
  56. package/dist/workspace-peer-injector.d.ts +19 -0
  57. package/dist/workspace-peer-injector.d.ts.map +1 -0
  58. package/dist/workspace-peer-injector.js +63 -0
  59. package/dist/workspace-peer-injector.js.map +1 -0
  60. package/dist/workspace-telemetry.d.ts +4 -1
  61. package/dist/workspace-telemetry.d.ts.map +1 -1
  62. package/dist/workspace-telemetry.js +20 -6
  63. package/dist/workspace-telemetry.js.map +1 -1
  64. package/package.json +1 -1
  65. package/dist/jsonl-replay.d.ts +0 -9
  66. package/dist/jsonl-replay.d.ts.map +0 -1
  67. package/dist/jsonl-replay.js +0 -153
  68. package/dist/jsonl-replay.js.map +0 -1
  69. package/dist/server/ws-command-handlers.d.ts +0 -20
  70. package/dist/server/ws-command-handlers.d.ts.map +0 -1
  71. package/dist/server/ws-command-handlers.js +0 -176
  72. package/dist/server/ws-command-handlers.js.map +0 -1
@@ -1,153 +0,0 @@
1
- /**
2
- * jsonl-replay — 从 Pi 会话 jsonl 文件直接解析历史消息(只读)
3
- *
4
- * 为什么需要:SDK 的 session.messages 只保留 LLM 上下文内的消息,
5
- * tool 输出(bash 表格/截图路径)和早期消息会被裁剪。
6
- * 直接解析 jsonl 文件可拿到完整历史,包括:
7
- * - toolResult(bash 输出、图片路径)
8
- * - user 粘贴的图片路径
9
- * - thinking、assistant、toolCall
10
- */
11
- import { readFile } from "node:fs/promises";
12
- import { imageBlocksFromContent, materializeImages } from "./image-cache.js";
13
- /** 从 jsonl 文件解析完整 timeline(按文件顺序) */
14
- export async function replayFromJsonl(filePath) {
15
- let content;
16
- try {
17
- content = await readFile(filePath, "utf8");
18
- }
19
- catch {
20
- return { items: [], totalEntries: 0 };
21
- }
22
- const items = [];
23
- const seenToolResults = new Set();
24
- let totalEntries = 0;
25
- for (const line of content.split("\n")) {
26
- if (!line.trim())
27
- continue;
28
- let entry;
29
- try {
30
- entry = JSON.parse(line);
31
- }
32
- catch {
33
- continue;
34
- }
35
- if (entry.type !== "message")
36
- continue;
37
- totalEntries++;
38
- const msg = (entry.message ?? {});
39
- const role = String(msg.role ?? "");
40
- const timestamp = typeof msg.timestamp === "number" ? msg.timestamp : 0;
41
- const createdAt = timestamp > 0 ? new Date(timestamp).toISOString() : "";
42
- if (role === "toolResult") {
43
- const toolCallId = String(msg.toolCallId ?? "");
44
- if (toolCallId && seenToolResults.has(toolCallId))
45
- continue;
46
- if (toolCallId)
47
- seenToolResults.add(toolCallId);
48
- const toolName = String(msg.toolName ?? "tool");
49
- const text = extractText(msg.content);
50
- if (!text)
51
- continue;
52
- items.push({
53
- id: `replay-tool-${items.length}`,
54
- kind: "tool",
55
- text,
56
- createdAt,
57
- toolName,
58
- toolCallId,
59
- isError: msg.isError === true,
60
- });
61
- continue;
62
- }
63
- if (role === "tool" || role === "toolCall") {
64
- const toolName = String(msg.toolName ?? "tool");
65
- const text = extractText(msg.content);
66
- items.push({
67
- id: `replay-toolcall-${items.length}`,
68
- kind: "tool",
69
- text: text || `调用 ${toolName}`,
70
- createdAt,
71
- toolName,
72
- });
73
- continue;
74
- }
75
- const text = extractText(msg.content);
76
- if (role === "user") {
77
- const imagePaths = materializeImages(imageBlocksFromContent(msg.content));
78
- if (!text && imagePaths.length === 0)
79
- continue;
80
- items.push({
81
- id: `replay-user-${items.length}`,
82
- kind: "user",
83
- text: imagePaths.length > 0 && !text ? `[🖼 ${imagePaths.length} 张图片]` : text,
84
- createdAt,
85
- ...(imagePaths.length > 0 ? { images: imagePaths } : {}),
86
- });
87
- }
88
- else if (role === "assistant" || role === "system") {
89
- const callItems = toolCallImageItems(msg.content);
90
- if (!text && callItems.length === 0)
91
- continue;
92
- if (text)
93
- items.push({ id: `replay-assistant-${items.length}`, kind: "assistant", text, createdAt });
94
- // assistant 消息里可能嵌 toolCall(read 图片等)——提取图片参数渲染为 tool 项
95
- for (const callItem of callItems) {
96
- items.push({ ...callItem, id: `replay-toolcall-${items.length}`, createdAt });
97
- }
98
- }
99
- else if (role === "thinking") {
100
- if (!text)
101
- continue;
102
- items.push({ id: `replay-thinking-${items.length}`, kind: "thinking", text, createdAt });
103
- }
104
- // toolResult 已在上面处理;其余角色忽略
105
- }
106
- return { items, totalEntries };
107
- }
108
- const TOOL_IMAGE_EXT = /\.(png|jpe?g|gif|webp|bmp)$/i;
109
- /** 从 assistant content 里提取 toolCall 中读图片的调用,转为 tool 项(文本=图片路径) */
110
- function toolCallImageItems(content) {
111
- if (!Array.isArray(content))
112
- return [];
113
- const items = [];
114
- for (const block of content) {
115
- const b = block;
116
- if (b.type !== "toolCall" || b.name !== "read")
117
- continue;
118
- const argsValue = b.arguments;
119
- let args;
120
- if (argsValue && typeof argsValue === "object") {
121
- args = argsValue;
122
- }
123
- else if (typeof argsValue === "string") {
124
- try {
125
- const parsed = JSON.parse(argsValue);
126
- if (parsed && typeof parsed === "object")
127
- args = parsed;
128
- }
129
- catch {
130
- args = undefined;
131
- }
132
- }
133
- const path = typeof args?.path === "string" ? args.path.trim() : "";
134
- if (path && TOOL_IMAGE_EXT.test(path)) {
135
- items.push({ id: "", kind: "tool", text: path, createdAt: "", toolName: "read" });
136
- }
137
- }
138
- return items;
139
- }
140
- function extractText(content) {
141
- if (typeof content === "string")
142
- return content;
143
- if (!Array.isArray(content))
144
- return "";
145
- const parts = [];
146
- for (const block of content) {
147
- const b = block;
148
- if (typeof b.text === "string")
149
- parts.push(b.text);
150
- }
151
- return parts.join("\n");
152
- }
153
- //# sourceMappingURL=jsonl-replay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jsonl-replay.js","sourceRoot":"","sources":["../src/jsonl-replay.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- /**
2
- * ws-command-handlers — MobileHostServer 的 WS 命令处理表
3
- *
4
- * 每个命令一个独立 handler(H9 拆分):签名统一 (ctx, command) => result。
5
- * ctx 提供 controller / sendError 等最小依赖,handler 不直接依赖 server 内部。
6
- * 新增命令只需在 HANDLERS 表加一项,不再改 600 行 switch。
7
- */
8
- import type { HostController } from "../host-controller.js";
9
- import { HostSessionListService } from "./helpers.js";
10
- import type { ClientCommand } from "../vendor/shared/index.js";
11
- export interface CommandContext {
12
- controller: HostController;
13
- hostSessionList?: HostSessionListService;
14
- /** 某些命令(get_snapshot)需要直接写 WS 帧 */
15
- sendFrame: (payload: unknown) => void;
16
- }
17
- type CommandHandler<C = ClientCommand> = (ctx: CommandContext, command: C) => Promise<unknown> | unknown;
18
- export declare const COMMAND_HANDLERS: Record<string, CommandHandler>;
19
- export {};
20
- //# sourceMappingURL=ws-command-handlers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-command-handlers.d.ts","sourceRoot":"","sources":["../../src/server/ws-command-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAiC,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGrF,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,2BAA2B,CAAC;AAEpF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,cAAc,CAAC;IAC3B,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,mCAAmC;IACnC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAED,KAAK,cAAc,CAAC,CAAC,GAAG,aAAa,IAAI,CACvC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,CAAC,KACP,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAkBhC,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAgL3D,CAAC"}
@@ -1,176 +0,0 @@
1
- import { projectMonitorState } from "../monitor-projection.js";
2
- import { readSettingsOverview, updateSettingsJson } from "../maestro-settings.js";
3
- import { toSdkImageContent, listSkills, HostSessionListService } from "./helpers.js";
4
- import { homedir } from "node:os";
5
- import { join } from "node:path";
6
- /** runner 查找 + 未找到时抛带 code 的错误(统一 session_not_found 语义) */
7
- function requireSession(ctx, sessionId) {
8
- const runner = ctx.controller.getSession(sessionId);
9
- if (!runner) {
10
- const err = new Error("session_not_found");
11
- err.code = "session_not_found";
12
- throw err;
13
- }
14
- return runner;
15
- }
16
- function optionalRunnerFn(runner, name, fallback) {
17
- const fn = runner[name];
18
- return typeof fn === "function" ? fn() : fallback;
19
- }
20
- export const COMMAND_HANDLERS = {
21
- list_live_sessions: (ctx) => ctx.controller.listLiveSessions(),
22
- load_more_history: async (ctx, cmd) => {
23
- const runner = requireSession(ctx, cmd.sessionId);
24
- return runner.loadMoreHistory(cmd.count);
25
- },
26
- search_history: async (ctx, cmd) => {
27
- const runner = requireSession(ctx, cmd.sessionId);
28
- const c = cmd;
29
- return runner.searchHistory(c.keyword, c.maxResults, c.previewLength);
30
- },
31
- list_models: (ctx, cmd) => {
32
- const runner = requireSession(ctx, cmd.sessionId);
33
- return optionalRunnerFn(runner, "listModels", []);
34
- },
35
- list_skills: async (ctx, cmd) => {
36
- const runner = requireSession(ctx, cmd.sessionId);
37
- const loaded = optionalRunnerFn(runner, "listLoadedSkills", []);
38
- const skills = loaded.length > 0 ? loaded : await listSkills(runner.state.cwd);
39
- return skills;
40
- },
41
- get_maestro_settings: () => readSettingsOverview(),
42
- update_maestro_settings: async (_ctx, cmd) => {
43
- const c = cmd;
44
- if (c.key !== "settings") {
45
- const err = new Error("unsupported_key");
46
- err.code = "unsupported_key";
47
- throw err;
48
- }
49
- return updateSettingsJson(c.patch);
50
- },
51
- set_model: async (ctx, cmd) => {
52
- const runner = requireSession(ctx, cmd.sessionId);
53
- const fn = runner.setModel;
54
- if (typeof fn !== "function") {
55
- const err = new Error("unsupported_command");
56
- err.code = "unsupported_command";
57
- throw err;
58
- }
59
- return fn.call(runner, cmd.modelId);
60
- },
61
- set_thinking: (ctx, cmd) => {
62
- const runner = requireSession(ctx, cmd.sessionId);
63
- const fn = runner.setThinking;
64
- if (typeof fn !== "function") {
65
- const err = new Error("unsupported_command");
66
- err.code = "unsupported_command";
67
- throw err;
68
- }
69
- return fn.call(runner, cmd.level);
70
- },
71
- compact: async (ctx, cmd) => {
72
- const runner = requireSession(ctx, cmd.sessionId);
73
- const fn = runner.compact;
74
- if (typeof fn !== "function") {
75
- const err = new Error("unsupported_command");
76
- err.code = "unsupported_command";
77
- throw err;
78
- }
79
- return fn.call(runner, cmd.customInstructions);
80
- },
81
- rename_session: (ctx, cmd) => {
82
- const runner = requireSession(ctx, cmd.sessionId);
83
- const fn = runner.renameSession;
84
- if (typeof fn !== "function") {
85
- const err = new Error("unsupported_command");
86
- err.code = "unsupported_command";
87
- throw err;
88
- }
89
- return fn.call(runner, cmd.name);
90
- },
91
- list_host_sessions: async (ctx, cmd) => {
92
- const c = cmd;
93
- const service = ctx.hostSessionList ?? new HostSessionListService({ indexPath: join(homedir(), ".pi", "agent", "mobile-session-index.json") });
94
- return service.list(() => ctx.controller.listSessions(c.cwd), c);
95
- },
96
- open_session: async (ctx, cmd) => {
97
- const c = cmd;
98
- const runner = await ctx.controller.openSession({ cwd: c.cwd, mode: c.mode, sessionFile: c.sessionFile });
99
- return { sessionId: runner.id };
100
- },
101
- close_session: async (ctx, cmd) => {
102
- await ctx.controller.closeSession(cmd.sessionId);
103
- return { closed: true };
104
- },
105
- prompt: async (ctx, cmd) => {
106
- const runner = requireSession(ctx, cmd.sessionId);
107
- const c = cmd;
108
- const images = c.images?.map((img) => toSdkImageContent(img)).filter((x) => x !== undefined);
109
- if (c.images && c.images.length > 0 && images?.length !== c.images.length) {
110
- const err = new Error("images 元素必须是 base64 data 与 mime 字段齐全的图片");
111
- err.code = "invalid_image";
112
- throw err;
113
- }
114
- await runner.prompt(c.message, undefined, images);
115
- return {};
116
- },
117
- steer: async (ctx, cmd) => {
118
- const runner = requireSession(ctx, cmd.sessionId);
119
- await runner.steer(cmd.message);
120
- return {};
121
- },
122
- steer_window: async (ctx, cmd) => {
123
- const c = cmd;
124
- const existing = ctx.controller.getSession(c.endpointId);
125
- if (existing) {
126
- await existing.steer(c.message);
127
- return { ok: true, sessionId: c.endpointId, tookOver: false };
128
- }
129
- try {
130
- const runner = await ctx.controller.openSession({ cwd: c.cwd, mode: "continue", sessionFile: undefined });
131
- await runner.steer(c.message);
132
- return { ok: true, sessionId: runner.id, tookOver: true };
133
- }
134
- catch (error) {
135
- return { ok: false, sessionId: c.endpointId, tookOver: false, error: error instanceof Error ? error.message : String(error) };
136
- }
137
- },
138
- follow_up: async (ctx, cmd) => {
139
- const runner = requireSession(ctx, cmd.sessionId);
140
- await runner.followUp(cmd.message);
141
- return {};
142
- },
143
- abort: async (ctx, cmd) => {
144
- const runner = requireSession(ctx, cmd.sessionId);
145
- await runner.abort();
146
- return {};
147
- },
148
- extension_ui_response: (ctx, cmd) => {
149
- const c = cmd;
150
- const ok = ctx.controller.respondToExtensionUi(c.sessionId, c.requestId, c.response);
151
- if (!ok) {
152
- const err = new Error("request_not_found");
153
- err.code = "request_not_found";
154
- throw err;
155
- }
156
- return {};
157
- },
158
- get_maestro_state: (ctx) => ctx.controller.readMaestroStateNow(),
159
- get_monitor_state: async (ctx) => {
160
- // 与推送路径共用同一投影,避免双投影漂移
161
- const telemetry = await ctx.controller.readTelemetry();
162
- return projectMonitorState(telemetry);
163
- },
164
- get_snapshot: (ctx, cmd) => {
165
- const runner = requireSession(ctx, cmd.sessionId);
166
- return runner.snapshot();
167
- },
168
- get_session_usage: async (ctx, cmd) => {
169
- const runner = requireSession(ctx, cmd.sessionId);
170
- const usage = await optionalRunnerFn(runner, "getUsage", { entries: 0, input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, totalTokens: 0, cost: 0 });
171
- const context = optionalRunnerFn(runner, "getContextUsage", null) ?? null;
172
- return { sessionId: cmd.sessionId, ...usage, context };
173
- },
174
- };
175
- // list_skills 的 listSkills / prompt 的 toSdkImageContent 从 helpers 导入
176
- //# sourceMappingURL=ws-command-handlers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ws-command-handlers.js","sourceRoot":"","sources":["../../src/server/ws-command-handlers.ts"],"names":[],"mappings":"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"}