@daniel156161/prism 0.2.82 → 0.2.83
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/dist/prism-extensions/integrations/ai-memory-http.d.ts +1 -0
- package/dist/prism-extensions/integrations/ai-memory-http.js +12 -2
- package/dist/prism-extensions/integrations/ai-memory-http.js.map +1 -1
- package/dist/prism-extensions/integrations/ai-memory-system.d.ts +1 -0
- package/dist/prism-extensions/integrations/ai-memory-system.js +23 -14
- package/dist/prism-extensions/integrations/ai-memory-system.js.map +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/cli.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/config.js +6 -11
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session-services.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +5 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/auth-storage.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/loader.js +3 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/prism-session-db.js +128 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/project-trust.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/sdk.js +1 -1
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js +39 -37
- package/node_modules/@earendil-works/pi-coding-agent/dist/core/system-prompt.js +20 -16
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -0
- package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +233 -12
- package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +1 -1
- package/package.json +2 -1
- package/src/prism-extensions/integrations/ai-memory-http.ts +11 -2
- package/src/prism-extensions/integrations/ai-memory-system.ts +22 -12
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* aborted". The tool call is still reported as an error to the model, but the
|
|
8
8
|
* message now explains *why* it failed and which route/base URL was involved.
|
|
9
9
|
*/
|
|
10
|
+
export declare function configuredAiMemoryBaseUrl(env?: NodeJS.ProcessEnv): string | undefined;
|
|
10
11
|
export declare function aiMemoryBaseUrl(env?: NodeJS.ProcessEnv): string;
|
|
11
12
|
export declare function aiMemoryRequestTimeoutMs(env?: NodeJS.ProcessEnv): number;
|
|
12
13
|
export declare function aiMemoryStatusTimeoutMs(env?: NodeJS.ProcessEnv): number;
|
|
@@ -7,14 +7,24 @@
|
|
|
7
7
|
* aborted". The tool call is still reported as an error to the model, but the
|
|
8
8
|
* message now explains *why* it failed and which route/base URL was involved.
|
|
9
9
|
*/
|
|
10
|
+
import { readSettings } from "../core/shared-config.js";
|
|
10
11
|
import { formatApiFailure, formatInvalidJsonFailure, formatTransportFailure } from "./ai-memory-errors.js";
|
|
11
|
-
const DEFAULT_BASE_URL = "http://127.0.0.1:8765";
|
|
12
12
|
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
13
13
|
const DEFAULT_STATUS_TIMEOUT_MS = 1_500;
|
|
14
14
|
const DEFAULT_INJECT_TIMEOUT_MS = 1_200;
|
|
15
15
|
const DEFAULT_INJECT_CACHE_TTL_MS = 60_000;
|
|
16
|
+
export function configuredAiMemoryBaseUrl(env = process.env) {
|
|
17
|
+
const raw = env.PRISM_AI_MEMORY_BASE_URL ?? env.AI_MEMORY_BASE_URL ?? readSettings(undefined, env)?.aiMemory?.baseUrl ?? readSettings(undefined, env)?.aiMemoryBaseUrl;
|
|
18
|
+
if (typeof raw !== "string")
|
|
19
|
+
return undefined;
|
|
20
|
+
const trimmed = raw.trim().replace(/\/+$/, "");
|
|
21
|
+
return trimmed || undefined;
|
|
22
|
+
}
|
|
16
23
|
export function aiMemoryBaseUrl(env = process.env) {
|
|
17
|
-
|
|
24
|
+
const baseUrl = configuredAiMemoryBaseUrl(env);
|
|
25
|
+
if (!baseUrl)
|
|
26
|
+
throw new Error("AI Memory base URL is not configured. Set PRISM_AI_MEMORY_BASE_URL or aiMemory.baseUrl.");
|
|
27
|
+
return baseUrl;
|
|
18
28
|
}
|
|
19
29
|
function positiveIntegerSetting(value, fallback) {
|
|
20
30
|
const parsed = Number(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-memory-http.js","sourceRoot":"","sources":["../../../src/prism-extensions/integrations/ai-memory-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,sBAAsB,EAA+B,MAAM,uBAAuB,CAAA;AAEvI,MAAM,
|
|
1
|
+
{"version":3,"file":"ai-memory-http.js","sourceRoot":"","sources":["../../../src/prism-extensions/integrations/ai-memory-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { type ThemeLike } from "../ui/tool-call-rendering.js";
|
|
|
4
4
|
export declare function resetAiMemoryCaches(): void;
|
|
5
5
|
export declare function shouldEnableAiMemory(env?: NodeJS.ProcessEnv): boolean;
|
|
6
6
|
export declare function shouldInjectAiMemoryCandidates(env?: NodeJS.ProcessEnv): boolean;
|
|
7
|
+
export declare function shouldInjectAiMemoryAlwaysContext(env?: NodeJS.ProcessEnv): boolean;
|
|
7
8
|
export declare function formatSearchResponse(data: any): string;
|
|
8
9
|
export declare function formatAiMemoryCandidate(row: any): string;
|
|
9
10
|
export declare function buildAiMemoryContextMessage(results: any[]): any | undefined;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
2
|
import { readSettings } from "../core/shared-config.js";
|
|
3
3
|
import { formatDegradedNotice } from "./ai-memory-errors.js";
|
|
4
|
-
import { aiMemoryBaseUrl, aiMemoryInjectCacheTtlMs, aiMemoryInjectTimeoutMs, aiMemoryRequestTimeoutMs, aiMemoryStatusTimeoutMs, deleteJson, getJson, methodJson, postJson, putJson, } from "./ai-memory-http.js";
|
|
4
|
+
import { aiMemoryBaseUrl, configuredAiMemoryBaseUrl, aiMemoryInjectCacheTtlMs, aiMemoryInjectTimeoutMs, aiMemoryRequestTimeoutMs, aiMemoryStatusTimeoutMs, deleteJson, getJson, methodJson, postJson, putJson, } from "./ai-memory-http.js";
|
|
5
5
|
import { isAiMemoryWriteTool, renderAiMemoryWriteResult } from "./ai-memory-write-preview.js";
|
|
6
6
|
import { renderCollapsibleTextResult } from "../ui/collapsed-text-rendering.js";
|
|
7
7
|
import { obsidianOpenUrl } from "./obsidian-memory.js";
|
|
@@ -50,7 +50,7 @@ export function shouldEnableAiMemory(env = process.env) {
|
|
|
50
50
|
return envValue;
|
|
51
51
|
const settings = readSettings(undefined, env);
|
|
52
52
|
const settingsValue = booleanSetting(settings?.aiMemory?.enabled ?? settings?.aiMemoryEnabled);
|
|
53
|
-
return settingsValue ??
|
|
53
|
+
return settingsValue ?? configuredAiMemoryBaseUrl(env) !== undefined;
|
|
54
54
|
}
|
|
55
55
|
export function shouldInjectAiMemoryCandidates(env = process.env) {
|
|
56
56
|
const envValue = booleanSetting(env.PRISM_AI_MEMORY_INJECT_CANDIDATES ?? env.PI_AI_MEMORY_INJECT_CANDIDATES);
|
|
@@ -58,7 +58,15 @@ export function shouldInjectAiMemoryCandidates(env = process.env) {
|
|
|
58
58
|
return envValue;
|
|
59
59
|
const settings = readSettings(undefined, env);
|
|
60
60
|
const settingsValue = booleanSetting(settings?.aiMemory?.injectCandidates ?? settings?.aiMemoryInjectCandidates);
|
|
61
|
-
return settingsValue ??
|
|
61
|
+
return settingsValue ?? configuredAiMemoryBaseUrl(env) !== undefined;
|
|
62
|
+
}
|
|
63
|
+
export function shouldInjectAiMemoryAlwaysContext(env = process.env) {
|
|
64
|
+
const envValue = booleanSetting(env.PRISM_AI_MEMORY_INJECT_ALWAYS_CONTEXT ?? env.PI_AI_MEMORY_INJECT_ALWAYS_CONTEXT);
|
|
65
|
+
if (envValue !== undefined)
|
|
66
|
+
return envValue;
|
|
67
|
+
const settings = readSettings(undefined, env);
|
|
68
|
+
const settingsValue = booleanSetting(settings?.aiMemory?.injectAlwaysContext ?? settings?.aiMemoryInjectAlwaysContext);
|
|
69
|
+
return settingsValue ?? configuredAiMemoryBaseUrl(env) !== undefined;
|
|
62
70
|
}
|
|
63
71
|
function aiMemoryContextLimit(env = process.env) {
|
|
64
72
|
return clampLimit(env.PRISM_AI_MEMORY_CONTEXT_LIMIT ?? env.PI_AI_MEMORY_CONTEXT_LIMIT, DEFAULT_CONTEXT_LIMIT);
|
|
@@ -535,18 +543,19 @@ export default function aiMemorySystemExtension(pi) {
|
|
|
535
543
|
pi.on?.("before_agent_start", async (event, ctx) => {
|
|
536
544
|
const patch = {};
|
|
537
545
|
// Always-loaded durable context (mapped from 00 Kontext) is injected as a
|
|
538
|
-
// system-prompt chunk so it remains in the cached prefix.
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
const
|
|
543
|
-
|
|
546
|
+
// system-prompt chunk so it remains in the cached prefix. It is opt-in so a
|
|
547
|
+
// missing local AI Memory daemon does not produce startup/per-turn warnings.
|
|
548
|
+
if (shouldInjectAiMemoryAlwaysContext()) {
|
|
549
|
+
try {
|
|
550
|
+
const alwaysBlock = buildAlwaysContextMessage(await loadAlwaysContext())?.content?.trim();
|
|
551
|
+
if (alwaysBlock) {
|
|
552
|
+
const prev = String(event?.systemPrompt ?? "");
|
|
553
|
+
patch.systemPrompt = `${prev}${prev ? "\n\n" : ""}${alwaysBlock}`;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
reportBackgroundFailure(ctx, "always-context injection", error);
|
|
544
558
|
}
|
|
545
|
-
}
|
|
546
|
-
catch (error) {
|
|
547
|
-
// Best-effort, but never silent: a broken API would otherwise drop durable
|
|
548
|
-
// context without anyone noticing.
|
|
549
|
-
reportBackgroundFailure(ctx, "always-context injection", error);
|
|
550
559
|
}
|
|
551
560
|
// Query-specific candidates (independent of the always-context block).
|
|
552
561
|
const query = String(event?.prompt ?? "").trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-memory-system.js","sourceRoot":"","sources":["../../../src/prism-extensions/integrations/ai-memory-system.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ai-memory-system.js","sourceRoot":"","sources":["../../../src/prism-extensions/integrations/ai-memory-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { APP_NAME } from "./config.js";
|
|
9
9
|
import { configureHttpDispatcher } from "./core/http-dispatcher.js";
|
|
10
10
|
import { main } from "./main.js";
|
|
11
|
-
process.title =
|
|
11
|
+
process.title = "▲";
|
|
12
12
|
process.env.PI_CODING_AGENT = "true";
|
|
13
13
|
process.env.AI_AGENT = "pi";
|
|
14
14
|
process.emitWarning = (() => { });
|
|
@@ -321,10 +321,9 @@ export function getThemesDir() {
|
|
|
321
321
|
if (isBunBinary) {
|
|
322
322
|
return join(getPackageDir(), "theme");
|
|
323
323
|
}
|
|
324
|
-
//
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
return join(packageDir, srcOrDist, "modes", "interactive", "theme");
|
|
324
|
+
// Prism: use __dirname so built-in themes resolve from the actual dist/,
|
|
325
|
+
// not PI_PACKAGE_DIR which may point to a config-only dir without dist/.
|
|
326
|
+
return join(__dirname, "modes", "interactive", "theme");
|
|
328
327
|
}
|
|
329
328
|
/**
|
|
330
329
|
* Get path to HTML export template directory (shipped with package)
|
|
@@ -336,9 +335,7 @@ export function getExportTemplateDir() {
|
|
|
336
335
|
if (isBunBinary) {
|
|
337
336
|
return join(getPackageDir(), "export-html");
|
|
338
337
|
}
|
|
339
|
-
|
|
340
|
-
const srcOrDist = existsSync(join(packageDir, "src")) ? "src" : "dist";
|
|
341
|
-
return join(packageDir, srcOrDist, "core", "export-html");
|
|
338
|
+
return join(__dirname, "core", "export-html");
|
|
342
339
|
}
|
|
343
340
|
/** Get path to package.json */
|
|
344
341
|
export function getPackageJsonPath() {
|
|
@@ -370,9 +367,7 @@ export function getInteractiveAssetsDir() {
|
|
|
370
367
|
if (isBunBinary) {
|
|
371
368
|
return join(getPackageDir(), "assets");
|
|
372
369
|
}
|
|
373
|
-
|
|
374
|
-
const srcOrDist = existsSync(join(packageDir, "src")) ? "src" : "dist";
|
|
375
|
-
return join(packageDir, srcOrDist, "modes", "interactive", "assets");
|
|
370
|
+
return join(__dirname, "modes", "interactive", "assets");
|
|
376
371
|
}
|
|
377
372
|
/** Get path to a bundled interactive asset */
|
|
378
373
|
export function getBundledInteractiveAssetPath(name) {
|
|
@@ -426,7 +421,7 @@ export function getModelsPath() {
|
|
|
426
421
|
}
|
|
427
422
|
/** Get path to auth.json */
|
|
428
423
|
export function getAuthPath() {
|
|
429
|
-
return join(getAgentDir(), "auth.json");
|
|
424
|
+
return process.env.PRISM_AUTH_PATH || process.env.PI_AUTH_PATH || join(getAgentDir(), "auth.json");
|
|
430
425
|
}
|
|
431
426
|
/** Get path to settings.json */
|
|
432
427
|
export function getSettingsPath() {
|
|
@@ -55,7 +55,7 @@ export async function createAgentSessionServices(options) {
|
|
|
55
55
|
const agentDir = options.agentDir ? resolvePath(options.agentDir) : getAgentDir();
|
|
56
56
|
const modelRuntime = options.modelRuntime ??
|
|
57
57
|
(await ModelRuntime.create({
|
|
58
|
-
authPath: join(agentDir, "auth.json"),
|
|
58
|
+
authPath: process.env.PRISM_AUTH_PATH || process.env.PI_AUTH_PATH || join(agentDir, "auth.json"),
|
|
59
59
|
modelsPath: join(agentDir, "models.json"),
|
|
60
60
|
signal: options.modelRuntimeSignal,
|
|
61
61
|
}));
|
|
@@ -2084,6 +2084,11 @@ export class AgentSession {
|
|
|
2084
2084
|
// Context overflow is handled by compaction, not retry.
|
|
2085
2085
|
if (isContextOverflow(message, this.model?.contextWindow ?? 0))
|
|
2086
2086
|
return false;
|
|
2087
|
+
// Prism: provider account/quota usage limits need a user decision (wait, switch model, or cancel).
|
|
2088
|
+
// Do not auto-retry them with the generic exponential backoff, because provider reset
|
|
2089
|
+
// windows are often much longer than the retry delay.
|
|
2090
|
+
if (/GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient_quota|out of budget|quota exceeded|billing|usage[_\s-]*limit|usage_limit_reached/i.test(message.errorMessage || ""))
|
|
2091
|
+
return false;
|
|
2087
2092
|
return isRetryableAssistantError(message);
|
|
2088
2093
|
}
|
|
2089
2094
|
/**
|
|
@@ -14,7 +14,7 @@ const AUTH_FILE_WRITE_OPTIONS = { encoding: "utf-8", mode: 0o600 };
|
|
|
14
14
|
let sharedAuthFileReadState;
|
|
15
15
|
export class FileAuthStorageBackend {
|
|
16
16
|
authPath;
|
|
17
|
-
constructor(authPath = join(getAgentDir(), "auth.json")) {
|
|
17
|
+
constructor(authPath = (process.env.PRISM_AUTH_PATH || process.env.PI_AUTH_PATH || join(getAgentDir(), "auth.json"))) {
|
|
18
18
|
this.authPath = normalizePath(authPath);
|
|
19
19
|
}
|
|
20
20
|
ensureParentDir() {
|
|
@@ -9,6 +9,7 @@ import { fileURLToPath } from "node:url";
|
|
|
9
9
|
import * as _bundledPiAgentCore from "@earendil-works/pi-agent-core";
|
|
10
10
|
import * as _bundledPiAiCompat from "@earendil-works/pi-ai/compat";
|
|
11
11
|
import * as _bundledPiAiOauth from "@earendil-works/pi-ai/oauth";
|
|
12
|
+
import * as _prismPiAiOpenAICompletions from "@earendil-works/pi-ai/api/openai-completions";
|
|
12
13
|
import * as _bundledPiAiProviders from "@earendil-works/pi-ai/providers/all";
|
|
13
14
|
import * as _bundledPiTui from "@earendil-works/pi-tui";
|
|
14
15
|
import { createJiti } from "jiti/static";
|
|
@@ -21,12 +22,13 @@ import * as _bundledTypeboxValue from "typebox/value";
|
|
|
21
22
|
import { CONFIG_DIR_NAME, getAgentDir, isBunBinary } from "../../config.js";
|
|
22
23
|
// NOTE: This import works because loader.ts exports are NOT re-exported from index.ts,
|
|
23
24
|
// avoiding a circular dependency. Extensions can import from @earendil-works/pi-coding-agent.
|
|
24
|
-
import * as _bundledPiCodingAgent from "
|
|
25
|
+
import * as _bundledPiCodingAgent from "./index.js";
|
|
25
26
|
import { resolvePath } from "../../utils/paths.js";
|
|
26
27
|
import { createEventBus } from "../event-bus.js";
|
|
27
28
|
import { execCommand } from "../exec.js";
|
|
28
29
|
import { readPiManifest } from "../pi-manifest.js";
|
|
29
30
|
import { createSyntheticSourceInfo } from "../source-info.js";
|
|
31
|
+
globalThis.__PRISM_PI_AI_OPENAI_COMPLETIONS__ = _prismPiAiOpenAICompletions;
|
|
30
32
|
import { time } from "../timings.js";
|
|
31
33
|
/** Modules available to extensions via virtualModules (for compiled Bun binary) */
|
|
32
34
|
const VIRTUAL_MODULES = {
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { mkdirSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
export function getSessionBackend() {
|
|
7
|
+
return process.env.PRISM_SESSION_BACKEND || "db";
|
|
8
|
+
}
|
|
9
|
+
export function findMostRecentSessionFromDb(sessionDir) {
|
|
10
|
+
try {
|
|
11
|
+
const db = openDb();
|
|
12
|
+
const row = db.prepare("SELECT file_path FROM sessions WHERE session_dir = ? ORDER BY updated_at DESC LIMIT 1").get(sessionDir);
|
|
13
|
+
db.close();
|
|
14
|
+
return row?.file_path || null;
|
|
15
|
+
} catch { return null; }
|
|
16
|
+
}
|
|
17
|
+
export function deleteSessionFromDb(filePath) {
|
|
18
|
+
if (!filePath) return;
|
|
19
|
+
try {
|
|
20
|
+
const db = openDb();
|
|
21
|
+
db.prepare("DELETE FROM sessions WHERE file_path = ?").run(filePath);
|
|
22
|
+
db.close();
|
|
23
|
+
} catch { }
|
|
24
|
+
}
|
|
25
|
+
function openDb() {
|
|
26
|
+
const prismDir = process.env.PRISM_CODING_AGENT_DIR || process.env.PI_CODING_AGENT_DIR || join(homedir(), ".prism");
|
|
27
|
+
const dbPath = join(prismDir, "sessions.db");
|
|
28
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
29
|
+
const { DatabaseSync } = require("node:sqlite");
|
|
30
|
+
const db = new DatabaseSync(dbPath);
|
|
31
|
+
db.exec("PRAGMA journal_mode=WAL");
|
|
32
|
+
db.exec("PRAGMA synchronous=NORMAL");
|
|
33
|
+
db.exec("CREATE TABLE IF NOT EXISTS sessions (id TEXT PRIMARY KEY, file_path TEXT UNIQUE, cwd TEXT, session_dir TEXT, created_at TEXT, updated_at TEXT, parent_session TEXT, version INTEGER, header_json TEXT NOT NULL)");
|
|
34
|
+
db.exec("CREATE TABLE IF NOT EXISTS entries (session_id TEXT NOT NULL, entry_id TEXT NOT NULL, idx INTEGER NOT NULL, parent_id TEXT, type TEXT, timestamp TEXT, data_json TEXT NOT NULL, PRIMARY KEY (session_id, entry_id), FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE)");
|
|
35
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_entries_session_idx ON entries(session_id, idx)");
|
|
36
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_sessions_updated ON sessions(updated_at)");
|
|
37
|
+
return db;
|
|
38
|
+
}
|
|
39
|
+
export function mirrorSessionFileToDb(filePath, entries, cwd, sessionDir) {
|
|
40
|
+
if (!filePath) return;
|
|
41
|
+
const header = entries.find((entry) => entry?.type === "session" && typeof entry.id === "string");
|
|
42
|
+
if (!header) return;
|
|
43
|
+
const rows = entries.filter((entry) => entry !== header);
|
|
44
|
+
const db = openDb();
|
|
45
|
+
const updatedAt = rows.at(-1)?.timestamp || header.timestamp || new Date().toISOString();
|
|
46
|
+
const insertSession = db.prepare("INSERT INTO sessions (id, file_path, cwd, session_dir, created_at, updated_at, parent_session, version, header_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET file_path=excluded.file_path, cwd=excluded.cwd, session_dir=excluded.session_dir, updated_at=excluded.updated_at, parent_session=excluded.parent_session, version=excluded.version, header_json=excluded.header_json");
|
|
47
|
+
const insertEntry = db.prepare("INSERT INTO entries (session_id, entry_id, idx, parent_id, type, timestamp, data_json) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(session_id, entry_id) DO UPDATE SET idx=excluded.idx, parent_id=excluded.parent_id, type=excluded.type, timestamp=excluded.timestamp, data_json=excluded.data_json");
|
|
48
|
+
const deleteEntries = db.prepare("DELETE FROM entries WHERE session_id = ?");
|
|
49
|
+
db.exec("BEGIN");
|
|
50
|
+
try {
|
|
51
|
+
insertSession.run(header.id, filePath, header.cwd || cwd || "", sessionDir || dirname(filePath), header.timestamp || "", updatedAt, header.parentSession || null, header.version || null, JSON.stringify(header));
|
|
52
|
+
deleteEntries.run(header.id);
|
|
53
|
+
rows.forEach((entry, idx) => insertEntry.run(header.id, typeof entry.id === "string" ? entry.id : String(idx), idx, entry.parentId ?? null, entry.type || null, entry.timestamp || null, JSON.stringify(entry)));
|
|
54
|
+
db.exec("COMMIT");
|
|
55
|
+
} catch (error) {
|
|
56
|
+
db.exec("ROLLBACK");
|
|
57
|
+
db.close();
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
db.close();
|
|
61
|
+
}
|
|
62
|
+
export function mirrorEntryToDb(filePath, header, entry, cwd, sessionDir, index) {
|
|
63
|
+
if (!filePath || !header?.id || !entry) return;
|
|
64
|
+
const db = openDb();
|
|
65
|
+
const insertSession = db.prepare("INSERT INTO sessions (id, file_path, cwd, session_dir, created_at, updated_at, parent_session, version, header_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET file_path=excluded.file_path, cwd=excluded.cwd, session_dir=excluded.session_dir, updated_at=excluded.updated_at, parent_session=excluded.parent_session, version=excluded.version, header_json=excluded.header_json");
|
|
66
|
+
const insertEntry = db.prepare("INSERT INTO entries (session_id, entry_id, idx, parent_id, type, timestamp, data_json) VALUES (?, ?, ?, ?, ?, ?, ?) ON CONFLICT(session_id, entry_id) DO UPDATE SET idx=excluded.idx, parent_id=excluded.parent_id, type=excluded.type, timestamp=excluded.timestamp, data_json=excluded.data_json");
|
|
67
|
+
insertSession.run(header.id, filePath, header.cwd || cwd || "", sessionDir || dirname(filePath), header.timestamp || "", entry.timestamp || header.timestamp || new Date().toISOString(), header.parentSession || null, header.version || null, JSON.stringify(header));
|
|
68
|
+
insertEntry.run(header.id, typeof entry.id === "string" ? entry.id : String(index ?? 0), Number.isInteger(index) ? index : 0, entry.parentId ?? null, entry.type || null, entry.timestamp || null, JSON.stringify(entry));
|
|
69
|
+
db.close();
|
|
70
|
+
}
|
|
71
|
+
export function loadEntriesFromDb(filePath) {
|
|
72
|
+
if (!filePath) return null;
|
|
73
|
+
try {
|
|
74
|
+
const db = openDb();
|
|
75
|
+
const session = db.prepare("SELECT id, header_json FROM sessions WHERE file_path = ?").get(filePath);
|
|
76
|
+
if (!session) { db.close(); return null; }
|
|
77
|
+
const entryRows = db.prepare("SELECT data_json FROM entries WHERE session_id = ? ORDER BY idx ASC").all(session.id);
|
|
78
|
+
db.close();
|
|
79
|
+
return [JSON.parse(session.header_json), ...entryRows.map((r) => JSON.parse(r.data_json))];
|
|
80
|
+
} catch { return null; }
|
|
81
|
+
}
|
|
82
|
+
async function buildSessionsFromRows(db, sessionRows, onProgress) {
|
|
83
|
+
const sessions = [];
|
|
84
|
+
let loaded = 0;
|
|
85
|
+
const total = sessionRows.length;
|
|
86
|
+
for (const row of sessionRows) {
|
|
87
|
+
try {
|
|
88
|
+
const entryRows = db.prepare("SELECT data_json FROM entries WHERE session_id = ? ORDER BY idx ASC").all(row.id);
|
|
89
|
+
let messageCount = 0, firstMessage = "";
|
|
90
|
+
const allMessages = [];
|
|
91
|
+
let name;
|
|
92
|
+
for (const { data_json } of entryRows) {
|
|
93
|
+
const e = JSON.parse(data_json);
|
|
94
|
+
if (e.type === "session_info" && e.name?.trim()) name = e.name.trim();
|
|
95
|
+
if (e.type !== "message") continue;
|
|
96
|
+
messageCount++;
|
|
97
|
+
const msg = e.message;
|
|
98
|
+
if (!msg?.content || (msg.role !== "user" && msg.role !== "assistant")) continue;
|
|
99
|
+
const text = [].concat(msg.content).filter((p) => p?.type === "text").map((p) => p.text).join(" ").trim();
|
|
100
|
+
if (!text) continue;
|
|
101
|
+
allMessages.push(text);
|
|
102
|
+
if (!firstMessage && msg.role === "user") firstMessage = text;
|
|
103
|
+
}
|
|
104
|
+
sessions.push({ path: row.file_path || row.id, id: row.id, cwd: row.cwd || "", name, parentSessionPath: row.parent_session || undefined, created: new Date(row.created_at || 0), modified: new Date(row.updated_at || row.created_at || 0), messageCount, firstMessage: firstMessage || "(no messages)", allMessagesText: allMessages.join(" ") });
|
|
105
|
+
} catch {}
|
|
106
|
+
loaded++;
|
|
107
|
+
onProgress?.(loaded, total);
|
|
108
|
+
}
|
|
109
|
+
return sessions;
|
|
110
|
+
}
|
|
111
|
+
export async function listSessionsFromDb(dir, onProgress) {
|
|
112
|
+
try {
|
|
113
|
+
const db = openDb();
|
|
114
|
+
const sessionRows = db.prepare("SELECT id, file_path, cwd, created_at, updated_at, parent_session FROM sessions WHERE session_dir = ? ORDER BY updated_at DESC").all(dir);
|
|
115
|
+
const sessions = await buildSessionsFromRows(db, sessionRows, onProgress);
|
|
116
|
+
db.close();
|
|
117
|
+
return sessions;
|
|
118
|
+
} catch { return []; }
|
|
119
|
+
}
|
|
120
|
+
export async function listAllSessionsFromDb(onProgress) {
|
|
121
|
+
try {
|
|
122
|
+
const db = openDb();
|
|
123
|
+
const sessionRows = db.prepare("SELECT id, file_path, cwd, created_at, updated_at, parent_session FROM sessions ORDER BY updated_at DESC").all();
|
|
124
|
+
const sessions = await buildSessionsFromRows(db, sessionRows, onProgress);
|
|
125
|
+
db.close();
|
|
126
|
+
return sessions;
|
|
127
|
+
} catch { return []; }
|
|
128
|
+
}
|
|
@@ -2,7 +2,7 @@ import { CONFIG_DIR_NAME } from "../config.js";
|
|
|
2
2
|
import { emitProjectTrustEvent } from "./extensions/runner.js";
|
|
3
3
|
import { getProjectTrustOptions, hasTrustRequiringProjectResources, } from "./trust-manager.js";
|
|
4
4
|
function formatProjectTrustPrompt(cwd) {
|
|
5
|
-
return `Trust project folder?\n${cwd}\n\nThis allows
|
|
5
|
+
return `Trust project folder?\n${cwd}\n\nThis allows Prism to load ${CONFIG_DIR_NAME} settings and resources, install missing project packages, and execute project extensions.`;
|
|
6
6
|
}
|
|
7
7
|
async function selectProjectTrustOption(cwd, ctx) {
|
|
8
8
|
const options = getProjectTrustOptions(cwd, { includeSessionOnly: true });
|
|
@@ -67,7 +67,7 @@ export async function createAgentSession(options = {}) {
|
|
|
67
67
|
const cwd = resolvePath(options.cwd ?? options.sessionManager?.getCwd() ?? process.cwd());
|
|
68
68
|
const agentDir = options.agentDir ? resolvePath(options.agentDir) : getDefaultAgentDir();
|
|
69
69
|
let resourceLoader = options.resourceLoader;
|
|
70
|
-
const authPath = options.agentDir ? join(agentDir, "auth.json") : undefined;
|
|
70
|
+
const authPath = process.env.PRISM_AUTH_PATH || process.env.PI_AUTH_PATH || (options.agentDir ? join(agentDir, "auth.json") : undefined);
|
|
71
71
|
const modelsPath = options.agentDir ? join(agentDir, "models.json") : undefined;
|
|
72
72
|
const modelRuntime = options.modelRuntime ?? (await ModelRuntime.create({ authPath, modelsPath }));
|
|
73
73
|
const settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);
|
|
@@ -3,6 +3,7 @@ import { randomUUID } from "crypto";
|
|
|
3
3
|
import { appendFileSync, closeSync, createReadStream, existsSync, mkdirSync, openSync, readdirSync, readSync, statSync, writeFileSync, } from "fs";
|
|
4
4
|
import { readdir, stat } from "fs/promises";
|
|
5
5
|
import { join, resolve } from "path";
|
|
6
|
+
import { findMostRecentSessionFromDb, getSessionBackend, listAllSessionsFromDb, listSessionsFromDb, loadEntriesFromDb, mirrorEntryToDb, mirrorSessionFileToDb } from "./prism-session-db.js";
|
|
6
7
|
import { createInterface } from "readline";
|
|
7
8
|
import { StringDecoder } from "string_decoder";
|
|
8
9
|
import { getAgentDir as getDefaultAgentDir, getSessionsDir } from "../config.js";
|
|
@@ -634,12 +635,23 @@ export class SessionManager {
|
|
|
634
635
|
this._rewriteFile();
|
|
635
636
|
}
|
|
636
637
|
this._buildIndex();
|
|
638
|
+
if (getSessionBackend() !== "file") { try { mirrorSessionFileToDb(this.sessionFile, this.fileEntries, this.cwd, this.sessionDir); } catch { } }
|
|
637
639
|
this.flushed = true;
|
|
638
640
|
}
|
|
639
641
|
else {
|
|
640
|
-
const
|
|
641
|
-
|
|
642
|
-
|
|
642
|
+
const dbEntries = getSessionBackend() !== "file" ? loadEntriesFromDb(this.sessionFile) : null;
|
|
643
|
+
if (dbEntries) {
|
|
644
|
+
this.fileEntries = dbEntries;
|
|
645
|
+
const header = this.fileEntries.find((e) => e.type === "session");
|
|
646
|
+
this.sessionId = header?.id ?? createSessionId();
|
|
647
|
+
this._buildIndex();
|
|
648
|
+
if (getSessionBackend() !== "file") { try { mirrorSessionFileToDb(this.sessionFile, this.fileEntries, this.cwd, this.sessionDir); } catch {} }
|
|
649
|
+
this.flushed = true;
|
|
650
|
+
} else {
|
|
651
|
+
const explicitPath = this.sessionFile;
|
|
652
|
+
this.newSession();
|
|
653
|
+
this.sessionFile = explicitPath;
|
|
654
|
+
}
|
|
643
655
|
}
|
|
644
656
|
}
|
|
645
657
|
newSession(options) {
|
|
@@ -693,6 +705,8 @@ export class SessionManager {
|
|
|
693
705
|
_rewriteFile() {
|
|
694
706
|
if (!this.persist || !this.sessionFile)
|
|
695
707
|
return;
|
|
708
|
+
if (getSessionBackend() !== "file") { try { mirrorSessionFileToDb(this.sessionFile, this.fileEntries, this.cwd, this.sessionDir); } catch { } }
|
|
709
|
+
if (getSessionBackend() === "db") return;
|
|
696
710
|
const fd = openSync(this.sessionFile, "w");
|
|
697
711
|
try {
|
|
698
712
|
for (const entry of this.fileEntries) {
|
|
@@ -724,30 +738,14 @@ export class SessionManager {
|
|
|
724
738
|
_persist(entry) {
|
|
725
739
|
if (!this.persist || !this.sessionFile)
|
|
726
740
|
return;
|
|
727
|
-
|
|
728
|
-
if
|
|
729
|
-
|
|
730
|
-
appendFileSync(this.sessionFile, `${JSON.stringify(entry)}\n`);
|
|
731
|
-
}
|
|
732
|
-
else {
|
|
733
|
-
// Mark as not flushed so when assistant arrives, all entries get written
|
|
734
|
-
this.flushed = false;
|
|
735
|
-
}
|
|
736
|
-
return;
|
|
737
|
-
}
|
|
741
|
+
// Prism: persist every entry immediately. Pi defers session writes until the
|
|
742
|
+
// first assistant message, which can lose user prompts if multiple harnesses
|
|
743
|
+
// run at once or a process exits before the assistant response is recorded.
|
|
738
744
|
if (!this.flushed) {
|
|
739
|
-
const fd = openSync(this.sessionFile, "wx");
|
|
740
|
-
try {
|
|
741
|
-
for (const e of this.fileEntries) {
|
|
742
|
-
writeFileSync(fd, `${JSON.stringify(e)}\n`);
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
finally {
|
|
746
|
-
closeSync(fd);
|
|
747
|
-
}
|
|
745
|
+
if (getSessionBackend() !== "db") { const fd = openSync(this.sessionFile, "wx"); try { for (const e of this.fileEntries) { writeFileSync(fd, `${JSON.stringify(e)}\n`); } } finally { closeSync(fd); } }
|
|
748
746
|
this.flushed = true;
|
|
749
747
|
}
|
|
750
|
-
else {
|
|
748
|
+
else if (getSessionBackend() !== "db") {
|
|
751
749
|
appendFileSync(this.sessionFile, `${JSON.stringify(entry)}\n`);
|
|
752
750
|
}
|
|
753
751
|
}
|
|
@@ -756,6 +754,7 @@ export class SessionManager {
|
|
|
756
754
|
this.byId.set(entry.id, entry);
|
|
757
755
|
this.leafId = entry.id;
|
|
758
756
|
this._persist(entry);
|
|
757
|
+
if (getSessionBackend() !== "file") { try { mirrorEntryToDb(this.sessionFile, this.fileEntries.find((e) => e.type === "session"), entry, this.cwd, this.sessionDir, this.fileEntries.length - 2); } catch { } }
|
|
759
758
|
}
|
|
760
759
|
/** Append a message as child of current leaf, then advance leaf. Returns entry id.
|
|
761
760
|
* Does not allow writing CompactionSummaryMessage and BranchSummaryMessage directly.
|
|
@@ -1201,6 +1200,7 @@ export class SessionManager {
|
|
|
1201
1200
|
header = firstEntry?.type === "session" ? firstEntry : null;
|
|
1202
1201
|
}
|
|
1203
1202
|
}
|
|
1203
|
+
if (!header && getSessionBackend() !== "file") { try { preloadedFileEntries = loadEntriesFromDb(resolvedPath) ?? undefined; header = preloadedFileEntries?.find((e) => e.type === "session") ?? null; } catch {} }
|
|
1204
1204
|
const cwd = cwdOverride ?? (header ? getSessionHeaderCwd(header) : undefined) ?? process.cwd();
|
|
1205
1205
|
// If no sessionDir provided, derive from file's parent directory
|
|
1206
1206
|
const dir = sessionDir ? normalizePath(sessionDir) : resolve(resolvedPath, "..");
|
|
@@ -1214,7 +1214,7 @@ export class SessionManager {
|
|
|
1214
1214
|
static continueRecent(cwd, sessionDir) {
|
|
1215
1215
|
const dir = sessionDir ? normalizePath(sessionDir) : getDefaultSessionDir(cwd);
|
|
1216
1216
|
const filterCwd = sessionDir !== undefined && dir !== getDefaultSessionDirPath(cwd);
|
|
1217
|
-
const mostRecent = findMostRecentSession(dir, filterCwd ? cwd : undefined);
|
|
1217
|
+
const mostRecent = getSessionBackend() === "file" ? findMostRecentSession(dir, filterCwd ? cwd : undefined) : findMostRecentSessionFromDb(dir);
|
|
1218
1218
|
if (mostRecent) {
|
|
1219
1219
|
return new SessionManager(cwd, dir, mostRecent, true);
|
|
1220
1220
|
}
|
|
@@ -1234,7 +1234,8 @@ export class SessionManager {
|
|
|
1234
1234
|
static forkFrom(sourcePath, targetCwd, sessionDir, options) {
|
|
1235
1235
|
const resolvedSourcePath = resolvePath(sourcePath);
|
|
1236
1236
|
const resolvedTargetCwd = resolvePath(targetCwd);
|
|
1237
|
-
|
|
1237
|
+
let sourceEntries = loadEntriesFromFile(resolvedSourcePath);
|
|
1238
|
+
if (sourceEntries.length === 0 && getSessionBackend() !== "file") { try { sourceEntries = loadEntriesFromDb(resolvedSourcePath) ?? []; } catch {} }
|
|
1238
1239
|
if (sourceEntries.length === 0) {
|
|
1239
1240
|
throw new Error(`Cannot fork: source session file is empty or invalid: ${resolvedSourcePath}`);
|
|
1240
1241
|
}
|
|
@@ -1263,12 +1264,10 @@ export class SessionManager {
|
|
|
1263
1264
|
cwd: resolvedTargetCwd,
|
|
1264
1265
|
parentSession: resolvedSourcePath,
|
|
1265
1266
|
};
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
if (entry.type !== "session") {
|
|
1270
|
-
appendFileSync(newSessionFile, `${JSON.stringify(entry)}\n`);
|
|
1271
|
-
}
|
|
1267
|
+
if (getSessionBackend() !== "file") { try { mirrorSessionFileToDb(newSessionFile, [newHeader, ...sourceEntries.filter((e) => e.type !== "session")], resolvedTargetCwd, dir); } catch {} }
|
|
1268
|
+
if (getSessionBackend() !== "db") {
|
|
1269
|
+
writeFileSync(newSessionFile, `${JSON.stringify(newHeader)}\n`, { flag: "wx" });
|
|
1270
|
+
for (const entry of sourceEntries) { if (entry.type !== "session") appendFileSync(newSessionFile, `${JSON.stringify(entry)}\n`); }
|
|
1272
1271
|
}
|
|
1273
1272
|
return new SessionManager(resolvedTargetCwd, dir, newSessionFile, true);
|
|
1274
1273
|
}
|
|
@@ -1280,11 +1279,14 @@ export class SessionManager {
|
|
|
1280
1279
|
*/
|
|
1281
1280
|
static async list(cwd, sessionDir, onProgress) {
|
|
1282
1281
|
const dir = sessionDir ? normalizePath(sessionDir) : getDefaultSessionDir(cwd);
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1282
|
+
if (getSessionBackend() === "file") {
|
|
1283
|
+
const filterCwd = sessionDir !== undefined && dir !== getDefaultSessionDirPath(cwd);
|
|
1284
|
+
const resolvedCwd = resolvePath(cwd);
|
|
1285
|
+
const sessions = (await listSessionsFromDir(dir, onProgress)).filter((session) => !filterCwd || sessionCwdMatches(session.cwd, resolvedCwd));
|
|
1286
|
+
sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
1287
|
+
return sessions;
|
|
1288
|
+
}
|
|
1289
|
+
return listSessionsFromDb(dir, onProgress);
|
|
1288
1290
|
}
|
|
1289
1291
|
static async listAll(sessionDirOrOnProgress, onProgress) {
|
|
1290
1292
|
const customSessionDir = typeof sessionDirOrOnProgress === "string" ? normalizePath(sessionDirOrOnProgress) : undefined;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* System prompt construction and project context loading
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { existsSync } from "node:fs";
|
|
5
|
+
import { join } from "node:path";
|
|
5
6
|
import { formatSkillsForPrompt } from "./skills.js";
|
|
6
7
|
/** Build the system prompt with tools, guidelines, and context */
|
|
7
8
|
export function buildSystemPrompt(options) {
|
|
@@ -32,10 +33,22 @@ export function buildSystemPrompt(options) {
|
|
|
32
33
|
prompt += `\nCurrent working directory: ${promptCwd}`;
|
|
33
34
|
return prompt;
|
|
34
35
|
}
|
|
35
|
-
// Get absolute paths to documentation and examples
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const
|
|
36
|
+
// Get absolute paths to project documentation and examples.
|
|
37
|
+
// Only project docs are advertised here. Harness/pi docs can be linked into the project docs
|
|
38
|
+
// tree (for example docs/pi) when a project wants them in the prompt.
|
|
39
|
+
const resolvedCwd = cwd;
|
|
40
|
+
const existingPath = (filePath) => existsSync(filePath) ? filePath : undefined;
|
|
41
|
+
const firstExistingPath = (filePaths) => filePaths.find((filePath) => existsSync(filePath));
|
|
42
|
+
const projectReadmePath = firstExistingPath(["README.md", "README.MD", "readme.md"].map((name) => join(resolvedCwd, name)));
|
|
43
|
+
const projectDocsPath = existingPath(join(resolvedCwd, "docs"));
|
|
44
|
+
const projectExamplesPath = existingPath(join(resolvedCwd, "examples"));
|
|
45
|
+
const documentationLines = [];
|
|
46
|
+
if (projectReadmePath) documentationLines.push(`- Main documentation: ${projectReadmePath}`);
|
|
47
|
+
if (projectDocsPath) documentationLines.push(`- Additional docs: ${projectDocsPath}`);
|
|
48
|
+
if (projectExamplesPath) documentationLines.push(`- Examples: ${projectExamplesPath}`);
|
|
49
|
+
if (projectDocsPath || projectExamplesPath) documentationLines.push("- When reading these docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory");
|
|
50
|
+
if (projectDocsPath) documentationLines.push("- When working on this project, read the relevant docs and follow .md cross-references before implementing");
|
|
51
|
+
const documentationSection = documentationLines.length > 0 ? `\n\nProject documentation (read only when relevant):\n${documentationLines.join("\n")}` : "";
|
|
39
52
|
// Build tools list based on selected tools.
|
|
40
53
|
// A tool appears in Available tools only when the caller provides a one-line snippet.
|
|
41
54
|
const tools = selectedTools || ["read", "bash", "edit", "write"];
|
|
@@ -70,7 +83,7 @@ export function buildSystemPrompt(options) {
|
|
|
70
83
|
addGuideline("Be concise in your responses");
|
|
71
84
|
addGuideline("Show file paths clearly when working with files");
|
|
72
85
|
const guidelines = guidelinesList.map((g) => `- ${g}`).join("\n");
|
|
73
|
-
let prompt = `You are an expert coding assistant operating inside
|
|
86
|
+
let prompt = `You are an expert coding assistant operating inside prism, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.
|
|
74
87
|
|
|
75
88
|
Available tools:
|
|
76
89
|
${toolsList}
|
|
@@ -78,16 +91,7 @@ ${toolsList}
|
|
|
78
91
|
In addition to the tools above, you may have access to other custom tools depending on the project.
|
|
79
92
|
|
|
80
93
|
Guidelines:
|
|
81
|
-
${guidelines}
|
|
82
|
-
|
|
83
|
-
Pi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):
|
|
84
|
-
- Main documentation: ${readmePath}
|
|
85
|
-
- Additional docs: ${docsPath}
|
|
86
|
-
- Examples: ${examplesPath} (extensions, custom tools, SDK)
|
|
87
|
-
- When reading pi docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory
|
|
88
|
-
- When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), pi packages (docs/packages.md), environment variables (docs/environment-variables.md)
|
|
89
|
-
- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing
|
|
90
|
-
- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;
|
|
94
|
+
${guidelines}${documentationSection}`;
|
|
91
95
|
if (appendSection) {
|
|
92
96
|
prompt += appendSection;
|
|
93
97
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { deleteSessionFromDb } from "../../../core/prism-session-db.js";
|
|
2
3
|
import { existsSync } from "node:fs";
|
|
3
4
|
import { unlink } from "node:fs/promises";
|
|
4
5
|
import * as os from "node:os";
|
|
@@ -539,6 +540,9 @@ class SessionList {
|
|
|
539
540
|
* Delete a session file, trying the `trash` CLI first, then falling back to unlink
|
|
540
541
|
*/
|
|
541
542
|
async function deleteSessionFile(sessionPath) {
|
|
543
|
+
const _backend = process.env.PRISM_SESSION_BACKEND || "db";
|
|
544
|
+
if (_backend !== "file") { try { deleteSessionFromDb(sessionPath); } catch {} }
|
|
545
|
+
if (_backend === "db" && !existsSync(sessionPath)) return { ok: true, method: "trash" };
|
|
542
546
|
// Try `trash` first (if installed)
|
|
543
547
|
const trashArgs = sessionPath.startsWith("-") ? ["--", sessionPath] : [sessionPath];
|
|
544
548
|
const trashResult = spawnSync("trash", trashArgs, { encoding: "utf-8" });
|
package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js
CHANGED
|
@@ -464,12 +464,15 @@ export class InteractiveMode {
|
|
|
464
464
|
}));
|
|
465
465
|
// Convert extension commands to SlashCommand format
|
|
466
466
|
const builtinCommandNames = new Set(slashCommands.map((c) => c.name));
|
|
467
|
+
const prismInternalCommandExtensions = new Set(["caveman-mode.ts", "clear-session.ts", "git-commit.ts", "plan-command.ts", "voice-command.ts", "obsidian-memory.ts", "logseq-memory.ts", "honcho-memory.ts", "research-tools.ts", "ai-memory-system.ts", "rp-memory.ts", "manifest-provider.ts", "ollama-provider.ts", "toolbox.ts", "context-usage.ts", "prism-status.ts", "toolbar.ts", "pi-mcp-adapter"]);
|
|
468
|
+
const prismInternalCommandNpmPackages = new Set(["pi-mcp-adapter"]);
|
|
469
|
+
const isPrismInternalCommand = (cmd) => (() => { const prismExtensionPath = String(cmd.sourceInfo?.path || "").replaceAll("\\", "/"); const prismExtensionSource = String(cmd.sourceInfo?.source || ""); return prismInternalCommandExtensions.has(path.basename(prismExtensionPath)) || Array.from(prismInternalCommandNpmPackages).some((pkg) => prismExtensionSource === "npm:" + pkg || prismExtensionPath.includes("/node_modules/" + pkg + "/")); })();
|
|
467
470
|
const extensionCommands = this.session.extensionRunner
|
|
468
471
|
.getRegisteredCommands()
|
|
469
472
|
.filter((cmd) => !builtinCommandNames.has(cmd.name))
|
|
470
473
|
.map((cmd) => ({
|
|
471
474
|
name: cmd.invocationName,
|
|
472
|
-
description: this.prefixAutocompleteDescription(cmd.description, cmd.sourceInfo),
|
|
475
|
+
description: isPrismInternalCommand(cmd) ? cmd.description : this.prefixAutocompleteDescription(cmd.description, cmd.sourceInfo),
|
|
473
476
|
getArgumentCompletions: cmd.getArgumentCompletions,
|
|
474
477
|
}));
|
|
475
478
|
// Build skill commands from session.skills (if enabled)
|
|
@@ -658,7 +661,7 @@ export class InteractiveMode {
|
|
|
658
661
|
await this.themeController.applyFromSettings();
|
|
659
662
|
// Add header with keybindings from config (unless silenced)
|
|
660
663
|
if (this.options.verbose || !this.settingsManager.getQuietStartup()) {
|
|
661
|
-
const logo =
|
|
664
|
+
const logo = "▲ \u001b[38;5;196mp\u001b[38;5;202mr\u001b[38;5;226mi\u001b[38;5;46ms\u001b[38;5;51mm\u001b[0m v0.2.83";
|
|
662
665
|
// Build startup instructions using keybinding hint helpers
|
|
663
666
|
const hint = (keybinding, description) => keyHint(keybinding, description);
|
|
664
667
|
const expandedInstructions = [
|
|
@@ -690,7 +693,7 @@ export class InteractiveMode {
|
|
|
690
693
|
hint("app.tools.expand", "more"),
|
|
691
694
|
].join(theme.fg("muted", " · "));
|
|
692
695
|
const compactOnboarding = theme.fg("dim", `Press ${keyText("app.tools.expand")} to show full startup help and loaded resources.`);
|
|
693
|
-
const onboarding = theme.fg("dim", `
|
|
696
|
+
const onboarding = theme.fg("dim", `Prism can explain its own features and look up its docs. Ask it how to use or extend Prism.`);
|
|
694
697
|
this.builtInHeader = new ExpandableText(() => `${logo}\n${compactInstructions}\n${compactOnboarding}\n\n${onboarding}`, () => `${logo}\n${expandedInstructions}\n\n${onboarding}`, this.getStartupExpansionState(), 1, 0);
|
|
695
698
|
// Setup UI layout
|
|
696
699
|
this.headerContainer.addChild(new Spacer(1));
|
|
@@ -727,10 +730,10 @@ export class InteractiveMode {
|
|
|
727
730
|
const cwdBasename = path.basename(this.sessionManager.getCwd());
|
|
728
731
|
const sessionName = this.sessionManager.getSessionName();
|
|
729
732
|
if (sessionName) {
|
|
730
|
-
this.ui.terminal.setTitle(
|
|
733
|
+
this.ui.terminal.setTitle(`▲ - ${sessionName} - ${cwdBasename}`);
|
|
731
734
|
}
|
|
732
735
|
else {
|
|
733
|
-
this.ui.terminal.setTitle(
|
|
736
|
+
this.ui.terminal.setTitle(`▲ - ${cwdBasename}`);
|
|
734
737
|
}
|
|
735
738
|
}
|
|
736
739
|
/**
|
|
@@ -794,6 +797,7 @@ export class InteractiveMode {
|
|
|
794
797
|
}
|
|
795
798
|
catch (error) {
|
|
796
799
|
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
800
|
+
errorMessage = this.humanizeUsageLimitError(errorMessage);
|
|
797
801
|
this.showError(errorMessage);
|
|
798
802
|
}
|
|
799
803
|
}
|
|
@@ -804,7 +808,8 @@ export class InteractiveMode {
|
|
|
804
808
|
}
|
|
805
809
|
catch (error) {
|
|
806
810
|
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
807
|
-
this.
|
|
811
|
+
errorMessage = this.humanizeUsageLimitError(errorMessage);
|
|
812
|
+
this.showError(errorMessage);
|
|
808
813
|
}
|
|
809
814
|
}
|
|
810
815
|
}
|
|
@@ -816,6 +821,7 @@ export class InteractiveMode {
|
|
|
816
821
|
}
|
|
817
822
|
catch (error) {
|
|
818
823
|
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
824
|
+
errorMessage = this.humanizeUsageLimitError(errorMessage);
|
|
819
825
|
this.showError(errorMessage);
|
|
820
826
|
}
|
|
821
827
|
}
|
|
@@ -892,14 +898,19 @@ export class InteractiveMode {
|
|
|
892
898
|
const entries = parseChangelog(changelogPath);
|
|
893
899
|
if (!lastVersion) {
|
|
894
900
|
// Fresh install - record the version, send telemetry, don't show changelog
|
|
895
|
-
this.settingsManager.setLastChangelogVersion(
|
|
896
|
-
this.reportInstallTelemetry(
|
|
901
|
+
this.settingsManager.setLastChangelogVersion("0.84.1");
|
|
902
|
+
this.reportInstallTelemetry("0.84.1");
|
|
897
903
|
return undefined;
|
|
898
904
|
}
|
|
899
905
|
const newEntries = getNewEntries(entries, lastVersion);
|
|
906
|
+
if (entries.length > 0 && newEntries.length === entries.length) {
|
|
907
|
+
this.settingsManager.setLastChangelogVersion("0.84.1");
|
|
908
|
+
this.reportInstallTelemetry("0.84.1");
|
|
909
|
+
return normalizeChangelogLinks(entries[0].content, entries[0]);
|
|
910
|
+
}
|
|
900
911
|
if (newEntries.length > 0) {
|
|
901
|
-
this.settingsManager.setLastChangelogVersion(
|
|
902
|
-
this.reportInstallTelemetry(
|
|
912
|
+
this.settingsManager.setLastChangelogVersion("0.84.1");
|
|
913
|
+
this.reportInstallTelemetry("0.84.1");
|
|
903
914
|
return newEntries.map((e) => normalizeChangelogLinks(e.content, e)).join("\n\n");
|
|
904
915
|
}
|
|
905
916
|
return undefined;
|
|
@@ -1237,7 +1248,7 @@ export class InteractiveMode {
|
|
|
1237
1248
|
const skillsResult = this.session.resourceLoader.getSkills();
|
|
1238
1249
|
const promptsResult = this.session.resourceLoader.getPrompts();
|
|
1239
1250
|
const themesResult = this.session.resourceLoader.getThemes();
|
|
1240
|
-
|
|
1251
|
+
let extensions = options?.extensions ??
|
|
1241
1252
|
this.session.resourceLoader
|
|
1242
1253
|
.getExtensions()
|
|
1243
1254
|
.extensions.filter((extension) => !extension.hidden)
|
|
@@ -1308,6 +1319,9 @@ export class InteractiveMode {
|
|
|
1308
1319
|
const promptCompactList = formatCompactList(templates.map((template) => `/${template.name}`));
|
|
1309
1320
|
addLoadedSection("Prompts", promptCompactList, templateList);
|
|
1310
1321
|
}
|
|
1322
|
+
const prismInternalExtensions = new Set(["caveman-mode.ts", "clear-session.ts", "git-commit.ts", "plan-command.ts", "voice-command.ts", "obsidian-memory.ts", "logseq-memory.ts", "honcho-memory.ts", "research-tools.ts", "ai-memory-system.ts", "rp-memory.ts", "manifest-provider.ts", "ollama-provider.ts", "toolbox.ts", "context-usage.ts", "prism-status.ts", "toolbar.ts", "pi-mcp-adapter"]);
|
|
1323
|
+
const prismInternalNpmPackages = new Set(["pi-mcp-adapter"]);
|
|
1324
|
+
extensions = extensions.filter((extension) => !(() => { const prismExtensionPath = String(extension.path || "").replaceAll("\\", "/"); const prismExtensionSource = String(extension.sourceInfo?.source || ""); return prismInternalExtensions.has(path.basename(prismExtensionPath)) || Array.from(prismInternalNpmPackages).some((pkg) => prismExtensionSource === "npm:" + pkg || prismExtensionPath.includes("/node_modules/" + pkg + "/")); })());
|
|
1311
1325
|
if (extensions.length > 0) {
|
|
1312
1326
|
const groups = this.buildScopeGroups(extensions);
|
|
1313
1327
|
const extList = this.formatScopeGroups(groups, {
|
|
@@ -1319,7 +1333,8 @@ export class InteractiveMode {
|
|
|
1319
1333
|
}
|
|
1320
1334
|
// Show loaded themes (excluding built-in)
|
|
1321
1335
|
const loadedThemes = themesResult.themes;
|
|
1322
|
-
const
|
|
1336
|
+
const prismInternalThemes = new Set(["soft-green"]);
|
|
1337
|
+
const customThemes = loadedThemes.filter((t) => t.sourcePath && !prismInternalThemes.has(t.name));
|
|
1323
1338
|
if (customThemes.length > 0) {
|
|
1324
1339
|
const groups = this.buildScopeGroups(customThemes.map((loadedTheme) => ({
|
|
1325
1340
|
path: loadedTheme.sourcePath,
|
|
@@ -2395,6 +2410,27 @@ export class InteractiveMode {
|
|
|
2395
2410
|
await this.handleCompactCommand(customInstructions);
|
|
2396
2411
|
return;
|
|
2397
2412
|
}
|
|
2413
|
+
if (text === "/plan" || text.startsWith("/plan ")) {
|
|
2414
|
+
const task = text.startsWith("/plan ") ? text.slice(6).trim() : "";
|
|
2415
|
+
this.editor.setText("");
|
|
2416
|
+
await this.startPrismPlanMode(task);
|
|
2417
|
+
return;
|
|
2418
|
+
}
|
|
2419
|
+
if (text === "/plan:approve") {
|
|
2420
|
+
this.editor.setText("");
|
|
2421
|
+
await this.approvePrismPlan();
|
|
2422
|
+
return;
|
|
2423
|
+
}
|
|
2424
|
+
if (text === "/plan:reject") {
|
|
2425
|
+
this.editor.setText("");
|
|
2426
|
+
this.rejectPrismPlan();
|
|
2427
|
+
return;
|
|
2428
|
+
}
|
|
2429
|
+
if (text === "/plan:cancel") {
|
|
2430
|
+
this.editor.setText("");
|
|
2431
|
+
this.cancelPrismPlan();
|
|
2432
|
+
return;
|
|
2433
|
+
}
|
|
2398
2434
|
if (text === "/reload") {
|
|
2399
2435
|
this.editor.setText("");
|
|
2400
2436
|
await this.handleReloadCommand();
|
|
@@ -2659,6 +2695,8 @@ export class InteractiveMode {
|
|
|
2659
2695
|
break;
|
|
2660
2696
|
case "agent_settled":
|
|
2661
2697
|
await this.checkShutdownRequested();
|
|
2698
|
+
void this.maybeShowUsageLimitRecoveryMenu(event);
|
|
2699
|
+
void this.maybeShowPrismPlanApprovalMenu(event);
|
|
2662
2700
|
break;
|
|
2663
2701
|
case "compaction_start": {
|
|
2664
2702
|
if (this.settingsManager.getShowTerminalProgress()) {
|
|
@@ -2757,6 +2795,189 @@ export class InteractiveMode {
|
|
|
2757
2795
|
}
|
|
2758
2796
|
}
|
|
2759
2797
|
}
|
|
2798
|
+
formatUsageLimitDuration(ms) {
|
|
2799
|
+
const totalMinutes = Math.ceil(ms / 60000);
|
|
2800
|
+
const hours = Math.floor(totalMinutes / 60);
|
|
2801
|
+
const minutes = totalMinutes % 60;
|
|
2802
|
+
const parts = [];
|
|
2803
|
+
if (hours > 0) parts.push(hours + "h");
|
|
2804
|
+
if (minutes > 0 || parts.length === 0) parts.push(minutes + "min");
|
|
2805
|
+
return parts.join(" ");
|
|
2806
|
+
}
|
|
2807
|
+
humanizeUsageLimitError(errorMessage) {
|
|
2808
|
+
return String(errorMessage || "").replace(/(~|about\s*)?(\d+)\s*min\b/gi, (_match, prefix, minutes) => {
|
|
2809
|
+
return (prefix || "") + this.formatUsageLimitDuration(Number(minutes) * 60 * 1000);
|
|
2810
|
+
});
|
|
2811
|
+
}
|
|
2812
|
+
extractUsageLimitWaitMs(errorMessage) {
|
|
2813
|
+
const text = String(errorMessage || "");
|
|
2814
|
+
const parsedSeconds = text.match(/"(?:resets_in_seconds|X-Codex-Primary-Reset-After-Seconds|Retry-After)"\s*:?\s*"?(\d+)"?/i)?.[1];
|
|
2815
|
+
if (parsedSeconds) return Number(parsedSeconds) * 1000;
|
|
2816
|
+
const resetAt = text.match(/"(?:resets_at|X-Codex-Primary-Reset-At)"\s*:?\s*"?(\d+)"?/i)?.[1];
|
|
2817
|
+
if (resetAt) {
|
|
2818
|
+
const resetMs = Number(resetAt) * 1000 - Date.now();
|
|
2819
|
+
if (Number.isFinite(resetMs) && resetMs > 0) return resetMs;
|
|
2820
|
+
}
|
|
2821
|
+
const hours = text.match(/(?:~|about\s*)?(\d+)\s*h(?:our)?/i)?.[1];
|
|
2822
|
+
if (hours) return Number(hours) * 60 * 60 * 1000;
|
|
2823
|
+
const minutes = text.match(/(?:~|about\s*)?(\d+)\s*min/i)?.[1];
|
|
2824
|
+
if (minutes) return Number(minutes) * 60 * 1000;
|
|
2825
|
+
const seconds = text.match(/(?:~|about\s*)?(\d+)\s*s(?:ec|econd)?/i)?.[1];
|
|
2826
|
+
if (seconds) return Number(seconds) * 1000;
|
|
2827
|
+
return 5 * 60 * 1000;
|
|
2828
|
+
}
|
|
2829
|
+
getUsageLimitError(event) {
|
|
2830
|
+
const last = event?.messages?.[event.messages.length - 1];
|
|
2831
|
+
let errorMessage = last?.errorMessage || last?.content?.find?.((block) => block?.type === "text")?.text || "";
|
|
2832
|
+
if (last?.role !== "assistant" || last?.stopReason !== "error") return undefined;
|
|
2833
|
+
errorMessage = this.humanizeUsageLimitError(errorMessage);
|
|
2834
|
+
return /usage limit|try again in/i.test(errorMessage) ? String(errorMessage) : undefined;
|
|
2835
|
+
}
|
|
2836
|
+
removeLastAssistantErrorFromState() {
|
|
2837
|
+
const messages = this.agent.state.messages;
|
|
2838
|
+
const last = messages[messages.length - 1];
|
|
2839
|
+
if (last?.role === "assistant" && last?.stopReason === "error") this.agent.state.messages = messages.slice(0, -1);
|
|
2840
|
+
}
|
|
2841
|
+
async continueAfterUsageLimitRecovery() {
|
|
2842
|
+
try {
|
|
2843
|
+
await this.agent.continue();
|
|
2844
|
+
} catch (error) {
|
|
2845
|
+
this.showError(error instanceof Error ? error.message : String(error));
|
|
2846
|
+
}
|
|
2847
|
+
}
|
|
2848
|
+
maybeShowUsageLimitRecoveryMenu(event) {
|
|
2849
|
+
const errorMessage = this.getUsageLimitError(event);
|
|
2850
|
+
if (!errorMessage) return;
|
|
2851
|
+
const delayMs = this.extractUsageLimitWaitMs(errorMessage);
|
|
2852
|
+
const waitLabel = "Wait " + this.formatUsageLimitDuration(delayMs) + " then retry";
|
|
2853
|
+
this.showSelector((done) => {
|
|
2854
|
+
const selector = new ExtensionSelectorComponent("Usage limit hit", [waitLabel, "Change model and retry", "Cancel"], async (selected) => {
|
|
2855
|
+
done();
|
|
2856
|
+
if (selected === "Cancel") return;
|
|
2857
|
+
this.removeLastAssistantErrorFromState();
|
|
2858
|
+
if (selected === waitLabel) {
|
|
2859
|
+
const endTime = Date.now() + delayMs;
|
|
2860
|
+
const updateCountdown = () => {
|
|
2861
|
+
const remaining = Math.max(0, endTime - Date.now());
|
|
2862
|
+
this.showStatus("Waiting " + this.formatUsageLimitDuration(remaining) + " for usage limit, then retrying...");
|
|
2863
|
+
this.ui.requestRender();
|
|
2864
|
+
};
|
|
2865
|
+
updateCountdown();
|
|
2866
|
+
const countdownInterval = setInterval(updateCountdown, 60000);
|
|
2867
|
+
setTimeout(() => { clearInterval(countdownInterval); void this.continueAfterUsageLimitRecovery(); }, delayMs);
|
|
2868
|
+
return;
|
|
2869
|
+
}
|
|
2870
|
+
this.showUsageLimitModelSelector();
|
|
2871
|
+
}, () => {
|
|
2872
|
+
done();
|
|
2873
|
+
this.ui.requestRender();
|
|
2874
|
+
}, { tui: this.ui });
|
|
2875
|
+
return { component: selector, focus: selector };
|
|
2876
|
+
});
|
|
2877
|
+
}
|
|
2878
|
+
showUsageLimitModelSelector(initialSearchInput) {
|
|
2879
|
+
this.showSelector((done) => {
|
|
2880
|
+
const selector = new ModelSelectorComponent(this.ui, this.session.model, this.settingsManager, this.session.modelRegistry, this.session.scopedModels, async (model) => {
|
|
2881
|
+
try {
|
|
2882
|
+
await this.session.setModel(model);
|
|
2883
|
+
this.footer.invalidate();
|
|
2884
|
+
this.updateEditorBorderColor();
|
|
2885
|
+
done();
|
|
2886
|
+
this.showStatus("Model: " + model.id + "; retrying...");
|
|
2887
|
+
void this.maybeWarnAboutAnthropicSubscriptionAuth(model);
|
|
2888
|
+
this.checkDaxnutsEasterEgg(model);
|
|
2889
|
+
void this.continueAfterUsageLimitRecovery();
|
|
2890
|
+
} catch (error) {
|
|
2891
|
+
done();
|
|
2892
|
+
this.showError(error instanceof Error ? error.message : String(error));
|
|
2893
|
+
}
|
|
2894
|
+
}, () => {
|
|
2895
|
+
done();
|
|
2896
|
+
this.ui.requestRender();
|
|
2897
|
+
}, initialSearchInput);
|
|
2898
|
+
return { component: selector, focus: selector };
|
|
2899
|
+
});
|
|
2900
|
+
}
|
|
2901
|
+
getPrismReadOnlyToolNames() {
|
|
2902
|
+
const readOnly = new Set(["read", "grep", "find", "ls", "obsidian_memory_read", "obsidian_memory_search", "obsidian_memory_list", "web_search", "web_fetch"]);
|
|
2903
|
+
return this.session.getActiveToolNames().filter((name) => readOnly.has(name));
|
|
2904
|
+
}
|
|
2905
|
+
setPrismPlanStatus(enabled) {
|
|
2906
|
+
this.prismPlanMode = enabled;
|
|
2907
|
+
this.setExtensionStatus("prism-mode", enabled ? "[Plan]" : undefined);
|
|
2908
|
+
this.footer.invalidate();
|
|
2909
|
+
}
|
|
2910
|
+
async startPrismPlanMode(task) {
|
|
2911
|
+
if (!this.prismPlanPreviousTools) this.prismPlanPreviousTools = this.session.getActiveToolNames();
|
|
2912
|
+
if (this.prismPlanLeafId === undefined) this.prismPlanLeafId = this.session.sessionManager.getLeafId();
|
|
2913
|
+
this.session.setActiveToolsByName(this.getPrismReadOnlyToolNames());
|
|
2914
|
+
this.setPrismPlanStatus(true);
|
|
2915
|
+
globalThis.__PRISM_MANIFEST_TIER_OVERRIDE__ = "plan";
|
|
2916
|
+
const prompt = "PLAN MODE ACTIVE. You must only inspect and plan. Do not modify files or run mutating commands. Ask concise clarification questions if needed. When ready, write the full implementation plan, then end with exactly: /plan:ready\n\nTask: " + (task || "Create an implementation plan for the user's next change.");
|
|
2917
|
+
await this.session.prompt(prompt);
|
|
2918
|
+
}
|
|
2919
|
+
getPrismLastAssistantText(event) {
|
|
2920
|
+
const last = event?.messages?.[event.messages.length - 1];
|
|
2921
|
+
if (last?.role !== "assistant") return "";
|
|
2922
|
+
return (last.content || []).map((block) => block?.type === "text" ? block.text || "" : "").join("\n");
|
|
2923
|
+
}
|
|
2924
|
+
maybeShowPrismPlanApprovalMenu(event) {
|
|
2925
|
+
if (!this.prismPlanMode) return;
|
|
2926
|
+
const text = this.getPrismLastAssistantText(event);
|
|
2927
|
+
if (!text.includes("/plan:ready")) return;
|
|
2928
|
+
this.prismPlanText = text.replace("/plan:ready", "").trim();
|
|
2929
|
+
this.showSelector((done) => {
|
|
2930
|
+
const selector = new ExtensionSelectorComponent("Plan ready", ["Approve -> make changes", "Reject -> add more context", "Cancel plan"], async (selected) => {
|
|
2931
|
+
done();
|
|
2932
|
+
if (selected.startsWith("Approve")) return void this.approvePrismPlan();
|
|
2933
|
+
if (selected.startsWith("Reject")) return this.rejectPrismPlan();
|
|
2934
|
+
this.cancelPrismPlan();
|
|
2935
|
+
}, () => {
|
|
2936
|
+
done();
|
|
2937
|
+
this.ui.requestRender();
|
|
2938
|
+
}, { tui: this.ui });
|
|
2939
|
+
return { component: selector, focus: selector };
|
|
2940
|
+
});
|
|
2941
|
+
}
|
|
2942
|
+
restorePrismPlanTools() {
|
|
2943
|
+
if (this.prismPlanPreviousTools) this.session.setActiveToolsByName(this.prismPlanPreviousTools);
|
|
2944
|
+
this.prismPlanPreviousTools = undefined;
|
|
2945
|
+
if (globalThis.__PRISM_MANIFEST_TIER_OVERRIDE__ === "plan") globalThis.__PRISM_MANIFEST_TIER_OVERRIDE__ = undefined;
|
|
2946
|
+
this.setPrismPlanStatus(false);
|
|
2947
|
+
}
|
|
2948
|
+
restorePrismPlanBranch() {
|
|
2949
|
+
if (this.prismPlanLeafId === undefined) return;
|
|
2950
|
+
if (this.prismPlanLeafId === null) {
|
|
2951
|
+
this.session.sessionManager.resetLeaf();
|
|
2952
|
+
} else {
|
|
2953
|
+
this.session.sessionManager.branch(this.prismPlanLeafId);
|
|
2954
|
+
}
|
|
2955
|
+
this.agent.state.messages = this.session.sessionManager.buildSessionContext().messages;
|
|
2956
|
+
this.prismPlanLeafId = undefined;
|
|
2957
|
+
}
|
|
2958
|
+
async approvePrismPlan() {
|
|
2959
|
+
if (!this.prismPlanMode) return this.showWarning("No active plan to approve.");
|
|
2960
|
+
const planText = this.prismPlanText || "";
|
|
2961
|
+
this.prismPlanText = undefined;
|
|
2962
|
+
this.restorePrismPlanBranch();
|
|
2963
|
+
this.restorePrismPlanTools();
|
|
2964
|
+
await this.session.prompt("Implement this plan:\n\n" + planText);
|
|
2965
|
+
}
|
|
2966
|
+
rejectPrismPlan() {
|
|
2967
|
+
if (!this.prismPlanMode) return this.showWarning("No active plan to reject.");
|
|
2968
|
+
this.prismPlanText = undefined;
|
|
2969
|
+
this.editor.setText("/plan ");
|
|
2970
|
+
this.showStatus("Add more context after /plan and submit.");
|
|
2971
|
+
this.ui.requestRender();
|
|
2972
|
+
}
|
|
2973
|
+
cancelPrismPlan() {
|
|
2974
|
+
if (!this.prismPlanMode) return this.showWarning("No active plan to cancel.");
|
|
2975
|
+
this.restorePrismPlanBranch();
|
|
2976
|
+
this.prismPlanText = undefined;
|
|
2977
|
+
this.restorePrismPlanTools();
|
|
2978
|
+
this.showStatus("Plan cancelled");
|
|
2979
|
+
this.ui.requestRender();
|
|
2980
|
+
}
|
|
2760
2981
|
/** Extract text content from a user message */
|
|
2761
2982
|
getUserMessageText(message) {
|
|
2762
2983
|
if (message.role !== "user")
|
|
@@ -202,7 +202,7 @@ export class CombinedAutocompleteProvider {
|
|
|
202
202
|
prefix: atPrefix,
|
|
203
203
|
};
|
|
204
204
|
}
|
|
205
|
-
if (
|
|
205
|
+
if (textBeforeCursor.startsWith("/")) {
|
|
206
206
|
const spaceIndex = textBeforeCursor.indexOf(" ");
|
|
207
207
|
if (spaceIndex === -1) {
|
|
208
208
|
const prefix = textBeforeCursor.slice(1);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@daniel156161/prism",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.83",
|
|
4
4
|
"description": "Prism-branded wrapper around pi that stores config in ~/.prism",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@earendil-works/pi-ai": "^0.84.1",
|
|
29
29
|
"@earendil-works/pi-coding-agent": "^0.84.1",
|
|
30
|
+
"eventsource": "^3.0.7",
|
|
30
31
|
"pi-mcp-adapter": "^2.21.2",
|
|
31
32
|
"pkce-challenge": "^6.0.0",
|
|
32
33
|
"typebox": "^1.3.11"
|
|
@@ -8,16 +8,25 @@
|
|
|
8
8
|
* message now explains *why* it failed and which route/base URL was involved.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
+
import { readSettings } from "../core/shared-config.js"
|
|
11
12
|
import { formatApiFailure, formatInvalidJsonFailure, formatTransportFailure, type AiMemoryRequestContext } from "./ai-memory-errors.js"
|
|
12
13
|
|
|
13
|
-
const DEFAULT_BASE_URL = "http://127.0.0.1:8765"
|
|
14
14
|
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000
|
|
15
15
|
const DEFAULT_STATUS_TIMEOUT_MS = 1_500
|
|
16
16
|
const DEFAULT_INJECT_TIMEOUT_MS = 1_200
|
|
17
17
|
const DEFAULT_INJECT_CACHE_TTL_MS = 60_000
|
|
18
18
|
|
|
19
|
+
export function configuredAiMemoryBaseUrl(env: NodeJS.ProcessEnv = process.env): string | undefined {
|
|
20
|
+
const raw = env.PRISM_AI_MEMORY_BASE_URL ?? env.AI_MEMORY_BASE_URL ?? readSettings(undefined, env)?.aiMemory?.baseUrl ?? readSettings(undefined, env)?.aiMemoryBaseUrl
|
|
21
|
+
if (typeof raw !== "string") return undefined
|
|
22
|
+
const trimmed = raw.trim().replace(/\/+$/, "")
|
|
23
|
+
return trimmed || undefined
|
|
24
|
+
}
|
|
25
|
+
|
|
19
26
|
export function aiMemoryBaseUrl(env: NodeJS.ProcessEnv = process.env): string {
|
|
20
|
-
|
|
27
|
+
const baseUrl = configuredAiMemoryBaseUrl(env)
|
|
28
|
+
if (!baseUrl) throw new Error("AI Memory base URL is not configured. Set PRISM_AI_MEMORY_BASE_URL or aiMemory.baseUrl.")
|
|
29
|
+
return baseUrl
|
|
21
30
|
}
|
|
22
31
|
|
|
23
32
|
function positiveIntegerSetting(value: unknown, fallback: number): number {
|
|
@@ -5,6 +5,7 @@ import { readSettings } from "../core/shared-config.js"
|
|
|
5
5
|
import { formatDegradedNotice } from "./ai-memory-errors.js"
|
|
6
6
|
import {
|
|
7
7
|
aiMemoryBaseUrl,
|
|
8
|
+
configuredAiMemoryBaseUrl,
|
|
8
9
|
aiMemoryInjectCacheTtlMs,
|
|
9
10
|
aiMemoryInjectTimeoutMs,
|
|
10
11
|
aiMemoryRequestTimeoutMs,
|
|
@@ -63,7 +64,7 @@ export function shouldEnableAiMemory(env: NodeJS.ProcessEnv = process.env): bool
|
|
|
63
64
|
if (envValue !== undefined) return envValue
|
|
64
65
|
const settings = readSettings(undefined, env)
|
|
65
66
|
const settingsValue = booleanSetting(settings?.aiMemory?.enabled ?? settings?.aiMemoryEnabled)
|
|
66
|
-
return settingsValue ??
|
|
67
|
+
return settingsValue ?? configuredAiMemoryBaseUrl(env) !== undefined
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
export function shouldInjectAiMemoryCandidates(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
@@ -71,7 +72,15 @@ export function shouldInjectAiMemoryCandidates(env: NodeJS.ProcessEnv = process.
|
|
|
71
72
|
if (envValue !== undefined) return envValue
|
|
72
73
|
const settings = readSettings(undefined, env)
|
|
73
74
|
const settingsValue = booleanSetting(settings?.aiMemory?.injectCandidates ?? settings?.aiMemoryInjectCandidates)
|
|
74
|
-
return settingsValue ??
|
|
75
|
+
return settingsValue ?? configuredAiMemoryBaseUrl(env) !== undefined
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function shouldInjectAiMemoryAlwaysContext(env: NodeJS.ProcessEnv = process.env): boolean {
|
|
79
|
+
const envValue = booleanSetting(env.PRISM_AI_MEMORY_INJECT_ALWAYS_CONTEXT ?? env.PI_AI_MEMORY_INJECT_ALWAYS_CONTEXT)
|
|
80
|
+
if (envValue !== undefined) return envValue
|
|
81
|
+
const settings = readSettings(undefined, env)
|
|
82
|
+
const settingsValue = booleanSetting(settings?.aiMemory?.injectAlwaysContext ?? settings?.aiMemoryInjectAlwaysContext)
|
|
83
|
+
return settingsValue ?? configuredAiMemoryBaseUrl(env) !== undefined
|
|
75
84
|
}
|
|
76
85
|
|
|
77
86
|
function aiMemoryContextLimit(env: NodeJS.ProcessEnv = process.env): number {
|
|
@@ -577,17 +586,18 @@ export default function aiMemorySystemExtension(pi: ExtensionAPI): void {
|
|
|
577
586
|
const patch: { systemPrompt?: string; message?: any } = {}
|
|
578
587
|
|
|
579
588
|
// Always-loaded durable context (mapped from 00 Kontext) is injected as a
|
|
580
|
-
// system-prompt chunk so it remains in the cached prefix.
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
const
|
|
585
|
-
|
|
589
|
+
// system-prompt chunk so it remains in the cached prefix. It is opt-in so a
|
|
590
|
+
// missing local AI Memory daemon does not produce startup/per-turn warnings.
|
|
591
|
+
if (shouldInjectAiMemoryAlwaysContext()) {
|
|
592
|
+
try {
|
|
593
|
+
const alwaysBlock = buildAlwaysContextMessage(await loadAlwaysContext())?.content?.trim()
|
|
594
|
+
if (alwaysBlock) {
|
|
595
|
+
const prev = String(event?.systemPrompt ?? "")
|
|
596
|
+
patch.systemPrompt = `${prev}${prev ? "\n\n" : ""}${alwaysBlock}`
|
|
597
|
+
}
|
|
598
|
+
} catch (error) {
|
|
599
|
+
reportBackgroundFailure(ctx, "always-context injection", error)
|
|
586
600
|
}
|
|
587
|
-
} catch (error) {
|
|
588
|
-
// Best-effort, but never silent: a broken API would otherwise drop durable
|
|
589
|
-
// context without anyone noticing.
|
|
590
|
-
reportBackgroundFailure(ctx, "always-context injection", error)
|
|
591
601
|
}
|
|
592
602
|
|
|
593
603
|
// Query-specific candidates (independent of the always-context block).
|