@wichayutdew/pi-workflows 0.3.0 → 1.0.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 (144) hide show
  1. package/README.md +55 -39
  2. package/dist/index.js +5771 -4794
  3. package/examples/mr-comments.workflow.yaml +2 -0
  4. package/package.json +1 -1
  5. package/schemas/workflow.schema.json +10 -1
  6. package/src/command-names.ts +7 -1
  7. package/src/commands.ts +126 -52
  8. package/src/config/catalog.ts +162 -0
  9. package/src/config/ceiling.ts +120 -116
  10. package/src/config/command-conflicts.ts +4 -4
  11. package/src/config/diagnostics.ts +28 -0
  12. package/src/config/load-settings.ts +37 -0
  13. package/src/config/load-types.ts +53 -0
  14. package/src/config/load-workflows.ts +135 -0
  15. package/src/config/load.ts +43 -311
  16. package/src/config/types.ts +150 -137
  17. package/src/config/validate.ts +12 -1261
  18. package/src/config/validation/permissions.ts +312 -0
  19. package/src/config/validation/prompt.ts +21 -0
  20. package/src/config/validation/settings.ts +122 -0
  21. package/src/config/validation/shared.ts +129 -0
  22. package/src/config/validation/shortcut.ts +118 -0
  23. package/src/config/validation/step.ts +228 -0
  24. package/src/config/validation/subagent.ts +288 -0
  25. package/src/config/validation/workflow.ts +156 -0
  26. package/src/config/yaml.ts +29 -0
  27. package/src/digest.ts +38 -6
  28. package/src/engine/checkpoint.ts +13 -9
  29. package/src/engine/create-run.ts +43 -0
  30. package/src/engine/gate-transitions.ts +187 -0
  31. package/src/engine/reconciliation-history.ts +88 -0
  32. package/src/engine/resume.ts +19 -7
  33. package/src/engine/run-advance.ts +122 -0
  34. package/src/engine/run-lifecycle.ts +124 -0
  35. package/src/engine/run-reconciliation.ts +116 -0
  36. package/src/engine/run-validation.ts +129 -0
  37. package/src/engine/state-types.ts +66 -0
  38. package/src/engine/state.ts +10 -193
  39. package/src/engine/transition-helpers.ts +28 -0
  40. package/src/engine/transition-types.ts +8 -0
  41. package/src/engine/transitions.ts +17 -471
  42. package/src/harness/action-context.ts +181 -0
  43. package/src/harness/catalog.ts +45 -0
  44. package/src/harness/context-idle.ts +21 -0
  45. package/src/harness/core-actions.ts +299 -0
  46. package/src/harness/delegation-control-actions.ts +250 -0
  47. package/src/harness/delegation-failure.ts +215 -0
  48. package/src/harness/delegation-plan.ts +219 -0
  49. package/src/harness/delegation-recovery-validation.ts +159 -0
  50. package/src/harness/delegation-response-actions.ts +295 -0
  51. package/src/harness/delegation-retry-policy.ts +118 -0
  52. package/src/harness/dependencies.ts +165 -0
  53. package/src/harness/gate-submission-action.ts +154 -0
  54. package/src/harness/lifecycle-actions.ts +154 -0
  55. package/src/harness/pause-actions.ts +120 -0
  56. package/src/harness/plannotator-result-actions.ts +123 -0
  57. package/src/harness/prompt-gate-actions.ts +270 -0
  58. package/src/harness/resume-action.ts +261 -0
  59. package/src/harness/start-actions.ts +183 -0
  60. package/src/harness/status-actions.ts +191 -0
  61. package/src/harness/step-execution-actions.ts +283 -0
  62. package/src/harness/types.ts +76 -0
  63. package/src/harness.ts +236 -2303
  64. package/src/index.ts +73 -11
  65. package/src/integrations/plannotator-requests.ts +127 -0
  66. package/src/integrations/plannotator-responses.ts +141 -0
  67. package/src/integrations/plannotator-types.ts +44 -0
  68. package/src/integrations/plannotator.ts +16 -235
  69. package/src/integrations/prompt-gate.ts +17 -10
  70. package/src/integrations/subagents/child-policy-envelope.ts +119 -0
  71. package/src/integrations/subagents/child-policy-paths.ts +66 -0
  72. package/src/integrations/subagents/child-policy-sections.ts +186 -0
  73. package/src/integrations/subagents/child-policy-types.ts +32 -0
  74. package/src/integrations/subagents/child-policy-validation.ts +163 -0
  75. package/src/integrations/subagents/child-runtime-completion.ts +56 -0
  76. package/src/integrations/subagents/child-runtime-dependencies.ts +47 -0
  77. package/src/integrations/subagents/child-runtime-files.ts +156 -0
  78. package/src/integrations/subagents/child-runtime-policy.ts +83 -0
  79. package/src/integrations/subagents/child-runtime-types.ts +30 -0
  80. package/src/integrations/subagents/child-runtime.ts +140 -301
  81. package/src/integrations/subagents/client-delegation.ts +181 -0
  82. package/src/integrations/subagents/client-messages.ts +66 -0
  83. package/src/integrations/subagents/client-types.ts +36 -0
  84. package/src/integrations/subagents/client.ts +127 -219
  85. package/src/integrations/subagents/delegated-result.ts +31 -0
  86. package/src/integrations/subagents/diagnostic-format.ts +40 -0
  87. package/src/integrations/subagents/diagnostic-text.ts +114 -0
  88. package/src/integrations/subagents/diagnostic-types.ts +77 -0
  89. package/src/integrations/subagents/diagnostics.ts +24 -977
  90. package/src/integrations/subagents/failure-correlation.ts +235 -0
  91. package/src/integrations/subagents/failure-transcript.ts +192 -0
  92. package/src/integrations/subagents/hidden-bash-failure.ts +98 -0
  93. package/src/integrations/subagents/protocol-events.ts +27 -0
  94. package/src/integrations/subagents/protocol.ts +30 -375
  95. package/src/integrations/subagents/replay-audit.ts +147 -0
  96. package/src/integrations/subagents/replay-safety.ts +82 -0
  97. package/src/integrations/subagents/session-diagnostics.ts +258 -0
  98. package/src/policy/approved-command-extraction.ts +71 -0
  99. package/src/policy/approved-commands.ts +15 -432
  100. package/src/policy/bash-authorization.ts +86 -0
  101. package/src/policy/bash-read-only.ts +161 -0
  102. package/src/policy/bash-types.ts +20 -0
  103. package/src/policy/bash.ts +4 -346
  104. package/src/policy/completion-batch.ts +21 -16
  105. package/src/policy/immutable-input.ts +5 -2
  106. package/src/policy/mcp-authorization.ts +71 -0
  107. package/src/policy/restricted-command.ts +141 -0
  108. package/src/policy/restricted-git.ts +30 -0
  109. package/src/policy/reviewed-artifact.ts +97 -0
  110. package/src/policy/reviewed-command-safety.ts +150 -0
  111. package/src/policy/reviewed-command-shape.ts +49 -0
  112. package/src/policy/reviewed-repository-contract.ts +138 -0
  113. package/src/policy/reviewed-repository-cwd.ts +102 -0
  114. package/src/policy/tool-call-authorization.ts +58 -0
  115. package/src/policy/tool-selection.ts +72 -0
  116. package/src/policy/tool-types.ts +14 -0
  117. package/src/policy/tools.ts +11 -150
  118. package/src/preflight.ts +96 -61
  119. package/src/prompt/main-workflow-notice.ts +41 -0
  120. package/src/prompt/retry-task.ts +83 -0
  121. package/src/prompt/step-contract.ts +101 -0
  122. package/src/prompt/step-sections.ts +75 -0
  123. package/src/prompt/step-task.ts +156 -0
  124. package/src/prompt/template.ts +83 -0
  125. package/src/prompt.ts +10 -254
  126. package/src/runtime/completion-tool.ts +3 -0
  127. package/src/runtime/main-step-completion.ts +78 -0
  128. package/src/runtime/main-step-lifecycle.ts +37 -0
  129. package/src/runtime/main-step-policy.ts +84 -0
  130. package/src/runtime/main-step-runtime-types.ts +64 -0
  131. package/src/runtime/main-step-runtime.ts +129 -200
  132. package/src/runtime/main-step-state.ts +85 -0
  133. package/src/runtime/serial-task-queue.ts +48 -13
  134. package/src/runtime/step-result.ts +48 -27
  135. package/src/workflow-list.ts +15 -6
  136. package/src/workflow-status/format-status.ts +52 -0
  137. package/src/workflow-status/formatting.ts +178 -0
  138. package/src/workflow-status/layout.ts +109 -0
  139. package/src/workflow-status/render-board.ts +101 -0
  140. package/src/workflow-status/render-path.ts +123 -0
  141. package/src/workflow-status/render-summary.ts +144 -0
  142. package/src/workflow-status/types.ts +40 -0
  143. package/src/workflow-status/view.ts +273 -0
  144. package/src/workflow-status.ts +20 -820
