pi-studio-opencode 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 (60) hide show
  1. package/ARCHITECTURE.md +122 -0
  2. package/LICENSE +21 -0
  3. package/README.md +108 -0
  4. package/dist/demo-host-pi.d.ts +1 -0
  5. package/dist/demo-host-pi.js +71 -0
  6. package/dist/demo-host-pi.js.map +1 -0
  7. package/dist/demo-host.d.ts +1 -0
  8. package/dist/demo-host.js +154 -0
  9. package/dist/demo-host.js.map +1 -0
  10. package/dist/host-opencode-plugin.d.ts +52 -0
  11. package/dist/host-opencode-plugin.js +396 -0
  12. package/dist/host-opencode-plugin.js.map +1 -0
  13. package/dist/host-opencode.d.ts +154 -0
  14. package/dist/host-opencode.js +627 -0
  15. package/dist/host-opencode.js.map +1 -0
  16. package/dist/host-pi.d.ts +45 -0
  17. package/dist/host-pi.js +258 -0
  18. package/dist/host-pi.js.map +1 -0
  19. package/dist/install-config.d.ts +36 -0
  20. package/dist/install-config.js +136 -0
  21. package/dist/install-config.js.map +1 -0
  22. package/dist/install.d.ts +16 -0
  23. package/dist/install.js +168 -0
  24. package/dist/install.js.map +1 -0
  25. package/dist/launcher.d.ts +2 -0
  26. package/dist/launcher.js +124 -0
  27. package/dist/launcher.js.map +1 -0
  28. package/dist/main.d.ts +1 -0
  29. package/dist/main.js +732 -0
  30. package/dist/main.js.map +1 -0
  31. package/dist/mock-pi-session.d.ts +27 -0
  32. package/dist/mock-pi-session.js +138 -0
  33. package/dist/mock-pi-session.js.map +1 -0
  34. package/dist/open-browser.d.ts +1 -0
  35. package/dist/open-browser.js +29 -0
  36. package/dist/open-browser.js.map +1 -0
  37. package/dist/opencode-plugin.d.ts +3 -0
  38. package/dist/opencode-plugin.js +326 -0
  39. package/dist/opencode-plugin.js.map +1 -0
  40. package/dist/prototype-pdf.d.ts +12 -0
  41. package/dist/prototype-pdf.js +991 -0
  42. package/dist/prototype-pdf.js.map +1 -0
  43. package/dist/prototype-server.d.ts +88 -0
  44. package/dist/prototype-server.js +1002 -0
  45. package/dist/prototype-server.js.map +1 -0
  46. package/dist/prototype-theme.d.ts +36 -0
  47. package/dist/prototype-theme.js +1471 -0
  48. package/dist/prototype-theme.js.map +1 -0
  49. package/dist/studio-core.d.ts +63 -0
  50. package/dist/studio-core.js +251 -0
  51. package/dist/studio-core.js.map +1 -0
  52. package/dist/studio-host-types.d.ts +50 -0
  53. package/dist/studio-host-types.js +14 -0
  54. package/dist/studio-host-types.js.map +1 -0
  55. package/examples/opencode/INSTALL.md +67 -0
  56. package/examples/opencode/opencode.local-path.jsonc +16 -0
  57. package/package.json +68 -0
  58. package/static/prototype.css +1277 -0
  59. package/static/prototype.html +173 -0
  60. package/static/prototype.js +3198 -0
