@marcoscale98/pi-extensible-workflows 5.14.1-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 (204) hide show
  1. package/CHANGELOG.md +536 -0
  2. package/README.md +64 -0
  3. package/dist/src/agent-execution.d.ts +338 -0
  4. package/dist/src/agent-execution.js +1633 -0
  5. package/dist/src/background-widget.d.ts +74 -0
  6. package/dist/src/background-widget.js +1340 -0
  7. package/dist/src/budget.d.ts +38 -0
  8. package/dist/src/budget.js +188 -0
  9. package/dist/src/changelog.d.ts +6 -0
  10. package/dist/src/changelog.js +112 -0
  11. package/dist/src/decoders.d.ts +96 -0
  12. package/dist/src/decoders.js +629 -0
  13. package/dist/src/execution.d.ts +19 -0
  14. package/dist/src/execution.js +749 -0
  15. package/dist/src/herdr.d.ts +53 -0
  16. package/dist/src/herdr.js +270 -0
  17. package/dist/src/host-delivery.d.ts +95 -0
  18. package/dist/src/host-delivery.js +376 -0
  19. package/dist/src/host-navigator.d.ts +83 -0
  20. package/dist/src/host-navigator.js +1087 -0
  21. package/dist/src/host-phases.d.ts +89 -0
  22. package/dist/src/host-phases.js +320 -0
  23. package/dist/src/host-recovery.d.ts +141 -0
  24. package/dist/src/host-recovery.js +356 -0
  25. package/dist/src/host-runtime.d.ts +78 -0
  26. package/dist/src/host-runtime.js +378 -0
  27. package/dist/src/host-view.d.ts +116 -0
  28. package/dist/src/host-view.js +868 -0
  29. package/dist/src/host.d.ts +40 -0
  30. package/dist/src/host.js +1641 -0
  31. package/dist/src/index.d.ts +29 -0
  32. package/dist/src/index.js +13725 -0
  33. package/dist/src/index.js.map +6 -0
  34. package/dist/src/io.d.ts +14 -0
  35. package/dist/src/io.js +82 -0
  36. package/dist/src/package-identity.d.ts +4 -0
  37. package/dist/src/package-identity.js +6 -0
  38. package/dist/src/paths.d.ts +14 -0
  39. package/dist/src/paths.js +51 -0
  40. package/dist/src/persistence.d.ts +5 -0
  41. package/dist/src/persistence.js +5 -0
  42. package/dist/src/pi-runtime-adapter.d.ts +27 -0
  43. package/dist/src/pi-runtime-adapter.js +243 -0
  44. package/dist/src/pi-runtime-runner.d.ts +42 -0
  45. package/dist/src/pi-runtime-runner.js +505 -0
  46. package/dist/src/registry.d.ts +48 -0
  47. package/dist/src/registry.js +379 -0
  48. package/dist/src/retention.d.ts +17 -0
  49. package/dist/src/retention.js +195 -0
  50. package/dist/src/runtime/agent-runner.d.ts +143 -0
  51. package/dist/src/runtime/agent-runner.js +12 -0
  52. package/dist/src/runtime/index.d.ts +2 -0
  53. package/dist/src/runtime/index.js +2 -0
  54. package/dist/src/runtime/namespace.d.ts +14 -0
  55. package/dist/src/runtime/namespace.js +1 -0
  56. package/dist/src/runtime/workflow-result.d.ts +2 -0
  57. package/dist/src/runtime/workflow-result.js +6 -0
  58. package/dist/src/session-handoff.d.ts +2 -0
  59. package/dist/src/session-handoff.js +82 -0
  60. package/dist/src/session-lease.d.ts +12 -0
  61. package/dist/src/session-lease.js +180 -0
  62. package/dist/src/store.d.ts +95 -0
  63. package/dist/src/store.js +951 -0
  64. package/dist/src/subagent-manager-handle.d.ts +4 -0
  65. package/dist/src/subagent-manager-handle.js +6 -0
  66. package/dist/src/tool-timing.d.ts +12 -0
  67. package/dist/src/tool-timing.js +33 -0
  68. package/dist/src/trajectory-contracts.d.ts +8 -0
  69. package/dist/src/trajectory-contracts.js +9 -0
  70. package/dist/src/trajectory-host-handle.d.ts +12 -0
  71. package/dist/src/trajectory-host-handle.js +6 -0
  72. package/dist/src/trajectory.d.ts +128 -0
  73. package/dist/src/trajectory.js +594 -0
  74. package/dist/src/types.d.ts +960 -0
  75. package/dist/src/types.js +60 -0
  76. package/dist/src/utils.d.ts +57 -0
  77. package/dist/src/utils.js +225 -0
  78. package/dist/src/validation.d.ts +29 -0
  79. package/dist/src/validation.js +1100 -0
  80. package/dist/src/workflow-artifacts.d.ts +14 -0
  81. package/dist/src/workflow-artifacts.js +40 -0
  82. package/dist/starter/index.d.ts +1 -0
  83. package/dist/starter/index.js +103 -0
  84. package/dist/starter/index.js.map +6 -0
  85. package/dist/starter/review-loop.d.ts +72 -0
  86. package/dist/starter/review-loop.js +43 -0
  87. package/dist/starter/roles/developer.md +6 -0
  88. package/dist/starter/roles/oracle.md +18 -0
  89. package/dist/starter/roles/researcher.md +20 -0
  90. package/dist/starter/roles/reviewer.md +19 -0
  91. package/dist/starter/roles/scout.md +18 -0
  92. package/dist/subagents/index.d.ts +8 -0
  93. package/dist/subagents/index.js +8021 -0
  94. package/dist/subagents/index.js.map +6 -0
  95. package/dist/subagents/src/contracts.d.ts +173 -0
  96. package/dist/subagents/src/contracts.js +68 -0
  97. package/dist/subagents/src/decode.d.ts +15 -0
  98. package/dist/subagents/src/decode.js +182 -0
  99. package/dist/subagents/src/index.d.ts +12 -0
  100. package/dist/subagents/src/index.js +180 -0
  101. package/dist/subagents/src/manager.d.ts +3 -0
  102. package/dist/subagents/src/manager.js +1636 -0
  103. package/dist/subagents/src/navigator.d.ts +5 -0
  104. package/dist/subagents/src/navigator.js +627 -0
  105. package/dist/subagents/src/view.d.ts +70 -0
  106. package/dist/subagents/src/view.js +387 -0
  107. package/dist/subagents/src/worktree.d.ts +34 -0
  108. package/dist/subagents/src/worktree.js +68 -0
  109. package/dist/trajectory/assets/favicon.png +0 -0
  110. package/dist/trajectory/assets/index.html +772 -0
  111. package/dist/trajectory/assets/marked.min.js +6 -0
  112. package/dist/trajectory/assets/morphdom.min.js +1 -0
  113. package/dist/trajectory/index.d.ts +5 -0
  114. package/dist/trajectory/index.js +3459 -0
  115. package/dist/trajectory/index.js.map +6 -0
  116. package/dist/trajectory/src/assets/favicon.png +0 -0
  117. package/dist/trajectory/src/assets/index.html +772 -0
  118. package/dist/trajectory/src/assets/marked.min.js +6 -0
  119. package/dist/trajectory/src/assets/morphdom.min.js +1 -0
  120. package/dist/trajectory/src/export.d.ts +25 -0
  121. package/dist/trajectory/src/export.js +80 -0
  122. package/dist/trajectory/src/index.d.ts +26 -0
  123. package/dist/trajectory/src/index.js +732 -0
  124. package/dist/trajectory/src/server.d.ts +7 -0
  125. package/dist/trajectory/src/server.js +2534 -0
  126. package/dist/trajectory/src/server.js.map +6 -0
  127. package/examples/advanced-patterns/auto-model-router.mjs +78 -0
  128. package/examples/workflow-extension-template/README.md +37 -0
  129. package/examples/workflow-extension-template/extension.test.mjs +59 -0
  130. package/examples/workflow-extension-template/index.js +51 -0
  131. package/examples/workflow-extension-template/roles/reviewer.md +4 -0
  132. package/package.json +105 -0
  133. package/skills/pi-extensible-workflows/SKILL.md +160 -0
  134. package/src/agent-execution.ts +1533 -0
  135. package/src/background-widget.ts +1496 -0
  136. package/src/budget.ts +109 -0
  137. package/src/changelog.ts +114 -0
  138. package/src/decoders.ts +567 -0
  139. package/src/execution.ts +652 -0
  140. package/src/herdr.ts +240 -0
  141. package/src/host-delivery.ts +346 -0
  142. package/src/host-navigator.ts +871 -0
  143. package/src/host-phases.ts +264 -0
  144. package/src/host-recovery.ts +333 -0
  145. package/src/host-runtime.ts +373 -0
  146. package/src/host-view.ts +828 -0
  147. package/src/host.ts +1502 -0
  148. package/src/index.ts +29 -0
  149. package/src/io.ts +73 -0
  150. package/src/package-identity.ts +7 -0
  151. package/src/paths.ts +49 -0
  152. package/src/persistence.ts +11 -0
  153. package/src/pi-runtime-adapter.ts +247 -0
  154. package/src/pi-runtime-runner.ts +436 -0
  155. package/src/registry.ts +321 -0
  156. package/src/retention.ts +178 -0
  157. package/src/runtime/agent-runner.ts +158 -0
  158. package/src/runtime/index.ts +2 -0
  159. package/src/runtime/namespace.ts +16 -0
  160. package/src/runtime/workflow-result.ts +8 -0
  161. package/src/session-handoff.ts +78 -0
  162. package/src/session-lease.ts +125 -0
  163. package/src/store.ts +832 -0
  164. package/src/subagent-manager-handle.ts +8 -0
  165. package/src/tool-timing.ts +47 -0
  166. package/src/trajectory-contracts.ts +13 -0
  167. package/src/trajectory-host-handle.ts +16 -0
  168. package/src/trajectory.ts +543 -0
  169. package/src/types.ts +374 -0
  170. package/src/utils.ts +192 -0
  171. package/src/validation.ts +910 -0
  172. package/src/workflow-artifacts.ts +35 -0
  173. package/starter/index.ts +35 -0
  174. package/starter/prompts/council.md +16 -0
  175. package/starter/prompts/deep-research.md +16 -0
  176. package/starter/prompts/oracle.md +14 -0
  177. package/starter/prompts/parallel-review.md +22 -0
  178. package/starter/prompts/parallel-scout.md +16 -0
  179. package/starter/prompts/review-loop.md +14 -0
  180. package/starter/prompts/review.md +14 -0
  181. package/starter/prompts/scout.md +14 -0
  182. package/starter/review-loop.ts +73 -0
  183. package/starter/roles/developer.md +6 -0
  184. package/starter/roles/oracle.md +18 -0
  185. package/starter/roles/researcher.md +20 -0
  186. package/starter/roles/reviewer.md +19 -0
  187. package/starter/roles/scout.md +18 -0
  188. package/subagents/README.md +145 -0
  189. package/subagents/index.ts +8 -0
  190. package/subagents/src/contracts.ts +176 -0
  191. package/subagents/src/decode.ts +158 -0
  192. package/subagents/src/index.ts +194 -0
  193. package/subagents/src/manager.ts +1560 -0
  194. package/subagents/src/navigator.ts +488 -0
  195. package/subagents/src/view.ts +376 -0
  196. package/subagents/src/worktree.ts +99 -0
  197. package/trajectory/index.ts +5 -0
  198. package/trajectory/src/assets/favicon.png +0 -0
  199. package/trajectory/src/assets/index.html +772 -0
  200. package/trajectory/src/assets/marked.min.js +6 -0
  201. package/trajectory/src/assets/morphdom.min.js +1 -0
  202. package/trajectory/src/export.ts +85 -0
  203. package/trajectory/src/index.ts +604 -0
  204. package/trajectory/src/server.ts +447 -0