@@ -7,193 +7,206 @@ export const SUBAGENT_RUNTIME_NAME_PATTERN =
7
7
 
8
8
  export const TERMINAL_TARGETS = ['$done', '$pause'] as const;
9
9
  export type TerminalTarget = (typeof TERMINAL_TARGETS)[number];
10
- export type StepTarget = string | TerminalTarget;
10
+ export type StepTarget = string;
11
11
 
12
12
  export type BashMode = 'deny' | 'read-only' | 'allow-list' | 'unrestricted';
13
13
  export type BashApprovalSource =
14
- 'verification-worker' | 'verification-reviewer' | 'remote-actions';
15
-
16
- export interface BashRule {
17
- executable: string;
18
- argsPrefix: string[];
19
- }
14
+ | 'verification-worker'
15
+ | 'verification-reviewer'
16
+ | 'remote-actions'
17
+ | 'remote-push'
18
+ | 'remote-drafts';
19
+
20
+ export type BashRule = {
21
+ readonly executable: string;
22
+ readonly argsPrefix: ReadonlyArray<string>;
23
+ };
20
24
 
21
- export interface BashPermission {
22
- mode: BashMode;
23
- allow: BashRule[];
25
+ export type BashPermission = {
26
+ readonly mode: BashMode;
27
+ readonly allow: ReadonlyArray<BashRule>;
24
28
  /**
25
29
  * Exact commands extracted from the most recent human-approved artifact.
26
30
  * They supplement `allow` only inside the correlated step execution.
27
31
  */
28
- approvedSources?: BashApprovalSource[];
29
- }
32
+ readonly approvedSources?: ReadonlyArray<BashApprovalSource>;
33
+ /**
34
+ * Sources whose command-only retry handoffs may refine an already approved
35
+ * command. The original reviewed identity and safety envelope remain fixed.
36
+ */
37
+ readonly handoffSources?: ReadonlyArray<
38
+ 'verification-worker' | 'verification-reviewer'
39
+ >;
40
+ };
30
41
 
