@osolmaz/pi-workflows 0.15.3 → 0.16.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 (207) hide show
  1. package/README.md +24 -8
  2. package/dist/channels/adapter-entry.d.ts +3 -0
  3. package/dist/channels/adapter-entry.js +203 -0
  4. package/dist/channels/adapter-entry.js.map +1 -0
  5. package/dist/channels/config.d.ts +43 -0
  6. package/dist/channels/config.js +234 -0
  7. package/dist/channels/config.js.map +1 -0
  8. package/dist/channels/protocol.d.ts +94 -0
  9. package/dist/channels/protocol.js +219 -0
  10. package/dist/channels/protocol.js.map +1 -0
  11. package/dist/channels/telegram.d.ts +46 -0
  12. package/dist/channels/telegram.js +285 -0
  13. package/dist/channels/telegram.js.map +1 -0
  14. package/dist/client/activity.d.ts +2 -0
  15. package/dist/client/activity.js +6 -0
  16. package/dist/client/activity.js.map +1 -0
  17. package/dist/client/client.d.ts +102 -0
  18. package/dist/client/client.js +737 -0
  19. package/dist/client/client.js.map +1 -0
  20. package/dist/client/index.d.ts +3 -0
  21. package/dist/client/index.js +3 -0
  22. package/dist/client/index.js.map +1 -0
  23. package/dist/client/materialize.d.ts +7 -0
  24. package/dist/client/materialize.js +177 -0
  25. package/dist/client/materialize.js.map +1 -0
  26. package/dist/client/protocol.d.ts +60 -0
  27. package/dist/client/protocol.js +275 -0
  28. package/dist/client/protocol.js.map +1 -0
  29. package/dist/client/resolver.d.ts +23 -0
  30. package/dist/client/resolver.js +2 -0
  31. package/dist/client/resolver.js.map +1 -0
  32. package/dist/client/view.d.ts +144 -0
  33. package/dist/client/view.js +3 -0
  34. package/dist/client/view.js.map +1 -0
  35. package/dist/controllers/index.d.ts +1 -1
  36. package/dist/controllers/index.js.map +1 -1
  37. package/dist/controllers/sqlite.d.ts +47 -157
  38. package/dist/controllers/sqlite.js +230 -406
  39. package/dist/controllers/sqlite.js.map +1 -1
  40. package/dist/extension/index.d.ts +23 -1
  41. package/dist/extension/index.js +734 -555
  42. package/dist/extension/index.js.map +1 -1
  43. package/dist/extension/recorder.d.ts +95 -0
  44. package/dist/extension/recorder.js +530 -0
  45. package/dist/extension/recorder.js.map +1 -0
  46. package/dist/extension/remote-recorder-store.d.ts +25 -0
  47. package/dist/extension/remote-recorder-store.js +81 -0
  48. package/dist/extension/remote-recorder-store.js.map +1 -0
  49. package/dist/extension/session-events.d.ts +134 -0
  50. package/dist/extension/session-events.js +60 -0
  51. package/dist/extension/session-events.js.map +1 -0
  52. package/dist/extension/session-view.d.ts +9 -2
  53. package/dist/extension/session-view.js +117 -51
  54. package/dist/extension/session-view.js.map +1 -1
  55. package/dist/extension/step-message.d.ts +6 -4
  56. package/dist/extension/step-message.js +12 -6
  57. package/dist/extension/step-message.js.map +1 -1
  58. package/dist/extension/widget.d.ts +3 -2
  59. package/dist/extension/widget.js +41 -24
  60. package/dist/extension/widget.js.map +1 -1
  61. package/dist/extension/workflow-message-coordinator.d.ts +27 -0
  62. package/dist/extension/workflow-message-coordinator.js +294 -0
  63. package/dist/extension/workflow-message-coordinator.js.map +1 -0
  64. package/dist/host/channel-effects.d.ts +72 -0
  65. package/dist/host/channel-effects.js +271 -0
  66. package/dist/host/channel-effects.js.map +1 -0
  67. package/dist/host/channel-supervisor.d.ts +21 -0
  68. package/dist/host/channel-supervisor.js +54 -0
  69. package/dist/host/channel-supervisor.js.map +1 -0
  70. package/dist/host/child-worker-supervisor.js +1 -1
  71. package/dist/host/child-worker-supervisor.js.map +1 -1
  72. package/dist/host/resolver-entry.d.ts +2 -23
  73. package/dist/host/resolver-entry.js +1 -1
  74. package/dist/host/resolver-entry.js.map +1 -1
  75. package/dist/host/runner.d.ts +54 -8
  76. package/dist/host/runner.js +1997 -305
  77. package/dist/host/runner.js.map +1 -1
  78. package/dist/host/state.d.ts +25 -19
  79. package/dist/host/state.js +303 -89
  80. package/dist/host/state.js.map +1 -1
  81. package/dist/host/view.d.ts +83 -0
  82. package/dist/host/view.js +975 -0
  83. package/dist/host/view.js.map +1 -0
  84. package/dist/host/worker-protocol.js +1 -1
  85. package/dist/host/worker-protocol.js.map +1 -1
  86. package/dist/state/database.d.ts +1 -0
  87. package/dist/state/database.js +15 -0
  88. package/dist/state/database.js.map +1 -1
  89. package/dist/state/prune.d.ts +3 -1
  90. package/dist/state/prune.js +9 -33
  91. package/dist/state/prune.js.map +1 -1
  92. package/dist/state/schema.js +88 -98
  93. package/dist/state/schema.js.map +1 -1
  94. package/dist/state/workflow-messages.d.ts +96 -0
  95. package/dist/state/workflow-messages.js +335 -0
  96. package/dist/state/workflow-messages.js.map +1 -0
  97. package/dist/viewer/backup.d.ts +2 -0
  98. package/dist/viewer/backup.js +28 -0
  99. package/dist/viewer/backup.js.map +1 -0
  100. package/dist/viewer/cli.d.ts +4 -0
  101. package/dist/viewer/cli.js +150 -170
  102. package/dist/viewer/cli.js.map +1 -1
  103. package/dist/viewer/render.js +1 -1
  104. package/dist/viewer/render.js.map +1 -1
  105. package/dist/viewer/tui.d.ts +5 -7
  106. package/dist/viewer/tui.js +245 -108
  107. package/dist/viewer/tui.js.map +1 -1
  108. package/dist/workflows/human-decision.d.ts +2 -0
  109. package/dist/workflows/human-decision.js +8 -2
  110. package/dist/workflows/human-decision.js.map +1 -1
  111. package/dist/workflows/index.d.ts +1 -1
  112. package/dist/workflows/index.js.map +1 -1
  113. package/dist/workflows/settings.d.ts +1 -8
  114. package/dist/workflows/settings.js.map +1 -1
  115. package/dist/workflows/store.d.ts +67 -20
  116. package/dist/workflows/store.js +451 -378
  117. package/dist/workflows/store.js.map +1 -1
  118. package/dist/workflows/tool-input.d.ts +21 -0
  119. package/dist/workflows/tool-input.js +23 -1
  120. package/dist/workflows/tool-input.js.map +1 -1
  121. package/dist/workflows/types.d.ts +5 -5
  122. package/dist/workflows/workflow-message-content.d.ts +38 -0
  123. package/dist/workflows/workflow-message-content.js +157 -0
  124. package/dist/workflows/workflow-message-content.js.map +1 -0
  125. package/docs/2026-08-18-herdr-piw-plan.md +2 -1
  126. package/docs/2026-08-20-durable-workflow-launch-plan.md +1 -1
  127. package/docs/2026-08-25-workflow-follow-ups.md +26 -50
  128. package/docs/2026-08-30-out-of-process-workflow-host-plan.md +3 -3
  129. package/docs/2026-09-01-restore-session-delivery-controls-plan.md +4 -0
  130. package/docs/2026-09-01-unified-workflow-client-plan.md +385 -0
  131. package/docs/2026-09-02-installed-live-e2e-plan.md +239 -0
  132. package/docs/2026-09-02-unify-workflow-messages-plan.md +562 -0
  133. package/docs/DEFERRED_TURNS.md +66 -294
  134. package/docs/HUMAN_DECISIONS.md +29 -30
  135. package/docs/HUMAN_DECISION_PRESENTATIONS.md +4 -11
  136. package/docs/SQLITE_STATE.md +31 -25
  137. package/docs/WORKFLOW_HOST.md +155 -77
  138. package/docs/WORKFLOW_STEP_MESSAGES.md +166 -75
  139. package/docs/development.md +2 -1
  140. package/docs/live-replay-protocol.md +74 -132
  141. package/docs/tui-viewer.md +12 -14
  142. package/docs/workflows.md +78 -28
  143. package/herdr-plugin.toml +1 -1
  144. package/package.json +9 -3
  145. package/plugins/herdr/viewer.mjs +14 -5
  146. package/protocol/client.v1.schema.json +137 -0
  147. package/protocol/fixtures/client-v1.json +23 -0
  148. package/src/channels/adapter-entry.ts +220 -0
  149. package/src/channels/config.ts +296 -0
  150. package/src/channels/protocol.ts +333 -0
  151. package/src/channels/telegram.ts +335 -0
  152. package/src/client/activity.ts +6 -0
  153. package/src/client/client.ts +939 -0
  154. package/src/client/index.ts +25 -0
  155. package/src/client/materialize.ts +228 -0
  156. package/src/client/protocol.ts +333 -0
  157. package/src/client/resolver.ts +26 -0
  158. package/src/client/view.ts +163 -0
  159. package/src/controllers/index.ts +0 -1
  160. package/src/controllers/sqlite.ts +339 -808
  161. package/src/extension/index.ts +853 -665
  162. package/src/extension/recorder.ts +687 -0
  163. package/src/extension/remote-recorder-store.ts +126 -0
  164. package/src/extension/session-events.ts +119 -0
  165. package/src/extension/session-view.ts +157 -51
  166. package/src/extension/step-message.ts +19 -9
  167. package/src/extension/widget.ts +53 -25
  168. package/src/extension/workflow-message-coordinator.ts +334 -0
  169. package/src/host/channel-effects.ts +465 -0
  170. package/src/host/channel-supervisor.ts +73 -0
  171. package/src/host/child-worker-supervisor.ts +1 -1
  172. package/src/host/resolver-entry.ts +11 -26
  173. package/src/host/runner.ts +2639 -450
  174. package/src/host/state.ts +404 -137
  175. package/src/host/view.ts +1212 -0
  176. package/src/host/worker-protocol.ts +1 -1
  177. package/src/state/database.ts +13 -0
  178. package/src/state/prune.ts +14 -42
  179. package/src/state/schema.ts +88 -98
  180. package/src/state/workflow-messages.ts +548 -0
  181. package/src/viewer/backup.ts +29 -0
  182. package/src/viewer/cli.ts +171 -185
  183. package/src/viewer/render.ts +1 -5
  184. package/src/viewer/tui.ts +261 -124
  185. package/src/workflows/human-decision.ts +18 -2
  186. package/src/workflows/index.ts +0 -1
  187. package/src/workflows/settings.ts +1 -20
  188. package/src/workflows/store.ts +650 -511
  189. package/src/workflows/tool-input.ts +36 -1
  190. package/src/workflows/types.ts +5 -5
  191. package/src/workflows/workflow-message-content.ts +197 -0
  192. package/dist/extension/decision-channels.d.ts +0 -134
  193. package/dist/extension/decision-channels.js +0 -1307
  194. package/dist/extension/decision-channels.js.map +0 -1
  195. package/dist/host/client.d.ts +0 -48
  196. package/dist/host/client.js +0 -216
  197. package/dist/host/client.js.map +0 -1
  198. package/dist/host/protocol.d.ts +0 -38
  199. package/dist/host/protocol.js +0 -156
  200. package/dist/host/protocol.js.map +0 -1
  201. package/dist/viewer/watch.d.ts +0 -6
  202. package/dist/viewer/watch.js +0 -46
  203. package/dist/viewer/watch.js.map +0 -1
  204. package/src/extension/decision-channels.ts +0 -1826
  205. package/src/host/client.ts +0 -293
  206. package/src/host/protocol.ts +0 -196
  207. package/src/viewer/watch.ts +0 -51