@@ -0,0 +1,45 @@
1
+ import type { StudioHost, StudioHostCapabilities, StudioHostListener, StudioHostState } from "./studio-host-types.js";
2
+ export type PiSessionEventLike = {
3
+ type: string;
4
+ message?: unknown;
5
+ };
6
+ export type PiSessionLike = {
7
+ sessionId: string;
8
+ sessionFile?: string;
9
+ isStreaming: boolean;
10
+ prompt(text: string, options?: {
11
+ streamingBehavior?: "steer" | "followUp";
12
+ }): Promise<void>;
13
+ steer(text: string): Promise<void>;
14
+ abort(): Promise<void>;
15
+ subscribe(listener: (event: PiSessionEventLike) => void): () => void;
16
+ dispose?(): void;
17
+ };
18
+ export type PiStudioHostOptions = {
19
+ session: PiSessionLike;
20
+ eventLogger?: (line: string) => void;
21
+ };
22
+ export declare class PiStudioHost implements StudioHost {
23
+ private readonly options;
24
+ private readonly session;
25
+ private readonly listeners;
26
+ private readonly core;
27
+ private unsubscribeSession;
28
+ private closed;
29
+ static create(options: PiStudioHostOptions): Promise<PiStudioHost>;
30
+ private constructor();
31
+ getState(): StudioHostState;
32
+ getCapabilities(): StudioHostCapabilities;
33
+ getHistory(): import("./studio-host-types.js").StudioHostHistoryItem[];
34
+ subscribe(listener: StudioHostListener): () => void;
35
+ startRun(prompt: string): Promise<void>;
36
+ queueSteer(prompt: string): Promise<void>;
37
+ stop(): Promise<void>;
38
+ waitUntilIdle(timeoutMs?: number): Promise<void>;
39
+ close(): Promise<void>;
40
+ private initialize;
41
+ private handleEvent;
42
+ private emitState;
43
+ private assertReady;
44
+ }
45
+ export declare function createPiStudioHost(options: PiStudioHostOptions): Promise<StudioHost>;
@@ -0,0 +1,258 @@
1
+ import { setTimeout as sleep } from "node:timers/promises";
2
+ import { StudioCore } from "./studio-core.js";
3
+ const PI_HOST_CAPABILITIES = {
4
+ steeringMode: "native-steer",
5
+ stopSupported: true,
6
+ };
7
+ function normalizePromptText(text) {
8
+ if (typeof text !== "string")
9
+ return null;
10
+ const trimmed = text.trim();
11
+ return trimmed.length > 0 ? trimmed : null;
12
+ }
13
+ function extractMessageId(message) {
14
+ const msg = message;
15
+ return typeof msg?.id === "string" ? msg.id : null;
16
+ }
17
+ function extractStopReason(message) {
18
+ const msg = message;
19
+ return typeof msg?.stopReason === "string" ? msg.stopReason : null;
20
+ }
21
+ function extractAssistantText(message) {
22
+ const msg = message;
23
+ if (!msg || msg.role !== "assistant")
24
+ return null;
25
+ if (typeof msg.content === "string") {
26
+ return normalizePromptText(msg.content);
27
+ }
28
+ if (!Array.isArray(msg.content))
29
+ return null;
30
+ const blocks = [];
31
+ for (const part of msg.content) {
32
+ if (!part || typeof part !== "object")
33
+ continue;
34
+ const partType = typeof part.type === "string" ? part.type : "";
35
+ if (typeof part.text === "string") {
36
+ if (!partType || partType === "text" || partType === "output_text") {
37
+ blocks.push(part.text);
38
+ }
39
+ continue;
40
+ }
41
+ if (part.text && typeof part.text === "object" && typeof part.text.value === "string") {
42
+ if (!partType || partType === "text" || partType === "output_text") {
43
+ blocks.push(part.text.value);
44
+ }
45
+ }
46
+ }
47
+ return normalizePromptText(blocks.join("\n\n"));
48
+ }
49
+ function extractUserText(message) {
50
+ const msg = message;
51
+ if (!msg || msg.role !== "user")
52
+ return null;
53
+ if (typeof msg.content === "string") {
54
+ return normalizePromptText(msg.content);
55
+ }
56
+ if (!Array.isArray(msg.content))
57
+ return null;
58
+ const blocks = [];
59
+ for (const part of msg.content) {
60
+ if (!part || typeof part !== "object")
61
+ continue;
62
+ const partType = typeof part.type === "string" ? part.type : "";
63
+ if (typeof part.text === "string") {
64
+ if (!partType || partType === "text" || partType === "input_text") {
65
+ blocks.push(part.text);
66
+ }
67
+ continue;
68
+ }
69
+ if (part.text && typeof part.text === "object" && typeof part.text.value === "string") {
70
+ if (!partType || partType === "text" || partType === "input_text") {
71
+ blocks.push(part.text.value);
72
+ }
73
+ }
74
+ }
75
+ return normalizePromptText(blocks.join("\n\n"));
76
+ }
77
+ function extractAssistantError(message) {
78
+ const msg = message;
79
+ if (typeof msg?.error === "string" && msg.error.trim()) {
80
+ return msg.error;
81
+ }
82
+ if (msg?.error && typeof msg.error === "object") {
83
+ const name = typeof msg.error.name === "string" ? msg.error.name : "AssistantError";
84
+ const messageText = typeof msg.error.message === "string" ? msg.error.message : "unknown error";
85
+ return `${name}: ${messageText}`;
86
+ }
87
+ if (msg?.stopReason === "aborted") {
88
+ return "Aborted";
89
+ }
90
+ return undefined;
91
+ }
92
+ function summarizeEvent(event) {
93
+ if (event.type === "message_end") {
94
+ const role = typeof event.message?.role === "string"
95
+ ? event.message.role
96
+ : "?";
97
+ return `${event.type} role=${role}`;
98
+ }
99
+ return event.type;
100
+ }
101
+ export class PiStudioHost {
102
+ options;
103
+ session;
104
+ listeners = new Set();
105
+ core;
106
+ unsubscribeSession = null;
107
+ closed = false;
108
+ static async create(options) {
109
+ const host = new PiStudioHost(options);
110
+ host.initialize();
111
+ return host;
112
+ }
113
+ constructor(options) {
114
+ this.options = options;
115
+ this.session = options.session;
116
+ this.core = new StudioCore({
117
+ backend: "pi",
118
+ sessionId: options.session.sessionId,
119
+ sessionTitle: options.session.sessionFile ?? null,
120
+ });
121
+ this.core.noteBackendStatus(options.session.isStreaming ? "streaming" : "idle");
122
+ }
123
+ getState() {
124
+ return this.core.getState();
125
+ }
126
+ getCapabilities() {
127
+ return { ...PI_HOST_CAPABILITIES };
128
+ }
129
+ getHistory() {
130
+ return this.core.getHistory();
131
+ }
132
+ subscribe(listener) {
133
+ this.listeners.add(listener);
134
+ listener(this.getState());
135
+ return () => {
136
+ this.listeners.delete(listener);
137
+ };
138
+ }
139
+ async startRun(prompt) {
140
+ this.assertReady();
141
+ const submission = this.core.startRun(prompt);
142
+ this.emitState();
143
+ await this.session.prompt(submission.promptText);
144
+ }
145
+ async queueSteer(prompt) {
146
+ this.assertReady();
147
+ this.core.queueSteer(prompt);
148
+ this.emitState();
149
+ if (this.session.isStreaming) {
150
+ await this.session.steer(prompt);
151
+ return;
152
+ }
153
+ const activated = this.core.activateNextQueuedSteer();
154
+ if (!activated)
155
+ return;
156
+ this.emitState();
157
+ await this.session.prompt(activated.promptText);
158
+ }
159
+ async stop() {
160
+ this.assertReady();
161
+ if (this.core.getState().runState !== "running")
162
+ return;
163
+ this.core.markStopRequested({ clearQueuedSteers: true, backendStatus: "aborting" });
164
+ this.emitState();
165
+ await this.session.abort();
166
+ }
167
+ async waitUntilIdle(timeoutMs = 60_000) {
168
+ const started = Date.now();
169
+ while (Date.now() - started < timeoutMs) {
170
+ const state = this.core.getState();
171
+ if (state.runState === "idle" && !this.core.hasActiveChain() && !state.activePromptId && state.queueLength === 0) {
172
+ return;
173
+ }
174
+ await sleep(100);
175
+ }
176
+ throw new Error("Timed out waiting for pi host to become idle.");
177
+ }
178
+ async close() {
179
+ if (this.closed)
180
+ return;
181
+ this.closed = true;
182
+ this.unsubscribeSession?.();
183
+ this.unsubscribeSession = null;
184
+ if (this.session.dispose) {
185
+ this.session.dispose();
186
+ }
187
+ this.core.markClosed();
188
+ this.emitState();
189
+ }
190
+ initialize() {
191
+ this.unsubscribeSession = this.session.subscribe((event) => {
192
+ this.options.eventLogger?.(`[event] ${summarizeEvent(event)}`);
193
+ this.handleEvent(event);
194
+ });
195
+ }
196
+ handleEvent(event) {
197
+ if (this.closed)
198
+ return;
199
+ if (event.type === "agent_start") {
200
+ this.core.noteBackendStatus("streaming");
201
+ this.emitState();
202
+ return;
203
+ }
204
+ if (event.type === "agent_end") {
205
+ this.core.noteBackendIdle();
206
+ this.emitState();
207
+ return;
208
+ }
209
+ if (event.type !== "message_end")
210
+ return;
211
+ const userText = extractUserText(event.message);
212
+ if (userText) {
213
+ this.core.noteUserMessage({
214
+ text: userText,
215
+ messageId: extractMessageId(event.message),
216
+ });
217
+ this.emitState();
218
+ return;
219
+ }
220
+ const role = typeof event.message?.role === "string"
221
+ ? event.message.role
222
+ : null;
223
+ if (role !== "assistant")
224
+ return;
225
+ if (extractStopReason(event.message) === "toolUse")
226
+ return;
227
+ const assistantText = extractAssistantText(event.message);
228
+ const assistantError = extractAssistantError(event.message);
229
+ if (!assistantText && !assistantError)
230
+ return;
231
+ this.core.completeActiveResponse({
232
+ responseMessageId: extractMessageId(event.message),
233
+ responseText: assistantText ?? "",
234
+ responseError: assistantError,
235
+ completedAt: Date.now(),
236
+ });
237
+ this.emitState();
238
+ }
239
+ emitState() {
240
+ const snapshot = this.getState();
241
+ for (const listener of this.listeners) {
242
+ listener(snapshot);
243
+ }
244
+ }
245
+ assertReady() {
246
+ const state = this.core.getState();
247
+ if (this.closed || state.runState === "closed") {
248
+ throw new Error("Host is closed.");
249
+ }
250
+ if (state.runState === "error") {
251
+ throw new Error(state.lastError ?? "Host is in an error state.");
252
+ }
253
+ }
254
+ }
255
+ export async function createPiStudioHost(options) {
256
+ return PiStudioHost.create(options);
257
+ }
258
+ //# sourceMappingURL=host-pi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-pi.js","sourceRoot":"","sources":["../src/host-pi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export declare const OPENCODE_CONFIG_SCHEMA = "https://opencode.ai/config.json";
2
+ export declare const DEFAULT_STUDIO_COMMAND_NAME = "studio";
3
+ export declare const DEFAULT_STUDIO_COMMAND_TEMPLATE = "Open \u03C0 Studio for this active opencode session.";
4
+ export declare const DEFAULT_STUDIO_COMMAND_DESCRIPTION = "Open \u03C0 Studio attached to the current opencode session";
5
+ export type OpencodeCommandEntry = {
6
+ template: string;
7
+ description?: string;
8
+ agent?: string;
9
+ model?: string;
10
+ subtask?: boolean;
11
+ [key: string]: unknown;
12
+ };
13
+ export type OpencodeConfigFile = {
14
+ $schema?: string;
15
+ plugin?: string[];
16
+ command?: Record<string, OpencodeCommandEntry>;
17
+ [key: string]: unknown;
18
+ };
19
+ export type MergePiStudioOpencodeConfigResult = {
20
+ config: OpencodeConfigFile;
21
+ changed: boolean;
22
+ addedPlugin: boolean;
23
+ addedCommand: boolean;
24
+ setSchema: boolean;
25
+ existingPluginSpec: string | null;
26
+ };
27
+ export declare function stripJsonComments(input: string): string;
28
+ export declare function parseOpencodeConfigText(text: string): OpencodeConfigFile;
29
+ export declare function buildStudioCommandEntry(): OpencodeCommandEntry;
30
+ export declare function normalizePluginIdentity(spec: string): string;
31
+ export declare function formatOpencodeConfig(config: OpencodeConfigFile): string;
32
+ export declare function mergePiStudioOpencodeIntoConfig(config: OpencodeConfigFile, options?: {
33
+ pluginSpec?: string;
34
+ packageName?: string;
35
+ commandName?: string;
36
+ }): MergePiStudioOpencodeConfigResult;
@@ -0,0 +1,136 @@
1
+ import { basename } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ export const OPENCODE_CONFIG_SCHEMA = "https://opencode.ai/config.json";
4
+ export const DEFAULT_STUDIO_COMMAND_NAME = "studio";
5
+ export const DEFAULT_STUDIO_COMMAND_TEMPLATE = "Open π Studio for this active opencode session.";
6
+ export const DEFAULT_STUDIO_COMMAND_DESCRIPTION = "Open π Studio attached to the current opencode session";
7
+ export function stripJsonComments(input) {
8
+ let out = "";
9
+ let quote = null;
10
+ let escaping = false;
11
+ let inLineComment = false;
12
+ let inBlockComment = false;
13
+ for (let i = 0; i < input.length; i += 1) {
14
+ const ch = input[i];
15
+ const next = input[i + 1] ?? "";
16
+ if (inLineComment) {
17
+ if (ch === "\n") {
18
+ inLineComment = false;
19
+ out += ch;
20
+ }
21
+ continue;
22
+ }
23
+ if (inBlockComment) {
24
+ if (ch === "*" && next === "/") {
25
+ inBlockComment = false;
26
+ i += 1;
27
+ }
28
+ continue;
29
+ }
30
+ if (quote) {
31
+ out += ch;
32
+ if (escaping) {
33
+ escaping = false;
34
+ }
35
+ else if (ch === "\\") {
36
+ escaping = true;
37
+ }
38
+ else if (ch === quote) {
39
+ quote = null;
40
+ }
41
+ continue;
42
+ }
43
+ if (ch === '"' || ch === "'") {
44
+ quote = ch;
45
+ out += ch;
46
+ continue;
47
+ }
48
+ if (ch === "/" && next === "/") {
49
+ inLineComment = true;
50
+ i += 1;
51
+ continue;
52
+ }
53
+ if (ch === "/" && next === "*") {
54
+ inBlockComment = true;
55
+ i += 1;
56
+ continue;
57
+ }
58
+ out += ch;
59
+ }
60
+ return out;
61
+ }
62
+ export function parseOpencodeConfigText(text) {
63
+ const trimmed = text.trim();
64
+ if (!trimmed)
65
+ return {};
66
+ const parsed = JSON.parse(stripJsonComments(text));
67
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
68
+ throw new Error("OpenCode config must be a JSON object.");
69
+ }
70
+ return parsed;
71
+ }
72
+ export function buildStudioCommandEntry() {
73
+ return {
74
+ template: DEFAULT_STUDIO_COMMAND_TEMPLATE,
75
+ description: DEFAULT_STUDIO_COMMAND_DESCRIPTION,
76
+ };
77
+ }
78
+ function isLikelyPathSpec(spec) {
79
+ return spec.startsWith("file://")
80
+ || spec.startsWith("/")
81
+ || spec.startsWith("./")
82
+ || spec.startsWith("../")
83
+ || spec.startsWith("~/")
84
+ || /^[A-Za-z]:[\\/]/.test(spec);
85
+ }
86
+ function normalizePackageSpec(spec) {
87
+ const trimmed = spec.trim();
88
+ const lastAtIndex = trimmed.lastIndexOf("@");
89
+ return lastAtIndex > 0 ? trimmed.slice(0, lastAtIndex) : trimmed;
90
+ }
91
+ export function normalizePluginIdentity(spec) {
92
+ const trimmed = spec.trim();
93
+ if (!trimmed)
94
+ return "";
95
+ if (isLikelyPathSpec(trimmed)) {
96
+ const pathValue = trimmed.startsWith("file://") ? fileURLToPath(trimmed) : trimmed;
97
+ return basename(pathValue.replace(/[\\/]+$/, "")).toLowerCase();
98
+ }
99
+ return normalizePackageSpec(trimmed).toLowerCase();
100
+ }
101
+ export function formatOpencodeConfig(config) {
102
+ return `${JSON.stringify(config, null, 2)}\n`;
103
+ }
104
+ export function mergePiStudioOpencodeIntoConfig(config, options) {
105
+ const pluginSpec = options?.pluginSpec?.trim() || "pi-studio-opencode@latest";
106
+ const packageName = options?.packageName?.trim() || "pi-studio-opencode";
107
+ const commandName = options?.commandName?.trim() || DEFAULT_STUDIO_COMMAND_NAME;
108
+ const packageIdentity = normalizePluginIdentity(packageName);
109
+ const existingPlugins = Array.isArray(config.plugin) ? [...config.plugin] : [];
110
+ const existingPluginSpec = existingPlugins.find((entry) => normalizePluginIdentity(entry) === packageIdentity) ?? null;
111
+ const addedPlugin = !existingPluginSpec;
112
+ const plugin = addedPlugin ? [...existingPlugins, pluginSpec] : existingPlugins;
113
+ const existingCommands = config.command && typeof config.command === "object" && !Array.isArray(config.command)
114
+ ? { ...config.command }
115
+ : {};
116
+ const addedCommand = !existingCommands[commandName];
117
+ if (addedCommand) {
118
+ existingCommands[commandName] = buildStudioCommandEntry();
119
+ }
120
+ const setSchema = !config.$schema;
121
+ const nextConfig = {
122
+ ...config,
123
+ ...(setSchema ? { $schema: OPENCODE_CONFIG_SCHEMA } : {}),
124
+ plugin,
125
+ command: existingCommands,
126
+ };
127
+ return {
128
+ config: nextConfig,
129
+ changed: addedPlugin || addedCommand || setSchema,
130
+ addedPlugin,
131
+ addedCommand,
132
+ setSchema,
133
+ existingPluginSpec,
134
+ };
135
+ }
136
+ //# sourceMappingURL=install-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-config.js","sourceRoot":"","sources":["../src/install-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,iCAAiC,CAAC;AACxE,MAAM,CAAC,MAAM,2BAA2B,GAAG,QAAQ,CAAC;AACpD,MAAM,CAAC,MAAM,+BAA+B,GAAG,iDAAiD,CAAC;AACjG,MAAM,CAAC,MAAM,kCAAkC,GAAG,wDAAwD,CAAC;AA2B3G,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,GAAqB,IAAI,CAAC;IACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAEhC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB,aAAa,GAAG,KAAK,CAAC;gBACtB,GAAG,IAAI,EAAE,CAAC;YACZ,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBAC/B,cAAc,GAAG,KAAK,CAAC;gBACvB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,IAAI,EAAE,CAAC;YACV,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;iBAAM,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACvB,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;iBAAM,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;gBACxB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,KAAK,GAAG,EAAE,CAAC;YACX,GAAG,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,aAAa,GAAG,IAAI,CAAC;YACrB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC/B,cAAc,GAAG,IAAI,CAAC;YACtB,CAAC,IAAI,CAAC,CAAC;YACP,SAAS;QACX,CAAC;QAED,GAAG,IAAI,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAY,CAAC;IAC9D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAA4B,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,QAAQ,EAAE,+BAA+B;QACzC,WAAW,EAAE,kCAAkC;KAChD,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;WAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;WACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;WACrB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;WACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;WACrB,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACnF,OAAO,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAA0B;IAC7D,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,MAA0B,EAC1B,OAIC;IAED,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,2BAA2B,CAAC;IAC9E,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,oBAAoB,CAAC;IACzE,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,2BAA2B,CAAC;IAChF,MAAM,eAAe,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IAE7D,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,MAAM,kBAAkB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC,KAAK,eAAe,CAAC,IAAI,IAAI,CAAC;IACvH,MAAM,WAAW,GAAG,CAAC,kBAAkB,CAAC;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;IAEhF,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7G,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE;QACvB,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,YAAY,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,YAAY,EAAE,CAAC;QACjB,gBAAgB,CAAC,WAAW,CAAC,GAAG,uBAAuB,EAAE,CAAC;IAC5D,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IAElC,MAAM,UAAU,GAAuB;QACrC,GAAG,MAAM;QACT,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM;QACN,OAAO,EAAE,gBAAgB;KAC1B,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,WAAW,IAAI,YAAY,IAAI,SAAS;QACjD,WAAW;QACX,YAAY;QACZ,SAAS;QACT,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type MergePiStudioOpencodeConfigResult } from "./install-config.js";
2
+ type InstallOptions = {
3
+ configPath?: string;
4
+ projectDir?: string;
5
+ pluginSpec: string;
6
+ packageName: string;
7
+ commandName: string;
8
+ };
9
+ export type InstallConfigResult = MergePiStudioOpencodeConfigResult & {
10
+ configPath: string;
11
+ scope: "user" | "project" | "explicit";
12
+ };
13
+ export declare function installPiStudioOpencode(options: InstallOptions): Promise<InstallConfigResult>;
14
+ export declare function parseInstallArgs(argv: string[]): InstallOptions;
15
+ export declare function runInstallCli(argv: string[]): Promise<void>;
16
+ export {};