31
- export interface StepPermissions {
42
+ export type StepPermissions = {
32
43
  /** Exact Pi tool names, including direct MCP tools. */
33
- tools: string[];
44
+ readonly tools: ReadonlyArray<string>;
34
45
  /** MCP proxy selectors in `server` or `server/tool` form. */
35
- mcp: string[];
46
+ readonly mcp: ReadonlyArray<string>;
36
47
  /** Source-name/path fragments whose registered tools may be used. */
37
- extensions: string[];
48
+ readonly extensions: ReadonlyArray<string>;
38
49
  /** Skills the step prompt is allowed to use. */
39
- skills: string[];
40
- bash: BashPermission;
41
- }
50
+ readonly skills: ReadonlyArray<string>;
51
+ readonly bash: BashPermission;
52
+ };
42
53
 
43
- export interface StepRequirements {
44
- tools: string[];
45
- extensions: string[];
46
- skills: string[];
47
- }
54
+ export type StepRequirements = {
55
+ readonly tools: ReadonlyArray<string>;
56
+ readonly extensions: ReadonlyArray<string>;
57
+ readonly skills: ReadonlyArray<string>;
58
+ };
48
59
 
49
60
  export type SubagentContext = 'fresh';
50
61
 
51
- export interface SubagentTurnBudget {
52
- maxTurns: number;
53
- graceTurns?: number;
54
- }
62
+ export type SubagentTurnBudget = {
63
+ readonly maxTurns: number;
64
+ readonly graceTurns?: number;
65
+ };
55
66
 
56
- export interface SubagentToolBudget {
57
- hard: number;
58
- soft?: number;
59
- block?: string[] | '*';
60
- }
67
+ export type SubagentToolBudget = {
68
+ readonly hard: number;
69
+ readonly soft?: number;
70
+ readonly block?: ReadonlyArray<string> | '*';
71
+ };
61
72
 
