@geohar/pi-cribsheet 0.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) George Harker
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,85 @@
1
+ # @geohar/pi-cribsheet
2
+
3
+ A [Pi](https://pi.dev) extension that makes **cribsheet** (the `crib` memory +
4
+ code-index MCP server) available to Pi: it starts `crib` (supervised by
5
+ [`sharedserver`](https://github.com/georgeharker/sharedserver)), injects the
6
+ reach-for-crib directive into the system prompt, and ships the `/crib` recall command.
7
+
8
+ It is the Pi counterpart of cribsheet's
9
+ [Claude Code](https://github.com/georgeharker/cribsheet/tree/main/plugins/claude) and
10
+ [OpenCode](https://github.com/georgeharker/cribsheet/tree/main/plugins/opencode)
11
+ plugins, and shares the same `crib` server and `sharedserver` instance — so Pi, Claude
12
+ Code, OpenCode, and Neovim all talk to one refcounted process.
13
+
14
+ ## How it fits together
15
+
16
+ Pi has no MCP of its own. Two pieces give it crib:
17
+
18
+ 1. **[`pi-mcp-adapter`](https://pi.dev/packages/pi-mcp-adapter)** — the Pi package that
19
+ speaks MCP. It reads its own `mcp.json` and connects to `crib` over HTTP. **Install
20
+ it too** (`pi install npm:pi-mcp-adapter`).
21
+ 2. **This extension** — the process + directive + command half:
22
+ - **Run crib** on `session_start` via `sharedserver use … -- crib --mcp --http …`,
23
+ refcounted and shared across clients; released on `session_shutdown` when
24
+ `reason === "quit"`.
25
+ - **Inject the directive** on `before_agent_start` (analogue of CC's
26
+ `additionalContext` and OpenCode's `system.transform`).
27
+ - **`/crib <topic>`** — shells out to the crib CLI (`note apropos` + `code lookup`)
28
+ and steers the model to summarise, mirroring `commands/crib.md`.
29
+
30
+ ### Stand-down when combiner-served
31
+
32
+ If a **combiner** already serves crib (the global `MCP_COMBINER` switch, or the
33
+ per-backend `MCP_COMBINER_SERVES_CRIBSHEET` override, which wins), the extension does
34
+ **not** launch a standalone backend — the combiner owns crib's lifecycle. The directive
35
+ and `/crib` command still apply, since crib's tools are present via the combiner too. In
36
+ that setup you register the *combiner* with pi-mcp-adapter (see the mcp-companion Pi
37
+ extension), not crib directly.
38
+
39
+ ## Install
40
+
41
+ ```sh
42
+ # build
43
+ npm --prefix plugins/pi install && npm --prefix plugins/pi run build
44
+ # install into Pi (symlink the package dir; uses "main": dist/index.js)
45
+ ln -sfn "$PWD/plugins/pi" ~/.pi/agent/extensions/cribsheet
46
+ # MCP transport (skip the mcp.json when crib is combiner-served)
47
+ pi install npm:pi-mcp-adapter
48
+ cp plugins/pi/mcp.json.example ~/.config/mcp/mcp.json # standalone only
49
+ ```
50
+
51
+ Build-free live dev: `pi -e ./plugins/pi/src/index.ts`.
52
+
53
+ ## Configuration
54
+
55
+ `PI_CRIBSHEET_*` env namespace (mirrors the OpenCode plugin's `OPENCODE_CRIBSHEET_*`):
56
+
57
+ | Variable | Default | Effect |
58
+ |----------|---------|--------|
59
+ | `PI_CRIBSHEET_PORT` | `7732` | HTTP port crib serves on. |
60
+ | `PI_CRIBSHEET_HOST` | `127.0.0.1` | HTTP host crib binds. |
61
+ | `PI_CRIBSHEET_COMMAND` / `_ARGS` | *(auto: `crib` on PATH)* | Override the crib invocation. |
62
+ | `PI_CRIBSHEET_CHECKOUT` | — | Checkout for `uv run --project <checkout> crib`. |
63
+ | `PI_CRIBSHEET_NAME` | `cribsheet` | `sharedserver` instance name. |
64
+ | `PI_CRIBSHEET_GRACE` | `1h` | `sharedserver` grace period. |
65
+ | `PI_CRIBSHEET_LOG` | — | Capture crib's stdout/stderr (`sharedserver --log-file`); `"none"`/unset disables. |
66
+ | `PI_CRIBSHEET_MANAGE` | `true` | `false` → don't launch (assume crib runs elsewhere). |
67
+ | `PI_CRIBSHEET_INSTRUCTIONS` | `true` | `false` → don't inject the directive. |
68
+ | `PI_CRIBSHEET_COMMAND_ENABLE` | `true` | `false` → don't register `/crib`. |
69
+ | `PI_CRIBSHEET_NOTIFY` | `true` | `false` → don't surface messages via the Pi UI. |
70
+ | `MCP_COMBINER` / `MCP_COMBINER_SERVES_CRIBSHEET` | — | Combiner serves crib → don't launch a standalone backend. |
71
+ | `SHAREDSERVER_BIN` / `SHAREDSERVER_LOCKDIR` | *(auto)* | sharedserver binary / lock dir. |
72
+
73
+ ## Development
74
+
75
+ ```sh
76
+ npm install && npm run typecheck && npm run build
77
+ ```
78
+
79
+ `src/sharedserver-resolve.ts` is vendored byte-identical from
80
+ [`georgeharker/sharedserver`](https://github.com/georgeharker/sharedserver) via
81
+ `scripts/sync-vendored.sh` — edit upstream, re-sync here.
82
+
83
+ ## License
84
+
85
+ MIT © George Harker
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "./pi.js";
2
+ export default function cribsheet(pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAER,YAAY,EAIf,MAAM,SAAS,CAAA;AA0GhB,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAyIxD"}
package/dist/index.js ADDED
@@ -0,0 +1,275 @@
1
+ // Pi extension: run the `crib` (cribsheet) memory + code-index MCP server via the
2
+ // `sharedserver` CLI, inject the reach-for-crib directive into the system prompt, and
3
+ // ship the `/crib` recall command.
4
+ //
5
+ // It is the Pi counterpart of cribsheet's Claude Code and OpenCode plugins, and mirrors
6
+ // their behaviour:
7
+ //
8
+ // 1. Stand-down switch — if a combiner already serves crib (global MCP_COMBINER, or
9
+ // the per-backend MCP_COMBINER_SERVES_CRIBSHEET override, which wins), do NOT
10
+ // launch a standalone backend. The combiner owns crib's lifecycle. Only the launch
11
+ // is gated — the directive and /crib command apply either way, since crib's tools
12
+ // are present via the combiner too.
13
+ // 2. Process — on `session_start`, drive `sharedserver use … -- crib --mcp --http …`
14
+ // so one warm crib is running and refcounted (shared across clients). Released on
15
+ // `session_shutdown` when `reason === "quit"` (reload/resume/fork keep the process
16
+ // and re-attach).
17
+ // 3. Directive — append the reach-for-crib text to the system prompt via
18
+ // `before_agent_start` (analogue of Claude Code's SessionStart additionalContext
19
+ // and OpenCode's system.transform).
20
+ // 4. /crib command — a Pi command mirroring commands/crib.md: shells out to the crib
21
+ // CLI (`note apropos` + `code lookup`) and steers the model to summarise.
22
+ //
23
+ // MCP registration itself (pointing pi-mcp-adapter at crib) is a single mcp.json entry
24
+ // — see mcp.json.example and the README; static, and unnecessary when combiner-served.
25
+ // The sharedserver resolution is ported faithfully from plugins/opencode/src/index.ts.
26
+ import { spawnSync } from "node:child_process";
27
+ import { existsSync, readFileSync } from "node:fs";
28
+ import { dirname, join } from "node:path";
29
+ import { fileURLToPath } from "node:url";
30
+ import { resolveSharedserver } from "./sharedserver-resolve.js";
31
+ const DEFAULT_PORT = 7732;
32
+ const DEFAULT_HOST = "127.0.0.1";
33
+ const DEFAULT_NAME = "cribsheet";
34
+ const DEFAULT_GRACE = "1h";
35
+ // Floor-only against sharedserver's latest release: cribsheet consumes sharedserver
36
+ // rather than shipping it. Kept equal to the sibling plugins' value.
37
+ const SHAREDSERVER_MIN_VERSION = "0.6.7";
38
+ // ── the reach-for-crib directive ───────────────────────────────────
39
+ // Appended to the system prompt so the agent reaches for crib's tools. Canonical
40
+ // source: CLAUDE.md.example at the repo root; a release-time `prepack` copies it to this
41
+ // package's root as instructions.txt (see package.json). A dev/unbuilt run without the
42
+ // copy falls back to empty and simply injects nothing.
43
+ const CRIB_DIRECTIVE = (() => {
44
+ try {
45
+ const here = dirname(fileURLToPath(import.meta.url));
46
+ return readFileSync(join(here, "..", "instructions.txt"), "utf8");
47
+ }
48
+ catch {
49
+ return "";
50
+ }
51
+ })();
52
+ const DIRECTIVE_MARKER = CRIB_DIRECTIVE.split("\n", 1)[0] ?? "";
53
+ // ── env configuration ──────────────────────────────────────────────
54
+ // The PI_CRIBSHEET_* namespace mirrors the OpenCode plugin's OPENCODE_CRIBSHEET_* and
55
+ // the CC hook's CRIBSHEET_* set — one namespace per client.
56
+ function env(name) {
57
+ const v = process.env[name];
58
+ return v !== undefined && v !== "" ? v : undefined;
59
+ }
60
+ function splitArgs(value) {
61
+ if (!value)
62
+ return [];
63
+ return value.split(/\s+/).filter((s) => s.length > 0);
64
+ }
65
+ // ── stand-down switch (mirrors the CC hook's combiner_serves) ──────
66
+ function truthy(v) {
67
+ if (v == null)
68
+ return false;
69
+ return !["", "0", "false", "no", "off"].includes(v.trim().toLowerCase());
70
+ }
71
+ /** Does a combiner serve `name`? The per-backend `MCP_COMBINER_SERVES_<NAME>` override
72
+ * wins over the global `MCP_COMBINER` switch (presence, even empty, counts). These are
73
+ * the cross-tool switches shared with the CC/OpenCode plugins — NOT PI_-namespaced. */
74
+ function combinerServes(name) {
75
+ const key = "MCP_COMBINER_SERVES_" + name.toUpperCase().replace(/[-\s]/g, "_");
76
+ if (key in process.env)
77
+ return truthy(process.env[key]);
78
+ return truthy(process.env.MCP_COMBINER);
79
+ }
80
+ function onPath(cmd) {
81
+ return spawnSync(cmd, ["--version"], { stdio: "ignore", env: process.env }).status === 0;
82
+ }
83
+ /** Resolve how to invoke crib: env command → `crib` on PATH → `uv run --project
84
+ * <checkout> crib`. Returns the base command; callers append their own args. */
85
+ function resolveCrib() {
86
+ const command = env("PI_CRIBSHEET_COMMAND");
87
+ if (command)
88
+ return { cmd: command, args: splitArgs(env("PI_CRIBSHEET_ARGS")) };
89
+ if (onPath("crib"))
90
+ return { cmd: "crib", args: [] };
91
+ const checkout = env("PI_CRIBSHEET_CHECKOUT");
92
+ if (checkout && existsSync(checkout) && onPath("uv")) {
93
+ return { cmd: "uv", args: ["run", "--project", checkout, "crib"] };
94
+ }
95
+ return undefined;
96
+ }
97
+ let attachment = null;
98
+ let cleanupInstalled = false;
99
+ function installProcessCleanup() {
100
+ if (cleanupInstalled)
101
+ return;
102
+ cleanupInstalled = true;
103
+ process.on("exit", () => detach());
104
+ for (const sig of ["SIGINT", "SIGTERM", "SIGHUP"]) {
105
+ process.on(sig, () => {
106
+ detach();
107
+ process.kill(process.pid, sig);
108
+ });
109
+ }
110
+ }
111
+ function detach() {
112
+ if (!attachment)
113
+ return;
114
+ const { binary, name } = attachment;
115
+ attachment = null;
116
+ spawnSync(binary, ["unuse", name, "--pid", String(process.pid)], { stdio: "ignore", env: process.env });
117
+ }
118
+ // ── the extension ──────────────────────────────────────────────────
119
+ export default function cribsheet(pi) {
120
+ const notify = env("PI_CRIBSHEET_NOTIFY") !== "false";
121
+ const wantInstructions = env("PI_CRIBSHEET_INSTRUCTIONS") !== "false";
122
+ const wantCommand = env("PI_CRIBSHEET_COMMAND_ENABLE") !== "false";
123
+ const manage = env("PI_CRIBSHEET_MANAGE") !== "false";
124
+ const name = env("PI_CRIBSHEET_NAME") ?? DEFAULT_NAME;
125
+ const served = combinerServes(name);
126
+ // ── directive: appended every turn (dup-guarded across turns) ──
127
+ pi.on("before_agent_start", (event) => {
128
+ if (!wantInstructions || !CRIB_DIRECTIVE)
129
+ return;
130
+ if (DIRECTIVE_MARKER && event.systemPrompt.includes(DIRECTIVE_MARKER))
131
+ return;
132
+ return { systemPrompt: `${event.systemPrompt}\n\n${CRIB_DIRECTIVE}` };
133
+ });
134
+ // ── /crib command: recall memory + code index, then steer the model ──
135
+ if (wantCommand) {
136
+ pi.registerCommand("crib", {
137
+ description: "Consult crib (recall memory + code index); verb: system-prompt shows the directive",
138
+ getArgumentCompletions: (prefix) => completeVerbs(prefix),
139
+ handler: async (args, ctx) => {
140
+ const arg = args.trim();
141
+ if (arg === "system-prompt") {
142
+ showDirective(ctx, "cribsheet", CRIB_DIRECTIVE, wantInstructions);
143
+ return;
144
+ }
145
+ const topic = arg;
146
+ if (!topic) {
147
+ ctx.ui?.notify?.("crib: give me a topic (e.g. /crib auth flow), or /crib system-prompt", "warn");
148
+ return;
149
+ }
150
+ const crib = resolveCrib();
151
+ if (!crib) {
152
+ ctx.ui?.notify?.("crib: CLI not found; install cribsheet or set $PI_CRIBSHEET_COMMAND", "error");
153
+ return;
154
+ }
155
+ const run = async (sub) => {
156
+ try {
157
+ const r = await pi.exec(crib.cmd, [...crib.args, ...sub, topic], {
158
+ signal: ctx.signal,
159
+ timeout: 30_000,
160
+ });
161
+ return r.stdout.trim() || r.stderr.trim();
162
+ }
163
+ catch (e) {
164
+ return `(crib ${sub.join(" ")} failed: ${e instanceof Error ? e.message : String(e)})`;
165
+ }
166
+ };
167
+ const [memory, code] = await Promise.all([run(["note", "apropos"]), run(["code", "lookup"])]);
168
+ const content = `Consult crib first for "${topic}" — recalled below. Summarise what crib already knows: ` +
169
+ "lead with the notes' answer, fold in any relevant code symbols, and cite note/symbol names " +
170
+ "so the user can `crib note read` / `crib code dossier` to go deeper. If nothing relevant came " +
171
+ "back, say so plainly rather than guessing.\n\n" +
172
+ `Memory — semantic recall (crib note apropos):\n${memory}\n\n` +
173
+ `Code index — symbols by concept or name (crib code lookup):\n${code}`;
174
+ pi.sendMessage({ customType: "crib-recall", content, display: true, details: { topic } }, { triggerTurn: true, deliverAs: "steer" });
175
+ },
176
+ });
177
+ }
178
+ // Combiner-served or manage=false: nothing to launch (crib runs elsewhere). The
179
+ // directive + command above still apply.
180
+ if (served || !manage)
181
+ return;
182
+ // ── process: launch on session_start, release on session_shutdown("quit") ──
183
+ pi.on("session_start", (_event, ctx) => {
184
+ if (attachment)
185
+ return;
186
+ const log = makeLog(ctx, notify);
187
+ const binary = resolveSharedserver({
188
+ label: "cribsheet",
189
+ minVersion: SHAREDSERVER_MIN_VERSION,
190
+ installerUrl: "https://github.com/georgeharker/sharedserver/releases/latest/download/sharedserver-installer.sh",
191
+ }, env("SHAREDSERVER_BIN"), process.env, log);
192
+ if (!binary) {
193
+ log("error", "sharedserver binary not found; set $SHAREDSERVER_BIN, or PI_CRIBSHEET_MANAGE=false");
194
+ return;
195
+ }
196
+ const crib = resolveCrib();
197
+ if (!crib) {
198
+ log("error", "crib command not found; install cribsheet (so `crib` is on PATH), or set " +
199
+ "$PI_CRIBSHEET_COMMAND / $PI_CRIBSHEET_CHECKOUT");
200
+ return;
201
+ }
202
+ const port = env("PI_CRIBSHEET_PORT") ?? String(DEFAULT_PORT);
203
+ const host = env("PI_CRIBSHEET_HOST") ?? DEFAULT_HOST;
204
+ const grace = env("PI_CRIBSHEET_GRACE") ?? DEFAULT_GRACE;
205
+ // Assemble: crib [extra] --mcp --http --host <host> --port <port>
206
+ const serve = ["--mcp", "--http", "--host", host, "--port", port];
207
+ const useArgs = [
208
+ "use",
209
+ name,
210
+ "--pid",
211
+ String(process.pid),
212
+ "--grace-period",
213
+ grace,
214
+ "--metadata",
215
+ `pi-${process.pid}`,
216
+ ];
217
+ const logFile = env("PI_CRIBSHEET_LOG");
218
+ if (logFile && logFile !== "none")
219
+ useArgs.push("--log-file", logFile);
220
+ useArgs.push("--", crib.cmd, ...crib.args, ...serve);
221
+ installProcessCleanup();
222
+ const result = spawnSync(binary, useArgs, { stdio: "pipe", env: process.env });
223
+ if (result.error) {
224
+ log("error", `${name}: failed to spawn sharedserver (${result.error.message})`);
225
+ return;
226
+ }
227
+ if (result.status !== 0) {
228
+ const stderr = result.stderr?.toString().trim();
229
+ log("error", `${name}: sharedserver use exited ${result.status}${stderr ? ` (${stderr})` : ""}`);
230
+ return;
231
+ }
232
+ attachment = { binary, name };
233
+ log("info", `crib "${name}" attached on ${host}:${port} (${crib.cmd} ${crib.args.join(" ")})`);
234
+ });
235
+ pi.on("session_shutdown", (event) => {
236
+ if (event.reason === "quit")
237
+ detach();
238
+ });
239
+ }
240
+ // ── helpers ────────────────────────────────────────────────────────
241
+ // Slash-command verbs. `system-prompt` shows the directive this extension injects — the
242
+ // show-command pattern from pi-custom-system-prompt, since `before_agent_start`
243
+ // injections are per-turn and never appear in Pi's own `/system-prompt` (base only).
244
+ const COMMAND_VERBS = ["system-prompt"];
245
+ function completeVerbs(prefix) {
246
+ const p = prefix.trim();
247
+ const matches = COMMAND_VERBS.filter((v) => v.startsWith(p));
248
+ return matches.length ? matches.map((v) => ({ value: v, label: v })) : null;
249
+ }
250
+ const SHOW_LIMIT = 1600;
251
+ function showDirective(ctx, label, directive, enabled) {
252
+ if (!directive) {
253
+ ctx.ui?.notify?.(`${label}: no directive bundled (instructions.txt missing)`, "warn");
254
+ return;
255
+ }
256
+ const head = enabled
257
+ ? `${label} directive — injected into the system prompt on every turn (before_agent_start):`
258
+ : `${label} directive — injection is DISABLED this session; it would be:`;
259
+ const body = directive.length > SHOW_LIMIT
260
+ ? `${directive.slice(0, SHOW_LIMIT)}\n\n… (${directive.length} chars total)`
261
+ : directive;
262
+ ctx.ui?.notify?.(`${head}\n\n${body}`, "info");
263
+ }
264
+ function makeLog(ctx, notify) {
265
+ return (level, message) => {
266
+ const line = `cribsheet: ${message}`;
267
+ if (notify && ctx.hasUI && ctx.ui?.notify) {
268
+ ctx.ui.notify(line, level === "error" ? "error" : level === "warn" ? "warn" : "info");
269
+ }
270
+ else if (level === "error" || level === "warn") {
271
+ process.stderr.write(`${line}\n`);
272
+ }
273
+ };
274
+ }
275
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/pi.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ export type SessionStartReason = "startup" | "reload" | "new" | "resume" | "fork";
2
+ export type SessionShutdownReason = "quit" | "reload" | "new" | "resume" | "fork";
3
+ export type SessionStartEvent = {
4
+ reason: SessionStartReason;
5
+ previousSessionFile?: string;
6
+ };
7
+ export type SessionShutdownEvent = {
8
+ reason: SessionShutdownReason;
9
+ targetSessionFile?: string;
10
+ };
11
+ export type BeforeAgentStartEvent = {
12
+ systemPrompt: string;
13
+ };
14
+ export type BeforeAgentStartResult = {
15
+ systemPrompt?: string;
16
+ } | void;
17
+ export type ExtensionContext = {
18
+ cwd: string;
19
+ mode: "tui" | "rpc" | "json" | "print";
20
+ hasUI: boolean;
21
+ signal?: AbortSignal;
22
+ ui?: {
23
+ notify?: (message: string, level?: "info" | "warn" | "error") => void;
24
+ };
25
+ };
26
+ /** Context handed to a command handler. Superset of ExtensionContext in practice; we
27
+ * only read `signal`, `ui`, and `hasUI`. */
28
+ export type ExtensionCommandContext = ExtensionContext;
29
+ export type AutocompleteItem = {
30
+ value: string;
31
+ label?: string;
32
+ };
33
+ export type ExecResult = {
34
+ stdout: string;
35
+ stderr: string;
36
+ code: number;
37
+ killed: boolean;
38
+ };
39
+ export type ExecOptions = {
40
+ signal?: AbortSignal;
41
+ timeout?: number;
42
+ cwd?: string;
43
+ env?: NodeJS.ProcessEnv;
44
+ };
45
+ /** An LLM-visible message injected from a command. `display:true` shows it in the TUI;
46
+ * `{triggerTurn:true, deliverAs:"steer"}` makes the model act on it this turn. */
47
+ export type SendMessage = {
48
+ customType: string;
49
+ content: string;
50
+ display?: boolean;
51
+ details?: Record<string, unknown>;
52
+ };
53
+ export type SendMessageOptions = {
54
+ triggerTurn?: boolean;
55
+ deliverAs?: "steer" | "followUp";
56
+ };
57
+ export type CommandSpec = {
58
+ description: string;
59
+ handler: (args: string, ctx: ExtensionCommandContext) => void | Promise<void>;
60
+ getArgumentCompletions?: (prefix: string) => AutocompleteItem[] | null;
61
+ };
62
+ export interface ExtensionAPI {
63
+ on(event: "session_start", handler: (event: SessionStartEvent, ctx: ExtensionContext) => void | Promise<void>): void;
64
+ on(event: "session_shutdown", handler: (event: SessionShutdownEvent, ctx: ExtensionContext) => void | Promise<void>): void;
65
+ on(event: "before_agent_start", handler: (event: BeforeAgentStartEvent, ctx: ExtensionContext) => BeforeAgentStartResult | Promise<BeforeAgentStartResult>): void;
66
+ registerCommand(name: string, spec: CommandSpec): void;
67
+ exec(command: string, args: string[], options?: ExecOptions): Promise<ExecResult>;
68
+ sendMessage(message: SendMessage, options?: SendMessageOptions): void;
69
+ }
70
+ //# sourceMappingURL=pi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"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"}
package/dist/pi.js ADDED
@@ -0,0 +1,10 @@
1
+ // Narrow, local typing for the slice of Pi's extension API this plugin uses.
2
+ //
3
+ // Pi (badlogic/pi-mono, earendil-works/pi) ships its ExtensionAPI types with the
4
+ // harness rather than as a standalone npm package we can depend on, so we declare
5
+ // exactly the surface we touch — three lifecycle events, `registerCommand`, `exec`,
6
+ // and `sendMessage`. Kept deliberately minimal: a wider mirror would rot against a
7
+ // moving upstream. Signatures follow the published extension docs
8
+ // (https://pi.dev/docs/latest/extensions).
9
+ export {};
10
+ //# sourceMappingURL=pi.js.map
package/dist/pi.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../src/pi.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,iFAAiF;AACjF,kFAAkF;AAClF,oFAAoF;AACpF,mFAAmF;AACnF,kEAAkE;AAClE,2CAA2C"}
@@ -0,0 +1,19 @@
1
+ export type LogFn = (level: "info" | "warn" | "error", message: string) => void;
2
+ export type ToastFn = (variant: "success" | "warning" | "error", message: string) => void;
3
+ export type ResolveConfig = {
4
+ /** Prefix for user-facing messages. Default "sharedserver". */
5
+ label?: string;
6
+ /** Minimum acceptable version. Defaults to pkgVersion (lockstep). */
7
+ minVersion?: string;
8
+ /** Installer to fetch. Defaults to the release pinned to pkgVersion. */
9
+ installerUrl?: string;
10
+ /** The host package's own version — only meaningful in lockstep mode. */
11
+ pkgVersion?: string;
12
+ };
13
+ /** Resolve the sharedserver binary, fetching a release when nothing usable is present.
14
+ *
15
+ * Behaviourally identical to plugins/claude/bin/sharedserver — same ladder, floor,
16
+ * lock and degrade-rather-than-die fallback, so a user running both clients gets the
17
+ * same answer to "which sharedserver am I on, and why". */
18
+ export declare function resolveSharedserver(cfg: ResolveConfig, override: string | undefined, env: NodeJS.ProcessEnv, log?: LogFn, toast?: ToastFn): string | undefined;
19
+ //# sourceMappingURL=sharedserver-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharedserver-resolve.d.ts","sourceRoot":"","sources":["../src/sharedserver-resolve.ts"],"names":[],"mappings":"AAgBA,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;AAC/E,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;AAEzF,MAAM,MAAM,aAAa,GAAG;IACxB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAyID;;;;4DAI4D;AAC5D,wBAAgB,mBAAmB,CAC/B,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,GAAG,CAAC,EAAE,KAAK,EACX,KAAK,CAAC,EAAE,OAAO,GAChB,MAAM,GAAG,SAAS,CA4CpB"}