@phi-code-admin/phi-code 0.76.16 → 0.77.0

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 (81) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/core/agent-session.d.ts.map +1 -1
  3. package/dist/core/agent-session.js +20 -3
  4. package/dist/core/agent-session.js.map +1 -1
  5. package/dist/core/api-key-store.d.ts +1 -1
  6. package/dist/core/api-key-store.d.ts.map +1 -1
  7. package/dist/core/api-key-store.js +5 -2
  8. package/dist/core/api-key-store.js.map +1 -1
  9. package/dist/core/auth-storage.d.ts.map +1 -1
  10. package/dist/core/auth-storage.js +3 -3
  11. package/dist/core/auth-storage.js.map +1 -1
  12. package/dist/core/bash-executor.d.ts.map +1 -1
  13. package/dist/core/bash-executor.js +4 -1
  14. package/dist/core/bash-executor.js.map +1 -1
  15. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  16. package/dist/core/compaction/branch-summarization.js +7 -2
  17. package/dist/core/compaction/branch-summarization.js.map +1 -1
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +4 -0
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/keybindings.d.ts +5 -0
  22. package/dist/core/keybindings.d.ts.map +1 -1
  23. package/dist/core/keybindings.js +4 -0
  24. package/dist/core/keybindings.js.map +1 -1
  25. package/dist/core/model-registry.d.ts.map +1 -1
  26. package/dist/core/model-registry.js +6 -2
  27. package/dist/core/model-registry.js.map +1 -1
  28. package/dist/core/model-resolver.d.ts.map +1 -1
  29. package/dist/core/model-resolver.js +9 -3
  30. package/dist/core/model-resolver.js.map +1 -1
  31. package/dist/core/session-manager.d.ts.map +1 -1
  32. package/dist/core/session-manager.js +36 -5
  33. package/dist/core/session-manager.js.map +1 -1
  34. package/dist/core/settings-manager.d.ts.map +1 -1
  35. package/dist/core/settings-manager.js +15 -4
  36. package/dist/core/settings-manager.js.map +1 -1
  37. package/dist/core/tools/bash.d.ts.map +1 -1
  38. package/dist/core/tools/bash.js +2 -0
  39. package/dist/core/tools/bash.js.map +1 -1
  40. package/dist/core/tools/find.d.ts.map +1 -1
  41. package/dist/core/tools/find.js +3 -1
  42. package/dist/core/tools/find.js.map +1 -1
  43. package/dist/core/tools/output-accumulator.d.ts +1 -0
  44. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  45. package/dist/core/tools/output-accumulator.js +12 -1
  46. package/dist/core/tools/output-accumulator.js.map +1 -1
  47. package/dist/core/tools/read.d.ts.map +1 -1
  48. package/dist/core/tools/read.js +3 -1
  49. package/dist/core/tools/read.js.map +1 -1
  50. package/dist/migrations.d.ts.map +1 -1
  51. package/dist/migrations.js +27 -7
  52. package/dist/migrations.js.map +1 -1
  53. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  54. package/dist/modes/interactive/components/custom-editor.js +16 -1
  55. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  56. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  57. package/dist/modes/interactive/components/diff.js +4 -2
  58. package/dist/modes/interactive/components/diff.js.map +1 -1
  59. package/dist/modes/interactive/components/footer.d.ts +9 -0
  60. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  61. package/dist/modes/interactive/components/footer.js +29 -4
  62. package/dist/modes/interactive/components/footer.js.map +1 -1
  63. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  64. package/dist/modes/interactive/components/login-dialog.js +10 -4
  65. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  66. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  67. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  68. package/dist/modes/interactive/interactive-mode.js +80 -8
  69. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  70. package/dist/utils/sleep.d.ts.map +1 -1
  71. package/dist/utils/sleep.js +7 -3
  72. package/dist/utils/sleep.js.map +1 -1
  73. package/extensions/phi/benchmark.ts +9 -2
  74. package/extensions/phi/init.ts +4 -1
  75. package/extensions/phi/keys.ts +13 -0
  76. package/extensions/phi/memory.ts +4 -1
  77. package/extensions/phi/orchestrator.ts +115 -25
  78. package/extensions/phi/providers/opencode-go.ts +22 -12
  79. package/extensions/phi/setup.ts +8 -1
  80. package/extensions/phi/web-search.ts +15 -3
  81. package/package.json +1 -1
@@ -217,8 +217,15 @@ export class AgentSession {
217
217
  // =========================================================================
218
218
  /** Emit an event to all listeners */
219
219
  _emit(event) {
220
+ // Isolate each listener so a throwing listener cannot abort the broadcast
221
+ // and silently drop the event for the remaining listeners.
220
222
  for (const l of this._eventListeners) {
221
- l(event);
223
+ try {
224
+ l(event);
225
+ }
226
+ catch (err) {
227
+ console.error("AgentSession listener error", err);
228
+ }
222
229
  }
223
230
  }
224
231
  _emitQueueUpdate() {
@@ -1247,6 +1254,10 @@ export class AgentSession {
1247
1254
  * @param customInstructions Optional instructions for the compaction summary
1248
1255
  */
1249
1256
  async compact(customInstructions) {
1257
+ // Abort any in-flight auto-compaction first. abort() only cancels retry and
1258
+ // the agent, not _autoCompactionAbortController, so without this a concurrent
1259
+ // auto-compaction could append a second compaction entry and rebuild state twice.
1260
+ this.abortCompaction();
1250
1261
  this._disconnectFromAgent();
1251
1262
  await this.abort();
1252
1263
  this._compactionAbortController = new AbortController();
@@ -1932,7 +1943,7 @@ export class AgentSession {
1932
1943
  return false;
1933
1944
  const err = message.errorMessage;
1934
1945
  // Match: overloaded_error, provider returned error, rate limit, 429, 500, 502, 503, 504, service unavailable, network/connection errors (including connection lost), WebSocket transport closes/errors, fetch failed, request ended without sending chunks, HTTP/2 closed before response, terminated, retry delay exceeded
1935
- return /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|websocket.?closed|websocket.?error|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|http2 request did not get a response|timed? out|timeout|terminated|retry delay/i.test(err);
1946
+ return /overloaded|provider.?returned.?error|rate.?limit|too many requests|\b(429|500|502|503|504)\b|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|websocket.?closed|websocket.?error|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|http2 request did not get a response|timed? out|timeout|terminated|retry delay/i.test(err);
1936
1947
  }
1937
1948
  /**
1938
1949
  * Handle retryable errors with exponential backoff.
@@ -1996,9 +2007,15 @@ export class AgentSession {
1996
2007
  this._resolveRetry();
1997
2008
  return false;
1998
2009
  }
1999
- this._retryAbortController = undefined;
2010
+ // Keep _retryAbortController set across the deferred tick so abortRetry() in the
2011
+ // gap between the resolved sleep and the setTimeout callback can still mark the
2012
+ // signal aborted. Capture the signal and clear the controller inside the callback.
2013
+ const signal = this._retryAbortController.signal;
2000
2014
  // Retry via continue() - use setTimeout to break out of event handler chain
2001
2015
  setTimeout(() => {
2016
+ this._retryAbortController = undefined;
2017
+ if (signal.aborted)
2018
+ return;
2002
2019
  this.agent.continue().catch(() => {
2003
2020
  // Retry failed - will be caught by next agent_end
2004
2021
  });