picocode-core 0.9.139 → 0.9.141

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "picocode-core",
3
- "version": "0.9.139",
3
+ "version": "0.9.141",
4
4
  "description": "The agent runtime behind pico: sessions, tools, subagents, MCP, memory, and model access",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/controller.js CHANGED
@@ -2,7 +2,7 @@ import { existsSync } from 'node:fs'
2
2
  import { writeFile } from 'node:fs/promises'
3
3
  import { join } from 'node:path'
4
4
  import { makeEvent } from './events.js'
5
- import { createSession, forkSession, openSession, loadSession, listSessions, deleteSession, appendSessionEvent, onSessionWriteError } from './session.js'
5
+ import { createSession, createEphemeralSession, forkSession, openSession, loadSession, listSessions, deleteSession, appendSessionEvent, onSessionWriteError } from './session.js'
6
6
  import { createContextTracker } from './context.js'
7
7
  import { deriveState, userEntries, rewindStats } from './derive.js'
8
8
  import { appendPrompt } from './history.js'
@@ -154,7 +154,7 @@ export function createController({ boot }) {
154
154
  }
155
155
 
156
156
  function ensureSession() {
157
- if (!state.session) state.session = createSession({ cwd: boot.cwd, root: boot.root })
157
+ if (!state.session) state.session = (boot.ephemeral ? createEphemeralSession : createSession)({ cwd: boot.cwd, root: boot.root })
158
158
  while (state.persisted < state.events.length) {
159
159
  state.session.append(state.events[state.persisted])
160
160
  state.persisted++
@@ -738,7 +738,7 @@ export function createController({ boot }) {
738
738
  }
739
739
  try {
740
740
  await session.flush()
741
- await deleteSession(session.file)
741
+ if (session.file) await deleteSession(session.file)
742
742
  } catch (err) {
743
743
  flash(`delete failed: ${errorText(err, 80)}`)
744
744
  return false
package/src/derive.js CHANGED
@@ -203,7 +203,7 @@ export function deriveState(events) {
203
203
  break
204
204
  case 'turn_transcript':
205
205
  for (const item of event.data.items || []) {
206
- const restored = { ...item, eventId: event.id }
206
+ const restored = { ...item, eventId: event.id, at: item.at ?? event.at ?? null }
207
207
  state.transcript.push(restored)
208
208
  if (restored.kind === 'tool' && restored.callId) state.toolItems.set(restored.callId, restored)
209
209
  }
package/src/session.js CHANGED
@@ -90,9 +90,16 @@ export function createSession({ cwd, root, forkedFrom }) {
90
90
  return session
91
91
  }
92
92
 
93
+ // an ephemeral session keeps its events in memory only: no file, no index
94
+ // entry, nothing to resume once it is closed
95
+ export function createEphemeralSession({ cwd, root, forkedFrom }) {
96
+ const header = makeHeader({ cwd, root, forkedFrom })
97
+ return { id: header.id, file: null, header, ephemeral: true, append() {}, async flush() {} }
98
+ }
99
+
93
100
  export async function forkSession({ source, cwd, root, events, label }) {
94
101
  await source?.flush()
95
- const session = createSession({ cwd, root, forkedFrom: source?.id })
102
+ const session = source?.ephemeral ? createEphemeralSession({ cwd, root, forkedFrom: source.id }) : createSession({ cwd, root, forkedFrom: source?.id })
96
103
  for (const event of events) session.append(event)
97
104
  const title = makeEvent('title', { text: label })
98
105
  session.append(title)