@kiturone/kapibala 0.0.7 → 0.0.8

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/dist/index.d.cts CHANGED
@@ -3617,6 +3617,9 @@ declare class AgentRuntime {
3617
3617
  private readonly controllers;
3618
3618
  private readonly timers;
3619
3619
  private readonly stateListeners;
3620
+ /** 宿主观察订阅独立于调度等待;关闭宿主订阅不能影响任务收口。 */
3621
+ private readonly taskChangeListeners;
3622
+ private taskChangeNotificationPending;
3620
3623
  private readonly outbox;
3621
3624
  private readonly runningPromises;
3622
3625
  private runner;
@@ -3638,6 +3641,17 @@ declare class AgentRuntime {
3638
3641
  * 获取指定子代理记录快照。
3639
3642
  */
3640
3643
  getTask(agentId: string): AgentTaskRecord | undefined;
3644
+ /**
3645
+ * 订阅任务创建与状态变化;通知只表示快照可能已更新,不提供可变任务对象。
3646
+ * 同一轮微任务内的变化可合并,不保证逐个中间状态;订阅时不主动发送通知,
3647
+ * 宿主应先订阅,再通过 listTasks 按会话和根任务读取独立复制的快照。
3648
+ * 监听器的同步异常与异步拒绝均隔离,不等待监听器,也不触发结果投递或父模型请求。
3649
+ *
3650
+ * @param listener 无参数变化监听器;应只读取展示状态,异步监听器可自行重叠执行。
3651
+ * @returns 幂等取消函数;同一监听器的多次订阅独立取消,运行时关闭时全部释放。
3652
+ * 已关闭的运行时不保留新订阅,返回的取消函数可安全调用。
3653
+ */
3654
+ subscribeTaskChanges(listener: () => void | Promise<void>): () => void;
3641
3655
  /**
3642
3656
  * 判断目标任务是否为指定祖先任务的后代(直接或间接子任务)。
3643
3657
  */
@@ -3703,11 +3717,11 @@ declare class AgentRuntime {
3703
3717
  pending: string[];
3704
3718
  }>;
3705
3719
  /**
3706
- * 按过滤条件查询子代理任务列表。
3720
+ * 按过滤条件查询子代理任务列表;每条记录深度复制,调用方修改快照不影响运行时。
3707
3721
  */
3708
3722
  listTasks(filter?: ListAgentsFilter): AgentTaskRecord[];
3709
3723
  /**
3710
- * 关闭 Runtime 并取消所有活动任务。
3724
+ * 关闭 Runtime 并取消所有活动任务;立即释放宿主订阅,再等待任务清理收口。
3711
3725
  */
3712
3726
  close(): Promise<void>;
3713
3727
  /**
@@ -3717,7 +3731,13 @@ declare class AgentRuntime {
3717
3731
  private releaseTaskSlotOnce;
3718
3732
  private releaseActiveSlot;
3719
3733
  private clearTaskTimer;
3734
+ /** 先保留调度等待者的同步唤醒时序,再异步通知宿主读取任务快照。 */
3720
3735
  private notifyStateChange;
3736
+ /**
3737
+ * 合并宿主变化通知,避免宿主回调同步重入任务状态转换;不改变内部等待者的唤醒时序。
3738
+ * 派发前再次检查订阅与关闭状态,取消后的回调不会执行,观察者失败不传播至任务。
3739
+ */
3740
+ private notifyTaskChanges;
3721
3741
  private waitForNextStateChange;
3722
3742
  }
3723
3743
 
package/dist/index.d.ts CHANGED
@@ -3617,6 +3617,9 @@ declare class AgentRuntime {
3617
3617
  private readonly controllers;
3618
3618
  private readonly timers;
3619
3619
  private readonly stateListeners;
3620
+ /** 宿主观察订阅独立于调度等待;关闭宿主订阅不能影响任务收口。 */
3621
+ private readonly taskChangeListeners;
3622
+ private taskChangeNotificationPending;
3620
3623
  private readonly outbox;
3621
3624
  private readonly runningPromises;
3622
3625
  private runner;
@@ -3638,6 +3641,17 @@ declare class AgentRuntime {
3638
3641
  * 获取指定子代理记录快照。
3639
3642
  */
3640
3643
  getTask(agentId: string): AgentTaskRecord | undefined;
3644
+ /**
3645
+ * 订阅任务创建与状态变化;通知只表示快照可能已更新,不提供可变任务对象。
3646
+ * 同一轮微任务内的变化可合并,不保证逐个中间状态;订阅时不主动发送通知,
3647
+ * 宿主应先订阅,再通过 listTasks 按会话和根任务读取独立复制的快照。
3648
+ * 监听器的同步异常与异步拒绝均隔离,不等待监听器,也不触发结果投递或父模型请求。
3649
+ *
3650
+ * @param listener 无参数变化监听器;应只读取展示状态,异步监听器可自行重叠执行。
3651
+ * @returns 幂等取消函数;同一监听器的多次订阅独立取消,运行时关闭时全部释放。
3652
+ * 已关闭的运行时不保留新订阅,返回的取消函数可安全调用。
3653
+ */
3654
+ subscribeTaskChanges(listener: () => void | Promise<void>): () => void;
3641
3655
  /**
3642
3656
  * 判断目标任务是否为指定祖先任务的后代(直接或间接子任务)。
3643
3657
  */
@@ -3703,11 +3717,11 @@ declare class AgentRuntime {
3703
3717
  pending: string[];
3704
3718
  }>;
3705
3719
  /**
3706
- * 按过滤条件查询子代理任务列表。
3720
+ * 按过滤条件查询子代理任务列表;每条记录深度复制,调用方修改快照不影响运行时。
3707
3721
  */
3708
3722
  listTasks(filter?: ListAgentsFilter): AgentTaskRecord[];
3709
3723
  /**
3710
- * 关闭 Runtime 并取消所有活动任务。
3724
+ * 关闭 Runtime 并取消所有活动任务;立即释放宿主订阅,再等待任务清理收口。
3711
3725
  */
3712
3726
  close(): Promise<void>;
3713
3727
  /**
@@ -3717,7 +3731,13 @@ declare class AgentRuntime {
3717
3731
  private releaseTaskSlotOnce;
3718
3732
  private releaseActiveSlot;
3719
3733
  private clearTaskTimer;
3734
+ /** 先保留调度等待者的同步唤醒时序,再异步通知宿主读取任务快照。 */
3720
3735
  private notifyStateChange;
3736
+ /**
3737
+ * 合并宿主变化通知,避免宿主回调同步重入任务状态转换;不改变内部等待者的唤醒时序。
3738
+ * 派发前再次检查订阅与关闭状态,取消后的回调不会执行,观察者失败不传播至任务。
3739
+ */
3740
+ private notifyTaskChanges;
3721
3741
  private waitForNextStateChange;
3722
3742
  }
3723
3743
 
package/dist/index.js CHANGED
@@ -10660,6 +10660,9 @@ var AgentRuntime = class {
10660
10660
  controllers = /* @__PURE__ */ new Map();
10661
10661
  timers = /* @__PURE__ */ new Map();
10662
10662
  stateListeners = /* @__PURE__ */ new Set();
10663
+ /** 宿主观察订阅独立于调度等待;关闭宿主订阅不能影响任务收口。 */
10664
+ taskChangeListeners = /* @__PURE__ */ new Set();
10665
+ taskChangeNotificationPending = false;
10663
10666
  outbox;
10664
10667
  runningPromises = /* @__PURE__ */ new Map();
10665
10668
  runner;
@@ -10694,6 +10697,25 @@ var AgentRuntime = class {
10694
10697
  const task = this.tasks.get(agentId);
10695
10698
  return task ? structuredClone(task) : void 0;
10696
10699
  }
10700
+ /**
10701
+ * 订阅任务创建与状态变化;通知只表示快照可能已更新,不提供可变任务对象。
10702
+ * 同一轮微任务内的变化可合并,不保证逐个中间状态;订阅时不主动发送通知,
10703
+ * 宿主应先订阅,再通过 listTasks 按会话和根任务读取独立复制的快照。
10704
+ * 监听器的同步异常与异步拒绝均隔离,不等待监听器,也不触发结果投递或父模型请求。
10705
+ *
10706
+ * @param listener 无参数变化监听器;应只读取展示状态,异步监听器可自行重叠执行。
10707
+ * @returns 幂等取消函数;同一监听器的多次订阅独立取消,运行时关闭时全部释放。
10708
+ * 已关闭的运行时不保留新订阅,返回的取消函数可安全调用。
10709
+ */
10710
+ subscribeTaskChanges(listener) {
10711
+ if (this.isClosed) return () => {
10712
+ };
10713
+ const subscription = () => listener();
10714
+ this.taskChangeListeners.add(subscription);
10715
+ return () => {
10716
+ this.taskChangeListeners.delete(subscription);
10717
+ };
10718
+ }
10697
10719
  /**
10698
10720
  * 判断目标任务是否为指定祖先任务的后代(直接或间接子任务)。
10699
10721
  */
@@ -10869,6 +10891,7 @@ var AgentRuntime = class {
10869
10891
  parentTask.childAgentIds.add(agentId);
10870
10892
  }
10871
10893
  }
10894
+ this.notifyTaskChanges();
10872
10895
  const preferredRole = ROLE_PRESETS[params.role].preferredRole;
10873
10896
  return {
10874
10897
  agentId,
@@ -11125,7 +11148,7 @@ var AgentRuntime = class {
11125
11148
  return { completed, pending };
11126
11149
  }
11127
11150
  /**
11128
- * 按过滤条件查询子代理任务列表。
11151
+ * 按过滤条件查询子代理任务列表;每条记录深度复制,调用方修改快照不影响运行时。
11129
11152
  */
11130
11153
  listTasks(filter) {
11131
11154
  const results = [];
@@ -11155,10 +11178,11 @@ var AgentRuntime = class {
11155
11178
  return results;
11156
11179
  }
11157
11180
  /**
11158
- * 关闭 Runtime 并取消所有活动任务。
11181
+ * 关闭 Runtime 并取消所有活动任务;立即释放宿主订阅,再等待任务清理收口。
11159
11182
  */
11160
11183
  async close() {
11161
11184
  this.isClosed = true;
11185
+ this.taskChangeListeners.clear();
11162
11186
  const activeTasks = Array.from(this.tasks.values()).filter((t) => isActiveTaskStatus(t.status));
11163
11187
  await Promise.all(activeTasks.map((t) => this.cancelTask(t.agentId, "Runtime closing")));
11164
11188
  await Promise.all(Array.from(this.runningPromises.values()).map((p) => p.catch(() => {
@@ -11195,6 +11219,7 @@ var AgentRuntime = class {
11195
11219
  this.timers.delete(agentId);
11196
11220
  }
11197
11221
  }
11222
+ /** 先保留调度等待者的同步唤醒时序,再异步通知宿主读取任务快照。 */
11198
11223
  notifyStateChange() {
11199
11224
  for (const listener of this.stateListeners) {
11200
11225
  try {
@@ -11202,6 +11227,28 @@ var AgentRuntime = class {
11202
11227
  } catch {
11203
11228
  }
11204
11229
  }
11230
+ this.notifyTaskChanges();
11231
+ }
11232
+ /**
11233
+ * 合并宿主变化通知,避免宿主回调同步重入任务状态转换;不改变内部等待者的唤醒时序。
11234
+ * 派发前再次检查订阅与关闭状态,取消后的回调不会执行,观察者失败不传播至任务。
11235
+ */
11236
+ notifyTaskChanges() {
11237
+ if (this.isClosed || this.taskChangeNotificationPending || this.taskChangeListeners.size === 0) {
11238
+ return;
11239
+ }
11240
+ this.taskChangeNotificationPending = true;
11241
+ queueMicrotask(() => {
11242
+ this.taskChangeNotificationPending = false;
11243
+ for (const listener of [...this.taskChangeListeners]) {
11244
+ if (!this.taskChangeListeners.has(listener)) continue;
11245
+ try {
11246
+ void Promise.resolve(listener()).catch(() => {
11247
+ });
11248
+ } catch {
11249
+ }
11250
+ }
11251
+ });
11205
11252
  }
11206
11253
  waitForNextStateChange(signal) {
11207
11254
  if (signal.aborted) return Promise.resolve();