@imdigitalashish/zpi 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +17 -2801
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +5 -3
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/memory.d.ts +31 -6
  6. package/dist/core/memory.d.ts.map +1 -1
  7. package/dist/core/memory.js +63 -17
  8. package/dist/core/memory.js.map +1 -1
  9. package/dist/core/settings-manager.d.ts +3 -0
  10. package/dist/core/settings-manager.d.ts.map +1 -1
  11. package/dist/core/settings-manager.js +11 -0
  12. package/dist/core/settings-manager.js.map +1 -1
  13. package/dist/core/system-prompt.d.ts +3 -0
  14. package/dist/core/system-prompt.d.ts.map +1 -1
  15. package/dist/core/system-prompt.js +3 -3
  16. package/dist/core/system-prompt.js.map +1 -1
  17. package/dist/core/tools/memory.d.ts +2 -0
  18. package/dist/core/tools/memory.d.ts.map +1 -1
  19. package/dist/core/tools/memory.js +27 -27
  20. package/dist/core/tools/memory.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  26. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  27. package/dist/modes/interactive/components/settings-selector.js +12 -0
  28. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  29. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  30. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  31. package/dist/modes/interactive/interactive-mode.js +26 -34
  32. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  33. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transport } from \"@mariozechner/pi-ai\";\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { dirname, join } from \"path\";\r\nimport lockfile from \"proper-lockfile\";\r\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../config.js\";\r\n\r\nexport interface CompactionSettings {\r\n\tenabled?: boolean; // default: true\r\n\treserveTokens?: number; // default: 16384\r\n\tkeepRecentTokens?: number; // default: 20000\r\n}\r\n\r\nexport interface BranchSummarySettings {\r\n\treserveTokens?: number; // default: 16384 (tokens reserved for prompt + LLM response)\r\n}\r\n\r\nexport interface RetrySettings {\r\n\tenabled?: boolean; // default: true\r\n\tmaxRetries?: number; // default: 3\r\n\tbaseDelayMs?: number; // default: 2000 (exponential backoff: 2s, 4s, 8s)\r\n\tmaxDelayMs?: number; // default: 60000 (max server-requested delay before failing)\r\n}\r\n\r\nexport interface TerminalSettings {\r\n\tshowImages?: boolean; // default: true (only relevant if terminal supports images)\r\n\tclearOnShrink?: boolean; // default: false (clear empty rows when content shrinks)\r\n}\r\n\r\nexport interface ImageSettings {\r\n\tautoResize?: boolean; // default: true (resize images to 2000x2000 max for better model compatibility)\r\n\tblockImages?: boolean; // default: false - when true, prevents all images from being sent to LLM providers\r\n}\r\n\r\nexport interface ThinkingBudgetsSettings {\r\n\tminimal?: number;\r\n\tlow?: number;\r\n\tmedium?: number;\r\n\thigh?: number;\r\n}\r\n\r\nexport interface MarkdownSettings {\r\n\tcodeBlockIndent?: string; // default: \" \"\r\n}\r\n\r\nexport type TransportSetting = Transport;\r\n\r\n/**\r\n * Package source for npm/git packages.\r\n * - String form: load all resources from the package\r\n * - Object form: filter which resources to load\r\n */\r\nexport type PackageSource =\r\n\t| string\r\n\t| {\r\n\t\t\tsource: string;\r\n\t\t\textensions?: string[];\r\n\t\t\tskills?: string[];\r\n\t\t\tprompts?: string[];\r\n\t\t\tthemes?: string[];\r\n\t };\r\n\r\nexport interface Settings {\r\n\tlastChangelogVersion?: string;\r\n\tdefaultProvider?: string;\r\n\tdefaultModel?: string;\r\n\tdefaultThinkingLevel?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\r\n\ttransport?: TransportSetting; // default: \"sse\"\r\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\r\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\r\n\ttheme?: string;\r\n\tcompaction?: CompactionSettings;\r\n\tbranchSummary?: BranchSummarySettings;\r\n\tretry?: RetrySettings;\r\n\thideThinkingBlock?: boolean;\r\n\tshellPath?: string; // Custom shell path (e.g., for Cygwin users on Windows)\r\n\tquietStartup?: boolean;\r\n\tshellCommandPrefix?: string; // Prefix prepended to every bash command (e.g., \"shopt -s expand_aliases\" for alias support)\r\n\tcollapseChangelog?: boolean; // Show condensed changelog after update (use /changelog for full)\r\n\tpackages?: PackageSource[]; // Array of npm/git package sources (string or object with filtering)\r\n\textensions?: string[]; // Array of local extension file paths or directories\r\n\tskills?: string[]; // Array of local skill file paths or directories\r\n\tprompts?: string[]; // Array of local prompt template paths or directories\r\n\tthemes?: string[]; // Array of local theme file paths or directories\r\n\tenableSkillCommands?: boolean; // default: true - register skills as /skill:name commands\r\n\tterminal?: TerminalSettings;\r\n\timages?: ImageSettings;\r\n\tenabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)\r\n\tdoubleEscapeAction?: \"fork\" | \"tree\" | \"none\"; // Action for double-escape with empty editor (default: \"tree\")\r\n\tthinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels\r\n\teditorPaddingX?: number; // Horizontal padding for input editor (default: 0)\r\n\tautocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5)\r\n\tshowHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME\r\n\tmarkdown?: MarkdownSettings;\r\n\tmemory?: { enabled?: boolean }; // default: true - persistent memory system (procedural, episodic, semantic)\r\n}\r\n\r\n/** Deep merge settings: project/overrides take precedence, nested objects merge recursively */\r\nfunction deepMergeSettings(base: Settings, overrides: Settings): Settings {\r\n\tconst result: Settings = { ...base };\r\n\r\n\tfor (const key of Object.keys(overrides) as (keyof Settings)[]) {\r\n\t\tconst overrideValue = overrides[key];\r\n\t\tconst baseValue = base[key];\r\n\r\n\t\tif (overrideValue === undefined) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\t// For nested objects, merge recursively\r\n\t\tif (\r\n\t\t\ttypeof overrideValue === \"object\" &&\r\n\t\t\toverrideValue !== null &&\r\n\t\t\t!Array.isArray(overrideValue) &&\r\n\t\t\ttypeof baseValue === \"object\" &&\r\n\t\t\tbaseValue !== null &&\r\n\t\t\t!Array.isArray(baseValue)\r\n\t\t) {\r\n\t\t\t(result as Record<string, unknown>)[key] = { ...baseValue, ...overrideValue };\r\n\t\t} else {\r\n\t\t\t// For primitives and arrays, override value wins\r\n\t\t\t(result as Record<string, unknown>)[key] = overrideValue;\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nexport type SettingsScope = \"global\" | \"project\";\r\n\r\nexport interface SettingsStorage {\r\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void;\r\n}\r\n\r\nexport interface SettingsError {\r\n\tscope: SettingsScope;\r\n\terror: Error;\r\n}\r\n\r\nexport class FileSettingsStorage implements SettingsStorage {\r\n\tprivate globalSettingsPath: string;\r\n\tprivate projectSettingsPath: string;\r\n\r\n\tconstructor(cwd: string = process.cwd(), agentDir: string = getAgentDir()) {\r\n\t\tthis.globalSettingsPath = join(agentDir, \"settings.json\");\r\n\t\tthis.projectSettingsPath = join(cwd, CONFIG_DIR_NAME, \"settings.json\");\r\n\t}\r\n\r\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void {\r\n\t\tconst path = scope === \"global\" ? this.globalSettingsPath : this.projectSettingsPath;\r\n\t\tconst dir = dirname(path);\r\n\t\tif (!existsSync(dir)) {\r\n\t\t\tmkdirSync(dir, { recursive: true });\r\n\t\t}\r\n\r\n\t\tlet release: (() => void) | undefined;\r\n\t\ttry {\r\n\t\t\trelease = lockfile.lockSync(path, { realpath: false });\r\n\t\t\tconst current = existsSync(path) ? readFileSync(path, \"utf-8\") : undefined;\r\n\t\t\tconst next = fn(current);\r\n\t\t\tif (next !== undefined) {\r\n\t\t\t\twriteFileSync(path, next, \"utf-8\");\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tif (release) {\r\n\t\t\t\trelease();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class InMemorySettingsStorage implements SettingsStorage {\r\n\tprivate global: string | undefined;\r\n\tprivate project: string | undefined;\r\n\r\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void {\r\n\t\tconst current = scope === \"global\" ? this.global : this.project;\r\n\t\tconst next = fn(current);\r\n\t\tif (next !== undefined) {\r\n\t\t\tif (scope === \"global\") {\r\n\t\t\t\tthis.global = next;\r\n\t\t\t} else {\r\n\t\t\t\tthis.project = next;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class SettingsManager {\r\n\tprivate storage: SettingsStorage;\r\n\tprivate globalSettings: Settings;\r\n\tprivate projectSettings: Settings;\r\n\tprivate settings: Settings;\r\n\tprivate modifiedFields = new Set<keyof Settings>(); // Track global fields modified during session\r\n\tprivate modifiedNestedFields = new Map<keyof Settings, Set<string>>(); // Track global nested field modifications\r\n\tprivate modifiedProjectFields = new Set<keyof Settings>(); // Track project fields modified during session\r\n\tprivate modifiedProjectNestedFields = new Map<keyof Settings, Set<string>>(); // Track project nested field modifications\r\n\tprivate globalSettingsLoadError: Error | null = null; // Track if global settings file had parse errors\r\n\tprivate projectSettingsLoadError: Error | null = null; // Track if project settings file had parse errors\r\n\tprivate writeQueue: Promise<void> = Promise.resolve();\r\n\tprivate errors: SettingsError[];\r\n\r\n\tprivate constructor(\r\n\t\tstorage: SettingsStorage,\r\n\t\tinitialGlobal: Settings,\r\n\t\tinitialProject: Settings,\r\n\t\tglobalLoadError: Error | null = null,\r\n\t\tprojectLoadError: Error | null = null,\r\n\t\tinitialErrors: SettingsError[] = [],\r\n\t) {\r\n\t\tthis.storage = storage;\r\n\t\tthis.globalSettings = initialGlobal;\r\n\t\tthis.projectSettings = initialProject;\r\n\t\tthis.globalSettingsLoadError = globalLoadError;\r\n\t\tthis.projectSettingsLoadError = projectLoadError;\r\n\t\tthis.errors = [...initialErrors];\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\t}\r\n\r\n\t/** Create a SettingsManager that loads from files */\r\n\tstatic create(cwd: string = process.cwd(), agentDir: string = getAgentDir()): SettingsManager {\r\n\t\tconst storage = new FileSettingsStorage(cwd, agentDir);\r\n\t\treturn SettingsManager.fromStorage(storage);\r\n\t}\r\n\r\n\t/** Create a SettingsManager from an arbitrary storage backend */\r\n\tstatic fromStorage(storage: SettingsStorage): SettingsManager {\r\n\t\tconst globalLoad = SettingsManager.tryLoadFromStorage(storage, \"global\");\r\n\t\tconst projectLoad = SettingsManager.tryLoadFromStorage(storage, \"project\");\r\n\t\tconst initialErrors: SettingsError[] = [];\r\n\t\tif (globalLoad.error) {\r\n\t\t\tinitialErrors.push({ scope: \"global\", error: globalLoad.error });\r\n\t\t}\r\n\t\tif (projectLoad.error) {\r\n\t\t\tinitialErrors.push({ scope: \"project\", error: projectLoad.error });\r\n\t\t}\r\n\r\n\t\treturn new SettingsManager(\r\n\t\t\tstorage,\r\n\t\t\tglobalLoad.settings,\r\n\t\t\tprojectLoad.settings,\r\n\t\t\tglobalLoad.error,\r\n\t\t\tprojectLoad.error,\r\n\t\t\tinitialErrors,\r\n\t\t);\r\n\t}\r\n\r\n\t/** Create an in-memory SettingsManager (no file I/O) */\r\n\tstatic inMemory(settings: Partial<Settings> = {}): SettingsManager {\r\n\t\tconst storage = new InMemorySettingsStorage();\r\n\t\treturn new SettingsManager(storage, settings, {});\r\n\t}\r\n\r\n\tprivate static loadFromStorage(storage: SettingsStorage, scope: SettingsScope): Settings {\r\n\t\tlet content: string | undefined;\r\n\t\tstorage.withLock(scope, (current) => {\r\n\t\t\tcontent = current;\r\n\t\t\treturn undefined;\r\n\t\t});\r\n\r\n\t\tif (!content) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\t\tconst settings = JSON.parse(content);\r\n\t\treturn SettingsManager.migrateSettings(settings);\r\n\t}\r\n\r\n\tprivate static tryLoadFromStorage(\r\n\t\tstorage: SettingsStorage,\r\n\t\tscope: SettingsScope,\r\n\t): { settings: Settings; error: Error | null } {\r\n\t\ttry {\r\n\t\t\treturn { settings: SettingsManager.loadFromStorage(storage, scope), error: null };\r\n\t\t} catch (error) {\r\n\t\t\treturn { settings: {}, error: error as Error };\r\n\t\t}\r\n\t}\r\n\r\n\t/** Migrate old settings format to new format */\r\n\tprivate static migrateSettings(settings: Record<string, unknown>): Settings {\r\n\t\t// Migrate queueMode -> steeringMode\r\n\t\tif (\"queueMode\" in settings && !(\"steeringMode\" in settings)) {\r\n\t\t\tsettings.steeringMode = settings.queueMode;\r\n\t\t\tdelete settings.queueMode;\r\n\t\t}\r\n\r\n\t\t// Migrate legacy websockets boolean -> transport enum\r\n\t\tif (!(\"transport\" in settings) && typeof settings.websockets === \"boolean\") {\r\n\t\t\tsettings.transport = settings.websockets ? \"websocket\" : \"sse\";\r\n\t\t\tdelete settings.websockets;\r\n\t\t}\r\n\r\n\t\t// Migrate old skills object format to new array format\r\n\t\tif (\r\n\t\t\t\"skills\" in settings &&\r\n\t\t\ttypeof settings.skills === \"object\" &&\r\n\t\t\tsettings.skills !== null &&\r\n\t\t\t!Array.isArray(settings.skills)\r\n\t\t) {\r\n\t\t\tconst skillsSettings = settings.skills as {\r\n\t\t\t\tenableSkillCommands?: boolean;\r\n\t\t\t\tcustomDirectories?: unknown;\r\n\t\t\t};\r\n\t\t\tif (skillsSettings.enableSkillCommands !== undefined && settings.enableSkillCommands === undefined) {\r\n\t\t\t\tsettings.enableSkillCommands = skillsSettings.enableSkillCommands;\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(skillsSettings.customDirectories) && skillsSettings.customDirectories.length > 0) {\r\n\t\t\t\tsettings.skills = skillsSettings.customDirectories;\r\n\t\t\t} else {\r\n\t\t\t\tdelete settings.skills;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn settings as Settings;\r\n\t}\r\n\r\n\tgetGlobalSettings(): Settings {\r\n\t\treturn structuredClone(this.globalSettings);\r\n\t}\r\n\r\n\tgetProjectSettings(): Settings {\r\n\t\treturn structuredClone(this.projectSettings);\r\n\t}\r\n\r\n\treload(): void {\r\n\t\tconst globalLoad = SettingsManager.tryLoadFromStorage(this.storage, \"global\");\r\n\t\tif (!globalLoad.error) {\r\n\t\t\tthis.globalSettings = globalLoad.settings;\r\n\t\t\tthis.globalSettingsLoadError = null;\r\n\t\t} else {\r\n\t\t\tthis.globalSettingsLoadError = globalLoad.error;\r\n\t\t\tthis.recordError(\"global\", globalLoad.error);\r\n\t\t}\r\n\r\n\t\tthis.modifiedFields.clear();\r\n\t\tthis.modifiedNestedFields.clear();\r\n\t\tthis.modifiedProjectFields.clear();\r\n\t\tthis.modifiedProjectNestedFields.clear();\r\n\r\n\t\tconst projectLoad = SettingsManager.tryLoadFromStorage(this.storage, \"project\");\r\n\t\tif (!projectLoad.error) {\r\n\t\t\tthis.projectSettings = projectLoad.settings;\r\n\t\t\tthis.projectSettingsLoadError = null;\r\n\t\t} else {\r\n\t\t\tthis.projectSettingsLoadError = projectLoad.error;\r\n\t\t\tthis.recordError(\"project\", projectLoad.error);\r\n\t\t}\r\n\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\t}\r\n\r\n\t/** Apply additional overrides on top of current settings */\r\n\tapplyOverrides(overrides: Partial<Settings>): void {\r\n\t\tthis.settings = deepMergeSettings(this.settings, overrides);\r\n\t}\r\n\r\n\t/** Mark a global field as modified during this session */\r\n\tprivate markModified(field: keyof Settings, nestedKey?: string): void {\r\n\t\tthis.modifiedFields.add(field);\r\n\t\tif (nestedKey) {\r\n\t\t\tif (!this.modifiedNestedFields.has(field)) {\r\n\t\t\t\tthis.modifiedNestedFields.set(field, new Set());\r\n\t\t\t}\r\n\t\t\tthis.modifiedNestedFields.get(field)!.add(nestedKey);\r\n\t\t}\r\n\t}\r\n\r\n\t/** Mark a project field as modified during this session */\r\n\tprivate markProjectModified(field: keyof Settings, nestedKey?: string): void {\r\n\t\tthis.modifiedProjectFields.add(field);\r\n\t\tif (nestedKey) {\r\n\t\t\tif (!this.modifiedProjectNestedFields.has(field)) {\r\n\t\t\t\tthis.modifiedProjectNestedFields.set(field, new Set());\r\n\t\t\t}\r\n\t\t\tthis.modifiedProjectNestedFields.get(field)!.add(nestedKey);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate recordError(scope: SettingsScope, error: unknown): void {\r\n\t\tconst normalizedError = error instanceof Error ? error : new Error(String(error));\r\n\t\tthis.errors.push({ scope, error: normalizedError });\r\n\t}\r\n\r\n\tprivate clearModifiedScope(scope: SettingsScope): void {\r\n\t\tif (scope === \"global\") {\r\n\t\t\tthis.modifiedFields.clear();\r\n\t\t\tthis.modifiedNestedFields.clear();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.modifiedProjectFields.clear();\r\n\t\tthis.modifiedProjectNestedFields.clear();\r\n\t}\r\n\r\n\tprivate enqueueWrite(scope: SettingsScope, task: () => void): void {\r\n\t\tthis.writeQueue = this.writeQueue\r\n\t\t\t.then(() => {\r\n\t\t\t\ttask();\r\n\t\t\t\tthis.clearModifiedScope(scope);\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tthis.recordError(scope, error);\r\n\t\t\t});\r\n\t}\r\n\r\n\tprivate cloneModifiedNestedFields(source: Map<keyof Settings, Set<string>>): Map<keyof Settings, Set<string>> {\r\n\t\tconst snapshot = new Map<keyof Settings, Set<string>>();\r\n\t\tfor (const [key, value] of source.entries()) {\r\n\t\t\tsnapshot.set(key, new Set(value));\r\n\t\t}\r\n\t\treturn snapshot;\r\n\t}\r\n\r\n\tprivate persistScopedSettings(\r\n\t\tscope: SettingsScope,\r\n\t\tsnapshotSettings: Settings,\r\n\t\tmodifiedFields: Set<keyof Settings>,\r\n\t\tmodifiedNestedFields: Map<keyof Settings, Set<string>>,\r\n\t): void {\r\n\t\tthis.storage.withLock(scope, (current) => {\r\n\t\t\tconst currentFileSettings = current\r\n\t\t\t\t? SettingsManager.migrateSettings(JSON.parse(current) as Record<string, unknown>)\r\n\t\t\t\t: {};\r\n\t\t\tconst mergedSettings: Settings = { ...currentFileSettings };\r\n\t\t\tfor (const field of modifiedFields) {\r\n\t\t\t\tconst value = snapshotSettings[field];\r\n\t\t\t\tif (modifiedNestedFields.has(field) && typeof value === \"object\" && value !== null) {\r\n\t\t\t\t\tconst nestedModified = modifiedNestedFields.get(field)!;\r\n\t\t\t\t\tconst baseNested = (currentFileSettings[field] as Record<string, unknown>) ?? {};\r\n\t\t\t\t\tconst inMemoryNested = value as Record<string, unknown>;\r\n\t\t\t\t\tconst mergedNested = { ...baseNested };\r\n\t\t\t\t\tfor (const nestedKey of nestedModified) {\r\n\t\t\t\t\t\tmergedNested[nestedKey] = inMemoryNested[nestedKey];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t(mergedSettings as Record<string, unknown>)[field] = mergedNested;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t(mergedSettings as Record<string, unknown>)[field] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn JSON.stringify(mergedSettings, null, 2);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate save(): void {\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\r\n\t\tif (this.globalSettingsLoadError) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst snapshotGlobalSettings = structuredClone(this.globalSettings);\r\n\t\tconst modifiedFields = new Set(this.modifiedFields);\r\n\t\tconst modifiedNestedFields = this.cloneModifiedNestedFields(this.modifiedNestedFields);\r\n\r\n\t\tthis.enqueueWrite(\"global\", () => {\r\n\t\t\tthis.persistScopedSettings(\"global\", snapshotGlobalSettings, modifiedFields, modifiedNestedFields);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate saveProjectSettings(settings: Settings): void {\r\n\t\tthis.projectSettings = structuredClone(settings);\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\r\n\t\tif (this.projectSettingsLoadError) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst snapshotProjectSettings = structuredClone(this.projectSettings);\r\n\t\tconst modifiedFields = new Set(this.modifiedProjectFields);\r\n\t\tconst modifiedNestedFields = this.cloneModifiedNestedFields(this.modifiedProjectNestedFields);\r\n\t\tthis.enqueueWrite(\"project\", () => {\r\n\t\t\tthis.persistScopedSettings(\"project\", snapshotProjectSettings, modifiedFields, modifiedNestedFields);\r\n\t\t});\r\n\t}\r\n\r\n\tasync flush(): Promise<void> {\r\n\t\tawait this.writeQueue;\r\n\t}\r\n\r\n\tdrainErrors(): SettingsError[] {\r\n\t\tconst drained = [...this.errors];\r\n\t\tthis.errors = [];\r\n\t\treturn drained;\r\n\t}\r\n\r\n\tgetLastChangelogVersion(): string | undefined {\r\n\t\treturn this.settings.lastChangelogVersion;\r\n\t}\r\n\r\n\tsetLastChangelogVersion(version: string): void {\r\n\t\tthis.globalSettings.lastChangelogVersion = version;\r\n\t\tthis.markModified(\"lastChangelogVersion\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetDefaultProvider(): string | undefined {\r\n\t\treturn this.settings.defaultProvider;\r\n\t}\r\n\r\n\tgetDefaultModel(): string | undefined {\r\n\t\treturn this.settings.defaultModel;\r\n\t}\r\n\r\n\tsetDefaultProvider(provider: string): void {\r\n\t\tthis.globalSettings.defaultProvider = provider;\r\n\t\tthis.markModified(\"defaultProvider\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetDefaultModel(modelId: string): void {\r\n\t\tthis.globalSettings.defaultModel = modelId;\r\n\t\tthis.markModified(\"defaultModel\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetDefaultModelAndProvider(provider: string, modelId: string): void {\r\n\t\tthis.globalSettings.defaultProvider = provider;\r\n\t\tthis.globalSettings.defaultModel = modelId;\r\n\t\tthis.markModified(\"defaultProvider\");\r\n\t\tthis.markModified(\"defaultModel\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetSteeringMode(): \"all\" | \"one-at-a-time\" {\r\n\t\treturn this.settings.steeringMode || \"one-at-a-time\";\r\n\t}\r\n\r\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\r\n\t\tthis.globalSettings.steeringMode = mode;\r\n\t\tthis.markModified(\"steeringMode\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetFollowUpMode(): \"all\" | \"one-at-a-time\" {\r\n\t\treturn this.settings.followUpMode || \"one-at-a-time\";\r\n\t}\r\n\r\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\r\n\t\tthis.globalSettings.followUpMode = mode;\r\n\t\tthis.markModified(\"followUpMode\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetTheme(): string | undefined {\r\n\t\treturn this.settings.theme;\r\n\t}\r\n\r\n\tsetTheme(theme: string): void {\r\n\t\tthis.globalSettings.theme = theme;\r\n\t\tthis.markModified(\"theme\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetDefaultThinkingLevel(): \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | undefined {\r\n\t\treturn this.settings.defaultThinkingLevel;\r\n\t}\r\n\r\n\tsetDefaultThinkingLevel(level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"): void {\r\n\t\tthis.globalSettings.defaultThinkingLevel = level;\r\n\t\tthis.markModified(\"defaultThinkingLevel\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetTransport(): TransportSetting {\r\n\t\treturn this.settings.transport ?? \"sse\";\r\n\t}\r\n\r\n\tsetTransport(transport: TransportSetting): void {\r\n\t\tthis.globalSettings.transport = transport;\r\n\t\tthis.markModified(\"transport\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCompactionEnabled(): boolean {\r\n\t\treturn this.settings.compaction?.enabled ?? true;\r\n\t}\r\n\r\n\tsetCompactionEnabled(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.compaction) {\r\n\t\t\tthis.globalSettings.compaction = {};\r\n\t\t}\r\n\t\tthis.globalSettings.compaction.enabled = enabled;\r\n\t\tthis.markModified(\"compaction\", \"enabled\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCompactionReserveTokens(): number {\r\n\t\treturn this.settings.compaction?.reserveTokens ?? 16384;\r\n\t}\r\n\r\n\tgetCompactionKeepRecentTokens(): number {\r\n\t\treturn this.settings.compaction?.keepRecentTokens ?? 20000;\r\n\t}\r\n\r\n\tgetCompactionSettings(): { enabled: boolean; reserveTokens: number; keepRecentTokens: number } {\r\n\t\treturn {\r\n\t\t\tenabled: this.getCompactionEnabled(),\r\n\t\t\treserveTokens: this.getCompactionReserveTokens(),\r\n\t\t\tkeepRecentTokens: this.getCompactionKeepRecentTokens(),\r\n\t\t};\r\n\t}\r\n\r\n\tgetBranchSummarySettings(): { reserveTokens: number } {\r\n\t\treturn {\r\n\t\t\treserveTokens: this.settings.branchSummary?.reserveTokens ?? 16384,\r\n\t\t};\r\n\t}\r\n\r\n\tgetRetryEnabled(): boolean {\r\n\t\treturn this.settings.retry?.enabled ?? true;\r\n\t}\r\n\r\n\tsetRetryEnabled(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.retry) {\r\n\t\t\tthis.globalSettings.retry = {};\r\n\t\t}\r\n\t\tthis.globalSettings.retry.enabled = enabled;\r\n\t\tthis.markModified(\"retry\", \"enabled\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetRetrySettings(): { enabled: boolean; maxRetries: number; baseDelayMs: number; maxDelayMs: number } {\r\n\t\treturn {\r\n\t\t\tenabled: this.getRetryEnabled(),\r\n\t\t\tmaxRetries: this.settings.retry?.maxRetries ?? 3,\r\n\t\t\tbaseDelayMs: this.settings.retry?.baseDelayMs ?? 2000,\r\n\t\t\tmaxDelayMs: this.settings.retry?.maxDelayMs ?? 60000,\r\n\t\t};\r\n\t}\r\n\r\n\tgetHideThinkingBlock(): boolean {\r\n\t\treturn this.settings.hideThinkingBlock ?? false;\r\n\t}\r\n\r\n\tsetHideThinkingBlock(hide: boolean): void {\r\n\t\tthis.globalSettings.hideThinkingBlock = hide;\r\n\t\tthis.markModified(\"hideThinkingBlock\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetShellPath(): string | undefined {\r\n\t\treturn this.settings.shellPath;\r\n\t}\r\n\r\n\tsetShellPath(path: string | undefined): void {\r\n\t\tthis.globalSettings.shellPath = path;\r\n\t\tthis.markModified(\"shellPath\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetQuietStartup(): boolean {\r\n\t\treturn this.settings.quietStartup ?? false;\r\n\t}\r\n\r\n\tsetQuietStartup(quiet: boolean): void {\r\n\t\tthis.globalSettings.quietStartup = quiet;\r\n\t\tthis.markModified(\"quietStartup\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetShellCommandPrefix(): string | undefined {\r\n\t\treturn this.settings.shellCommandPrefix;\r\n\t}\r\n\r\n\tsetShellCommandPrefix(prefix: string | undefined): void {\r\n\t\tthis.globalSettings.shellCommandPrefix = prefix;\r\n\t\tthis.markModified(\"shellCommandPrefix\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCollapseChangelog(): boolean {\r\n\t\treturn this.settings.collapseChangelog ?? false;\r\n\t}\r\n\r\n\tsetCollapseChangelog(collapse: boolean): void {\r\n\t\tthis.globalSettings.collapseChangelog = collapse;\r\n\t\tthis.markModified(\"collapseChangelog\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetPackages(): PackageSource[] {\r\n\t\treturn [...(this.settings.packages ?? [])];\r\n\t}\r\n\r\n\tsetPackages(packages: PackageSource[]): void {\r\n\t\tthis.globalSettings.packages = packages;\r\n\t\tthis.markModified(\"packages\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectPackages(packages: PackageSource[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.packages = packages;\r\n\t\tthis.markProjectModified(\"packages\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetExtensionPaths(): string[] {\r\n\t\treturn [...(this.settings.extensions ?? [])];\r\n\t}\r\n\r\n\tsetExtensionPaths(paths: string[]): void {\r\n\t\tthis.globalSettings.extensions = paths;\r\n\t\tthis.markModified(\"extensions\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectExtensionPaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.extensions = paths;\r\n\t\tthis.markProjectModified(\"extensions\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetSkillPaths(): string[] {\r\n\t\treturn [...(this.settings.skills ?? [])];\r\n\t}\r\n\r\n\tsetSkillPaths(paths: string[]): void {\r\n\t\tthis.globalSettings.skills = paths;\r\n\t\tthis.markModified(\"skills\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectSkillPaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.skills = paths;\r\n\t\tthis.markProjectModified(\"skills\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetPromptTemplatePaths(): string[] {\r\n\t\treturn [...(this.settings.prompts ?? [])];\r\n\t}\r\n\r\n\tsetPromptTemplatePaths(paths: string[]): void {\r\n\t\tthis.globalSettings.prompts = paths;\r\n\t\tthis.markModified(\"prompts\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectPromptTemplatePaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.prompts = paths;\r\n\t\tthis.markProjectModified(\"prompts\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetThemePaths(): string[] {\r\n\t\treturn [...(this.settings.themes ?? [])];\r\n\t}\r\n\r\n\tsetThemePaths(paths: string[]): void {\r\n\t\tthis.globalSettings.themes = paths;\r\n\t\tthis.markModified(\"themes\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectThemePaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.themes = paths;\r\n\t\tthis.markProjectModified(\"themes\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetEnableSkillCommands(): boolean {\r\n\t\treturn this.settings.enableSkillCommands ?? true;\r\n\t}\r\n\r\n\tsetEnableSkillCommands(enabled: boolean): void {\r\n\t\tthis.globalSettings.enableSkillCommands = enabled;\r\n\t\tthis.markModified(\"enableSkillCommands\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetThinkingBudgets(): ThinkingBudgetsSettings | undefined {\r\n\t\treturn this.settings.thinkingBudgets;\r\n\t}\r\n\r\n\tgetShowImages(): boolean {\r\n\t\treturn this.settings.terminal?.showImages ?? true;\r\n\t}\r\n\r\n\tsetShowImages(show: boolean): void {\r\n\t\tif (!this.globalSettings.terminal) {\r\n\t\t\tthis.globalSettings.terminal = {};\r\n\t\t}\r\n\t\tthis.globalSettings.terminal.showImages = show;\r\n\t\tthis.markModified(\"terminal\", \"showImages\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetClearOnShrink(): boolean {\r\n\t\t// Settings takes precedence, then env var, then default false\r\n\t\tif (this.settings.terminal?.clearOnShrink !== undefined) {\r\n\t\t\treturn this.settings.terminal.clearOnShrink;\r\n\t\t}\r\n\t\treturn process.env.PI_CLEAR_ON_SHRINK === \"1\";\r\n\t}\r\n\r\n\tsetClearOnShrink(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.terminal) {\r\n\t\t\tthis.globalSettings.terminal = {};\r\n\t\t}\r\n\t\tthis.globalSettings.terminal.clearOnShrink = enabled;\r\n\t\tthis.markModified(\"terminal\", \"clearOnShrink\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetImageAutoResize(): boolean {\r\n\t\treturn this.settings.images?.autoResize ?? true;\r\n\t}\r\n\r\n\tsetImageAutoResize(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.images) {\r\n\t\t\tthis.globalSettings.images = {};\r\n\t\t}\r\n\t\tthis.globalSettings.images.autoResize = enabled;\r\n\t\tthis.markModified(\"images\", \"autoResize\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetBlockImages(): boolean {\r\n\t\treturn this.settings.images?.blockImages ?? false;\r\n\t}\r\n\r\n\tsetBlockImages(blocked: boolean): void {\r\n\t\tif (!this.globalSettings.images) {\r\n\t\t\tthis.globalSettings.images = {};\r\n\t\t}\r\n\t\tthis.globalSettings.images.blockImages = blocked;\r\n\t\tthis.markModified(\"images\", \"blockImages\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetEnabledModels(): string[] | undefined {\r\n\t\treturn this.settings.enabledModels;\r\n\t}\r\n\r\n\tsetEnabledModels(patterns: string[] | undefined): void {\r\n\t\tthis.globalSettings.enabledModels = patterns;\r\n\t\tthis.markModified(\"enabledModels\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetDoubleEscapeAction(): \"fork\" | \"tree\" | \"none\" {\r\n\t\treturn this.settings.doubleEscapeAction ?? \"tree\";\r\n\t}\r\n\r\n\tsetDoubleEscapeAction(action: \"fork\" | \"tree\" | \"none\"): void {\r\n\t\tthis.globalSettings.doubleEscapeAction = action;\r\n\t\tthis.markModified(\"doubleEscapeAction\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetShowHardwareCursor(): boolean {\r\n\t\treturn this.settings.showHardwareCursor ?? process.env.PI_HARDWARE_CURSOR === \"1\";\r\n\t}\r\n\r\n\tsetShowHardwareCursor(enabled: boolean): void {\r\n\t\tthis.globalSettings.showHardwareCursor = enabled;\r\n\t\tthis.markModified(\"showHardwareCursor\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetEditorPaddingX(): number {\r\n\t\treturn this.settings.editorPaddingX ?? 0;\r\n\t}\r\n\r\n\tsetEditorPaddingX(padding: number): void {\r\n\t\tthis.globalSettings.editorPaddingX = Math.max(0, Math.min(3, Math.floor(padding)));\r\n\t\tthis.markModified(\"editorPaddingX\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetAutocompleteMaxVisible(): number {\r\n\t\treturn this.settings.autocompleteMaxVisible ?? 5;\r\n\t}\r\n\r\n\tsetAutocompleteMaxVisible(maxVisible: number): void {\r\n\t\tthis.globalSettings.autocompleteMaxVisible = Math.max(3, Math.min(20, Math.floor(maxVisible)));\r\n\t\tthis.markModified(\"autocompleteMaxVisible\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCodeBlockIndent(): string {\r\n\t\treturn this.settings.markdown?.codeBlockIndent ?? \" \";\r\n\t}\r\n\r\n\tgetMemoryEnabled(): boolean {\r\n\t\treturn this.settings.memory?.enabled ?? true;\r\n\t}\r\n\r\n\tsetMemoryEnabled(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.memory) {\r\n\t\t\tthis.globalSettings.memory = {};\r\n\t\t}\r\n\t\tthis.globalSettings.memory.enabled = enabled;\r\n\t\tthis.markModified(\"memory\", \"enabled\");\r\n\t\tthis.save();\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"settings-manager.js","sourceRoot":"","sources":["../../src/core/settings-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transport } from \"@mariozechner/pi-ai\";\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { dirname, join } from \"path\";\r\nimport lockfile from \"proper-lockfile\";\r\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../config.js\";\r\n\r\nexport interface CompactionSettings {\r\n\tenabled?: boolean; // default: true\r\n\treserveTokens?: number; // default: 16384\r\n\tkeepRecentTokens?: number; // default: 20000\r\n}\r\n\r\nexport interface BranchSummarySettings {\r\n\treserveTokens?: number; // default: 16384 (tokens reserved for prompt + LLM response)\r\n}\r\n\r\nexport interface RetrySettings {\r\n\tenabled?: boolean; // default: true\r\n\tmaxRetries?: number; // default: 3\r\n\tbaseDelayMs?: number; // default: 2000 (exponential backoff: 2s, 4s, 8s)\r\n\tmaxDelayMs?: number; // default: 60000 (max server-requested delay before failing)\r\n}\r\n\r\nexport interface TerminalSettings {\r\n\tshowImages?: boolean; // default: true (only relevant if terminal supports images)\r\n\tclearOnShrink?: boolean; // default: false (clear empty rows when content shrinks)\r\n}\r\n\r\nexport interface ImageSettings {\r\n\tautoResize?: boolean; // default: true (resize images to 2000x2000 max for better model compatibility)\r\n\tblockImages?: boolean; // default: false - when true, prevents all images from being sent to LLM providers\r\n}\r\n\r\nexport interface ThinkingBudgetsSettings {\r\n\tminimal?: number;\r\n\tlow?: number;\r\n\tmedium?: number;\r\n\thigh?: number;\r\n}\r\n\r\nexport interface MarkdownSettings {\r\n\tcodeBlockIndent?: string; // default: \" \"\r\n}\r\n\r\nexport type TransportSetting = Transport;\r\n\r\n/**\r\n * Package source for npm/git packages.\r\n * - String form: load all resources from the package\r\n * - Object form: filter which resources to load\r\n */\r\nexport type PackageSource =\r\n\t| string\r\n\t| {\r\n\t\t\tsource: string;\r\n\t\t\textensions?: string[];\r\n\t\t\tskills?: string[];\r\n\t\t\tprompts?: string[];\r\n\t\t\tthemes?: string[];\r\n\t };\r\n\r\nexport interface Settings {\r\n\tlastChangelogVersion?: string;\r\n\tdefaultProvider?: string;\r\n\tdefaultModel?: string;\r\n\tdefaultThinkingLevel?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\r\n\ttransport?: TransportSetting; // default: \"sse\"\r\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\r\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\r\n\ttheme?: string;\r\n\tcompaction?: CompactionSettings;\r\n\tbranchSummary?: BranchSummarySettings;\r\n\tretry?: RetrySettings;\r\n\thideThinkingBlock?: boolean;\r\n\tshellPath?: string; // Custom shell path (e.g., for Cygwin users on Windows)\r\n\tquietStartup?: boolean;\r\n\tshellCommandPrefix?: string; // Prefix prepended to every bash command (e.g., \"shopt -s expand_aliases\" for alias support)\r\n\tcollapseChangelog?: boolean; // Show condensed changelog after update (use /changelog for full)\r\n\tpackages?: PackageSource[]; // Array of npm/git package sources (string or object with filtering)\r\n\textensions?: string[]; // Array of local extension file paths or directories\r\n\tskills?: string[]; // Array of local skill file paths or directories\r\n\tprompts?: string[]; // Array of local prompt template paths or directories\r\n\tthemes?: string[]; // Array of local theme file paths or directories\r\n\tenableSkillCommands?: boolean; // default: true - register skills as /skill:name commands\r\n\tterminal?: TerminalSettings;\r\n\timages?: ImageSettings;\r\n\tenabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)\r\n\tdoubleEscapeAction?: \"fork\" | \"tree\" | \"none\"; // Action for double-escape with empty editor (default: \"tree\")\r\n\tthinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels\r\n\teditorPaddingX?: number; // Horizontal padding for input editor (default: 0)\r\n\tautocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5)\r\n\tshowHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME\r\n\tmarkdown?: MarkdownSettings;\r\n\tmemory?: {\r\n\t\tenabled?: boolean; // default: true - persistent memory system (procedural, episodic, semantic)\r\n\t\tscope?: \"project\" | \"global\"; // default: \"project\" - where memories are stored\r\n\t};\r\n}\r\n\r\n/** Deep merge settings: project/overrides take precedence, nested objects merge recursively */\r\nfunction deepMergeSettings(base: Settings, overrides: Settings): Settings {\r\n\tconst result: Settings = { ...base };\r\n\r\n\tfor (const key of Object.keys(overrides) as (keyof Settings)[]) {\r\n\t\tconst overrideValue = overrides[key];\r\n\t\tconst baseValue = base[key];\r\n\r\n\t\tif (overrideValue === undefined) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\t// For nested objects, merge recursively\r\n\t\tif (\r\n\t\t\ttypeof overrideValue === \"object\" &&\r\n\t\t\toverrideValue !== null &&\r\n\t\t\t!Array.isArray(overrideValue) &&\r\n\t\t\ttypeof baseValue === \"object\" &&\r\n\t\t\tbaseValue !== null &&\r\n\t\t\t!Array.isArray(baseValue)\r\n\t\t) {\r\n\t\t\t(result as Record<string, unknown>)[key] = { ...baseValue, ...overrideValue };\r\n\t\t} else {\r\n\t\t\t// For primitives and arrays, override value wins\r\n\t\t\t(result as Record<string, unknown>)[key] = overrideValue;\r\n\t\t}\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nexport type SettingsScope = \"global\" | \"project\";\r\n\r\nexport interface SettingsStorage {\r\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void;\r\n}\r\n\r\nexport interface SettingsError {\r\n\tscope: SettingsScope;\r\n\terror: Error;\r\n}\r\n\r\nexport class FileSettingsStorage implements SettingsStorage {\r\n\tprivate globalSettingsPath: string;\r\n\tprivate projectSettingsPath: string;\r\n\r\n\tconstructor(cwd: string = process.cwd(), agentDir: string = getAgentDir()) {\r\n\t\tthis.globalSettingsPath = join(agentDir, \"settings.json\");\r\n\t\tthis.projectSettingsPath = join(cwd, CONFIG_DIR_NAME, \"settings.json\");\r\n\t}\r\n\r\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void {\r\n\t\tconst path = scope === \"global\" ? this.globalSettingsPath : this.projectSettingsPath;\r\n\t\tconst dir = dirname(path);\r\n\t\tif (!existsSync(dir)) {\r\n\t\t\tmkdirSync(dir, { recursive: true });\r\n\t\t}\r\n\r\n\t\tlet release: (() => void) | undefined;\r\n\t\ttry {\r\n\t\t\trelease = lockfile.lockSync(path, { realpath: false });\r\n\t\t\tconst current = existsSync(path) ? readFileSync(path, \"utf-8\") : undefined;\r\n\t\t\tconst next = fn(current);\r\n\t\t\tif (next !== undefined) {\r\n\t\t\t\twriteFileSync(path, next, \"utf-8\");\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tif (release) {\r\n\t\t\t\trelease();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class InMemorySettingsStorage implements SettingsStorage {\r\n\tprivate global: string | undefined;\r\n\tprivate project: string | undefined;\r\n\r\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void {\r\n\t\tconst current = scope === \"global\" ? this.global : this.project;\r\n\t\tconst next = fn(current);\r\n\t\tif (next !== undefined) {\r\n\t\t\tif (scope === \"global\") {\r\n\t\t\t\tthis.global = next;\r\n\t\t\t} else {\r\n\t\t\t\tthis.project = next;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport class SettingsManager {\r\n\tprivate storage: SettingsStorage;\r\n\tprivate globalSettings: Settings;\r\n\tprivate projectSettings: Settings;\r\n\tprivate settings: Settings;\r\n\tprivate modifiedFields = new Set<keyof Settings>(); // Track global fields modified during session\r\n\tprivate modifiedNestedFields = new Map<keyof Settings, Set<string>>(); // Track global nested field modifications\r\n\tprivate modifiedProjectFields = new Set<keyof Settings>(); // Track project fields modified during session\r\n\tprivate modifiedProjectNestedFields = new Map<keyof Settings, Set<string>>(); // Track project nested field modifications\r\n\tprivate globalSettingsLoadError: Error | null = null; // Track if global settings file had parse errors\r\n\tprivate projectSettingsLoadError: Error | null = null; // Track if project settings file had parse errors\r\n\tprivate writeQueue: Promise<void> = Promise.resolve();\r\n\tprivate errors: SettingsError[];\r\n\r\n\tprivate constructor(\r\n\t\tstorage: SettingsStorage,\r\n\t\tinitialGlobal: Settings,\r\n\t\tinitialProject: Settings,\r\n\t\tglobalLoadError: Error | null = null,\r\n\t\tprojectLoadError: Error | null = null,\r\n\t\tinitialErrors: SettingsError[] = [],\r\n\t) {\r\n\t\tthis.storage = storage;\r\n\t\tthis.globalSettings = initialGlobal;\r\n\t\tthis.projectSettings = initialProject;\r\n\t\tthis.globalSettingsLoadError = globalLoadError;\r\n\t\tthis.projectSettingsLoadError = projectLoadError;\r\n\t\tthis.errors = [...initialErrors];\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\t}\r\n\r\n\t/** Create a SettingsManager that loads from files */\r\n\tstatic create(cwd: string = process.cwd(), agentDir: string = getAgentDir()): SettingsManager {\r\n\t\tconst storage = new FileSettingsStorage(cwd, agentDir);\r\n\t\treturn SettingsManager.fromStorage(storage);\r\n\t}\r\n\r\n\t/** Create a SettingsManager from an arbitrary storage backend */\r\n\tstatic fromStorage(storage: SettingsStorage): SettingsManager {\r\n\t\tconst globalLoad = SettingsManager.tryLoadFromStorage(storage, \"global\");\r\n\t\tconst projectLoad = SettingsManager.tryLoadFromStorage(storage, \"project\");\r\n\t\tconst initialErrors: SettingsError[] = [];\r\n\t\tif (globalLoad.error) {\r\n\t\t\tinitialErrors.push({ scope: \"global\", error: globalLoad.error });\r\n\t\t}\r\n\t\tif (projectLoad.error) {\r\n\t\t\tinitialErrors.push({ scope: \"project\", error: projectLoad.error });\r\n\t\t}\r\n\r\n\t\treturn new SettingsManager(\r\n\t\t\tstorage,\r\n\t\t\tglobalLoad.settings,\r\n\t\t\tprojectLoad.settings,\r\n\t\t\tglobalLoad.error,\r\n\t\t\tprojectLoad.error,\r\n\t\t\tinitialErrors,\r\n\t\t);\r\n\t}\r\n\r\n\t/** Create an in-memory SettingsManager (no file I/O) */\r\n\tstatic inMemory(settings: Partial<Settings> = {}): SettingsManager {\r\n\t\tconst storage = new InMemorySettingsStorage();\r\n\t\treturn new SettingsManager(storage, settings, {});\r\n\t}\r\n\r\n\tprivate static loadFromStorage(storage: SettingsStorage, scope: SettingsScope): Settings {\r\n\t\tlet content: string | undefined;\r\n\t\tstorage.withLock(scope, (current) => {\r\n\t\t\tcontent = current;\r\n\t\t\treturn undefined;\r\n\t\t});\r\n\r\n\t\tif (!content) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\t\tconst settings = JSON.parse(content);\r\n\t\treturn SettingsManager.migrateSettings(settings);\r\n\t}\r\n\r\n\tprivate static tryLoadFromStorage(\r\n\t\tstorage: SettingsStorage,\r\n\t\tscope: SettingsScope,\r\n\t): { settings: Settings; error: Error | null } {\r\n\t\ttry {\r\n\t\t\treturn { settings: SettingsManager.loadFromStorage(storage, scope), error: null };\r\n\t\t} catch (error) {\r\n\t\t\treturn { settings: {}, error: error as Error };\r\n\t\t}\r\n\t}\r\n\r\n\t/** Migrate old settings format to new format */\r\n\tprivate static migrateSettings(settings: Record<string, unknown>): Settings {\r\n\t\t// Migrate queueMode -> steeringMode\r\n\t\tif (\"queueMode\" in settings && !(\"steeringMode\" in settings)) {\r\n\t\t\tsettings.steeringMode = settings.queueMode;\r\n\t\t\tdelete settings.queueMode;\r\n\t\t}\r\n\r\n\t\t// Migrate legacy websockets boolean -> transport enum\r\n\t\tif (!(\"transport\" in settings) && typeof settings.websockets === \"boolean\") {\r\n\t\t\tsettings.transport = settings.websockets ? \"websocket\" : \"sse\";\r\n\t\t\tdelete settings.websockets;\r\n\t\t}\r\n\r\n\t\t// Migrate old skills object format to new array format\r\n\t\tif (\r\n\t\t\t\"skills\" in settings &&\r\n\t\t\ttypeof settings.skills === \"object\" &&\r\n\t\t\tsettings.skills !== null &&\r\n\t\t\t!Array.isArray(settings.skills)\r\n\t\t) {\r\n\t\t\tconst skillsSettings = settings.skills as {\r\n\t\t\t\tenableSkillCommands?: boolean;\r\n\t\t\t\tcustomDirectories?: unknown;\r\n\t\t\t};\r\n\t\t\tif (skillsSettings.enableSkillCommands !== undefined && settings.enableSkillCommands === undefined) {\r\n\t\t\t\tsettings.enableSkillCommands = skillsSettings.enableSkillCommands;\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(skillsSettings.customDirectories) && skillsSettings.customDirectories.length > 0) {\r\n\t\t\t\tsettings.skills = skillsSettings.customDirectories;\r\n\t\t\t} else {\r\n\t\t\t\tdelete settings.skills;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn settings as Settings;\r\n\t}\r\n\r\n\tgetGlobalSettings(): Settings {\r\n\t\treturn structuredClone(this.globalSettings);\r\n\t}\r\n\r\n\tgetProjectSettings(): Settings {\r\n\t\treturn structuredClone(this.projectSettings);\r\n\t}\r\n\r\n\treload(): void {\r\n\t\tconst globalLoad = SettingsManager.tryLoadFromStorage(this.storage, \"global\");\r\n\t\tif (!globalLoad.error) {\r\n\t\t\tthis.globalSettings = globalLoad.settings;\r\n\t\t\tthis.globalSettingsLoadError = null;\r\n\t\t} else {\r\n\t\t\tthis.globalSettingsLoadError = globalLoad.error;\r\n\t\t\tthis.recordError(\"global\", globalLoad.error);\r\n\t\t}\r\n\r\n\t\tthis.modifiedFields.clear();\r\n\t\tthis.modifiedNestedFields.clear();\r\n\t\tthis.modifiedProjectFields.clear();\r\n\t\tthis.modifiedProjectNestedFields.clear();\r\n\r\n\t\tconst projectLoad = SettingsManager.tryLoadFromStorage(this.storage, \"project\");\r\n\t\tif (!projectLoad.error) {\r\n\t\t\tthis.projectSettings = projectLoad.settings;\r\n\t\t\tthis.projectSettingsLoadError = null;\r\n\t\t} else {\r\n\t\t\tthis.projectSettingsLoadError = projectLoad.error;\r\n\t\t\tthis.recordError(\"project\", projectLoad.error);\r\n\t\t}\r\n\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\t}\r\n\r\n\t/** Apply additional overrides on top of current settings */\r\n\tapplyOverrides(overrides: Partial<Settings>): void {\r\n\t\tthis.settings = deepMergeSettings(this.settings, overrides);\r\n\t}\r\n\r\n\t/** Mark a global field as modified during this session */\r\n\tprivate markModified(field: keyof Settings, nestedKey?: string): void {\r\n\t\tthis.modifiedFields.add(field);\r\n\t\tif (nestedKey) {\r\n\t\t\tif (!this.modifiedNestedFields.has(field)) {\r\n\t\t\t\tthis.modifiedNestedFields.set(field, new Set());\r\n\t\t\t}\r\n\t\t\tthis.modifiedNestedFields.get(field)!.add(nestedKey);\r\n\t\t}\r\n\t}\r\n\r\n\t/** Mark a project field as modified during this session */\r\n\tprivate markProjectModified(field: keyof Settings, nestedKey?: string): void {\r\n\t\tthis.modifiedProjectFields.add(field);\r\n\t\tif (nestedKey) {\r\n\t\t\tif (!this.modifiedProjectNestedFields.has(field)) {\r\n\t\t\t\tthis.modifiedProjectNestedFields.set(field, new Set());\r\n\t\t\t}\r\n\t\t\tthis.modifiedProjectNestedFields.get(field)!.add(nestedKey);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate recordError(scope: SettingsScope, error: unknown): void {\r\n\t\tconst normalizedError = error instanceof Error ? error : new Error(String(error));\r\n\t\tthis.errors.push({ scope, error: normalizedError });\r\n\t}\r\n\r\n\tprivate clearModifiedScope(scope: SettingsScope): void {\r\n\t\tif (scope === \"global\") {\r\n\t\t\tthis.modifiedFields.clear();\r\n\t\t\tthis.modifiedNestedFields.clear();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.modifiedProjectFields.clear();\r\n\t\tthis.modifiedProjectNestedFields.clear();\r\n\t}\r\n\r\n\tprivate enqueueWrite(scope: SettingsScope, task: () => void): void {\r\n\t\tthis.writeQueue = this.writeQueue\r\n\t\t\t.then(() => {\r\n\t\t\t\ttask();\r\n\t\t\t\tthis.clearModifiedScope(scope);\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tthis.recordError(scope, error);\r\n\t\t\t});\r\n\t}\r\n\r\n\tprivate cloneModifiedNestedFields(source: Map<keyof Settings, Set<string>>): Map<keyof Settings, Set<string>> {\r\n\t\tconst snapshot = new Map<keyof Settings, Set<string>>();\r\n\t\tfor (const [key, value] of source.entries()) {\r\n\t\t\tsnapshot.set(key, new Set(value));\r\n\t\t}\r\n\t\treturn snapshot;\r\n\t}\r\n\r\n\tprivate persistScopedSettings(\r\n\t\tscope: SettingsScope,\r\n\t\tsnapshotSettings: Settings,\r\n\t\tmodifiedFields: Set<keyof Settings>,\r\n\t\tmodifiedNestedFields: Map<keyof Settings, Set<string>>,\r\n\t): void {\r\n\t\tthis.storage.withLock(scope, (current) => {\r\n\t\t\tconst currentFileSettings = current\r\n\t\t\t\t? SettingsManager.migrateSettings(JSON.parse(current) as Record<string, unknown>)\r\n\t\t\t\t: {};\r\n\t\t\tconst mergedSettings: Settings = { ...currentFileSettings };\r\n\t\t\tfor (const field of modifiedFields) {\r\n\t\t\t\tconst value = snapshotSettings[field];\r\n\t\t\t\tif (modifiedNestedFields.has(field) && typeof value === \"object\" && value !== null) {\r\n\t\t\t\t\tconst nestedModified = modifiedNestedFields.get(field)!;\r\n\t\t\t\t\tconst baseNested = (currentFileSettings[field] as Record<string, unknown>) ?? {};\r\n\t\t\t\t\tconst inMemoryNested = value as Record<string, unknown>;\r\n\t\t\t\t\tconst mergedNested = { ...baseNested };\r\n\t\t\t\t\tfor (const nestedKey of nestedModified) {\r\n\t\t\t\t\t\tmergedNested[nestedKey] = inMemoryNested[nestedKey];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t(mergedSettings as Record<string, unknown>)[field] = mergedNested;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t(mergedSettings as Record<string, unknown>)[field] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn JSON.stringify(mergedSettings, null, 2);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate save(): void {\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\r\n\t\tif (this.globalSettingsLoadError) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst snapshotGlobalSettings = structuredClone(this.globalSettings);\r\n\t\tconst modifiedFields = new Set(this.modifiedFields);\r\n\t\tconst modifiedNestedFields = this.cloneModifiedNestedFields(this.modifiedNestedFields);\r\n\r\n\t\tthis.enqueueWrite(\"global\", () => {\r\n\t\t\tthis.persistScopedSettings(\"global\", snapshotGlobalSettings, modifiedFields, modifiedNestedFields);\r\n\t\t});\r\n\t}\r\n\r\n\tprivate saveProjectSettings(settings: Settings): void {\r\n\t\tthis.projectSettings = structuredClone(settings);\r\n\t\tthis.settings = deepMergeSettings(this.globalSettings, this.projectSettings);\r\n\r\n\t\tif (this.projectSettingsLoadError) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst snapshotProjectSettings = structuredClone(this.projectSettings);\r\n\t\tconst modifiedFields = new Set(this.modifiedProjectFields);\r\n\t\tconst modifiedNestedFields = this.cloneModifiedNestedFields(this.modifiedProjectNestedFields);\r\n\t\tthis.enqueueWrite(\"project\", () => {\r\n\t\t\tthis.persistScopedSettings(\"project\", snapshotProjectSettings, modifiedFields, modifiedNestedFields);\r\n\t\t});\r\n\t}\r\n\r\n\tasync flush(): Promise<void> {\r\n\t\tawait this.writeQueue;\r\n\t}\r\n\r\n\tdrainErrors(): SettingsError[] {\r\n\t\tconst drained = [...this.errors];\r\n\t\tthis.errors = [];\r\n\t\treturn drained;\r\n\t}\r\n\r\n\tgetLastChangelogVersion(): string | undefined {\r\n\t\treturn this.settings.lastChangelogVersion;\r\n\t}\r\n\r\n\tsetLastChangelogVersion(version: string): void {\r\n\t\tthis.globalSettings.lastChangelogVersion = version;\r\n\t\tthis.markModified(\"lastChangelogVersion\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetDefaultProvider(): string | undefined {\r\n\t\treturn this.settings.defaultProvider;\r\n\t}\r\n\r\n\tgetDefaultModel(): string | undefined {\r\n\t\treturn this.settings.defaultModel;\r\n\t}\r\n\r\n\tsetDefaultProvider(provider: string): void {\r\n\t\tthis.globalSettings.defaultProvider = provider;\r\n\t\tthis.markModified(\"defaultProvider\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetDefaultModel(modelId: string): void {\r\n\t\tthis.globalSettings.defaultModel = modelId;\r\n\t\tthis.markModified(\"defaultModel\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetDefaultModelAndProvider(provider: string, modelId: string): void {\r\n\t\tthis.globalSettings.defaultProvider = provider;\r\n\t\tthis.globalSettings.defaultModel = modelId;\r\n\t\tthis.markModified(\"defaultProvider\");\r\n\t\tthis.markModified(\"defaultModel\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetSteeringMode(): \"all\" | \"one-at-a-time\" {\r\n\t\treturn this.settings.steeringMode || \"one-at-a-time\";\r\n\t}\r\n\r\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\r\n\t\tthis.globalSettings.steeringMode = mode;\r\n\t\tthis.markModified(\"steeringMode\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetFollowUpMode(): \"all\" | \"one-at-a-time\" {\r\n\t\treturn this.settings.followUpMode || \"one-at-a-time\";\r\n\t}\r\n\r\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\r\n\t\tthis.globalSettings.followUpMode = mode;\r\n\t\tthis.markModified(\"followUpMode\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetTheme(): string | undefined {\r\n\t\treturn this.settings.theme;\r\n\t}\r\n\r\n\tsetTheme(theme: string): void {\r\n\t\tthis.globalSettings.theme = theme;\r\n\t\tthis.markModified(\"theme\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetDefaultThinkingLevel(): \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | undefined {\r\n\t\treturn this.settings.defaultThinkingLevel;\r\n\t}\r\n\r\n\tsetDefaultThinkingLevel(level: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\"): void {\r\n\t\tthis.globalSettings.defaultThinkingLevel = level;\r\n\t\tthis.markModified(\"defaultThinkingLevel\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetTransport(): TransportSetting {\r\n\t\treturn this.settings.transport ?? \"sse\";\r\n\t}\r\n\r\n\tsetTransport(transport: TransportSetting): void {\r\n\t\tthis.globalSettings.transport = transport;\r\n\t\tthis.markModified(\"transport\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCompactionEnabled(): boolean {\r\n\t\treturn this.settings.compaction?.enabled ?? true;\r\n\t}\r\n\r\n\tsetCompactionEnabled(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.compaction) {\r\n\t\t\tthis.globalSettings.compaction = {};\r\n\t\t}\r\n\t\tthis.globalSettings.compaction.enabled = enabled;\r\n\t\tthis.markModified(\"compaction\", \"enabled\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCompactionReserveTokens(): number {\r\n\t\treturn this.settings.compaction?.reserveTokens ?? 16384;\r\n\t}\r\n\r\n\tgetCompactionKeepRecentTokens(): number {\r\n\t\treturn this.settings.compaction?.keepRecentTokens ?? 20000;\r\n\t}\r\n\r\n\tgetCompactionSettings(): { enabled: boolean; reserveTokens: number; keepRecentTokens: number } {\r\n\t\treturn {\r\n\t\t\tenabled: this.getCompactionEnabled(),\r\n\t\t\treserveTokens: this.getCompactionReserveTokens(),\r\n\t\t\tkeepRecentTokens: this.getCompactionKeepRecentTokens(),\r\n\t\t};\r\n\t}\r\n\r\n\tgetBranchSummarySettings(): { reserveTokens: number } {\r\n\t\treturn {\r\n\t\t\treserveTokens: this.settings.branchSummary?.reserveTokens ?? 16384,\r\n\t\t};\r\n\t}\r\n\r\n\tgetRetryEnabled(): boolean {\r\n\t\treturn this.settings.retry?.enabled ?? true;\r\n\t}\r\n\r\n\tsetRetryEnabled(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.retry) {\r\n\t\t\tthis.globalSettings.retry = {};\r\n\t\t}\r\n\t\tthis.globalSettings.retry.enabled = enabled;\r\n\t\tthis.markModified(\"retry\", \"enabled\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetRetrySettings(): { enabled: boolean; maxRetries: number; baseDelayMs: number; maxDelayMs: number } {\r\n\t\treturn {\r\n\t\t\tenabled: this.getRetryEnabled(),\r\n\t\t\tmaxRetries: this.settings.retry?.maxRetries ?? 3,\r\n\t\t\tbaseDelayMs: this.settings.retry?.baseDelayMs ?? 2000,\r\n\t\t\tmaxDelayMs: this.settings.retry?.maxDelayMs ?? 60000,\r\n\t\t};\r\n\t}\r\n\r\n\tgetHideThinkingBlock(): boolean {\r\n\t\treturn this.settings.hideThinkingBlock ?? false;\r\n\t}\r\n\r\n\tsetHideThinkingBlock(hide: boolean): void {\r\n\t\tthis.globalSettings.hideThinkingBlock = hide;\r\n\t\tthis.markModified(\"hideThinkingBlock\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetShellPath(): string | undefined {\r\n\t\treturn this.settings.shellPath;\r\n\t}\r\n\r\n\tsetShellPath(path: string | undefined): void {\r\n\t\tthis.globalSettings.shellPath = path;\r\n\t\tthis.markModified(\"shellPath\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetQuietStartup(): boolean {\r\n\t\treturn this.settings.quietStartup ?? false;\r\n\t}\r\n\r\n\tsetQuietStartup(quiet: boolean): void {\r\n\t\tthis.globalSettings.quietStartup = quiet;\r\n\t\tthis.markModified(\"quietStartup\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetShellCommandPrefix(): string | undefined {\r\n\t\treturn this.settings.shellCommandPrefix;\r\n\t}\r\n\r\n\tsetShellCommandPrefix(prefix: string | undefined): void {\r\n\t\tthis.globalSettings.shellCommandPrefix = prefix;\r\n\t\tthis.markModified(\"shellCommandPrefix\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCollapseChangelog(): boolean {\r\n\t\treturn this.settings.collapseChangelog ?? false;\r\n\t}\r\n\r\n\tsetCollapseChangelog(collapse: boolean): void {\r\n\t\tthis.globalSettings.collapseChangelog = collapse;\r\n\t\tthis.markModified(\"collapseChangelog\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetPackages(): PackageSource[] {\r\n\t\treturn [...(this.settings.packages ?? [])];\r\n\t}\r\n\r\n\tsetPackages(packages: PackageSource[]): void {\r\n\t\tthis.globalSettings.packages = packages;\r\n\t\tthis.markModified(\"packages\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectPackages(packages: PackageSource[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.packages = packages;\r\n\t\tthis.markProjectModified(\"packages\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetExtensionPaths(): string[] {\r\n\t\treturn [...(this.settings.extensions ?? [])];\r\n\t}\r\n\r\n\tsetExtensionPaths(paths: string[]): void {\r\n\t\tthis.globalSettings.extensions = paths;\r\n\t\tthis.markModified(\"extensions\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectExtensionPaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.extensions = paths;\r\n\t\tthis.markProjectModified(\"extensions\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetSkillPaths(): string[] {\r\n\t\treturn [...(this.settings.skills ?? [])];\r\n\t}\r\n\r\n\tsetSkillPaths(paths: string[]): void {\r\n\t\tthis.globalSettings.skills = paths;\r\n\t\tthis.markModified(\"skills\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectSkillPaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.skills = paths;\r\n\t\tthis.markProjectModified(\"skills\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetPromptTemplatePaths(): string[] {\r\n\t\treturn [...(this.settings.prompts ?? [])];\r\n\t}\r\n\r\n\tsetPromptTemplatePaths(paths: string[]): void {\r\n\t\tthis.globalSettings.prompts = paths;\r\n\t\tthis.markModified(\"prompts\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectPromptTemplatePaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.prompts = paths;\r\n\t\tthis.markProjectModified(\"prompts\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetThemePaths(): string[] {\r\n\t\treturn [...(this.settings.themes ?? [])];\r\n\t}\r\n\r\n\tsetThemePaths(paths: string[]): void {\r\n\t\tthis.globalSettings.themes = paths;\r\n\t\tthis.markModified(\"themes\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tsetProjectThemePaths(paths: string[]): void {\r\n\t\tconst projectSettings = structuredClone(this.projectSettings);\r\n\t\tprojectSettings.themes = paths;\r\n\t\tthis.markProjectModified(\"themes\");\r\n\t\tthis.saveProjectSettings(projectSettings);\r\n\t}\r\n\r\n\tgetEnableSkillCommands(): boolean {\r\n\t\treturn this.settings.enableSkillCommands ?? true;\r\n\t}\r\n\r\n\tsetEnableSkillCommands(enabled: boolean): void {\r\n\t\tthis.globalSettings.enableSkillCommands = enabled;\r\n\t\tthis.markModified(\"enableSkillCommands\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetThinkingBudgets(): ThinkingBudgetsSettings | undefined {\r\n\t\treturn this.settings.thinkingBudgets;\r\n\t}\r\n\r\n\tgetShowImages(): boolean {\r\n\t\treturn this.settings.terminal?.showImages ?? true;\r\n\t}\r\n\r\n\tsetShowImages(show: boolean): void {\r\n\t\tif (!this.globalSettings.terminal) {\r\n\t\t\tthis.globalSettings.terminal = {};\r\n\t\t}\r\n\t\tthis.globalSettings.terminal.showImages = show;\r\n\t\tthis.markModified(\"terminal\", \"showImages\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetClearOnShrink(): boolean {\r\n\t\t// Settings takes precedence, then env var, then default false\r\n\t\tif (this.settings.terminal?.clearOnShrink !== undefined) {\r\n\t\t\treturn this.settings.terminal.clearOnShrink;\r\n\t\t}\r\n\t\treturn process.env.PI_CLEAR_ON_SHRINK === \"1\";\r\n\t}\r\n\r\n\tsetClearOnShrink(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.terminal) {\r\n\t\t\tthis.globalSettings.terminal = {};\r\n\t\t}\r\n\t\tthis.globalSettings.terminal.clearOnShrink = enabled;\r\n\t\tthis.markModified(\"terminal\", \"clearOnShrink\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetImageAutoResize(): boolean {\r\n\t\treturn this.settings.images?.autoResize ?? true;\r\n\t}\r\n\r\n\tsetImageAutoResize(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.images) {\r\n\t\t\tthis.globalSettings.images = {};\r\n\t\t}\r\n\t\tthis.globalSettings.images.autoResize = enabled;\r\n\t\tthis.markModified(\"images\", \"autoResize\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetBlockImages(): boolean {\r\n\t\treturn this.settings.images?.blockImages ?? false;\r\n\t}\r\n\r\n\tsetBlockImages(blocked: boolean): void {\r\n\t\tif (!this.globalSettings.images) {\r\n\t\t\tthis.globalSettings.images = {};\r\n\t\t}\r\n\t\tthis.globalSettings.images.blockImages = blocked;\r\n\t\tthis.markModified(\"images\", \"blockImages\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetEnabledModels(): string[] | undefined {\r\n\t\treturn this.settings.enabledModels;\r\n\t}\r\n\r\n\tsetEnabledModels(patterns: string[] | undefined): void {\r\n\t\tthis.globalSettings.enabledModels = patterns;\r\n\t\tthis.markModified(\"enabledModels\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetDoubleEscapeAction(): \"fork\" | \"tree\" | \"none\" {\r\n\t\treturn this.settings.doubleEscapeAction ?? \"tree\";\r\n\t}\r\n\r\n\tsetDoubleEscapeAction(action: \"fork\" | \"tree\" | \"none\"): void {\r\n\t\tthis.globalSettings.doubleEscapeAction = action;\r\n\t\tthis.markModified(\"doubleEscapeAction\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetShowHardwareCursor(): boolean {\r\n\t\treturn this.settings.showHardwareCursor ?? process.env.PI_HARDWARE_CURSOR === \"1\";\r\n\t}\r\n\r\n\tsetShowHardwareCursor(enabled: boolean): void {\r\n\t\tthis.globalSettings.showHardwareCursor = enabled;\r\n\t\tthis.markModified(\"showHardwareCursor\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetEditorPaddingX(): number {\r\n\t\treturn this.settings.editorPaddingX ?? 0;\r\n\t}\r\n\r\n\tsetEditorPaddingX(padding: number): void {\r\n\t\tthis.globalSettings.editorPaddingX = Math.max(0, Math.min(3, Math.floor(padding)));\r\n\t\tthis.markModified(\"editorPaddingX\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetAutocompleteMaxVisible(): number {\r\n\t\treturn this.settings.autocompleteMaxVisible ?? 5;\r\n\t}\r\n\r\n\tsetAutocompleteMaxVisible(maxVisible: number): void {\r\n\t\tthis.globalSettings.autocompleteMaxVisible = Math.max(3, Math.min(20, Math.floor(maxVisible)));\r\n\t\tthis.markModified(\"autocompleteMaxVisible\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetCodeBlockIndent(): string {\r\n\t\treturn this.settings.markdown?.codeBlockIndent ?? \" \";\r\n\t}\r\n\r\n\tgetMemoryEnabled(): boolean {\r\n\t\treturn this.settings.memory?.enabled ?? true;\r\n\t}\r\n\r\n\tsetMemoryEnabled(enabled: boolean): void {\r\n\t\tif (!this.globalSettings.memory) {\r\n\t\t\tthis.globalSettings.memory = {};\r\n\t\t}\r\n\t\tthis.globalSettings.memory.enabled = enabled;\r\n\t\tthis.markModified(\"memory\", \"enabled\");\r\n\t\tthis.save();\r\n\t}\r\n\r\n\tgetMemoryScope(): \"project\" | \"global\" {\r\n\t\treturn this.settings.memory?.scope ?? \"global\";\r\n\t}\r\n\r\n\tsetMemoryScope(scope: \"project\" | \"global\"): void {\r\n\t\tif (!this.globalSettings.memory) {\r\n\t\t\tthis.globalSettings.memory = {};\r\n\t\t}\r\n\t\tthis.globalSettings.memory.scope = scope;\r\n\t\tthis.markModified(\"memory\", \"scope\");\r\n\t\tthis.save();\r\n\t}\r\n}\r\n"]}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * System prompt construction and project context loading