@@ -0,0 +1,60 @@
1
+ export const RUN_STATES = ["queued", "running", "pausing", "paused", "awaiting_input", "completed", "failed", "stopped", "interrupted", "budget_exhausted"];
2
+ export const AGENT_STATES = ["queued", "running", "waiting_for_child", "paused", "retrying", "completed", "failed", "cancelled"];
3
+ export const HARD_TERMINAL_RUN_STATES = new Set(["completed", "failed", "stopped"]);
4
+ export function isHardTerminalRunState(state) { return HARD_TERMINAL_RUN_STATES.has(state); }
5
+ export function isExternallyEndedRunState(state) { return state === "stopped" || state === "interrupted" || state === "budget_exhausted"; }
6
+ export const SETTLED_AGENT_STATES = new Set(["completed", "failed", "cancelled"]);
7
+ export const WORKFLOW_CALL_KINDS = ["agent", "parallel", "pipeline", "checkpoint", "phase", "withWorktree", "shell"];
8
+ export const WORKFLOW_RUN_STARTED_EVENT = "workflow:run-started";
9
+ export const WORKFLOW_RUN_RESUMED_EVENT = "workflow:run-resumed";
10
+ export const WORKFLOW_RUN_STATE_CHANGED_EVENT = "workflow:run-state-changed";
11
+ export const WORKFLOW_RUN_COMPLETED_EVENT = "workflow:run-completed";
12
+ export const WORKFLOW_RUN_FAILED_EVENT = "workflow:run-failed";
13
+ export const WORKFLOW_AGENT_STATE_CHANGED_EVENT = "workflow:agent-state-changed";
14
+ export const WORKFLOW_PHASE_CHANGED_EVENT = "workflow:phase-changed";
15
+ export const WORKFLOW_CHECKPOINT_STATE_CHANGED_EVENT = "workflow:checkpoint-state-changed";
16
+ export const WORKFLOW_BUDGET_EVENT = "workflow:budget-event";
17
+ export const WORKFLOW_WORKTREE_CREATED_EVENT = "workflow:worktree-created";
18
+ export const WORKFLOW_BLOCKED_EVENT = "workflow:blocked";
19
+ export const ERROR_CODES = [
20
+ "CONFIG_ERROR", "INVALID_SETTINGS", "INVALID_SYNTAX", "INVALID_METADATA", "DUPLICATE_NAME", "INVALID_SCHEMA", "UNKNOWN_MODEL", "UNKNOWN_TOOL", "UNKNOWN_AGENT_TYPE",
21
+ "RUN_OWNED", "RUN_NOT_FOUND", "REGISTRY_FROZEN", "GLOBAL_COLLISION", "MISSING_WORKFLOW", "RPC_LIMIT_EXCEEDED", "SHELL_FAILED", "AGENT_TIMEOUT", "AGENT_FAILED", "AGENT_RESULT_COLLECTED", "RESULT_INVALID",
22
+ "CANCELLED", "WORKER_UNRESPONSIVE", "WORKTREE_FAILED", "RESUME_INCOMPATIBLE", "BUDGET_EXHAUSTED", "INTERNAL_ERROR",
23
+ ];
24
+ export const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
25
+ export function roleNameOf(value) {
26
+ return typeof value === "string" ? value : undefined;
27
+ }
28
+ export const BUDGET_DIMENSIONS = ["tokens", "costUsd", "durationMs", "agentLaunches"];
29
+ export const BUDGET_EVENT_TYPES = ["soft_crossed", "hard_overrun", "hard_exhausted", "adjustment_requested", "adjustment_approved", "adjustment_rejected"];
30
+ export const CONTEXT_FILE_SCOPES = ["global", "project", "cwd"];
31
+ export function isContextFileScope(value) { return CONTEXT_FILE_SCOPES.some((scope) => scope === value); }
32
+ export const WORKFLOW_AGENT_STALL_THRESHOLD_MS = 10 * 60 * 1000;
33
+ export function zeroAccounting() { return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 }; }
34
+ export function addAccounting(left, right) { return { input: left.input + right.input, output: left.output + right.output, cacheRead: left.cacheRead + right.cacheRead, cacheWrite: left.cacheWrite + right.cacheWrite, cost: left.cost + right.cost }; }
35
+ export function sumAccounting(values) {
36
+ let total = zeroAccounting();
37
+ for (const value of values)
38
+ total = addAccounting(total, value);
39
+ return total;
40
+ }
41
+ export const LAUNCH_SNAPSHOT_IDENTITY_VERSION = 5;
42
+ export function defineWorkflowFunction(workflowFunction) { return workflowFunction; }
43
+ // The brand keeps instanceof working across the bundled extension entries, which each inline their own copy of this class.
44
+ const WORKFLOW_ERROR_BRAND = Symbol.for("pi-extensible-workflows.workflow-error");
45
+ export class WorkflowError extends Error {
46
+ code;
47
+ constructor(code, message) {
48
+ super(message);
49
+ this.code = code;
50
+ this.name = "WorkflowError";
51
+ this[WORKFLOW_ERROR_BRAND] = true;
52
+ }
53
+ static [Symbol.hasInstance](value) {
54
+ if (Function.prototype[Symbol.hasInstance].call(this, value))
55
+ return true;
56
+ // Subclasses do not own the brand marker, so they keep plain prototype-chain semantics.
57
+ return Object.hasOwn(this, WORKFLOW_ERROR_BRAND) && typeof value === "object" && value !== null && WORKFLOW_ERROR_BRAND in value;
58
+ }
59
+ }
60
+ Object.defineProperty(WorkflowError, WORKFLOW_ERROR_BRAND, { value: true });
@@ -0,0 +1,57 @@
1
+ import { WorkflowError, type JsonValue, type ModelSpec, type ThinkingLevel, type WorkflowErrorCode, type WorkflowExtensionSettings } from "./types.js";
2
+ export declare class SerialLane {
3
+ #private;
4
+ run<T>(task: () => Promise<T>): Promise<T>;
5
+ }
6
+ export declare function object(value: unknown): value is Record<string, unknown>;
7
+ export declare function sanitizeDisplayText(value: string): string;
8
+ export { object as isObject };
9
+ export declare function jsonValue(value: unknown, seen?: Set<object>): value is JsonValue;
10
+ export declare function jsonObject(value: unknown): value is Record<string, JsonValue>;
11
+ export declare function mergeWorkflowExtensionSettings(...layers: readonly (Readonly<WorkflowExtensionSettings> | undefined)[]): Readonly<WorkflowExtensionSettings> | undefined;
12
+ export declare function positiveInteger(value: unknown): value is number;
13
+ export declare function finiteNumber(value: unknown): value is number;
14
+ export declare function deepFreeze<T>(value: T): T;
15
+ export declare function isNodeError(error: unknown, code: string): error is {
16
+ code: string;
17
+ };
18
+ export declare function isWorkflowErrorCode(value: unknown): value is WorkflowErrorCode;
19
+ export declare function errorText(error: unknown): string;
20
+ export declare function coerceWorkflowError(code: WorkflowErrorCode, error: unknown): WorkflowError;
21
+ export declare function errorCode(error: unknown): WorkflowErrorCode | undefined;
22
+ export declare function markWorkflowAuthored(error: WorkflowError, authored?: boolean): WorkflowError;
23
+ export declare function isWorkflowAuthored(error: unknown): boolean;
24
+ export declare function asWorkflowError(error: unknown): WorkflowError;
25
+ export declare function fail(code: WorkflowErrorCode, message: string): never;
26
+ /** Sort order for agent setup hooks: lower priority first, ties broken by name so registration order never matters. */
27
+ export declare function byPriorityThenName(left: {
28
+ priority: number;
29
+ name: string;
30
+ }, right: {
31
+ priority: number;
32
+ name: string;
33
+ }): number;
34
+ export declare function isThinkingLevel(value: unknown): value is ThinkingLevel;
35
+ export declare const MODEL_ALIAS_NAME: RegExp;
36
+ export declare const WORKFLOW_EXTENSION_NAMESPACE: RegExp;
37
+ export declare function validWorkflowExtensionNamespace(value: string): boolean;
38
+ export declare function parseThinking(value: unknown): ModelSpec["thinking"] | undefined;
39
+ export declare function parseModelReference(value: string): ModelSpec;
40
+ export declare function assertModelThinking(value: string, path?: string): void;
41
+ export declare function annotateModelAliasError(error: unknown, name: string): unknown;
42
+ export declare function modelAliasErrorName(error: unknown): string | undefined;
43
+ export declare function modelAliasName(value: string, aliases: Readonly<Record<string, string>>): string | undefined;
44
+ export declare function validateModelAliases(value: unknown, settingsPath?: string): Readonly<Record<string, string>>;
45
+ export declare function unknownModel(value: string, target: string | undefined, settingsPath?: string): never;
46
+ export declare function resolveModelReference(value: string, aliases?: Readonly<Record<string, string>>, knownModels?: ReadonlySet<string>, settingsPath?: string): ModelSpec;
47
+ export declare function modelCapability(value: string | ModelSpec, aliases?: Readonly<Record<string, string>>, knownModels?: ReadonlySet<string>, settingsPath?: string): string;
48
+ export declare function aliasDrift(previous: Readonly<Record<string, string>>, current: Readonly<Record<string, string>>): string[];
49
+ export declare function validateResourcePattern(pattern: string): void;
50
+ export declare function resourcePatternMatches(resource: string, pattern: string): boolean;
51
+ export declare function selectResourcesByLayers(layers: readonly (readonly string[] | undefined)[], resources: readonly string[]): string[];
52
+ export declare function resourcePatternHasMagic(pattern: string): boolean;
53
+ export declare function unmatchedResourcePatterns(patterns: readonly string[], resources: readonly string[]): string[];
54
+ export declare function createLaunchSnapshot(input: Omit<import("./types.js").LaunchSnapshot, "identityVersion"> & {
55
+ identityVersion?: number;
56
+ }): Readonly<import("./types.js").LaunchSnapshot>;
57
+ export declare function loadLaunchSnapshot(input: import("./types.js").LaunchSnapshot): Readonly<import("./types.js").LaunchSnapshot>;
@@ -0,0 +1,225 @@
1
+ import { ERROR_CODES, LAUNCH_SNAPSHOT_IDENTITY_VERSION, THINKING_LEVELS, WorkflowError } from "./types.js";
2
+ import { Minimatch } from "minimatch";
3
+ export class SerialLane {
4
+ #tail = Promise.resolve();
5
+ run(task) {
6
+ const next = this.#tail.then(task, task);
7
+ this.#tail = next.then(() => undefined, () => undefined);
8
+ return next;
9
+ }
10
+ }
11
+ export function object(value) { return typeof value === "object" && value !== null && !Array.isArray(value); }
12
+ const ESCAPE_CHARACTER = String.fromCharCode(27);
13
+ const BELL_CHARACTER = String.fromCharCode(7);
14
+ const ANSI_ESCAPE_SEQUENCE = new RegExp(`${ESCAPE_CHARACTER}(?:\\[[0-?]*[ -/]*[@-~]|\\][^${BELL_CHARACTER}]*(?:${BELL_CHARACTER}|${ESCAPE_CHARACTER}\\\\))`, "g");
15
+ const TERMINAL_CONTROL_CHARACTER = new RegExp(`[${String.fromCharCode(0)}-${String.fromCharCode(31)}${String.fromCharCode(127)}-${String.fromCharCode(159)}]`, "g");
16
+ export function sanitizeDisplayText(value) { return value.replace(ANSI_ESCAPE_SEQUENCE, "").replace(TERMINAL_CONTROL_CHARACTER, " "); }
17
+ export { object as isObject };
18
+ function isStringKey(key) { return typeof key === "string"; }
19
+ function stringKeyValue(value, key) { return object(value) ? value[key] : undefined; }
20
+ export function jsonValue(value, seen = new Set()) {
21
+ if (value === null || typeof value === "boolean" || typeof value === "string")
22
+ return true;
23
+ if (typeof value === "number")
24
+ return Number.isFinite(value);
25
+ if (typeof value !== "object" || seen.has(value))
26
+ return false;
27
+ if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)
28
+ return false;
29
+ const ownKeys = Reflect.ownKeys(value);
30
+ const keys = ownKeys.filter(isStringKey);
31
+ if (keys.length !== ownKeys.length)
32
+ return false;
33
+ seen.add(value);
34
+ const valid = (Array.isArray(value) ? Array.from(value) : keys.map((key) => stringKeyValue(value, key))).every((item) => jsonValue(item, seen));
35
+ seen.delete(value);
36
+ return valid;
37
+ }
38
+ export function jsonObject(value) { return jsonValue(value) && object(value); }
39
+ export function mergeWorkflowExtensionSettings(...layers) {
40
+ const merged = {};
41
+ let present = false;
42
+ for (const layer of layers) {
43
+ if (layer === undefined)
44
+ continue;
45
+ present = true;
46
+ for (const [namespace, value] of Object.entries(layer))
47
+ Object.defineProperty(merged, namespace, { value: structuredClone(value), enumerable: true, configurable: true, writable: true });
48
+ }
49
+ return present ? deepFreeze(merged) : undefined;
50
+ }
51
+ export function positiveInteger(value) { return typeof value === "number" && Number.isInteger(value) && value > 0; }
52
+ export function finiteNumber(value) { return typeof value === "number" && Number.isFinite(value); }
53
+ export function deepFreeze(value) {
54
+ if (typeof value === "object" && value !== null && !Object.isFrozen(value)) {
55
+ Object.freeze(value);
56
+ for (const child of Object.values(value))
57
+ deepFreeze(child);
58
+ }
59
+ return value;
60
+ }
61
+ export function isNodeError(error, code) { return object(error) && error.code === code; }
62
+ export function isWorkflowErrorCode(value) { return ERROR_CODES.some((candidate) => candidate === value); }
63
+ export function errorText(error) { return object(error) && typeof error.message === "string" ? error.message : error instanceof Error ? error.message : String(error); }
64
+ export function coerceWorkflowError(code, error) {
65
+ return error instanceof WorkflowError && error.code === code ? error : new WorkflowError(code, errorText(error));
66
+ }
67
+ export function errorCode(error) {
68
+ if (error instanceof WorkflowError)
69
+ return isWorkflowErrorCode(error.code) ? error.code : undefined;
70
+ if (!object(error))
71
+ return undefined;
72
+ return isWorkflowErrorCode(error.code) ? error.code : undefined;
73
+ }
74
+ const WORKFLOW_AUTHORED_ERROR = Symbol("workflowAuthoredError");
75
+ export function markWorkflowAuthored(error, authored = false) {
76
+ if (authored)
77
+ Object.defineProperty(error, WORKFLOW_AUTHORED_ERROR, { value: true });
78
+ return error;
79
+ }
80
+ export function isWorkflowAuthored(error) { return Boolean(error && typeof error === "object" && WORKFLOW_AUTHORED_ERROR in error); }
81
+ export function asWorkflowError(error) {
82
+ const code = errorCode(error);
83
+ return markWorkflowAuthored(error instanceof WorkflowError && code ? error : new WorkflowError(code ?? "INTERNAL_ERROR", errorText(error)), isWorkflowAuthored(error) || !code);
84
+ }
85
+ export function fail(code, message) { throw new WorkflowError(code, message); }
86
+ /** Sort order for agent setup hooks: lower priority first, ties broken by name so registration order never matters. */
87
+ export function byPriorityThenName(left, right) { return left.priority - right.priority || (left.name < right.name ? -1 : left.name > right.name ? 1 : 0); }
88
+ export function isThinkingLevel(value) { return THINKING_LEVELS.some((level) => level === value); }
89
+ export const MODEL_ALIAS_NAME = /^[A-Za-z][A-Za-z0-9_-]*$/;
90
+ export const WORKFLOW_EXTENSION_NAMESPACE = /^[A-Za-z][A-Za-z0-9_-]*$/;
91
+ export function validWorkflowExtensionNamespace(value) { return WORKFLOW_EXTENSION_NAMESPACE.test(value) && value !== "__proto__" && value !== "constructor" && value !== "prototype"; }
92
+ export function parseThinking(value) { return isThinkingLevel(value) ? value : undefined; }
93
+ export function parseModelReference(value) {
94
+ const match = /^([^/:\s]+)\/([^:\s]+)(?::([^:\s]+))?$/.exec(value);
95
+ if (!match?.[1] || !match[2])
96
+ fail("UNKNOWN_MODEL", `Invalid model spec: ${value}`);
97
+ const thinking = match[3];
98
+ if (thinking !== undefined && !isThinkingLevel(thinking))
99
+ fail("UNKNOWN_MODEL", `Invalid thinking level: ${thinking}`);
100
+ return { provider: match[1], model: match[2], ...(thinking !== undefined ? { thinking } : {}) };
101
+ }
102
+ export function assertModelThinking(value, path = "model") {
103
+ if (value.includes("/") && parseModelReference(value).thinking === undefined)
104
+ fail("INVALID_METADATA", `${path} must be provider/model:thinking`);
105
+ }
106
+ const MODEL_ALIAS_ERROR_NAME = Symbol("modelAliasErrorName");
107
+ function aliasError(message, settingsPath, name) {
108
+ const error = new WorkflowError("CONFIG_ERROR", `${message} (settings: ${settingsPath})`);
109
+ if (name)
110
+ Object.defineProperty(error, MODEL_ALIAS_ERROR_NAME, { value: name, configurable: true });
111
+ throw error;
112
+ }
113
+ export function annotateModelAliasError(error, name) {
114
+ if (error instanceof WorkflowError)
115
+ Object.defineProperty(error, MODEL_ALIAS_ERROR_NAME, { value: name, configurable: true });
116
+ return error;
117
+ }
118
+ export function modelAliasErrorName(error) {
119
+ return error instanceof WorkflowError ? error[MODEL_ALIAS_ERROR_NAME] : undefined;
120
+ }
121
+ export function modelAliasName(value, aliases) {
122
+ const name = /^([^/:\s]+)(?::[^:\s]+)?$/.exec(value)?.[1];
123
+ return name && Object.prototype.hasOwnProperty.call(aliases, name) ? name : undefined;
124
+ }
125
+ export function validateModelAliases(value, settingsPath = "workflow settings") {
126
+ if (!object(value))
127
+ aliasError("modelAliases must be an object", settingsPath);
128
+ const aliases = {};
129
+ for (const [name, target] of Object.entries(value)) {
130
+ if (!MODEL_ALIAS_NAME.test(name))
131
+ aliasError(`Invalid model alias name: ${name}`, settingsPath, name);
132
+ if (typeof target !== "string" || !target.trim())
133
+ aliasError(`Invalid model alias target for ${name}`, settingsPath, name);
134
+ aliases[name] = target;
135
+ }
136
+ for (const name of Object.keys(aliases)) {
137
+ try {
138
+ resolveModelReference(name, aliases);
139
+ }
140
+ catch (error) {
141
+ aliasError(`Invalid model alias target for ${name}: ${errorText(error)}`, settingsPath, name);
142
+ }
143
+ }
144
+ return Object.freeze(aliases);
145
+ }
146
+ export function unknownModel(value, target, settingsPath) {
147
+ const resolved = target ? ` resolved to ${target}` : "";
148
+ const path = settingsPath ? ` (settings: ${settingsPath})` : "";
149
+ fail("UNKNOWN_MODEL", `Unknown model${target ? " alias" : ""} ${value}${resolved}${path}`);
150
+ }
151
+ export function resolveModelReference(value, aliases = {}, knownModels, settingsPath) {
152
+ const resolveReference = (reference, chain) => {
153
+ if (reference.includes("/"))
154
+ return parseModelReference(reference);
155
+ const match = /^([^:\s]+)(?::([^:\s]+))?$/.exec(reference);
156
+ const thinking = match?.[2];
157
+ if (!match?.[1] || thinking !== undefined && !isThinkingLevel(thinking))
158
+ unknownModel(reference, undefined, settingsPath);
159
+ const alias = modelAliasName(reference, aliases);
160
+ if (alias) {
161
+ if (chain.includes(alias))
162
+ fail("UNKNOWN_MODEL", `Circular model alias: ${[...chain, alias].join(" -> ")}${settingsPath ? ` (settings: ${settingsPath})` : ""}`);
163
+ const { [alias]: target } = aliases;
164
+ if (typeof target !== "string")
165
+ unknownModel(reference, undefined, settingsPath);
166
+ const parsed = resolveReference(target, [...chain, alias]);
167
+ return thinking !== undefined ? { ...parsed, thinking } : parsed;
168
+ }
169
+ const candidates = [...(knownModels ?? [])].filter((model) => model.slice(model.indexOf("/") + 1) === match[1]);
170
+ if (candidates.length === 1) {
171
+ const [candidate] = candidates;
172
+ if (candidate !== undefined) {
173
+ const parsed = parseModelReference(candidate);
174
+ return thinking !== undefined ? { ...parsed, thinking } : parsed;
175
+ }
176
+ }
177
+ unknownModel(reference, undefined, settingsPath);
178
+ };
179
+ return resolveReference(value, []);
180
+ }
181
+ export function modelCapability(value, aliases, knownModels, settingsPath) {
182
+ const parsed = typeof value === "string" ? resolveModelReference(value, aliases, knownModels, settingsPath) : value;
183
+ return `${parsed.provider}/${parsed.model}`;
184
+ }
185
+ export function aliasDrift(previous, current) {
186
+ return [...new Set([...Object.keys(previous), ...Object.keys(current)])].sort().flatMap((name) => previous[name] === current[name] ? [] : [`${name}: ${previous[name] ?? "(missing)"} -> ${current[name] ?? "(missing)"}`]);
187
+ }
188
+ const RESOURCE_PATTERN_OPTIONS = { dot: true, nonegate: true, nocomment: true };
189
+ function resourcePatternBody(pattern) { return pattern.startsWith("!") ? pattern.slice(1) : pattern; }
190
+ function resourcePatternPath(value) { return value.replaceAll("\\", "/"); }
191
+ export function validateResourcePattern(pattern) {
192
+ const body = resourcePatternBody(pattern);
193
+ if (!body)
194
+ throw new Error(`Empty minimatch pattern ${JSON.stringify(pattern)}`);
195
+ const matcher = new Minimatch(resourcePatternPath(body), RESOURCE_PATTERN_OPTIONS);
196
+ if (matcher.makeRe() === false)
197
+ throw new Error(`Invalid minimatch pattern ${JSON.stringify(pattern)}`);
198
+ }
199
+ export function resourcePatternMatches(resource, pattern) {
200
+ const body = resourcePatternBody(pattern);
201
+ if (body === "*")
202
+ return true;
203
+ return new Minimatch(resourcePatternPath(body), RESOURCE_PATTERN_OPTIONS).match(resourcePatternPath(resource));
204
+ }
205
+ export function selectResourcesByLayers(layers, resources) {
206
+ const enabled = new Set(resources);
207
+ for (const layer of layers) {
208
+ if (layer === undefined)
209
+ continue;
210
+ for (const resource of resources) {
211
+ for (const pattern of layer)
212
+ if (resourcePatternMatches(resource, pattern)) {
213
+ if (pattern.startsWith("!"))
214
+ enabled.delete(resource);
215
+ else
216
+ enabled.add(resource);
217
+ }
218
+ }
219
+ }
220
+ return resources.filter((resource) => enabled.has(resource));
221
+ }
222
+ export function resourcePatternHasMagic(pattern) { return /[*?\x5b\x5d{}()]/.test(resourcePatternBody(pattern)); }
223
+ export function unmatchedResourcePatterns(patterns, resources) { return patterns.filter((pattern) => !resources.some((resource) => resourcePatternMatches(resource, pattern))); }
224
+ export function createLaunchSnapshot(input) { return deepFreeze(structuredClone({ ...input, identityVersion: input.identityVersion ?? LAUNCH_SNAPSHOT_IDENTITY_VERSION })); }
225
+ export function loadLaunchSnapshot(input) { return deepFreeze(structuredClone(input)); }
@@ -0,0 +1,29 @@
1
+ import type { AgentDefinition, AgentResourcePolicy, CheckpointInput, JsonSchema, JsonValue, PreflightCapabilities, PreflightResult, ShellOptions, StaticWorkflowCall, ValidatedWorkflowLaunch, WorkflowExtensionSettings, WorkflowMetadata, WorkflowRoleDirectoryRegistration, WorkflowSettings, WorkflowSettingsOverrides, WorkflowSettingsResolution, WorkflowValidationContext, WorkflowValidationParameters } from "./types.js";
2
+ import type { WorkflowRegistryApi } from "./registry.js";
3
+ export { workflowProjectSettingsPath } from "./paths.js";
4
+ export declare const DEFAULT_SETTINGS: Readonly<WorkflowSettings>;
5
+ export declare function validateCheckpoint(value: unknown): CheckpointInput;
6
+ export declare function workflowSettingsPath(agentDir?: string): string;
7
+ export declare function validateWorkflowExtensionSettings(value: unknown, settingsPath: string, errorCode?: "INVALID_SETTINGS" | "INVALID_METADATA", applyDefaults?: boolean): WorkflowExtensionSettings | undefined;
8
+ export declare function loadSettings(path?: string): Readonly<WorkflowSettings>;
9
+ export declare function loadSettingsOverrides(path: string): Readonly<WorkflowSettingsOverrides>;
10
+ export declare function resolveWorkflowSettings(cwd: string, projectTrusted: boolean, globalSettingsPath?: string): WorkflowSettingsResolution;
11
+ export declare function validateModelAliasAvailability(aliases: Readonly<Record<string, string>>, names: readonly string[], availableModels: ReadonlySet<string>, knownModels: ReadonlySet<string>, settingsPath?: string): void;
12
+ export declare function resolveAgentResourcePolicy(cwd: string, projectTrusted: boolean, globalSettingsPath?: string): AgentResourcePolicy;
13
+ export declare function saveModelAliases(path?: string, aliases?: Readonly<Record<string, string>>): void;
14
+ export declare function parseRoleMarkdown(content: string, strict?: boolean, rolePath?: string): AgentDefinition;
15
+ export declare function workflowRoleDirectories(agentDir?: string): readonly string[];
16
+ export type WorkflowRoleDirectoryInput = string | WorkflowRoleDirectoryRegistration;
17
+ export declare function loadProjectAgentDefinitions(cwd: string): Readonly<Record<string, AgentDefinition>>;
18
+ export declare function loadAgentDefinitions(cwd: string, agentDir?: string, projectTrusted?: boolean, extensionRoleDirectories?: readonly WorkflowRoleDirectoryInput[]): Readonly<Record<string, AgentDefinition>>;
19
+ export declare function instrumentWorkflow(script: string): string;
20
+ export declare function workflowPrompt(template: string, values: Readonly<Record<string, JsonValue>>): string;
21
+ export declare function validateSchema(schema: unknown, at?: string): asserts schema is JsonSchema;
22
+ export declare function validateAgentOptions(value: unknown): Readonly<Record<string, JsonValue>>;
23
+ export declare function validateShellOptions(value: unknown): ShellOptions;
24
+ export declare function validateShellCommand(value: unknown): string;
25
+ export declare function inspectWorkflowScript(script: string): StaticWorkflowCall[];
26
+ export declare function preflight(script: string, capabilities: PreflightCapabilities, schemas?: readonly unknown[], metadata?: WorkflowMetadata, compatibility?: boolean): PreflightResult;
27
+ export declare function validateWorkflowLaunch(params: WorkflowValidationParameters, context: WorkflowValidationContext, registry?: WorkflowRegistryApi): ValidatedWorkflowLaunch;
28
+ export declare function validateWorkflowLaunchWithRegistry(params: WorkflowValidationParameters, context: WorkflowValidationContext, registry?: WorkflowRegistryApi): ValidatedWorkflowLaunch;
29
+ export { createLaunchSnapshot, loadLaunchSnapshot } from "./utils.js";