@fragno-dev/pi-fragment 0.0.1 → 0.0.3
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 +39 -3
- package/dist/browser/client/react.d.ts +44 -36
- package/dist/browser/client/react.d.ts.map +1 -1
- package/dist/browser/client/react.js +105 -22
- package/dist/browser/client/react.js.map +1 -1
- package/dist/browser/client/solid.d.ts +42 -36
- package/dist/browser/client/solid.d.ts.map +1 -1
- package/dist/browser/client/solid.js +27 -13
- package/dist/browser/client/solid.js.map +1 -1
- package/dist/browser/client/svelte.d.ts +42 -36
- package/dist/browser/client/svelte.d.ts.map +1 -1
- package/dist/browser/client/svelte.js +14 -6
- package/dist/browser/client/svelte.js.map +1 -1
- package/dist/browser/client/vanilla.d.ts +99 -39
- package/dist/browser/client/vanilla.d.ts.map +1 -1
- package/dist/browser/client/vanilla.js +151 -3
- package/dist/browser/client/vanilla.js.map +1 -1
- package/dist/browser/client/vue.d.ts +54 -38
- package/dist/browser/client/vue.d.ts.map +1 -1
- package/dist/browser/client/vue.js +25 -17
- package/dist/browser/client/vue.js.map +1 -1
- package/dist/browser/{factory-DKoO_lRA.js → clients-BscY_HVe.js} +1051 -799
- package/dist/browser/clients-BscY_HVe.js.map +1 -0
- package/dist/browser/index.d.ts +3 -776
- package/dist/browser/index.js +801 -2
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/routes-CpL_YGWK.d.ts +1560 -0
- package/dist/browser/routes-CpL_YGWK.d.ts.map +1 -0
- package/dist/cli/mod.d.ts.map +1 -1
- package/dist/cli/mod.js +245 -7
- package/dist/cli/mod.js.map +1 -1
- package/dist/node/{pi → client}/clients.d.ts +46 -36
- package/dist/node/client/clients.d.ts.map +1 -0
- package/dist/node/client/clients.js +54 -0
- package/dist/node/client/clients.js.map +1 -0
- package/dist/node/client/session-controller.d.ts +31 -0
- package/dist/node/client/session-controller.d.ts.map +1 -0
- package/dist/node/client/session-controller.js +33 -0
- package/dist/node/client/session-controller.js.map +1 -0
- package/dist/node/client/session-store.d.ts +71 -0
- package/dist/node/client/session-store.d.ts.map +1 -0
- package/dist/node/client/session-store.js +637 -0
- package/dist/node/client/session-store.js.map +1 -0
- package/dist/node/debug-log.d.ts +9 -0
- package/dist/node/debug-log.d.ts.map +1 -0
- package/dist/node/debug-log.js +58 -0
- package/dist/node/debug-log.js.map +1 -0
- package/dist/node/index.d.ts +5 -4
- package/dist/node/index.js +5 -3
- package/dist/node/pi/definition.d.ts +1 -1
- package/dist/node/pi/definition.d.ts.map +1 -1
- package/dist/node/pi/dsl.d.ts +5 -2
- package/dist/node/pi/dsl.d.ts.map +1 -1
- package/dist/node/pi/dsl.js +22 -3
- package/dist/node/pi/dsl.js.map +1 -1
- package/dist/node/pi/factory.d.ts +37 -34
- package/dist/node/pi/factory.d.ts.map +1 -1
- package/dist/node/pi/factory.js.map +1 -1
- package/dist/node/pi/mappers.js +0 -1
- package/dist/node/pi/mappers.js.map +1 -1
- package/dist/node/pi/route-schemas.js +42 -10
- package/dist/node/pi/route-schemas.js.map +1 -1
- package/dist/node/pi/types.d.ts +155 -7
- package/dist/node/pi/types.d.ts.map +1 -1
- package/dist/node/pi/types.js +6 -0
- package/dist/node/pi/types.js.map +1 -0
- package/dist/node/pi/workflow/active-session.d.ts +2 -0
- package/dist/node/pi/workflow/active-session.js +107 -0
- package/dist/node/pi/workflow/active-session.js.map +1 -0
- package/dist/node/pi/workflow/agent-runner.d.ts +13 -0
- package/dist/node/pi/workflow/agent-runner.d.ts.map +1 -0
- package/dist/node/pi/workflow/agent-runner.js +228 -0
- package/dist/node/pi/workflow/agent-runner.js.map +1 -0
- package/dist/node/pi/workflow/tool-journal.js +157 -0
- package/dist/node/pi/workflow/tool-journal.js.map +1 -0
- package/dist/node/pi/workflow/workflow.d.ts +29 -0
- package/dist/node/pi/workflow/workflow.d.ts.map +1 -0
- package/dist/node/pi/workflow/workflow.js +219 -0
- package/dist/node/pi/workflow/workflow.js.map +1 -0
- package/dist/node/routes.d.ts +38 -35
- package/dist/node/routes.d.ts.map +1 -1
- package/dist/node/routes.js +203 -132
- package/dist/node/routes.js.map +1 -1
- package/dist/node/schema.js +1 -1
- package/dist/node/schema.js.map +1 -1
- package/package.json +30 -29
- package/dist/browser/client-Bk-J98pf.d.ts +0 -679
- package/dist/browser/client-Bk-J98pf.d.ts.map +0 -1
- package/dist/browser/factory-DKoO_lRA.js.map +0 -1
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/node/pi/clients.d.ts.map +0 -1
- package/dist/node/pi/clients.js +0 -18
- package/dist/node/pi/clients.js.map +0 -1
- package/dist/node/pi/workflow.d.ts +0 -31
- package/dist/node/pi/workflow.d.ts.map +0 -1
- package/dist/node/pi/workflow.js +0 -242
- package/dist/node/pi/workflow.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -2,12 +2,16 @@ import { SESSION_STATUSES, STEERING_MODES } from "./constants.js";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
|
|
4
4
|
//#region src/pi/route-schemas.ts
|
|
5
|
+
const AGENT_LOOP_PHASES = [
|
|
6
|
+
"waiting-for-user",
|
|
7
|
+
"running-agent",
|
|
8
|
+
"complete"
|
|
9
|
+
];
|
|
5
10
|
const sessionBaseSchema = z.object({
|
|
6
11
|
id: z.string(),
|
|
7
12
|
name: z.string().nullable(),
|
|
8
13
|
status: z.enum(SESSION_STATUSES),
|
|
9
14
|
agent: z.string(),
|
|
10
|
-
workflowInstanceId: z.string().nullable(),
|
|
11
15
|
steeringMode: z.enum(STEERING_MODES),
|
|
12
16
|
metadata: z.any().nullable(),
|
|
13
17
|
tags: z.array(z.string()),
|
|
@@ -36,12 +40,13 @@ const ToolCallSchema = z.object({
|
|
|
36
40
|
arguments: z.record(z.string(), z.unknown()),
|
|
37
41
|
thoughtSignature: z.string().optional()
|
|
38
42
|
});
|
|
39
|
-
const
|
|
43
|
+
const UserContentSchema = z.union([TextContentSchema, ImageContentSchema]);
|
|
44
|
+
const AssistantContentSchema = z.union([
|
|
40
45
|
TextContentSchema,
|
|
41
46
|
ThinkingContentSchema,
|
|
42
|
-
ImageContentSchema,
|
|
43
47
|
ToolCallSchema
|
|
44
48
|
]);
|
|
49
|
+
const ToolResultContentSchema = z.union([TextContentSchema, ImageContentSchema]);
|
|
45
50
|
const UsageSchema = z.object({
|
|
46
51
|
input: z.number(),
|
|
47
52
|
output: z.number(),
|
|
@@ -59,17 +64,23 @@ const UsageSchema = z.object({
|
|
|
59
64
|
const MessageSchema = z.union([
|
|
60
65
|
z.object({
|
|
61
66
|
role: z.literal("user"),
|
|
62
|
-
content: z.union([z.string(), z.array(
|
|
67
|
+
content: z.union([z.string(), z.array(UserContentSchema)]),
|
|
63
68
|
timestamp: z.number()
|
|
64
69
|
}),
|
|
65
70
|
z.object({
|
|
66
71
|
role: z.literal("assistant"),
|
|
67
|
-
content: z.array(
|
|
72
|
+
content: z.array(AssistantContentSchema),
|
|
68
73
|
api: z.string(),
|
|
69
74
|
provider: z.string(),
|
|
70
75
|
model: z.string(),
|
|
71
76
|
usage: UsageSchema,
|
|
72
|
-
stopReason: z.
|
|
77
|
+
stopReason: z.enum([
|
|
78
|
+
"stop",
|
|
79
|
+
"length",
|
|
80
|
+
"toolUse",
|
|
81
|
+
"error",
|
|
82
|
+
"aborted"
|
|
83
|
+
]),
|
|
73
84
|
errorMessage: z.string().optional(),
|
|
74
85
|
timestamp: z.number()
|
|
75
86
|
}),
|
|
@@ -77,16 +88,32 @@ const MessageSchema = z.union([
|
|
|
77
88
|
role: z.literal("toolResult"),
|
|
78
89
|
toolCallId: z.string(),
|
|
79
90
|
toolName: z.string(),
|
|
80
|
-
content: z.array(
|
|
91
|
+
content: z.array(ToolResultContentSchema),
|
|
81
92
|
details: z.unknown().optional(),
|
|
82
93
|
isError: z.boolean(),
|
|
83
94
|
timestamp: z.number()
|
|
84
95
|
})
|
|
85
96
|
]);
|
|
86
|
-
const TraceSchema = z.
|
|
97
|
+
const TraceSchema = z.custom();
|
|
98
|
+
const EventSchema = z.object({
|
|
99
|
+
id: z.string(),
|
|
100
|
+
runNumber: z.number().nullable().optional(),
|
|
87
101
|
type: z.string(),
|
|
88
|
-
|
|
102
|
+
payload: z.unknown().nullable(),
|
|
103
|
+
createdAt: z.date(),
|
|
104
|
+
deliveredAt: z.date().nullable(),
|
|
105
|
+
consumedByStepKey: z.string().nullable()
|
|
89
106
|
});
|
|
107
|
+
const WaitingForSchema = z.union([z.object({
|
|
108
|
+
type: z.literal("user_message"),
|
|
109
|
+
turn: z.number(),
|
|
110
|
+
stepKey: z.string(),
|
|
111
|
+
timeoutMs: z.number().nullable()
|
|
112
|
+
}), z.object({
|
|
113
|
+
type: z.literal("assistant"),
|
|
114
|
+
turn: z.number(),
|
|
115
|
+
stepKey: z.string()
|
|
116
|
+
})]).nullable();
|
|
90
117
|
const workflowStatusSchema = z.object({
|
|
91
118
|
status: z.enum(SESSION_STATUSES),
|
|
92
119
|
error: z.object({
|
|
@@ -98,7 +125,11 @@ const workflowStatusSchema = z.object({
|
|
|
98
125
|
const sessionDetailSchema = sessionBaseSchema.extend({
|
|
99
126
|
workflow: workflowStatusSchema,
|
|
100
127
|
messages: z.array(MessageSchema),
|
|
128
|
+
events: z.array(EventSchema),
|
|
101
129
|
trace: z.array(TraceSchema),
|
|
130
|
+
turn: z.number(),
|
|
131
|
+
phase: z.enum(AGENT_LOOP_PHASES),
|
|
132
|
+
waitingFor: WaitingForSchema,
|
|
102
133
|
summaries: z.array(z.object({
|
|
103
134
|
turn: z.number(),
|
|
104
135
|
assistant: z.any().nullable(),
|
|
@@ -106,7 +137,8 @@ const sessionDetailSchema = sessionBaseSchema.extend({
|
|
|
106
137
|
}))
|
|
107
138
|
});
|
|
108
139
|
const messageAckSchema = z.object({ status: z.enum(SESSION_STATUSES) });
|
|
140
|
+
const activeSessionStreamItemSchema = z.custom();
|
|
109
141
|
|
|
110
142
|
//#endregion
|
|
111
|
-
export { messageAckSchema, sessionBaseSchema, sessionDetailSchema };
|
|
143
|
+
export { activeSessionStreamItemSchema, messageAckSchema, sessionBaseSchema, sessionDetailSchema };
|
|
112
144
|
//# sourceMappingURL=route-schemas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-schemas.js","names":[],"sources":["../../../src/pi/route-schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport { SESSION_STATUSES, STEERING_MODES } from \"./constants\";\n\nconst sessionBaseSchema = z.object({\n id: z.string(),\n name: z.string().nullable(),\n status: z.enum(SESSION_STATUSES),\n agent: z.string(),\n
|
|
1
|
+
{"version":3,"file":"route-schemas.js","names":[],"sources":["../../../src/pi/route-schemas.ts"],"sourcesContent":["import { z } from \"zod\";\n\nimport type { AgentEvent } from \"@mariozechner/pi-agent-core\";\n\nimport { SESSION_STATUSES, STEERING_MODES } from \"./constants\";\nimport type { PiActiveSessionProtocolMessage } from \"./types\";\n\nconst AGENT_LOOP_PHASES = [\"waiting-for-user\", \"running-agent\", \"complete\"] as const;\n\nconst sessionBaseSchema = z.object({\n id: z.string(),\n name: z.string().nullable(),\n status: z.enum(SESSION_STATUSES),\n agent: z.string(),\n steeringMode: z.enum(STEERING_MODES),\n metadata: z.any().nullable(),\n tags: z.array(z.string()),\n createdAt: z.date(),\n updatedAt: z.date(),\n});\n\nconst TextContentSchema = z.object({\n type: z.literal(\"text\"),\n text: z.string(),\n textSignature: z.string().optional(),\n});\n\nconst ThinkingContentSchema = z.object({\n type: z.literal(\"thinking\"),\n thinking: z.string(),\n thinkingSignature: z.string().optional(),\n});\n\nconst ImageContentSchema = z.object({\n type: z.literal(\"image\"),\n data: z.string(),\n mimeType: z.string(),\n});\n\nconst ToolCallSchema = z.object({\n type: z.literal(\"toolCall\"),\n id: z.string(),\n name: z.string(),\n arguments: z.record(z.string(), z.unknown()),\n thoughtSignature: z.string().optional(),\n});\n\n// Per-role content unions matching the actual AgentMessage types from @mariozechner/pi-ai:\n// - UserMessage.content: string | (TextContent | ImageContent)[]\n// - AssistantMessage.content: (TextContent | ThinkingContent | ToolCall)[]\n// - ToolResultMessage.content:(TextContent | ImageContent)[]\nconst UserContentSchema = z.union([TextContentSchema, ImageContentSchema]);\nconst AssistantContentSchema = z.union([TextContentSchema, ThinkingContentSchema, ToolCallSchema]);\nconst ToolResultContentSchema = z.union([TextContentSchema, ImageContentSchema]);\n\nconst UsageSchema = z.object({\n input: z.number(),\n output: z.number(),\n cacheRead: z.number(),\n cacheWrite: z.number(),\n totalTokens: z.number(),\n cost: z.object({\n input: z.number(),\n output: z.number(),\n cacheRead: z.number(),\n cacheWrite: z.number(),\n total: z.number(),\n }),\n});\n\nconst MessageSchema = z.union([\n z.object({\n role: z.literal(\"user\"),\n content: z.union([z.string(), z.array(UserContentSchema)]),\n timestamp: z.number(),\n }),\n z.object({\n role: z.literal(\"assistant\"),\n content: z.array(AssistantContentSchema),\n api: z.string(),\n provider: z.string(),\n model: z.string(),\n usage: UsageSchema,\n stopReason: z.enum([\"stop\", \"length\", \"toolUse\", \"error\", \"aborted\"]),\n errorMessage: z.string().optional(),\n timestamp: z.number(),\n }),\n z.object({\n role: z.literal(\"toolResult\"),\n toolCallId: z.string(),\n toolName: z.string(),\n content: z.array(ToolResultContentSchema),\n details: z.unknown().optional(),\n isError: z.boolean(),\n timestamp: z.number(),\n }),\n]);\n\n// AgentEvent is a discriminated union that recursively contains AgentMessage[],\n// making a full structural Zod schema impractical.\nconst TraceSchema: z.ZodType<AgentEvent> = z.custom<AgentEvent>();\n\nconst EventSchema = z.object({\n id: z.string(),\n runNumber: z.number().nullable().optional(),\n type: z.string(),\n payload: z.unknown().nullable(),\n createdAt: z.date(),\n deliveredAt: z.date().nullable(),\n consumedByStepKey: z.string().nullable(),\n});\n\nconst WaitingForSchema = z\n .union([\n z.object({\n type: z.literal(\"user_message\"),\n turn: z.number(),\n stepKey: z.string(),\n timeoutMs: z.number().nullable(),\n }),\n z.object({\n type: z.literal(\"assistant\"),\n turn: z.number(),\n stepKey: z.string(),\n }),\n ])\n .nullable();\n\nconst workflowStatusSchema = z.object({\n status: z.enum(SESSION_STATUSES),\n error: z\n .object({\n name: z.string(),\n message: z.string(),\n })\n .optional(),\n output: z.any().optional(),\n});\n\nconst sessionDetailSchema = sessionBaseSchema.extend({\n workflow: workflowStatusSchema,\n messages: z.array(MessageSchema),\n events: z.array(EventSchema),\n trace: z.array(TraceSchema),\n turn: z.number(),\n phase: z.enum(AGENT_LOOP_PHASES),\n waitingFor: WaitingForSchema,\n summaries: z.array(\n z.object({\n turn: z.number(),\n assistant: z.any().nullable(),\n summary: z.string().nullable(),\n }),\n ),\n});\n\nconst messageAckSchema = z.object({\n status: z.enum(SESSION_STATUSES),\n});\n\nconst activeSessionStreamItemSchema: z.ZodType<PiActiveSessionProtocolMessage> =\n z.custom<PiActiveSessionProtocolMessage>();\n\nexport {\n activeSessionStreamItemSchema,\n messageAckSchema,\n sessionBaseSchema,\n sessionDetailSchema,\n workflowStatusSchema,\n};\n"],"mappings":"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"}
|
package/dist/node/pi/types.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
+
import { PiLoggerConfig } from "../debug-log.js";
|
|
1
2
|
import { PiSessionStatus, PiSteeringMode } from "./constants.js";
|
|
2
|
-
import {
|
|
3
|
+
import { PiWorkflowsRegistry } from "./workflow/workflow.js";
|
|
3
4
|
import { TxResult } from "@fragno-dev/db";
|
|
5
|
+
import { InstanceStatus, WorkflowsFragmentServices, WorkflowsHistoryStep } from "@fragno-dev/workflows";
|
|
4
6
|
import { AgentEvent, AgentMessage, AgentOptions, AgentTool, StreamFn, ThinkingLevel } from "@mariozechner/pi-agent-core";
|
|
5
|
-
import { Api, Model } from "@mariozechner/pi-ai";
|
|
6
|
-
import { InstanceStatus, WorkflowsHistoryStep, workflowsFragmentDefinition } from "@fragno-dev/workflows";
|
|
7
|
+
import { Api, ImageContent, Model, TextContent } from "@mariozechner/pi-ai";
|
|
7
8
|
|
|
8
9
|
//#region src/pi/types.d.ts
|
|
9
|
-
type WorkflowsService =
|
|
10
|
+
type WorkflowsService = WorkflowsFragmentServices<PiWorkflowsRegistry>;
|
|
10
11
|
type PiSession = {
|
|
11
12
|
id: string;
|
|
12
13
|
name: string | null;
|
|
13
14
|
status: PiSessionStatus;
|
|
14
15
|
agent: string;
|
|
15
|
-
workflowInstanceId: string | null;
|
|
16
16
|
steeringMode: PiSteeringMode;
|
|
17
17
|
metadata: unknown;
|
|
18
18
|
tags: string[];
|
|
@@ -24,9 +24,88 @@ type PiTurnSummary = {
|
|
|
24
24
|
assistant: AgentMessage | null;
|
|
25
25
|
summary: string | null;
|
|
26
26
|
};
|
|
27
|
+
type PiSessionDetailEvent = {
|
|
28
|
+
id: string;
|
|
29
|
+
type: string;
|
|
30
|
+
payload: unknown | null;
|
|
31
|
+
createdAt: Date;
|
|
32
|
+
deliveredAt: Date | null;
|
|
33
|
+
consumedByStepKey: string | null;
|
|
34
|
+
runNumber?: number | null;
|
|
35
|
+
};
|
|
36
|
+
type PiAgentLoopPhase = "waiting-for-user" | "running-agent" | "complete";
|
|
37
|
+
type PiActiveSessionStreamItem = AgentEvent;
|
|
38
|
+
type PiActiveSessionSettledStatus = "waiting-for-user" | "complete" | "errored";
|
|
39
|
+
type PiActiveSessionUpdate = {
|
|
40
|
+
type: "event";
|
|
41
|
+
turn: number;
|
|
42
|
+
event: PiActiveSessionStreamItem;
|
|
43
|
+
} | {
|
|
44
|
+
type: "settled";
|
|
45
|
+
turn: number;
|
|
46
|
+
status: PiActiveSessionSettledStatus;
|
|
47
|
+
};
|
|
48
|
+
type PiActiveSessionSubscriber = (update: PiActiveSessionUpdate) => void;
|
|
49
|
+
type PiActiveSessionReplayBufferEntry = {
|
|
50
|
+
turn: number;
|
|
51
|
+
updates: PiActiveSessionUpdate[];
|
|
52
|
+
};
|
|
53
|
+
type PiActiveSessionReplayBuffer = PiActiveSessionReplayBufferEntry[];
|
|
54
|
+
type PiActiveSessionState = {
|
|
55
|
+
subscribe: (listener: PiActiveSessionSubscriber) => () => void;
|
|
56
|
+
publishEvent: (turn: number, event: PiActiveSessionStreamItem) => void;
|
|
57
|
+
settleTurn: (turn: number, status: PiActiveSessionSettledStatus) => void;
|
|
58
|
+
replayTurn: (turn: number) => PiActiveSessionUpdate[];
|
|
59
|
+
exportReplayBuffer: () => PiActiveSessionReplayBuffer;
|
|
60
|
+
importReplayBuffer: (buffer: PiActiveSessionReplayBuffer) => void;
|
|
61
|
+
listenerCount: () => number;
|
|
62
|
+
};
|
|
63
|
+
type PiAgentLoopWaitingFor = {
|
|
64
|
+
type: "user_message";
|
|
65
|
+
turn: number;
|
|
66
|
+
stepKey: string;
|
|
67
|
+
timeoutMs: number | null;
|
|
68
|
+
} | {
|
|
69
|
+
type: "assistant";
|
|
70
|
+
turn: number;
|
|
71
|
+
stepKey: string;
|
|
72
|
+
} | null;
|
|
73
|
+
type PiAgentLoopSerializableState = {
|
|
74
|
+
messages: AgentMessage[];
|
|
75
|
+
events: PiSessionDetailEvent[];
|
|
76
|
+
trace: AgentEvent[];
|
|
77
|
+
summaries: PiTurnSummary[];
|
|
78
|
+
turn: number;
|
|
79
|
+
phase: PiAgentLoopPhase;
|
|
80
|
+
waitingFor: PiAgentLoopWaitingFor;
|
|
81
|
+
};
|
|
82
|
+
type PiAgentLoopPersistedState = PiAgentLoopSerializableState & {
|
|
83
|
+
activeSessionUpdatesByTurn: PiActiveSessionReplayBuffer;
|
|
84
|
+
};
|
|
85
|
+
type PiSessionWorkflowStatus = {
|
|
86
|
+
status: PiSessionStatus;
|
|
87
|
+
error?: {
|
|
88
|
+
name: string;
|
|
89
|
+
message: string;
|
|
90
|
+
};
|
|
91
|
+
output?: unknown;
|
|
92
|
+
};
|
|
93
|
+
type PiSessionDetail = PiSession & {
|
|
94
|
+
workflow: PiSessionWorkflowStatus;
|
|
95
|
+
messages: AgentMessage[];
|
|
96
|
+
events: PiSessionDetailEvent[];
|
|
97
|
+
trace: AgentEvent[];
|
|
98
|
+
summaries: PiTurnSummary[];
|
|
99
|
+
turn: number;
|
|
100
|
+
phase: PiAgentLoopPhase;
|
|
101
|
+
waitingFor: PiAgentLoopWaitingFor;
|
|
102
|
+
};
|
|
103
|
+
type PiAgentLoopState = PiAgentLoopPersistedState & {
|
|
104
|
+
activeSession?: PiActiveSessionState;
|
|
105
|
+
};
|
|
27
106
|
type PiWorkflowsInstanceStatus = InstanceStatus;
|
|
28
107
|
type PiWorkflowHistoryStep = WorkflowsHistoryStep;
|
|
29
|
-
type PiWorkflowsService = Pick<WorkflowsService, "createInstance" | "getInstanceStatus" | "
|
|
108
|
+
type PiWorkflowsService = Pick<WorkflowsService, "createInstance" | "getInstanceStatus" | "getLiveInstanceState" | "restoreInstanceState" | "sendEvent"> & {
|
|
30
109
|
getInstanceStatusBatch?: (workflowName: string, instanceIds: string[]) => TxResult<PiWorkflowsInstanceStatus[], PiWorkflowsInstanceStatus[]>;
|
|
31
110
|
};
|
|
32
111
|
type PiAgentDefinition = {
|
|
@@ -49,11 +128,75 @@ type PiAgentDefinition = {
|
|
|
49
128
|
}) => void;
|
|
50
129
|
};
|
|
51
130
|
type PiAgentRegistry = Record<string, PiAgentDefinition>;
|
|
131
|
+
declare const PI_TOOL_JOURNAL_VERSION: 1;
|
|
132
|
+
type PiToolJournalVersion = typeof PI_TOOL_JOURNAL_VERSION;
|
|
133
|
+
type PiToolCallStableKey = string;
|
|
134
|
+
type PiPersistedToolResult = {
|
|
135
|
+
content: Array<TextContent | ImageContent>;
|
|
136
|
+
details: unknown;
|
|
137
|
+
};
|
|
138
|
+
type PiPersistedToolCallSource = "executed" | "replay";
|
|
139
|
+
type PiPersistedToolCallV1 = {
|
|
140
|
+
version: PiToolJournalVersion;
|
|
141
|
+
key: PiToolCallStableKey;
|
|
142
|
+
sessionId: string;
|
|
143
|
+
turnId: string;
|
|
144
|
+
toolCallId: string;
|
|
145
|
+
toolName: string;
|
|
146
|
+
args: Record<string, unknown>;
|
|
147
|
+
result: PiPersistedToolResult;
|
|
148
|
+
isError: boolean;
|
|
149
|
+
source: PiPersistedToolCallSource;
|
|
150
|
+
capturedAt: number;
|
|
151
|
+
seq: number;
|
|
152
|
+
};
|
|
153
|
+
type PiActiveSessionSystemMessage = {
|
|
154
|
+
layer: "system";
|
|
155
|
+
type: "snapshot";
|
|
156
|
+
turn: number;
|
|
157
|
+
phase: PiAgentLoopPhase;
|
|
158
|
+
waitingFor: PiAgentLoopWaitingFor;
|
|
159
|
+
replayCount: number;
|
|
160
|
+
} | {
|
|
161
|
+
layer: "system";
|
|
162
|
+
type: "settled";
|
|
163
|
+
turn: number;
|
|
164
|
+
status: PiActiveSessionSettledStatus;
|
|
165
|
+
} | {
|
|
166
|
+
layer: "system";
|
|
167
|
+
type: "inactive";
|
|
168
|
+
reason: "session-complete" | "session-idle";
|
|
169
|
+
turn: number;
|
|
170
|
+
phase: PiAgentLoopPhase;
|
|
171
|
+
waitingFor: PiAgentLoopWaitingFor;
|
|
172
|
+
};
|
|
173
|
+
type PiActiveSessionProtocolMessage = PiActiveSessionSystemMessage | {
|
|
174
|
+
layer: "pi";
|
|
175
|
+
type: "event";
|
|
176
|
+
turn: number;
|
|
177
|
+
source: "replay" | "live";
|
|
178
|
+
event: PiActiveSessionStreamItem;
|
|
179
|
+
};
|
|
180
|
+
type PiPersistedToolCall = PiPersistedToolCallV1;
|
|
181
|
+
type PiToolReplayCache = Map<PiToolCallStableKey, PiPersistedToolCall>;
|
|
182
|
+
type PiToolSideEffectReducerContext = {
|
|
183
|
+
key: PiToolCallStableKey;
|
|
184
|
+
sessionId: string;
|
|
185
|
+
turnId: string;
|
|
186
|
+
};
|
|
187
|
+
type PiToolSideEffectReducer = (state: unknown, entry: PiPersistedToolCall, ctx: PiToolSideEffectReducerContext) => unknown;
|
|
188
|
+
type PiToolSideEffectReducerRegistry = Record<string, PiToolSideEffectReducer>;
|
|
189
|
+
type PiToolReplayContext = {
|
|
190
|
+
cache: PiToolReplayCache;
|
|
191
|
+
journal: PiPersistedToolCall[];
|
|
192
|
+
sideEffects: Record<string, unknown>;
|
|
193
|
+
};
|
|
52
194
|
type PiToolFactoryContext = {
|
|
53
195
|
session: PiSession;
|
|
54
196
|
turnId: string;
|
|
55
197
|
toolConfig: unknown;
|
|
56
198
|
messages: AgentMessage[];
|
|
199
|
+
replay: PiToolReplayContext;
|
|
57
200
|
};
|
|
58
201
|
type PiToolFactory = AgentTool | ((ctx: PiToolFactoryContext) => AgentTool | Promise<AgentTool>);
|
|
59
202
|
type PiToolRegistry = Record<string, PiToolFactory>;
|
|
@@ -61,7 +204,12 @@ interface PiFragmentConfig {
|
|
|
61
204
|
agents: PiAgentRegistry;
|
|
62
205
|
tools: PiToolRegistry;
|
|
63
206
|
defaultSteeringMode?: PiSteeringMode;
|
|
207
|
+
toolSideEffectReducers?: PiToolSideEffectReducerRegistry;
|
|
208
|
+
/**
|
|
209
|
+
* Optional logging config for internal pi-fragment diagnostics.
|
|
210
|
+
*/
|
|
211
|
+
logging?: PiLoggerConfig;
|
|
64
212
|
}
|
|
65
213
|
//#endregion
|
|
66
|
-
export { PiAgentDefinition, PiAgentRegistry, PiFragmentConfig, PiSession, PiToolFactory, PiToolFactoryContext, PiToolRegistry, PiTurnSummary, PiWorkflowHistoryStep, PiWorkflowsInstanceStatus, PiWorkflowsService };
|
|
214
|
+
export { PI_TOOL_JOURNAL_VERSION, PiActiveSessionProtocolMessage, PiActiveSessionStreamItem, PiAgentDefinition, PiAgentLoopState, PiAgentRegistry, PiFragmentConfig, PiPersistedToolCall, PiPersistedToolCallSource, PiPersistedToolResult, PiSession, PiSessionDetail, PiToolFactory, PiToolFactoryContext, PiToolRegistry, PiToolReplayCache, PiToolReplayContext, PiToolSideEffectReducer, PiToolSideEffectReducerContext, PiToolSideEffectReducerRegistry, PiTurnSummary, PiWorkflowHistoryStep, PiWorkflowsInstanceStatus, PiWorkflowsService };
|
|
67
215
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/pi/types.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/pi/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/pi/types.ts"],"sourcesContent":["import type { TxResult } from \"@fragno-dev/db\";\nimport type {\n InstanceStatus,\n WorkflowsFragmentServices,\n WorkflowsHistory,\n WorkflowsHistoryStep,\n} from \"@fragno-dev/workflows\";\n\nimport type {\n AgentEvent,\n AgentMessage,\n AgentOptions,\n AgentTool,\n StreamFn,\n ThinkingLevel,\n} from \"@mariozechner/pi-agent-core\";\nimport type { Api, ImageContent, Model, TextContent } from \"@mariozechner/pi-ai\";\n\nimport type { PiLoggerConfig } from \"../debug-log\";\nimport type { PiSessionStatus, PiSteeringMode } from \"./constants\";\nimport type { PiWorkflowsRegistry } from \"./workflow/workflow\";\n\nexport type WorkflowsService = WorkflowsFragmentServices<PiWorkflowsRegistry>;\n\nexport type PiSession = {\n id: string;\n name: string | null;\n status: PiSessionStatus;\n agent: string;\n steeringMode: PiSteeringMode;\n metadata: unknown;\n tags: string[];\n createdAt: Date;\n updatedAt: Date;\n};\n\nexport type PiTurnSummary = {\n turn: number;\n assistant: AgentMessage | null;\n summary: string | null;\n};\n\nexport type PiSessionDetailEvent = {\n id: string;\n type: string;\n payload: unknown | null;\n createdAt: Date;\n deliveredAt: Date | null;\n consumedByStepKey: string | null;\n runNumber?: number | null;\n};\n\nexport type PiAgentLoopPhase = \"waiting-for-user\" | \"running-agent\" | \"complete\";\n\nexport type PiActiveSessionStreamItem = AgentEvent;\n\nexport type PiActiveSessionSettledStatus = \"waiting-for-user\" | \"complete\" | \"errored\";\n\nexport type PiActiveSessionUpdate =\n | {\n type: \"event\";\n turn: number;\n event: PiActiveSessionStreamItem;\n }\n | {\n type: \"settled\";\n turn: number;\n status: PiActiveSessionSettledStatus;\n };\n\nexport type PiActiveSessionSubscriber = (update: PiActiveSessionUpdate) => void;\n\nexport type PiActiveSessionReplayBufferEntry = {\n turn: number;\n updates: PiActiveSessionUpdate[];\n};\n\nexport type PiActiveSessionReplayBuffer = PiActiveSessionReplayBufferEntry[];\n\nexport type PiActiveSessionState = {\n subscribe: (listener: PiActiveSessionSubscriber) => () => void;\n publishEvent: (turn: number, event: PiActiveSessionStreamItem) => void;\n settleTurn: (turn: number, status: PiActiveSessionSettledStatus) => void;\n replayTurn: (turn: number) => PiActiveSessionUpdate[];\n exportReplayBuffer: () => PiActiveSessionReplayBuffer;\n importReplayBuffer: (buffer: PiActiveSessionReplayBuffer) => void;\n listenerCount: () => number;\n};\n\nexport type PiAgentLoopWaitingFor =\n | {\n type: \"user_message\";\n turn: number;\n stepKey: string;\n timeoutMs: number | null;\n }\n | {\n type: \"assistant\";\n turn: number;\n stepKey: string;\n }\n | null;\n\nexport type PiAgentLoopSerializableState = {\n messages: AgentMessage[];\n events: PiSessionDetailEvent[];\n trace: AgentEvent[];\n summaries: PiTurnSummary[];\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n};\n\nexport type PiAgentLoopPersistedState = PiAgentLoopSerializableState & {\n activeSessionUpdatesByTurn: PiActiveSessionReplayBuffer;\n};\n\nexport type PiSessionWorkflowStatus = {\n status: PiSessionStatus;\n error?: { name: string; message: string };\n output?: unknown;\n};\n\nexport type PiSessionDetail = PiSession & {\n workflow: PiSessionWorkflowStatus;\n messages: AgentMessage[];\n events: PiSessionDetailEvent[];\n trace: AgentEvent[];\n summaries: PiTurnSummary[];\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n};\n\nexport type PiAgentLoopState = PiAgentLoopPersistedState & {\n activeSession?: PiActiveSessionState;\n};\n\nexport type PiWorkflowsInstanceStatus = InstanceStatus;\nexport type PiWorkflowsHistoryPage = WorkflowsHistory;\nexport type PiWorkflowHistoryStep = WorkflowsHistoryStep;\n\nexport type PiWorkflowsService = Pick<\n WorkflowsService,\n | \"createInstance\"\n | \"getInstanceStatus\"\n | \"getLiveInstanceState\"\n | \"restoreInstanceState\"\n | \"sendEvent\"\n> & {\n getInstanceStatusBatch?: (\n workflowName: string,\n instanceIds: string[],\n ) => TxResult<PiWorkflowsInstanceStatus[], PiWorkflowsInstanceStatus[]>;\n};\n\nexport type PiAgentDefinition = {\n name: string;\n systemPrompt: string;\n model: Model<Api>;\n thinkingLevel?: ThinkingLevel;\n tools?: string[];\n toolConfig?: unknown;\n maxTraceEvents?: number;\n streamFn?: StreamFn;\n convertToLlm?: AgentOptions[\"convertToLlm\"];\n transformContext?: AgentOptions[\"transformContext\"];\n getApiKey?: AgentOptions[\"getApiKey\"];\n thinkingBudgets?: AgentOptions[\"thinkingBudgets\"];\n maxRetryDelayMs?: AgentOptions[\"maxRetryDelayMs\"];\n onEvent?: (event: AgentEvent, ctx: { sessionId: string; turnId: string }) => void;\n};\n\nexport type PiAgentRegistry = Record<string, PiAgentDefinition>;\n\nexport const PI_TOOL_JOURNAL_VERSION = 1 as const;\n\nexport type PiToolJournalVersion = typeof PI_TOOL_JOURNAL_VERSION;\n\nexport type PiToolCallStableKey = string;\n\nexport type PiPersistedToolResult = {\n content: Array<TextContent | ImageContent>;\n details: unknown;\n};\n\nexport type PiPersistedToolCallSource = \"executed\" | \"replay\";\n\nexport type PiPersistedToolCallV1 = {\n version: PiToolJournalVersion;\n key: PiToolCallStableKey;\n sessionId: string;\n turnId: string;\n toolCallId: string;\n toolName: string;\n args: Record<string, unknown>;\n result: PiPersistedToolResult;\n isError: boolean;\n source: PiPersistedToolCallSource;\n capturedAt: number;\n seq: number;\n};\n\nexport type PiActiveSessionSystemMessage =\n | {\n layer: \"system\";\n type: \"snapshot\";\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n replayCount: number;\n }\n | {\n layer: \"system\";\n type: \"settled\";\n turn: number;\n status: PiActiveSessionSettledStatus;\n }\n | {\n layer: \"system\";\n type: \"inactive\";\n reason: \"session-complete\" | \"session-idle\";\n turn: number;\n phase: PiAgentLoopPhase;\n waitingFor: PiAgentLoopWaitingFor;\n };\n\nexport type PiActiveSessionProtocolMessage =\n | PiActiveSessionSystemMessage\n | {\n layer: \"pi\";\n type: \"event\";\n turn: number;\n source: \"replay\" | \"live\";\n event: PiActiveSessionStreamItem;\n };\n\nexport type PiPersistedToolCall = PiPersistedToolCallV1;\n\nexport type PiToolReplayCache = Map<PiToolCallStableKey, PiPersistedToolCall>;\n\nexport type PiToolSideEffectReducerContext = {\n key: PiToolCallStableKey;\n sessionId: string;\n turnId: string;\n};\n\nexport type PiToolSideEffectReducer = (\n state: unknown,\n entry: PiPersistedToolCall,\n ctx: PiToolSideEffectReducerContext,\n) => unknown;\n\nexport type PiToolSideEffectReducerRegistry = Record<string, PiToolSideEffectReducer>;\n\nexport type PiToolReplayContext = {\n cache: PiToolReplayCache;\n journal: PiPersistedToolCall[];\n sideEffects: Record<string, unknown>;\n};\n\nexport type PiToolFactoryContext = {\n session: PiSession;\n turnId: string;\n toolConfig: unknown;\n messages: AgentMessage[];\n replay: PiToolReplayContext;\n};\n\nexport type PiToolFactory =\n | AgentTool\n | ((ctx: PiToolFactoryContext) => AgentTool | Promise<AgentTool>);\n\nexport type PiToolRegistry = Record<string, PiToolFactory>;\n\nexport interface PiFragmentConfig {\n agents: PiAgentRegistry;\n tools: PiToolRegistry;\n defaultSteeringMode?: PiSteeringMode;\n toolSideEffectReducers?: PiToolSideEffectReducerRegistry;\n /**\n * Optional logging config for internal pi-fragment diagnostics.\n */\n logging?: PiLoggerConfig;\n}\n"],"mappings":";AA+KA,MAAa,0BAA0B"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
//#region src/pi/workflow/active-session.ts
|
|
2
|
+
const WAIT_FOR_USER_TIMEOUT_MS = 3600 * 1e3;
|
|
3
|
+
const buildWaitingForUser = (turn) => ({
|
|
4
|
+
type: "user_message",
|
|
5
|
+
turn,
|
|
6
|
+
stepKey: `waitForEvent:wait-user-${turn}`,
|
|
7
|
+
timeoutMs: WAIT_FOR_USER_TIMEOUT_MS
|
|
8
|
+
});
|
|
9
|
+
const getActiveSessionReplayBuffer = (state) => {
|
|
10
|
+
const replayBuffer = state.activeSessionUpdatesByTurn;
|
|
11
|
+
return Array.isArray(replayBuffer) ? structuredClone(replayBuffer) : [];
|
|
12
|
+
};
|
|
13
|
+
const createPiActiveSessionState = (options) => {
|
|
14
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
15
|
+
const updatesByTurn = /* @__PURE__ */ new Map();
|
|
16
|
+
const trimPreviousTurns = (turn) => {
|
|
17
|
+
for (const previousTurn of updatesByTurn.keys()) if (previousTurn < turn - 1) updatesByTurn.delete(previousTurn);
|
|
18
|
+
};
|
|
19
|
+
const appendUpdate = (turn, update) => {
|
|
20
|
+
const existing = updatesByTurn.get(turn) ?? [];
|
|
21
|
+
updatesByTurn.set(turn, [...existing, structuredClone(update)]);
|
|
22
|
+
trimPreviousTurns(turn);
|
|
23
|
+
};
|
|
24
|
+
const exportReplayBuffer = () => structuredClone([...updatesByTurn.entries()].sort(([leftTurn], [rightTurn]) => leftTurn - rightTurn).map(([turn, updates]) => ({
|
|
25
|
+
turn,
|
|
26
|
+
updates
|
|
27
|
+
})));
|
|
28
|
+
const syncReplayBuffer = () => {
|
|
29
|
+
options?.onReplayBufferChange?.(exportReplayBuffer());
|
|
30
|
+
};
|
|
31
|
+
const importReplayBuffer = (buffer) => {
|
|
32
|
+
updatesByTurn.clear();
|
|
33
|
+
for (const entry of structuredClone(buffer)) for (const update of entry.updates) appendUpdate(entry.turn, update);
|
|
34
|
+
syncReplayBuffer();
|
|
35
|
+
};
|
|
36
|
+
if (options?.replayBuffer) importReplayBuffer(options.replayBuffer);
|
|
37
|
+
const notify = (update) => {
|
|
38
|
+
for (const listener of Array.from(listeners)) try {
|
|
39
|
+
listener(update);
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.warn("Pi active-session listener failed.", {
|
|
42
|
+
error,
|
|
43
|
+
updateType: update.type
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
subscribe(listener) {
|
|
49
|
+
listeners.add(listener);
|
|
50
|
+
return () => {
|
|
51
|
+
listeners.delete(listener);
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
publishEvent(turn, event) {
|
|
55
|
+
const update = {
|
|
56
|
+
type: "event",
|
|
57
|
+
turn,
|
|
58
|
+
event
|
|
59
|
+
};
|
|
60
|
+
appendUpdate(turn, update);
|
|
61
|
+
syncReplayBuffer();
|
|
62
|
+
notify(update);
|
|
63
|
+
},
|
|
64
|
+
settleTurn(turn, status) {
|
|
65
|
+
const update = {
|
|
66
|
+
type: "settled",
|
|
67
|
+
turn,
|
|
68
|
+
status
|
|
69
|
+
};
|
|
70
|
+
appendUpdate(turn, update);
|
|
71
|
+
syncReplayBuffer();
|
|
72
|
+
notify(update);
|
|
73
|
+
},
|
|
74
|
+
replayTurn(turn) {
|
|
75
|
+
return structuredClone(updatesByTurn.get(turn) ?? []);
|
|
76
|
+
},
|
|
77
|
+
exportReplayBuffer,
|
|
78
|
+
importReplayBuffer,
|
|
79
|
+
listenerCount: () => listeners.size
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
const createInitialPiAgentLoopState = (messages = []) => ({
|
|
83
|
+
messages,
|
|
84
|
+
events: [],
|
|
85
|
+
trace: [],
|
|
86
|
+
summaries: [],
|
|
87
|
+
turn: 0,
|
|
88
|
+
phase: "waiting-for-user",
|
|
89
|
+
waitingFor: buildWaitingForUser(0),
|
|
90
|
+
activeSessionUpdatesByTurn: []
|
|
91
|
+
});
|
|
92
|
+
const ensurePiActiveSessionState = (state) => {
|
|
93
|
+
if (state.activeSession) return state.activeSession;
|
|
94
|
+
const activeSession = createPiActiveSessionState({
|
|
95
|
+
replayBuffer: getActiveSessionReplayBuffer(state),
|
|
96
|
+
onReplayBufferChange: (replayBuffer) => {
|
|
97
|
+
state.activeSessionUpdatesByTurn = replayBuffer;
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
state.activeSessionUpdatesByTurn = activeSession.exportReplayBuffer();
|
|
101
|
+
state.activeSession = activeSession;
|
|
102
|
+
return activeSession;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
//#endregion
|
|
106
|
+
export { createInitialPiAgentLoopState, createPiActiveSessionState, ensurePiActiveSessionState };
|
|
107
|
+
//# sourceMappingURL=active-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-session.js","names":[],"sources":["../../../../src/pi/workflow/active-session.ts"],"sourcesContent":["import type { AgentMessage } from \"@mariozechner/pi-agent-core\";\n\nimport type {\n PiActiveSessionReplayBuffer,\n PiActiveSessionState,\n PiActiveSessionSubscriber,\n PiActiveSessionUpdate,\n PiAgentLoopState,\n PiAgentLoopWaitingFor,\n} from \"../types\";\n\nconst WAIT_FOR_USER_TIMEOUT_MS = 60 * 60 * 1000;\n\nconst buildWaitingForUser = (turn: number): NonNullable<PiAgentLoopWaitingFor> => ({\n type: \"user_message\",\n turn,\n stepKey: `waitForEvent:wait-user-${turn}`,\n timeoutMs: WAIT_FOR_USER_TIMEOUT_MS,\n});\n\nconst getActiveSessionReplayBuffer = (state: PiAgentLoopState): PiActiveSessionReplayBuffer => {\n const replayBuffer = (state as { activeSessionUpdatesByTurn?: unknown })\n .activeSessionUpdatesByTurn;\n return Array.isArray(replayBuffer)\n ? structuredClone(replayBuffer as PiActiveSessionReplayBuffer)\n : [];\n};\n\nexport const createPiActiveSessionState = (options?: {\n replayBuffer?: PiActiveSessionReplayBuffer;\n onReplayBufferChange?: (buffer: PiActiveSessionReplayBuffer) => void;\n}): PiActiveSessionState => {\n const listeners = new Set<PiActiveSessionSubscriber>();\n const updatesByTurn = new Map<number, PiActiveSessionUpdate[]>();\n\n const trimPreviousTurns = (turn: number) => {\n for (const previousTurn of updatesByTurn.keys()) {\n if (previousTurn < turn - 1) {\n updatesByTurn.delete(previousTurn);\n }\n }\n };\n\n const appendUpdate = (turn: number, update: PiActiveSessionUpdate) => {\n const existing = updatesByTurn.get(turn) ?? [];\n updatesByTurn.set(turn, [...existing, structuredClone(update)]);\n trimPreviousTurns(turn);\n };\n\n const exportReplayBuffer = (): PiActiveSessionReplayBuffer =>\n structuredClone(\n [...updatesByTurn.entries()]\n .sort(([leftTurn], [rightTurn]) => leftTurn - rightTurn)\n .map(([turn, updates]) => ({ turn, updates })),\n );\n\n const syncReplayBuffer = () => {\n options?.onReplayBufferChange?.(exportReplayBuffer());\n };\n\n const importReplayBuffer = (buffer: PiActiveSessionReplayBuffer) => {\n updatesByTurn.clear();\n for (const entry of structuredClone(buffer)) {\n for (const update of entry.updates) {\n appendUpdate(entry.turn, update);\n }\n }\n syncReplayBuffer();\n };\n\n if (options?.replayBuffer) {\n importReplayBuffer(options.replayBuffer);\n }\n\n const notify = (update: PiActiveSessionUpdate) => {\n for (const listener of Array.from(listeners)) {\n try {\n listener(update);\n } catch (error) {\n console.warn(\"Pi active-session listener failed.\", { error, updateType: update.type });\n }\n }\n };\n\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n publishEvent(turn, event) {\n const update: PiActiveSessionUpdate = { type: \"event\", turn, event };\n appendUpdate(turn, update);\n syncReplayBuffer();\n notify(update);\n },\n settleTurn(turn, status) {\n const update: PiActiveSessionUpdate = { type: \"settled\", turn, status };\n appendUpdate(turn, update);\n syncReplayBuffer();\n notify(update);\n },\n replayTurn(turn) {\n return structuredClone(updatesByTurn.get(turn) ?? []);\n },\n exportReplayBuffer,\n importReplayBuffer,\n listenerCount: () => listeners.size,\n };\n};\n\nexport const createInitialPiAgentLoopState = (messages: AgentMessage[] = []): PiAgentLoopState => ({\n messages,\n events: [],\n trace: [],\n summaries: [],\n turn: 0,\n phase: \"waiting-for-user\",\n waitingFor: buildWaitingForUser(0),\n activeSessionUpdatesByTurn: [],\n});\n\nexport const ensurePiActiveSessionState = (state: PiAgentLoopState): PiActiveSessionState => {\n if (state.activeSession) {\n return state.activeSession;\n }\n\n const activeSession = createPiActiveSessionState({\n replayBuffer: getActiveSessionReplayBuffer(state),\n onReplayBufferChange: (replayBuffer) => {\n state.activeSessionUpdatesByTurn = replayBuffer;\n },\n });\n state.activeSessionUpdatesByTurn = activeSession.exportReplayBuffer();\n state.activeSession = activeSession;\n return activeSession;\n};\n"],"mappings":";AAWA,MAAM,2BAA2B,OAAU;AAE3C,MAAM,uBAAuB,UAAsD;CACjF,MAAM;CACN;CACA,SAAS,0BAA0B;CACnC,WAAW;CACZ;AAED,MAAM,gCAAgC,UAAyD;CAC7F,MAAM,eAAgB,MACnB;AACH,QAAO,MAAM,QAAQ,aAAa,GAC9B,gBAAgB,aAA4C,GAC5D,EAAE;;AAGR,MAAa,8BAA8B,YAGf;CAC1B,MAAM,4BAAY,IAAI,KAAgC;CACtD,MAAM,gCAAgB,IAAI,KAAsC;CAEhE,MAAM,qBAAqB,SAAiB;AAC1C,OAAK,MAAM,gBAAgB,cAAc,MAAM,CAC7C,KAAI,eAAe,OAAO,EACxB,eAAc,OAAO,aAAa;;CAKxC,MAAM,gBAAgB,MAAc,WAAkC;EACpE,MAAM,WAAW,cAAc,IAAI,KAAK,IAAI,EAAE;AAC9C,gBAAc,IAAI,MAAM,CAAC,GAAG,UAAU,gBAAgB,OAAO,CAAC,CAAC;AAC/D,oBAAkB,KAAK;;CAGzB,MAAM,2BACJ,gBACE,CAAC,GAAG,cAAc,SAAS,CAAC,CACzB,MAAM,CAAC,WAAW,CAAC,eAAe,WAAW,UAAU,CACvD,KAAK,CAAC,MAAM,cAAc;EAAE;EAAM;EAAS,EAAE,CACjD;CAEH,MAAM,yBAAyB;AAC7B,WAAS,uBAAuB,oBAAoB,CAAC;;CAGvD,MAAM,sBAAsB,WAAwC;AAClE,gBAAc,OAAO;AACrB,OAAK,MAAM,SAAS,gBAAgB,OAAO,CACzC,MAAK,MAAM,UAAU,MAAM,QACzB,cAAa,MAAM,MAAM,OAAO;AAGpC,oBAAkB;;AAGpB,KAAI,SAAS,aACX,oBAAmB,QAAQ,aAAa;CAG1C,MAAM,UAAU,WAAkC;AAChD,OAAK,MAAM,YAAY,MAAM,KAAK,UAAU,CAC1C,KAAI;AACF,YAAS,OAAO;WACT,OAAO;AACd,WAAQ,KAAK,sCAAsC;IAAE;IAAO,YAAY,OAAO;IAAM,CAAC;;;AAK5F,QAAO;EACL,UAAU,UAAU;AAClB,aAAU,IAAI,SAAS;AACvB,gBAAa;AACX,cAAU,OAAO,SAAS;;;EAG9B,aAAa,MAAM,OAAO;GACxB,MAAM,SAAgC;IAAE,MAAM;IAAS;IAAM;IAAO;AACpE,gBAAa,MAAM,OAAO;AAC1B,qBAAkB;AAClB,UAAO,OAAO;;EAEhB,WAAW,MAAM,QAAQ;GACvB,MAAM,SAAgC;IAAE,MAAM;IAAW;IAAM;IAAQ;AACvE,gBAAa,MAAM,OAAO;AAC1B,qBAAkB;AAClB,UAAO,OAAO;;EAEhB,WAAW,MAAM;AACf,UAAO,gBAAgB,cAAc,IAAI,KAAK,IAAI,EAAE,CAAC;;EAEvD;EACA;EACA,qBAAqB,UAAU;EAChC;;AAGH,MAAa,iCAAiC,WAA2B,EAAE,MAAwB;CACjG;CACA,QAAQ,EAAE;CACV,OAAO,EAAE;CACT,WAAW,EAAE;CACb,MAAM;CACN,OAAO;CACP,YAAY,oBAAoB,EAAE;CAClC,4BAA4B,EAAE;CAC/B;AAED,MAAa,8BAA8B,UAAkD;AAC3F,KAAI,MAAM,cACR,QAAO,MAAM;CAGf,MAAM,gBAAgB,2BAA2B;EAC/C,cAAc,6BAA6B,MAAM;EACjD,uBAAuB,iBAAiB;AACtC,SAAM,6BAA6B;;EAEtC,CAAC;AACF,OAAM,6BAA6B,cAAc,oBAAoB;AACrE,OAAM,gBAAgB;AACtB,QAAO"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import "../types.js";
|
|
2
|
+
import { AgentEvent, AgentMessage } from "@mariozechner/pi-agent-core";
|
|
3
|
+
|
|
4
|
+
//#region src/pi/workflow/agent-runner.d.ts
|
|
5
|
+
type AgentLoopParams = {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
agentName: string;
|
|
8
|
+
systemPrompt?: string;
|
|
9
|
+
initialMessages?: AgentMessage[];
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { AgentLoopParams };
|
|
13
|
+
//# sourceMappingURL=agent-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.d.ts","names":[],"sources":["../../../../src/pi/workflow/agent-runner.ts"],"mappings":";;;;KA+BY,eAAA;EACV,SAAA;EACA,SAAA;EACA,YAAA;EACA,eAAA,GAAkB,YAAA;AAAA"}
|