picocode-core 0.9.178 → 0.9.179

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/derive.js +19 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "picocode-core",
3
- "version": "0.9.178",
3
+ "version": "0.9.179",
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/derive.js CHANGED
@@ -183,6 +183,14 @@ export function deriveState(events) {
183
183
  toolTrimVersions: new Map(),
184
184
  }
185
185
 
186
+ const references = toolResultArchive(events).references
187
+ const historyTokens = () => Math.ceil(JSON.stringify(applyToolTrims(
188
+ elideStaleToolResults(state.providerHistory), state.trimmedToolIds,
189
+ state.toolTrimVersions, state.toolItems, references,
190
+ )).length / 4)
191
+ let measuredBaseline = null
192
+ let contextEdited = false
193
+
186
194
  for (const event of effectiveEvents) {
187
195
  if (event.type === 'usage') {
188
196
  if (!dropped.has(event.id)) {
@@ -194,6 +202,8 @@ export function deriveState(events) {
194
202
  if (event.data.lastPrompt !== undefined) {
195
203
  state.lastPromptTokens = event.data.lastPrompt
196
204
  state.lastPromptModel = event.data.model
205
+ measuredBaseline = { tokens: event.data.lastPrompt, history: historyTokens() }
206
+ contextEdited = false
197
207
  }
198
208
  }
199
209
  continue
@@ -238,6 +248,8 @@ export function deriveState(events) {
238
248
  if (!canceledUndoTargets.has(event.id)) foldRewind(state, event)
239
249
  break
240
250
  case 'compact': {
251
+ measuredBaseline = null
252
+ contextEdited = false
241
253
  const { summary, keepFrom, sessionFile } = event.data
242
254
  if (keepFrom !== undefined || sessionFile) {
243
255
  const idx = keepFrom ? state.historyEventIds.indexOf(keepFrom) : -1
@@ -260,6 +272,7 @@ export function deriveState(events) {
260
272
  break
261
273
  }
262
274
  case 'tool_trim':
275
+ contextEdited = true
263
276
  for (const callId of event.data.callIds || []) {
264
277
  state.trimmedToolIds.add(callId)
265
278
  state.toolTrimVersions.set(callId, event.data.version?.algorithm || 'tool-trim-v1')
@@ -267,10 +280,13 @@ export function deriveState(events) {
267
280
  state.lastPromptTokens = 0
268
281
  break
269
282
  case 'tool_restore':
283
+ contextEdited = true
270
284
  for (const callId of event.data.callIds || []) state.trimmedToolIds.delete(callId)
271
285
  state.lastPromptTokens = 0
272
286
  break
273
287
  case 'clear':
288
+ measuredBaseline = null
289
+ contextEdited = false
274
290
  state.transcript = []
275
291
  state.providerHistory = []
276
292
  state.historyEventIds = []
@@ -303,6 +319,9 @@ export function deriveState(events) {
303
319
  }
304
320
  }
305
321
 
322
+ state.estimatedPromptTokens = contextEdited && measuredBaseline
323
+ ? Math.max(0, measuredBaseline.tokens + historyTokens() - measuredBaseline.history)
324
+ : null
306
325
  const effectiveHistory = elideStaleToolResults(state.providerHistory)
307
326
  state.providerHistory = applyToolTrims(effectiveHistory, state.trimmedToolIds, state.toolTrimVersions, state.toolItems, toolResultArchive(events).references)
308
327
  annotateToolContext(state, state.providerHistory, state.trimmedToolIds)