@astralyn/pi 1.4.9 → 1.4.10

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 (204) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/bundle/chunks/{chunk-3PKXUKTB.js → chunk-6GTUUUCJ.js} +123 -123
  3. package/dist/bundle/chunks/{chunk-BAGHIP5J.js → chunk-MF3T3ETJ.js} +3 -3
  4. package/dist/bundle/chunks/{chunk-F66AY3WR.js → chunk-UCH27AVQ.js} +1 -1
  5. package/dist/bundle/chunks/{execute-P22VMM2H.js → execute-FQKRO4XJ.js} +1 -1
  6. package/dist/bundle/chunks/{virtual-modules-VKMBQTR2.js → virtual-modules-6IJ6V2CG.js} +1 -1
  7. package/dist/bundle/cli.js +1 -1
  8. package/dist/bundle/index.js +1 -1
  9. package/dist/bundle/rpc-entry.js +1 -1
  10. package/dist/core/agent-session.d.ts +34 -0
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +99 -2
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/isolated-session.d.ts +7 -2
  15. package/dist/core/isolated-session.d.ts.map +1 -1
  16. package/dist/core/isolated-session.js +7 -3
  17. package/dist/core/isolated-session.js.map +1 -1
  18. package/dist/core/session-manager.d.ts +17 -1
  19. package/dist/core/session-manager.d.ts.map +1 -1
  20. package/dist/core/session-manager.js +29 -0
  21. package/dist/core/session-manager.js.map +1 -1
  22. package/dist/core/tasks/delivery.d.ts +42 -7
  23. package/dist/core/tasks/delivery.d.ts.map +1 -1
  24. package/dist/core/tasks/delivery.js +129 -15
  25. package/dist/core/tasks/delivery.js.map +1 -1
  26. package/dist/core/tasks/execution.d.ts +27 -14
  27. package/dist/core/tasks/execution.d.ts.map +1 -1
  28. package/dist/core/tasks/execution.js +90 -86
  29. package/dist/core/tasks/execution.js.map +1 -1
  30. package/dist/core/tasks/limits.d.ts +13 -1
  31. package/dist/core/tasks/limits.d.ts.map +1 -1
  32. package/dist/core/tasks/limits.js +14 -1
  33. package/dist/core/tasks/limits.js.map +1 -1
  34. package/dist/core/tasks/output.d.ts +9 -1
  35. package/dist/core/tasks/output.d.ts.map +1 -1
  36. package/dist/core/tasks/output.js +23 -10
  37. package/dist/core/tasks/output.js.map +1 -1
  38. package/dist/core/tasks/presentation.d.ts +1 -1
  39. package/dist/core/tasks/presentation.d.ts.map +1 -1
  40. package/dist/core/tasks/presentation.js +6 -4
  41. package/dist/core/tasks/presentation.js.map +1 -1
  42. package/dist/core/tasks/record.d.ts +41 -29
  43. package/dist/core/tasks/record.d.ts.map +1 -1
  44. package/dist/core/tasks/record.js +82 -37
  45. package/dist/core/tasks/record.js.map +1 -1
  46. package/dist/core/tasks/reminder.js +2 -2
  47. package/dist/core/tasks/reminder.js.map +1 -1
  48. package/dist/core/tasks/runtime.d.ts +17 -14
  49. package/dist/core/tasks/runtime.d.ts.map +1 -1
  50. package/dist/core/tasks/runtime.js +68 -116
  51. package/dist/core/tasks/runtime.js.map +1 -1
  52. package/dist/core/tasks/scheduler.d.ts +3 -1
  53. package/dist/core/tasks/scheduler.d.ts.map +1 -1
  54. package/dist/core/tasks/scheduler.js +16 -12
  55. package/dist/core/tasks/scheduler.js.map +1 -1
  56. package/dist/core/tasks/session.d.ts +24 -3
  57. package/dist/core/tasks/session.d.ts.map +1 -1
  58. package/dist/core/tasks/session.js +73 -9
  59. package/dist/core/tasks/session.js.map +1 -1
  60. package/dist/core/tasks/store.d.ts +17 -4
  61. package/dist/core/tasks/store.d.ts.map +1 -1
  62. package/dist/core/tasks/store.js +45 -48
  63. package/dist/core/tasks/store.js.map +1 -1
  64. package/dist/core/tasks/types.d.ts +72 -29
  65. package/dist/core/tasks/types.d.ts.map +1 -1
  66. package/dist/core/tasks/types.js +7 -0
  67. package/dist/core/tasks/types.js.map +1 -1
  68. package/dist/core/tasks/wait.d.ts +19 -0
  69. package/dist/core/tasks/wait.d.ts.map +1 -0
  70. package/dist/core/tasks/wait.js +45 -0
  71. package/dist/core/tasks/wait.js.map +1 -0
  72. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  73. package/dist/core/tools/shell-execution.js +2 -1
  74. package/dist/core/tools/shell-execution.js.map +1 -1
  75. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  76. package/dist/core/tools/shell-tool.js +20 -13
  77. package/dist/core/tools/shell-tool.js.map +1 -1
  78. package/dist/extensions/agent/activity-lines.d.ts +10 -0
  79. package/dist/extensions/agent/activity-lines.d.ts.map +1 -0
  80. package/dist/extensions/agent/activity-lines.js +76 -0
  81. package/dist/extensions/agent/activity-lines.js.map +1 -0
  82. package/dist/extensions/agent/activity.d.ts +25 -4
  83. package/dist/extensions/agent/activity.d.ts.map +1 -1
  84. package/dist/extensions/agent/activity.js +76 -21
  85. package/dist/extensions/agent/activity.js.map +1 -1
  86. package/dist/extensions/agent/artifacts.d.ts +15 -0
  87. package/dist/extensions/agent/artifacts.d.ts.map +1 -0
  88. package/dist/extensions/agent/artifacts.js +44 -0
  89. package/dist/extensions/agent/artifacts.js.map +1 -0
  90. package/dist/extensions/agent/progress.d.ts +30 -4
  91. package/dist/extensions/agent/progress.d.ts.map +1 -1
  92. package/dist/extensions/agent/progress.js +84 -11
  93. package/dist/extensions/agent/progress.js.map +1 -1
  94. package/dist/extensions/agent/render.d.ts.map +1 -1
  95. package/dist/extensions/agent/render.js +8 -24
  96. package/dist/extensions/agent/render.js.map +1 -1
  97. package/dist/extensions/agent/report.d.ts +11 -3
  98. package/dist/extensions/agent/report.d.ts.map +1 -1
  99. package/dist/extensions/agent/report.js +32 -7
  100. package/dist/extensions/agent/report.js.map +1 -1
  101. package/dist/extensions/agent/tool.d.ts.map +1 -1
  102. package/dist/extensions/agent/tool.js +20 -5
  103. package/dist/extensions/agent/tool.js.map +1 -1
  104. package/dist/extensions/agent/types.d.ts +2 -0
  105. package/dist/extensions/agent/types.d.ts.map +1 -1
  106. package/dist/extensions/agent/types.js.map +1 -1
  107. package/dist/extensions/agent/worker.d.ts +7 -0
  108. package/dist/extensions/agent/worker.d.ts.map +1 -1
  109. package/dist/extensions/agent/worker.js +9 -3
  110. package/dist/extensions/agent/worker.js.map +1 -1
  111. package/dist/extensions/search/index.d.ts.map +1 -1
  112. package/dist/extensions/search/index.js +6 -7
  113. package/dist/extensions/search/index.js.map +1 -1
  114. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  115. package/dist/extensions/tasks/tool/actions.js +15 -11
  116. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  117. package/dist/extensions/tasks/tool/schema.d.ts +1 -1
  118. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  119. package/dist/extensions/tasks/tool/schema.js +5 -5
  120. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  121. package/dist/extensions/tasks/tool/types.d.ts +2 -0
  122. package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
  123. package/dist/extensions/tasks/tool/types.js.map +1 -1
  124. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  125. package/dist/extensions/tasks/tool.js +3 -2
  126. package/dist/extensions/tasks/tool.js.map +1 -1
  127. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  128. package/dist/extensions/tasks/ui/completion-render.js +2 -2
  129. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  130. package/dist/extensions/tasks/ui/footer.d.ts +37 -0
  131. package/dist/extensions/tasks/ui/footer.d.ts.map +1 -0
  132. package/dist/extensions/tasks/ui/footer.js +129 -0
  133. package/dist/extensions/tasks/ui/footer.js.map +1 -0
  134. package/dist/extensions/tasks/ui/frame.d.ts +36 -0
  135. package/dist/extensions/tasks/ui/frame.d.ts.map +1 -0
  136. package/dist/extensions/tasks/ui/frame.js +33 -0
  137. package/dist/extensions/tasks/ui/frame.js.map +1 -0
  138. package/dist/extensions/tasks/ui/help.d.ts +6 -0
  139. package/dist/extensions/tasks/ui/help.d.ts.map +1 -0
  140. package/dist/extensions/tasks/ui/help.js +53 -0
  141. package/dist/extensions/tasks/ui/help.js.map +1 -0
  142. package/dist/extensions/tasks/ui/inspector.d.ts +4 -3
  143. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  144. package/dist/extensions/tasks/ui/inspector.js +25 -6
  145. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  146. package/dist/extensions/tasks/ui/layout.d.ts +15 -18
  147. package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
  148. package/dist/extensions/tasks/ui/layout.js +162 -255
  149. package/dist/extensions/tasks/ui/layout.js.map +1 -1
  150. package/dist/extensions/tasks/ui/list.d.ts +3 -1
  151. package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
  152. package/dist/extensions/tasks/ui/list.js +19 -14
  153. package/dist/extensions/tasks/ui/list.js.map +1 -1
  154. package/dist/extensions/tasks/ui/manager.d.ts +17 -5
  155. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  156. package/dist/extensions/tasks/ui/manager.js +147 -90
  157. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  158. package/dist/extensions/tasks/ui/model.d.ts +32 -5
  159. package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
  160. package/dist/extensions/tasks/ui/model.js +7 -7
  161. package/dist/extensions/tasks/ui/model.js.map +1 -1
  162. package/dist/extensions/tasks/ui/panes.d.ts +40 -0
  163. package/dist/extensions/tasks/ui/panes.d.ts.map +1 -0
  164. package/dist/extensions/tasks/ui/panes.js +144 -0
  165. package/dist/extensions/tasks/ui/panes.js.map +1 -0
  166. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  167. package/dist/extensions/tasks/ui/render.js +11 -7
  168. package/dist/extensions/tasks/ui/render.js.map +1 -1
  169. package/dist/extensions/tasks/ui/viewport.d.ts +12 -4
  170. package/dist/extensions/tasks/ui/viewport.d.ts.map +1 -1
  171. package/dist/extensions/tasks/ui/viewport.js +23 -7
  172. package/dist/extensions/tasks/ui/viewport.js.map +1 -1
  173. package/dist/extensions/tasks/ui/views.d.ts +12 -6
  174. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  175. package/dist/extensions/tasks/ui/views.js +39 -32
  176. package/dist/extensions/tasks/ui/views.js.map +1 -1
  177. package/dist/modes/interactive/components/session-selector.d.ts +11 -1
  178. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  179. package/dist/modes/interactive/components/session-selector.js +43 -17
  180. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  181. package/dist/modes/print-mode.d.ts.map +1 -1
  182. package/dist/modes/print-mode.js +37 -2
  183. package/dist/modes/print-mode.js.map +1 -1
  184. package/dist/modes/rpc/rpc-client.d.ts +11 -0
  185. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  186. package/dist/modes/rpc/rpc-client.js +48 -0
  187. package/dist/modes/rpc/rpc-client.js.map +1 -1
  188. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  189. package/dist/modes/rpc/rpc-mode.js +1 -0
  190. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  191. package/dist/modes/rpc/rpc-types.d.ts +2 -0
  192. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  193. package/dist/modes/rpc/rpc-types.js.map +1 -1
  194. package/docs/bundled/extensions/agent.md +39 -7
  195. package/docs/bundled/tasks.md +25 -21
  196. package/docs/extensions.md +14 -10
  197. package/docs/json.md +3 -0
  198. package/docs/rpc.md +14 -0
  199. package/docs/sdk.md +11 -1
  200. package/docs/session-format.md +10 -4
  201. package/docs/sessions.md +1 -1
  202. package/docs/usage.md +2 -0
  203. package/npm-shrinkwrap.json +2 -2
  204. package/package.json +1 -1
