@astralyn/pi 0.86.1 → 0.87.1

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 (125) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/bundle/chunks/{anthropic-messages-R2LYJUDD.js → anthropic-messages-XWFTZP2N.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-GTBMYBFG.js → chunk-772GXEFD.js} +50 -44
  4. package/dist/bundle/chunks/chunk-CDMUKIXY.js +2 -0
  5. package/dist/bundle/chunks/github-copilot.js +1 -1
  6. package/dist/bundle/chunks/{openai-completions-6SMWQWQN.js → openai-completions-SHS3CAEL.js} +2 -2
  7. package/dist/bundle/chunks/{virtual-modules-OHUZ2T7X.js → virtual-modules-LQO2MG3T.js} +1 -1
  8. package/dist/bundle/cli.js +1 -1
  9. package/dist/bundle/index.js +1 -1
  10. package/dist/bundle/rpc-entry.js +1 -1
  11. package/dist/cli/args.d.ts.map +1 -1
  12. package/dist/cli/args.js +14 -4
  13. package/dist/cli/args.js.map +1 -1
  14. package/dist/cli/file-processor.d.ts +1 -1
  15. package/dist/cli/file-processor.d.ts.map +1 -1
  16. package/dist/cli/file-processor.js.map +1 -1
  17. package/dist/core/agent-session-runtime.js +1 -1
  18. package/dist/core/agent-session-runtime.js.map +1 -1
  19. package/dist/core/agent-session.d.ts +47 -4
  20. package/dist/core/agent-session.d.ts.map +1 -1
  21. package/dist/core/agent-session.js +476 -139
  22. package/dist/core/agent-session.js.map +1 -1
  23. package/dist/core/background/service.d.ts +9 -0
  24. package/dist/core/background/service.d.ts.map +1 -1
  25. package/dist/core/background/service.js +13 -1
  26. package/dist/core/background/service.js.map +1 -1
  27. package/dist/core/background/session.d.ts +5 -0
  28. package/dist/core/background/session.d.ts.map +1 -1
  29. package/dist/core/background/session.js +2 -1
  30. package/dist/core/background/session.js.map +1 -1
  31. package/dist/core/cache-warmer.d.ts +1 -0
  32. package/dist/core/cache-warmer.d.ts.map +1 -1
  33. package/dist/core/cache-warmer.js +15 -1
  34. package/dist/core/cache-warmer.js.map +1 -1
  35. package/dist/core/compaction/compaction.d.ts +3 -1
  36. package/dist/core/compaction/compaction.d.ts.map +1 -1
  37. package/dist/core/compaction/compaction.js +155 -57
  38. package/dist/core/compaction/compaction.js.map +1 -1
  39. package/dist/core/crash-log.d.ts +5 -0
  40. package/dist/core/crash-log.d.ts.map +1 -1
  41. package/dist/core/crash-log.js +68 -0
  42. package/dist/core/crash-log.js.map +1 -1
  43. package/dist/core/export-html/template.js +6 -1
  44. package/dist/core/extensions/index.d.ts +1 -1
  45. package/dist/core/extensions/index.d.ts.map +1 -1
  46. package/dist/core/extensions/index.js.map +1 -1
  47. package/dist/core/extensions/runner.d.ts +16 -3
  48. package/dist/core/extensions/runner.d.ts.map +1 -1
  49. package/dist/core/extensions/runner.js +110 -5
  50. package/dist/core/extensions/runner.js.map +1 -1
  51. package/dist/core/extensions/types.d.ts +77 -6
  52. package/dist/core/extensions/types.d.ts.map +1 -1
  53. package/dist/core/extensions/types.js.map +1 -1
  54. package/dist/core/index.d.ts +1 -1
  55. package/dist/core/index.d.ts.map +1 -1
  56. package/dist/core/index.js.map +1 -1
  57. package/dist/core/model-config.d.ts +52 -0
  58. package/dist/core/model-config.d.ts.map +1 -1
  59. package/dist/core/model-config.js +16 -0
  60. package/dist/core/model-config.js.map +1 -1
  61. package/dist/core/model-resolver.js +1 -1
  62. package/dist/core/model-resolver.js.map +1 -1
  63. package/dist/core/prompt-templates.d.ts +6 -1
  64. package/dist/core/prompt-templates.d.ts.map +1 -1
  65. package/dist/core/prompt-templates.js +61 -35
  66. package/dist/core/prompt-templates.js.map +1 -1
  67. package/dist/core/provider-composer.d.ts +1 -0
  68. package/dist/core/provider-composer.d.ts.map +1 -1
  69. package/dist/core/provider-composer.js +19 -0
  70. package/dist/core/provider-composer.js.map +1 -1
  71. package/dist/core/resource-loader.d.ts.map +1 -1
  72. package/dist/core/resource-loader.js +6 -2
  73. package/dist/core/resource-loader.js.map +1 -1
  74. package/dist/core/sdk.d.ts.map +1 -1
  75. package/dist/core/sdk.js +3 -4
  76. package/dist/core/sdk.js.map +1 -1
  77. package/dist/core/session-manager.d.ts +36 -9
  78. package/dist/core/session-manager.d.ts.map +1 -1
  79. package/dist/core/session-manager.js +97 -7
  80. package/dist/core/session-manager.js.map +1 -1
  81. package/dist/core/tools/read.d.ts +4 -1
  82. package/dist/core/tools/read.d.ts.map +1 -1
  83. package/dist/core/tools/read.js +5 -1
  84. package/dist/core/tools/read.js.map +1 -1
  85. package/dist/extensions/btw/agent.d.ts.map +1 -1
  86. package/dist/extensions/btw/agent.js +8 -5
  87. package/dist/extensions/btw/agent.js.map +1 -1
  88. package/dist/index.d.ts +2 -2
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +1 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/main.d.ts.map +1 -1
  93. package/dist/main.js +4 -3
  94. package/dist/main.js.map +1 -1
  95. package/dist/modes/interactive/bug-report.d.ts.map +1 -1
  96. package/dist/modes/interactive/bug-report.js +4 -0
  97. package/dist/modes/interactive/bug-report.js.map +1 -1
  98. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  99. package/dist/modes/interactive/components/tree-selector.js +7 -0
  100. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  101. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  102. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  103. package/dist/modes/interactive/interactive-mode.js +64 -2
  104. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  105. package/dist/utils/mime.js +1 -1
  106. package/dist/utils/mime.js.map +1 -1
  107. package/dist/utils/tool-result-images.d.ts +3 -1
  108. package/dist/utils/tool-result-images.d.ts.map +1 -1
  109. package/dist/utils/tool-result-images.js +4 -1
  110. package/dist/utils/tool-result-images.js.map +1 -1
  111. package/docs/bundled/extensions/background.md +3 -3
  112. package/docs/bundled/extensions/subagent.md +1 -1
  113. package/docs/compaction.md +24 -5
  114. package/docs/extensions.md +72 -8
  115. package/docs/models.md +30 -1
  116. package/docs/sdk.md +15 -4
  117. package/docs/session-format.md +25 -4
  118. package/docs/usage.md +3 -0
  119. package/examples/README.md +11 -1
  120. package/examples/plugins/pi-example-plugin/src/session.ts +3 -2
  121. package/examples/rpc-client.ts +35 -0
  122. package/examples/rpc-extension-ui.ts +25 -5
  123. package/npm-shrinkwrap.json +43 -43
  124. package/package.json +8 -8
  125. package/dist/bundle/chunks/chunk-DAEM5JIZ.js +0 -2