@@ -1,6 +1,7 @@
1
+ import { type ClientRequest, type ClientResponse } from "../client/protocol.js";
1
2
  import { StateDatabase } from "../state/database.js";
2
3
  import { type JsonValue } from "../state/json.js";
3
- import type { HostRequest, HostResponse } from "./protocol.js";
4
+ import { WorkflowMessageStore, type WorkflowStepReason } from "../state/workflow-messages.js";
4
5
  import type { WorkerMessage, WorkerResponse } from "./worker-protocol.js";
5
6
  export type HostClaim = {
6
7
  hostId: string;
@@ -49,10 +50,8 @@ export type InteractiveRequestRecord = {
49
50
  kind: "agent" | "assistant" | "decision";
50
51
  contract: JsonValue;
51
52
  revision: number;
52
- status: "pending" | "presenting" | "settled" | "cancelled";
53
- presenterId: string | null;
54
- presentationClaimExpiresAt: string | null;
55
- presentationSessionEntryId: string | null;
53
+ status: "pending" | "settled" | "cancelled";
54
+ unproductiveTurnEnds: number;
56
55
  acceptedSubmissionId: string | null;
57
56
  createdAt: string;
58
57
  updatedAt: string;
@@ -62,6 +61,7 @@ export type InteractiveRequestRecord = {
62
61
  export declare class HostStateStore {
63
62
  readonly state: StateDatabase;
64
63
  private readonly ownsState;
64
+ readonly workflowMessages: WorkflowMessageStore;
65
65
  constructor(databasePath: string, options?: {
66
66
  state?: StateDatabase;
67
67
  readOnly?: boolean;
@@ -77,8 +77,9 @@ export declare class HostStateStore {
77
77
  renewHost(claim: HostClaim, leaseMs: number, now?: number): HostClaim;
78
78
  releaseHost(claim: HostClaim, _now?: number): boolean;
79
79
  hostStatus(now?: number): HostStatusRecord;
80
- readCommand(request: HostRequest): HostResponse | undefined;
81
- executeCommand(request: HostRequest, hostEpoch: number, operation: () => Omit<HostResponse, "schema" | "requestId">): HostResponse;
80
+ readCommand(request: ClientRequest): ClientResponse | undefined;
81
+ adoptCommand(request: ClientRequest): ClientResponse | undefined;
82
+ executeCommand(request: ClientRequest, hostEpoch: number, operation: () => Omit<ClientResponse, "schema" | "type" | "requestId">): ClientResponse;
82
83
  recordWorkerStart(envelope: WorkerLaunchEnvelope, hostEpoch: number): void;
83
84
  attachWorkerProcess(workerEpoch: string, pid: number, processStartIdentity: string): void;
84
85
  markWorkerReady(workerEpoch: string): void;
@@ -99,6 +100,14 @@ export declare class HostStateStore {
99
100
  kind: InteractiveRequestRecord["kind"];
100
101
  contract: JsonValue;
101
102
  }): InteractiveRequestRecord;
103
+ ensureInteractionMessage(request: InteractiveRequestRecord, reason: WorkflowStepReason, now?: number): import("../state/workflow-messages.js").WorkflowMessage;
104
+ resumePendingInteraction(runId: string, now?: number): InteractiveRequestRecord;
105
+ beginInteractionModelTurn(requestId: string, now?: number): void;
106
+ interactionPauseStartedAt(runId: string): number | undefined;
107
+ resumeInteractionModelTurn(runId: string, pausedAt: number | undefined, now?: number): void;
108
+ markSessionModelTurnsInactive(targetSessionId: string, now?: number): void;
109
+ recoverInactiveModelTurns(previousHeartbeatAt: number | undefined, now?: number): void;
110
+ resumeSessionModelTurns(targetSessionId: string, now?: number): void;
102
111
  getInteraction(requestId: string): InteractiveRequestRecord | undefined;
103
112
  acceptedInteraction(runId: string): {
104
113
  requestId: string;
@@ -115,7 +124,7 @@ export declare class HostStateStore {
115
124
  payload: JsonValue;
116
125
  } | undefined;
117
126
  validatingInteractionRunIds(): string[];
118
- expiredInteractionRunIds(now?: number): string[];
127
+ expiredInteractionRuns(now?: number): ExpiredInteractionRunRow[];
119
128
  timedOutInteraction(runId: string): TimedOutInteractionRow | undefined;
120
129
  interactionSubmission(requestId: string, submissionId: string): InteractiveSubmissionRecord | undefined;
121
130
  finishInteractionValidation(options: {
@@ -126,17 +135,7 @@ export declare class HostStateStore {
126
135
  }): InteractiveSubmissionRecord;
127
136
  consumeAcceptedInteraction(runId: string, attemptId: string, now?: number): boolean;
128
137
  listPendingInteractions(sessionId: string): InteractiveRequestRecord[];
129
- claimInteractionPresentation(options: {
130
- requestId: string;
131
- expectedRevision: number;
132
- presenterId: string;
133
- leaseMs: number;
134
- }): InteractiveRequestRecord;
135
- markInteractionPresented(options: {
136
- requestId: string;
137
- expectedRevision: number;
138
- sessionEntryId: string;
139
- }): InteractiveRequestRecord;
138
+ listPendingDecisionInteractions(): InteractiveRequestRecord[];
140
139
  submitInteraction(options: {
141
140
  requestId: string;
142
141
  submissionId: string;
@@ -147,6 +146,7 @@ export declare class HostStateStore {
147
146
  receipt?: JsonValue;
148
147
  }): {
149
148
  interaction: InteractiveRequestRecord;
149
+ submissionId: string;
150
150
  outcome: "accepted" | "adopted";
151
151
  receipt: JsonValue;
152
152
  };
@@ -159,6 +159,7 @@ export declare class HostStateStore {
159
159
  receipt?: JsonValue;
160
160
  }): {
161
161
  interaction: InteractiveRequestRecord;
162
+ submissionId: string;
162
163
  outcome: "accepted" | "adopted";
163
164
  receipt: JsonValue;
164
165
  };
@@ -166,6 +167,7 @@ export declare class HostStateStore {
166
167
  private hostRow;
167
168
  private commandResponse;
168
169
  private interactiveRequest;
170
+ private shiftInteractionTimeout;
169
171
  private requireInteractiveRequest;
170
172
  }
171
173
  type TimedOutInteractionRow = {
@@ -173,4 +175,8 @@ type TimedOutInteractionRow = {
173
175
  attemptId: string;
174
176
  nodeId: string;
175
177
  };
178
+ type ExpiredInteractionRunRow = {
179
+ runId: string;
180
+ targetSessionId: string;
181
+ };
176
182
  export {};