@osolmaz/pi-workflows 0.1.0 → 0.3.0

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 (171) hide show
  1. package/README.md +107 -26
  2. package/dist/builtins/monitor.workflow.d.ts +71 -0
  3. package/dist/builtins/monitor.workflow.js +234 -0
  4. package/dist/builtins/monitor.workflow.js.map +1 -0
  5. package/dist/controllers/conditions.d.ts +6 -0
  6. package/dist/controllers/conditions.js +68 -0
  7. package/dist/controllers/conditions.js.map +1 -0
  8. package/dist/controllers/definition.d.ts +6 -0
  9. package/dist/controllers/definition.js +45 -0
  10. package/dist/controllers/definition.js.map +1 -0
  11. package/dist/controllers/effects.d.ts +14 -0
  12. package/dist/controllers/effects.js +104 -0
  13. package/dist/controllers/effects.js.map +1 -0
  14. package/dist/controllers/errors.d.ts +12 -0
  15. package/dist/controllers/errors.js +25 -0
  16. package/dist/controllers/errors.js.map +1 -0
  17. package/dist/controllers/index.d.ts +13 -0
  18. package/dist/controllers/index.js +13 -0
  19. package/dist/controllers/index.js.map +1 -0
  20. package/dist/controllers/json.d.ts +5 -0
  21. package/dist/controllers/json.js +57 -0
  22. package/dist/controllers/json.js.map +1 -0
  23. package/dist/controllers/loader.d.ts +23 -0
  24. package/dist/controllers/loader.js +74 -0
  25. package/dist/controllers/loader.js.map +1 -0
  26. package/dist/controllers/manager.d.ts +58 -0
  27. package/dist/controllers/manager.js +399 -0
  28. package/dist/controllers/manager.js.map +1 -0
  29. package/dist/controllers/results.d.ts +5 -0
  30. package/dist/controllers/results.js +32 -0
  31. package/dist/controllers/results.js.map +1 -0
  32. package/dist/controllers/sqlite.d.ts +212 -0
  33. package/dist/controllers/sqlite.js +1009 -0
  34. package/dist/controllers/sqlite.js.map +1 -0
  35. package/dist/controllers/store.d.ts +112 -0
  36. package/dist/controllers/store.js +32 -0
  37. package/dist/controllers/store.js.map +1 -0
  38. package/dist/controllers/types.d.ts +159 -0
  39. package/dist/controllers/types.js +2 -0
  40. package/dist/controllers/types.js.map +1 -0
  41. package/dist/controllers/workflow-engine-scheduler.d.ts +25 -0
  42. package/dist/controllers/workflow-engine-scheduler.js +93 -0
  43. package/dist/controllers/workflow-engine-scheduler.js.map +1 -0
  44. package/dist/controllers/workflows.d.ts +27 -0
  45. package/dist/controllers/workflows.js +109 -0
  46. package/dist/controllers/workflows.js.map +1 -0
  47. package/dist/extension/controller-host.d.ts +47 -0
  48. package/dist/extension/controller-host.js +110 -0
  49. package/dist/extension/controller-host.js.map +1 -0
  50. package/dist/extension/executor.d.ts +14 -1
  51. package/dist/extension/executor.js +12 -2
  52. package/dist/extension/executor.js.map +1 -1
  53. package/dist/extension/index.d.ts +7 -0
  54. package/dist/extension/index.js +1118 -89
  55. package/dist/extension/index.js.map +1 -1
  56. package/dist/extension/recorder.d.ts +91 -0
  57. package/dist/extension/recorder.js +537 -0
  58. package/dist/extension/recorder.js.map +1 -0
  59. package/dist/extension/session-events.d.ts +134 -0
  60. package/dist/extension/session-events.js +60 -0
  61. package/dist/extension/session-events.js.map +1 -0
  62. package/dist/extension/widget.js +25 -24
  63. package/dist/extension/widget.js.map +1 -1
  64. package/dist/extension/workflow-tool.d.ts +28 -0
  65. package/dist/extension/workflow-tool.js +33 -0
  66. package/dist/extension/workflow-tool.js.map +1 -0
  67. package/dist/host/processes.d.ts +24 -0
  68. package/dist/host/processes.js +114 -0
  69. package/dist/host/processes.js.map +1 -0
  70. package/dist/host/rpc-bridge.d.ts +9 -0
  71. package/dist/host/rpc-bridge.js +39 -0
  72. package/dist/host/rpc-bridge.js.map +1 -0
  73. package/dist/host/rpc-executor.d.ts +38 -0
  74. package/dist/host/rpc-executor.js +254 -0
  75. package/dist/host/rpc-executor.js.map +1 -0
  76. package/dist/host/runner.d.ts +49 -0
  77. package/dist/host/runner.js +350 -0
  78. package/dist/host/runner.js.map +1 -0
  79. package/dist/render/canvas.d.ts +1 -1
  80. package/dist/render/canvas.js +5 -0
  81. package/dist/render/canvas.js.map +1 -1
  82. package/dist/render/graph-render.d.ts +5 -0
  83. package/dist/render/graph-render.js +211 -48
  84. package/dist/render/graph-render.js.map +1 -1
  85. package/dist/viewer/cli.d.ts +7 -3
  86. package/dist/viewer/cli.js +150 -19
  87. package/dist/viewer/cli.js.map +1 -1
  88. package/dist/viewer/render.js +19 -3
  89. package/dist/viewer/render.js.map +1 -1
  90. package/dist/viewer/session-reducer.d.ts +45 -0
  91. package/dist/viewer/session-reducer.js +266 -0
  92. package/dist/viewer/session-reducer.js.map +1 -0
  93. package/dist/workflows/artifacts.d.ts +40 -0
  94. package/dist/workflows/artifacts.js +155 -0
  95. package/dist/workflows/artifacts.js.map +1 -0
  96. package/dist/workflows/engine.d.ts +38 -0
  97. package/dist/workflows/engine.js +281 -20
  98. package/dist/workflows/engine.js.map +1 -1
  99. package/dist/workflows/errors.d.ts +23 -0
  100. package/dist/workflows/errors.js +38 -0
  101. package/dist/workflows/errors.js.map +1 -1
  102. package/dist/workflows/graph.js +0 -5
  103. package/dist/workflows/graph.js.map +1 -1
  104. package/dist/workflows/index.d.ts +3 -2
  105. package/dist/workflows/index.js +2 -1
  106. package/dist/workflows/index.js.map +1 -1
  107. package/dist/workflows/loader.d.ts +5 -3
  108. package/dist/workflows/loader.js +10 -1
  109. package/dist/workflows/loader.js.map +1 -1
  110. package/dist/workflows/schema.js +1 -1
  111. package/dist/workflows/schema.js.map +1 -1
  112. package/dist/workflows/store.d.ts +98 -10
  113. package/dist/workflows/store.js +921 -46
  114. package/dist/workflows/store.js.map +1 -1
  115. package/dist/workflows/types.d.ts +136 -3
  116. package/docs/CONTROLLERS.md +215 -0
  117. package/docs/development.md +51 -24
  118. package/docs/live-replay-protocol.md +155 -0
  119. package/docs/plans/2026-08-04-controller-runtime-plan.md +169 -0
  120. package/docs/plans/2026-08-05-always-on-workflows-plan.md +125 -0
  121. package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +184 -0
  122. package/docs/plans/piw-viewer-experience-implementation-plan.md +674 -0
  123. package/docs/plans/replayable-run-bundles-implementation-plan.md +65 -0
  124. package/docs/plans/session-event-replay-implementation-plan.md +494 -0
  125. package/docs/plans/tui-viewer-implementation-plan.md +64 -0
  126. package/docs/run-bundles.md +359 -55
  127. package/docs/session-event-journal.md +470 -0
  128. package/docs/tui-viewer.md +218 -0
  129. package/docs/workflows.md +131 -11
  130. package/examples/controllers/pull-request.controller.ts +215 -0
  131. package/package.json +11 -2
  132. package/src/builtins/monitor.workflow.ts +278 -0
  133. package/src/controllers/conditions.ts +110 -0
  134. package/src/controllers/definition.ts +65 -0
  135. package/src/controllers/effects.ts +123 -0
  136. package/src/controllers/errors.ts +27 -0
  137. package/src/controllers/index.ts +90 -0
  138. package/src/controllers/json.ts +62 -0
  139. package/src/controllers/loader.ts +104 -0
  140. package/src/controllers/manager.ts +533 -0
  141. package/src/controllers/results.ts +46 -0
  142. package/src/controllers/sqlite.ts +1427 -0
  143. package/src/controllers/store.ts +160 -0
  144. package/src/controllers/types.ts +183 -0
  145. package/src/controllers/workflow-engine-scheduler.ts +145 -0
  146. package/src/controllers/workflows.ts +152 -0
  147. package/src/extension/controller-host.ts +163 -0
  148. package/src/extension/executor.ts +29 -2
  149. package/src/extension/index.ts +1315 -109
  150. package/src/extension/recorder.ts +662 -0
  151. package/src/extension/session-events.ts +119 -0
  152. package/src/extension/widget.ts +26 -24
  153. package/src/extension/workflow-tool.ts +59 -0
  154. package/src/host/processes.ts +119 -0
  155. package/src/host/rpc-bridge.ts +44 -0
  156. package/src/host/rpc-executor.ts +299 -0
  157. package/src/host/runner.ts +406 -0
  158. package/src/render/canvas.ts +19 -1
  159. package/src/render/graph-render.ts +277 -44
  160. package/src/viewer/cli.ts +167 -21
  161. package/src/viewer/render.ts +21 -3
  162. package/src/viewer/session-reducer.ts +347 -0
  163. package/src/workflows/artifacts.ts +188 -0
  164. package/src/workflows/engine.ts +365 -19
  165. package/src/workflows/errors.ts +45 -0
  166. package/src/workflows/graph.ts +0 -5
  167. package/src/workflows/index.ts +15 -0
  168. package/src/workflows/loader.ts +13 -3
  169. package/src/workflows/schema.ts +1 -1
  170. package/src/workflows/store.ts +1157 -48
  171. package/src/workflows/types.ts +151 -3