3
3
  */
4
+ import { type MemoryScope } from "./memory.js";
4
5
  import { type Skill } from "./skills.js";
5
6
  export interface BuildSystemPromptOptions {
6
7
  /** Custom system prompt (replaces default). */
@@ -20,6 +21,8 @@ export interface BuildSystemPromptOptions {
20
21
  skills?: Skill[];
21
22
  /** Whether the memory system is enabled. Default: true */
22
23
  memoryEnabled?: boolean;
24
+ /** Memory scope: "project" or "global". Default: "project" */
25
+ memoryScope?: MemoryScope;
23
26
  }
24
27
  /** Build the system prompt with tools, guidelines, and context */
25
28
  export declare function buildSystemPrompt(options?: BuildSystemPromptOptions): string;
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAiBhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CAoKhF","sourcesContent":["/**\r\n * System prompt construction and project context loading\r\n */\r\n\r\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.js\";\r\nimport { buildMemoryPromptSection } from \"./memory.js\";\r\nimport { formatSkillsForPrompt, type Skill } from \"./skills.js\";\r\n\r\n/** Tool descriptions for system prompt */\r\nconst toolDescriptions: Record<string, string> = {\r\n\tread: \"Read file contents\",\r\n\tbash: \"Execute bash commands (ls, grep, find, etc.)\",\r\n\tedit: \"Make surgical edits to files (find exact text and replace)\",\r\n\twrite: \"Create or overwrite files\",\r\n\tgrep: \"Search file contents for patterns (respects .gitignore)\",\r\n\tfind: \"Find files by glob pattern (respects .gitignore)\",\r\n\tls: \"List directory contents\",\r\n\tmemory_write: \"Save a memory (procedural workflow, preference, or session summary)\",\r\n\tmemory_read: \"Read stored memories by type, ID, or search query\",\r\n\tmemory_update: \"Update an existing memory\",\r\n\tmemory_delete: \"Delete a memory by ID\",\r\n};\r\n\r\nexport interface BuildSystemPromptOptions {\r\n\t/** Custom system prompt (replaces default). */\r\n\tcustomPrompt?: string;\r\n\t/** Tools to include in prompt. Default: [read, bash, edit, write] */\r\n\tselectedTools?: string[];\r\n\t/** Text to append to system prompt. */\r\n\tappendSystemPrompt?: string;\r\n\t/** Working directory. Default: process.cwd() */\r\n\tcwd?: string;\r\n\t/** Pre-loaded context files. */\r\n\tcontextFiles?: Array<{ path: string; content: string }>;\r\n\t/** Pre-loaded skills. */\r\n\tskills?: Skill[];\r\n\t/** Whether the memory system is enabled. Default: true */\r\n\tmemoryEnabled?: boolean;\r\n}\r\n\r\n/** Build the system prompt with tools, guidelines, and context */\r\nexport function buildSystemPrompt(options: BuildSystemPromptOptions = {}): string {\r\n\tconst {\r\n\t\tcustomPrompt,\r\n\t\tselectedTools,\r\n\t\tappendSystemPrompt,\r\n\t\tcwd,\r\n\t\tcontextFiles: providedContextFiles,\r\n\t\tskills: providedSkills,\r\n\t\tmemoryEnabled = true,\r\n\t} = options;\r\n\tconst resolvedCwd = cwd ?? process.cwd();\r\n\r\n\tconst now = new Date();\r\n\tconst dateTime = now.toLocaleString(\"en-US\", {\r\n\t\tweekday: \"long\",\r\n\t\tyear: \"numeric\",\r\n\t\tmonth: \"long\",\r\n\t\tday: \"numeric\",\r\n\t\thour: \"2-digit\",\r\n\t\tminute: \"2-digit\",\r\n\t\tsecond: \"2-digit\",\r\n\t\ttimeZoneName: \"short\",\r\n\t});\r\n\r\n\tconst appendSection = appendSystemPrompt ? `\\n\\n${appendSystemPrompt}` : \"\";\r\n\r\n\tconst contextFiles = providedContextFiles ?? [];\r\n\tconst skills = providedSkills ?? [];\r\n\r\n\tif (customPrompt) {\r\n\t\tlet prompt = customPrompt;\r\n\r\n\t\tif (appendSection) {\r\n\t\t\tprompt += appendSection;\r\n\t\t}\r\n\r\n\t\t// Append project context files\r\n\t\tif (contextFiles.length > 0) {\r\n\t\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append skills section (only if read tool is available)\r\n\t\tconst customPromptHasRead = !selectedTools || selectedTools.includes(\"read\");\r\n\t\tif (customPromptHasRead && skills.length > 0) {\r\n\t\t\tprompt += formatSkillsForPrompt(skills);\r\n\t\t}\r\n\r\n\t\t// Append memory system context\r\n\t\tif (memoryEnabled) {\r\n\t\t\tprompt += buildMemoryPromptSection(resolvedCwd);\r\n\t\t}\r\n\r\n\t\t// Add date/time and working directory last\r\n\t\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\t\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\t\treturn prompt;\r\n\t}\r\n\r\n\t// Get absolute paths to documentation and examples\r\n\tconst readmePath = getReadmePath();\r\n\tconst docsPath = getDocsPath();\r\n\tconst examplesPath = getExamplesPath();\r\n\r\n\t// Build tools list based on selected tools (only built-in tools with known descriptions)\r\n\tconst tools = (selectedTools || [\"read\", \"bash\", \"edit\", \"write\"]).filter((t) => t in toolDescriptions);\r\n\tconst toolsList = tools.length > 0 ? tools.map((t) => `- ${t}: ${toolDescriptions[t]}`).join(\"\\n\") : \"(none)\";\r\n\r\n\t// Build guidelines based on which tools are actually available\r\n\tconst guidelinesList: string[] = [];\r\n\r\n\tconst hasBash = tools.includes(\"bash\");\r\n\tconst hasEdit = tools.includes(\"edit\");\r\n\tconst hasWrite = tools.includes(\"write\");\r\n\tconst hasGrep = tools.includes(\"grep\");\r\n\tconst hasFind = tools.includes(\"find\");\r\n\tconst hasLs = tools.includes(\"ls\");\r\n\tconst hasRead = tools.includes(\"read\");\r\n\r\n\t// File exploration guidelines\r\n\tif (hasBash && !hasGrep && !hasFind && !hasLs) {\r\n\t\tguidelinesList.push(\"Use bash for file operations like ls, rg, find\");\r\n\t} else if (hasBash && (hasGrep || hasFind || hasLs)) {\r\n\t\tguidelinesList.push(\"Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)\");\r\n\t}\r\n\r\n\t// Read before edit guideline\r\n\tif (hasRead && hasEdit) {\r\n\t\tguidelinesList.push(\"Use read to examine files before editing. You must use this tool instead of cat or sed.\");\r\n\t}\r\n\r\n\t// Edit guideline\r\n\tif (hasEdit) {\r\n\t\tguidelinesList.push(\"Use edit for precise changes (old text must match exactly)\");\r\n\t}\r\n\r\n\t// Write guideline\r\n\tif (hasWrite) {\r\n\t\tguidelinesList.push(\"Use write only for new files or complete rewrites\");\r\n\t}\r\n\r\n\t// Output guideline (only when actually writing or executing)\r\n\tif (hasEdit || hasWrite) {\r\n\t\tguidelinesList.push(\r\n\t\t\t\"When summarizing your actions, output plain text directly - do NOT use cat or bash to display what you did\",\r\n\t\t);\r\n\t}\r\n\r\n\t// Always include these\r\n\tguidelinesList.push(\"Be concise in your responses\");\r\n\tguidelinesList.push(\"Show file paths clearly when working with files\");\r\n\r\n\tconst guidelines = guidelinesList.map((g) => `- ${g}`).join(\"\\n\");\r\n\r\n\tlet prompt = `You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\r\n\r\nAvailable tools:\r\n${toolsList}\r\n\r\nIn addition to the tools above, you may have access to other custom tools depending on the project.\r\n\r\nGuidelines:\r\n${guidelines}\r\n\r\nPi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):\r\n- Main documentation: ${readmePath}\r\n- Additional docs: ${docsPath}\r\n- Examples: ${examplesPath} (extensions, custom tools, SDK)\r\n- 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)\r\n- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing\r\n- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\r\n\r\n\tif (appendSection) {\r\n\t\tprompt += appendSection;\r\n\t}\r\n\r\n\t// Append project context files\r\n\tif (contextFiles.length > 0) {\r\n\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t}\r\n\t}\r\n\r\n\t// Append skills section (only if read tool is available)\r\n\tif (hasRead && skills.length > 0) {\r\n\t\tprompt += formatSkillsForPrompt(skills);\r\n\t}\r\n\r\n\t// Append memory system context\r\n\tif (memoryEnabled) {\r\n\t\tprompt += buildMemoryPromptSection(resolvedCwd);\r\n\t}\r\n\r\n\t// Add date/time and working directory last\r\n\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\treturn prompt;\r\n}\r\n"]}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,WAAW,EAA4B,MAAM,aAAa,CAAC;AACzE,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAiBhE,MAAM,WAAW,wBAAwB;IACxC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,uCAAuC;IACvC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CAqKhF","sourcesContent":["/**\r\n * System prompt construction and project context loading\r\n */\r\n\r\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.js\";\r\nimport { type MemoryScope, buildMemoryPromptSection } from \"./memory.js\";\r\nimport { formatSkillsForPrompt, type Skill } from \"./skills.js\";\r\n\r\n/** Tool descriptions for system prompt */\r\nconst toolDescriptions: Record<string, string> = {\r\n\tread: \"Read file contents\",\r\n\tbash: \"Execute bash commands (ls, grep, find, etc.)\",\r\n\tedit: \"Make surgical edits to files (find exact text and replace)\",\r\n\twrite: \"Create or overwrite files\",\r\n\tgrep: \"Search file contents for patterns (respects .gitignore)\",\r\n\tfind: \"Find files by glob pattern (respects .gitignore)\",\r\n\tls: \"List directory contents\",\r\n\tmemory_write: \"Save a memory (procedural workflow, preference, or session summary)\",\r\n\tmemory_read: \"Read stored memories by type, ID, or search query\",\r\n\tmemory_update: \"Update an existing memory\",\r\n\tmemory_delete: \"Delete a memory by ID\",\r\n};\r\n\r\nexport interface BuildSystemPromptOptions {\r\n\t/** Custom system prompt (replaces default). */\r\n\tcustomPrompt?: string;\r\n\t/** Tools to include in prompt. Default: [read, bash, edit, write] */\r\n\tselectedTools?: string[];\r\n\t/** Text to append to system prompt. */\r\n\tappendSystemPrompt?: string;\r\n\t/** Working directory. Default: process.cwd() */\r\n\tcwd?: string;\r\n\t/** Pre-loaded context files. */\r\n\tcontextFiles?: Array<{ path: string; content: string }>;\r\n\t/** Pre-loaded skills. */\r\n\tskills?: Skill[];\r\n\t/** Whether the memory system is enabled. Default: true */\r\n\tmemoryEnabled?: boolean;\r\n\t/** Memory scope: \"project\" or \"global\". Default: \"project\" */\r\n\tmemoryScope?: MemoryScope;\r\n}\r\n\r\n/** Build the system prompt with tools, guidelines, and context */\r\nexport function buildSystemPrompt(options: BuildSystemPromptOptions = {}): string {\r\n\tconst {\r\n\t\tcustomPrompt,\r\n\t\tselectedTools,\r\n\t\tappendSystemPrompt,\r\n\t\tcwd,\r\n\t\tcontextFiles: providedContextFiles,\r\n\t\tskills: providedSkills,\r\n\t\tmemoryEnabled = true,\r\n\t\tmemoryScope = \"project\",\r\n\t} = options;\r\n\tconst resolvedCwd = cwd ?? process.cwd();\r\n\r\n\tconst now = new Date();\r\n\tconst dateTime = now.toLocaleString(\"en-US\", {\r\n\t\tweekday: \"long\",\r\n\t\tyear: \"numeric\",\r\n\t\tmonth: \"long\",\r\n\t\tday: \"numeric\",\r\n\t\thour: \"2-digit\",\r\n\t\tminute: \"2-digit\",\r\n\t\tsecond: \"2-digit\",\r\n\t\ttimeZoneName: \"short\",\r\n\t});\r\n\r\n\tconst appendSection = appendSystemPrompt ? `\\n\\n${appendSystemPrompt}` : \"\";\r\n\r\n\tconst contextFiles = providedContextFiles ?? [];\r\n\tconst skills = providedSkills ?? [];\r\n\r\n\tif (customPrompt) {\r\n\t\tlet prompt = customPrompt;\r\n\r\n\t\tif (appendSection) {\r\n\t\t\tprompt += appendSection;\r\n\t\t}\r\n\r\n\t\t// Append project context files\r\n\t\tif (contextFiles.length > 0) {\r\n\t\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append skills section (only if read tool is available)\r\n\t\tconst customPromptHasRead = !selectedTools || selectedTools.includes(\"read\");\r\n\t\tif (customPromptHasRead && skills.length > 0) {\r\n\t\t\tprompt += formatSkillsForPrompt(skills);\r\n\t\t}\r\n\r\n\t\t// Append memory system context\r\n\t\tif (memoryEnabled) {\r\n\t\t\tprompt += buildMemoryPromptSection(resolvedCwd, memoryScope);\r\n\t\t}\r\n\r\n\t\t// Add date/time and working directory last\r\n\t\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\t\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\t\treturn prompt;\r\n\t}\r\n\r\n\t// Get absolute paths to documentation and examples\r\n\tconst readmePath = getReadmePath();\r\n\tconst docsPath = getDocsPath();\r\n\tconst examplesPath = getExamplesPath();\r\n\r\n\t// Build tools list based on selected tools (only built-in tools with known descriptions)\r\n\tconst tools = (selectedTools || [\"read\", \"bash\", \"edit\", \"write\"]).filter((t) => t in toolDescriptions);\r\n\tconst toolsList = tools.length > 0 ? tools.map((t) => `- ${t}: ${toolDescriptions[t]}`).join(\"\\n\") : \"(none)\";\r\n\r\n\t// Build guidelines based on which tools are actually available\r\n\tconst guidelinesList: string[] = [];\r\n\r\n\tconst hasBash = tools.includes(\"bash\");\r\n\tconst hasEdit = tools.includes(\"edit\");\r\n\tconst hasWrite = tools.includes(\"write\");\r\n\tconst hasGrep = tools.includes(\"grep\");\r\n\tconst hasFind = tools.includes(\"find\");\r\n\tconst hasLs = tools.includes(\"ls\");\r\n\tconst hasRead = tools.includes(\"read\");\r\n\r\n\t// File exploration guidelines\r\n\tif (hasBash && !hasGrep && !hasFind && !hasLs) {\r\n\t\tguidelinesList.push(\"Use bash for file operations like ls, rg, find\");\r\n\t} else if (hasBash && (hasGrep || hasFind || hasLs)) {\r\n\t\tguidelinesList.push(\"Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)\");\r\n\t}\r\n\r\n\t// Read before edit guideline\r\n\tif (hasRead && hasEdit) {\r\n\t\tguidelinesList.push(\"Use read to examine files before editing. You must use this tool instead of cat or sed.\");\r\n\t}\r\n\r\n\t// Edit guideline\r\n\tif (hasEdit) {\r\n\t\tguidelinesList.push(\"Use edit for precise changes (old text must match exactly)\");\r\n\t}\r\n\r\n\t// Write guideline\r\n\tif (hasWrite) {\r\n\t\tguidelinesList.push(\"Use write only for new files or complete rewrites\");\r\n\t}\r\n\r\n\t// Output guideline (only when actually writing or executing)\r\n\tif (hasEdit || hasWrite) {\r\n\t\tguidelinesList.push(\r\n\t\t\t\"When summarizing your actions, output plain text directly - do NOT use cat or bash to display what you did\",\r\n\t\t);\r\n\t}\r\n\r\n\t// Always include these\r\n\tguidelinesList.push(\"Be concise in your responses\");\r\n\tguidelinesList.push(\"Show file paths clearly when working with files\");\r\n\r\n\tconst guidelines = guidelinesList.map((g) => `- ${g}`).join(\"\\n\");\r\n\r\n\tlet prompt = `You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\r\n\r\nAvailable tools:\r\n${toolsList}\r\n\r\nIn addition to the tools above, you may have access to other custom tools depending on the project.\r\n\r\nGuidelines:\r\n${guidelines}\r\n\r\nPi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):\r\n- Main documentation: ${readmePath}\r\n- Additional docs: ${docsPath}\r\n- Examples: ${examplesPath} (extensions, custom tools, SDK)\r\n- 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)\r\n- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing\r\n- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\r\n\r\n\tif (appendSection) {\r\n\t\tprompt += appendSection;\r\n\t}\r\n\r\n\t// Append project context files\r\n\tif (contextFiles.length > 0) {\r\n\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t}\r\n\t}\r\n\r\n\t// Append skills section (only if read tool is available)\r\n\tif (hasRead && skills.length > 0) {\r\n\t\tprompt += formatSkillsForPrompt(skills);\r\n\t}\r\n\r\n\t// Append memory system context\r\n\tif (memoryEnabled) {\r\n\t\tprompt += buildMemoryPromptSection(resolvedCwd, memoryScope);\r\n\t}\r\n\r\n\t// Add date/time and working directory last\r\n\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\treturn prompt;\r\n}\r\n"]}
@@ -20,7 +20,7 @@ const toolDescriptions = {
20
20
  };
