pi-courier 0.1.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 (86) hide show
  1. package/README.md +363 -0
  2. package/README.zh-CN.md +362 -0
  3. package/deploy/pi-msg-bridge.service +26 -0
  4. package/deploy/pi-msg-bridge.user.service +37 -0
  5. package/dist/auth/challenge-auth.d.ts +76 -0
  6. package/dist/auth/challenge-auth.d.ts.map +1 -0
  7. package/dist/auth/challenge-auth.js +337 -0
  8. package/dist/auth/challenge-auth.js.map +1 -0
  9. package/dist/cli.d.ts +3 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +265 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/config.d.ts +10 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +49 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/formatting.d.ts +22 -0
  18. package/dist/formatting.d.ts.map +1 -0
  19. package/dist/formatting.js +74 -0
  20. package/dist/formatting.js.map +1 -0
  21. package/dist/lock.d.ts +3 -0
  22. package/dist/lock.d.ts.map +1 -0
  23. package/dist/lock.js +75 -0
  24. package/dist/lock.js.map +1 -0
  25. package/dist/rpc/command-map.d.ts +19 -0
  26. package/dist/rpc/command-map.d.ts.map +1 -0
  27. package/dist/rpc/command-map.js +191 -0
  28. package/dist/rpc/command-map.js.map +1 -0
  29. package/dist/rpc/message-router.d.ts +30 -0
  30. package/dist/rpc/message-router.d.ts.map +1 -0
  31. package/dist/rpc/message-router.js +110 -0
  32. package/dist/rpc/message-router.js.map +1 -0
  33. package/dist/rpc/pi-rpc.d.ts +79 -0
  34. package/dist/rpc/pi-rpc.d.ts.map +1 -0
  35. package/dist/rpc/pi-rpc.js +199 -0
  36. package/dist/rpc/pi-rpc.js.map +1 -0
  37. package/dist/setup.d.ts +10 -0
  38. package/dist/setup.d.ts.map +1 -0
  39. package/dist/setup.js +159 -0
  40. package/dist/setup.js.map +1 -0
  41. package/dist/standalone.d.ts +13 -0
  42. package/dist/standalone.d.ts.map +1 -0
  43. package/dist/standalone.js +184 -0
  44. package/dist/standalone.js.map +1 -0
  45. package/dist/transports/discord.d.ts +33 -0
  46. package/dist/transports/discord.d.ts.map +1 -0
  47. package/dist/transports/discord.js +216 -0
  48. package/dist/transports/discord.js.map +1 -0
  49. package/dist/transports/interface.d.ts +42 -0
  50. package/dist/transports/interface.d.ts.map +1 -0
  51. package/dist/transports/interface.js +2 -0
  52. package/dist/transports/interface.js.map +1 -0
  53. package/dist/transports/manager.d.ts +54 -0
  54. package/dist/transports/manager.d.ts.map +1 -0
  55. package/dist/transports/manager.js +98 -0
  56. package/dist/transports/manager.js.map +1 -0
  57. package/dist/transports/matrix-utils.d.ts +31 -0
  58. package/dist/transports/matrix-utils.d.ts.map +1 -0
  59. package/dist/transports/matrix-utils.js +99 -0
  60. package/dist/transports/matrix-utils.js.map +1 -0
  61. package/dist/transports/matrix-utils.test.d.ts +2 -0
  62. package/dist/transports/matrix-utils.test.d.ts.map +1 -0
  63. package/dist/transports/matrix-utils.test.js +246 -0
  64. package/dist/transports/matrix-utils.test.js.map +1 -0
  65. package/dist/transports/matrix.d.ts +34 -0
  66. package/dist/transports/matrix.d.ts.map +1 -0
  67. package/dist/transports/matrix.js +240 -0
  68. package/dist/transports/matrix.js.map +1 -0
  69. package/dist/transports/slack.d.ts +31 -0
  70. package/dist/transports/slack.d.ts.map +1 -0
  71. package/dist/transports/slack.js +203 -0
  72. package/dist/transports/slack.js.map +1 -0
  73. package/dist/transports/telegram.d.ts +38 -0
  74. package/dist/transports/telegram.d.ts.map +1 -0
  75. package/dist/transports/telegram.js +167 -0
  76. package/dist/transports/telegram.js.map +1 -0
  77. package/dist/transports/whatsapp.d.ts +31 -0
  78. package/dist/transports/whatsapp.d.ts.map +1 -0
  79. package/dist/transports/whatsapp.js +235 -0
  80. package/dist/transports/whatsapp.js.map +1 -0
  81. package/dist/types.d.ts +69 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +2 -0
  84. package/dist/types.js.map +1 -0
  85. package/extensions/index.ts +42 -0
  86. package/package.json +71 -0