@@ -0,0 +1,134 @@
1
+ export type PublicAssistantMessageEvent = {
2
+ type: "start";
3
+ partial: unknown;
4
+ } | {
5
+ type: "text_start";
6
+ contentIndex: number;
7
+ partial: unknown;
8
+ } | {
9
+ type: "text_delta";
10
+ contentIndex: number;
11
+ delta: string;
12
+ partial: unknown;
13
+ } | {
14
+ type: "text_end";
15
+ contentIndex: number;
16
+ content: string;
17
+ partial: unknown;
18
+ } | {
19
+ type: "thinking_start";
20
+ contentIndex: number;
21
+ partial: unknown;
22
+ } | {
23
+ type: "thinking_delta";
24
+ contentIndex: number;
25
+ delta: string;
26
+ partial: unknown;
27
+ } | {
28
+ type: "thinking_end";
29
+ contentIndex: number;
30
+ content: string;
31
+ partial: unknown;
32
+ } | {
33
+ type: "toolcall_start";
34
+ contentIndex: number;
35
+ partial: unknown;
36
+ } | {
37
+ type: "toolcall_delta";
38
+ contentIndex: number;
39
+ delta: string;
40
+ partial: unknown;
41
+ } | {
42
+ type: "toolcall_end";
43
+ contentIndex: number;
44
+ toolCall: unknown;
45
+ partial: unknown;
46
+ } | {
47
+ type: "done";
48
+ reason: "stop" | "length" | "toolUse";
49
+ message: unknown;
50
+ } | {
51
+ type: "error";
52
+ reason: "aborted" | "error";
53
+ error: unknown;
54
+ };
55
+ export type TurnStartEventLike = {
56
+ turnIndex: number;
57
+ };
58
+ export type TurnEndEventLike = {
59
+ turnIndex: number;
60
+ message: unknown;
61
+ };
62
+ export type MessageStartEventLike = {
63
+ message: unknown;
64
+ };
65
+ export type MessageUpdateEventLike = {
66
+ message: unknown;
67
+ assistantMessageEvent: PublicAssistantMessageEvent;
68
+ };
69
+ export type MessageEndEventLike = {
70
+ message: unknown;
71
+ };
72
+ export type ToolExecutionStartEventLike = {
73
+ toolCallId: string;
74
+ toolName: string;
75
+ args: unknown;
76
+ };
77
+ export type ToolExecutionUpdateEventLike = {
78
+ toolCallId: string;
79
+ };
80
+ export type ToolExecutionEndEventLike = {
81
+ toolCallId: string;
82
+ toolName: string;
83
+ result: unknown;
84
+ isError: boolean;
85
+ };
86
+ export type NormalizedAssistantEvent = {
87
+ type: "start";
88
+ } | {
89
+ type: "text_start";
90
+ contentIndex: number;
91
+ } | {
92
+ type: "text_delta";
93
+ contentIndex: number;
94
+ delta: string;
95
+ } | {
96
+ type: "text_end";
97
+ contentIndex: number;
98
+ content: string;
99
+ } | {
100
+ type: "thinking_start";
101
+ contentIndex: number;
102
+ } | {
103
+ type: "thinking_delta";
104
+ contentIndex: number;
105
+ delta: string;
106
+ } | {
107
+ type: "thinking_end";
108
+ contentIndex: number;
109
+ content: string;
110
+ } | {
111
+ type: "toolcall_start";
112
+ contentIndex: number;
113
+ } | {
114
+ type: "toolcall_delta";
115
+ contentIndex: number;
116
+ delta: string;
117
+ } | {
118
+ type: "toolcall_end";
119
+ contentIndex: number;
120
+ toolCall: unknown;
121
+ } | {
122
+ type: "done";
123
+ reason: "stop" | "length" | "toolUse";
124
+ } | {
125
+ type: "error";
126
+ reason: "aborted" | "error";
127
+ };
128
+ /** Remove cumulative snapshots while preserving every semantic stream event. */
129
+ export declare function normalizeAssistantEvent(event: PublicAssistantMessageEvent): NormalizedAssistantEvent;
130
+ export declare function messageRole(message: unknown): string;
131
+ export declare function toolCallIdFromAssistantEvent(event: NormalizedAssistantEvent): string | null;
132
+ export declare function toolStartedPayload(event: ToolExecutionStartEventLike): Record<string, unknown>;
133
+ export declare function toolFinishedPayload(event: ToolExecutionEndEventLike): Record<string, unknown>;
134
+ export declare function turnFinishedPayload(event: TurnEndEventLike, messageId: string | undefined, toolCallIds: string[]): Record<string, unknown>;
@@ -0,0 +1,60 @@
1
+ /** Remove cumulative snapshots while preserving every semantic stream event. */
2
+ export function normalizeAssistantEvent(event) {
3
+ switch (event.type) {
4
+ case "start":
5
+ return { type: event.type };
6
+ case "text_start":
7
+ case "thinking_start":
8
+ case "toolcall_start":
9
+ return { type: event.type, contentIndex: event.contentIndex };
10
+ case "text_delta":
11
+ case "thinking_delta":
12
+ case "toolcall_delta":
13
+ return { type: event.type, contentIndex: event.contentIndex, delta: event.delta };
14
+ case "text_end":
15
+ case "thinking_end":
16
+ return { type: event.type, contentIndex: event.contentIndex, content: event.content };
17
+ case "toolcall_end":
18
+ return {
19
+ type: event.type,
20
+ contentIndex: event.contentIndex,
21
+ toolCall: event.toolCall,
22
+ };
23
+ case "done":
24
+ return { type: event.type, reason: event.reason };
25
+ case "error":
26
+ return { type: event.type, reason: event.reason };
27
+ default: {
28
+ const exhaustive = event;
29
+ return exhaustive;
30
+ }
31
+ }
32
+ }
33
+ export function messageRole(message) {
34
+ if (typeof message !== "object" || message === null || !("role" in message)) {
35
+ return "unknown";
36
+ }
37
+ const role = message.role;
38
+ return typeof role === "string" && role.length > 0 ? role : "unknown";
39
+ }
40
+ export function toolCallIdFromAssistantEvent(event) {
41
+ if (event.type !== "toolcall_end" || typeof event.toolCall !== "object" || !event.toolCall) {
42
+ return null;
43
+ }
44
+ const id = event.toolCall.id;
45
+ return typeof id === "string" && id.length > 0 ? id : null;
46
+ }
47
+ export function toolStartedPayload(event) {
48
+ return { toolName: event.toolName, args: event.args };
49
+ }
50
+ export function toolFinishedPayload(event) {
51
+ return { toolName: event.toolName, isError: event.isError, result: event.result };
52
+ }
53
+ export function turnFinishedPayload(event, messageId, toolCallIds) {
54
+ return {
55
+ turnIndex: event.turnIndex,
56
+ ...(messageId === undefined ? {} : { messageId }),
57
+ toolCallIds,
58
+ };
59
+ }
60
+ //# sourceMappingURL=session-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-events.js","sourceRoot":"","sources":["../../src/extension/session-events.ts"],"names":[],"mappings":"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"}
@@ -81,16 +81,23 @@ export function buildWidgetLines(state, snapshot, now = new Date()) {
81
81
  /** The graph row the window should center on: the active or waiting node. */
82
82
  function focusLine(graph, state) {
83
83
  const active = graph.findIndex((line) => stripAnsi(line).includes("◐"));
84
- if (active !== -1) {
85
- return active;
84
+ const focus = active !== -1
85
+ ? active
86
+ : state.waitingOn
87
+ ? graph.findIndex((line) => stripAnsi(line).includes(state.waitingOn))
88
+ : -1;
89
+ if (focus === -1) {
90
+ return graph.length - 1;
86
91
  }
87
- if (state.waitingOn) {
88
- const waiting = graph.findIndex((line) => stripAnsi(line).includes(state.waitingOn));
89
- if (waiting !== -1) {
90
- return waiting;
91
- }
92
+ let top = focus;
93
+ while (top > 0 && !/[┌┏]/u.test(stripAnsi(graph[top] ?? ""))) {
94
+ top -= 1;
92
95
  }
93
- return graph.length - 1;
96
+ let bottom = focus;
97
+ while (bottom + 1 < graph.length && !/[└┗]/u.test(stripAnsi(graph[bottom] ?? ""))) {
98
+ bottom += 1;
99
+ }
100
+ return Math.floor((top + bottom) / 2);
94
101
  }
95
102
  /**
96
103
  * Slice `lines` to at most `budget` rows, marking hidden rows at either end.
@@ -101,24 +108,18 @@ function windowLines(lines, budget, anchor, anchorIsStart) {
101
108
  if (lines.length <= budget) {
102
109
  return { lines, scroll: 0, maxScroll: 0 };
103
110
  }
104
- // First pass decides which markers exist; the second re-fits within the
105
- // remaining space. A marker flag can only turn on (never off) in the
106
- // second pass, so the result stays within budget.
107
- let inner = budget;
108
- for (let pass = 0; pass < 2; pass += 1) {
109
- const start = clampStart(anchor, inner, lines.length, anchorIsStart);
110
- inner = budget - (start > 0 ? 1 : 0) - (start + inner < lines.length ? 1 : 0);
111
- }
111
+ // Reserve one combined overflow row, leaving seven rows for a complete
112
+ // full card even when the widget also has an error footer.
113
+ const inner = Math.max(1, budget - 1);
112
114
  const start = clampStart(anchor, inner, lines.length, anchorIsStart);
113
115
  const end = start + inner;
114
- const out = [];
115
- if (start > 0) {
116
- out.push(ansi.dim(`↑ ${start} more`));
117
- }
118
- out.push(...lines.slice(start, end));
119
- if (end < lines.length) {
120
- out.push(ansi.dim(`↓ ${lines.length - end} more · shift+↑/↓ scroll`));
121
- }
116
+ const above = start;
117
+ const below = Math.max(0, lines.length - end);
118
+ const out = lines.slice(start, end);
119
+ const directions = [above > 0 ? `↑ ${above}` : "", below > 0 ? `↓ ${below}` : ""]
120
+ .filter(Boolean)
121
+ .join(" · ");
122
+ out.push(ansi.dim(`${directions} more · shift+↑/↓ scroll`));
122
123
  return { lines: out, scroll: start, maxScroll: Math.max(0, lines.length - inner) };
123
124
  }
124
125
  function clampStart(anchor, inner, total, anchorIsStart) {
@@ -1 +1 @@
1
- {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/extension/widget.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"widget.js","sourceRoot":"","sources":["../../src/extension/widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type TSchema } from "typebox";
2
+ export declare const WorkflowToolParameters: TSchema;
3
+ export type WorkflowToolInput = {
4
+ action: "list";
5
+ offset?: number;
6
+ } | {
7
+ action: "start";
8
+ workflow: string;
9
+ input?: unknown;
10
+ } | {
11
+ action: "status";
12
+ runId?: string;
13
+ } | {
14
+ action: "pause";
15
+ } | {
16
+ action: "resume";
17
+ } | {
18
+ action: "cancel";
19
+ } | {
20
+ action: "answer";
21
+ input: unknown;
22
+ runId?: string;
23
+ } | {
24
+ action: "submit";
25
+ step: string;
26
+ attempt: string;
27
+ output: unknown;
28
+ };
@@ -0,0 +1,33 @@
1
+ import { StringEnum } from "@earendil-works/pi-ai";
2
+ import { Type } from "typebox";
3
+ const noExtraProperties = { additionalProperties: false };
4
+ export const WorkflowToolParameters = Type.Union([
5
+ Type.Object({
6
+ action: StringEnum(["list"]),
7
+ offset: Type.Optional(Type.Integer({ minimum: 0, description: "Workflow list offset" })),
8
+ }, noExtraProperties),
9
+ Type.Object({
10
+ action: StringEnum(["start"]),
11
+ workflow: Type.String({ description: "Discovered workflow name or workflow file path" }),
12
+ input: Type.Optional(Type.Unknown({ description: "Structured workflow input" })),
13
+ }, noExtraProperties),
14
+ Type.Object({
15
+ action: StringEnum(["status"]),
16
+ runId: Type.Optional(Type.String({ description: "Run id; omit for the active run" })),
17
+ }, noExtraProperties),
18
+ Type.Object({ action: StringEnum(["pause"]) }, noExtraProperties),
19
+ Type.Object({ action: StringEnum(["resume"]) }, noExtraProperties),
20
+ Type.Object({ action: StringEnum(["cancel"]) }, noExtraProperties),
21
+ Type.Object({
22
+ action: StringEnum(["answer"]),
23
+ input: Type.Unknown({ description: "Checkpoint answer" }),
24
+ runId: Type.Optional(Type.String({ description: "Waiting run id" })),
25
+ }, noExtraProperties),
26
+ Type.Object({
27
+ action: StringEnum(["submit"]),
28
+ step: Type.String({ description: "Step id from the workflow step contract" }),
29
+ attempt: Type.String({ description: "Attempt id from the workflow step contract" }),
30
+ output: Type.Unknown({ description: "Step output matching the expected shape" }),
31
+ }, noExtraProperties),
32
+ ]);
33
+ //# sourceMappingURL=workflow-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-tool.js","sourceRoot":"","sources":["../../src/extension/workflow-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAgB,MAAM,SAAS,CAAC;AAE7C,MAAM,iBAAiB,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAW,CAAC;AAEnE,MAAM,CAAC,MAAM,sBAAsB,GAAY,IAAI,CAAC,KAAK,CAAC;IACxD,IAAI,CAAC,MAAM,CACT;QACE,MAAM,EAAE,UAAU,CAAC,CAAC,MAAM,CAAU,CAAC;QACrC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC,CAAC;KACzF,EACD,iBAAiB,CAClB;IACD,IAAI,CAAC,MAAM,CACT;QACE,MAAM,EAAE,UAAU,CAAC,CAAC,OAAO,CAAU,CAAC;QACtC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;QACxF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC,CAAC;KACjF,EACD,iBAAiB,CAClB;IACD,IAAI,CAAC,MAAM,CACT;QACE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAU,CAAC;QACvC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC,CAAC;KACtF,EACD,iBAAiB,CAClB;IACD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,OAAO,CAAU,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAU,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAU,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC3E,IAAI,CAAC,MAAM,CACT;QACE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAU,CAAC;QACvC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;QACzD,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;KACrE,EACD,iBAAiB,CAClB;IACD,IAAI,CAAC,MAAM,CACT;QACE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAU,CAAC;QACvC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;QAC7E,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;QACnF,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;KACjF,EACD,iBAAiB,CAClB;CACF,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Tracks headless child processes (spawned `pi --mode rpc` sessions) so a
3
+ * killed host never leaves orphans working. Children spawn in their own
4
+ * process group; the registry file lets a later host reap leftovers by
5
+ * killing the whole group. The file lives next to the project store and is
6
+ * only ever touched by one host at a time (the advisory lock ensures it).
7
+ */
8
+ export declare class HostProcessRegistry {
9
+ private readonly filePath;
10
+ private readonly pids;
11
+ constructor(storeDir: string);
12
+ register(pid: number): void;
13
+ unregister(pid: number): void;
14
+ get size(): number;
15
+ /** Kill every registered child's process group, escalating to SIGKILL. */
16
+ killAll(): void;
17
+ /**
18
+ * Reap children recorded by a previous host that died without cleanup.
19
+ * Called once at host start, before the lock is taken.
20
+ */
21
+ reapOrphans(): number[];
22
+ private readFile;
23
+ private persist;
24
+ }
@@ -0,0 +1,114 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ /**
4
+ * Tracks headless child processes (spawned `pi --mode rpc` sessions) so a
5
+ * killed host never leaves orphans working. Children spawn in their own
6
+ * process group; the registry file lets a later host reap leftovers by
7
+ * killing the whole group. The file lives next to the project store and is
8
+ * only ever touched by one host at a time (the advisory lock ensures it).
9
+ */
10
+ export class HostProcessRegistry {
11
+ filePath;
12
+ pids = new Set();
13
+ constructor(storeDir) {
14
+ this.filePath = path.join(storeDir, "host.children.json");
15
+ }
16
+ register(pid) {
17
+ this.pids.add(pid);
18
+ this.persist();
19
+ }
20
+ unregister(pid) {
21
+ this.pids.delete(pid);
22
+ this.persist();
23
+ }
24
+ get size() {
25
+ return this.pids.size;
26
+ }
27
+ /** Kill every registered child's process group, escalating to SIGKILL. */
28
+ killAll() {
29
+ for (const pid of this.pids) {
30
+ killProcessGroup(pid, "SIGTERM");
31
+ }
32
+ for (const pid of this.pids) {
33
+ killProcessGroup(pid, "SIGKILL");
34
+ }
35
+ this.pids.clear();
36
+ this.persist();
37
+ }
38
+ /**
39
+ * Reap children recorded by a previous host that died without cleanup.
40
+ * Called once at host start, before the lock is taken.
41
+ */
42
+ reapOrphans() {
43
+ const recorded = this.readFile();
44
+ const reaped = [];
45
+ const stillAlive = [];
46
+ for (const pid of recorded) {
47
+ if (isAlive(pid)) {
48
+ killProcessGroup(pid, "SIGKILL");
49
+ reaped.push(pid);
50
+ if (isAlive(pid)) {
51
+ // A group kill that left the leader alive stays registered so a
52
+ // later start tries again instead of forgetting it.
53
+ stillAlive.push(pid);
54
+ }
55
+ }
56
+ }
57
+ this.pids.clear();
58
+ for (const pid of stillAlive) {
59
+ this.pids.add(pid);
60
+ }
61
+ this.persist();
62
+ return reaped;
63
+ }
64
+ readFile() {
65
+ try {
66
+ const parsed = JSON.parse(fs.readFileSync(this.filePath, "utf8"));
67
+ if (!Array.isArray(parsed)) {
68
+ return [];
69
+ }
70
+ return parsed.filter((pid) => Number.isSafeInteger(pid) && pid > 0);
71
+ }
72
+ catch {
73
+ return [];
74
+ }
75
+ }
76
+ persist() {
77
+ try {
78
+ fs.mkdirSync(path.dirname(this.filePath), { recursive: true, mode: 0o700 });
79
+ // Write exactly the live set. Unioning with the previous file would
80
+ // resurrect exited pids, and a later host reaping them could kill an
81
+ // unrelated process group that reused one.
82
+ fs.writeFileSync(this.filePath, `${JSON.stringify([...this.pids])}\n`, {
83
+ encoding: "utf8",
84
+ mode: 0o600,
85
+ });
86
+ }
87
+ catch {
88
+ // Registry bookkeeping is best-effort; orphan reaping is the backstop.
89
+ }
90
+ }
91
+ }
92
+ function isAlive(pid) {
93
+ try {
94
+ process.kill(pid, 0);
95
+ return true;
96
+ }
97
+ catch {
98
+ return false;
99
+ }
100
+ }
101
+ function killProcessGroup(pid, signal) {
102
+ try {
103
+ process.kill(-pid, signal);
104
+ }
105
+ catch {
106
+ try {
107
+ process.kill(pid, signal);
108
+ }
109
+ catch {
110
+ // Already gone.
111
+ }
112
+ }
113
+ }
114
+ //# sourceMappingURL=processes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processes.js","sourceRoot":"","sources":["../../src/host/processes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export declare const RPC_SUBMISSION_PREFIX = "PI_WORKFLOWS_STEP_SUBMISSION ";
3
+ /**
4
+ * Loaded into headless `pi --mode rpc` children spawned by the standalone
5
+ * host. The child has no workflow engine, so this bridge only registers the
6
+ * `workflow` tool and reports every submission to the host over stderr; the
7
+ * host validates against the engine and re-prompts on rejection.
8
+ */
9
+ export default function piWorkflowsRpcBridge(pi: ExtensionAPI): void;
@@ -0,0 +1,39 @@
1
+ import { StringEnum } from "@earendil-works/pi-ai";
2
+ import { Type } from "typebox";
3
+ export const RPC_SUBMISSION_PREFIX = "PI_WORKFLOWS_STEP_SUBMISSION ";
4
+ /**
5
+ * Loaded into headless `pi --mode rpc` children spawned by the standalone
6
+ * host. The child has no workflow engine, so this bridge only registers the
7
+ * `workflow` tool and reports every submission to the host over stderr; the
8
+ * host validates against the engine and re-prompts on rejection.
9
+ */
10
+ export default function piWorkflowsRpcBridge(pi) {
11
+ pi.registerTool({
12
+ name: "workflow",
13
+ label: "Workflow",
14
+ description: [
15
+ "Submit the output for the pending workflow step with action submit.",
16
+ "Only call this tool when a workflow step contract in the conversation asks you to.",
17
+ "Pass the exact step id from the contract and your result as the output.",
18
+ ].join(" "),
19
+ parameters: Type.Object({
20
+ action: StringEnum(["submit"]),
21
+ step: Type.String({ description: "Step id from the workflow step contract" }),
22
+ attempt: Type.String({ description: "Attempt id from the workflow step contract" }),
23
+ output: Type.Unknown({ description: "Step output matching the expected shape" }),
24
+ }, { additionalProperties: false }),
25
+ async execute(_toolCallId, params) {
26
+ process.stderr.write(`${RPC_SUBMISSION_PREFIX}${JSON.stringify(params)}\n`);
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: "Submission recorded. Continue only when the workflow sends the next step.",
32
+ },
33
+ ],
34
+ details: {},
35
+ };
36
+ },
37
+ });
38
+ }
39
+ //# sourceMappingURL=rpc-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-bridge.js","sourceRoot":"","sources":["../../src/host/rpc-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,MAAM,CAAC,MAAM,qBAAqB,GAAG,+BAA+B,CAAC;AAErE;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,EAAgB;IAC3D,EAAE,CAAC,YAAY,CAAC;QACd,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE;YACX,qEAAqE;YACrE,oFAAoF;YACpF,yEAAyE;SAC1E,CAAC,IAAI,CAAC,GAAG,CAAC;QACX,UAAU,EAAE,IAAI,CAAC,MAAM,CACrB;YACE,MAAM,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAU,CAAC;YACvC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;YAC7E,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;YACnF,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;SACjF,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAChC;QACD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,2EAA2E;qBAClF;iBACF;gBACD,OAAO,EAAE,EAAE;aACZ,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { AgentStepExecutor, AgentStepRequest, AgentStepSubmission } from "../workflows/types.js";
2
+ import type { HostProcessRegistry } from "./processes.js";
3
+ export type RpcStepExecutorOptions = {
4
+ cwd: string;
5
+ registry: HostProcessRegistry;
6
+ /** Absolute path to the pi binary; defaults to the installed `pi`. */
7
+ piBin?: string;
8
+ /** Extra environment for the child; the host's environment is inherited. */
9
+ env?: Record<string, string>;
10
+ /** Extra pi arguments, for example a model override. */
11
+ piArgs?: string[];
12
+ };
13
+ /**
14
+ * Runs agent steps in a headless `pi --mode rpc` child. One child serves one
15
+ * workflow run. The rpc-bridge extension inside the child registers the
16
+ * `workflow` tool and reports submissions over stderr; this executor
17
+ * validates them through `request.accept` and re-prompts on rejection, so
18
+ * the model sees the same tool contract as an in-session run.
19
+ */
20
+ export declare class RpcStepExecutor implements AgentStepExecutor {
21
+ private readonly options;
22
+ private child;
23
+ private childExited;
24
+ private stderrBuffer;
25
+ private submissions;
26
+ private submissionWaiters;
27
+ private stdoutBuffer;
28
+ constructor(options: RpcStepExecutorOptions);
29
+ runAgentStep(request: AgentStepRequest, signal: AbortSignal): Promise<AgentStepSubmission>;
30
+ /** Stop the child's whole process group, then unregister it. */
31
+ close(): Promise<void>;
32
+ private currentExit;
33
+ private ensureStarted;
34
+ private promptForSubmission;
35
+ private takeMatchingSubmission;
36
+ private sendAbortQuietly;
37
+ private wakeSubmissionWaiters;
38
+ }