21
21
  /** Build the system prompt with tools, guidelines, and context */
22
22
  export function buildSystemPrompt(options = {}) {
23
- const { customPrompt, selectedTools, appendSystemPrompt, cwd, contextFiles: providedContextFiles, skills: providedSkills, memoryEnabled = true, } = options;
23
+ const { customPrompt, selectedTools, appendSystemPrompt, cwd, contextFiles: providedContextFiles, skills: providedSkills, memoryEnabled = true, memoryScope = "project", } = options;
24
24
  const resolvedCwd = cwd ?? process.cwd();
25
25
  const now = new Date();
26
26
  const dateTime = now.toLocaleString("en-US", {
@@ -56,7 +56,7 @@ export function buildSystemPrompt(options = {}) {
56
56
  }
57
57
  // Append memory system context
58
58
  if (memoryEnabled) {
59
- prompt += buildMemoryPromptSection(resolvedCwd);
59
+ prompt += buildMemoryPromptSection(resolvedCwd, memoryScope);
60
60
  }
61
61
  // Add date/time and working directory last
62
62
  prompt += `\nCurrent date and time: ${dateTime}`;
@@ -140,7 +140,7 @@ Pi documentation (read only when the user asks about pi itself, its SDK, extensi
140
140
  }
141
141
  // Append memory system context
142
142
  if (memoryEnabled) {
143
- prompt += buildMemoryPromptSection(resolvedCwd);
143
+ prompt += buildMemoryPromptSection(resolvedCwd, memoryScope);
144
144
  }
145
145
  // Add date/time and working directory last
146
146
  prompt += `\nCurrent date and time: ${dateTime}`;
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * System prompt construction and project context loading\r\n */\r\n\r\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.js\";\r\nimport { buildMemoryPromptSection } from \"./memory.js\";\r\nimport { formatSkillsForPrompt, type Skill } from \"./skills.js\";\r\n\r\n/** Tool descriptions for system prompt */\r\nconst toolDescriptions: Record<string, string> = {\r\n\tread: \"Read file contents\",\r\n\tbash: \"Execute bash commands (ls, grep, find, etc.)\",\r\n\tedit: \"Make surgical edits to files (find exact text and replace)\",\r\n\twrite: \"Create or overwrite files\",\r\n\tgrep: \"Search file contents for patterns (respects .gitignore)\",\r\n\tfind: \"Find files by glob pattern (respects .gitignore)\",\r\n\tls: \"List directory contents\",\r\n\tmemory_write: \"Save a memory (procedural workflow, preference, or session summary)\",\r\n\tmemory_read: \"Read stored memories by type, ID, or search query\",\r\n\tmemory_update: \"Update an existing memory\",\r\n\tmemory_delete: \"Delete a memory by ID\",\r\n};\r\n\r\nexport interface BuildSystemPromptOptions {\r\n\t/** Custom system prompt (replaces default). */\r\n\tcustomPrompt?: string;\r\n\t/** Tools to include in prompt. Default: [read, bash, edit, write] */\r\n\tselectedTools?: string[];\r\n\t/** Text to append to system prompt. */\r\n\tappendSystemPrompt?: string;\r\n\t/** Working directory. Default: process.cwd() */\r\n\tcwd?: string;\r\n\t/** Pre-loaded context files. */\r\n\tcontextFiles?: Array<{ path: string; content: string }>;\r\n\t/** Pre-loaded skills. */\r\n\tskills?: Skill[];\r\n\t/** Whether the memory system is enabled. Default: true */\r\n\tmemoryEnabled?: boolean;\r\n}\r\n\r\n/** Build the system prompt with tools, guidelines, and context */\r\nexport function buildSystemPrompt(options: BuildSystemPromptOptions = {}): string {\r\n\tconst {\r\n\t\tcustomPrompt,\r\n\t\tselectedTools,\r\n\t\tappendSystemPrompt,\r\n\t\tcwd,\r\n\t\tcontextFiles: providedContextFiles,\r\n\t\tskills: providedSkills,\r\n\t\tmemoryEnabled = true,\r\n\t} = options;\r\n\tconst resolvedCwd = cwd ?? process.cwd();\r\n\r\n\tconst now = new Date();\r\n\tconst dateTime = now.toLocaleString(\"en-US\", {\r\n\t\tweekday: \"long\",\r\n\t\tyear: \"numeric\",\r\n\t\tmonth: \"long\",\r\n\t\tday: \"numeric\",\r\n\t\thour: \"2-digit\",\r\n\t\tminute: \"2-digit\",\r\n\t\tsecond: \"2-digit\",\r\n\t\ttimeZoneName: \"short\",\r\n\t});\r\n\r\n\tconst appendSection = appendSystemPrompt ? `\\n\\n${appendSystemPrompt}` : \"\";\r\n\r\n\tconst contextFiles = providedContextFiles ?? [];\r\n\tconst skills = providedSkills ?? [];\r\n\r\n\tif (customPrompt) {\r\n\t\tlet prompt = customPrompt;\r\n\r\n\t\tif (appendSection) {\r\n\t\t\tprompt += appendSection;\r\n\t\t}\r\n\r\n\t\t// Append project context files\r\n\t\tif (contextFiles.length > 0) {\r\n\t\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append skills section (only if read tool is available)\r\n\t\tconst customPromptHasRead = !selectedTools || selectedTools.includes(\"read\");\r\n\t\tif (customPromptHasRead && skills.length > 0) {\r\n\t\t\tprompt += formatSkillsForPrompt(skills);\r\n\t\t}\r\n\r\n\t\t// Append memory system context\r\n\t\tif (memoryEnabled) {\r\n\t\t\tprompt += buildMemoryPromptSection(resolvedCwd);\r\n\t\t}\r\n\r\n\t\t// Add date/time and working directory last\r\n\t\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\t\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\t\treturn prompt;\r\n\t}\r\n\r\n\t// Get absolute paths to documentation and examples\r\n\tconst readmePath = getReadmePath();\r\n\tconst docsPath = getDocsPath();\r\n\tconst examplesPath = getExamplesPath();\r\n\r\n\t// Build tools list based on selected tools (only built-in tools with known descriptions)\r\n\tconst tools = (selectedTools || [\"read\", \"bash\", \"edit\", \"write\"]).filter((t) => t in toolDescriptions);\r\n\tconst toolsList = tools.length > 0 ? tools.map((t) => `- ${t}: ${toolDescriptions[t]}`).join(\"\\n\") : \"(none)\";\r\n\r\n\t// Build guidelines based on which tools are actually available\r\n\tconst guidelinesList: string[] = [];\r\n\r\n\tconst hasBash = tools.includes(\"bash\");\r\n\tconst hasEdit = tools.includes(\"edit\");\r\n\tconst hasWrite = tools.includes(\"write\");\r\n\tconst hasGrep = tools.includes(\"grep\");\r\n\tconst hasFind = tools.includes(\"find\");\r\n\tconst hasLs = tools.includes(\"ls\");\r\n\tconst hasRead = tools.includes(\"read\");\r\n\r\n\t// File exploration guidelines\r\n\tif (hasBash && !hasGrep && !hasFind && !hasLs) {\r\n\t\tguidelinesList.push(\"Use bash for file operations like ls, rg, find\");\r\n\t} else if (hasBash && (hasGrep || hasFind || hasLs)) {\r\n\t\tguidelinesList.push(\"Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)\");\r\n\t}\r\n\r\n\t// Read before edit guideline\r\n\tif (hasRead && hasEdit) {\r\n\t\tguidelinesList.push(\"Use read to examine files before editing. You must use this tool instead of cat or sed.\");\r\n\t}\r\n\r\n\t// Edit guideline\r\n\tif (hasEdit) {\r\n\t\tguidelinesList.push(\"Use edit for precise changes (old text must match exactly)\");\r\n\t}\r\n\r\n\t// Write guideline\r\n\tif (hasWrite) {\r\n\t\tguidelinesList.push(\"Use write only for new files or complete rewrites\");\r\n\t}\r\n\r\n\t// Output guideline (only when actually writing or executing)\r\n\tif (hasEdit || hasWrite) {\r\n\t\tguidelinesList.push(\r\n\t\t\t\"When summarizing your actions, output plain text directly - do NOT use cat or bash to display what you did\",\r\n\t\t);\r\n\t}\r\n\r\n\t// Always include these\r\n\tguidelinesList.push(\"Be concise in your responses\");\r\n\tguidelinesList.push(\"Show file paths clearly when working with files\");\r\n\r\n\tconst guidelines = guidelinesList.map((g) => `- ${g}`).join(\"\\n\");\r\n\r\n\tlet prompt = `You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\r\n\r\nAvailable tools:\r\n${toolsList}\r\n\r\nIn addition to the tools above, you may have access to other custom tools depending on the project.\r\n\r\nGuidelines:\r\n${guidelines}\r\n\r\nPi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):\r\n- Main documentation: ${readmePath}\r\n- Additional docs: ${docsPath}\r\n- Examples: ${examplesPath} (extensions, custom tools, SDK)\r\n- 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)\r\n- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing\r\n- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\r\n\r\n\tif (appendSection) {\r\n\t\tprompt += appendSection;\r\n\t}\r\n\r\n\t// Append project context files\r\n\tif (contextFiles.length > 0) {\r\n\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t}\r\n\t}\r\n\r\n\t// Append skills section (only if read tool is available)\r\n\tif (hasRead && skills.length > 0) {\r\n\t\tprompt += formatSkillsForPrompt(skills);\r\n\t}\r\n\r\n\t// Append memory system context\r\n\tif (memoryEnabled) {\r\n\t\tprompt += buildMemoryPromptSection(resolvedCwd);\r\n\t}\r\n\r\n\t// Add date/time and working directory last\r\n\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\treturn prompt;\r\n}\r\n"]}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * System prompt construction and project context loading\r\n */\r\n\r\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.js\";\r\nimport { type MemoryScope, buildMemoryPromptSection } from \"./memory.js\";\r\nimport { formatSkillsForPrompt, type Skill } from \"./skills.js\";\r\n\r\n/** Tool descriptions for system prompt */\r\nconst toolDescriptions: Record<string, string> = {\r\n\tread: \"Read file contents\",\r\n\tbash: \"Execute bash commands (ls, grep, find, etc.)\",\r\n\tedit: \"Make surgical edits to files (find exact text and replace)\",\r\n\twrite: \"Create or overwrite files\",\r\n\tgrep: \"Search file contents for patterns (respects .gitignore)\",\r\n\tfind: \"Find files by glob pattern (respects .gitignore)\",\r\n\tls: \"List directory contents\",\r\n\tmemory_write: \"Save a memory (procedural workflow, preference, or session summary)\",\r\n\tmemory_read: \"Read stored memories by type, ID, or search query\",\r\n\tmemory_update: \"Update an existing memory\",\r\n\tmemory_delete: \"Delete a memory by ID\",\r\n};\r\n\r\nexport interface BuildSystemPromptOptions {\r\n\t/** Custom system prompt (replaces default). */\r\n\tcustomPrompt?: string;\r\n\t/** Tools to include in prompt. Default: [read, bash, edit, write] */\r\n\tselectedTools?: string[];\r\n\t/** Text to append to system prompt. */\r\n\tappendSystemPrompt?: string;\r\n\t/** Working directory. Default: process.cwd() */\r\n\tcwd?: string;\r\n\t/** Pre-loaded context files. */\r\n\tcontextFiles?: Array<{ path: string; content: string }>;\r\n\t/** Pre-loaded skills. */\r\n\tskills?: Skill[];\r\n\t/** Whether the memory system is enabled. Default: true */\r\n\tmemoryEnabled?: boolean;\r\n\t/** Memory scope: \"project\" or \"global\". Default: \"project\" */\r\n\tmemoryScope?: MemoryScope;\r\n}\r\n\r\n/** Build the system prompt with tools, guidelines, and context */\r\nexport function buildSystemPrompt(options: BuildSystemPromptOptions = {}): string {\r\n\tconst {\r\n\t\tcustomPrompt,\r\n\t\tselectedTools,\r\n\t\tappendSystemPrompt,\r\n\t\tcwd,\r\n\t\tcontextFiles: providedContextFiles,\r\n\t\tskills: providedSkills,\r\n\t\tmemoryEnabled = true,\r\n\t\tmemoryScope = \"project\",\r\n\t} = options;\r\n\tconst resolvedCwd = cwd ?? process.cwd();\r\n\r\n\tconst now = new Date();\r\n\tconst dateTime = now.toLocaleString(\"en-US\", {\r\n\t\tweekday: \"long\",\r\n\t\tyear: \"numeric\",\r\n\t\tmonth: \"long\",\r\n\t\tday: \"numeric\",\r\n\t\thour: \"2-digit\",\r\n\t\tminute: \"2-digit\",\r\n\t\tsecond: \"2-digit\",\r\n\t\ttimeZoneName: \"short\",\r\n\t});\r\n\r\n\tconst appendSection = appendSystemPrompt ? `\\n\\n${appendSystemPrompt}` : \"\";\r\n\r\n\tconst contextFiles = providedContextFiles ?? [];\r\n\tconst skills = providedSkills ?? [];\r\n\r\n\tif (customPrompt) {\r\n\t\tlet prompt = customPrompt;\r\n\r\n\t\tif (appendSection) {\r\n\t\t\tprompt += appendSection;\r\n\t\t}\r\n\r\n\t\t// Append project context files\r\n\t\tif (contextFiles.length > 0) {\r\n\t\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Append skills section (only if read tool is available)\r\n\t\tconst customPromptHasRead = !selectedTools || selectedTools.includes(\"read\");\r\n\t\tif (customPromptHasRead && skills.length > 0) {\r\n\t\t\tprompt += formatSkillsForPrompt(skills);\r\n\t\t}\r\n\r\n\t\t// Append memory system context\r\n\t\tif (memoryEnabled) {\r\n\t\t\tprompt += buildMemoryPromptSection(resolvedCwd, memoryScope);\r\n\t\t}\r\n\r\n\t\t// Add date/time and working directory last\r\n\t\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\t\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\t\treturn prompt;\r\n\t}\r\n\r\n\t// Get absolute paths to documentation and examples\r\n\tconst readmePath = getReadmePath();\r\n\tconst docsPath = getDocsPath();\r\n\tconst examplesPath = getExamplesPath();\r\n\r\n\t// Build tools list based on selected tools (only built-in tools with known descriptions)\r\n\tconst tools = (selectedTools || [\"read\", \"bash\", \"edit\", \"write\"]).filter((t) => t in toolDescriptions);\r\n\tconst toolsList = tools.length > 0 ? tools.map((t) => `- ${t}: ${toolDescriptions[t]}`).join(\"\\n\") : \"(none)\";\r\n\r\n\t// Build guidelines based on which tools are actually available\r\n\tconst guidelinesList: string[] = [];\r\n\r\n\tconst hasBash = tools.includes(\"bash\");\r\n\tconst hasEdit = tools.includes(\"edit\");\r\n\tconst hasWrite = tools.includes(\"write\");\r\n\tconst hasGrep = tools.includes(\"grep\");\r\n\tconst hasFind = tools.includes(\"find\");\r\n\tconst hasLs = tools.includes(\"ls\");\r\n\tconst hasRead = tools.includes(\"read\");\r\n\r\n\t// File exploration guidelines\r\n\tif (hasBash && !hasGrep && !hasFind && !hasLs) {\r\n\t\tguidelinesList.push(\"Use bash for file operations like ls, rg, find\");\r\n\t} else if (hasBash && (hasGrep || hasFind || hasLs)) {\r\n\t\tguidelinesList.push(\"Prefer grep/find/ls tools over bash for file exploration (faster, respects .gitignore)\");\r\n\t}\r\n\r\n\t// Read before edit guideline\r\n\tif (hasRead && hasEdit) {\r\n\t\tguidelinesList.push(\"Use read to examine files before editing. You must use this tool instead of cat or sed.\");\r\n\t}\r\n\r\n\t// Edit guideline\r\n\tif (hasEdit) {\r\n\t\tguidelinesList.push(\"Use edit for precise changes (old text must match exactly)\");\r\n\t}\r\n\r\n\t// Write guideline\r\n\tif (hasWrite) {\r\n\t\tguidelinesList.push(\"Use write only for new files or complete rewrites\");\r\n\t}\r\n\r\n\t// Output guideline (only when actually writing or executing)\r\n\tif (hasEdit || hasWrite) {\r\n\t\tguidelinesList.push(\r\n\t\t\t\"When summarizing your actions, output plain text directly - do NOT use cat or bash to display what you did\",\r\n\t\t);\r\n\t}\r\n\r\n\t// Always include these\r\n\tguidelinesList.push(\"Be concise in your responses\");\r\n\tguidelinesList.push(\"Show file paths clearly when working with files\");\r\n\r\n\tconst guidelines = guidelinesList.map((g) => `- ${g}`).join(\"\\n\");\r\n\r\n\tlet prompt = `You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\r\n\r\nAvailable tools:\r\n${toolsList}\r\n\r\nIn addition to the tools above, you may have access to other custom tools depending on the project.\r\n\r\nGuidelines:\r\n${guidelines}\r\n\r\nPi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):\r\n- Main documentation: ${readmePath}\r\n- Additional docs: ${docsPath}\r\n- Examples: ${examplesPath} (extensions, custom tools, SDK)\r\n- 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)\r\n- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing\r\n- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\r\n\r\n\tif (appendSection) {\r\n\t\tprompt += appendSection;\r\n\t}\r\n\r\n\t// Append project context files\r\n\tif (contextFiles.length > 0) {\r\n\t\tprompt += \"\\n\\n# Project Context\\n\\n\";\r\n\t\tprompt += \"Project-specific instructions and guidelines:\\n\\n\";\r\n\t\tfor (const { path: filePath, content } of contextFiles) {\r\n\t\t\tprompt += `## ${filePath}\\n\\n${content}\\n\\n`;\r\n\t\t}\r\n\t}\r\n\r\n\t// Append skills section (only if read tool is available)\r\n\tif (hasRead && skills.length > 0) {\r\n\t\tprompt += formatSkillsForPrompt(skills);\r\n\t}\r\n\r\n\t// Append memory system context\r\n\tif (memoryEnabled) {\r\n\t\tprompt += buildMemoryPromptSection(resolvedCwd, memoryScope);\r\n\t}\r\n\r\n\t// Add date/time and working directory last\r\n\tprompt += `\\nCurrent date and time: ${dateTime}`;\r\n\tprompt += `\\nCurrent working directory: ${resolvedCwd}`;\r\n\r\n\treturn prompt;\r\n}\r\n"]}
@@ -2,9 +2,11 @@
2
2
  * Built-in memory tools: memory_write, memory_read, memory_update, memory_delete
