@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
@@ -23,7 +23,7 @@ export { createSubagentManager, createUnavailableSubagentManager } from "./manag
23
23
  export { createRunStoreWorktreeAdapter, defaultWorktreeHome } from "./worktree.js";
24
24
  export type { SubagentWorktreeAdapter, SubagentWorktreeContext, SubagentWorktreeHandle, SubagentWorktreeRunStore } from "./worktree.js";
25
25
 
26
- type SubagentsExtensionAPI = Pick<ExtensionAPI, "registerTool"> & Partial<Pick<ExtensionAPI, "getActiveTools" | "on" | "sendMessage" | "registerCommand">>;
26
+ type SubagentsExtensionAPI = Pick<ExtensionAPI, "registerTool"> & Partial<Pick<ExtensionAPI, "getActiveTools" | "on" | "sendMessage" | "registerCommand" | "appendEntry" | "registerEntryRenderer">>;
27
27
 
28
28
  function validateSubagentRunRequest(value: unknown): SubagentRunRequest {
29
29
  return normalizeSubagentRunRequest(value);
@@ -170,7 +170,8 @@ export function registerSubagentsExtension(pi: SubagentsExtensionAPI, options: S
170
170
  const onResourceWarning = sendMessage === undefined ? undefined : (message: string): void => {
171
171
  sendMessage.call(pi, { customType: "subagents", content: `Warning: ${message}`, display: true }, { deliverAs: "steer" });
172
172
  };
173
- const widget = createSubagentBackgroundWidget();
173
+ const appendEntry = pi.appendEntry;
174
+ const widget = createSubagentBackgroundWidget({ ...(appendEntry === undefined ? {} : { appendEntry: (customType, data) => { appendEntry.call(pi, customType, data); } }), ...(pi.registerEntryRenderer === undefined ? {} : { registerEntryRenderer: pi.registerEntryRenderer.bind(pi) }) });
174
175
  const extension = createSubagentsExtension(options, activeTools, notify, (status, request) => { widget.update(status, request); const registry = loadingRegistry(); if (typeof registry.observeSubagentStatus === "function") registry.observeSubagentStatus(status, request); }, onResourceWarning);
175
176
  for (const tool of extension.tools) pi.registerTool(tool);
176
177
  if (pi.registerCommand !== undefined) registerSubagentNavigator(pi.registerCommand.bind(pi), extension.manager, storageDirectory(options), options.clipboard);
@@ -12,7 +12,6 @@ import {
12
12
  isThinkingLevel,
13
13
  jsonValue,
14
14
  object,
15
- loadAgentDefinitions,
16
15
  loadingRegistry,
17
16
  localAgentTransport,
18
17
  resolveAgentResourcePolicy,
@@ -43,6 +42,7 @@ import {
43
42
  SerialLane,
44
43
  } from "../../src/index.js";
45
44
  import { decodeAgentDefinition, decodeWorkflowExtensions } from "../../src/decoders.js";
45
+ import { loadAgentDefinitions } from "../../src/roles.js";
46
46
  import { atomicJson, json as readJson, processAlive } from "../../src/persistence.js";
47
47
  import { accountingValue, activityValue, legacyAccountingValue, worktreeValue } from "./decode.js";
48
48
  import {
@@ -1103,8 +1103,9 @@ class PersistentSubagentManager implements SubagentManager {
1103
1103
  if (request.id !== undefined) {
1104
1104
  const id = checkedId({ id: request.id });
1105
1105
  const active = this.activeRuns.get(id);
1106
- const status = active ? persistedStatus(active) : this.terminalSummaries.get(id) ?? await loadPersistedStatus(storageDirectory(this.dependencies), id);
1107
- const inspection = publicStatus(status, context.includeAttemptMetadata === true);
1106
+ const includeActivity = context.includeActivity === true;
1107
+ const status = active ? includeActivity ? liveStatus(active) : persistedStatus(active) : this.terminalSummaries.get(id) ?? await loadPersistedStatus(storageDirectory(this.dependencies), id);
1108
+ const inspection = publicStatus(status, context.includeAttemptMetadata === true, includeActivity);
1108
1109
  if (status.state === "completed") return { ...inspection, value: await loadPersistedResult(storageDirectory(this.dependencies), id) };
1109
1110
  if (status.state === "failed") {
1110
1111
  const failure = status.error ?? await loadPersistedFailure(storageDirectory(this.dependencies), id);
@@ -1159,6 +1160,20 @@ class PersistentSubagentManager implements SubagentManager {
1159
1160
  return publicStatus(persistedStatus(run));
1160
1161
  }
1161
1162
 
1163
+ /** Removes a settled record for the /subagents navigator, as /workflow deletes a terminal run; not a model tool. */
1164
+ async delete(request: Readonly<{ id: string }>): Promise<unknown> {
1165
+ const id = checkedId(request);
1166
+ await this.ensureInitialized();
1167
+ const root = storageDirectory(this.dependencies);
1168
+ const status = this.activeRuns.has(id) ? undefined : this.terminalSummaries.get(id) ?? await loadPersistedStatus(root, id, false);
1169
+ if (status === undefined || status.state === "running") throw new WorkflowError("RUN_OWNED", `Stop subagent ${id} before deleting it`);
1170
+ // Retained worktree metadata means cleanup failed, and the record holds what a later cleanup needs.
1171
+ if (status.worktree !== undefined) throw new WorkflowError("WORKTREE_FAILED", `Subagent ${id} still has a worktree to clean up`);
1172
+ await rm(runDirectory(root, id), { recursive: true, force: true });
1173
+ this.terminalSummaries.delete(id);
1174
+ return { id, deleted: true };
1175
+ }
1176
+
1162
1177
  async dispose(): Promise<void> {
1163
1178
  if (this.disposePromise) return this.disposePromise;
1164
1179
  this.disposePromise = (async () => {
@@ -1339,8 +1354,10 @@ class PersistentSubagentManager implements SubagentManager {
1339
1354
  run.disposed = true;
1340
1355
  this.clearSteering(run);
1341
1356
  await this.cleanupSessions(run, true);
1342
- const worktreeCleaned = await this.cleanupWorktree(run);
1343
- if (worktreeCleaned) await enqueueWrite(run, () => atomicJson(statusPath(run.directory), persistedStatus(run)));
1357
+ await this.cleanupWorktree(run);
1358
+ // A run that settled just before disposal may not have written its terminal status yet: finishTerminal returns early
1359
+ // once the run is disposed. Left as "running" under this live process, the next manager here would never reconcile it.
1360
+ await enqueueWrite(run, () => atomicJson(statusPath(run.directory), persistedStatus(run)));
1344
1361
  this.resolveTerminal(run);
1345
1362
  this.removeLiveRun(run);
1346
1363
  }
@@ -1547,14 +1564,15 @@ export function createUnavailableSubagentManager(): SubagentManager {
1547
1564
  };
1548
1565
  }
1549
1566
  export function createSubagentManager(dependencies: SubagentManagerDependencies = {}): SubagentManager {
1550
- const manager: SubagentManager = new PersistentSubagentManager(dependencies);
1567
+ const manager = new PersistentSubagentManager(dependencies);
1551
1568
  return {
1552
1569
  run: (request, context) => manager.run(request, context),
1553
1570
  inspect: (request, context) => manager.inspect(request, context),
1554
- getAttemptActionData: (id) => manager.getAttemptActionData?.(id),
1555
- steer: (request, context) => manager.steer(request, context),
1556
- stop: (request, context) => manager.stop(request, context),
1571
+ getAttemptActionData: (id) => manager.getAttemptActionData(id),
1572
+ steer: (request) => manager.steer(request),
1573
+ stop: (request) => manager.stop(request),
1557
1574
  retry: (request, context) => manager.retry(request, context),
1558
- dispose: async () => { await manager.dispose?.(); },
1575
+ delete: (request) => manager.delete(request),
1576
+ dispose: async () => { await manager.dispose(); },
1559
1577
  };
1560
1578
  }