62
- export interface StepSubagent {
73
+ export type StepSubagent = {
63
74
  /** Pi Subagents agent profile launched for this isolated step. */
64
- agent: string;
75
+ readonly agent: string;
65
76
  /** Workflow steps always use a fresh context. */
66
- context: SubagentContext;
67
- model?: string;
68
- timeoutMs: number;
69
- turnBudget?: SubagentTurnBudget;
70
- toolBudget?: SubagentToolBudget;
71
- artifacts: boolean;
77
+ readonly context: SubagentContext;
78
+ readonly model?: string;
79
+ readonly timeoutMs: number;
80
+ readonly turnBudget?: SubagentTurnBudget;
81
+ readonly toolBudget?: SubagentToolBudget;
82
+ readonly artifacts: boolean;
72
83
  /**
73
- * Authorizes one fresh reinforcement retry in Bash modes broader than
74
- * read-only when the complete trusted attempt is replay-safe.
84
+ * Authorizes the bounded automatic recovery sequence in Bash modes broader
85
+ * than read-only. Every failed attempt must still have a complete,
86
+ * mutation-safe replay audit.
75
87
  */
76
- retryToolFailures: boolean;
77
- }
88
+ readonly retryToolFailures: boolean;
89
+ };
78
90
 
79
- export type PromptSpec = { inline: string } | { file: string };
91
+ export type PromptSpec =
92
+ { readonly inline: string } | { readonly file: string };
80
93
 
81
- interface GateDefinition {
82
- submitOutcome: string;
83
- approvedOutcome: string;
84
- rejectedOutcome: string;
85
- }
94
+ type GateDefinition = {
95
+ readonly submitOutcome: string;
96
+ readonly approvedOutcome: string;
97
+ readonly rejectedOutcome: string;
98
+ };
86
99
 
87
- export interface PromptGate extends GateDefinition {
88
- provider: 'prompt';
89
- }
100
+ export type PromptGate = GateDefinition & {
101
+ readonly provider: 'prompt';
102
+ };
90
103
 
91
- export interface PlannotatorGate extends GateDefinition {
92
- provider: 'plannotator';
93
- timeoutMs: number;
94
- }
104
+ export type PlannotatorGate = GateDefinition & {
105
+ readonly provider: 'plannotator';
106
+ readonly timeoutMs: number;
107
+ };
95
108
 
96
109
  export type WorkflowGate = PromptGate | PlannotatorGate;
97
110
 
98
- export interface WorkflowStep {
99
- title: string;
100
- prompt: PromptSpec;
111
+ export type WorkflowStep = {
112
+ readonly title: string;
113
+ readonly prompt: PromptSpec;
101
114
  /** Omit to execute this step in the main Pi agent. */
102
- subagent?: StepSubagent;
103
- permissions: StepPermissions;
104
- requires: StepRequirements;
105
- transitions: Record<string, StepTarget>;
106
- gate?: WorkflowGate;
107
- }
108
-
109
- export interface WorkflowDefinition {
110
- version: typeof WORKFLOW_SCHEMA_VERSION;
111
- id: string;
112
- command: string;
113
- description: string;
114
- start: string;
115
- maxStepVisits: number;
116
- summaryMaxChars: number;
117
- steps: Record<string, WorkflowStep>;
118
- }
115
+ readonly subagent?: StepSubagent;
116
+ readonly permissions: StepPermissions;
117
+ readonly requires: StepRequirements;
118
+ readonly transitions: Readonly<Record<string, StepTarget>>;
119
+ readonly gate?: WorkflowGate;
120
+ };
121
+
122
+ export type WorkflowDefinition = {
123
+ readonly version: typeof WORKFLOW_SCHEMA_VERSION;
124
+ readonly id: string;
125
+ readonly command: string;
126
+ readonly description: string;
127
+ readonly start: string;
128
+ readonly maxStepVisits: number;
129
+ readonly summaryMaxChars: number;
130
+ readonly steps: Readonly<Record<string, WorkflowStep>>;
131
+ };
119
132
 
120
133
  export type WorkflowSourceKind = 'user' | 'project';
121
134
 