@@ -43,6 +43,7 @@ import { applyToolModifiers, DEFAULT_TOOL_NAMES, } from "./settings-manager.js";
43
43
  import { BUILTIN_PATH_PREFIX, createSyntheticSourceInfo, isSyntheticPath } from "./source-info.js";
44
44
  import { buildSystemPrompt, buildSystemPromptSections, diffSystemPromptSections, normalizeBuildSystemPromptOptions, } from "./system-prompt.js";
45
45
  import { TaskSession } from "./tasks/session.js";
46
+ import { TASKS_TOOL_NAME } from "./tasks/types.js";
46
47
  import { createAllToolDefinitions } from "./tools/index.js";
47
48
  import { createLocalBashOperations } from "./tools/shell-operations.js";
48
49
  import { createToolDefinitionFromAgentTool } from "./tools/tool-definition-wrapper.js";
@@ -113,6 +114,10 @@ export class AgentSession {
113
114
  this._isBeforeSettle = false;
114
115
  this._abortDuringBeforeSettle = false;
115
116
  this._isEmittingAgentSettled = false;
117
+ /** Last observed quiescence; a transition into true emits `session_quiescent` once. */
118
+ this._quiescent = true;
119
+ this._quiescenceDisposed = false;
120
+ this._quiescenceWaiters = new Set();
116
121
  this._deferredSettledActions = [];
117
122
  this._baseToolDefinitions = new Map();
118
123
  /**
@@ -250,6 +255,7 @@ export class AgentSession {
250
255
  // turn, so it still waits for the queues to drain.
251
256
  return this.isStreaming || (this.pendingMessageCount === 0 && !this.agent.hasQueuedMessages());
252
257
  },
258
+ managementActive: () => this.getActiveToolNames().includes(TASKS_TOOL_NAME),
253
259
  deliver: (message, waitForPersistence) => {
254
260
  if (this.isStreaming) {
255
261
  this.agent.steer(message);
@@ -263,6 +269,7 @@ export class AgentSession {
263
269
  onEntry: (entry) => this._emit({ type: "entry_appended", entry }),
264
270
  onError: (event, error) => this._extensionRunner?.emitError({ extensionPath: "<background>", event, error }),
265
271
  });
272
+ this._tasksHost.subscribe(() => this._updateQuiescence());
266
273
  this._scopedModels = config.scopedModels ?? [];
267
274
  this._resourceLoader = config.resourceLoader;
268
275
  this._customTools = config.customTools ?? [];
@@ -316,6 +323,13 @@ export class AgentSession {
316
323
  retryTaskNotifications() {
317
324
  this._tasksHost.delivery.retry();
318
325
  }
326
+ /**
327
+ * Tell the session a background task's completion reached its consumer outside automatic
328
+ * delivery, such as a direct SDK waiter that read the result. It stops waiting to notify the model.
329
+ */
330
+ acknowledgeTaskDelivery(taskId) {
331
+ this._tasksHost.acknowledgeDelivery(taskId);
332
+ }
319
333
  /**
320
334
  * Run a lifecycle operation with delivery paused across its asynchronous gaps.
321
335
  * Lifecycle methods are thin shells over upstream bodies so those keep upstream's shape.
@@ -770,6 +784,82 @@ export class AgentSession {
770
784
  for (const l of this._eventListeners) {
771
785
  l(event);
772
786
  }
787
+ // Compaction runs outside agent runs, so its start is what leaves quiescence.
788
+ if (event.type === "compaction_start")
789
+ this._updateQuiescence();
790
+ }
791
+ /**
792
+ * Whether nothing more will happen without new input. Queued user input only matters during a
793
+ * run; left in the queue while idle it waits for the next prompt, and it also blocks automatic
794
+ * delivery, so completions that cannot start a turn do not count.
795
+ */
796
+ _computeQuiescent() {
797
+ if (this._isAgentRunActive ||
798
+ this._isEmittingAgentSettled ||
799
+ this._deferredSettledActions.length > 0 ||
800
+ this._pendingCustomMessages.length > 0 ||
801
+ this.isCompacting ||
802
+ this.isRetrying) {
803
+ return false;
804
+ }
805
+ if (this._tasksHost.runningBackground().length > 0)
806
+ return false;
807
+ const inputBlocksDelivery = this.pendingMessageCount > 0 || this.agent.hasQueuedMessages();
808
+ return !(this.model !== undefined && !inputBlocksDelivery && this._tasksHost.delivery.hasDeliverableWork());
809
+ }
810
+ /** Whether the session is quiescent now. See {@link AgentSessionEvent} `session_quiescent`. */
811
+ get isQuiescent() {
812
+ return !this._quiescenceDisposed && this._computeQuiescent();
813
+ }
814
+ _updateQuiescence() {
815
+ if (this._quiescenceDisposed)
816
+ return;
817
+ const quiescent = this._computeQuiescent();
818
+ const entered = quiescent && !this._quiescent;
819
+ this._quiescent = quiescent;
820
+ if (!quiescent)
821
+ return;
822
+ if (entered)
823
+ this._emit({ type: "session_quiescent" });
824
+ // A listener may have started new work.
825
+ if (!this._quiescent)
826
+ return;
827
+ for (const waiter of [...this._quiescenceWaiters])
828
+ waiter.resolve();
829
+ }
830
+ /**
831
+ * Resolve once the session is quiescent: no run, compaction, retry or branch summary, no
832
+ * unsettled background task, and no background completion still to be delivered (a failed
833
+ * delivery does not count: it retries only on the next input). Unlike {@link waitForIdle} this
834
+ * also waits for the turns that background completions start. Rejects when `signal` aborts or
835
+ * the session is disposed.
836
+ */
837
+ waitForQuiescence(signal) {
838
+ if (this._quiescenceDisposed)
839
+ return Promise.reject(new Error("The session was disposed"));
840
+ if (signal?.aborted)
841
+ return Promise.reject(signal.reason);
842
+ if (this._computeQuiescent())
843
+ return Promise.resolve();
844
+ return new Promise((resolve, reject) => {
845
+ const waiter = {
846
+ resolve: () => {
847
+ cleanup();
848
+ resolve();
849
+ },
850
+ reject: (reason) => {
851
+ cleanup();
852
+ reject(reason);
853
+ },
854
+ };
855
+ const onAbort = () => waiter.reject(signal?.reason);
856
+ const cleanup = () => {
857
+ this._quiescenceWaiters.delete(waiter);
858
+ signal?.removeEventListener("abort", onAbort);
859
+ };
860
+ this._quiescenceWaiters.add(waiter);
861
+ signal?.addEventListener("abort", onAbort, { once: true });
862
+ });
773
863
  }
774
864
  _emitQueueUpdate() {
775
865
  this._emit({
@@ -792,6 +882,7 @@ export class AgentSession {
792
882
  return this._idleWaitPromise;
793
883
  }
794
884
  _resolveIdleWaitIfIdle() {
885
+ this._updateQuiescence();
795
886
  if (!this.isIdle || !this._resolveIdleWait) {
796
887
  return;
797
888
  }
@@ -1057,7 +1148,11 @@ export class AgentSession {
1057
1148
  * Call this when completely done with the session.
1058
1149
  */
1059
1150
  dispose() {
1151
+ this._quiescenceDisposed = true;
1152
+ const waiters = [...this._quiescenceWaiters];
1060
1153
  this._tasksHost.dispose();
1154
+ for (const waiter of waiters)
1155
+ waiter.reject(new Error("The session was disposed"));
1061
1156
  try {
1062
1157
  this.abortRetry();
1063
1158
  this.abortCompaction();
@@ -1267,6 +1362,7 @@ export class AgentSession {
1267
1362
  }
1268
1363
  this._hiddenDeclarations = hidden;
1269
1364
  this.agent.state.tools = declared;
1365
+ this._tasksHost.toolsChanged();
1270
1366
  return declared;
1271
1367
  }
1272
1368
  /** Whether compaction or branch summarization is currently running */
@@ -1480,6 +1576,7 @@ export class AgentSession {
1480
1576
  async _startRun(trigger, onStarted) {
1481
1577
  this._isAgentRunActive = true;
1482
1578
  this._agentRunAbortRequested = false;
1579
+ this._updateQuiescence();
1483
1580
  let messages;
1484
1581
  try {
1485
1582
  messages = await this._prepareRun(trigger);
@@ -3112,8 +3209,7 @@ export class AgentSession {
3112
3209
  async _reloadBody(options) {
3113
3210
  const oldRunner = this._extensionRunner;
3114
3211
  const previousFlagValues = oldRunner.getFlagValues();
3115
- this.tasks.close();
3116
- await Promise.all([this.tasks.shutdown(), this.abort()]);
3212
+ await Promise.all([this._tasksHost.shutdown(), this.abort()]);
3117
3213
  await emitSessionShutdownEvent(oldRunner, { type: "session_shutdown", reason: "reload" });
3118
3214
  oldRunner.invalidate();
3119
3215
  const getDefaultTools = () => this._usesDefaultTools
@@ -3415,6 +3511,7 @@ export class AgentSession {
3415
3511
  const resumeBackground = this.pauseTaskNotifications();
3416
3512
  // Set up abort controller for summarization
3417
3513
  this._branchSummaryAbortController = new AbortController();
3514
+ this._updateQuiescence();
3418
3515
  try {
3419
3516
  let extensionSummary;
3420
3517
  let fromExtension = false;