@marcoscale98/pi-extensible-workflows 5.14.1-fork.1 → 5.17.0-fork.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 (71) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/src/agent-execution.js +36 -51
  3. package/dist/src/background-widget.d.ts +56 -0
  4. package/dist/src/background-widget.js +22 -15
  5. package/dist/src/decoders.js +2 -1
  6. package/dist/src/host-navigator.d.ts +18 -0
  7. package/dist/src/host-navigator.js +71 -13
  8. package/dist/src/host-view.d.ts +16 -1
  9. package/dist/src/host-view.js +109 -42
  10. package/dist/src/host.js +57 -24
  11. package/dist/src/index.d.ts +3 -1
  12. package/dist/src/index.js +867 -545
  13. package/dist/src/index.js.map +3 -3
  14. package/dist/src/registry.js +2 -1
  15. package/dist/src/roles.d.ts +70 -0
  16. package/dist/src/roles.js +325 -0
  17. package/dist/src/settings.d.ts +13 -0
  18. package/dist/src/settings.js +253 -0
  19. package/dist/src/trajectory.d.ts +29 -4
  20. package/dist/src/trajectory.js +58 -3
  21. package/dist/src/types.d.ts +0 -1
  22. package/dist/src/utils.d.ts +2 -1
  23. package/dist/src/utils.js +10 -0
  24. package/dist/src/validation.d.ts +5 -17
  25. package/dist/src/validation.js +9 -458
  26. package/dist/subagents/index.js +1132 -694
  27. package/dist/subagents/index.js.map +3 -3
  28. package/dist/subagents/src/contracts.d.ts +4 -0
  29. package/dist/subagents/src/index.d.ts +1 -1
  30. package/dist/subagents/src/index.js +2 -1
  31. package/dist/subagents/src/manager.js +29 -10
  32. package/dist/subagents/src/navigator.js +396 -247
  33. package/dist/subagents/src/view.d.ts +23 -2
  34. package/dist/subagents/src/view.js +96 -30
  35. package/dist/trajectory/assets/index.html +347 -231
  36. package/dist/trajectory/assets/prism.min.js +13 -0
  37. package/dist/trajectory/index.js +377 -257
  38. package/dist/trajectory/index.js.map +3 -3
  39. package/dist/trajectory/src/assets/index.html +347 -231
  40. package/dist/trajectory/src/assets/prism.min.js +13 -0
  41. package/dist/trajectory/src/export.js +4 -2
  42. package/dist/trajectory/src/index.d.ts +2 -0
  43. package/dist/trajectory/src/index.js +143 -42
  44. package/dist/trajectory/src/server.js +134 -9
  45. package/dist/trajectory/src/server.js.map +1 -1
  46. package/package.json +2 -1
  47. package/src/agent-execution.ts +36 -42
  48. package/src/background-widget.ts +25 -18
  49. package/src/decoders.ts +2 -1
  50. package/src/host-navigator.ts +58 -14
  51. package/src/host-view.ts +93 -37
  52. package/src/host.ts +51 -21
  53. package/src/index.ts +3 -1
  54. package/src/registry.ts +2 -1
  55. package/src/roles.ts +326 -0
  56. package/src/settings.ts +206 -0
  57. package/src/trajectory.ts +76 -7
  58. package/src/types.ts +1 -1
  59. package/src/utils.ts +8 -1
  60. package/src/validation.ts +12 -356
  61. package/subagents/README.md +1 -1
  62. package/subagents/src/contracts.ts +4 -0
  63. package/subagents/src/index.ts +3 -2
  64. package/subagents/src/manager.ts +28 -10
  65. package/subagents/src/navigator.ts +336 -180
  66. package/subagents/src/view.ts +97 -28
  67. package/trajectory/src/assets/index.html +347 -231
  68. package/trajectory/src/assets/prism.min.js +13 -0
  69. package/trajectory/src/export.ts +4 -2
  70. package/trajectory/src/index.ts +118 -38
  71. package/trajectory/src/server.ts +112 -12
@@ -115,6 +115,8 @@ export interface SubagentManagerContext {
115
115
  readonly extensionContext: ExtensionContext;
116
116
  readonly waitForForeground?: boolean;
117
117
  readonly includeAttemptMetadata?: boolean;
118
+ /** Adds the live progress and activity of an active run; tool results leave streamed activity out. */
119
+ readonly includeActivity?: boolean;
118
120
  }