122
- export interface LoadedWorkflow {
123
- definition: WorkflowDefinition;
124
- prompts: Record<string, string>;
125
- digest: string;
126
- stepDigests: Record<string, string>;
127
- sourcePath: string;
128
- sourceKind: WorkflowSourceKind;
129
- }
130
-
131
- export interface PermissionCeiling {
132
- tools: string[];
133
- mcp: string[];
134
- extensions: string[];
135
- skills: string[];
136
- bash: BashPermission;
137
- subagent?: SubagentPermissionCeiling;
138
- }
139
-
140
- export interface SubagentPermissionCeiling {
141
- agents: string[];
142
- contexts: SubagentContext[];
143
- models: string[];
144
- maxTimeoutMs: number;
145
- maxTurns: number;
146
- maxGraceTurns: number;
147
- maxToolCalls: number;
148
- artifacts: boolean;
149
- retryToolFailures: boolean;
150
- }
151
-
152
- export interface WorkflowSettings {
153
- version: typeof WORKFLOW_SCHEMA_VERSION;
154
- allowProjectWorkflows: boolean;
155
- statusShortcut: KeyId;
156
- permissionCeiling?: PermissionCeiling;
157
- }
158
-
159
- export interface ConfigDiagnostic {
160
- level: 'warning' | 'error';
161
- path: string;
162
- message: string;
163
- }
164
-
165
- export interface WorkflowCatalog {
166
- workflows: Map<string, LoadedWorkflow>;
167
- settings: WorkflowSettings;
168
- diagnostics: ConfigDiagnostic[];
169
- userDirectory: string;
170
- projectDirectory?: string;
171
- }
172
-
173
- export const EMPTY_PERMISSIONS: StepPermissions = {
135
+ export type LoadedWorkflow = {
136
+ readonly definition: WorkflowDefinition;
137
+ readonly prompts: Readonly<Record<string, string>>;
138
+ readonly digest: string;
139
+ readonly stepDigests: Readonly<Record<string, string>>;
140
+ readonly sourcePath: string;
141
+ readonly sourceKind: WorkflowSourceKind;
142
+ };
143
+
144
+ export type PermissionCeiling = {
145
+ readonly tools: ReadonlyArray<string>;
146
+ readonly mcp: ReadonlyArray<string>;
147
+ readonly extensions: ReadonlyArray<string>;
148
+ readonly skills: ReadonlyArray<string>;
149
+ readonly bash: BashPermission;
150
+ readonly subagent?: SubagentPermissionCeiling;
151
+ };
152
+
153
+ export type SubagentPermissionCeiling = {
154
+ readonly agents: ReadonlyArray<string>;
155
+ readonly contexts: ReadonlyArray<SubagentContext>;
156
+ readonly models: ReadonlyArray<string>;
157
+ readonly maxTimeoutMs: number;
158
+ readonly maxTurns: number;
159
+ readonly maxGraceTurns: number;
160
+ readonly maxToolCalls: number;
161
+ readonly artifacts: boolean;
162
+ readonly retryToolFailures: boolean;
163
+ };
164
+
165
+ export type WorkflowSettings = {
166
+ readonly version: typeof WORKFLOW_SCHEMA_VERSION;
167
+ readonly allowProjectWorkflows: boolean;
168
+ readonly statusShortcut: KeyId;
169
+ readonly permissionCeiling?: PermissionCeiling;
170
+ };
171
+
172
+ export type ConfigDiagnostic = {
173
+ readonly level: 'warning' | 'error';
174
+ readonly path: string;
175
+ readonly message: string;
176
+ };
177
+
178
+ export type WorkflowCatalog = {
179
+ readonly workflows: ReadonlyMap<string, LoadedWorkflow>;
180
+ readonly settings: WorkflowSettings;
181
+ readonly diagnostics: ReadonlyArray<ConfigDiagnostic>;
182
+ readonly userDirectory: string;
183
+ readonly projectDirectory?: string;
184
+ };
185
+
186
+ export const EMPTY_PERMISSIONS = {
174
187
  tools: [],
175
188
  mcp: [],
176
189
  extensions: [],
177
190
  skills: [],
178
191
  bash: { mode: 'deny', allow: [] },
179
- };
192
+ } as const satisfies StepPermissions;
180
193
 
181
- export const EMPTY_REQUIREMENTS: StepRequirements = {
194
+ export const EMPTY_REQUIREMENTS = {
182
195
  tools: [],
183
196
  extensions: [],
184
197
  skills: [],
185
- };
198
+ } as const satisfies StepRequirements;
186
199
 
187
- export const DEFAULT_STEP_SUBAGENT: StepSubagent = {
200
+ export const DEFAULT_STEP_SUBAGENT = {
188
201
  agent: 'pi-workflows.step',
189
202
  context: 'fresh',
190
203
  timeoutMs: 900_000,
191
204
  artifacts: false,
192
205
  retryToolFailures: false,
193
- };
206
+ } as const satisfies StepSubagent;
194
207
 
195
- export const DEFAULT_SETTINGS: WorkflowSettings = {
208
+ export const DEFAULT_SETTINGS = {
196
209
  version: WORKFLOW_SCHEMA_VERSION,
197
210
  allowProjectWorkflows: false,
198
211
  statusShortcut: DEFAULT_STATUS_SHORTCUT,
199
- };
212
+ } as const satisfies WorkflowSettings;