package/CHANGELOG.md CHANGED
@@ -4,6 +4,51 @@ This file records `@astralyn/pi` releases beginning with the first Fork-owned re
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.87.1] - 2026-09-23
8
+
9
+ ### Added
10
+
11
+ - Adopted upstream v0.87.1: Claude Opus 5.5 through Anthropic with adaptive thinking and a 1M context window, GPT-6 Sol and GPT-6 Luna through OpenAI API keys and Codex subscriptions, and all three through GitHub Copilot.
12
+
13
+ ### Changed
14
+
15
+ - Background completion delivery now follows the interactive prompt queueing path: a completion is steered into a running turn and lands right after that turn's current tool batch, instead of waiting for the session to become idle. An idle session still starts a completion turn. User preflight (input hooks, model and authentication checks, compaction) still holds delivery, so a user message is always the first thing a new run sees, and a `bg wait`/`bg read` still defers the announcement of the task it holds pinned.
16
+ - New xAI sessions default to Grok 4.7.
17
+ - Split-turn compaction summaries now separate the conversation from the instructions and use continuation-oriented wording, so a model no longer treats the retained later messages as content it must reconstruct ([#9908](https://github.com/earendil-works/pi/pull/9908)).
18
+ - Upgraded the seven `@earendil-works/*` dependencies to `0.87.1`. Inherited: image-only user messages no longer carry an empty text part that some OpenAI-compatible providers rejected ([#9797](https://github.com/earendil-works/pi/issues/9797)), and Anthropic OAuth requests report the current Claude Code version.
19
+
20
+ ### Fixed
21
+
22
+ - A missing or invalid `--mode` value is reported as an error and pi exits with a nonzero status instead of silently ignoring it ([#9045](https://github.com/earendil-works/pi/issues/9045)).
23
+
24
+ ## [0.87.0] - 2026-09-22
25
+
26
+ ### Added
27
+
28
+ - Adopted upstream v0.87.0. Session model context is now projected from append-only history: a `context_edit` entry (`ContextEditEntry`) omits or replaces one earlier message for future model requests without changing raw history, usage, or the UI. `sessionManager.appendContextEdit()`, `buildSessionProjection()`, and retain-none compaction (`appendCompaction(summary, null, tokensBefore)`) are public; `/tree` and HTML export list the new entries as bookkeeping.
29
+ - Added actionable `turn_end` and `agent_before_settle` extension boundaries: handlers can append `custom`, `custom_message`, `context_edit`, and `compaction` entries in order and request one continuation. `TurnEndEvent` now carries `messageEntryId`, `toolResultEntryIds`, and `outcome`.
30
+ - Added the `context_with_system` extension event, which sees the full transcript including system messages after every `context` handler has run and Pi has restored the prompt and tool declarations.
31
+ - Added per-model image input limits: `inputLimits.images.resize` in `models.json` (deep-merged by `modelOverrides`) is applied to `@file` attachments, the `read` tool, and tool-result images once, before they enter history and after `before_agent_start` has selected the model.
32
+ - Crash diagnostics now name loaded extensions whose source files appear in the stack trace.
33
+
34
+ ### Changed
35
+
36
+ - `SessionManager` is canonical for provider context. `agent.state.messages` is a refreshed inspection cache, and assigning it no longer replaces request history: restore with `SessionManager.inMemory(cwd, { id }, entries)`, navigate with `session.navigateTree()`, or append through `session.sessionManager` and call `session.refreshContext()`. `ctx.getContextSnapshot()` and BTW read the same projection.
37
+ - `context` handlers no longer see system messages; Pi replays the prompt and tool declarations after a handler changes the conversation, so filtering or slicing from a compaction summary cannot drop built-in tools ([#9789](https://github.com/earendil-works/pi/issues/9789), [#9822](https://github.com/earendil-works/pi/issues/9822)).
38
+ - Auto-retry and overflow/length recovery now persist `context_edit` omissions for the abandoned attempt instead of dropping it from agent state; compaction, token estimates, and `/session` context usage follow the edited projection.
39
+ - Runs requested from `agent_settled` handlers start after all settled handlers finish, and this distribution keeps Background completion delivery paused until those deferred runs have started.
40
+ - BTW's step and context limits moved from the removed `shouldStopAfterTurn` agent option to `finishTurn`.
41
+ - Upgraded the seven `@earendil-works/*` dependencies to `0.87.0`. Inherited: unknown OpenAI-compatible Chat Completions endpoints no longer receive strict tool schemas unless they advertise support ([#9816](https://github.com/earendil-works/pi/issues/9816)), and chord replicated state is mutated through `change()`/`replace()`.
42
+ - `ExtensionRunner.emit()` no longer accepts `turn_end`; hosts dispatch `turn_end` and `agent_before_settle` through `emitBoundary()`.
43
+
44
+ ### Fixed
45
+
46
+ - `/bug` no longer offers uploads in offline mode; zip export still works ([#9841](https://github.com/earendil-works/pi/pull/9841)).
47
+ - Text files beginning with `GIF` are no longer misclassified as images by `read` and `@file` input ([#9755](https://github.com/earendil-works/pi/issues/9755)).
48
+ - Malformed prompt template frontmatter is reported as a resource warning instead of being silently ignored ([#9830](https://github.com/earendil-works/pi/pull/9830)).
49
+ - Idle prompt-cache warming stops instead of rebuilding an expired cache when its timer or an extension decision runs late.
50
+ - String context-edit replacements now produce text blocks for assistant and tool-result messages, newly appended or replaced input is no longer summarized before its first provider request, and stale assistant usage captured before a later edit or compaction is no longer reused.
51
+
7
52
  ## [0.86.1] - 2026-09-21
8
53
 
9
54
  ### Added
@@ -1,5 +1,5 @@
1
1
  import { createRequire as __piCreateRequire } from "node:module"; const require = __piCreateRequire(import.meta.url);
2
- import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-37ATLPRE.js";import{Anthropic}from"./chunk-PJVFYVHE.js";import{retryProviderRequest}from"./chunk-UUSTLCVC.js";import{adjustMaxTokensForThinking,buildBaseOptions,clampMaxTokensToContext,getJsonSchemaToolParameters,getPiUserAgent,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-I5IVW2WS.js";import{sanitizeSurrogates}from"./chunk-UP6RLTHQ.js";import{headersToRecord}from"./chunk-EDBLK2JQ.js";import{getProviderEnvValue}from"./chunk-5FDOJRDS.js";import{parseJsonWithRepair,parseStreamingJson}from"./chunk-5B3S5DVL.js";import{calculateCost,getCurrentTools,getDeclaredTools,getInitialSystemMessage,getSystemMessageText,hasToolRedefinitions,renderSystemMessageUpdate,resolveTranscript}from"./chunk-2IO5GDBS.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic}from"./chunk-JI4WGISU.js";import"./chunk-4L3WN2XY.js";function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}function getCacheControl(model,cacheRetention,env){let retention=resolveCacheRetention(cacheRetention,env);if(retention==="none")return{retention};let ttl=retention==="long"&&getAnthropicCompat(model).supportsLongCacheRetention?"1h":void 0;return{retention,cacheControl:{type:"ephemeral",...ttl&&{ttl}}}}var claudeCodeVersion="2.1.251",claudeCodeTools=["Read","Write","Edit","Bash","Grep","Glob","AskUserQuestion","EnterPlanMode","ExitPlanMode","KillShell","NotebookEdit","Skill","Task","TaskOutput","TodoWrite","WebFetch","WebSearch"],ccToolLookup=new Map(claudeCodeTools.map(t=>[t.toLowerCase(),t])),toClaudeCodeName=name=>ccToolLookup.get(name.toLowerCase())??name,fromClaudeCodeName=(name,tools)=>{if(tools&&tools.length>0){let lowerName=name.toLowerCase(),matchedTool=tools.find(tool=>tool.name.toLowerCase()===lowerName);if(matchedTool)return matchedTool.name}return name};function convertContentBlocks(content){if(!content.some(c=>c.type==="image"))return sanitizeSurrogates(content.map(c=>c.text).join(`
2
+ import{buildCopilotDynamicHeaders,hasCopilotVisionInput}from"./chunk-37ATLPRE.js";import{Anthropic}from"./chunk-PJVFYVHE.js";import{retryProviderRequest}from"./chunk-UUSTLCVC.js";import{adjustMaxTokensForThinking,buildBaseOptions,clampMaxTokensToContext,getJsonSchemaToolParameters,getPiUserAgent,resolveJsonSchemaStrictSampling,transformMessages}from"./chunk-I5IVW2WS.js";import{sanitizeSurrogates}from"./chunk-UP6RLTHQ.js";import{headersToRecord}from"./chunk-EDBLK2JQ.js";import{getProviderEnvValue}from"./chunk-5FDOJRDS.js";import{parseJsonWithRepair,parseStreamingJson}from"./chunk-5B3S5DVL.js";import{calculateCost,getCurrentTools,getDeclaredTools,getInitialSystemMessage,getSystemMessageText,hasToolRedefinitions,renderSystemMessageUpdate,resolveTranscript}from"./chunk-2IO5GDBS.js";import{AssistantMessageEventStream,appendAssistantMessageDiagnostic}from"./chunk-JI4WGISU.js";import"./chunk-4L3WN2XY.js";function resolveCacheRetention(cacheRetention,env){return cacheRetention||(getProviderEnvValue("PI_CACHE_RETENTION",env)==="long"?"long":"short")}function getCacheControl(model,cacheRetention,env){let retention=resolveCacheRetention(cacheRetention,env);if(retention==="none")return{retention};let ttl=retention==="long"&&getAnthropicCompat(model).supportsLongCacheRetention?"1h":void 0;return{retention,cacheControl:{type:"ephemeral",...ttl&&{ttl}}}}var claudeCodeVersion="2.1.280",claudeCodeTools=["Read","Write","Edit","Bash","Grep","Glob","AskUserQuestion","EnterPlanMode","ExitPlanMode","KillShell","NotebookEdit","Skill","Task","TaskOutput","TodoWrite","WebFetch","WebSearch"],ccToolLookup=new Map(claudeCodeTools.map(t=>[t.toLowerCase(),t])),toClaudeCodeName=name=>ccToolLookup.get(name.toLowerCase())??name,fromClaudeCodeName=(name,tools)=>{if(tools&&tools.length>0){let lowerName=name.toLowerCase(),matchedTool=tools.find(tool=>tool.name.toLowerCase()===lowerName);if(matchedTool)return matchedTool.name}return name};function convertContentBlocks(content){if(!content.some(c=>c.type==="image"))return sanitizeSurrogates(content.map(c=>c.text).join(`
3
3
  `));let blocks=content.map(block=>block.type==="text"?{type:"text",text:sanitizeSurrogates(block.text)}:{type:"image",source:{type:"base64",media_type:block.mimeType,data:block.data}});return blocks.some(b=>b.type==="text")||blocks.unshift({type:"text",text:"(see attached image)"}),blocks}var FINE_GRAINED_TOOL_STREAMING_BETA="fine-grained-tool-streaming-2025-05-14",INTERLEAVED_THINKING_BETA="interleaved-thinking-2025-05-14",SERVER_SIDE_FALLBACK_BETA="server-side-fallback-2026-07-01",MID_CONVERSATION_OUTPUT_CONFIG_BETA="mid-conversation-output-config-2026-07-01",THINKING_BINDING_CONTROLS_BETA="thinking-binding-controls-2026-08-01",MID_CONVERSATION_TOOL_CHANGES_BETA="mid-conversation-tool-changes-2026-07-01",DEFERRED_TOOL_PLACEHOLDER={name:"__pi_deferred_placeholder__",description:"Reserved placeholder. Never available. Never call this.",input_schema:{type:"object",properties:{},required:[]},defer_loading:!0};function shouldUseServerSideFallbackBeta(model){return(model.compat?.allowedFallbackModels?.length??0)>0}function getAnthropicCompat(model){let isOpenRouter=model.provider==="openrouter"||model.baseUrl.includes("openrouter.ai");return{supportsEagerToolInputStreaming:model.compat?.supportsEagerToolInputStreaming??!0,supportsLongCacheRetention:model.compat?.supportsLongCacheRetention??!0,sendSessionAffinityHeaders:model.compat?.sendSessionAffinityHeaders??isOpenRouter,sessionAffinityFormat:model.compat?.sessionAffinityFormat??(isOpenRouter?"openrouter":void 0),supportsCacheControlOnTools:model.compat?.supportsCacheControlOnTools??!0,supportsTemperature:model.compat?.supportsTemperature??!0,allowEmptySignature:model.compat?.allowEmptySignature??!1,supportsStrictTools:model.compat?.supportsStrictTools??!1,supportsMidConvoSystemMessages:model.compat?.supportsMidConvoSystemMessages??!1,supportsMidConvoToolChanges:model.compat?.supportsMidConvoToolChanges??!1}}function mergeHeaders(...headerSources){let merged={};for(let headers of headerSources)headers&&Object.assign(merged,headers);return merged}function mergeClientHeaders(...headerSources){return mergeHeaders({"User-Agent":getPiUserAgent()},...headerSources)}function hasHeader(headers,name){if(!headers)return!1;let expected=name.toLowerCase();for(let[key,value]of Object.entries(headers))if(key.toLowerCase()===expected&&value!==null&&value.trim().length>0)return!0;return!1}function assertRequestAuth(provider,apiKey,headers){if(!apiKey&&!(hasHeader(headers,"authorization")||hasHeader(headers,"x-api-key")||hasHeader(headers,"cf-aig-authorization")))throw new Error(`No API key for provider: ${provider}`)}var ANTHROPIC_MESSAGE_EVENTS=new Set(["message_start","message_delta","message_stop","content_block_start","content_block_delta","content_block_stop"]);function flushSseEvent(state){if(!state.event&&state.data.length===0)return null;let event={event:state.event,data:state.data.join(`
4
4
  `),raw:[...state.raw]};return state.event=null,state.data=[],state.raw=[],event}function decodeSseLine(line,state){if(line==="")return flushSseEvent(state);if(state.raw.push(line),line.startsWith(":"))return null;let delimiterIndex=line.indexOf(":"),fieldName=delimiterIndex===-1?line:line.slice(0,delimiterIndex),value=delimiterIndex===-1?"":line.slice(delimiterIndex+1);return value.startsWith(" ")&&(value=value.slice(1)),fieldName==="event"?state.event=value:fieldName==="data"&&state.data.push(value),null}function nextLineBreakIndex(text){let carriageReturnIndex=text.indexOf("\r"),newlineIndex=text.indexOf(`
5
5
  `);return carriageReturnIndex===-1?newlineIndex:newlineIndex===-1?carriageReturnIndex:Math.min(carriageReturnIndex,newlineIndex)}function consumeLine(text){let lineBreakIndex=nextLineBreakIndex(text);if(lineBreakIndex===-1)return null;let nextIndex=lineBreakIndex+1;return text[lineBreakIndex]==="\r"&&text[nextIndex]===`