119
121
  export interface SubagentAttemptActionData {
120
122
  readonly attempt: AgentAttemptSummary;
@@ -159,6 +161,8 @@ export interface SubagentManager {
159
161
  steer(request: Readonly<SubagentSteerRequest>, context: Readonly<SubagentManagerContext>): Promise<unknown>;
160
162
  stop(request: Readonly<SubagentIdRequest>, context: Readonly<SubagentManagerContext>): Promise<unknown>;
161
163
  retry(request: Readonly<SubagentIdRequest>, context: Readonly<SubagentManagerContext>): Promise<unknown>;
164
+ /** Removes a settled run record; used by the /subagents navigator only. */
165
+ delete?(request: Readonly<SubagentIdRequest>, context: Readonly<SubagentManagerContext>): Promise<unknown>;
162
166
  getAttemptActionData?(id: string): Readonly<SubagentAttemptActionData> | undefined;
163
167
  dispose?(): Promise<void>;
164
168
  }
@@ -5,7 +5,7 @@ export { attemptValue, statusValue, subagentErrorValue } from "./decode.js";
5
5
  export { createSubagentManager, createUnavailableSubagentManager } from "./manager.js";
6
6
  export { createRunStoreWorktreeAdapter, defaultWorktreeHome } from "./worktree.js";
7
7
  export type { SubagentWorktreeAdapter, SubagentWorktreeContext, SubagentWorktreeHandle, SubagentWorktreeRunStore } from "./worktree.js";
8
- type SubagentsExtensionAPI = Pick<ExtensionAPI, "registerTool"> & Partial<Pick<ExtensionAPI, "getActiveTools" | "on" | "sendMessage" | "registerCommand">>;
8
+ type SubagentsExtensionAPI = Pick<ExtensionAPI, "registerTool"> & Partial<Pick<ExtensionAPI, "getActiveTools" | "on" | "sendMessage" | "registerCommand" | "appendEntry" | "registerEntryRenderer">>;
9
9
  export declare function createSubagentTools(manager: SubagentManager): readonly ToolDefinition[];
10
10
  export declare function createSubagentsExtension(options?: SubagentsExtensionOptions, activeTools?: () => readonly string[], notify?: (notification: SubagentNotification) => void | Promise<void>, onStatus?: (status: Readonly<SubagentStatus>, request: Readonly<SubagentRunRequest>) => void, onResourceWarning?: (message: string) => void): SubagentsExtension;
11
11
  export declare function registerSubagentsExtension(pi: SubagentsExtensionAPI, options?: SubagentsExtensionOptions): SubagentsExtension;
@@ -153,7 +153,8 @@ export function registerSubagentsExtension(pi, options = {}) {
153
153
  const onResourceWarning = sendMessage === undefined ? undefined : (message) => {
154
154
  sendMessage.call(pi, { customType: "subagents", content: `Warning: ${message}`, display: true }, { deliverAs: "steer" });
155
155
  };
156
- const widget = createSubagentBackgroundWidget();
156
+ const appendEntry = pi.appendEntry;
157
+ const widget = createSubagentBackgroundWidget({ ...(appendEntry === undefined ? {} : { appendEntry: (customType, data) => { appendEntry.call(pi, customType, data); } }), ...(pi.registerEntryRenderer === undefined ? {} : { registerEntryRenderer: pi.registerEntryRenderer.bind(pi) }) });
157
158
  const extension = createSubagentsExtension(options, activeTools, notify, (status, request) => { widget.update(status, request); const registry = loadingRegistry(); if (typeof registry.observeSubagentStatus === "function")
158
159
  registry.observeSubagentStatus(status, request); }, onResourceWarning);
159
160
  for (const tool of extension.tools)
@@ -2,8 +2,9 @@ import { randomUUID } from "node:crypto";
2
2
  import { chmod, link, mkdir, open, readFile, readdir, rename, rm, stat } from "node:fs/promises";
3
3
  import { join } from "node:path";
4
4
  import { getAgentDir } from "@earendil-works/pi-coding-agent";
5
- import { addAccounting, deepFreeze, errorCode, errorText, finiteNumber, isNodeError, isThinkingLevel, jsonValue, object, loadAgentDefinitions, loadingRegistry, localAgentTransport, resolveAgentResourcePolicy, resolveWorkflowSettings, roleNameOf, sanitizeDisplayText, sumAccounting, structuralPath, validateModelAliasAvailability, WorkflowAgentExecutor, WorkflowError, workflowProjectSettingsPath, workflowSettingsPath, SerialLane, } from "../../src/index.js";
5
+ import { addAccounting, deepFreeze, errorCode, errorText, finiteNumber, isNodeError, isThinkingLevel, jsonValue, object, loadingRegistry, localAgentTransport, resolveAgentResourcePolicy, resolveWorkflowSettings, roleNameOf, sanitizeDisplayText, sumAccounting, structuralPath, validateModelAliasAvailability, WorkflowAgentExecutor, WorkflowError, workflowProjectSettingsPath, workflowSettingsPath, SerialLane, } from "../../src/index.js";
6
6
  import { decodeAgentDefinition, decodeWorkflowExtensions } from "../../src/decoders.js";
7
+ import { loadAgentDefinitions } from "../../src/roles.js";
7
8
  import { atomicJson, json as readJson, processAlive } from "../../src/persistence.js";
8
9
  import { accountingValue, activityValue, legacyAccountingValue, worktreeValue } from "./decode.js";
9
10
  import { SUBAGENT_ATTEMPT_DETAILS_LIMIT, SUBAGENT_MAX_RETRIES, SUBAGENT_SYSTEM_PROMPT_LIMIT, SUBAGENTS_TOOL_NAMES, normalizeSubagentRunRequest, } from "./contracts.js";
@@ -1144,8 +1145,9 @@ class PersistentSubagentManager {
1144
1145
  if (request.id !== undefined) {
1145
1146
  const id = checkedId({ id: request.id });
1146
1147
  const active = this.activeRuns.get(id);
1147
- const status = active ? persistedStatus(active) : this.terminalSummaries.get(id) ?? await loadPersistedStatus(storageDirectory(this.dependencies), id);
1148
- const inspection = publicStatus(status, context.includeAttemptMetadata === true);
1148
+ const includeActivity = context.includeActivity === true;
1149
+ const status = active ? includeActivity ? liveStatus(active) : persistedStatus(active) : this.terminalSummaries.get(id) ?? await loadPersistedStatus(storageDirectory(this.dependencies), id);
1150
+ const inspection = publicStatus(status, context.includeAttemptMetadata === true, includeActivity);
1149
1151
  if (status.state === "completed")
1150
1152
  return { ...inspection, value: await loadPersistedResult(storageDirectory(this.dependencies), id) };
1151
1153
  if (status.state === "failed") {
@@ -1208,6 +1210,21 @@ class PersistentSubagentManager {
1208
1210
  await this.stopRun(run, false);
1209
1211
  return publicStatus(persistedStatus(run));
1210
1212
  }
1213
+ /** Removes a settled record for the /subagents navigator, as /workflow deletes a terminal run; not a model tool. */
1214
+ async delete(request) {
1215
+ const id = checkedId(request);
1216
+ await this.ensureInitialized();
1217
+ const root = storageDirectory(this.dependencies);
1218
+ const status = this.activeRuns.has(id) ? undefined : this.terminalSummaries.get(id) ?? await loadPersistedStatus(root, id, false);
1219
+ if (status === undefined || status.state === "running")
1220
+ throw new WorkflowError("RUN_OWNED", `Stop subagent ${id} before deleting it`);
1221
+ // Retained worktree metadata means cleanup failed, and the record holds what a later cleanup needs.
1222
+ if (status.worktree !== undefined)
1223
+ throw new WorkflowError("WORKTREE_FAILED", `Subagent ${id} still has a worktree to clean up`);
1224
+ await rm(runDirectory(root, id), { recursive: true, force: true });
1225
+ this.terminalSummaries.delete(id);
1226
+ return { id, deleted: true };
1227
+ }
1211
1228
  async dispose() {
1212
1229
  if (this.disposePromise)
1213
1230
  return this.disposePromise;
@@ -1405,9 +1422,10 @@ class PersistentSubagentManager {
1405
1422
  run.disposed = true;
1406
1423
  this.clearSteering(run);
1407
1424
  await this.cleanupSessions(run, true);
1408
- const worktreeCleaned = await this.cleanupWorktree(run);
1409
- if (worktreeCleaned)
1410
- await enqueueWrite(run, () => atomicJson(statusPath(run.directory), persistedStatus(run)));
1425
+ await this.cleanupWorktree(run);
1426
+ // A run that settled just before disposal may not have written its terminal status yet: finishTerminal returns early
1427
+ // once the run is disposed. Left as "running" under this live process, the next manager here would never reconcile it.
1428
+ await enqueueWrite(run, () => atomicJson(statusPath(run.directory), persistedStatus(run)));
1411
1429
  this.resolveTerminal(run);
1412
1430
  this.removeLiveRun(run);
1413
1431
  }
@@ -1627,10 +1645,11 @@ export function createSubagentManager(dependencies = {}) {
1627
1645
  return {
1628
1646
  run: (request, context) => manager.run(request, context),
1629
1647
  inspect: (request, context) => manager.inspect(request, context),
1630
- getAttemptActionData: (id) => manager.getAttemptActionData?.(id),
1631
- steer: (request, context) => manager.steer(request, context),
1632
- stop: (request, context) => manager.stop(request, context),
1648
+ getAttemptActionData: (id) => manager.getAttemptActionData(id),
1649
+ steer: (request) => manager.steer(request),
1650
+ stop: (request) => manager.stop(request),
1633
1651
  retry: (request, context) => manager.retry(request, context),
1634
- dispose: async () => { await manager.dispose?.(); },
1652
+ delete: (request) => manager.delete(request),
1653
+ dispose: async () => { await manager.dispose(); },
1635
1654
  };
1636
1655
  }