@osolmaz/pi-workflows 0.16.0 → 0.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -2
- package/dist/channels/adapter-entry.d.ts +3 -0
- package/dist/channels/adapter-entry.js +203 -0
- package/dist/channels/adapter-entry.js.map +1 -0
- package/dist/channels/config.d.ts +43 -0
- package/dist/channels/config.js +234 -0
- package/dist/channels/config.js.map +1 -0
- package/dist/channels/protocol.d.ts +94 -0
- package/dist/channels/protocol.js +219 -0
- package/dist/channels/protocol.js.map +1 -0
- package/dist/channels/telegram.d.ts +46 -0
- package/dist/channels/telegram.js +285 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/client/client.d.ts +1 -0
- package/dist/client/client.js +5 -1
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/protocol.d.ts +1 -1
- package/dist/client/protocol.js +11 -5
- package/dist/client/protocol.js.map +1 -1
- package/dist/client/view.d.ts +48 -16
- package/dist/client/view.js +1 -0
- package/dist/client/view.js.map +1 -1
- package/dist/controllers/index.d.ts +1 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/sqlite.d.ts +20 -165
- package/dist/controllers/sqlite.js +178 -436
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/extension/index.d.ts +23 -2
- package/dist/extension/index.js +637 -534
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/recorder.d.ts +95 -0
- package/dist/extension/recorder.js +530 -0
- package/dist/extension/recorder.js.map +1 -0
- package/dist/extension/remote-recorder-store.d.ts +25 -0
- package/dist/extension/remote-recorder-store.js +81 -0
- package/dist/extension/remote-recorder-store.js.map +1 -0
- package/dist/extension/session-events.d.ts +134 -0
- package/dist/extension/session-events.js +60 -0
- package/dist/extension/session-events.js.map +1 -0
- package/dist/extension/session-view.d.ts +2 -0
- package/dist/extension/session-view.js +60 -2
- package/dist/extension/session-view.js.map +1 -1
- package/dist/extension/step-message.d.ts +6 -4
- package/dist/extension/step-message.js +12 -6
- package/dist/extension/step-message.js.map +1 -1
- package/dist/extension/widget.d.ts +2 -2
- package/dist/extension/widget.js +28 -18
- package/dist/extension/widget.js.map +1 -1
- package/dist/extension/workflow-message-coordinator.d.ts +28 -0
- package/dist/extension/workflow-message-coordinator.js +346 -0
- package/dist/extension/workflow-message-coordinator.js.map +1 -0
- package/dist/host/channel-effects.d.ts +72 -0
- package/dist/host/channel-effects.js +271 -0
- package/dist/host/channel-effects.js.map +1 -0
- package/dist/host/channel-supervisor.d.ts +21 -0
- package/dist/host/channel-supervisor.js +54 -0
- package/dist/host/channel-supervisor.js.map +1 -0
- package/dist/host/runner.d.ts +50 -8
- package/dist/host/runner.js +1632 -341
- package/dist/host/runner.js.map +1 -1
- package/dist/host/state.d.ts +19 -16
- package/dist/host/state.js +251 -63
- package/dist/host/state.js.map +1 -1
- package/dist/host/view.d.ts +19 -9
- package/dist/host/view.js +227 -119
- package/dist/host/view.js.map +1 -1
- package/dist/host/worker-entry.d.ts +4 -1
- package/dist/host/worker-entry.js +23 -24
- package/dist/host/worker-entry.js.map +1 -1
- package/dist/host/worker-protocol.d.ts +15 -0
- package/dist/host/worker-protocol.js.map +1 -1
- package/dist/state/prune.js +3 -25
- package/dist/state/prune.js.map +1 -1
- package/dist/state/schema.js +76 -97
- package/dist/state/schema.js.map +1 -1
- package/dist/state/workflow-messages.d.ts +98 -0
- package/dist/state/workflow-messages.js +366 -0
- package/dist/state/workflow-messages.js.map +1 -0
- package/dist/viewer/render.js +1 -1
- package/dist/viewer/render.js.map +1 -1
- package/dist/viewer/tui.d.ts +1 -1
- package/dist/viewer/tui.js +65 -8
- package/dist/viewer/tui.js.map +1 -1
- package/dist/workflows/composition.js +0 -4
- package/dist/workflows/composition.js.map +1 -1
- package/dist/workflows/definition.js +0 -8
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/engine.js +4 -5
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/human-decision.d.ts +2 -0
- package/dist/workflows/human-decision.js +8 -2
- package/dist/workflows/human-decision.js.map +1 -1
- package/dist/workflows/index.d.ts +1 -1
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/settings.d.ts +1 -8
- package/dist/workflows/settings.js.map +1 -1
- package/dist/workflows/store.d.ts +20 -19
- package/dist/workflows/store.js +163 -354
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/tool-input.d.ts +21 -0
- package/dist/workflows/tool-input.js +23 -1
- package/dist/workflows/tool-input.js.map +1 -1
- package/dist/workflows/types.d.ts +6 -8
- package/dist/workflows/workflow-message-content.d.ts +38 -0
- package/dist/workflows/workflow-message-content.js +157 -0
- package/dist/workflows/workflow-message-content.js.map +1 -0
- package/docs/2026-08-18-herdr-piw-plan.md +2 -1
- package/docs/2026-08-20-durable-workflow-launch-plan.md +1 -1
- package/docs/2026-08-25-workflow-follow-ups.md +26 -50
- package/docs/2026-08-30-out-of-process-workflow-host-plan.md +3 -3
- package/docs/2026-09-01-restore-session-delivery-controls-plan.md +4 -0
- package/docs/2026-09-01-unified-workflow-client-plan.md +5 -1
- package/docs/2026-09-02-installed-live-e2e-plan.md +15 -1
- package/docs/2026-09-02-unify-workflow-messages-plan.md +562 -0
- package/docs/2026-09-04-workflow-run-state-plan.md +363 -0
- package/docs/DEFERRED_TURNS.md +66 -294
- package/docs/HUMAN_DECISIONS.md +29 -30
- package/docs/HUMAN_DECISION_PRESENTATIONS.md +4 -11
- package/docs/SQLITE_STATE.md +25 -17
- package/docs/WORKFLOW_HOST.md +105 -31
- package/docs/WORKFLOW_STEP_MESSAGES.md +166 -75
- package/docs/live-replay-protocol.md +8 -4
- package/docs/tui-viewer.md +3 -1
- package/docs/workflows.md +44 -28
- package/herdr-plugin.toml +1 -1
- package/package.json +1 -1
- package/plugins/herdr/viewer.mjs +14 -5
- package/src/channels/adapter-entry.ts +220 -0
- package/src/channels/config.ts +296 -0
- package/src/channels/protocol.ts +333 -0
- package/src/channels/telegram.ts +335 -0
- package/src/client/client.ts +6 -2
- package/src/client/index.ts +2 -1
- package/src/client/protocol.ts +11 -5
- package/src/client/view.ts +51 -18
- package/src/controllers/index.ts +0 -1
- package/src/controllers/sqlite.ts +247 -845
- package/src/extension/index.ts +712 -647
- package/src/extension/recorder.ts +687 -0
- package/src/extension/remote-recorder-store.ts +126 -0
- package/src/extension/session-events.ts +119 -0
- package/src/extension/session-view.ts +86 -3
- package/src/extension/step-message.ts +19 -9
- package/src/extension/widget.ts +37 -17
- package/src/extension/workflow-message-coordinator.ts +398 -0
- package/src/host/channel-effects.ts +465 -0
- package/src/host/channel-supervisor.ts +73 -0
- package/src/host/runner.ts +2163 -525
- package/src/host/state.ts +333 -94
- package/src/host/view.ts +254 -122
- package/src/host/worker-entry.ts +38 -30
- package/src/host/worker-protocol.ts +11 -0
- package/src/state/prune.ts +3 -31
- package/src/state/schema.ts +76 -97
- package/src/state/workflow-messages.ts +599 -0
- package/src/viewer/render.ts +1 -5
- package/src/viewer/tui.ts +71 -6
- package/src/workflows/composition.ts +0 -5
- package/src/workflows/definition.ts +0 -8
- package/src/workflows/engine.ts +4 -6
- package/src/workflows/human-decision.ts +18 -2
- package/src/workflows/index.ts +0 -1
- package/src/workflows/schema.ts +0 -6
- package/src/workflows/settings.ts +1 -20
- package/src/workflows/store.ts +237 -489
- package/src/workflows/tool-input.ts +36 -1
- package/src/workflows/types.ts +6 -8
- package/src/workflows/workflow-message-content.ts +197 -0
- package/dist/extension/decision-channels.d.ts +0 -134
- package/dist/extension/decision-channels.js +0 -1307
- package/dist/extension/decision-channels.js.map +0 -1
- package/src/extension/decision-channels.ts +0 -1826
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-recorder-store.js","sourceRoot":"","sources":["../../src/extension/remote-recorder-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -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" | "deferred";
|
|
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" | "deferred";
|
|
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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"}
|
|
@@ -9,6 +9,7 @@ export declare class SessionWorkflowView {
|
|
|
9
9
|
private stepCount;
|
|
10
10
|
private visible;
|
|
11
11
|
private actionHint;
|
|
12
|
+
private lastNoticeKey;
|
|
12
13
|
update(session: WorkflowSessionView, ctx: ExtensionContext): void;
|
|
13
14
|
setActionHint(hint: string | undefined, ctx: ExtensionContext): void;
|
|
14
15
|
refresh(ctx: ExtensionContext): void;
|
|
@@ -18,4 +19,5 @@ export declare class SessionWorkflowView {
|
|
|
18
19
|
private scrollBy;
|
|
19
20
|
private clearWidget;
|
|
20
21
|
private render;
|
|
22
|
+
private notifyTransition;
|
|
21
23
|
}
|
|
@@ -10,6 +10,7 @@ export class SessionWorkflowView {
|
|
|
10
10
|
stepCount = 0;
|
|
11
11
|
visible = false;
|
|
12
12
|
actionHint;
|
|
13
|
+
lastNoticeKey = null;
|
|
13
14
|
update(session, ctx) {
|
|
14
15
|
const run = session.run;
|
|
15
16
|
if (run === null ||
|
|
@@ -25,6 +26,7 @@ export class SessionWorkflowView {
|
|
|
25
26
|
this.stepCount = run.state.steps.length;
|
|
26
27
|
}
|
|
27
28
|
this.session = session;
|
|
29
|
+
this.notifyTransition(previousRun, session, ctx);
|
|
28
30
|
this.render(ctx);
|
|
29
31
|
}
|
|
30
32
|
setActionHint(hint, ctx) {
|
|
@@ -51,6 +53,7 @@ export class SessionWorkflowView {
|
|
|
51
53
|
this.shownScroll = 0;
|
|
52
54
|
this.maxScroll = 0;
|
|
53
55
|
this.stepCount = 0;
|
|
56
|
+
this.lastNoticeKey = null;
|
|
54
57
|
this.clearWidget(ctx);
|
|
55
58
|
}
|
|
56
59
|
scrollBy(ctx, delta) {
|
|
@@ -78,7 +81,7 @@ export class SessionWorkflowView {
|
|
|
78
81
|
const state = run.state;
|
|
79
82
|
const snapshot = run.workflow;
|
|
80
83
|
const render = (width = Number.POSITIVE_INFINITY, theme) => {
|
|
81
|
-
const view = buildWidgetView(state, snapshot, new Date(), this.scroll, run.display.status === "paused", width, theme,
|
|
84
|
+
const view = buildWidgetView(state, snapshot, new Date(), this.scroll, run.display.status === "paused", width, theme, workflowUpdates(run.updates), this.actionHint, run.display.status, run.display.reason, run.display.controls);
|
|
82
85
|
this.shownScroll = view.scroll;
|
|
83
86
|
this.maxScroll = view.maxScroll;
|
|
84
87
|
if (this.scroll !== null)
|
|
@@ -95,10 +98,40 @@ export class SessionWorkflowView {
|
|
|
95
98
|
else {
|
|
96
99
|
ctx.ui.setWidget(WIDGET_KEY, render());
|
|
97
100
|
}
|
|
98
|
-
|
|
101
|
+
const focus = state.currentNode ?? state.waitingOn;
|
|
102
|
+
ctx.ui.setStatus(WIDGET_KEY, `${state.workflowName} [${run.display.status}]${focus === undefined ? "" : ` ${focus}`}`);
|
|
99
103
|
this.visible = true;
|
|
100
104
|
});
|
|
101
105
|
}
|
|
106
|
+
notifyTransition(previousRun, session, ctx) {
|
|
107
|
+
const run = session.run;
|
|
108
|
+
if (run === null || !isWorkflowRunState(run.state))
|
|
109
|
+
return;
|
|
110
|
+
const status = run.display.status;
|
|
111
|
+
const decision = session.pendingInteractions.some((value) => isRecord(value) && value.kind === "decision" && value.status === "pending");
|
|
112
|
+
const shouldNotify = isTerminalStatus(status) ||
|
|
113
|
+
(status === "waiting" && (decision || previousRun?.display.status !== "waiting")) ||
|
|
114
|
+
(status === "paused" && previousRun?.display.status !== "paused");
|
|
115
|
+
if (!shouldNotify)
|
|
116
|
+
return;
|
|
117
|
+
const key = `${run.runId}:${status}:${decision ? "decision" : "workflow"}`;
|
|
118
|
+
if (key === this.lastNoticeKey)
|
|
119
|
+
return;
|
|
120
|
+
this.lastNoticeKey = key;
|
|
121
|
+
const reason = run.display.reason?.trim();
|
|
122
|
+
const message = decision
|
|
123
|
+
? `Workflow ${run.state.workflowName} needs a human decision.`
|
|
124
|
+
: reason && reason.length > 0
|
|
125
|
+
? reason
|
|
126
|
+
: `Workflow ${run.state.workflowName} ${status.replace("_", " ")}.`;
|
|
127
|
+
safelyUpdateUi(ctx, () => {
|
|
128
|
+
ctx.ui.notify(message, status === "failed" || status === "timed_out" || status === "ambiguous"
|
|
129
|
+
? "error"
|
|
130
|
+
: status === "waiting" || status === "paused"
|
|
131
|
+
? "warning"
|
|
132
|
+
: "info");
|
|
133
|
+
});
|
|
134
|
+
}
|
|
102
135
|
}
|
|
103
136
|
function isWorkflowRunState(value) {
|
|
104
137
|
return (typeof value === "object" &&
|
|
@@ -108,6 +141,21 @@ function isWorkflowRunState(value) {
|
|
|
108
141
|
typeof value.workflowName === "string" &&
|
|
109
142
|
Array.isArray(value.steps));
|
|
110
143
|
}
|
|
144
|
+
function workflowUpdates(values) {
|
|
145
|
+
return values.filter(isWorkflowUpdateRecord);
|
|
146
|
+
}
|
|
147
|
+
function isWorkflowUpdateRecord(value) {
|
|
148
|
+
return (isRecord(value) &&
|
|
149
|
+
typeof value.updateId === "string" &&
|
|
150
|
+
typeof value.seq === "number" &&
|
|
151
|
+
typeof value.at === "string" &&
|
|
152
|
+
typeof value.runId === "string" &&
|
|
153
|
+
typeof value.nodeId === "string" &&
|
|
154
|
+
typeof value.attemptId === "string" &&
|
|
155
|
+
typeof value.type === "string" &&
|
|
156
|
+
typeof value.key === "string" &&
|
|
157
|
+
isRecord(value.data));
|
|
158
|
+
}
|
|
111
159
|
function isWorkflowDefinitionSnapshot(value) {
|
|
112
160
|
return (typeof value === "object" &&
|
|
113
161
|
value !== null &&
|
|
@@ -115,6 +163,16 @@ function isWorkflowDefinitionSnapshot(value) {
|
|
|
115
163
|
value.schema === "pi-workflows.definition-snapshot.v1" &&
|
|
116
164
|
typeof value.nodes === "object");
|
|
117
165
|
}
|
|
166
|
+
function isTerminalStatus(status) {
|
|
167
|
+
return (status === "completed" ||
|
|
168
|
+
status === "failed" ||
|
|
169
|
+
status === "timed_out" ||
|
|
170
|
+
status === "cancelled" ||
|
|
171
|
+
status === "ambiguous");
|
|
172
|
+
}
|
|
173
|
+
function isRecord(value) {
|
|
174
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
175
|
+
}
|
|
118
176
|
function safelyUpdateUi(ctx, update) {
|
|
119
177
|
try {
|
|
120
178
|
if (ctx.hasUI)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-view.js","sourceRoot":"","sources":["../../src/extension/session-view.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"session-view.js","sourceRoot":"","sources":["../../src/extension/session-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import type { ExtensionAPI, Theme } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import type { AgentStepContract, AgentStepPresentation, AgentStepSubmission } from "../workflows/types.js";
|
|
3
3
|
import { type MessageCardView } from "./message-card.js";
|
|
4
|
-
export declare const WORKFLOW_AGENT_STEP_MESSAGE_TYPE = "pi-workflows-
|
|
4
|
+
export declare const WORKFLOW_AGENT_STEP_MESSAGE_TYPE = "pi-workflows-step";
|
|
5
5
|
export declare const WORKFLOW_AGENT_STEP_MESSAGE_SCHEMA = "pi-workflows.agent-step-message.v1";
|
|
6
|
-
type
|
|
6
|
+
type PromptDeliveryReason = "initial" | "reminder" | "resumed";
|
|
7
7
|
export type WorkflowAgentStepMessageDetails = {
|
|
8
8
|
schema: typeof WORKFLOW_AGENT_STEP_MESSAGE_SCHEMA;
|
|
9
|
-
kind:
|
|
9
|
+
kind: "step";
|
|
10
|
+
reason: PromptDeliveryReason;
|
|
10
11
|
contract: AgentStepContract;
|
|
11
12
|
presentation?: AgentStepPresentation;
|
|
12
|
-
|
|
13
|
+
requestId: string;
|
|
14
|
+
workflowMessageId: string;
|
|
13
15
|
};
|
|
14
16
|
type WorkflowAgentStepMessage = {
|
|
15
17
|
content: unknown;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
+
import { WORKFLOW_STEP_MESSAGE_TYPE } from "../workflows/workflow-message-content.js";
|
|
2
3
|
import { cleanOptionalSingleLine, cleanSingleLine, customMessageContentText, paintMessageCard, renderMessageCard, } from "./message-card.js";
|
|
3
|
-
export const WORKFLOW_AGENT_STEP_MESSAGE_TYPE =
|
|
4
|
+
export const WORKFLOW_AGENT_STEP_MESSAGE_TYPE = WORKFLOW_STEP_MESSAGE_TYPE;
|
|
4
5
|
export const WORKFLOW_AGENT_STEP_MESSAGE_SCHEMA = "pi-workflows.agent-step-message.v1";
|
|
5
6
|
export function registerWorkflowAgentStepMessageRenderer(pi) {
|
|
6
7
|
pi.registerMessageRenderer(WORKFLOW_AGENT_STEP_MESSAGE_TYPE, (message, { expanded }, theme) => renderMessageCard(buildWorkflowAgentStepView(message, expanded, theme), theme));
|
|
@@ -9,14 +10,14 @@ export function registerWorkflowAgentStepMessageRenderer(pi) {
|
|
|
9
10
|
export function buildWorkflowAgentStepView(message, expanded, theme) {
|
|
10
11
|
const details = parseDetails(message.details);
|
|
11
12
|
const contract = details?.contract;
|
|
12
|
-
const
|
|
13
|
+
const reason = details?.reason ?? "initial";
|
|
13
14
|
const workflowName = cleanSingleLine(contract?.workflowName ?? "Workflow");
|
|
14
15
|
const nodeId = cleanSingleLine(contract?.nodeId ?? "step");
|
|
15
16
|
const runTitle = cleanOptionalSingleLine(details?.presentation?.runTitle);
|
|
16
17
|
const statusDetail = cleanOptionalSingleLine(details?.presentation?.statusDetail);
|
|
17
18
|
const label = runTitle ?? workflowName;
|
|
18
|
-
const suffix =
|
|
19
|
-
const glyph =
|
|
19
|
+
const suffix = reason === "initial" ? "" : ` · ${reason}`;
|
|
20
|
+
const glyph = reason === "initial" ? "▶" : "↻";
|
|
20
21
|
const title = paintMessageCard(theme, "accent", `${glyph} ${label} › ${nodeId}${suffix}`);
|
|
21
22
|
if (!expanded) {
|
|
22
23
|
return {
|
|
@@ -36,7 +37,7 @@ export function buildWorkflowAgentStepView(message, expanded, theme) {
|
|
|
36
37
|
`Run id: ${cleanSingleLine(contract?.runId ?? "unknown")}`,
|
|
37
38
|
`Node id: ${nodeId}`,
|
|
38
39
|
`Attempt id: ${cleanSingleLine(contract?.attemptId ?? "unknown")}`,
|
|
39
|
-
`
|
|
40
|
+
`Reason: ${reason}`,
|
|
40
41
|
`Completion: ${assistant ? "assistant response" : "workflow submission"}`,
|
|
41
42
|
`Expected output: ${cleanSingleLine(expectedOutput)}`,
|
|
42
43
|
];
|
|
@@ -165,7 +166,12 @@ function parseDetails(value) {
|
|
|
165
166
|
const candidate = value;
|
|
166
167
|
if (candidate.schema !== WORKFLOW_AGENT_STEP_MESSAGE_SCHEMA)
|
|
167
168
|
return undefined;
|
|
168
|
-
if (candidate.kind !== "step"
|
|
169
|
+
if (candidate.kind !== "step" ||
|
|
170
|
+
(candidate.reason !== "initial" &&
|
|
171
|
+
candidate.reason !== "reminder" &&
|
|
172
|
+
candidate.reason !== "resumed") ||
|
|
173
|
+
typeof candidate.requestId !== "string" ||
|
|
174
|
+
typeof candidate.workflowMessageId !== "string") {
|
|
169
175
|
return undefined;
|
|
170
176
|
}
|
|
171
177
|
const contract = candidate.contract;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-message.js","sourceRoot":"","sources":["../../src/extension/step-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,CAAC,MAAM,gCAAgC,GAAG,
|
|
1
|
+
{"version":3,"file":"step-message.js","sourceRoot":"","sources":["../../src/extension/step-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Theme } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
import type { WorkflowDisplayStatus } from "../client/view.js";
|
|
3
3
|
import type { WorkflowDefinitionSnapshot, WorkflowRunState, WorkflowUpdateRecord } from "../workflows/types.js";
|
|
4
|
-
export declare function nodeGlyph(state: WorkflowRunState, nodeId: string): string;
|
|
4
|
+
export declare function nodeGlyph(state: WorkflowRunState, nodeId: string, displayStatus?: WorkflowDisplayStatus): string;
|
|
5
5
|
/** Node ids in a stable display order: definition order from the snapshot. */
|
|
6
6
|
export declare function displayNodeIds(snapshot: WorkflowDefinitionSnapshot): string[];
|
|
7
7
|
export type WidgetTheme = Pick<Theme, "bold" | "fg">;
|
|
@@ -17,6 +17,6 @@ export type WidgetView = {
|
|
|
17
17
|
* follows the active node by default, and never returns a line wider than the
|
|
18
18
|
* width supplied by Pi's component renderer.
|
|
19
19
|
*/
|
|
20
|
-
export declare function buildWidgetView(state: WorkflowRunState, snapshot: WorkflowDefinitionSnapshot, now?: Date, scroll?: number | null, held?: boolean, width?: number, theme?: WidgetTheme, updateHistory?: WorkflowUpdateRecord[], actionHint?: string, displayStatus?: WorkflowDisplayStatus): WidgetView;
|
|
20
|
+
export declare function buildWidgetView(state: WorkflowRunState, snapshot: WorkflowDefinitionSnapshot, now?: Date, scroll?: number | null, held?: boolean, width?: number, theme?: WidgetTheme, updateHistory?: WorkflowUpdateRecord[], actionHint?: string, displayStatus?: WorkflowDisplayStatus, displayReason?: string | null, controls?: readonly string[]): WidgetView;
|
|
21
21
|
/** Compact line view following the active node. */
|
|
22
22
|
export declare function buildWidgetLines(state: WorkflowRunState, snapshot: WorkflowDefinitionSnapshot, now?: Date): string[];
|
package/dist/extension/widget.js
CHANGED
|
@@ -21,17 +21,20 @@ const STATUS_GLYPHS = {
|
|
|
21
21
|
*/
|
|
22
22
|
const PI_MAX_WIDGET_LINES = 10;
|
|
23
23
|
const MAX_NODE_ERROR_CHARS = 120;
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
function displayedRunningNode(state, displayStatus) {
|
|
25
|
+
return state.currentNode ?? (displayStatus === "running" ? state.waitingOn : undefined);
|
|
26
|
+
}
|
|
27
|
+
export function nodeGlyph(state, nodeId, displayStatus) {
|
|
28
|
+
if (displayedRunningNode(state, displayStatus) === nodeId) {
|
|
26
29
|
return "◐";
|
|
27
30
|
}
|
|
31
|
+
if (state.waitingOn === nodeId) {
|
|
32
|
+
return "⏸";
|
|
33
|
+
}
|
|
28
34
|
const result = state.results[nodeId];
|
|
29
35
|
if (!result) {
|
|
30
36
|
return "·";
|
|
31
37
|
}
|
|
32
|
-
if (state.waitingOn === nodeId) {
|
|
33
|
-
return "⏸";
|
|
34
|
-
}
|
|
35
38
|
return result.outcome === "ok" ? "✓" : "✗";
|
|
36
39
|
}
|
|
37
40
|
/** Node ids in a stable display order: definition order from the snapshot. */
|
|
@@ -43,7 +46,7 @@ export function displayNodeIds(snapshot) {
|
|
|
43
46
|
* follows the active node by default, and never returns a line wider than the
|
|
44
47
|
* width supplied by Pi's component renderer.
|
|
45
48
|
*/
|
|
46
|
-
export function buildWidgetView(state, snapshot, now = new Date(), scroll = null, held = false, width = Number.POSITIVE_INFINITY, theme, updateHistory, actionHint, displayStatus) {
|
|
49
|
+
export function buildWidgetView(state, snapshot, now = new Date(), scroll = null, held = false, width = Number.POSITIVE_INFINITY, theme, updateHistory, actionHint, displayStatus, displayReason, controls) {
|
|
47
50
|
const availableWidth = Number.isFinite(width) ? Math.max(0, Math.floor(width)) : width;
|
|
48
51
|
if (availableWidth === 0)
|
|
49
52
|
return { lines: [], scroll: 0, maxScroll: 0 };
|
|
@@ -59,16 +62,22 @@ export function buildWidgetView(state, snapshot, now = new Date(), scroll = null
|
|
|
59
62
|
const headerTone = statusTone(status);
|
|
60
63
|
const header = `${paint(theme, headerTone, glyph)} workflow ${sanitizeText(state.workflowName)}${title} ${paint(theme, headerTone, `[${statusText}]`)}`;
|
|
61
64
|
const footer = [];
|
|
65
|
+
if (displayReason) {
|
|
66
|
+
footer.push(paint(theme, "dim", ` ${sanitizeText(displayReason)}`));
|
|
67
|
+
}
|
|
68
|
+
if (controls !== undefined && controls.length > 0) {
|
|
69
|
+
footer.push(paint(theme, "dim", ` controls: ${controls.join(", ")}`));
|
|
70
|
+
}
|
|
62
71
|
if (state.error) {
|
|
63
72
|
footer.push(paint(theme, "error", ` error: ${truncate(sanitizeText(state.error), 120)}`));
|
|
64
73
|
}
|
|
65
74
|
if (status === "waiting" && state.waitingOn) {
|
|
66
|
-
footer.push(paint(theme, "warning", ` waiting on
|
|
75
|
+
footer.push(paint(theme, "warning", ` waiting on step: ${sanitizeText(state.waitingOn)}`));
|
|
67
76
|
}
|
|
68
77
|
const hint = actionHint?.trim() ? sanitizeText(actionHint) : undefined;
|
|
69
78
|
const progress = progressLines(state, now, updateHistory).slice(0, 4);
|
|
70
79
|
const baseBudget = PI_MAX_WIDGET_LINES - 1 - footer.length - progress.length;
|
|
71
|
-
const nodes = displayNodeIds(snapshot).map((nodeId) => compactNodeLine(state, snapshot, nodeId, now, paused, theme));
|
|
80
|
+
const nodes = displayNodeIds(snapshot).map((nodeId) => compactNodeLine(state, snapshot, nodeId, now, paused, status, theme));
|
|
72
81
|
const combineHintWithWindow = hint !== undefined && nodes.length > 0 && nodes.length + 1 > baseBudget;
|
|
73
82
|
if (hint !== undefined && !combineHintWithWindow) {
|
|
74
83
|
footer.push(paint(theme, "dim", ` ${hint}`));
|
|
@@ -176,14 +185,15 @@ function compactFocusIndex(state, snapshot) {
|
|
|
176
185
|
const index = nodeIds.indexOf(focused);
|
|
177
186
|
return index === -1 ? Math.max(0, nodeIds.length - 1) : index;
|
|
178
187
|
}
|
|
179
|
-
function compactNodeLine(state, snapshot, nodeId, now, paused, theme) {
|
|
188
|
+
function compactNodeLine(state, snapshot, nodeId, now, paused, displayStatus, theme) {
|
|
180
189
|
const node = snapshot.nodes[nodeId];
|
|
181
|
-
const
|
|
190
|
+
const runningNode = displayedRunningNode(state, displayStatus);
|
|
191
|
+
const isCurrent = runningNode === nodeId;
|
|
192
|
+
const isWaiting = state.waitingOn === nodeId && !isCurrent;
|
|
193
|
+
const glyph = nodeGlyph(state, nodeId, displayStatus);
|
|
182
194
|
const typeGlyph = node ? nodeTypeGlyph(node.nodeType, node.actionExecution) : "?";
|
|
183
195
|
const name = sanitizeText(nodeId);
|
|
184
|
-
const segments = nodeRuntimeSegments(state, snapshot, nodeId, now);
|
|
185
|
-
const isCurrent = state.currentNode === nodeId;
|
|
186
|
-
const isWaiting = state.waitingOn === nodeId;
|
|
196
|
+
const segments = nodeRuntimeSegments(state, snapshot, nodeId, now, isCurrent);
|
|
187
197
|
if (isCurrent || isWaiting) {
|
|
188
198
|
const tone = paused || isWaiting ? "warning" : "accent";
|
|
189
199
|
const focusedName = theme ? theme.bold(name) : name;
|
|
@@ -201,7 +211,7 @@ function compactNodeLine(state, snapshot, nodeId, now, paused, theme) {
|
|
|
201
211
|
const detail = styledSegments.length > 0 ? ` · ${styledSegments.join(" · ")}` : "";
|
|
202
212
|
return `${styledGlyph} ${styledType} ${name}${detail}`;
|
|
203
213
|
}
|
|
204
|
-
function nodeRuntimeSegments(state, snapshot, nodeId, now) {
|
|
214
|
+
function nodeRuntimeSegments(state, snapshot, nodeId, now, isCurrent) {
|
|
205
215
|
const segments = [];
|
|
206
216
|
const node = snapshot.nodes[nodeId];
|
|
207
217
|
if (node?.nodeType === "agent" &&
|
|
@@ -210,11 +220,11 @@ function nodeRuntimeSegments(state, snapshot, nodeId, now) {
|
|
|
210
220
|
segments.push("assistant response");
|
|
211
221
|
}
|
|
212
222
|
const completedAttempts = state.steps.filter((step) => step.nodeId === nodeId).length;
|
|
213
|
-
const attempts = completedAttempts + (
|
|
223
|
+
const attempts = completedAttempts + (isCurrent ? 1 : 0);
|
|
214
224
|
if (attempts > 1) {
|
|
215
225
|
segments.push(`↻${attempts}`);
|
|
216
226
|
}
|
|
217
|
-
if (
|
|
227
|
+
if (isCurrent && state.currentSettingsChangeNumber !== undefined) {
|
|
218
228
|
segments.push(`settings ${state.currentSettingsChangeNumber}`);
|
|
219
229
|
}
|
|
220
230
|
else {
|
|
@@ -224,8 +234,8 @@ function nodeRuntimeSegments(state, snapshot, nodeId, now) {
|
|
|
224
234
|
}
|
|
225
235
|
}
|
|
226
236
|
const result = state.results[nodeId];
|
|
227
|
-
if (
|
|
228
|
-
if (state.statusDetail) {
|
|
237
|
+
if (isCurrent) {
|
|
238
|
+
if (state.currentNode === nodeId && state.statusDetail) {
|
|
229
239
|
segments.push(sanitizeText(state.statusDetail));
|
|
230
240
|
}
|
|
231
241
|
const elapsed = elapsedSince(state.currentNodeStartedAt, now);
|