@jmfederico/pi-web 1.202606.3 → 1.202606.4
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/README.md +11 -6
- package/dist/client/assets/{CodeViewer-iYSv2-dg.js → CodeViewer-CIG4PxA9.js} +1 -1
- package/dist/client/assets/{TerminalPanel-BpFW6j27.js → TerminalPanel-CKtvS-3H.js} +1 -1
- package/dist/client/assets/{index-D4dbiKXF.js → index-DDid7ddU.js} +367 -199
- package/dist/client/index.html +1 -1
- package/dist/config.js +51 -3
- package/dist/config.js.map +1 -1
- package/dist/pi-web-plugins/updates/pi-web-plugin.js +52 -56
- package/dist/pi-web-plugins/updates/updatesLogic.js +65 -0
- package/dist/pi-web-plugins/workspace-tasks/tasksPanelElement.js +1 -5
- package/dist/server/app.js +1 -1
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +7 -0
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/piWebStatus.js +15 -6
- package/dist/server/piWebStatus.js.map +1 -1
- package/dist/server/sessiond.js +16 -2
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/attachmentService.js +61 -0
- package/dist/server/sessions/attachmentService.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +105 -18
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionCommandService.js +5 -1
- package/dist/server/sessions/sessionCommandService.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +28 -4
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/spawnSessionTool.js +36 -0
- package/dist/server/sessions/spawnSessionTool.js.map +1 -0
- package/dist/server/sessions/spawnTargetResolver.js +36 -0
- package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +41 -3
- package/dist/shared/apiTypes.js +2 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +4 -2
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +1 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/dist/shared/piWebStatusParsing.js +0 -15
- package/dist/shared/piWebStatusParsing.js.map +1 -1
- package/dist/shared/promptAttachments.js +73 -0
- package/dist/shared/promptAttachments.js.map +1 -0
- package/dist/shared/thinkingLevels.d.ts +27 -0
- package/dist/shared/thinkingLevels.js +31 -0
- package/dist/shared/thinkingLevels.js.map +1 -0
- package/dist/shared/workspaceDeletion.js +1 -1
- package/dist/shared/workspaceDeletion.js.map +1 -1
- package/docs/plugins.md +3 -3
- package/package.json +25 -14
|
@@ -2,6 +2,8 @@ export type MachineKind = "local" | "remote";
|
|
|
2
2
|
export type MachineStatus = "unknown" | "online" | "offline" | "error";
|
|
3
3
|
export declare const PI_WEB_CAPABILITIES: {
|
|
4
4
|
readonly sessionsDeleteArchived: "sessions.deleteArchived";
|
|
5
|
+
readonly sessionsReload: "sessions.reload";
|
|
6
|
+
readonly promptAttachments: "prompt.attachments";
|
|
5
7
|
};
|
|
6
8
|
export type PiWebCapability = typeof PI_WEB_CAPABILITIES[keyof typeof PI_WEB_CAPABILITIES];
|
|
7
9
|
export interface Machine {
|
|
@@ -47,6 +49,10 @@ export interface PiWebConfigValues {
|
|
|
47
49
|
allowedHosts?: string[] | true;
|
|
48
50
|
shortcuts?: PiWebShortcutConfig;
|
|
49
51
|
plugins?: PiWebPluginConfigMap;
|
|
52
|
+
/** Maximum accepted HTTP request body size in bytes (uploads/attachments). */
|
|
53
|
+
maxUploadBytes?: number;
|
|
54
|
+
/** When true, LLMs can start new sessions via the spawn_session tool. */
|
|
55
|
+
spawnSessions?: boolean;
|
|
50
56
|
}
|
|
51
57
|
export type PiWebPluginScope = "bundled" | "local" | "user" | "project";
|
|
52
58
|
export interface PiWebPluginInfo {
|
|
@@ -64,6 +70,7 @@ export interface PiWebConfigEnvOverrides {
|
|
|
64
70
|
host: boolean;
|
|
65
71
|
port: boolean;
|
|
66
72
|
allowedHosts: boolean;
|
|
73
|
+
spawnSessions: boolean;
|
|
67
74
|
}
|
|
68
75
|
export interface PiWebConfigResponse {
|
|
69
76
|
path: string;
|
|
@@ -120,6 +127,34 @@ export interface QueuedSessionMessage {
|
|
|
120
127
|
kind: "steer" | "followUp";
|
|
121
128
|
text: string;
|
|
122
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* A binary attachment carried with a prompt. The wire format mirrors pi's own
|
|
132
|
+
* `ImageContent` shape (`{ type: "image", data, mimeType }`) so attachments are
|
|
133
|
+
* fully compatible with the underlying pi coding agent.
|
|
134
|
+
*/
|
|
135
|
+
export interface PromptAttachment {
|
|
136
|
+
/** Kind of attachment. Only images are supported by pi today. */
|
|
137
|
+
kind: "image";
|
|
138
|
+
/** IANA mime type (for example "image/png"). */
|
|
139
|
+
mimeType: string;
|
|
140
|
+
/** Base64-encoded binary payload (no data: URL prefix). */
|
|
141
|
+
data: string;
|
|
142
|
+
/** Optional original filename, used for previews and folder-mode filenames. */
|
|
143
|
+
name?: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* How prompt attachments should be delivered to the session.
|
|
147
|
+
* - "inline": send the binary to pi as native image content (multimodal input).
|
|
148
|
+
* - "folder": save the file into the workspace and reference it from the prompt
|
|
149
|
+
* text so the agent reads it with its own tools.
|
|
150
|
+
*/
|
|
151
|
+
export type PromptAttachmentDelivery = "inline" | "folder";
|
|
152
|
+
export interface SavedPromptAttachment {
|
|
153
|
+
/** Workspace-relative path the attachment was written to. */
|
|
154
|
+
path: string;
|
|
155
|
+
mimeType: string;
|
|
156
|
+
size: number;
|
|
157
|
+
}
|
|
123
158
|
export interface SessionModel {
|
|
124
159
|
provider?: string;
|
|
125
160
|
id?: string;
|
|
@@ -127,7 +162,7 @@ export interface SessionModel {
|
|
|
127
162
|
contextWindow?: number;
|
|
128
163
|
reasoning?: unknown;
|
|
129
164
|
}
|
|
130
|
-
export type ThinkingLevel
|
|
165
|
+
export type { ThinkingLevel } from "./thinkingLevels.js";
|
|
131
166
|
export type AuthType = "oauth" | "api_key";
|
|
132
167
|
export type AuthStatusSource = "stored" | "runtime" | "environment" | "fallback" | "models_json_key" | "models_json_command";
|
|
133
168
|
export interface AuthProviderStatus {
|
|
@@ -172,7 +207,7 @@ export interface ModelSelectionResponse {
|
|
|
172
207
|
models: SessionModel[];
|
|
173
208
|
}
|
|
174
209
|
export interface ThinkingLevelsResponse {
|
|
175
|
-
levels:
|
|
210
|
+
levels: string[];
|
|
176
211
|
}
|
|
177
212
|
export interface SessionStatus {
|
|
178
213
|
sessionId: string;
|
|
@@ -488,11 +523,14 @@ export type SessionUiEvent = {
|
|
|
488
523
|
type: "session.name";
|
|
489
524
|
sessionId: string;
|
|
490
525
|
name?: string;
|
|
526
|
+
} | {
|
|
527
|
+
type: "session.created";
|
|
528
|
+
session: SessionInfo;
|
|
491
529
|
} | {
|
|
492
530
|
type: "pi.event";
|
|
493
531
|
eventType: string;
|
|
494
532
|
};
|
|
495
533
|
export type GlobalSessionEvent = Extract<SessionUiEvent, {
|
|
496
|
-
type: "status.update" | "activity.update" | "session.name";
|
|
534
|
+
type: "status.update" | "activity.update" | "session.name" | "session.created";
|
|
497
535
|
}>;
|
|
498
536
|
export type RealtimeEvent = GlobalSessionEvent | TerminalUiEvent | WorkspaceActivityUiEvent;
|
package/dist/shared/apiTypes.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,sBAAsB,EAAE,yBAAyB;
|
|
1
|
+
{"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,sBAAsB,EAAE,yBAAyB;IACjD,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,oBAAoB;CAC/B,CAAC"}
|
|
@@ -2,10 +2,12 @@ import { PI_WEB_CAPABILITIES } from "./apiTypes.js";
|
|
|
2
2
|
export { PI_WEB_CAPABILITIES };
|
|
3
3
|
export const KNOWN_PI_WEB_CAPABILITIES = Object.values(PI_WEB_CAPABILITIES);
|
|
4
4
|
const knownPiWebCapabilities = new Set(KNOWN_PI_WEB_CAPABILITIES);
|
|
5
|
-
export const WEB_RUNTIME_CAPABILITIES = [PI_WEB_CAPABILITIES.sessionsDeleteArchived];
|
|
6
|
-
export const SESSIOND_RUNTIME_CAPABILITIES = [PI_WEB_CAPABILITIES.sessionsDeleteArchived];
|
|
5
|
+
export const WEB_RUNTIME_CAPABILITIES = [PI_WEB_CAPABILITIES.sessionsDeleteArchived, PI_WEB_CAPABILITIES.sessionsReload, PI_WEB_CAPABILITIES.promptAttachments];
|
|
6
|
+
export const SESSIOND_RUNTIME_CAPABILITIES = [PI_WEB_CAPABILITIES.sessionsDeleteArchived, PI_WEB_CAPABILITIES.sessionsReload, PI_WEB_CAPABILITIES.promptAttachments];
|
|
7
7
|
const EFFECTIVE_CAPABILITY_REQUIREMENTS = {
|
|
8
8
|
[PI_WEB_CAPABILITIES.sessionsDeleteArchived]: ["web", "sessiond"],
|
|
9
|
+
[PI_WEB_CAPABILITIES.sessionsReload]: ["web", "sessiond"],
|
|
10
|
+
[PI_WEB_CAPABILITIES.promptAttachments]: ["web", "sessiond"],
|
|
9
11
|
};
|
|
10
12
|
export function isPiWebCapability(value) {
|
|
11
13
|
return typeof value === "string" && knownPiWebCapabilities.has(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAgF,MAAM,eAAe,CAAC;AAElI,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAG/B,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC5E,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,mBAAmB,CAAC,sBAAsB,CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAgF,MAAM,eAAe,CAAC;AAElI,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAG/B,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAC5E,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,cAAc,EAAE,mBAAmB,CAAC,iBAAiB,CAA+C,CAAC;AAC9M,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,mBAAmB,CAAC,cAAc,EAAE,mBAAmB,CAAC,iBAAiB,CAA+C,CAAC;AAEnN,MAAM,iCAAiC,GAAG;IACxC,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC;IACjE,CAAC,mBAAmB,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC;IACzD,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC;CACgB,CAAC;AAE/E,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAiE,EAAE,UAA2B;IACpI,OAAO,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAA6G;IACtJ,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;QACrD,MAAM,kBAAkB,GAAG,iCAAiC,CAAC,UAAU,CAAC,CAAC;QACzE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE;YAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YACtC,OAAO,OAAO,EAAE,SAAS,KAAK,IAAI,IAAI,uBAAuB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -34,6 +34,7 @@ export const FEDERATED_HTTP_ROUTES = [
|
|
|
34
34
|
{ method: "POST", path: "/sessions/:sessionId/thinking-level/cycle" },
|
|
35
35
|
{ method: "GET", path: "/sessions/:sessionId/commands" },
|
|
36
36
|
{ method: "POST", path: "/sessions/:sessionId/prompt" },
|
|
37
|
+
{ method: "POST", path: "/sessions/:sessionId/attachments" },
|
|
37
38
|
{ method: "POST", path: "/sessions/:sessionId/shell" },
|
|
38
39
|
{ method: "POST", path: "/sessions/:sessionId/commands/run" },
|
|
39
40
|
{ method: "POST", path: "/sessions/:sessionId/commands/respond" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federatedRoutes.js","sourceRoot":"","sources":["../../src/shared/federatedRoutes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"federatedRoutes.js","sourceRoot":"","sources":["../../src/shared/federatedRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,21 +13,6 @@ export function parsePiWebVersionResponse(value) {
|
|
|
13
13
|
return undefined;
|
|
14
14
|
return { packageName, generatedAt, components: { web, sessiond } };
|
|
15
15
|
}
|
|
16
|
-
export function parsePiWebRuntimeResponse(value) {
|
|
17
|
-
if (!isRecord(value))
|
|
18
|
-
return undefined;
|
|
19
|
-
const packageName = value["packageName"];
|
|
20
|
-
const generatedAt = value["generatedAt"];
|
|
21
|
-
const components = value["components"];
|
|
22
|
-
if (typeof packageName !== "string" || packageName === "" || typeof generatedAt !== "string" || generatedAt === "" || !isRecord(components))
|
|
23
|
-
return undefined;
|
|
24
|
-
const web = parsePiWebRuntimeComponent(components["web"]);
|
|
25
|
-
const sessiond = parsePiWebRuntimeComponent(components["sessiond"]);
|
|
26
|
-
const capabilities = parsePiWebCapabilities(value["capabilities"]);
|
|
27
|
-
if (web === undefined || sessiond === undefined || capabilities === undefined)
|
|
28
|
-
return undefined;
|
|
29
|
-
return { packageName, generatedAt, components: { web, sessiond }, capabilities };
|
|
30
|
-
}
|
|
31
16
|
export function parsePiWebRuntimeComponent(value) {
|
|
32
17
|
if (!isRecord(value))
|
|
33
18
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"piWebStatusParsing.js","sourceRoot":"","sources":["../../src/shared/piWebStatusParsing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9J,MAAM,GAAG,GAAG,yBAAyB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,yBAAyB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,IAAI,GAAG,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"piWebStatusParsing.js","sourceRoot":"","sources":["../../src/shared/piWebStatusParsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image mime types supported by the pi coding agent. Mirrors
|
|
3
|
+
* `detectSupportedImageMimeType` in `@earendil-works/pi-coding-agent`.
|
|
4
|
+
*/
|
|
5
|
+
export const SUPPORTED_IMAGE_MIME_TYPES = ["image/jpeg", "image/png", "image/gif", "image/webp"];
|
|
6
|
+
const supportedImageMimeTypes = new Set(SUPPORTED_IMAGE_MIME_TYPES);
|
|
7
|
+
/**
|
|
8
|
+
* Maximum base64 payload per image. Matches pi's `DEFAULT_MAX_BYTES`
|
|
9
|
+
* (4.5MB, headroom below Anthropic's 5MB inline image limit). pi resizes
|
|
10
|
+
* images down to this size; we validate against it as the hard upper bound.
|
|
11
|
+
*/
|
|
12
|
+
export const MAX_INLINE_IMAGE_BASE64_BYTES = Math.round(4.5 * 1024 * 1024);
|
|
13
|
+
/** Maximum number of attachments allowed on a single prompt. */
|
|
14
|
+
export const MAX_PROMPT_ATTACHMENTS = 16;
|
|
15
|
+
export function isSupportedImageMimeType(value) {
|
|
16
|
+
return typeof value === "string" && supportedImageMimeTypes.has(value);
|
|
17
|
+
}
|
|
18
|
+
export function extensionForImageMimeType(mimeType) {
|
|
19
|
+
switch (mimeType) {
|
|
20
|
+
case "image/jpeg": return "jpg";
|
|
21
|
+
case "image/png": return "png";
|
|
22
|
+
case "image/gif": return "gif";
|
|
23
|
+
case "image/webp": return "webp";
|
|
24
|
+
default: return "bin";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const base64Pattern = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
28
|
+
export function base64ByteLength(data) {
|
|
29
|
+
const padding = data.endsWith("==") ? 2 : data.endsWith("=") ? 1 : 0;
|
|
30
|
+
return Math.max(0, Math.floor((data.length * 3) / 4) - padding);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validate and normalize untrusted prompt attachments. Throws on malformed,
|
|
34
|
+
* unsupported, or oversized input so routes can return a 400.
|
|
35
|
+
*/
|
|
36
|
+
export function parsePromptAttachments(value, options = {}) {
|
|
37
|
+
if (value === undefined)
|
|
38
|
+
return [];
|
|
39
|
+
if (!Array.isArray(value))
|
|
40
|
+
throw new Error("attachments must be an array");
|
|
41
|
+
const maxAttachments = options.maxAttachments ?? MAX_PROMPT_ATTACHMENTS;
|
|
42
|
+
if (value.length > maxAttachments)
|
|
43
|
+
throw new Error(`too many attachments (max ${String(maxAttachments)})`);
|
|
44
|
+
return value.map((entry, index) => parsePromptAttachment(entry, index, options));
|
|
45
|
+
}
|
|
46
|
+
function isRecord(value) {
|
|
47
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
48
|
+
}
|
|
49
|
+
function parsePromptAttachment(value, index, options) {
|
|
50
|
+
if (!isRecord(value))
|
|
51
|
+
throw new Error(`attachment ${String(index)} must be an object`);
|
|
52
|
+
const record = value;
|
|
53
|
+
const kind = record["kind"];
|
|
54
|
+
if (kind !== "image")
|
|
55
|
+
throw new Error(`attachment ${String(index)} has unsupported kind`);
|
|
56
|
+
const mimeType = record["mimeType"];
|
|
57
|
+
if (!isSupportedImageMimeType(mimeType))
|
|
58
|
+
throw new Error(`attachment ${String(index)} has unsupported image type`);
|
|
59
|
+
const data = record["data"];
|
|
60
|
+
if (typeof data !== "string" || data === "" || !base64Pattern.test(data))
|
|
61
|
+
throw new Error(`attachment ${String(index)} has invalid base64 data`);
|
|
62
|
+
if (options.enforceInlineSizeLimit === true && base64ByteLength(data) > MAX_INLINE_IMAGE_BASE64_BYTES) {
|
|
63
|
+
throw new Error(`attachment ${String(index)} exceeds the inline image size limit`);
|
|
64
|
+
}
|
|
65
|
+
const name = record["name"];
|
|
66
|
+
return {
|
|
67
|
+
kind: "image",
|
|
68
|
+
mimeType,
|
|
69
|
+
data,
|
|
70
|
+
...(typeof name === "string" && name !== "" ? { name } : {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=promptAttachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptAttachments.js","sourceRoot":"","sources":["../../src/shared/promptAttachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
export type { ThinkingLevel };
|
|
3
|
+
/**
|
|
4
|
+
* Known levels in increasing intensity, derived from pi's `ThinkingLevel` union.
|
|
5
|
+
* The `satisfies` clause makes this fail to compile if pi removes or renames a
|
|
6
|
+
* level; thinkingLevels.test.ts adds a compile-time check for additions too. When
|
|
7
|
+
* either breaks, update this list and give the new level a label/description
|
|
8
|
+
* where thinking levels are presented.
|
|
9
|
+
*/
|
|
10
|
+
export declare const KNOWN_THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
11
|
+
export declare function isKnownThinkingLevel(value: string): value is ThinkingLevel;
|
|
12
|
+
export declare function thinkingLevelLabel(level: string | undefined): string;
|
|
13
|
+
export interface ThinkingGauge {
|
|
14
|
+
/** Number of bars to render (the non-"off" levels). */
|
|
15
|
+
total: number;
|
|
16
|
+
/** Number of filled bars for the current level. */
|
|
17
|
+
filled: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Describe a thinking-level gauge from the available set rather than a hardcoded
|
|
21
|
+
* table, so it stays correct even if pi changes the available levels at runtime.
|
|
22
|
+
*
|
|
23
|
+
* Convention: the first available level is treated as "no thinking". The gauge
|
|
24
|
+
* therefore renders one bar per remaining level, and fills up to the current
|
|
25
|
+
* level's rank. An unknown current level fills 0 bars instead of throwing.
|
|
26
|
+
*/
|
|
27
|
+
export declare function thinkingGauge(level: string | undefined, available: readonly string[]): ThinkingGauge;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Known levels in increasing intensity, derived from pi's `ThinkingLevel` union.
|
|
3
|
+
* The `satisfies` clause makes this fail to compile if pi removes or renames a
|
|
4
|
+
* level; thinkingLevels.test.ts adds a compile-time check for additions too. When
|
|
5
|
+
* either breaks, update this list and give the new level a label/description
|
|
6
|
+
* where thinking levels are presented.
|
|
7
|
+
*/
|
|
8
|
+
export const KNOWN_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
|
|
9
|
+
export function isKnownThinkingLevel(value) {
|
|
10
|
+
return KNOWN_THINKING_LEVELS.some((level) => level === value);
|
|
11
|
+
}
|
|
12
|
+
export function thinkingLevelLabel(level) {
|
|
13
|
+
return level === undefined || level === "" ? "off" : level;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Describe a thinking-level gauge from the available set rather than a hardcoded
|
|
17
|
+
* table, so it stays correct even if pi changes the available levels at runtime.
|
|
18
|
+
*
|
|
19
|
+
* Convention: the first available level is treated as "no thinking". The gauge
|
|
20
|
+
* therefore renders one bar per remaining level, and fills up to the current
|
|
21
|
+
* level's rank. An unknown current level fills 0 bars instead of throwing.
|
|
22
|
+
*/
|
|
23
|
+
export function thinkingGauge(level, available) {
|
|
24
|
+
const pool = available.length >= 2 ? available : KNOWN_THINKING_LEVELS;
|
|
25
|
+
const total = pool.length - 1;
|
|
26
|
+
const normalized = thinkingLevelLabel(level);
|
|
27
|
+
const index = pool.indexOf(normalized);
|
|
28
|
+
const filled = index <= 0 ? 0 : Math.min(index, total);
|
|
29
|
+
return { total, filled };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=thinkingLevels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinkingLevels.js","sourceRoot":"","sources":["../../src/shared/thinkingLevels.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAA6C,CAAC;AAEtI,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AASD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAyB,EAAE,SAA4B;IACnF,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC;IACvE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export const workspaceDeleteOperation = "workspace.delete";
|
|
2
2
|
export const workspaceDeleteOperationMetadataKey = "pi.operation";
|
|
3
3
|
export const targetWorkspaceIdMetadataKey = "target.workspaceId";
|
|
4
|
-
|
|
4
|
+
const targetWorkspacePathMetadataKey = "target.workspacePath";
|
|
5
5
|
export function workspaceDeletionMetadata(workspace) {
|
|
6
6
|
return {
|
|
7
7
|
[workspaceDeleteOperationMetadataKey]: workspaceDeleteOperation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaceDeletion.js","sourceRoot":"","sources":["../../src/shared/workspaceDeletion.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAC3D,MAAM,CAAC,MAAM,mCAAmC,GAAG,cAAc,CAAC;AAClE,MAAM,CAAC,MAAM,4BAA4B,GAAG,oBAAoB,CAAC;AACjE,MAAM,
|
|
1
|
+
{"version":3,"file":"workspaceDeletion.js","sourceRoot":"","sources":["../../src/shared/workspaceDeletion.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,kBAAkB,CAAC;AAC3D,MAAM,CAAC,MAAM,mCAAmC,GAAG,cAAc,CAAC;AAClE,MAAM,CAAC,MAAM,4BAA4B,GAAG,oBAAoB,CAAC;AACjE,MAAM,8BAA8B,GAAG,sBAAsB,CAAC;AAO9D,MAAM,UAAU,yBAAyB,CAAC,SAAkC;IAC1E,OAAO;QACL,CAAC,mCAAmC,CAAC,EAAE,wBAAwB;QAC/D,CAAC,4BAA4B,CAAC,EAAE,SAAS,CAAC,EAAE;QAC5C,CAAC,8BAA8B,CAAC,EAAE,SAAS,CAAC,IAAI;KACjD,CAAC;AACJ,CAAC"}
|
package/docs/plugins.md
CHANGED
|
@@ -42,7 +42,7 @@ Copy-paste prompt for creating a plugin:
|
|
|
42
42
|
Build a PI WEB plugin for this project.
|
|
43
43
|
Goal: <describe the UI behavior>.
|
|
44
44
|
Before coding, read the PI WEB plugin docs:
|
|
45
|
-
https://pi-web.dev/plugins
|
|
45
|
+
https://pi-web.dev/plugins
|
|
46
46
|
Full API reference:
|
|
47
47
|
https://pi-web.dev/plugins.md
|
|
48
48
|
Create it as a local plugin under ~/.pi-web/plugins/<plugin-id>.
|
|
@@ -56,7 +56,7 @@ Copy-paste prompt for modifying a plugin:
|
|
|
56
56
|
```text
|
|
57
57
|
Improve the PI WEB plugin at <path>.
|
|
58
58
|
Before coding, read the PI WEB plugin docs:
|
|
59
|
-
https://pi-web.dev/plugins
|
|
59
|
+
https://pi-web.dev/plugins
|
|
60
60
|
Full API reference:
|
|
61
61
|
https://pi-web.dev/plugins.md
|
|
62
62
|
Keep the plugin compatible with the documented v1 API.
|
|
@@ -131,7 +131,7 @@ Reload the PI WEB browser tab. PI WEB serves plugin modules with an mtime-based
|
|
|
131
131
|
|
|
132
132
|
## Remote machine plugins
|
|
133
133
|
|
|
134
|
-
When [machine federation](https://pi-web.dev/machines
|
|
134
|
+
When [machine federation](https://pi-web.dev/machines) is enabled, PI WEB also loads discovered plugins from the selected remote machine. Remote plugins are trusted browser-side code like local plugins, but their contributions are machine-scoped:
|
|
135
135
|
|
|
136
136
|
- actions, workspace panels, and workspace labels only appear while that machine is selected;
|
|
137
137
|
- plugin file and terminal helpers run against that machine;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jmfederico/pi-web",
|
|
3
|
-
"version": "1.202606.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.202606.4",
|
|
4
|
+
"description": "Web UI for persistent Pi Coding Agent sessions in real workspaces.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Federico Jaramillo Martinez",
|
|
7
7
|
"type": "module",
|
|
@@ -32,9 +32,10 @@
|
|
|
32
32
|
"build:plugin-api": "tsc -p tsconfig.plugin-api.json",
|
|
33
33
|
"build:plugins": "tsc -p tsconfig.plugins.json && node scripts/build-plugins.mjs",
|
|
34
34
|
"typecheck": "tsc --noEmit",
|
|
35
|
+
"knip": "knip",
|
|
35
36
|
"lint": "eslint \"src/**/*.ts\" \"extensions/**/*.ts\" \"pi-web-plugins/**/*.ts\" vite.config.ts vitest.config.ts",
|
|
36
37
|
"test": "vitest run --config vitest.config.ts",
|
|
37
|
-
"verify": "npm run typecheck && npm run lint && npm test",
|
|
38
|
+
"verify": "npm run typecheck && npm run lint && npm run knip && npm test",
|
|
38
39
|
"start": "tsx src/server/index.ts",
|
|
39
40
|
"start:sessiond": "tsx src/server/sessiond.ts",
|
|
40
41
|
"clean": "rm -rf dist",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"changelog:status": "changeset status"
|
|
49
50
|
},
|
|
50
51
|
"dependencies": {
|
|
52
|
+
"@codemirror/commands": "^6.10.3",
|
|
51
53
|
"@codemirror/lang-css": "^6.3.1",
|
|
52
54
|
"@codemirror/lang-go": "^6.0.1",
|
|
53
55
|
"@codemirror/lang-html": "^6.4.11",
|
|
@@ -56,33 +58,38 @@
|
|
|
56
58
|
"@codemirror/lang-markdown": "^6.5.0",
|
|
57
59
|
"@codemirror/lang-python": "^6.2.1",
|
|
58
60
|
"@codemirror/lang-rust": "^6.0.2",
|
|
61
|
+
"@codemirror/language": "^6.12.3",
|
|
59
62
|
"@codemirror/legacy-modes": "^6.5.2",
|
|
63
|
+
"@codemirror/state": "^6.6.0",
|
|
64
|
+
"@codemirror/view": "^6.42.1",
|
|
60
65
|
"@fastify/static": "^9.1.3",
|
|
61
66
|
"@fastify/websocket": "^11.2.0",
|
|
62
67
|
"@xterm/addon-fit": "^0.11.0",
|
|
63
68
|
"@xterm/xterm": "^6.0.0",
|
|
64
|
-
"codemirror": "^6.0.2",
|
|
65
69
|
"diff": "^8.0.4",
|
|
66
70
|
"fastify": "^5.6.1",
|
|
67
71
|
"lit": "^3.3.1",
|
|
68
72
|
"marked": "^18.0.3",
|
|
69
73
|
"node-pty": "^1.1.0",
|
|
74
|
+
"typebox": "1.1.38",
|
|
70
75
|
"ws": "^8.20.1"
|
|
71
76
|
},
|
|
72
77
|
"devDependencies": {
|
|
73
78
|
"@changesets/cli": "^2.31.0",
|
|
79
|
+
"@earendil-works/pi-agent-core": "^0.79.1",
|
|
80
|
+
"@earendil-works/pi-ai": "^0.79.1",
|
|
74
81
|
"@earendil-works/pi-coding-agent": "^0.79.1",
|
|
75
82
|
"@eslint/js": "^10.0.1",
|
|
76
83
|
"@types/node": "^24.10.1",
|
|
77
84
|
"@types/ws": "^8.18.1",
|
|
78
85
|
"eslint": "^10.3.0",
|
|
79
86
|
"globals": "^17.6.0",
|
|
87
|
+
"knip": "^6.16.1",
|
|
80
88
|
"tsx": "^4.20.6",
|
|
81
89
|
"typescript": "^5.9.3",
|
|
82
90
|
"typescript-eslint": "^8.59.2",
|
|
83
91
|
"vite": "^7.2.4",
|
|
84
|
-
"vitest": "^4.1.5"
|
|
85
|
-
"@earendil-works/pi-ai": "^0.79.1"
|
|
92
|
+
"vitest": "^4.1.5"
|
|
86
93
|
},
|
|
87
94
|
"publishConfig": {
|
|
88
95
|
"access": "public"
|
|
@@ -100,22 +107,26 @@
|
|
|
100
107
|
"homepage": "https://pi-web.dev/",
|
|
101
108
|
"packageManager": "npm@11.11.0",
|
|
102
109
|
"peerDependencies": {
|
|
103
|
-
"@earendil-works/pi-
|
|
104
|
-
"@earendil-works/pi-ai": ">=0.78.0 <1"
|
|
110
|
+
"@earendil-works/pi-agent-core": ">=0.78.0 <1",
|
|
111
|
+
"@earendil-works/pi-ai": ">=0.78.0 <1",
|
|
112
|
+
"@earendil-works/pi-coding-agent": ">=0.78.0 <1"
|
|
105
113
|
},
|
|
106
114
|
"keywords": [
|
|
107
115
|
"pi-package",
|
|
108
116
|
"pi",
|
|
117
|
+
"pi-web",
|
|
118
|
+
"pi-web-ui",
|
|
119
|
+
"pi-webui",
|
|
109
120
|
"pi-coding-agent",
|
|
121
|
+
"pi-coding-agent-web-ui",
|
|
110
122
|
"coding-agent",
|
|
111
|
-
"agent",
|
|
112
|
-
"
|
|
113
|
-
"
|
|
123
|
+
"ai-coding-agent",
|
|
124
|
+
"agentic-development",
|
|
125
|
+
"developer-tools",
|
|
114
126
|
"web-ui",
|
|
115
127
|
"webui",
|
|
116
|
-
"
|
|
117
|
-
"
|
|
118
|
-
"control-plane",
|
|
128
|
+
"browser-ui",
|
|
129
|
+
"remote-development",
|
|
119
130
|
"persistent-sessions"
|
|
120
131
|
],
|
|
121
132
|
"pi": {
|