@@ -0,0 +1,79 @@
1
+ import { type ModelInfo, type RpcEventListener, type RpcSessionState } from "@earendil-works/pi-coding-agent";
2
+ export interface PiRpcOptions {
3
+ /** Absolute path to pi's dist/cli.js (default: PI_CLI_PATH env, local node_modules, or `which pi` resolved) */
4
+ cliPath?: string;
5
+ /** Working directory for the agent (affects bash tool, project context) */
6
+ cwd?: string;
7
+ /** Extra CLI args, e.g. ["--session-dir", "/path"] */
8
+ args?: string[];
9
+ }
10
+ /** Minimal shape of a slash command returned by get_commands (duck-typed, not exported by the package) */
11
+ export interface RpcSlashCommandInfo {
12
+ name: string;
13
+ description?: string;
14
+ source: "extension" | "prompt" | "skill";
15
+ location?: string;
16
+ path?: string;
17
+ }
18
+ export declare class PiRpc {
19
+ private client?;
20
+ private commandsCache?;
21
+ private options;
22
+ /** Listeners registered before start() — attached once the client connects */
23
+ private listeners;
24
+ constructor(options?: PiRpcOptions);
25
+ get isConnected(): boolean;
26
+ /** Locate the pi CLI entry point. */
27
+ static resolveCliPath(): Promise<string>;
28
+ start(): Promise<void>;
29
+ stop(): Promise<void>;
30
+ /**
31
+ * Restart the pi process. Keeps registered event listeners attached to the
32
+ * new process. The session persists on disk, so the same session is resumed.
33
+ * Useful after installing new extensions/skills or changing provider config.
34
+ */
35
+ restart(): Promise<void>;
36
+ /**
37
+ * Send a user prompt. If the agent is streaming, the RPC server rejects a
38
+ * plain prompt — retry as a steering message (queued, delivered after the
39
+ * current tool calls finish).
40
+ */
41
+ prompt(text: string): Promise<void>;
42
+ /** Subscribe to agent events. Safe to call before start(). Returns an unsubscribe function. */
43
+ onEvent(listener: RpcEventListener): () => void;
44
+ newSession(): Promise<{
45
+ cancelled: boolean;
46
+ }>;
47
+ compact(customInstructions?: string): Promise<{
48
+ summary: string;
49
+ tokensBefore: number;
50
+ }>;
51
+ abort(): Promise<void>;
52
+ getState(): Promise<RpcSessionState>;
53
+ getAvailableModels(): Promise<ModelInfo[]>;
54
+ setModel(provider: string, modelId: string): Promise<unknown>;
55
+ setThinkingLevel(level: string): Promise<void>;
56
+ setSessionName(name: string): Promise<void>;
57
+ getSessionStats(): Promise<{
58
+ sessionId: string;
59
+ totalMessages: number;
60
+ cost: number;
61
+ tokens: {
62
+ total: number;
63
+ };
64
+ }>;
65
+ exportHtml(outputPath?: string): Promise<{
66
+ path: string;
67
+ }>;
68
+ bash(command: string): Promise<{
69
+ output: string;
70
+ exitCode: number | undefined;
71
+ }>;
72
+ switchSession(sessionPath: string): Promise<{
73
+ cancelled: boolean;
74
+ }>;
75
+ /** Get available commands (extension commands, prompt templates, skills) with a short cache. */
76
+ getCommands(): Promise<RpcSlashCommandInfo[]>;
77
+ private requireClient;
78
+ }
79
+ //# sourceMappingURL=pi-rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-rpc.d.ts","sourceRoot":"","sources":["../../src/rpc/pi-rpc.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC3B,+GAA+G;IAC/G,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,0GAA0G;AAC1G,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,aAAa,CAAC,CAA8C;IACpE,OAAO,CAAC,OAAO,CAAe;IAC9B,8EAA8E;IAC9E,OAAO,CAAC,SAAS,CAA2C;gBAEhD,OAAO,GAAE,YAAiB;IAItC,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,qCAAqC;WACxB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IA+BxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazC,+FAA+F;IAC/F,OAAO,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAgBzC,UAAU,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAI7C,OAAO,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAIxF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC;IAIpC,kBAAkB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAI1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI7D,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,eAAe,IAAI,OAAO,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3B,CAAC;IAII,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAI1D,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAIhF,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAIzE,gGAAgG;IAC1F,WAAW,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAYnD,OAAO,CAAC,aAAa;CAItB"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * PiRpc — thin wrapper around the official RpcClient from @earendil-works/pi-coding-agent.
3
+ *
4
+ * Responsibilities:
5
+ * - Locate the pi CLI (config/env/PATH) and spawn it in --mode rpc
6
+ * - Retry startup handshake (cold start can take a moment)
7
+ * - Provide typed convenience methods used by the command map
8
+ * - Cache get_commands results briefly
9
+ * - Fall back to steer() when a prompt arrives while the agent is streaming
10
+ */
11
+ import { execFileSync } from "node:child_process";
12
+ import * as fs from "node:fs";
13
+ import * as path from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
+ import { RpcClient, } from "@earendil-works/pi-coding-agent";
16
+ export class PiRpc {
17
+ client;
18
+ commandsCache;
19
+ options;
20
+ /** Listeners registered before start() — attached once the client connects */
21
+ listeners = [];
22
+ constructor(options = {}) {
23
+ this.options = options;
24
+ }
25
+ get isConnected() {
26
+ return this.client !== undefined;
27
+ }
28
+ /** Locate the pi CLI entry point. */
29
+ static async resolveCliPath() {
30
+ // 1. Explicit env override
31
+ if (process.env.PI_CLI_PATH)
32
+ return process.env.PI_CLI_PATH;
33
+ // 2. System-installed pi (`which pi`, resolve symlink to dist/cli.js).
34
+ // Preferred: pi is installed independently and upgraded on its own.
35
+ try {
36
+ const bin = execFileSync("which", ["pi"], { encoding: "utf-8" }).trim();
37
+ if (bin) {
38
+ return fs.realpathSync(bin);
39
+ }
40
+ }
41
+ catch {
42
+ // fall through
43
+ }
44
+ // 3. Local node_modules copy (dev setup / peer auto-install). The package
45
+ // exports block subpath resolution, so resolve the entry and derive
46
+ // dist/cli.js from its directory.
47
+ try {
48
+ const entryUrl = import.meta.resolve("@earendil-works/pi-coding-agent");
49
+ const entry = fileURLToPath(entryUrl);
50
+ return path.join(path.dirname(entry), "cli.js");
51
+ }
52
+ catch {
53
+ // fall through
54
+ }
55
+ throw new Error("Cannot locate the pi CLI. Install @earendil-works/pi-coding-agent globally (npm i -g @earendil-works/pi-coding-agent) or set PI_CLI_PATH.");
56
+ }
57
+ async start() {
58
+ if (this.client)
59
+ return;
60
+ // The workdir becomes the pi child process's cwd; spawn requires it to
61
+ // exist, so create it on demand.
62
+ if (this.options.cwd) {
63
+ fs.mkdirSync(this.options.cwd, { recursive: true });
64
+ }
65
+ const cliPath = this.options.cliPath ?? (await PiRpc.resolveCliPath());
66
+ const client = new RpcClient({
67
+ cliPath,
68
+ cwd: this.options.cwd,
69
+ args: this.options.args,
70
+ });
71
+ await client.start();
72
+ // Attach any listeners that were registered before the client connected
73
+ for (const listener of this.listeners) {
74
+ if (listener)
75
+ client.onEvent(listener);
76
+ }
77
+ // Cold start handshake: the process may need a moment before answering.
78
+ let lastError;
79
+ for (let attempt = 1; attempt <= 5; attempt++) {
80
+ try {
81
+ await client.getState();
82
+ this.client = client;
83
+ return;
84
+ }
85
+ catch (err) {
86
+ lastError = err;
87
+ await new Promise((r) => setTimeout(r, 1000));
88
+ }
89
+ }
90
+ await client.stop().catch(() => { });
91
+ throw new Error(`pi RPC did not become ready: ${lastError?.message}`);
92
+ }
93
+ async stop() {
94
+ if (!this.client)
95
+ return;
96
+ await this.client.stop();
97
+ this.client = undefined;
98
+ this.commandsCache = undefined;
99
+ this.listeners = [];
100
+ }
101
+ /**
102
+ * Restart the pi process. Keeps registered event listeners attached to the
103
+ * new process. The session persists on disk, so the same session is resumed.
104
+ * Useful after installing new extensions/skills or changing provider config.
105
+ */
106
+ async restart() {
107
+ const keptListeners = this.listeners;
108
+ await this.stop();
109
+ this.listeners = keptListeners;
110
+ await this.start();
111
+ }
112
+ /**
113
+ * Send a user prompt. If the agent is streaming, the RPC server rejects a
114
+ * plain prompt — retry as a steering message (queued, delivered after the
115
+ * current tool calls finish).
116
+ */
117
+ async prompt(text) {
118
+ if (!this.client)
119
+ throw new Error("pi RPC not connected");
120
+ try {
121
+ await this.client.prompt(text);
122
+ }
123
+ catch (err) {
124
+ if (/streaming/i.test(err.message)) {
125
+ await this.client.steer(text);
126
+ }
127
+ else {
128
+ throw err;
129
+ }
130
+ }
131
+ }
132
+ /** Subscribe to agent events. Safe to call before start(). Returns an unsubscribe function. */
133
+ onEvent(listener) {
134
+ const index = this.listeners.push(listener) - 1;
135
+ let clientUnsub;
136
+ if (this.client) {
137
+ clientUnsub = this.client.onEvent(listener);
138
+ }
139
+ return () => {
140
+ this.listeners[index] = undefined;
141
+ clientUnsub?.();
142
+ };
143
+ }
144
+ // =========================================================================
145
+ // RPC command conveniences (used by the slash command map)
146
+ // =========================================================================
147
+ async newSession() {
148
+ return this.requireClient().newSession();
149
+ }
150
+ async compact(customInstructions) {
151
+ return this.requireClient().compact(customInstructions);
152
+ }
153
+ async abort() {
154
+ await this.requireClient().abort();
155
+ }
156
+ async getState() {
157
+ return this.requireClient().getState();
158
+ }
159
+ async getAvailableModels() {
160
+ return this.requireClient().getAvailableModels();
161
+ }
162
+ async setModel(provider, modelId) {
163
+ return this.requireClient().setModel(provider, modelId);
164
+ }
165
+ async setThinkingLevel(level) {
166
+ await this.requireClient().setThinkingLevel(level);
167
+ }
168
+ async setSessionName(name) {
169
+ await this.requireClient().setSessionName(name);
170
+ }
171
+ async getSessionStats() {
172
+ return this.requireClient().getSessionStats();
173
+ }
174
+ async exportHtml(outputPath) {
175
+ return this.requireClient().exportHtml(outputPath);
176
+ }
177
+ async bash(command) {
178
+ return this.requireClient().bash(command);
179
+ }
180
+ async switchSession(sessionPath) {
181
+ return this.requireClient().switchSession(sessionPath);
182
+ }
183
+ /** Get available commands (extension commands, prompt templates, skills) with a short cache. */
184
+ async getCommands() {
185
+ if (this.commandsCache && Date.now() - this.commandsCache.at < 60_000) {
186
+ return this.commandsCache.list;
187
+ }
188
+ const list = (await this.requireClient().getCommands());
189
+ const commands = list.commands ?? [];
190
+ this.commandsCache = { at: Date.now(), list: commands };
191
+ return commands;
192
+ }
193
+ requireClient() {
194
+ if (!this.client)
195
+ throw new Error("pi RPC not connected");
196
+ return this.client;
197
+ }
198
+ }
199
+ //# sourceMappingURL=pi-rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-rpc.js","sourceRoot":"","sources":["../../src/rpc/pi-rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Interactive first-run setup wizard.
3
+ *
4
+ * Usage: node dist/standalone.js --setup
5
+ *
6
+ * Walks through: Matrix homeserver → bot login (or pasted token) → trusted
7
+ * admin user → E2EE toggle, then writes ~/.pi/msg-bridge.json.
8
+ */
9
+ export declare function runSetup(): Promise<void>;
10
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkGH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAgE9C"}
package/dist/setup.js ADDED
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Interactive first-run setup wizard.
3
+ *
4
+ * Usage: node dist/standalone.js --setup
5
+ *
6
+ * Walks through: Matrix homeserver → bot login (or pasted token) → trusted
7
+ * admin user → E2EE toggle, then writes ~/.pi/msg-bridge.json.
8
+ */
9
+ import * as os from "node:os";
10
+ import { stdin, stdout } from "node:process";
11
+ import { createInterface } from "node:readline";
12
+ import { saveConfig } from "./config.js";
13
+ /**
14
+ * Input abstraction that works in both modes:
15
+ * - TTY: interactive question() (echoes prompt, reads one line at a time)
16
+ * - piped/closed stdin: pre-read all lines, consume in order (no line loss,
17
+ * which readline.question suffers from when input is buffered)
18
+ * Returns { ask, close } — close() releases stdin listeners so the process
19
+ * can exit naturally after setup finishes.
20
+ */
21
+ function createPrompter() {
22
+ if (stdin.isTTY) {
23
+ const rl = createInterface({ input: stdin, output: stdout });
24
+ return {
25
+ ask: (prompt) => new Promise((resolve) => {
26
+ let done = false;
27
+ const finish = (answer) => {
28
+ if (!done) {
29
+ done = true;
30
+ resolve(answer);
31
+ }
32
+ };
33
+ rl.question(prompt, finish);
34
+ rl.once("close", () => finish(""));
35
+ }),
36
+ close: () => {
37
+ rl.close();
38
+ },
39
+ };
40
+ }
41
+ // Piped mode: read everything up front, then consume line by line
42
+ let data = "";
43
+ stdin.setEncoding("utf-8");
44
+ stdin.on("data", (chunk) => {
45
+ data += chunk;
46
+ });
47
+ const lines = [];
48
+ stdin.on("end", () => {
49
+ lines.push(...data.split("\n"));
50
+ });
51
+ return {
52
+ ask: async (prompt) => {
53
+ process.stdout.write(prompt);
54
+ await new Promise((resolve) => {
55
+ if (lines.length > 0 || data.length > 0)
56
+ resolve(undefined);
57
+ else
58
+ stdin.once("end", () => resolve(undefined));
59
+ });
60
+ return lines.shift()?.trim() ?? "";
61
+ },
62
+ close: () => {
63
+ stdin.removeAllListeners("data");
64
+ stdin.removeAllListeners("end");
65
+ },
66
+ };
67
+ }
68
+ async function matrixLogin(homeserver, username, password) {
69
+ const url = `${homeserver.replace(/\/$/, "")}/_matrix/client/v3/login`;
70
+ const res = await fetch(url, {
71
+ method: "POST",
72
+ headers: { "Content-Type": "application/json" },
73
+ body: JSON.stringify({
74
+ type: "m.login.password",
75
+ identifier: { type: "m.id.user", user: username },
76
+ password,
77
+ }),
78
+ });
79
+ if (!res.ok) {
80
+ const body = await res.text();
81
+ throw new Error(`登录失败 (HTTP ${res.status}): ${body.slice(0, 300)}`);
82
+ }
83
+ const data = (await res.json());
84
+ if (!data.access_token)
85
+ throw new Error("登录响应缺少 access_token");
86
+ return { accessToken: data.access_token, userId: data.user_id ?? "" };
87
+ }
88
+ async function matrixWhoami(homeserver, accessToken) {
89
+ const url = `${homeserver.replace(/\/$/, "")}/_matrix/client/v3/account/whoami`;
90
+ const res = await fetch(url, { headers: { Authorization: `Bearer ${accessToken}` } });
91
+ if (!res.ok)
92
+ throw new Error(`token 验证失败 (HTTP ${res.status})`);
93
+ const data = (await res.json());
94
+ return data.user_id ?? "unknown";
95
+ }
96
+ export async function runSetup() {
97
+ const { ask, close } = createPrompter();
98
+ console.log("");
99
+ console.log("=== pi-remote 首次配置向导 ===");
100
+ console.log("将生成 ~/.pi/msg-bridge.json(权限 600)\n");
101
+ try {
102
+ const homeserver = (await ask("Matrix homeserver URL (如 https://matrix.example.com): ")).trim();
103
+ if (!homeserver)
104
+ throw new Error("homeserver URL 不能为空");
105
+ const authMode = (await ask("获取 token 方式 [1=用户名密码登录, 2=粘贴已有 token] (1): ")).trim() || "1";
106
+ let accessToken;
107
+ let botUserId;
108
+ if (authMode === "2") {
109
+ accessToken = (await ask("粘贴 access token (syt_...): ")).trim();
110
+ if (!accessToken)
111
+ throw new Error("token 不能为空");
112
+ botUserId = await matrixWhoami(homeserver, accessToken);
113
+ console.log(`✅ token 有效,账号: ${botUserId}`);
114
+ }
115
+ else {
116
+ const username = (await ask("bot 用户名 (如 test2): ")).trim();
117
+ // 密码不回显(终端模式);普通模式会显示,注意遮挡
118
+ const password = await ask("bot 密码: ");
119
+ if (!username || !password)
120
+ throw new Error("用户名/密码不能为空");
121
+ console.log("登录中…");
122
+ const login = await matrixLogin(homeserver, username, password);
123
+ accessToken = login.accessToken;
124
+ botUserId = login.userId;
125
+ console.log(`✅ 登录成功,账号: ${botUserId}`);
126
+ }
127
+ const adminDefault = botUserId.replace(/^@/, "").split(":")[0];
128
+ const adminRaw = (await ask(`信任用户(管理员)MXID [默认 ${botUserId}]: `)).trim() || botUserId;
129
+ if (!adminRaw.startsWith("@"))
130
+ throw new Error("MXID 应以 @ 开头,如 @barry:matrix.example.com");
131
+ const encryption = (await ask("启用 E2EE 加密? [y/N]: ")).trim().toLowerCase() === "y";
132
+ const workdirDefault = `${os.homedir()}/Projects`;
133
+ const workdir = (await ask(`pi 工作目录 [默认 ${workdirDefault}]: `)).trim() || workdirDefault;
134
+ saveConfig({
135
+ matrix: { homeserverUrl: homeserver, accessToken, encryption },
136
+ auth: {
137
+ trustedUsers: [`matrix:${adminRaw}`],
138
+ adminUserId: `matrix:${adminRaw}`,
139
+ },
140
+ workdir,
141
+ autoConnect: true,
142
+ debug: true,
143
+ });
144
+ console.log("\n✅ 配置已写入 ~/.pi/msg-bridge.json");
145
+ console.log(` 账号: ${botUserId}`);
146
+ console.log(` 信任用户: ${adminRaw}`);
147
+ console.log(` E2EE: ${encryption ? "开启" : "关闭"}`);
148
+ console.log(` 工作目录: ${workdir}`);
149
+ console.log("\n下一步: pi-remote enable(开机自启)或 pi-remote run(前台运行)");
150
+ }
151
+ catch (err) {
152
+ console.error(`\n❌ 配置失败: ${err.message}`);
153
+ process.exitCode = 1;
154
+ }
155
+ finally {
156
+ close(); // release stdin listeners so the process exits naturally
157
+ }
158
+ }
159
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Standalone entry — runs the bridge as its own process (systemd-friendly),
3
+ * talking to pi over RPC mode instead of living inside pi as an extension.
4
+ *
5
+ * Usage:
6
+ * node dist/standalone.js [--workdir <dir>] [--pi-cli <path>] [--session-dir <dir>] [--debug]
7
+ *
8
+ * Architecture:
9
+ * Messenger (Matrix/Telegram/...) ──> bridge ──> pi --mode rpc (JSONL over stdio)
10
+ * Messenger <── replies <────────── bridge <── agent events (stdout JSONL)
11
+ */
12
+ export declare function main(argv?: string[]): Promise<void>;
13
+ //# sourceMappingURL=standalone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA2DH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsIhF"}