@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.
- package/CHANGELOG.md +67 -0
- package/dist/src/agent-execution.js +36 -51
- package/dist/src/background-widget.d.ts +56 -0
- package/dist/src/background-widget.js +22 -15
- package/dist/src/decoders.js +2 -1
- package/dist/src/host-navigator.d.ts +18 -0
- package/dist/src/host-navigator.js +71 -13
- package/dist/src/host-view.d.ts +16 -1
- package/dist/src/host-view.js +109 -42
- package/dist/src/host.js +57 -24
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.js +867 -545
- package/dist/src/index.js.map +3 -3
- package/dist/src/registry.js +2 -1
- package/dist/src/roles.d.ts +70 -0
- package/dist/src/roles.js +325 -0
- package/dist/src/settings.d.ts +13 -0
- package/dist/src/settings.js +253 -0
- package/dist/src/trajectory.d.ts +29 -4
- package/dist/src/trajectory.js +58 -3
- package/dist/src/types.d.ts +0 -1
- package/dist/src/utils.d.ts +2 -1
- package/dist/src/utils.js +10 -0
- package/dist/src/validation.d.ts +5 -17
- package/dist/src/validation.js +9 -458
- package/dist/subagents/index.js +1132 -694
- package/dist/subagents/index.js.map +3 -3
- package/dist/subagents/src/contracts.d.ts +4 -0
- package/dist/subagents/src/index.d.ts +1 -1
- package/dist/subagents/src/index.js +2 -1
- package/dist/subagents/src/manager.js +29 -10
- package/dist/subagents/src/navigator.js +396 -247
- package/dist/subagents/src/view.d.ts +23 -2
- package/dist/subagents/src/view.js +96 -30
- package/dist/trajectory/assets/index.html +347 -231
- package/dist/trajectory/assets/prism.min.js +13 -0
- package/dist/trajectory/index.js +377 -257
- package/dist/trajectory/index.js.map +3 -3
- package/dist/trajectory/src/assets/index.html +347 -231
- package/dist/trajectory/src/assets/prism.min.js +13 -0
- package/dist/trajectory/src/export.js +4 -2
- package/dist/trajectory/src/index.d.ts +2 -0
- package/dist/trajectory/src/index.js +143 -42
- package/dist/trajectory/src/server.js +134 -9
- package/dist/trajectory/src/server.js.map +1 -1
- package/package.json +2 -1
- package/src/agent-execution.ts +36 -42
- package/src/background-widget.ts +25 -18
- package/src/decoders.ts +2 -1
- package/src/host-navigator.ts +58 -14
- package/src/host-view.ts +93 -37
- package/src/host.ts +51 -21
- package/src/index.ts +3 -1
- package/src/registry.ts +2 -1
- package/src/roles.ts +326 -0
- package/src/settings.ts +206 -0
- package/src/trajectory.ts +76 -7
- package/src/types.ts +1 -1
- package/src/utils.ts +8 -1
- package/src/validation.ts +12 -356
- package/subagents/README.md +1 -1
- package/subagents/src/contracts.ts +4 -0
- package/subagents/src/index.ts +3 -2
- package/subagents/src/manager.ts +28 -10
- package/subagents/src/navigator.ts +336 -180
- package/subagents/src/view.ts +97 -28
- package/trajectory/src/assets/index.html +347 -231
- package/trajectory/src/assets/prism.min.js +13 -0
- package/trajectory/src/export.ts +4 -2
- package/trajectory/src/index.ts +118 -38
- 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
|
|
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,
|
|
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
|
|
1148
|
-
const
|
|
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
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
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
|
|
1631
|
-
steer: (request
|
|
1632
|
-
stop: (request
|
|
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
|
-
|
|
1652
|
+
delete: (request) => manager.delete(request),
|
|
1653
|
+
dispose: async () => { await manager.dispose(); },
|
|
1635
1654
|
};
|
|
1636
1655
|
}
|