3
3
  */
4
4
  import type { AgentTool } from "@mariozechner/pi-agent-core";
5
+ import { type MemoryScope } from "../memory.js";
5
6
  export interface MemoryToolContext {
6
7
  cwd: string;
7
8
  sessionId: string;
9
+ scope: MemoryScope;
8
10
  }
9
11
  export declare function setMemoryToolContext(ctx: MemoryToolContext): void;
10
12
  declare const memoryWriteSchema: import("@sinclair/typebox").TObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/core/tools/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAiB7D,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAEjE;AAMD,QAAA,MAAM,iBAAiB;;;;;;;;;;;;EAsBrB,CAAC;AAIH,QAAA,MAAM,gBAAgB;;;;EAIpB,CAAC;AAIH,QAAA,MAAM,kBAAkB;;;;;;EAMtB,CAAC;AAIH,QAAA,MAAM,kBAAkB;;EAEtB,CAAC;AAQH,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,OAAO,iBAAiB,CAuH/D,CAAC;AAMF,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,OAAO,gBAAgB,CAyG7D,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,OAAO,kBAAkB,CAqDjE,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,OAAO,kBAAkB,CA6BjE,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,EAA0E,CAAC","sourcesContent":["/**\r\n * Built-in memory tools: memory_write, memory_read, memory_update, memory_delete\r\n */\r\n\r\nimport type { AgentTool } from \"@mariozechner/pi-agent-core\";\r\nimport { StringEnum } from \"@mariozechner/pi-ai\";\r\nimport { type Static, Type } from \"@sinclair/typebox\";\r\nimport {\r\n\ttype EpisodicMemory,\r\n\tformatEpisodicForDisplay,\r\n\tformatProceduralForDisplay,\r\n\tformatSemanticForDisplay,\r\n\tgenerateId,\r\n\tloadStore,\r\n\tnowISO,\r\n\ttype ProceduralMemory,\r\n\ttype SemanticMemory,\r\n\tsaveStore,\r\n\tsearchMemories,\r\n} from \"../memory.js\";\r\n\r\nexport interface MemoryToolContext {\r\n\tcwd: string;\r\n\tsessionId: string;\r\n}\r\n\r\nlet memoryContext: MemoryToolContext = { cwd: process.cwd(), sessionId: `session_${Date.now()}` };\r\n\r\nexport function setMemoryToolContext(ctx: MemoryToolContext): void {\r\n\tmemoryContext = ctx;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Schemas\r\n// ---------------------------------------------------------------------------\r\n\r\nconst memoryWriteSchema = Type.Object({\r\n\ttype: StringEnum([\"procedural\", \"episodic\", \"semantic\"] as const),\r\n\tname: Type.Optional(Type.String({ description: \"Name for procedural memories (e.g., 'deploy-service')\" })),\r\n\ttrigger: Type.Optional(\r\n\t\tType.String({ description: \"When to invoke this procedure (e.g., 'user asks to deploy a service')\" }),\r\n\t),\r\n\tsteps: Type.Optional(Type.Array(Type.String(), { description: \"Steps for procedural memory\" })),\r\n\tsummary: Type.Optional(Type.String({ description: \"Summary for episodic memory\" })),\r\n\tdetails: Type.Optional(Type.Array(Type.String(), { description: \"Details for episodic memory\" })),\r\n\tcategory: Type.Optional(\r\n\t\tStringEnum([\"preference\", \"architecture\", \"convention\", \"fact\"] as const, {\r\n\t\t\tdescription: \"Category for semantic memory\",\r\n\t\t}),\r\n\t),\r\n\ttext: Type.Optional(Type.String({ description: \"Text content for semantic memory\" })),\r\n\ttags: Type.Optional(Type.Array(Type.String(), { description: \"Tags for searchability\" })),\r\n\treflection_mistakes: Type.Optional(\r\n\t\tType.Array(Type.String(), { description: \"Mistakes made (for episodic reflection)\" }),\r\n\t),\r\n\treflection_lessons: Type.Optional(\r\n\t\tType.Array(Type.String(), { description: \"Lessons learned (for episodic reflection)\" }),\r\n\t),\r\n});\r\n\r\ntype MemoryWriteInput = Static<typeof memoryWriteSchema>;\r\n\r\nconst memoryReadSchema = Type.Object({\r\n\ttype: Type.Optional(StringEnum([\"procedural\", \"episodic\", \"semantic\", \"all\"] as const)),\r\n\tid: Type.Optional(Type.String({ description: \"Specific memory ID to retrieve\" })),\r\n\tquery: Type.Optional(Type.String({ description: \"Search query to find relevant memories\" })),\r\n});\r\n\r\ntype MemoryReadInput = Static<typeof memoryReadSchema>;\r\n\r\nconst memoryUpdateSchema = Type.Object({\r\n\tid: Type.String({ description: \"Memory ID to update\" }),\r\n\ttext: Type.Optional(Type.String({ description: \"New text (for semantic memories)\" })),\r\n\tsteps: Type.Optional(Type.Array(Type.String(), { description: \"New steps (for procedural memories)\" })),\r\n\ttrigger: Type.Optional(Type.String({ description: \"New trigger (for procedural memories)\" })),\r\n\ttags: Type.Optional(Type.Array(Type.String(), { description: \"Replace tags\" })),\r\n});\r\n\r\ntype MemoryUpdateInput = Static<typeof memoryUpdateSchema>;\r\n\r\nconst memoryDeleteSchema = Type.Object({\r\n\tid: Type.String({ description: \"Memory ID to delete (e.g., 'proc_001', 'sem_003')\" }),\r\n});\r\n\r\ntype MemoryDeleteInput = Static<typeof memoryDeleteSchema>;\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_write\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryWriteTool: AgentTool<typeof memoryWriteSchema> = {\r\n\tname: \"memory_write\",\r\n\tlabel: \"Write Memory\",\r\n\tdescription:\r\n\t\t\"Save a memory to the persistent memory system. Use this automatically when: \" +\r\n\t\t\"(1) the user teaches you a multi-step workflow — save as 'procedural', \" +\r\n\t\t\"(2) the user states a preference, rule, or fact — save as 'semantic', \" +\r\n\t\t\"(3) a significant task completes — save as 'episodic'. \" +\r\n\t\t\"Do NOT ask the user for permission to save unless there is a conflict with an existing memory.\",\r\n\tparameters: memoryWriteSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryWriteInput) => {\r\n\t\tconst { cwd, sessionId } = memoryContext;\r\n\t\tconst tags = params.tags ?? [];\r\n\r\n\t\tif (params.type === \"procedural\") {\r\n\t\t\tif (!params.name || !params.trigger || !params.steps?.length) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: procedural memory requires name, trigger, and steps.\" }],\r\n\t\t\t\t\tdetails: {},\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst store = loadStore<ProceduralMemory>(cwd, \"procedural.json\");\r\n\t\t\tconst existing = store.memories.find((m) => m.name === params.name);\r\n\t\t\tif (existing) {\r\n\t\t\t\texisting.steps = params.steps;\r\n\t\t\t\texisting.trigger = params.trigger;\r\n\t\t\t\texisting.tags = [...new Set([...existing.tags, ...tags])];\r\n\t\t\t\texisting.updated = nowISO();\r\n\t\t\t\tsaveStore(cwd, \"procedural.json\", store);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Updated procedural memory [${existing.id}] \"${params.name}\".` }],\r\n\t\t\t\t\tdetails: { action: \"updated\", id: existing.id },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst id = generateId(\"proc\", store);\r\n\t\t\tstore.memories.push({\r\n\t\t\t\tid,\r\n\t\t\t\tname: params.name,\r\n\t\t\t\ttrigger: params.trigger,\r\n\t\t\t\tsteps: params.steps,\r\n\t\t\t\ttags,\r\n\t\t\t\tcreated: nowISO(),\r\n\t\t\t\tupdated: nowISO(),\r\n\t\t\t\tsourceSession: sessionId,\r\n\t\t\t});\r\n\t\t\tsaveStore(cwd, \"procedural.json\", store);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Saved procedural memory [${id}] \"${params.name}\".` }],\r\n\t\t\t\tdetails: { action: \"created\", id },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (params.type === \"episodic\") {\r\n\t\t\tif (!params.summary) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: episodic memory requires a summary.\" }],\r\n\t\t\t\t\tdetails: {},\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst store = loadStore<EpisodicMemory>(cwd, \"episodic.json\");\r\n\t\t\tconst id = generateId(\"ep\", store);\r\n\t\t\tconst reflection =\r\n\t\t\t\tparams.reflection_mistakes?.length || params.reflection_lessons?.length\r\n\t\t\t\t\t? { mistakes: params.reflection_mistakes ?? [], lessons: params.reflection_lessons ?? [] }\r\n\t\t\t\t\t: undefined;\r\n\t\t\tstore.memories.push({\r\n\t\t\t\tid,\r\n\t\t\t\tsummary: params.summary,\r\n\t\t\t\tdetails: params.details ?? [],\r\n\t\t\t\treflection,\r\n\t\t\t\ttags,\r\n\t\t\t\tdate: new Date().toISOString().split(\"T\")[0],\r\n\t\t\t\tsourceSession: sessionId,\r\n\t\t\t});\r\n\t\t\tsaveStore(cwd, \"episodic.json\", store);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Saved episodic memory [${id}] \"${params.summary}\".` }],\r\n\t\t\t\tdetails: { action: \"created\", id },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (params.type === \"semantic\") {\r\n\t\t\tif (!params.text || !params.category) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: semantic memory requires text and category.\" }],\r\n\t\t\t\t\tdetails: {},\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst store = loadStore<SemanticMemory>(cwd, \"semantic.json\");\r\n\t\t\tconst existing = store.memories.find(\r\n\t\t\t\t(m) => m.category === params.category && m.text.toLowerCase() === params.text!.toLowerCase(),\r\n\t\t\t);\r\n\t\t\tif (existing) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `This semantic memory already exists [${existing.id}].` }],\r\n\t\t\t\t\tdetails: { action: \"duplicate\", id: existing.id },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst id = generateId(\"sem\", store);\r\n\t\t\tstore.memories.push({\r\n\t\t\t\tid,\r\n\t\t\t\tcategory: params.category,\r\n\t\t\t\ttext: params.text,\r\n\t\t\t\ttags,\r\n\t\t\t\tcreated: nowISO(),\r\n\t\t\t\tsourceSession: sessionId,\r\n\t\t\t});\r\n\t\t\tsaveStore(cwd, \"semantic.json\", store);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Saved semantic memory [${id}] (${params.category}): \"${params.text}\".` }],\r\n\t\t\t\tdetails: { action: \"created\", id },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: `Unknown memory type: ${params.type}` }],\r\n\t\t\tdetails: {},\r\n\t\t};\r\n\t},\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_read\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryReadTool: AgentTool<typeof memoryReadSchema> = {\r\n\tname: \"memory_read\",\r\n\tlabel: \"Read Memory\",\r\n\tdescription:\r\n\t\t\"Read memories from the persistent memory system. Use this when you need to recall \" +\r\n\t\t\"past workflows, user preferences, or what happened in previous sessions. \" +\r\n\t\t\"You can read all memories of a type, a specific memory by ID, or search by query.\",\r\n\tparameters: memoryReadSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryReadInput) => {\r\n\t\tconst { cwd } = memoryContext;\r\n\r\n\t\tif (params.id) {\r\n\t\t\tconst allStores: Array<{ file: string; format: (m: any) => string }> = [\r\n\t\t\t\t{ file: \"procedural.json\", format: formatProceduralForDisplay },\r\n\t\t\t\t{ file: \"episodic.json\", format: formatEpisodicForDisplay },\r\n\t\t\t\t{ file: \"semantic.json\", format: formatSemanticForDisplay },\r\n\t\t\t];\r\n\t\t\tfor (const { file, format } of allStores) {\r\n\t\t\t\tconst store = loadStore<{ id: string }>(cwd, file);\r\n\t\t\t\tconst found = store.memories.find((m) => m.id === params.id);\r\n\t\t\t\tif (found) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: format(found) }],\r\n\t\t\t\t\t\tdetails: { found: true },\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `No memory found with ID \"${params.id}\".` }],\r\n\t\t\t\tdetails: { found: false },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (params.query) {\r\n\t\t\tconst results: string[] = [];\r\n\t\t\tconst type = params.type ?? \"all\";\r\n\r\n\t\t\tif (type === \"all\" || type === \"procedural\") {\r\n\t\t\t\tconst store = loadStore<ProceduralMemory>(cwd, \"procedural.json\");\r\n\t\t\t\tconst matches = searchMemories(\r\n\t\t\t\t\tstore.memories,\r\n\t\t\t\t\tparams.query,\r\n\t\t\t\t\t(m) => `${m.name} ${m.trigger} ${m.steps.join(\" \")}`,\r\n\t\t\t\t);\r\n\t\t\t\tresults.push(...matches.map(formatProceduralForDisplay));\r\n\t\t\t}\r\n\t\t\tif (type === \"all\" || type === \"episodic\") {\r\n\t\t\t\tconst store = loadStore<EpisodicMemory>(cwd, \"episodic.json\");\r\n\t\t\t\tconst matches = searchMemories(store.memories, params.query, (m) => `${m.summary} ${m.details.join(\" \")}`);\r\n\t\t\t\tresults.push(...matches.map(formatEpisodicForDisplay));\r\n\t\t\t}\r\n\t\t\tif (type === \"all\" || type === \"semantic\") {\r\n\t\t\t\tconst store = loadStore<SemanticMemory>(cwd, \"semantic.json\");\r\n\t\t\t\tconst matches = searchMemories(store.memories, params.query, (m) => `${m.category} ${m.text}`);\r\n\t\t\t\tresults.push(...matches.map(formatSemanticForDisplay));\r\n\t\t\t}\r\n\r\n\t\t\tif (results.length === 0) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `No memories found matching \"${params.query}\".` }],\r\n\t\t\t\t\tdetails: { count: 0 },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\\n\") }],\r\n\t\t\t\tdetails: { count: results.length },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst type = params.type ?? \"all\";\r\n\t\tconst results: string[] = [];\r\n\r\n\t\tif (type === \"all\" || type === \"procedural\") {\r\n\t\t\tconst store = loadStore<ProceduralMemory>(cwd, \"procedural.json\");\r\n\t\t\tif (store.memories.length > 0) {\r\n\t\t\t\tresults.push(\"=== Procedural Memories ===\");\r\n\t\t\t\tresults.push(...store.memories.map(formatProceduralForDisplay));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (type === \"all\" || type === \"episodic\") {\r\n\t\t\tconst store = loadStore<EpisodicMemory>(cwd, \"episodic.json\");\r\n\t\t\tif (store.memories.length > 0) {\r\n\t\t\t\tresults.push(\"=== Episodic Memories ===\");\r\n\t\t\t\tresults.push(...store.memories.map(formatEpisodicForDisplay));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (type === \"all\" || type === \"semantic\") {\r\n\t\t\tconst store = loadStore<SemanticMemory>(cwd, \"semantic.json\");\r\n\t\t\tif (store.memories.length > 0) {\r\n\t\t\t\tresults.push(\"=== Semantic Memories ===\");\r\n\t\t\t\tresults.push(...store.memories.map(formatSemanticForDisplay));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (results.length === 0) {\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: \"No memories stored yet.\" }],\r\n\t\t\t\tdetails: { count: 0 },\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\\n\") }],\r\n\t\t\tdetails: { count: results.length },\r\n\t\t};\r\n\t},\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_update\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryUpdateTool: AgentTool<typeof memoryUpdateSchema> = {\r\n\tname: \"memory_update\",\r\n\tlabel: \"Update Memory\",\r\n\tdescription:\r\n\t\t\"Update an existing memory. Use this when the user confirms a change to a \" +\r\n\t\t\"previously stored preference, procedure step, or fact. Always ask for \" +\r\n\t\t\"confirmation before updating if there is a conflict.\",\r\n\tparameters: memoryUpdateSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryUpdateInput) => {\r\n\t\tconst { cwd } = memoryContext;\r\n\r\n\t\tconst procStore = loadStore<ProceduralMemory>(cwd, \"procedural.json\");\r\n\t\tconst proc = procStore.memories.find((m) => m.id === params.id);\r\n\t\tif (proc) {\r\n\t\t\tif (params.steps) proc.steps = params.steps;\r\n\t\t\tif (params.trigger) proc.trigger = params.trigger;\r\n\t\t\tif (params.tags) proc.tags = params.tags;\r\n\t\t\tproc.updated = nowISO();\r\n\t\t\tsaveStore(cwd, \"procedural.json\", procStore);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Updated procedural memory [${params.id}].` }],\r\n\t\t\t\tdetails: { updated: true },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst semStore = loadStore<SemanticMemory>(cwd, \"semantic.json\");\r\n\t\tconst sem = semStore.memories.find((m) => m.id === params.id);\r\n\t\tif (sem) {\r\n\t\t\tif (params.text) sem.text = params.text;\r\n\t\t\tif (params.tags) sem.tags = params.tags;\r\n\t\t\tsaveStore(cwd, \"semantic.json\", semStore);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Updated semantic memory [${params.id}].` }],\r\n\t\t\t\tdetails: { updated: true },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst epStore = loadStore<EpisodicMemory>(cwd, \"episodic.json\");\r\n\t\tconst ep = epStore.memories.find((m) => m.id === params.id);\r\n\t\tif (ep) {\r\n\t\t\tif (params.tags) ep.tags = params.tags;\r\n\t\t\tsaveStore(cwd, \"episodic.json\", epStore);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Updated episodic memory [${params.id}].` }],\r\n\t\t\t\tdetails: { updated: true },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: `No memory found with ID \"${params.id}\".` }],\r\n\t\t\tdetails: { updated: false },\r\n\t\t};\r\n\t},\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_delete\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryDeleteTool: AgentTool<typeof memoryDeleteSchema> = {\r\n\tname: \"memory_delete\",\r\n\tlabel: \"Delete Memory\",\r\n\tdescription:\r\n\t\t\"Delete a specific memory by ID. Use this when the user asks to remove a memory \" +\r\n\t\t\"or when a memory is confirmed to be outdated.\",\r\n\tparameters: memoryDeleteSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryDeleteInput) => {\r\n\t\tconst { cwd } = memoryContext;\r\n\t\tconst files = [\"procedural.json\", \"episodic.json\", \"semantic.json\"] as const;\r\n\r\n\t\tfor (const file of files) {\r\n\t\t\tconst store = loadStore<{ id: string }>(cwd, file);\r\n\t\t\tconst idx = store.memories.findIndex((m) => m.id === params.id);\r\n\t\t\tif (idx !== -1) {\r\n\t\t\t\tstore.memories.splice(idx, 1);\r\n\t\t\t\tsaveStore(cwd, file, store);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Deleted memory [${params.id}] from ${file.replace(\".json\", \"\")}.` }],\r\n\t\t\t\t\tdetails: { deleted: true },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: `No memory found with ID \"${params.id}\".` }],\r\n\t\t\tdetails: { deleted: false },\r\n\t\t};\r\n\t},\r\n};\r\n\r\n/** All memory tools */\r\nexport const memoryTools: AgentTool<any>[] = [memoryWriteTool, memoryReadTool, memoryUpdateTool, memoryDeleteTool];\r\n"]}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/core/tools/memory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,EAON,KAAK,WAAW,EAMhB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;CACnB;AAID,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAEjE;AAMD,QAAA,MAAM,iBAAiB;;;;;;;;;;;;EAsBrB,CAAC;AAIH,QAAA,MAAM,gBAAgB;;;;EAIpB,CAAC;AAIH,QAAA,MAAM,kBAAkB;;;;;;EAMtB,CAAC;AAIH,QAAA,MAAM,kBAAkB;;EAEtB,CAAC;AAQH,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,OAAO,iBAAiB,CAuH/D,CAAC;AAMF,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,OAAO,gBAAgB,CAyG7D,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,OAAO,kBAAkB,CAqDjE,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,OAAO,kBAAkB,CA6BjE,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,EAA0E,CAAC","sourcesContent":["/**\r\n * Built-in memory tools: memory_write, memory_read, memory_update, memory_delete\r\n */\r\n\r\nimport type { AgentTool } from \"@mariozechner/pi-agent-core\";\r\nimport { StringEnum } from \"@mariozechner/pi-ai\";\r\nimport { type Static, Type } from \"@sinclair/typebox\";\r\nimport {\r\n\ttype EpisodicMemory,\r\n\tformatEpisodicForDisplay,\r\n\tformatProceduralForDisplay,\r\n\tformatSemanticForDisplay,\r\n\tgenerateId,\r\n\tloadStore,\r\n\ttype MemoryScope,\r\n\tnowISO,\r\n\ttype ProceduralMemory,\r\n\ttype SemanticMemory,\r\n\tsaveStore,\r\n\tsearchMemories,\r\n} from \"../memory.js\";\r\n\r\nexport interface MemoryToolContext {\r\n\tcwd: string;\r\n\tsessionId: string;\r\n\tscope: MemoryScope;\r\n}\r\n\r\nlet memoryContext: MemoryToolContext = { cwd: process.cwd(), sessionId: `session_${Date.now()}`, scope: \"global\" };\r\n\r\nexport function setMemoryToolContext(ctx: MemoryToolContext): void {\r\n\tmemoryContext = ctx;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Schemas\r\n// ---------------------------------------------------------------------------\r\n\r\nconst memoryWriteSchema = Type.Object({\r\n\ttype: StringEnum([\"procedural\", \"episodic\", \"semantic\"] as const),\r\n\tname: Type.Optional(Type.String({ description: \"Name for procedural memories (e.g., 'deploy-service')\" })),\r\n\ttrigger: Type.Optional(\r\n\t\tType.String({ description: \"When to invoke this procedure (e.g., 'user asks to deploy a service')\" }),\r\n\t),\r\n\tsteps: Type.Optional(Type.Array(Type.String(), { description: \"Steps for procedural memory\" })),\r\n\tsummary: Type.Optional(Type.String({ description: \"Summary for episodic memory\" })),\r\n\tdetails: Type.Optional(Type.Array(Type.String(), { description: \"Details for episodic memory\" })),\r\n\tcategory: Type.Optional(\r\n\t\tStringEnum([\"preference\", \"architecture\", \"convention\", \"fact\"] as const, {\r\n\t\t\tdescription: \"Category for semantic memory\",\r\n\t\t}),\r\n\t),\r\n\ttext: Type.Optional(Type.String({ description: \"Text content for semantic memory\" })),\r\n\ttags: Type.Optional(Type.Array(Type.String(), { description: \"Tags for searchability\" })),\r\n\treflection_mistakes: Type.Optional(\r\n\t\tType.Array(Type.String(), { description: \"Mistakes made (for episodic reflection)\" }),\r\n\t),\r\n\treflection_lessons: Type.Optional(\r\n\t\tType.Array(Type.String(), { description: \"Lessons learned (for episodic reflection)\" }),\r\n\t),\r\n});\r\n\r\ntype MemoryWriteInput = Static<typeof memoryWriteSchema>;\r\n\r\nconst memoryReadSchema = Type.Object({\r\n\ttype: Type.Optional(StringEnum([\"procedural\", \"episodic\", \"semantic\", \"all\"] as const)),\r\n\tid: Type.Optional(Type.String({ description: \"Specific memory ID to retrieve\" })),\r\n\tquery: Type.Optional(Type.String({ description: \"Search query to find relevant memories\" })),\r\n});\r\n\r\ntype MemoryReadInput = Static<typeof memoryReadSchema>;\r\n\r\nconst memoryUpdateSchema = Type.Object({\r\n\tid: Type.String({ description: \"Memory ID to update\" }),\r\n\ttext: Type.Optional(Type.String({ description: \"New text (for semantic memories)\" })),\r\n\tsteps: Type.Optional(Type.Array(Type.String(), { description: \"New steps (for procedural memories)\" })),\r\n\ttrigger: Type.Optional(Type.String({ description: \"New trigger (for procedural memories)\" })),\r\n\ttags: Type.Optional(Type.Array(Type.String(), { description: \"Replace tags\" })),\r\n});\r\n\r\ntype MemoryUpdateInput = Static<typeof memoryUpdateSchema>;\r\n\r\nconst memoryDeleteSchema = Type.Object({\r\n\tid: Type.String({ description: \"Memory ID to delete (e.g., 'proc_001', 'sem_003')\" }),\r\n});\r\n\r\ntype MemoryDeleteInput = Static<typeof memoryDeleteSchema>;\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_write\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryWriteTool: AgentTool<typeof memoryWriteSchema> = {\r\n\tname: \"memory_write\",\r\n\tlabel: \"Write Memory\",\r\n\tdescription:\r\n\t\t\"Save a memory to the persistent memory system. Use this automatically when: \" +\r\n\t\t\"(1) the user teaches you a multi-step workflow — save as 'procedural', \" +\r\n\t\t\"(2) the user states a preference, rule, or fact — save as 'semantic', \" +\r\n\t\t\"(3) a significant task completes — save as 'episodic'. \" +\r\n\t\t\"Do NOT ask the user for permission to save unless there is a conflict with an existing memory.\",\r\n\tparameters: memoryWriteSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryWriteInput) => {\r\n\t\tconst { cwd, sessionId, scope } = memoryContext;\r\n\t\tconst tags = params.tags ?? [];\r\n\r\n\t\tif (params.type === \"procedural\") {\r\n\t\t\tif (!params.name || !params.trigger || !params.steps?.length) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: procedural memory requires name, trigger, and steps.\" }],\r\n\t\t\t\t\tdetails: {},\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst store = loadStore<ProceduralMemory>(cwd, \"procedural.json\", scope);\r\n\t\t\tconst existing = store.memories.find((m) => m.name === params.name);\r\n\t\t\tif (existing) {\r\n\t\t\t\texisting.steps = params.steps;\r\n\t\t\t\texisting.trigger = params.trigger;\r\n\t\t\t\texisting.tags = [...new Set([...existing.tags, ...tags])];\r\n\t\t\t\texisting.updated = nowISO();\r\n\t\t\t\tsaveStore(cwd, \"procedural.json\", store, scope);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Updated procedural memory [${existing.id}] \"${params.name}\".` }],\r\n\t\t\t\t\tdetails: { action: \"updated\", id: existing.id },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst id = generateId(\"proc\", store);\r\n\t\t\tstore.memories.push({\r\n\t\t\t\tid,\r\n\t\t\t\tname: params.name,\r\n\t\t\t\ttrigger: params.trigger,\r\n\t\t\t\tsteps: params.steps,\r\n\t\t\t\ttags,\r\n\t\t\t\tcreated: nowISO(),\r\n\t\t\t\tupdated: nowISO(),\r\n\t\t\t\tsourceSession: sessionId,\r\n\t\t\t});\r\n\t\t\tsaveStore(cwd, \"procedural.json\", store, scope);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Saved procedural memory [${id}] \"${params.name}\".` }],\r\n\t\t\t\tdetails: { action: \"created\", id },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (params.type === \"episodic\") {\r\n\t\t\tif (!params.summary) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: episodic memory requires a summary.\" }],\r\n\t\t\t\t\tdetails: {},\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst store = loadStore<EpisodicMemory>(cwd, \"episodic.json\", scope);\r\n\t\t\tconst id = generateId(\"ep\", store);\r\n\t\t\tconst reflection =\r\n\t\t\t\tparams.reflection_mistakes?.length || params.reflection_lessons?.length\r\n\t\t\t\t\t? { mistakes: params.reflection_mistakes ?? [], lessons: params.reflection_lessons ?? [] }\r\n\t\t\t\t\t: undefined;\r\n\t\t\tstore.memories.push({\r\n\t\t\t\tid,\r\n\t\t\t\tsummary: params.summary,\r\n\t\t\t\tdetails: params.details ?? [],\r\n\t\t\t\treflection,\r\n\t\t\t\ttags,\r\n\t\t\t\tdate: new Date().toISOString().split(\"T\")[0],\r\n\t\t\t\tsourceSession: sessionId,\r\n\t\t\t});\r\n\t\t\tsaveStore(cwd, \"episodic.json\", store, scope);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Saved episodic memory [${id}] \"${params.summary}\".` }],\r\n\t\t\t\tdetails: { action: \"created\", id },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (params.type === \"semantic\") {\r\n\t\t\tif (!params.text || !params.category) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Error: semantic memory requires text and category.\" }],\r\n\t\t\t\t\tdetails: {},\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst store = loadStore<SemanticMemory>(cwd, \"semantic.json\", scope);\r\n\t\t\tconst existing = store.memories.find(\r\n\t\t\t\t(m) => m.category === params.category && m.text.toLowerCase() === params.text!.toLowerCase(),\r\n\t\t\t);\r\n\t\t\tif (existing) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `This semantic memory already exists [${existing.id}].` }],\r\n\t\t\t\t\tdetails: { action: \"duplicate\", id: existing.id },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\tconst id = generateId(\"sem\", store);\r\n\t\t\tstore.memories.push({\r\n\t\t\t\tid,\r\n\t\t\t\tcategory: params.category,\r\n\t\t\t\ttext: params.text,\r\n\t\t\t\ttags,\r\n\t\t\t\tcreated: nowISO(),\r\n\t\t\t\tsourceSession: sessionId,\r\n\t\t\t});\r\n\t\t\tsaveStore(cwd, \"semantic.json\", store, scope);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Saved semantic memory [${id}] (${params.category}): \"${params.text}\".` }],\r\n\t\t\t\tdetails: { action: \"created\", id },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: `Unknown memory type: ${params.type}` }],\r\n\t\t\tdetails: {},\r\n\t\t};\r\n\t},\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_read\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryReadTool: AgentTool<typeof memoryReadSchema> = {\r\n\tname: \"memory_read\",\r\n\tlabel: \"Read Memory\",\r\n\tdescription:\r\n\t\t\"Read memories from the persistent memory system. Use this when you need to recall \" +\r\n\t\t\"past workflows, user preferences, or what happened in previous sessions. \" +\r\n\t\t\"You can read all memories of a type, a specific memory by ID, or search by query.\",\r\n\tparameters: memoryReadSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryReadInput) => {\r\n\t\tconst { cwd, scope } = memoryContext;\r\n\r\n\t\tif (params.id) {\r\n\t\t\tconst allStores: Array<{ file: string; format: (m: any) => string }> = [\r\n\t\t\t\t{ file: \"procedural.json\", format: formatProceduralForDisplay },\r\n\t\t\t\t{ file: \"episodic.json\", format: formatEpisodicForDisplay },\r\n\t\t\t\t{ file: \"semantic.json\", format: formatSemanticForDisplay },\r\n\t\t\t];\r\n\t\t\tfor (const { file, format } of allStores) {\r\n\t\t\t\tconst store = loadStore<{ id: string }>(cwd, file, scope);\r\n\t\t\t\tconst found = store.memories.find((m) => m.id === params.id);\r\n\t\t\t\tif (found) {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: format(found) }],\r\n\t\t\t\t\t\tdetails: { found: true },\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `No memory found with ID \"${params.id}\".` }],\r\n\t\t\t\tdetails: { found: false },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (params.query) {\r\n\t\t\tconst results: string[] = [];\r\n\t\t\tconst type = params.type ?? \"all\";\r\n\r\n\t\t\tif (type === \"all\" || type === \"procedural\") {\r\n\t\t\t\tconst store = loadStore<ProceduralMemory>(cwd, \"procedural.json\", scope);\r\n\t\t\t\tconst matches = searchMemories(\r\n\t\t\t\t\tstore.memories,\r\n\t\t\t\t\tparams.query,\r\n\t\t\t\t\t(m) => `${m.name} ${m.trigger} ${m.steps.join(\" \")}`,\r\n\t\t\t\t);\r\n\t\t\t\tresults.push(...matches.map(formatProceduralForDisplay));\r\n\t\t\t}\r\n\t\t\tif (type === \"all\" || type === \"episodic\") {\r\n\t\t\t\tconst store = loadStore<EpisodicMemory>(cwd, \"episodic.json\", scope);\r\n\t\t\t\tconst matches = searchMemories(store.memories, params.query, (m) => `${m.summary} ${m.details.join(\" \")}`);\r\n\t\t\t\tresults.push(...matches.map(formatEpisodicForDisplay));\r\n\t\t\t}\r\n\t\t\tif (type === \"all\" || type === \"semantic\") {\r\n\t\t\t\tconst store = loadStore<SemanticMemory>(cwd, \"semantic.json\", scope);\r\n\t\t\t\tconst matches = searchMemories(store.memories, params.query, (m) => `${m.category} ${m.text}`);\r\n\t\t\t\tresults.push(...matches.map(formatSemanticForDisplay));\r\n\t\t\t}\r\n\r\n\t\t\tif (results.length === 0) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `No memories found matching \"${params.query}\".` }],\r\n\t\t\t\t\tdetails: { count: 0 },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\\n\") }],\r\n\t\t\t\tdetails: { count: results.length },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst type = params.type ?? \"all\";\r\n\t\tconst results: string[] = [];\r\n\r\n\t\tif (type === \"all\" || type === \"procedural\") {\r\n\t\t\tconst store = loadStore<ProceduralMemory>(cwd, \"procedural.json\", scope);\r\n\t\t\tif (store.memories.length > 0) {\r\n\t\t\t\tresults.push(\"=== Procedural Memories ===\");\r\n\t\t\t\tresults.push(...store.memories.map(formatProceduralForDisplay));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (type === \"all\" || type === \"episodic\") {\r\n\t\t\tconst store = loadStore<EpisodicMemory>(cwd, \"episodic.json\", scope);\r\n\t\t\tif (store.memories.length > 0) {\r\n\t\t\t\tresults.push(\"=== Episodic Memories ===\");\r\n\t\t\t\tresults.push(...store.memories.map(formatEpisodicForDisplay));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (type === \"all\" || type === \"semantic\") {\r\n\t\t\tconst store = loadStore<SemanticMemory>(cwd, \"semantic.json\", scope);\r\n\t\t\tif (store.memories.length > 0) {\r\n\t\t\t\tresults.push(\"=== Semantic Memories ===\");\r\n\t\t\t\tresults.push(...store.memories.map(formatSemanticForDisplay));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (results.length === 0) {\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: \"No memories stored yet.\" }],\r\n\t\t\t\tdetails: { count: 0 },\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: results.join(\"\\n\\n\") }],\r\n\t\t\tdetails: { count: results.length },\r\n\t\t};\r\n\t},\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_update\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryUpdateTool: AgentTool<typeof memoryUpdateSchema> = {\r\n\tname: \"memory_update\",\r\n\tlabel: \"Update Memory\",\r\n\tdescription:\r\n\t\t\"Update an existing memory. Use this when the user confirms a change to a \" +\r\n\t\t\"previously stored preference, procedure step, or fact. Always ask for \" +\r\n\t\t\"confirmation before updating if there is a conflict.\",\r\n\tparameters: memoryUpdateSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryUpdateInput) => {\r\n\t\tconst { cwd, scope } = memoryContext;\r\n\r\n\t\tconst procStore = loadStore<ProceduralMemory>(cwd, \"procedural.json\", scope);\r\n\t\tconst proc = procStore.memories.find((m) => m.id === params.id);\r\n\t\tif (proc) {\r\n\t\t\tif (params.steps) proc.steps = params.steps;\r\n\t\t\tif (params.trigger) proc.trigger = params.trigger;\r\n\t\t\tif (params.tags) proc.tags = params.tags;\r\n\t\t\tproc.updated = nowISO();\r\n\t\t\tsaveStore(cwd, \"procedural.json\", procStore, scope);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Updated procedural memory [${params.id}].` }],\r\n\t\t\t\tdetails: { updated: true },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst semStore = loadStore<SemanticMemory>(cwd, \"semantic.json\", scope);\r\n\t\tconst sem = semStore.memories.find((m) => m.id === params.id);\r\n\t\tif (sem) {\r\n\t\t\tif (params.text) sem.text = params.text;\r\n\t\t\tif (params.tags) sem.tags = params.tags;\r\n\t\t\tsaveStore(cwd, \"semantic.json\", semStore, scope);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Updated semantic memory [${params.id}].` }],\r\n\t\t\t\tdetails: { updated: true },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst epStore = loadStore<EpisodicMemory>(cwd, \"episodic.json\", scope);\r\n\t\tconst ep = epStore.memories.find((m) => m.id === params.id);\r\n\t\tif (ep) {\r\n\t\t\tif (params.tags) ep.tags = params.tags;\r\n\t\t\tsaveStore(cwd, \"episodic.json\", epStore, scope);\r\n\t\t\treturn {\r\n\t\t\t\tcontent: [{ type: \"text\", text: `Updated episodic memory [${params.id}].` }],\r\n\t\t\t\tdetails: { updated: true },\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: `No memory found with ID \"${params.id}\".` }],\r\n\t\t\tdetails: { updated: false },\r\n\t\t};\r\n\t},\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// memory_delete\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const memoryDeleteTool: AgentTool<typeof memoryDeleteSchema> = {\r\n\tname: \"memory_delete\",\r\n\tlabel: \"Delete Memory\",\r\n\tdescription:\r\n\t\t\"Delete a specific memory by ID. Use this when the user asks to remove a memory \" +\r\n\t\t\"or when a memory is confirmed to be outdated.\",\r\n\tparameters: memoryDeleteSchema,\r\n\texecute: async (_toolCallId: string, params: MemoryDeleteInput) => {\r\n\t\tconst { cwd, scope } = memoryContext;\r\n\t\tconst files = [\"procedural.json\", \"episodic.json\", \"semantic.json\"] as const;\r\n\r\n\t\tfor (const file of files) {\r\n\t\t\tconst store = loadStore<{ id: string }>(cwd, file, scope);\r\n\t\t\tconst idx = store.memories.findIndex((m) => m.id === params.id);\r\n\t\t\tif (idx !== -1) {\r\n\t\t\t\tstore.memories.splice(idx, 1);\r\n\t\t\t\tsaveStore(cwd, file, store, scope);\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Deleted memory [${params.id}] from ${file.replace(\".json\", \"\")}.` }],\r\n\t\t\t\t\tdetails: { deleted: true },\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcontent: [{ type: \"text\", text: `No memory found with ID \"${params.id}\".` }],\r\n\t\t\tdetails: { deleted: false },\r\n\t\t};\r\n\t},\r\n};\r\n\r\n/** All memory tools */\r\nexport const memoryTools: AgentTool<any>[] = [memoryWriteTool, memoryReadTool, memoryUpdateTool, memoryDeleteTool];\r\n"]}