@fleetagent/pi-coding-agent 0.0.1 → 0.0.2

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 (118) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/core/agent-session.d.ts +5 -5
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +8 -11
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  7. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  8. package/dist/core/compaction/branch-summarization.js.map +1 -1
  9. package/dist/core/compaction/compaction.d.ts +2 -2
  10. package/dist/core/compaction/compaction.d.ts.map +1 -1
  11. package/dist/core/compaction/compaction.js +1 -1
  12. package/dist/core/compaction/compaction.js.map +1 -1
  13. package/dist/core/extensions/runner.d.ts +3 -3
  14. package/dist/core/extensions/runner.d.ts.map +1 -1
  15. package/dist/core/extensions/runner.js +5 -5
  16. package/dist/core/extensions/runner.js.map +1 -1
  17. package/dist/core/extensions/types.d.ts +15 -8
  18. package/dist/core/extensions/types.d.ts.map +1 -1
  19. package/dist/core/extensions/types.js.map +1 -1
  20. package/dist/core/footer-data-provider.d.ts +1 -1
  21. package/dist/core/footer-data-provider.d.ts.map +1 -1
  22. package/dist/core/footer-data-provider.js +1 -1
  23. package/dist/core/footer-data-provider.js.map +1 -1
  24. package/dist/core/pi-agent.d.ts +5 -3
  25. package/dist/core/pi-agent.d.ts.map +1 -1
  26. package/dist/core/pi-agent.js +64 -18
  27. package/dist/core/pi-agent.js.map +1 -1
  28. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
  29. package/dist/core/session/in-memory-session-manager.js +5 -7
  30. package/dist/core/session/in-memory-session-manager.js.map +1 -1
  31. package/dist/core/session/in-memory-session.d.ts +3 -1
  32. package/dist/core/session/in-memory-session.d.ts.map +1 -1
  33. package/dist/core/session/in-memory-session.js +5 -2
  34. package/dist/core/session/in-memory-session.js.map +1 -1
  35. package/dist/core/session/index.d.ts +2 -2
  36. package/dist/core/session/index.d.ts.map +1 -1
  37. package/dist/core/session/index.js.map +1 -1
  38. package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
  39. package/dist/core/session/jsonl-helpers.js +4 -4
  40. package/dist/core/session/jsonl-helpers.js.map +1 -1
  41. package/dist/core/session/local-session-manager.d.ts.map +1 -1
  42. package/dist/core/session/local-session-manager.js +12 -11
  43. package/dist/core/session/local-session-manager.js.map +1 -1
  44. package/dist/core/session/local-session.d.ts +3 -1
  45. package/dist/core/session/local-session.d.ts.map +1 -1
  46. package/dist/core/session/local-session.js +7 -2
  47. package/dist/core/session/local-session.js.map +1 -1
  48. package/dist/core/session/remote-session-client.d.ts +6 -1
  49. package/dist/core/session/remote-session-client.d.ts.map +1 -1
  50. package/dist/core/session/remote-session-client.js.map +1 -1
  51. package/dist/core/session/remote-session-manager.d.ts.map +1 -1
  52. package/dist/core/session/remote-session-manager.js +28 -7
  53. package/dist/core/session/remote-session-manager.js.map +1 -1
  54. package/dist/core/session/remote-session.d.ts +3 -0
  55. package/dist/core/session/remote-session.d.ts.map +1 -1
  56. package/dist/core/session/remote-session.js +4 -1
  57. package/dist/core/session/remote-session.js.map +1 -1
  58. package/dist/core/session/session.d.ts +9 -3
  59. package/dist/core/session/session.d.ts.map +1 -1
  60. package/dist/core/session/session.js +64 -10
  61. package/dist/core/session/session.js.map +1 -1
  62. package/dist/core/session/stores/in-memory-session-store.d.ts +6 -14
  63. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
  64. package/dist/core/session/stores/in-memory-session-store.js +8 -34
  65. package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
  66. package/dist/core/session/stores/jsonl-session-store.d.ts +14 -14
  67. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
  68. package/dist/core/session/stores/jsonl-session-store.js +153 -162
  69. package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
  70. package/dist/core/session/stores/remote-session-store.d.ts +4 -6
  71. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
  72. package/dist/core/session/stores/remote-session-store.js +18 -30
  73. package/dist/core/session/stores/remote-session-store.js.map +1 -1
  74. package/dist/core/session/stores/session-store.d.ts +1 -15
  75. package/dist/core/session/stores/session-store.d.ts.map +1 -1
  76. package/dist/core/session/stores/session-store.js.map +1 -1
  77. package/dist/core/session-cwd.d.ts +2 -2
  78. package/dist/core/session-cwd.d.ts.map +1 -1
  79. package/dist/core/session-cwd.js +5 -5
  80. package/dist/core/session-cwd.js.map +1 -1
  81. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  82. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  83. package/dist/modes/interactive/interactive-mode.js +39 -37
  84. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  85. package/docs/extensions.md +35 -32
  86. package/docs/index.md +1 -1
  87. package/docs/sdk.md +2 -0
  88. package/docs/session-format.md +21 -21
  89. package/docs/sessions.md +2 -2
  90. package/docs/tui.md +1 -1
  91. package/examples/README.md +3 -0
  92. package/examples/extensions/README.md +1 -1
  93. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  94. package/examples/extensions/bookmark.ts +3 -3
  95. package/examples/extensions/confirm-destructive.ts +1 -1
  96. package/examples/extensions/custom-compaction.ts +1 -1
  97. package/examples/extensions/custom-footer.ts +2 -2
  98. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  99. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  100. package/examples/extensions/git-checkpoint.ts +1 -1
  101. package/examples/extensions/handoff.ts +2 -2
  102. package/examples/extensions/plan-mode/index.ts +1 -1
  103. package/examples/extensions/preset.ts +1 -1
  104. package/examples/extensions/qna.ts +1 -1
  105. package/examples/extensions/sandbox/package.json +1 -1
  106. package/examples/extensions/snake.ts +1 -1
  107. package/examples/extensions/space-invaders.ts +1 -1
  108. package/examples/extensions/summarize.ts +1 -1
  109. package/examples/extensions/tic-tac-toe.ts +1 -1
  110. package/examples/extensions/todo.ts +1 -1
  111. package/examples/extensions/tools.ts +1 -1
  112. package/examples/extensions/with-deps/package.json +1 -1
  113. package/examples/remote-session-server/README.md +66 -0
  114. package/examples/remote-session-server/server.ts +359 -0
  115. package/examples/sdk/11-sessions.ts +3 -3
  116. package/examples/sdk/13-session-runtime.ts +6 -6
  117. package/npm-shrinkwrap.json +12 -12
  118. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"pi-agent.js","sourceRoot":"","sources":["../../src/core/pi-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@fleetagent/pi-agent-core\";\nimport { clampThinkingLevel, type ImageContent, type Message, type Model, streamSimple } from \"@fleetagent/pi-ai\";\nimport chalk from \"chalk\";\nimport { getAgentDir } from \"../config.ts\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"../modes/index.ts\";\nimport { stopThemeWatcher } from \"../modes/interactive/theme/theme.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type {\n\tExtensionRunner,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { restoreStdout, takeOverStdout } from \"./output-guard.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport {\n\tgetDefaultSessionDir,\n\tLocalSessionManager,\n\ttype Session,\n\ttype SessionInfo,\n\ttype SessionManager,\n} from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\nimport { printTimings, time } from \"./timings.ts\";\nimport type { ToolName } from \"./tools/index.ts\";\n\nexport interface PiAgentDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\nexport interface PiAgentServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: PiAgentDiagnostic[];\n}\n\nexport interface PiAgentSessionOptions {\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\tnoTools?: \"all\" | \"builtin\";\n\tcustomTools?: ToolDefinition[];\n}\n\nexport interface ResolvePiAgentSessionOptionsContext {\n\tservices: PiAgentServices;\n\tsession: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport interface ResolvePiAgentSessionOptionsResult extends PiAgentSessionOptions {\n\tdiagnostics?: PiAgentDiagnostic[];\n}\n\nexport interface CreatePiAgentOptions extends PiAgentSessionOptions {\n\t/** Runtime mode. Default: embedded SDK usage. */\n\tmode?: PiAgentAppMode;\n\tcwd?: string;\n\tagentDir?: string;\n\t/** Session lifecycle/discovery backend. Default: local JSONL sessions for cwd. */\n\tsessionManager?: SessionManager;\n\t/** Shared auth storage reused across runtime recreation. */\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoader?: ResourceLoader;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresolveSessionOptions?: (\n\t\tcontext: ResolvePiAgentSessionOptionsContext,\n\t) => Promise<ResolvePiAgentSessionOptionsResult> | ResolvePiAgentSessionOptionsResult;\n}\n\nexport interface CreatePiAgentSessionOptions {\n\t/** Initial active conversation state. Default: sessionManager.create(). */\n\tsession?: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport type PiAgentAppMode = \"embedded\" | \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface RunPiAgentModeOptions {\n\tmode?: PiAgentAppMode;\n\tmigratedProviders?: string[];\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n\tinitialMessages?: string[];\n\tverbose?: boolean;\n\tstartupBenchmark?: boolean;\n}\n\nexport interface PiAgentRuntimeHost {\n\treadonly services: PiAgentServices;\n\treadonly session: AgentSession;\n\treadonly diagnostics: readonly PiAgentDiagnostic[];\n\treadonly modelFallbackMessage: string | undefined;\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void;\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void;\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\tnewSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }>;\n\timportFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }>;\n\tdispose(): Promise<void>;\n}\n\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction getAttributionHeaders(\n\tmodel: Model<any>,\n\tsettingsManager: SettingsManager,\n): Record<string, string> | undefined {\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (model.provider === \"openrouter\" || model.baseUrl.includes(\"openrouter.ai\")) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://pi.dev\",\n\t\t\t\"X-OpenRouter-Title\": \"pi\",\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmodel.baseUrl.includes(\"api.cloudflare.com\") ||\n\t\tmodel.baseUrl.includes(\"gateway.ai.cloudflare.com\")\n\t) {\n\t\treturn {\n\t\t\t\"User-Agent\": \"pi-coding-agent\",\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): PiAgentDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: PiAgentDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Application-level composition root for pi's coding agent runtime.\n *\n * PiAgent owns common app services, the session lifecycle backend, and the\n * current active AgentSession. Conversation behavior stays in AgentSession;\n * session lifecycle/discovery stays in SessionManager implementations.\n */\nexport class PiAgent {\n\tprivate readonly initialCwd: string;\n\treadonly agentDir: string;\n\treadonly sessionManager: SessionManager;\n\treadonly authStorage: AuthStorage;\n\n\tprivate readonly options: CreatePiAgentOptions;\n\tprivate _mode: PiAgentAppMode;\n\tprivate _session?: AgentSession;\n\tprivate _services?: PiAgentServices;\n\tprivate _diagnostics: PiAgentDiagnostic[] = [];\n\tprivate _modelFallbackMessage?: string;\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\n\tprivate constructor(\n\t\toptions: CreatePiAgentOptions,\n\t\tresolved: {\n\t\t\tcwd: string;\n\t\t\tagentDir: string;\n\t\t\tsessionManager: SessionManager;\n\t\t\tauthStorage: AuthStorage;\n\t\t},\n\t) {\n\t\tthis.options = options;\n\t\tthis._mode = options.mode ?? \"embedded\";\n\t\tthis.initialCwd = resolved.cwd;\n\t\tthis.agentDir = resolved.agentDir;\n\t\tthis.sessionManager = resolved.sessionManager;\n\t\tthis.authStorage = resolved.authStorage;\n\t}\n\n\tstatic setupStdio(options: { mode: PiAgentAppMode }): void {\n\t\tif (options.mode !== \"embedded\" && options.mode !== \"interactive\") {\n\t\t\ttakeOverStdout();\n\t\t}\n\t}\n\n\tstatic async create(options: CreatePiAgentOptions = {}): Promise<PiAgent> {\n\t\tconst cwd = options.cwd ?? process.cwd();\n\t\tconst agentDir = options.agentDir ?? getAgentDir();\n\t\tconst sessionManager =\n\t\t\toptions.sessionManager ?? new LocalSessionManager({ cwd, sessionDir: getDefaultSessionDir(cwd, agentDir) });\n\t\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\t\treturn new PiAgent(options, { cwd, agentDir, sessionManager, authStorage });\n\t}\n\n\tget mode(): PiAgentAppMode {\n\t\treturn this._mode;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services?.cwd ?? this.initialCwd;\n\t}\n\n\tasync readPipedStdin(): Promise<string | undefined> {\n\t\tif (this._mode === \"embedded\" || this._mode === \"rpc\" || process.stdin.isTTY) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst stdinContent = await new Promise<string | undefined>((resolve) => {\n\t\t\tlet data = \"\";\n\t\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\t\tdata += chunk;\n\t\t\t});\n\t\t\tprocess.stdin.on(\"end\", () => {\n\t\t\t\tresolve(data.trim() || undefined);\n\t\t\t});\n\t\t\tprocess.stdin.resume();\n\t\t});\n\n\t\tif (stdinContent !== undefined && this._mode === \"interactive\") {\n\t\t\tthis._mode = \"print\";\n\t\t}\n\t\treturn stdinContent;\n\t}\n\n\tprivate async createServices(cwd: string): Promise<PiAgentServices> {\n\t\tconst settingsManager = this.options.settingsManager ?? SettingsManager.create(cwd, this.agentDir);\n\t\tconst modelRegistry =\n\t\t\tthis.options.modelRegistry ?? ModelRegistry.create(this.authStorage, join(this.agentDir, \"models.json\"));\n\t\tconst resourceLoader =\n\t\t\tthis.options.resourceLoader ??\n\t\t\tnew DefaultResourceLoader({\n\t\t\t\t...(this.options.resourceLoaderOptions ?? {}),\n\t\t\t\tcwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\tconst diagnostics: PiAgentDiagnostic[] = [];\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t\ttry {\n\t\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\textensionsResult.runtime.pendingProviderRegistrations = [];\n\t\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, this.options.extensionFlagValues));\n\n\t\treturn {\n\t\t\tcwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tauthStorage: this.authStorage,\n\t\t\tsettingsManager,\n\t\t\tmodelRegistry,\n\t\t\tresourceLoader,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async buildAgentSession(\n\t\tactiveSession: Session,\n\t\tsessionStartEvent?: SessionStartEvent,\n\t): Promise<{\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}> {\n\t\tconst services = await this.createServices(activeSession.getCwd());\n\t\tconst diagnostics: PiAgentDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...services.resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\t\tconst resolvedOptions =\n\t\t\t(await this.options.resolveSessionOptions?.({ services, session: activeSession, sessionStartEvent })) ?? {};\n\t\tdiagnostics.push(...(resolvedOptions.diagnostics ?? []));\n\t\tconst sessionOptions: PiAgentSessionOptions = {\n\t\t\tmodel: resolvedOptions.model ?? this.options.model,\n\t\t\tthinkingLevel: resolvedOptions.thinkingLevel ?? this.options.thinkingLevel,\n\t\t\tscopedModels: resolvedOptions.scopedModels ?? this.options.scopedModels,\n\t\t\ttools: resolvedOptions.tools ?? this.options.tools,\n\t\t\tnoTools: resolvedOptions.noTools ?? this.options.noTools,\n\t\t\tcustomTools: resolvedOptions.customTools ?? this.options.customTools,\n\t\t};\n\n\t\tconst existingSession = activeSession.buildSessionContext();\n\t\tconst hasExistingSession = existingSession.messages.length > 0;\n\t\tconst hasThinkingEntry = activeSession.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\t\tlet model = sessionOptions.model;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (model) {\n\t\t\tmodel = services.modelRegistry.find(model.provider, model.id) ?? model;\n\t\t}\n\n\t\tif (!model && hasExistingSession && existingSession.model) {\n\t\t\tconst restoredModel = services.modelRegistry.find(\n\t\t\t\texistingSession.model.provider,\n\t\t\t\texistingSession.model.modelId,\n\t\t\t);\n\t\t\tif (restoredModel && services.modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\t}\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: services.settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: services.settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: services.settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t\t} else if (modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = sessionOptions.thinkingLevel;\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\t\tthinkingLevel = model ? (clampThinkingLevel(model, thinkingLevel) as ThinkingLevel) : \"off\";\n\n\t\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst allowedToolNames = sessionOptions.tools ?? (sessionOptions.noTools === \"all\" ? [] : undefined);\n\t\tconst initialActiveToolNames: string[] = sessionOptions.tools\n\t\t\t? [...sessionOptions.tools]\n\t\t\t: sessionOptions.noTools\n\t\t\t\t? []\n\t\t\t\t: defaultActiveToolNames;\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!services.settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: async (model, context, options) => {\n\t\t\t\tconst auth = await services.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = services.settingsManager.getProviderRetrySettings();\n\t\t\t\tconst attributionHeaders = getAttributionHeaders(model, services.settingsManager);\n\t\t\t\treturn streamSimple(model, context, {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders:\n\t\t\t\t\t\tattributionHeaders || auth.headers || options?.headers\n\t\t\t\t\t\t\t? { ...attributionHeaders, ...auth.headers, ...options?.headers }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonPayload: async (payload) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: activeSession.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\treturn runner ? runner.emitContext(messages) : messages;\n\t\t\t},\n\t\t\tsteeringMode: services.settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: services.settingsManager.getFollowUpMode(),\n\t\t\ttransport: services.settingsManager.getTransport(),\n\t\t\tthinkingBudgets: services.settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: services.settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tactiveSession.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\tsession: new AgentSession({\n\t\t\t\tagent,\n\t\t\t\tsession: activeSession,\n\t\t\t\tsettingsManager: services.settingsManager,\n\t\t\t\tcwd: services.cwd,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\tresourceLoader: services.resourceLoader,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t\tinitialActiveToolNames,\n\t\t\t\tallowedToolNames,\n\t\t\t\textensionRunnerRef,\n\t\t\t\tsessionStartEvent,\n\t\t\t}),\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t}\n\n\tprivate apply(result: {\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t}\n\n\tasync createAgentSession(options: CreatePiAgentSessionOptions = {}): Promise<AgentSession> {\n\t\tconst initialSession = options.session ?? (await this.sessionManager.create());\n\t\tassertSessionCwdExists(initialSession, initialSession.getCwd());\n\t\tthis.apply(await this.buildAgentSession(initialSession, options.sessionStartEvent));\n\t\treturn this.session;\n\t}\n\n\tget runtime(): PiAgent {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tget services(): PiAgentServices {\n\t\tif (!this._services) {\n\t\t\tthrow new Error(\"PiAgent services have not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._session;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget settingsManager(): SettingsManager {\n\t\treturn this.services.settingsManager;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this.services.modelRegistry;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this.services.resourceLoader;\n\t}\n\n\tget diagnostics(): readonly PiAgentDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget currentCwd(): string {\n\t\treturn this.services.cwd;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionFile?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionFile,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async flushActiveSession(): Promise<void> {\n\t\tconst flushPendingSync = (this.session.session as { flushPendingSync?: () => Promise<void> }).flushPendingSync;\n\t\tif (flushPendingSync) {\n\t\t\tawait flushPendingSync.call(this.session.session);\n\t\t}\n\t}\n\n\tprivate async teardownCurrent(reason: SessionShutdownEvent[\"reason\"], targetSessionFile?: string): Promise<void> {\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason,\n\t\t\ttargetSessionFile,\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst nextSession = await this.sessionManager.openReference(sessionPath, { cwdOverride: options?.cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, { type: \"session_start\", reason: \"resume\", previousSessionFile }),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst nextSession = await this.sessionManager.create({ id: options?.id, parentSession: options?.parentSession });\n\n\t\tawait this.teardownCurrent(\"new\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, { type: \"session_start\", reason: \"new\", previousSessionFile }),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.session);\n\t\t\tthis.session.agent.state.messages = this.session.session.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.session.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst nextSession = await this.sessionManager.forkSession(this.session.session, targetLeafId);\n\t\tawait this.teardownCurrent(\"fork\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, { type: \"session_start\", reason: \"fork\", previousSessionFile }),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", resolvedPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionFile = this.session.sessionFile;\n\t\tconst nextSession = await this.sessionManager.importJsonl(resolvedPath, { cwdOverride: cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, { type: \"session_start\", reason: \"resume\", previousSessionFile }),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync runMode(options: RunPiAgentModeOptions = {}): Promise<void> {\n\t\tconst mode = options.mode ?? this._mode;\n\t\tif (mode === \"embedded\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode !== \"interactive\" && !this.session.model) {\n\t\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.startupBenchmark && mode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (mode === \"rpc\") {\n\t\t\tprintTimings();\n\t\t\tawait runRpcMode(this);\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"interactive\") {\n\t\t\tconst interactiveMode = new InteractiveMode(this, {\n\t\t\t\tmigratedProviders: options.migratedProviders,\n\t\t\t\tmodelFallbackMessage: this.modelFallbackMessage,\n\t\t\t\tinitialMessage: options.initialMessage,\n\t\t\t\tinitialImages: options.initialImages,\n\t\t\t\tinitialMessages: options.initialMessages,\n\t\t\t\tverbose: options.verbose,\n\t\t\t});\n\t\t\tif (options.startupBenchmark) {\n\t\t\t\tawait interactiveMode.init();\n\t\t\t\ttime(\"interactiveMode.init\");\n\t\t\t\tprintTimings();\n\t\t\t\tinteractiveMode.stop();\n\t\t\t\tstopThemeWatcher();\n\t\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprintTimings();\n\t\t\tawait interactiveMode.run();\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(this, {\n\t\t\tmode: mode === \"json\" ? \"json\" : \"text\",\n\t\t\tmessages: options.initialMessages,\n\t\t\tinitialMessage: options.initialMessage,\n\t\t\tinitialImages: options.initialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t}\n\n\tcreateSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.create();\n\t}\n\n\topenSessionReference(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.openReference(reference);\n\t}\n\n\tcontinueRecentSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.continueRecent();\n\t}\n\n\tforkSessionFrom(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.forkFrom(reference);\n\t}\n\n\tasync listSessions(): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.list();\n\t}\n\n\tasync listAllSessions(): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.listAll();\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (!this._session) {\n\t\t\treturn;\n\t\t}\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"quit\",\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t\tthis._session = undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"pi-agent.js","sourceRoot":"","sources":["../../src/core/pi-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@fleetagent/pi-agent-core\";\nimport { clampThinkingLevel, type ImageContent, type Message, type Model, streamSimple } from \"@fleetagent/pi-ai\";\nimport chalk from \"chalk\";\nimport { getAgentDir } from \"../config.ts\";\nimport { InteractiveMode, runPrintMode, runRpcMode } from \"../modes/index.ts\";\nimport { stopThemeWatcher } from \"../modes/interactive/theme/theme.ts\";\nimport { AgentSession } from \"./agent-session.ts\";\nimport { formatNoModelsAvailableMessage } from \"./auth-guidance.ts\";\nimport { AuthStorage } from \"./auth-storage.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type {\n\tExtensionRunner,\n\tReplacedSessionContext,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tToolDefinition,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport { convertToLlm } from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { findInitialModel } from \"./model-resolver.ts\";\nimport { restoreStdout, takeOverStdout } from \"./output-guard.ts\";\nimport { DefaultResourceLoader, type DefaultResourceLoaderOptions, type ResourceLoader } from \"./resource-loader.ts\";\nimport { assertSessionCwdExists } from \"./session-cwd.ts\";\nimport {\n\tgetDefaultSessionDir,\n\tLocalSessionManager,\n\ttype Session,\n\ttype SessionInfo,\n\ttype SessionListProgress,\n\ttype SessionManager,\n} from \"./session-manager.ts\";\nimport { SettingsManager } from \"./settings-manager.ts\";\nimport { isInstallTelemetryEnabled } from \"./telemetry.ts\";\nimport { printTimings, time } from \"./timings.ts\";\nimport type { ToolName } from \"./tools/index.ts\";\n\nexport interface PiAgentDiagnostic {\n\ttype: \"info\" | \"warning\" | \"error\";\n\tmessage: string;\n}\n\nexport interface PiAgentServices {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage: AuthStorage;\n\tsettingsManager: SettingsManager;\n\tmodelRegistry: ModelRegistry;\n\tresourceLoader: ResourceLoader;\n\tdiagnostics: PiAgentDiagnostic[];\n}\n\nexport interface PiAgentSessionOptions {\n\tmodel?: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\ttools?: string[];\n\tnoTools?: \"all\" | \"builtin\";\n\tcustomTools?: ToolDefinition[];\n}\n\nexport interface ResolvePiAgentSessionOptionsContext {\n\tservices: PiAgentServices;\n\tsession: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport interface ResolvePiAgentSessionOptionsResult extends PiAgentSessionOptions {\n\tdiagnostics?: PiAgentDiagnostic[];\n}\n\nexport interface CreatePiAgentOptions extends PiAgentSessionOptions {\n\t/** Runtime mode. Default: embedded SDK usage. */\n\tmode?: PiAgentAppMode;\n\tcwd?: string;\n\tagentDir?: string;\n\t/** Session lifecycle/discovery backend. Default: local JSONL sessions for cwd. */\n\tsessionManager?: SessionManager;\n\t/** Shared auth storage reused across runtime recreation. */\n\tauthStorage?: AuthStorage;\n\tsettingsManager?: SettingsManager;\n\tmodelRegistry?: ModelRegistry;\n\textensionFlagValues?: Map<string, boolean | string>;\n\tresourceLoader?: ResourceLoader;\n\tresourceLoaderOptions?: Omit<DefaultResourceLoaderOptions, \"cwd\" | \"agentDir\" | \"settingsManager\">;\n\tresolveSessionOptions?: (\n\t\tcontext: ResolvePiAgentSessionOptionsContext,\n\t) => Promise<ResolvePiAgentSessionOptionsResult> | ResolvePiAgentSessionOptionsResult;\n}\n\nexport interface CreatePiAgentSessionOptions {\n\t/** Initial active conversation state. Default: sessionManager.create(). */\n\tsession?: Session;\n\tsessionStartEvent?: SessionStartEvent;\n}\n\nexport type PiAgentAppMode = \"embedded\" | \"interactive\" | \"print\" | \"json\" | \"rpc\";\n\nexport interface RunPiAgentModeOptions {\n\tmode?: PiAgentAppMode;\n\tmigratedProviders?: string[];\n\tinitialMessage?: string;\n\tinitialImages?: ImageContent[];\n\tinitialMessages?: string[];\n\tverbose?: boolean;\n\tstartupBenchmark?: boolean;\n}\n\nexport interface PiAgentRuntimeHost {\n\treadonly services: PiAgentServices;\n\treadonly session: AgentSession;\n\treadonly diagnostics: readonly PiAgentDiagnostic[];\n\treadonly modelFallbackMessage: string | undefined;\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void;\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void;\n\tswitchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }>;\n\tnewSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }>;\n\tfork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }>;\n\timportFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }>;\n\tlistSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tlistAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]>;\n\tdispose(): Promise<void>;\n}\n\nexport class SessionImportFileNotFoundError extends Error {\n\treadonly filePath: string;\n\n\tconstructor(filePath: string) {\n\t\tsuper(`File not found: ${filePath}`);\n\t\tthis.name = \"SessionImportFileNotFoundError\";\n\t\tthis.filePath = filePath;\n\t}\n}\n\nfunction extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\n\treturn content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nfunction getAttributionHeaders(\n\tmodel: Model<any>,\n\tsettingsManager: SettingsManager,\n): Record<string, string> | undefined {\n\tif (!isInstallTelemetryEnabled(settingsManager)) {\n\t\treturn undefined;\n\t}\n\n\tif (model.provider === \"openrouter\" || model.baseUrl.includes(\"openrouter.ai\")) {\n\t\treturn {\n\t\t\t\"HTTP-Referer\": \"https://pi.dev\",\n\t\t\t\"X-OpenRouter-Title\": \"pi\",\n\t\t\t\"X-OpenRouter-Categories\": \"cli-agent\",\n\t\t};\n\t}\n\n\tif (\n\t\tmodel.provider === \"cloudflare-workers-ai\" ||\n\t\tmodel.provider === \"cloudflare-ai-gateway\" ||\n\t\tmodel.baseUrl.includes(\"api.cloudflare.com\") ||\n\t\tmodel.baseUrl.includes(\"gateway.ai.cloudflare.com\")\n\t) {\n\t\treturn {\n\t\t\t\"User-Agent\": \"pi-coding-agent\",\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nfunction applyExtensionFlagValues(\n\tresourceLoader: ResourceLoader,\n\textensionFlagValues: Map<string, boolean | string> | undefined,\n): PiAgentDiagnostic[] {\n\tif (!extensionFlagValues) {\n\t\treturn [];\n\t}\n\n\tconst diagnostics: PiAgentDiagnostic[] = [];\n\tconst extensionsResult = resourceLoader.getExtensions();\n\tconst registeredFlags = new Map<string, { type: \"boolean\" | \"string\" }>();\n\tfor (const extension of extensionsResult.extensions) {\n\t\tfor (const [name, flag] of extension.flags) {\n\t\t\tregisteredFlags.set(name, { type: flag.type });\n\t\t}\n\t}\n\n\tconst unknownFlags: string[] = [];\n\tfor (const [name, value] of extensionFlagValues) {\n\t\tconst flag = registeredFlags.get(name);\n\t\tif (!flag) {\n\t\t\tunknownFlags.push(name);\n\t\t\tcontinue;\n\t\t}\n\t\tif (flag.type === \"boolean\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, true);\n\t\t\tcontinue;\n\t\t}\n\t\tif (typeof value === \"string\") {\n\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\tcontinue;\n\t\t}\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Extension flag \"--${name}\" requires a value`,\n\t\t});\n\t}\n\n\tif (unknownFlags.length > 0) {\n\t\tdiagnostics.push({\n\t\t\ttype: \"error\",\n\t\t\tmessage: `Unknown option${unknownFlags.length === 1 ? \"\" : \"s\"}: ${unknownFlags.map((name) => `--${name}`).join(\", \")}`,\n\t\t});\n\t}\n\n\treturn diagnostics;\n}\n\n/**\n * Application-level composition root for pi's coding agent runtime.\n *\n * PiAgent owns common app services, the session lifecycle backend, and the\n * current active AgentSession. Conversation behavior stays in AgentSession;\n * session lifecycle/discovery stays in SessionManager implementations.\n */\nexport class PiAgent {\n\tprivate readonly initialCwd: string;\n\treadonly agentDir: string;\n\treadonly sessionManager: SessionManager;\n\treadonly authStorage: AuthStorage;\n\n\tprivate readonly options: CreatePiAgentOptions;\n\tprivate _mode: PiAgentAppMode;\n\tprivate _session?: AgentSession;\n\tprivate _services?: PiAgentServices;\n\tprivate _diagnostics: PiAgentDiagnostic[] = [];\n\tprivate _modelFallbackMessage?: string;\n\tprivate rebindSession?: (session: AgentSession) => Promise<void>;\n\tprivate beforeSessionInvalidate?: () => void;\n\n\tprivate constructor(\n\t\toptions: CreatePiAgentOptions,\n\t\tresolved: {\n\t\t\tcwd: string;\n\t\t\tagentDir: string;\n\t\t\tsessionManager: SessionManager;\n\t\t\tauthStorage: AuthStorage;\n\t\t},\n\t) {\n\t\tthis.options = options;\n\t\tthis._mode = options.mode ?? \"embedded\";\n\t\tthis.initialCwd = resolved.cwd;\n\t\tthis.agentDir = resolved.agentDir;\n\t\tthis.sessionManager = resolved.sessionManager;\n\t\tthis.authStorage = resolved.authStorage;\n\t}\n\n\tstatic setupStdio(options: { mode: PiAgentAppMode }): void {\n\t\tif (options.mode !== \"embedded\" && options.mode !== \"interactive\") {\n\t\t\ttakeOverStdout();\n\t\t}\n\t}\n\n\tstatic async create(options: CreatePiAgentOptions = {}): Promise<PiAgent> {\n\t\tconst cwd = options.cwd ?? process.cwd();\n\t\tconst agentDir = options.agentDir ?? getAgentDir();\n\t\tconst sessionManager =\n\t\t\toptions.sessionManager ?? new LocalSessionManager({ cwd, sessionDir: getDefaultSessionDir(cwd, agentDir) });\n\t\tconst authStorage = options.authStorage ?? AuthStorage.create(join(agentDir, \"auth.json\"));\n\t\treturn new PiAgent(options, { cwd, agentDir, sessionManager, authStorage });\n\t}\n\n\tget mode(): PiAgentAppMode {\n\t\treturn this._mode;\n\t}\n\n\tget cwd(): string {\n\t\treturn this._services?.cwd ?? this.initialCwd;\n\t}\n\n\tasync readPipedStdin(): Promise<string | undefined> {\n\t\tif (this._mode === \"embedded\" || this._mode === \"rpc\" || process.stdin.isTTY) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst stdinContent = await new Promise<string | undefined>((resolve) => {\n\t\t\tlet data = \"\";\n\t\t\tprocess.stdin.setEncoding(\"utf8\");\n\t\t\tprocess.stdin.on(\"data\", (chunk) => {\n\t\t\t\tdata += chunk;\n\t\t\t});\n\t\t\tprocess.stdin.on(\"end\", () => {\n\t\t\t\tresolve(data.trim() || undefined);\n\t\t\t});\n\t\t\tprocess.stdin.resume();\n\t\t});\n\n\t\tif (stdinContent !== undefined && this._mode === \"interactive\") {\n\t\t\tthis._mode = \"print\";\n\t\t}\n\t\treturn stdinContent;\n\t}\n\n\tprivate async createServices(cwd: string): Promise<PiAgentServices> {\n\t\tconst settingsManager = this.options.settingsManager ?? SettingsManager.create(cwd, this.agentDir);\n\t\tconst modelRegistry =\n\t\t\tthis.options.modelRegistry ?? ModelRegistry.create(this.authStorage, join(this.agentDir, \"models.json\"));\n\t\tconst resourceLoader =\n\t\t\tthis.options.resourceLoader ??\n\t\t\tnew DefaultResourceLoader({\n\t\t\t\t...(this.options.resourceLoaderOptions ?? {}),\n\t\t\t\tcwd,\n\t\t\t\tagentDir: this.agentDir,\n\t\t\t\tsettingsManager,\n\t\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\tconst diagnostics: PiAgentDiagnostic[] = [];\n\t\tconst extensionsResult = resourceLoader.getExtensions();\n\t\tfor (const { name, config, extensionPath } of extensionsResult.runtime.pendingProviderRegistrations) {\n\t\t\ttry {\n\t\t\t\tmodelRegistry.registerProvider(name, config);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tdiagnostics.push({\n\t\t\t\t\ttype: \"error\",\n\t\t\t\t\tmessage: `Extension \"${extensionPath}\" error: ${message}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\textensionsResult.runtime.pendingProviderRegistrations = [];\n\t\tdiagnostics.push(...applyExtensionFlagValues(resourceLoader, this.options.extensionFlagValues));\n\n\t\treturn {\n\t\t\tcwd,\n\t\t\tagentDir: this.agentDir,\n\t\t\tauthStorage: this.authStorage,\n\t\t\tsettingsManager,\n\t\t\tmodelRegistry,\n\t\t\tresourceLoader,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async buildAgentSession(\n\t\tactiveSession: Session,\n\t\tsessionStartEvent?: SessionStartEvent,\n\t): Promise<{\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}> {\n\t\tconst services = await this.createServices(activeSession.getCwd());\n\t\tconst diagnostics: PiAgentDiagnostic[] = [\n\t\t\t...services.diagnostics,\n\t\t\t...services.resourceLoader.getExtensions().errors.map(({ path, error }) => ({\n\t\t\t\ttype: \"error\" as const,\n\t\t\t\tmessage: `Failed to load extension \"${path}\": ${error}`,\n\t\t\t})),\n\t\t];\n\t\tconst resolvedOptions =\n\t\t\t(await this.options.resolveSessionOptions?.({ services, session: activeSession, sessionStartEvent })) ?? {};\n\t\tdiagnostics.push(...(resolvedOptions.diagnostics ?? []));\n\t\tconst sessionOptions: PiAgentSessionOptions = {\n\t\t\tmodel: resolvedOptions.model ?? this.options.model,\n\t\t\tthinkingLevel: resolvedOptions.thinkingLevel ?? this.options.thinkingLevel,\n\t\t\tscopedModels: resolvedOptions.scopedModels ?? this.options.scopedModels,\n\t\t\ttools: resolvedOptions.tools ?? this.options.tools,\n\t\t\tnoTools: resolvedOptions.noTools ?? this.options.noTools,\n\t\t\tcustomTools: resolvedOptions.customTools ?? this.options.customTools,\n\t\t};\n\n\t\tconst existingSession = activeSession.buildSessionContext();\n\t\tconst hasExistingSession = existingSession.messages.length > 0;\n\t\tconst hasThinkingEntry = activeSession.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\t\tlet model = sessionOptions.model;\n\t\tlet modelFallbackMessage: string | undefined;\n\n\t\tif (model) {\n\t\t\tmodel = services.modelRegistry.find(model.provider, model.id) ?? model;\n\t\t}\n\n\t\tif (!model && hasExistingSession && existingSession.model) {\n\t\t\tconst restoredModel = services.modelRegistry.find(\n\t\t\t\texistingSession.model.provider,\n\t\t\t\texistingSession.model.modelId,\n\t\t\t);\n\t\t\tif (restoredModel && services.modelRegistry.hasConfiguredAuth(restoredModel)) {\n\t\t\t\tmodel = restoredModel;\n\t\t\t}\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t\t}\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconst result = await findInitialModel({\n\t\t\t\tscopedModels: [],\n\t\t\t\tisContinuing: hasExistingSession,\n\t\t\t\tdefaultProvider: services.settingsManager.getDefaultProvider(),\n\t\t\t\tdefaultModelId: services.settingsManager.getDefaultModel(),\n\t\t\t\tdefaultThinkingLevel: services.settingsManager.getDefaultThinkingLevel(),\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t});\n\t\t\tmodel = result.model;\n\t\t\tif (!model) {\n\t\t\t\tmodelFallbackMessage = formatNoModelsAvailableMessage();\n\t\t\t} else if (modelFallbackMessage) {\n\t\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t\t}\n\t\t}\n\n\t\tlet thinkingLevel = sessionOptions.thinkingLevel;\n\t\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\t\tthinkingLevel = hasThinkingEntry\n\t\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t\t: (services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t\t}\n\t\tif (thinkingLevel === undefined) {\n\t\t\tthinkingLevel = services.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t\t}\n\t\tthinkingLevel = model ? (clampThinkingLevel(model, thinkingLevel) as ThinkingLevel) : \"off\";\n\n\t\tconst defaultActiveToolNames: ToolName[] = [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst allowedToolNames = sessionOptions.tools ?? (sessionOptions.noTools === \"all\" ? [] : undefined);\n\t\tconst initialActiveToolNames: string[] = sessionOptions.tools\n\t\t\t? [...sessionOptions.tools]\n\t\t\t: sessionOptions.noTools\n\t\t\t\t? []\n\t\t\t\t: defaultActiveToolNames;\n\n\t\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\t\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\t\tconst converted = convertToLlm(messages);\n\t\t\tif (!services.settingsManager.getBlockImages()) {\n\t\t\t\treturn converted;\n\t\t\t}\n\t\t\treturn converted.map((msg) => {\n\t\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\t\tconst content = msg.content;\n\t\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn msg;\n\t\t\t});\n\t\t};\n\n\t\tconst agent = new Agent({\n\t\t\tinitialState: {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel,\n\t\t\t\ttools: [],\n\t\t\t},\n\t\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\t\tstreamFn: async (model, context, options) => {\n\t\t\t\tconst auth = await services.modelRegistry.getApiKeyAndHeaders(model);\n\t\t\t\tif (!auth.ok) {\n\t\t\t\t\tthrow new Error(auth.error);\n\t\t\t\t}\n\t\t\t\tconst providerRetrySettings = services.settingsManager.getProviderRetrySettings();\n\t\t\t\tconst attributionHeaders = getAttributionHeaders(model, services.settingsManager);\n\t\t\t\treturn streamSimple(model, context, {\n\t\t\t\t\t...options,\n\t\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\t\ttimeoutMs: options?.timeoutMs ?? providerRetrySettings.timeoutMs,\n\t\t\t\t\tmaxRetries: options?.maxRetries ?? providerRetrySettings.maxRetries,\n\t\t\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs ?? providerRetrySettings.maxRetryDelayMs,\n\t\t\t\t\theaders:\n\t\t\t\t\t\tattributionHeaders || auth.headers || options?.headers\n\t\t\t\t\t\t\t? { ...attributionHeaders, ...auth.headers, ...options?.headers }\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonPayload: async (payload) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\t\treturn payload;\n\t\t\t\t}\n\t\t\t\treturn runner.emitBeforeProviderRequest(payload);\n\t\t\t},\n\t\t\tonResponse: async (response) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\tif (!runner?.hasHandlers(\"after_provider_response\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait runner.emit({\n\t\t\t\t\ttype: \"after_provider_response\",\n\t\t\t\t\tstatus: response.status,\n\t\t\t\t\theaders: response.headers,\n\t\t\t\t});\n\t\t\t},\n\t\t\tsessionId: activeSession.getSessionId(),\n\t\t\ttransformContext: async (messages) => {\n\t\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\t\treturn runner ? runner.emitContext(messages) : messages;\n\t\t\t},\n\t\t\tsteeringMode: services.settingsManager.getSteeringMode(),\n\t\t\tfollowUpMode: services.settingsManager.getFollowUpMode(),\n\t\t\ttransport: services.settingsManager.getTransport(),\n\t\t\tthinkingBudgets: services.settingsManager.getThinkingBudgets(),\n\t\t\tmaxRetryDelayMs: services.settingsManager.getProviderRetrySettings().maxRetryDelayMs,\n\t\t});\n\n\t\tif (hasExistingSession) {\n\t\t\tagent.state.messages = existingSession.messages;\n\t\t\tif (!hasThinkingEntry) {\n\t\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t\t}\n\t\t} else {\n\t\t\tif (model) {\n\t\t\t\tactiveSession.appendModelChange(model.provider, model.id);\n\t\t\t}\n\t\t\tactiveSession.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\n\t\treturn {\n\t\t\tsession: new AgentSession({\n\t\t\t\tagent,\n\t\t\t\tsession: activeSession,\n\t\t\t\tsettingsManager: services.settingsManager,\n\t\t\t\tcwd: services.cwd,\n\t\t\t\tscopedModels: sessionOptions.scopedModels,\n\t\t\t\tresourceLoader: services.resourceLoader,\n\t\t\t\tcustomTools: sessionOptions.customTools,\n\t\t\t\tmodelRegistry: services.modelRegistry,\n\t\t\t\tinitialActiveToolNames,\n\t\t\t\tallowedToolNames,\n\t\t\t\textensionRunnerRef,\n\t\t\t\tsessionStartEvent,\n\t\t\t}),\n\t\t\tservices,\n\t\t\tdiagnostics,\n\t\t\tmodelFallbackMessage,\n\t\t};\n\t}\n\n\tprivate apply(result: {\n\t\tsession: AgentSession;\n\t\tservices: PiAgentServices;\n\t\tdiagnostics: PiAgentDiagnostic[];\n\t\tmodelFallbackMessage?: string;\n\t}): void {\n\t\tthis._session = result.session;\n\t\tthis._services = result.services;\n\t\tthis._diagnostics = result.diagnostics;\n\t\tthis._modelFallbackMessage = result.modelFallbackMessage;\n\t}\n\n\tasync createAgentSession(options: CreatePiAgentSessionOptions = {}): Promise<AgentSession> {\n\t\tconst initialSession = options.session ?? (await this.sessionManager.create());\n\t\tassertSessionCwdExists(initialSession, initialSession.getCwd());\n\t\tthis.apply(await this.buildAgentSession(initialSession, options.sessionStartEvent));\n\t\treturn this.session;\n\t}\n\n\tget runtime(): PiAgent {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this;\n\t}\n\n\tget services(): PiAgentServices {\n\t\tif (!this._services) {\n\t\t\tthrow new Error(\"PiAgent services have not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._services;\n\t}\n\n\tget session(): AgentSession {\n\t\tif (!this._session) {\n\t\t\tthrow new Error(\"PiAgent session has not been created. Call createAgentSession() first.\");\n\t\t}\n\t\treturn this._session;\n\t}\n\n\tget modelFallbackMessage(): string | undefined {\n\t\treturn this._modelFallbackMessage;\n\t}\n\n\tget settingsManager(): SettingsManager {\n\t\treturn this.services.settingsManager;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this.services.modelRegistry;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this.services.resourceLoader;\n\t}\n\n\tget diagnostics(): readonly PiAgentDiagnostic[] {\n\t\treturn this._diagnostics;\n\t}\n\n\tget currentCwd(): string {\n\t\treturn this.services.cwd;\n\t}\n\n\tsetRebindSession(rebindSession?: (session: AgentSession) => Promise<void>): void {\n\t\tthis.rebindSession = rebindSession;\n\t}\n\n\tsetBeforeSessionInvalidate(beforeSessionInvalidate?: () => void): void {\n\t\tthis.beforeSessionInvalidate = beforeSessionInvalidate;\n\t}\n\n\tprivate async emitBeforeSwitch(\n\t\treason: \"new\" | \"resume\",\n\t\ttargetSessionReference?: string,\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_switch\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_switch\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async emitBeforeFork(\n\t\tentryId: string,\n\t\toptions: { position: \"before\" | \"at\" },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst runner = this.session.extensionRunner;\n\t\tif (!runner.hasHandlers(\"session_before_fork\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\tconst result = await runner.emit({\n\t\t\ttype: \"session_before_fork\",\n\t\t\tentryId,\n\t\t\t...options,\n\t\t});\n\t\treturn { cancelled: result?.cancel === true };\n\t}\n\n\tprivate async flushActiveSession(): Promise<void> {\n\t\tconst flushPendingSync = (this.session.session as { flushPendingSync?: () => Promise<void> }).flushPendingSync;\n\t\tif (flushPendingSync) {\n\t\t\tawait flushPendingSync.call(this.session.session);\n\t\t}\n\t}\n\n\tprivate async teardownCurrent(\n\t\treason: SessionShutdownEvent[\"reason\"],\n\t\ttargetSessionReference?: string,\n\t): Promise<void> {\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason,\n\t\t\ttargetSessionReference,\n\t\t\ttargetSessionFile: targetSessionReference,\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t}\n\n\tprivate async finishSessionReplacement(withSession?: (ctx: ReplacedSessionContext) => Promise<void>): Promise<void> {\n\t\tif (this.rebindSession) {\n\t\t\tawait this.rebindSession(this.session);\n\t\t}\n\t\tif (withSession) {\n\t\t\tawait withSession(this.session.createReplacedSessionContext());\n\t\t}\n\t}\n\n\tasync switchSession(\n\t\tsessionPath: string,\n\t\toptions?: { cwdOverride?: string; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", sessionPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.openReference(sessionPath, { cwdOverride: options?.cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync newSession(options?: {\n\t\tid?: string;\n\t\tparentSession?: string;\n\t\tsetup?: (session: Session) => Promise<void>;\n\t\twithSession?: (ctx: ReplacedSessionContext) => Promise<void>;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"new\");\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tconst newSessionOptions = {\n\t\t\tid: options?.id,\n\t\t\tparentSession: options?.parentSession ?? activeSession.getSessionReference(),\n\t\t};\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.createSubSession(newSessionOptions);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.create(newSessionOptions);\n\t\t}\n\n\t\tawait this.teardownCurrent(\"new\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.session.session);\n\t\t\tthis.session.agent.state.messages = this.session.session.buildSessionContext().messages;\n\t\t}\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false };\n\t}\n\n\tasync fork(\n\t\tentryId: string,\n\t\toptions?: { position?: \"before\" | \"at\"; withSession?: (ctx: ReplacedSessionContext) => Promise<void> },\n\t): Promise<{ cancelled: boolean; selectedText?: string }> {\n\t\tconst position = options?.position ?? \"before\";\n\t\tconst beforeResult = await this.emitBeforeFork(entryId, { position });\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn { cancelled: true };\n\t\t}\n\t\tlet targetLeafId: string | null;\n\t\tlet selectedText: string | undefined;\n\n\t\tconst selectedEntry = this.session.session.getEntry(entryId);\n\t\tif (!selectedEntry) {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tif (position === \"at\") {\n\t\t\ttargetLeafId = selectedEntry.id;\n\t\t} else {\n\t\t\tif (selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t\t}\n\t\t\ttargetLeafId = selectedEntry.parentId;\n\t\t\tselectedText = extractUserMessageText(selectedEntry.message.content);\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst activeSession = this.session.session;\n\t\tlet nextSession: Session;\n\t\ttry {\n\t\t\tnextSession = await activeSession.forkSubSession(targetLeafId);\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error && error.message === \"Session manager unavailable\")) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tnextSession = await this.sessionManager.forkSession(activeSession, targetLeafId);\n\t\t}\n\t\tawait this.teardownCurrent(\"fork\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"fork\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement(options?.withSession);\n\t\treturn { cancelled: false, selectedText };\n\t}\n\n\tasync importFromJsonl(inputPath: string, cwdOverride?: string): Promise<{ cancelled: boolean }> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new SessionImportFileNotFoundError(resolvedPath);\n\t\t}\n\n\t\tconst beforeResult = await this.emitBeforeSwitch(\"resume\", resolvedPath);\n\t\tif (beforeResult.cancelled) {\n\t\t\treturn beforeResult;\n\t\t}\n\n\t\tconst previousSessionReference = this.session.sessionReference;\n\t\tconst nextSession = await this.sessionManager.importJsonl(resolvedPath, { cwdOverride: cwdOverride });\n\t\tassertSessionCwdExists(nextSession, this.services.cwd);\n\t\tawait this.teardownCurrent(\"resume\", nextSession.getSessionReference());\n\t\tthis.apply(\n\t\t\tawait this.buildAgentSession(nextSession, {\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionReference,\n\t\t\t\tpreviousSessionFile: previousSessionReference,\n\t\t\t}),\n\t\t);\n\t\tawait this.finishSessionReplacement();\n\t\treturn { cancelled: false };\n\t}\n\n\tasync runMode(options: RunPiAgentModeOptions = {}): Promise<void> {\n\t\tconst mode = options.mode ?? this._mode;\n\t\tif (mode === \"embedded\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode !== \"interactive\" && !this.session.model) {\n\t\t\tconsole.error(chalk.red(formatNoModelsAvailableMessage()));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (options.startupBenchmark && mode !== \"interactive\") {\n\t\t\tconsole.error(chalk.red(\"Error: PI_STARTUP_BENCHMARK only supports interactive mode\"));\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\tif (mode === \"rpc\") {\n\t\t\tprintTimings();\n\t\t\tawait runRpcMode(this);\n\t\t\treturn;\n\t\t}\n\n\t\tif (mode === \"interactive\") {\n\t\t\tconst interactiveMode = new InteractiveMode(this, {\n\t\t\t\tmigratedProviders: options.migratedProviders,\n\t\t\t\tmodelFallbackMessage: this.modelFallbackMessage,\n\t\t\t\tinitialMessage: options.initialMessage,\n\t\t\t\tinitialImages: options.initialImages,\n\t\t\t\tinitialMessages: options.initialMessages,\n\t\t\t\tverbose: options.verbose,\n\t\t\t});\n\t\t\tif (options.startupBenchmark) {\n\t\t\t\tawait interactiveMode.init();\n\t\t\t\ttime(\"interactiveMode.init\");\n\t\t\t\tprintTimings();\n\t\t\t\tinteractiveMode.stop();\n\t\t\t\tstopThemeWatcher();\n\t\t\t\tif (process.stdout.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stdout.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\tif (process.stderr.writableLength > 0) {\n\t\t\t\t\tawait new Promise<void>((resolve) => process.stderr.once(\"drain\", resolve));\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tprintTimings();\n\t\t\tawait interactiveMode.run();\n\t\t\treturn;\n\t\t}\n\n\t\tprintTimings();\n\t\tconst exitCode = await runPrintMode(this, {\n\t\t\tmode: mode === \"json\" ? \"json\" : \"text\",\n\t\t\tmessages: options.initialMessages,\n\t\t\tinitialMessage: options.initialMessage,\n\t\t\tinitialImages: options.initialImages,\n\t\t});\n\t\tstopThemeWatcher();\n\t\trestoreStdout();\n\t\tif (exitCode !== 0) {\n\t\t\tprocess.exitCode = exitCode;\n\t\t}\n\t}\n\n\tcreateSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.create();\n\t}\n\n\topenSessionReference(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.openReference(reference);\n\t}\n\n\tcontinueRecentSession(): Session | Promise<Session> {\n\t\treturn this.sessionManager.continueRecent();\n\t}\n\n\tforkSessionFrom(reference: string): Session | Promise<Session> {\n\t\treturn this.sessionManager.forkFrom(reference);\n\t}\n\n\tasync listSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.list(onProgress);\n\t}\n\n\tasync listAllSessions(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn this.sessionManager.listAll(onProgress);\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (!this._session) {\n\t\t\treturn;\n\t\t}\n\t\tawait emitSessionShutdownEvent(this.session.extensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"quit\",\n\t\t});\n\t\tawait this.flushActiveSession();\n\t\tthis.beforeSessionInvalidate?.();\n\t\tthis.session.dispose();\n\t\tthis._session = undefined;\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-session-manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/in-memory-session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtF,qBAAa,sBAAuB,YAAW,cAAc;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YAAY,GAAG,GAAE,MAAsB,EAEtC;IAED,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAMnD;IAED,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAEhF;IAED,cAAc,IAAI,eAAe,CAEhC;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAE5C;IAED,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAOjE;IAED,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAE9E;IAEK,IAAI,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEpE;IAEK,OAAO,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEvE;CACD","sourcesContent":["import { InMemorySession } from \"./in-memory-session.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport class InMemorySessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\n\tconstructor(cwd: string = process.cwd()) {\n\t\tthis.cwd = cwd;\n\t}\n\n\tcreate(options?: NewSessionOptions): InMemorySession {\n\t\tconst session = new InMemorySession(this.cwd);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(_reference: string, _options?: OpenSessionOptions): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tcontinueRecent(): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkFrom(_reference: string): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): Session {\n\t\tif (!targetLeafId) {\n\t\t\tsource.newSession({ parentSession: source.getSessionReference() });\n\t\t} else {\n\t\t\tsource.createBranchedSession(targetLeafId);\n\t\t}\n\t\treturn source;\n\t}\n\n\timportJsonl(_inputPath: string, _options?: OpenSessionOptions): InMemorySession {\n\t\tthrow new Error(\"Importing JSONL sessions is not supported by in-memory sessions\");\n\t}\n\n\tasync list(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n\n\tasync listAll(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n}\n"]}
1
+ {"version":3,"file":"in-memory-session-manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/in-memory-session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtF,qBAAa,sBAAuB,YAAW,cAAc;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YAAY,GAAG,GAAE,MAAsB,EAEtC;IAED,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAMnD;IAED,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAEhF;IAED,cAAc,IAAI,eAAe,CAEhC;IAED,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,CAE5C;IAED,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAMjE;IAED,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAE9E;IAEK,IAAI,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEpE;IAEK,OAAO,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAEvE;CACD","sourcesContent":["import { InMemorySession } from \"./in-memory-session.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport class InMemorySessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\n\tconstructor(cwd: string = process.cwd()) {\n\t\tthis.cwd = cwd;\n\t}\n\n\tcreate(options?: NewSessionOptions): InMemorySession {\n\t\tconst session = new InMemorySession(this.cwd, this);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(_reference: string, _options?: OpenSessionOptions): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tcontinueRecent(): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkFrom(_reference: string): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): Session {\n\t\tconst session = this.create({ parentSession: source.getSessionReference() });\n\t\tif (targetLeafId) {\n\t\t\tsession.copyBranchFrom(source, targetLeafId, source.getSessionReference());\n\t\t}\n\t\treturn session;\n\t}\n\n\timportJsonl(_inputPath: string, _options?: OpenSessionOptions): InMemorySession {\n\t\tthrow new Error(\"Importing JSONL sessions is not supported by in-memory sessions\");\n\t}\n\n\tasync list(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n\n\tasync listAll(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n}\n"]}
@@ -5,7 +5,7 @@ export class InMemorySessionManager {
5
5
  this.cwd = cwd;
6
6
  }
7
7
  create(options) {
8
- const session = new InMemorySession(this.cwd);
8
+ const session = new InMemorySession(this.cwd, this);
9
9
  if (options?.id || options?.parentSession) {
10
10
  session.newSession(options);
11
11
  }
@@ -21,13 +21,11 @@ export class InMemorySessionManager {
21
21
  return this.create();
22
22
  }
23
23
  forkSession(source, targetLeafId) {
24
- if (!targetLeafId) {
25
- source.newSession({ parentSession: source.getSessionReference() });
24
+ const session = this.create({ parentSession: source.getSessionReference() });
25
+ if (targetLeafId) {
26
+ session.copyBranchFrom(source, targetLeafId, source.getSessionReference());
26
27
  }
27
- else {
28
- source.createBranchedSession(targetLeafId);
29
- }
30
- return source;
28
+ return session;
31
29
  }
32
30
  importJsonl(_inputPath, _options) {
33
31
  throw new Error("Importing JSONL sessions is not supported by in-memory sessions");
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-session-manager.js","sourceRoot":"","sources":["../../../src/core/session/in-memory-session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAKzD,MAAM,OAAO,sBAAsB;IACjB,GAAG,CAAS;IAE7B,YAAY,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE,EAAE;QACxC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAAA,CACf;IAED,MAAM,CAAC,OAA2B,EAAmB;QACpD,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAED,aAAa,CAAC,UAAkB,EAAE,QAA6B,EAAmB;QACjF,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IAAA,CACrB;IAED,cAAc,GAAoB;QACjC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IAAA,CACrB;IAED,QAAQ,CAAC,UAAkB,EAAmB;QAC7C,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IAAA,CACrB;IAED,WAAW,CAAC,MAAe,EAAE,YAA2B,EAAW;QAClE,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,MAAM,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,MAAM,CAAC;IAAA,CACd;IAED,WAAW,CAAC,UAAkB,EAAE,QAA6B,EAAmB;QAC/E,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAAA,CACnF;IAED,KAAK,CAAC,IAAI,CAAC,WAAiC,EAA0B;QACrE,OAAO,EAAE,CAAC;IAAA,CACV;IAED,KAAK,CAAC,OAAO,CAAC,WAAiC,EAA0B;QACxE,OAAO,EAAE,CAAC;IAAA,CACV;CACD","sourcesContent":["import { InMemorySession } from \"./in-memory-session.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport class InMemorySessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\n\tconstructor(cwd: string = process.cwd()) {\n\t\tthis.cwd = cwd;\n\t}\n\n\tcreate(options?: NewSessionOptions): InMemorySession {\n\t\tconst session = new InMemorySession(this.cwd);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(_reference: string, _options?: OpenSessionOptions): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tcontinueRecent(): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkFrom(_reference: string): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): Session {\n\t\tif (!targetLeafId) {\n\t\t\tsource.newSession({ parentSession: source.getSessionReference() });\n\t\t} else {\n\t\t\tsource.createBranchedSession(targetLeafId);\n\t\t}\n\t\treturn source;\n\t}\n\n\timportJsonl(_inputPath: string, _options?: OpenSessionOptions): InMemorySession {\n\t\tthrow new Error(\"Importing JSONL sessions is not supported by in-memory sessions\");\n\t}\n\n\tasync list(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n\n\tasync listAll(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n}\n"]}
1
+ {"version":3,"file":"in-memory-session-manager.js","sourceRoot":"","sources":["../../../src/core/session/in-memory-session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAKzD,MAAM,OAAO,sBAAsB;IACjB,GAAG,CAAS;IAE7B,YAAY,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE,EAAE;QACxC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAAA,CACf;IAED,MAAM,CAAC,OAA2B,EAAmB;QACpD,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3C,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAED,aAAa,CAAC,UAAkB,EAAE,QAA6B,EAAmB;QACjF,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IAAA,CACrB;IAED,cAAc,GAAoB;QACjC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IAAA,CACrB;IAED,QAAQ,CAAC,UAAkB,EAAmB;QAC7C,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IAAA,CACrB;IAED,WAAW,CAAC,MAAe,EAAE,YAA2B,EAAW;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;QAC7E,IAAI,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,OAAO,CAAC;IAAA,CACf;IAED,WAAW,CAAC,UAAkB,EAAE,QAA6B,EAAmB;QAC/E,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAAA,CACnF;IAED,KAAK,CAAC,IAAI,CAAC,WAAiC,EAA0B;QACrE,OAAO,EAAE,CAAC;IAAA,CACV;IAED,KAAK,CAAC,OAAO,CAAC,WAAiC,EAA0B;QACxE,OAAO,EAAE,CAAC;IAAA,CACV;CACD","sourcesContent":["import { InMemorySession } from \"./in-memory-session.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport class InMemorySessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\n\tconstructor(cwd: string = process.cwd()) {\n\t\tthis.cwd = cwd;\n\t}\n\n\tcreate(options?: NewSessionOptions): InMemorySession {\n\t\tconst session = new InMemorySession(this.cwd, this);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(_reference: string, _options?: OpenSessionOptions): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tcontinueRecent(): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkFrom(_reference: string): InMemorySession {\n\t\treturn this.create();\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): Session {\n\t\tconst session = this.create({ parentSession: source.getSessionReference() });\n\t\tif (targetLeafId) {\n\t\t\tsession.copyBranchFrom(source, targetLeafId, source.getSessionReference());\n\t\t}\n\t\treturn session;\n\t}\n\n\timportJsonl(_inputPath: string, _options?: OpenSessionOptions): InMemorySession {\n\t\tthrow new Error(\"Importing JSONL sessions is not supported by in-memory sessions\");\n\t}\n\n\tasync list(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n\n\tasync listAll(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\treturn [];\n\t}\n}\n"]}
@@ -1,5 +1,7 @@
1
1
  import { Session } from "./session.ts";
2
+ import type { SessionManager } from "./session-manager.ts";
2
3
  export declare class InMemorySession extends Session {
3
- constructor(cwd?: string);
4
+ constructor(cwd?: string, sessionManager?: SessionManager);
5
+ protected prepareNewSessionReference(_sessionDir: string, sessionId: string, _timestamp: string): string | undefined;
4
6
  }
5
7
  //# sourceMappingURL=in-memory-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-session.d.ts","sourceRoot":"","sources":["../../../src/core/session/in-memory-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,qBAAa,eAAgB,SAAQ,OAAO;IAC3C,YAAY,GAAG,GAAE,MAAsB,EAEtC;CACD","sourcesContent":["import { Session } from \"./session.ts\";\nimport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\n\nexport class InMemorySession extends Session {\n\tconstructor(cwd: string = process.cwd()) {\n\t\tsuper(cwd, \"\", undefined, new InMemorySessionStore());\n\t}\n}\n"]}
1
+ {"version":3,"file":"in-memory-session.d.ts","sourceRoot":"","sources":["../../../src/core/session/in-memory-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,qBAAa,eAAgB,SAAQ,OAAO;IAC3C,YAAY,GAAG,GAAE,MAAsB,EAAE,cAAc,CAAC,EAAE,cAAc,EAEvE;IAED,SAAS,CAAC,0BAA0B,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAEpB;CACD","sourcesContent":["import { Session } from \"./session.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\n\nexport class InMemorySession extends Session {\n\tconstructor(cwd: string = process.cwd(), sessionManager?: SessionManager) {\n\t\tsuper(cwd, \"\", undefined, new InMemorySessionStore(), sessionManager);\n\t}\n\n\tprotected prepareNewSessionReference(\n\t\t_sessionDir: string,\n\t\tsessionId: string,\n\t\t_timestamp: string,\n\t): string | undefined {\n\t\treturn `memory:${sessionId}`;\n\t}\n}\n"]}
@@ -1,8 +1,11 @@
1
1
  import { Session } from "./session.js";
2
2
  import { InMemorySessionStore } from "./stores/in-memory-session-store.js";
3
3
  export class InMemorySession extends Session {
4
- constructor(cwd = process.cwd()) {
5
- super(cwd, "", undefined, new InMemorySessionStore());
4
+ constructor(cwd = process.cwd(), sessionManager) {
5
+ super(cwd, "", undefined, new InMemorySessionStore(), sessionManager);
6
+ }
7
+ prepareNewSessionReference(_sessionDir, sessionId, _timestamp) {
8
+ return `memory:${sessionId}`;
6
9
  }
7
10
  }
8
11
  //# sourceMappingURL=in-memory-session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory-session.js","sourceRoot":"","sources":["../../../src/core/session/in-memory-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,OAAO,eAAgB,SAAQ,OAAO;IAC3C,YAAY,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE,EAAE;QACxC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,oBAAoB,EAAE,CAAC,CAAC;IAAA,CACtD;CACD","sourcesContent":["import { Session } from \"./session.ts\";\nimport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\n\nexport class InMemorySession extends Session {\n\tconstructor(cwd: string = process.cwd()) {\n\t\tsuper(cwd, \"\", undefined, new InMemorySessionStore());\n\t}\n}\n"]}
1
+ {"version":3,"file":"in-memory-session.js","sourceRoot":"","sources":["../../../src/core/session/in-memory-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,OAAO,eAAgB,SAAQ,OAAO;IAC3C,YAAY,GAAG,GAAW,OAAO,CAAC,GAAG,EAAE,EAAE,cAA+B,EAAE;QACzE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,oBAAoB,EAAE,EAAE,cAAc,CAAC,CAAC;IAAA,CACtE;IAES,0BAA0B,CACnC,WAAmB,EACnB,SAAiB,EACjB,UAAkB,EACG;QACrB,OAAO,UAAU,SAAS,EAAE,CAAC;IAAA,CAC7B;CACD","sourcesContent":["import { Session } from \"./session.ts\";\nimport type { SessionManager } from \"./session-manager.ts\";\nimport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\n\nexport class InMemorySession extends Session {\n\tconstructor(cwd: string = process.cwd(), sessionManager?: SessionManager) {\n\t\tsuper(cwd, \"\", undefined, new InMemorySessionStore(), sessionManager);\n\t}\n\n\tprotected prepareNewSessionReference(\n\t\t_sessionDir: string,\n\t\tsessionId: string,\n\t\t_timestamp: string,\n\t): string | undefined {\n\t\treturn `memory:${sessionId}`;\n\t}\n}\n"]}
@@ -3,7 +3,7 @@ export { InMemorySessionManager } from "./in-memory-session-manager.ts";
3
3
  export { LocalSession } from "./local-session.ts";
4
4
  export { LocalSessionManager } from "./local-session-manager.ts";
5
5
  export { RemoteSession } from "./remote-session.ts";
6
- export type { AppendRemoteSessionEntriesRequest, AppendRemoteSessionEntriesResponse, CreateRemoteSessionRequest, ForkRemoteSessionRequest, ImportRemoteSessionJsonlRequest, ListRemoteSessionsResponse, RemoteSessionClientOptions, RemoteSessionSnapshot, ReplaceRemoteSessionSnapshotRequest, ReplaceRemoteSessionSnapshotResponse, } from "./remote-session-client.ts";
6
+ export type { AppendRemoteSessionEntriesRequest, AppendRemoteSessionEntriesResponse, CreateRemoteSessionRequest, ForkRemoteSessionRequest, ImportRemoteSessionJsonlRequest, ListRemoteSessionsResponse, RemoteSessionClientOptions, RemoteSessionInfo, RemoteSessionSnapshot, ReplaceRemoteSessionSnapshotRequest, ReplaceRemoteSessionSnapshotResponse, } from "./remote-session-client.ts";
7
7
  export { formatRemoteSessionReference, parseRemoteSessionId, RemoteSessionClient, RemoteSessionClientError, } from "./remote-session-client.ts";
8
8
  export { RemoteSessionManager } from "./remote-session-manager.ts";
9
9
  export * from "./session.ts";
@@ -11,6 +11,6 @@ export type { OpenSessionOptions, SessionManager, SessionResult } from "./sessio
11
11
  export { InMemorySessionStore } from "./stores/in-memory-session-store.ts";
12
12
  export { JsonlSessionStore } from "./stores/jsonl-session-store.ts";
13
13
  export { RemoteSessionStore } from "./stores/remote-session-store.ts";
14
- export type { SessionOpenResult, SessionStore } from "./stores/session-store.ts";
14
+ export type { SessionStore } from "./stores/session-store.ts";
15
15
  export * from "./types.ts";
16
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EACX,iCAAiC,EACjC,kCAAkC,EAClC,0BAA0B,EAC1B,wBAAwB,EACxB,+BAA+B,EAC/B,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,mCAAmC,EACnC,oCAAoC,GACpC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,4BAA4B,EAC5B,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACjF,cAAc,YAAY,CAAC","sourcesContent":["export { InMemorySession } from \"./in-memory-session.ts\";\nexport { InMemorySessionManager } from \"./in-memory-session-manager.ts\";\nexport { LocalSession } from \"./local-session.ts\";\nexport { LocalSessionManager } from \"./local-session-manager.ts\";\nexport { RemoteSession } from \"./remote-session.ts\";\nexport type {\n\tAppendRemoteSessionEntriesRequest,\n\tAppendRemoteSessionEntriesResponse,\n\tCreateRemoteSessionRequest,\n\tForkRemoteSessionRequest,\n\tImportRemoteSessionJsonlRequest,\n\tListRemoteSessionsResponse,\n\tRemoteSessionClientOptions,\n\tRemoteSessionSnapshot,\n\tReplaceRemoteSessionSnapshotRequest,\n\tReplaceRemoteSessionSnapshotResponse,\n} from \"./remote-session-client.ts\";\nexport {\n\tformatRemoteSessionReference,\n\tparseRemoteSessionId,\n\tRemoteSessionClient,\n\tRemoteSessionClientError,\n} from \"./remote-session-client.ts\";\nexport { RemoteSessionManager } from \"./remote-session-manager.ts\";\nexport * from \"./session.ts\";\nexport type { OpenSessionOptions, SessionManager, SessionResult } from \"./session-manager.ts\";\nexport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\nexport { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nexport { RemoteSessionStore } from \"./stores/remote-session-store.ts\";\nexport type { SessionOpenResult, SessionStore } from \"./stores/session-store.ts\";\nexport * from \"./types.ts\";\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EACX,iCAAiC,EACjC,kCAAkC,EAClC,0BAA0B,EAC1B,wBAAwB,EACxB,+BAA+B,EAC/B,0BAA0B,EAC1B,0BAA0B,EAC1B,iBAAiB,EACjB,qBAAqB,EACrB,mCAAmC,EACnC,oCAAoC,GACpC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,4BAA4B,EAC5B,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,cAAc,YAAY,CAAC","sourcesContent":["export { InMemorySession } from \"./in-memory-session.ts\";\nexport { InMemorySessionManager } from \"./in-memory-session-manager.ts\";\nexport { LocalSession } from \"./local-session.ts\";\nexport { LocalSessionManager } from \"./local-session-manager.ts\";\nexport { RemoteSession } from \"./remote-session.ts\";\nexport type {\n\tAppendRemoteSessionEntriesRequest,\n\tAppendRemoteSessionEntriesResponse,\n\tCreateRemoteSessionRequest,\n\tForkRemoteSessionRequest,\n\tImportRemoteSessionJsonlRequest,\n\tListRemoteSessionsResponse,\n\tRemoteSessionClientOptions,\n\tRemoteSessionInfo,\n\tRemoteSessionSnapshot,\n\tReplaceRemoteSessionSnapshotRequest,\n\tReplaceRemoteSessionSnapshotResponse,\n} from \"./remote-session-client.ts\";\nexport {\n\tformatRemoteSessionReference,\n\tparseRemoteSessionId,\n\tRemoteSessionClient,\n\tRemoteSessionClientError,\n} from \"./remote-session-client.ts\";\nexport { RemoteSessionManager } from \"./remote-session-manager.ts\";\nexport * from \"./session.ts\";\nexport type { OpenSessionOptions, SessionManager, SessionResult } from \"./session-manager.ts\";\nexport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\nexport { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nexport { RemoteSessionStore } from \"./stores/remote-session-store.ts\";\nexport type { SessionStore } from \"./stores/session-store.ts\";\nexport * from \"./types.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAapD,OAAO,EACN,4BAA4B,EAC5B,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,cAAc,YAAY,CAAC","sourcesContent":["export { InMemorySession } from \"./in-memory-session.ts\";\nexport { InMemorySessionManager } from \"./in-memory-session-manager.ts\";\nexport { LocalSession } from \"./local-session.ts\";\nexport { LocalSessionManager } from \"./local-session-manager.ts\";\nexport { RemoteSession } from \"./remote-session.ts\";\nexport type {\n\tAppendRemoteSessionEntriesRequest,\n\tAppendRemoteSessionEntriesResponse,\n\tCreateRemoteSessionRequest,\n\tForkRemoteSessionRequest,\n\tImportRemoteSessionJsonlRequest,\n\tListRemoteSessionsResponse,\n\tRemoteSessionClientOptions,\n\tRemoteSessionSnapshot,\n\tReplaceRemoteSessionSnapshotRequest,\n\tReplaceRemoteSessionSnapshotResponse,\n} from \"./remote-session-client.ts\";\nexport {\n\tformatRemoteSessionReference,\n\tparseRemoteSessionId,\n\tRemoteSessionClient,\n\tRemoteSessionClientError,\n} from \"./remote-session-client.ts\";\nexport { RemoteSessionManager } from \"./remote-session-manager.ts\";\nexport * from \"./session.ts\";\nexport type { OpenSessionOptions, SessionManager, SessionResult } from \"./session-manager.ts\";\nexport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\nexport { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nexport { RemoteSessionStore } from \"./stores/remote-session-store.ts\";\nexport type { SessionOpenResult, SessionStore } from \"./stores/session-store.ts\";\nexport * from \"./types.ts\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAcpD,OAAO,EACN,4BAA4B,EAC5B,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,cAAc,YAAY,CAAC","sourcesContent":["export { InMemorySession } from \"./in-memory-session.ts\";\nexport { InMemorySessionManager } from \"./in-memory-session-manager.ts\";\nexport { LocalSession } from \"./local-session.ts\";\nexport { LocalSessionManager } from \"./local-session-manager.ts\";\nexport { RemoteSession } from \"./remote-session.ts\";\nexport type {\n\tAppendRemoteSessionEntriesRequest,\n\tAppendRemoteSessionEntriesResponse,\n\tCreateRemoteSessionRequest,\n\tForkRemoteSessionRequest,\n\tImportRemoteSessionJsonlRequest,\n\tListRemoteSessionsResponse,\n\tRemoteSessionClientOptions,\n\tRemoteSessionInfo,\n\tRemoteSessionSnapshot,\n\tReplaceRemoteSessionSnapshotRequest,\n\tReplaceRemoteSessionSnapshotResponse,\n} from \"./remote-session-client.ts\";\nexport {\n\tformatRemoteSessionReference,\n\tparseRemoteSessionId,\n\tRemoteSessionClient,\n\tRemoteSessionClientError,\n} from \"./remote-session-client.ts\";\nexport { RemoteSessionManager } from \"./remote-session-manager.ts\";\nexport * from \"./session.ts\";\nexport type { OpenSessionOptions, SessionManager, SessionResult } from \"./session-manager.ts\";\nexport { InMemorySessionStore } from \"./stores/in-memory-session-store.ts\";\nexport { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nexport { RemoteSessionStore } from \"./stores/remote-session-store.ts\";\nexport type { SessionStore } from \"./stores/session-store.ts\";\nexport * from \"./types.ts\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-helpers.d.ts","sourceRoot":"","sources":["../../../src/core/session/jsonl-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,iBAAiB,mBAA0B,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,4BAA4B;AAC5B,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAEjE;AAED,4BAA4B;AAC5B,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvE","sourcesContent":["import { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport const jsonlSessionStore = new JsonlSessionStore();\n\n/**\n * Compute the default session directory for a cwd.\n * Encodes cwd into a safe directory name under ~/.pi/agent/sessions/.\n */\nexport function getDefaultSessionDir(cwd: string, agentDir?: string): string {\n\treturn jsonlSessionStore.getDefaultSessionDir(cwd, agentDir);\n}\n\n/** Exported for testing. */\nexport function loadEntriesFromFile(filePath: string): FileEntry[] {\n\treturn jsonlSessionStore.load(filePath);\n}\n\n/** Exported for testing. */\nexport function findMostRecentSession(sessionDir: string): string | null {\n\treturn jsonlSessionStore.findMostRecent(sessionDir);\n}\n"]}
1
+ {"version":3,"file":"jsonl-helpers.d.ts","sourceRoot":"","sources":["../../../src/core/session/jsonl-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,iBAAiB,EAEjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,iBAAiB,mBAA0B,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,4BAA4B;AAC5B,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CAEjE;AAED,4BAA4B;AAC5B,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEvE","sourcesContent":["import {\n\tfindMostRecent,\n\tgetDefaultSessionDir as getDefaultJsonlSessionDir,\n\tJsonlSessionStore,\n\tload,\n} from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport const jsonlSessionStore = new JsonlSessionStore();\n\n/**\n * Compute the default session directory for a cwd.\n * Encodes cwd into a safe directory name under ~/.pi/agent/sessions/.\n */\nexport function getDefaultSessionDir(cwd: string, agentDir?: string): string {\n\treturn getDefaultJsonlSessionDir(cwd, agentDir);\n}\n\n/** Exported for testing. */\nexport function loadEntriesFromFile(filePath: string): FileEntry[] {\n\treturn load(filePath);\n}\n\n/** Exported for testing. */\nexport function findMostRecentSession(sessionDir: string): string | null {\n\treturn findMostRecent(sessionDir);\n}\n"]}
@@ -1,18 +1,18 @@
1
- import { JsonlSessionStore } from "./stores/jsonl-session-store.js";
1
+ import { findMostRecent, getDefaultSessionDir as getDefaultJsonlSessionDir, JsonlSessionStore, load, } from "./stores/jsonl-session-store.js";
2
2
  export const jsonlSessionStore = new JsonlSessionStore();
3
3
  /**
4
4
  * Compute the default session directory for a cwd.
5
5
  * Encodes cwd into a safe directory name under ~/.pi/agent/sessions/.
6
6
  */
7
7
  export function getDefaultSessionDir(cwd, agentDir) {
8
- return jsonlSessionStore.getDefaultSessionDir(cwd, agentDir);
8
+ return getDefaultJsonlSessionDir(cwd, agentDir);
9
9
  }
10
10
  /** Exported for testing. */
11
11
  export function loadEntriesFromFile(filePath) {
12
- return jsonlSessionStore.load(filePath);
12
+ return load(filePath);
13
13
  }
14
14
  /** Exported for testing. */
15
15
  export function findMostRecentSession(sessionDir) {
16
- return jsonlSessionStore.findMostRecent(sessionDir);
16
+ return findMostRecent(sessionDir);
17
17
  }
18
18
  //# sourceMappingURL=jsonl-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-helpers.js","sourceRoot":"","sources":["../../../src/core/session/jsonl-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAiB,EAAU;IAC5E,OAAO,iBAAiB,CAAC,oBAAoB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,CAC7D;AAED,4BAA4B;AAC5B,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAe;IAClE,OAAO,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,CACxC;AAED,4BAA4B;AAC5B,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAiB;IACxE,OAAO,iBAAiB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AAAA,CACpD","sourcesContent":["import { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport const jsonlSessionStore = new JsonlSessionStore();\n\n/**\n * Compute the default session directory for a cwd.\n * Encodes cwd into a safe directory name under ~/.pi/agent/sessions/.\n */\nexport function getDefaultSessionDir(cwd: string, agentDir?: string): string {\n\treturn jsonlSessionStore.getDefaultSessionDir(cwd, agentDir);\n}\n\n/** Exported for testing. */\nexport function loadEntriesFromFile(filePath: string): FileEntry[] {\n\treturn jsonlSessionStore.load(filePath);\n}\n\n/** Exported for testing. */\nexport function findMostRecentSession(sessionDir: string): string | null {\n\treturn jsonlSessionStore.findMostRecent(sessionDir);\n}\n"]}
1
+ {"version":3,"file":"jsonl-helpers.js","sourceRoot":"","sources":["../../../src/core/session/jsonl-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,oBAAoB,IAAI,yBAAyB,EACjD,iBAAiB,EACjB,IAAI,GACJ,MAAM,iCAAiC,CAAC;AAGzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,QAAiB,EAAU;IAC5E,OAAO,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,CAChD;AAED,4BAA4B;AAC5B,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAe;IAClE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,CACtB;AAED,4BAA4B;AAC5B,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAiB;IACxE,OAAO,cAAc,CAAC,UAAU,CAAC,CAAC;AAAA,CAClC","sourcesContent":["import {\n\tfindMostRecent,\n\tgetDefaultSessionDir as getDefaultJsonlSessionDir,\n\tJsonlSessionStore,\n\tload,\n} from \"./stores/jsonl-session-store.ts\";\nimport type { FileEntry } from \"./types.ts\";\n\nexport const jsonlSessionStore = new JsonlSessionStore();\n\n/**\n * Compute the default session directory for a cwd.\n * Encodes cwd into a safe directory name under ~/.pi/agent/sessions/.\n */\nexport function getDefaultSessionDir(cwd: string, agentDir?: string): string {\n\treturn getDefaultJsonlSessionDir(cwd, agentDir);\n}\n\n/** Exported for testing. */\nexport function loadEntriesFromFile(filePath: string): FileEntry[] {\n\treturn load(filePath);\n}\n\n/** Exported for testing. */\nexport function findMostRecentSession(sessionDir: string): string | null {\n\treturn findMostRecent(sessionDir);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"local-session-manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/local-session-manager.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAiB,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErG,MAAM,WAAW,0BAA0B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAoB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IAErC,YAAY,OAAO,EAAE,0BAA0B,EAG9C;IAED,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,YAAY,CAOhD;IAED,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAM3E;IAED,cAAc,IAAI,YAAY,CAO7B;IAED,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CA2BxC;IAED,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,CActE;IAED,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAgBzE;IAEK,IAAI,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAKnE;IAEK,OAAO,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAItE;CACD","sourcesContent":["import { copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { createSessionId } from \"./ids.ts\";\nimport {\n\tfindMostRecentSession,\n\tgetDefaultSessionDir,\n\tjsonlSessionStore,\n\tloadEntriesFromFile,\n} from \"./jsonl-helpers.ts\";\nimport { LocalSession } from \"./local-session.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionHeader, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport interface LocalSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n}\n\nexport class LocalSessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\tprivate readonly sessionDir?: string;\n\n\tconstructor(options: LocalSessionManagerOptions) {\n\t\tthis.cwd = options.cwd;\n\t\tthis.sessionDir = options.sessionDir;\n\t}\n\n\tcreate(options?: NewSessionOptions): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst session = new LocalSession(this.cwd, dir, undefined);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(reference: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst entries = loadEntriesFromFile(reference);\n\t\tconst header = entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\t\tconst cwd = options?.cwdOverride ?? header?.cwd ?? this.cwd;\n\t\tconst dir = this.sessionDir ?? jsonlSessionStore.getSessionDirForReference(reference);\n\t\treturn new LocalSession(cwd, dir, reference);\n\t}\n\n\tcontinueRecent(): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst mostRecent = findMostRecentSession(dir);\n\t\tif (mostRecent) {\n\t\t\treturn new LocalSession(this.cwd, dir, mostRecent);\n\t\t}\n\t\treturn new LocalSession(this.cwd, dir, undefined);\n\t}\n\n\tforkFrom(reference: string): LocalSession {\n\t\tconst sourceEntries = loadEntriesFromFile(reference);\n\t\tif (sourceEntries.length === 0) {\n\t\t\tthrow new Error(`Cannot fork: source session is empty or invalid: ${reference}`);\n\t\t}\n\n\t\tconst sourceHeader = sourceEntries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\t\tif (!sourceHeader) {\n\t\t\tthrow new Error(`Cannot fork: source session has no header: ${reference}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tjsonlSessionStore.ensureDir(dir);\n\n\t\tconst newSessionId = createSessionId();\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newHeader: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: reference,\n\t\t};\n\t\tconst newSessionReference = jsonlSessionStore.forkSession(dir, newHeader, sourceEntries);\n\n\t\treturn new LocalSession(this.cwd, dir, newSessionReference);\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): LocalSession {\n\t\tconst parentSession = source.getSessionReference();\n\t\tif (!targetLeafId) {\n\t\t\tconst session = this.create();\n\t\t\tsession.newSession({ parentSession });\n\t\t\treturn session;\n\t\t}\n\n\t\tconst branchSource = parentSession ? this.openReference(parentSession) : source;\n\t\tconst forkedReference = branchSource.createBranchedSession(targetLeafId);\n\t\tif (!forkedReference) {\n\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t}\n\t\treturn this.openReference(forkedReference);\n\t}\n\n\timportJsonl(inputPath: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new Error(`File not found: ${resolvedPath}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst destinationPath = join(dir, basename(resolvedPath));\n\t\tif (resolve(destinationPath) !== resolvedPath) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath);\n\t\t}\n\t\treturn this.openReference(destinationPath, options);\n\t}\n\n\tasync list(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst sessions = await jsonlSessionStore.list(dir, onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tasync listAll(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst sessions = await jsonlSessionStore.listAll(jsonlSessionStore.getSessionsRoot(), onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n}\n"]}
1
+ {"version":3,"file":"local-session-manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/local-session-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAS/E,OAAO,KAAK,EAAE,iBAAiB,EAAiB,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErG,MAAM,WAAW,0BAA0B;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAoB,YAAW,cAAc;IACzD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IAErC,YAAY,OAAO,EAAE,0BAA0B,EAG9C;IAED,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,YAAY,CAOhD;IAED,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAM3E;IAED,cAAc,IAAI,YAAY,CAO7B;IAED,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CA2BxC;IAED,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,CActE;IAED,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAgBzE;IAEK,IAAI,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAKnE;IAEK,OAAO,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAItE;CACD","sourcesContent":["import { copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { createSessionId } from \"./ids.ts\";\nimport { findMostRecentSession, getDefaultSessionDir, loadEntriesFromFile } from \"./jsonl-helpers.ts\";\nimport { LocalSession } from \"./local-session.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport {\n\tensureDir,\n\tforkSession as forkJsonlSession,\n\tgetSessionDirForReference,\n\tgetSessionsRoot,\n\tlistAll as listAllJsonlSessions,\n\tlist as listJsonlSessions,\n} from \"./stores/jsonl-session-store.ts\";\nimport type { NewSessionOptions, SessionHeader, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport interface LocalSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n}\n\nexport class LocalSessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\tprivate readonly sessionDir?: string;\n\n\tconstructor(options: LocalSessionManagerOptions) {\n\t\tthis.cwd = options.cwd;\n\t\tthis.sessionDir = options.sessionDir;\n\t}\n\n\tcreate(options?: NewSessionOptions): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst session = new LocalSession(this.cwd, dir, undefined, this);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(reference: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst entries = loadEntriesFromFile(reference);\n\t\tconst header = entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\t\tconst cwd = options?.cwdOverride ?? header?.cwd ?? this.cwd;\n\t\tconst dir = this.sessionDir ?? getSessionDirForReference(reference);\n\t\treturn new LocalSession(cwd, dir, reference, this);\n\t}\n\n\tcontinueRecent(): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst mostRecent = findMostRecentSession(dir);\n\t\tif (mostRecent) {\n\t\t\treturn new LocalSession(this.cwd, dir, mostRecent, this);\n\t\t}\n\t\treturn new LocalSession(this.cwd, dir, undefined, this);\n\t}\n\n\tforkFrom(reference: string): LocalSession {\n\t\tconst sourceEntries = loadEntriesFromFile(reference);\n\t\tif (sourceEntries.length === 0) {\n\t\t\tthrow new Error(`Cannot fork: source session is empty or invalid: ${reference}`);\n\t\t}\n\n\t\tconst sourceHeader = sourceEntries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\t\tif (!sourceHeader) {\n\t\t\tthrow new Error(`Cannot fork: source session has no header: ${reference}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tensureDir(dir);\n\n\t\tconst newSessionId = createSessionId();\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newHeader: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: reference,\n\t\t};\n\t\tconst newSessionReference = forkJsonlSession(dir, newHeader, sourceEntries);\n\n\t\treturn new LocalSession(this.cwd, dir, newSessionReference, this);\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): LocalSession {\n\t\tconst parentSession = source.getSessionReference();\n\t\tif (!targetLeafId) {\n\t\t\tconst session = this.create();\n\t\t\tsession.newSession({ parentSession });\n\t\t\treturn session;\n\t\t}\n\n\t\tconst branchSource = parentSession ? this.openReference(parentSession) : source;\n\t\tconst forkedReference = branchSource.createBranchedSession(targetLeafId);\n\t\tif (!forkedReference) {\n\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t}\n\t\treturn this.openReference(forkedReference);\n\t}\n\n\timportJsonl(inputPath: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new Error(`File not found: ${resolvedPath}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst destinationPath = join(dir, basename(resolvedPath));\n\t\tif (resolve(destinationPath) !== resolvedPath) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath);\n\t\t}\n\t\treturn this.openReference(destinationPath, options);\n\t}\n\n\tasync list(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst sessions = await listJsonlSessions(dir, onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tasync listAll(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst sessions = await listAllJsonlSessions(getSessionsRoot(), onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n}\n"]}
@@ -2,8 +2,9 @@ import { copyFileSync, existsSync, mkdirSync } from "node:fs";
2
2
  import { basename, join, resolve } from "node:path";
3
3
  import { CURRENT_SESSION_VERSION } from "./constants.js";
4
4
  import { createSessionId } from "./ids.js";
5
- import { findMostRecentSession, getDefaultSessionDir, jsonlSessionStore, loadEntriesFromFile, } from "./jsonl-helpers.js";
5
+ import { findMostRecentSession, getDefaultSessionDir, loadEntriesFromFile } from "./jsonl-helpers.js";
6
6
  import { LocalSession } from "./local-session.js";
7
+ import { ensureDir, forkSession as forkJsonlSession, getSessionDirForReference, getSessionsRoot, listAll as listAllJsonlSessions, list as listJsonlSessions, } from "./stores/jsonl-session-store.js";
7
8
  export class LocalSessionManager {
8
9
  cwd;
9
10
  sessionDir;
@@ -13,7 +14,7 @@ export class LocalSessionManager {
13
14
  }
14
15
  create(options) {
15
16
  const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
16
- const session = new LocalSession(this.cwd, dir, undefined);
17
+ const session = new LocalSession(this.cwd, dir, undefined, this);
17
18
  if (options?.id || options?.parentSession) {
18
19
  session.newSession(options);
19
20
  }
@@ -23,16 +24,16 @@ export class LocalSessionManager {
23
24
  const entries = loadEntriesFromFile(reference);
24
25
  const header = entries.find((entry) => entry.type === "session");
25
26
  const cwd = options?.cwdOverride ?? header?.cwd ?? this.cwd;
26
- const dir = this.sessionDir ?? jsonlSessionStore.getSessionDirForReference(reference);
27
- return new LocalSession(cwd, dir, reference);
27
+ const dir = this.sessionDir ?? getSessionDirForReference(reference);
28
+ return new LocalSession(cwd, dir, reference, this);
28
29
  }
29
30
  continueRecent() {
30
31
  const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
31
32
  const mostRecent = findMostRecentSession(dir);
32
33
  if (mostRecent) {
33
- return new LocalSession(this.cwd, dir, mostRecent);
34
+ return new LocalSession(this.cwd, dir, mostRecent, this);
34
35
  }
35
- return new LocalSession(this.cwd, dir, undefined);
36
+ return new LocalSession(this.cwd, dir, undefined, this);
36
37
  }
37
38
  forkFrom(reference) {
38
39
  const sourceEntries = loadEntriesFromFile(reference);
@@ -44,7 +45,7 @@ export class LocalSessionManager {
44
45
  throw new Error(`Cannot fork: source session has no header: ${reference}`);
45
46
  }
46
47
  const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
47
- jsonlSessionStore.ensureDir(dir);
48
+ ensureDir(dir);
48
49
  const newSessionId = createSessionId();
49
50
  const timestamp = new Date().toISOString();
50
51
  const newHeader = {
@@ -55,8 +56,8 @@ export class LocalSessionManager {
55
56
  cwd: this.cwd,
56
57
  parentSession: reference,
57
58
  };
58
- const newSessionReference = jsonlSessionStore.forkSession(dir, newHeader, sourceEntries);
59
- return new LocalSession(this.cwd, dir, newSessionReference);
59
+ const newSessionReference = forkJsonlSession(dir, newHeader, sourceEntries);
60
+ return new LocalSession(this.cwd, dir, newSessionReference, this);
60
61
  }
61
62
  forkSession(source, targetLeafId) {
62
63
  const parentSession = source.getSessionReference();
@@ -89,12 +90,12 @@ export class LocalSessionManager {
89
90
  }
90
91
  async list(onProgress) {
91
92
  const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
92
- const sessions = await jsonlSessionStore.list(dir, onProgress);
93
+ const sessions = await listJsonlSessions(dir, onProgress);
93
94
  sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
94
95
  return sessions;
95
96
  }
96
97
  async listAll(onProgress) {
97
- const sessions = await jsonlSessionStore.listAll(jsonlSessionStore.getSessionsRoot(), onProgress);
98
+ const sessions = await listAllJsonlSessions(getSessionsRoot(), onProgress);
98
99
  sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
99
100
  return sessions;
100
101
  }